summaryrefslogtreecommitdiff
path: root/protocols/ICQ-WIM/src
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-01-28 12:03:47 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-01-28 12:03:47 +0300
commitc505cadce283c5abf15f87e3c72655c70d738e21 (patch)
tree114c31c8a5715e48af60d180b34693648962a44a /protocols/ICQ-WIM/src
parent76350d50ef7043a171292d6ec7574ed863af4067 (diff)
ICQ10:
- fixes #1800 (ICQ10: add aboutMe content to user info); - added ICQ User Info page - code cleaning
Diffstat (limited to 'protocols/ICQ-WIM/src')
-rw-r--r--protocols/ICQ-WIM/src/proto.cpp2
-rw-r--r--protocols/ICQ-WIM/src/proto.h70
-rw-r--r--protocols/ICQ-WIM/src/resource.h9
-rw-r--r--protocols/ICQ-WIM/src/server.cpp6
-rw-r--r--protocols/ICQ-WIM/src/stdafx.h4
-rw-r--r--protocols/ICQ-WIM/src/userinfo.cpp67
-rw-r--r--protocols/ICQ-WIM/src/utils.cpp17
7 files changed, 138 insertions, 37 deletions
diff --git a/protocols/ICQ-WIM/src/proto.cpp b/protocols/ICQ-WIM/src/proto.cpp
index 0b82b7a623..6e14f91a01 100644
--- a/protocols/ICQ-WIM/src/proto.cpp
+++ b/protocols/ICQ-WIM/src/proto.cpp
@@ -88,6 +88,8 @@ void CIcqProto::OnModulesLoaded()
gcr.ptszDispName = m_tszUserName;
gcr.pszModule = m_szModuleName;
Chat_Register(&gcr);
+
+ HookProtoEvent(ME_USERINFO_INITIALISE, &CIcqProto::OnUserInfoInit);
}
void CIcqProto::OnShutdown()
diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h
index 8188e75fe6..9754eacfa8 100644
--- a/protocols/ICQ-WIM/src/proto.h
+++ b/protocols/ICQ-WIM/src/proto.h
@@ -128,7 +128,6 @@ class CIcqProto : public PROTO<CIcqProto>
MCONTACT CheckOwnMessage(const CMStringA &reqId, const CMStringA &msgId, bool bRemove);
void CheckPassword(void);
void ConnectionFailed(int iReason);
- CMStringA GetUserId(MCONTACT);
void MoveContactToGroup(MCONTACT hContact, const wchar_t *pwszGroup, const wchar_t *pwszNewGroup);
MCONTACT ParseBuddyInfo(const JSONNode &buddy, MCONTACT hContact = -1);
void ParseMessage(MCONTACT hContact, __int64 &lastMsgId, const JSONNode &msg);
@@ -249,43 +248,44 @@ class CIcqProto : public PROTO<CIcqProto>
////////////////////////////////////////////////////////////////////////////////////////
// events
- int __cdecl OnGroupChange(WPARAM, LPARAM);
- int __cdecl OnDbEventRead(WPARAM, LPARAM);
- int __cdecl OnOptionsInit(WPARAM, LPARAM);
+ int __cdecl OnGroupChange(WPARAM, LPARAM);
+ int __cdecl OnDbEventRead(WPARAM, LPARAM);
+ int __cdecl OnOptionsInit(WPARAM, LPARAM);
+ int __cdecl OnUserInfoInit(WPARAM, LPARAM);
////////////////////////////////////////////////////////////////////////////////////////
// PROTO_INTERFACE
- MCONTACT AddToList( int flags, PROTOSEARCHRESULT *psr) override;
-
- int AuthRequest(MCONTACT hContact, const wchar_t *szMessage) override;
-
- HANDLE FileAllow(MCONTACT hContact, HANDLE hTransfer, const wchar_t *szPath) override;
- int FileCancel(MCONTACT hContact, HANDLE hTransfer) override;
- int FileDeny(MCONTACT hContact, HANDLE hTransfer, const wchar_t *szReason) override;
- int FileResume( HANDLE hTransfer, int *action, const wchar_t **szFilename) override;
-
- INT_PTR GetCaps(int type, MCONTACT hContact = NULL) override;
- int GetInfo(MCONTACT hContact, int infoType) override;
-
- HANDLE SearchBasic(const wchar_t *id) override;
-
- HANDLE SendFile(MCONTACT hContact, const wchar_t *szDescription, wchar_t **ppszFiles) override;
- int SendMsg(MCONTACT hContact, int flags, const char *msg) override;
-
- int SetApparentMode(MCONTACT hContact, int mode) override;
- int SetStatus(int iNewStatus) override;
-
- HANDLE GetAwayMsg(MCONTACT hContact) override;
- int RecvAwayMsg(MCONTACT hContact, int mode, PROTORECVEVENT *evt) override;
- int SetAwayMsg(int m_iStatus, const wchar_t *msg) override;
-
- int UserIsTyping(MCONTACT hContact, int type) override;
-
- void OnBuildProtoMenu(void) override;
- void OnContactDeleted(MCONTACT) override;
- void OnModulesLoaded() override;
- void OnShutdown() override;
+ MCONTACT AddToList( int flags, PROTOSEARCHRESULT *psr) override;
+
+ int AuthRequest(MCONTACT hContact, const wchar_t *szMessage) override;
+
+ HANDLE FileAllow(MCONTACT hContact, HANDLE hTransfer, const wchar_t *szPath) override;
+ int FileCancel(MCONTACT hContact, HANDLE hTransfer) override;
+ int FileDeny(MCONTACT hContact, HANDLE hTransfer, const wchar_t *szReason) override;
+ int FileResume( HANDLE hTransfer, int *action, const wchar_t **szFilename) override;
+
+ INT_PTR GetCaps(int type, MCONTACT hContact = NULL) override;
+ int GetInfo(MCONTACT hContact, int infoType) override;
+
+ HANDLE SearchBasic(const wchar_t *id) override;
+
+ HANDLE SendFile(MCONTACT hContact, const wchar_t *szDescription, wchar_t **ppszFiles) override;
+ int SendMsg(MCONTACT hContact, int flags, const char *msg) override;
+
+ int SetApparentMode(MCONTACT hContact, int mode) override;
+ int SetStatus(int iNewStatus) override;
+
+ HANDLE GetAwayMsg(MCONTACT hContact) override;
+ int RecvAwayMsg(MCONTACT hContact, int mode, PROTORECVEVENT *evt) override;
+ int SetAwayMsg(int m_iStatus, const wchar_t *msg) override;
+
+ int UserIsTyping(MCONTACT hContact, int type) override;
+
+ void OnBuildProtoMenu(void) override;
+ void OnContactDeleted(MCONTACT) override;
+ void OnModulesLoaded() override;
+ void OnShutdown() override;
public:
CIcqProto(const char*, const wchar_t*);
@@ -295,6 +295,8 @@ public:
CMOption<wchar_t*> m_szPassword; // password, if present
CMOption<BYTE> m_bUseFriendly; // use friendly names instead of old icq nicks
CMOption<BYTE> m_bHideGroupchats; // don't pop up group chat windows on startup
+
+ CMStringA GetUserId(MCONTACT);
};
struct CMPlugin : public ACCPROTOPLUGIN<CIcqProto>
diff --git a/protocols/ICQ-WIM/src/resource.h b/protocols/ICQ-WIM/src/resource.h
index beeac3d899..866a0b9363 100644
--- a/protocols/ICQ-WIM/src/resource.h
+++ b/protocols/ICQ-WIM/src/resource.h
@@ -1,10 +1,11 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
-// Used by w:\miranda-ng\protocols\Icq10\res\resources.rc
+// Used by w:\miranda-ng\protocols\ICQ-WIM\res\resources.rc
//
#define IDD_OPTIONS_FULL 101
#define IDD_OPTIONS_ACCMGR 102
#define IDD_GROUPCHAT_INVITE 103
+#define IDD_INFO_ICQ 104
#define IDD_REGISTER 105
#define IDC_PASSWORD 1001
#define IDC_UIN 1002
@@ -16,14 +17,16 @@
#define IDC_CLIST 1007
#define IDC_SENDSMS 1008
#define IDC_CODE 1009
+#define IDC_ONLINESINCE 1010
+#define IDC_IDLETIME 1011
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 107
+#define _APS_NEXT_RESOURCE_VALUE 108
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1010
+#define _APS_NEXT_CONTROL_VALUE 1013
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/protocols/ICQ-WIM/src/server.cpp b/protocols/ICQ-WIM/src/server.cpp
index dbf2e93e7b..61205b005b 100644
--- a/protocols/ICQ-WIM/src/server.cpp
+++ b/protocols/ICQ-WIM/src/server.cpp
@@ -183,6 +183,12 @@ MCONTACT CIcqProto::ParseBuddyInfo(const JSONNode &buddy, MCONTACT hContact)
}
}
+ str = profile["aboutMe"].as_mstring();
+ if (!str.IsEmpty())
+ setWString(hContact, DB_KEY_ABOUT, str);
+ else
+ delSetting(hContact, DB_KEY_ABOUT);
+
str = profile["gender"].as_mstring();
if (!str.IsEmpty()) {
if (str == "male")
diff --git a/protocols/ICQ-WIM/src/stdafx.h b/protocols/ICQ-WIM/src/stdafx.h
index ed564a18f0..e2b7150f67 100644
--- a/protocols/ICQ-WIM/src/stdafx.h
+++ b/protocols/ICQ-WIM/src/stdafx.h
@@ -81,8 +81,11 @@
#define MODULENAME "ICQ"
#define DB_KEY_UIN "UIN"
+#define DB_KEY_IDLE "IdleTS"
+#define DB_KEY_ABOUT "About"
#define DB_KEY_ATOKEN "AToken"
#define DB_KEY_PHONEREG "PhoneReg"
+#define DB_KEY_LASTSEEN "LastSeen"
#define DB_KEY_RCLIENTID "RClientID"
#define DB_KEY_LASTMSGID "LastMsgId"
#define DB_KEY_REMOTEREAD "RemoteReadId"
@@ -94,6 +97,7 @@
bool IsChat(const CMStringW &aimid);
int StatusFromString(const CMStringW&);
+char* time2text(time_t time);
extern HWND g_hwndHeartbeat;
extern bool g_bMessageState;
diff --git a/protocols/ICQ-WIM/src/userinfo.cpp b/protocols/ICQ-WIM/src/userinfo.cpp
new file mode 100644
index 0000000000..faa14ebcb4
--- /dev/null
+++ b/protocols/ICQ-WIM/src/userinfo.cpp
@@ -0,0 +1,67 @@
+// -----------------------------------------------------------------------------
+// ICQ plugin for Miranda NG
+// -----------------------------------------------------------------------------
+// Copyright © 2018-19 Miranda NG team
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+// -----------------------------------------------------------------------------
+
+#include "stdafx.h"
+
+static INT_PTR CALLBACK IcqDlgProc(HWND hwndDlg, UINT msg, WPARAM, LPARAM lParam)
+{
+ switch(msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
+ break;
+
+ case WM_NOTIFY:
+ if (((LPNMHDR)lParam)->idFrom == 0 && ((LPNMHDR)lParam)->code == PSN_PARAMCHANGED) {
+ MCONTACT hContact = (MCONTACT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ CIcqProto *ppro = (CIcqProto*)((PSHNOTIFY*)lParam)->lParam;
+
+ CMStringA szId(ppro->GetUserId(hContact));
+ SetDlgItemTextA(hwndDlg, IDC_UIN, szId);
+
+ SetDlgItemTextA(hwndDlg, IDC_IDLETIME, time2text(ppro->getDword(hContact, DB_KEY_IDLE)));
+ SetDlgItemTextA(hwndDlg, IDC_ONLINESINCE, time2text(ppro->getDword(hContact, DB_KEY_LASTSEEN)));
+ }
+ break;
+ }
+
+ return 0;
+}
+
+int CIcqProto::OnUserInfoInit(WPARAM wParam, LPARAM hContact)
+{
+ if (!hContact || mir_strcmp(GetContactProto(hContact), m_szModuleName))
+ return 0;
+
+ if (isChatRoom(hContact))
+ return 0;
+
+ OPTIONSDIALOGPAGE odp = {};
+ odp.flags = ODPF_USERINFOTAB | ODPF_DONTTRANSLATE;
+ odp.dwInitParam = LPARAM(this);
+ odp.szTitle.a = "ICQ";
+
+ odp.pfnDlgProc = IcqDlgProc;
+ odp.position = -1900000000;
+ odp.szTab.a = LPGEN("Details");
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_ICQ);
+ g_plugin.addUserInfo(wParam, &odp);
+ return 0;
+}
diff --git a/protocols/ICQ-WIM/src/utils.cpp b/protocols/ICQ-WIM/src/utils.cpp
index 7f41347918..5f7e806e96 100644
--- a/protocols/ICQ-WIM/src/utils.cpp
+++ b/protocols/ICQ-WIM/src/utils.cpp
@@ -240,3 +240,20 @@ void CIcqProto::setId(MCONTACT hContact, const char *szSetting, __int64 iValue)
if (oldVal != iValue)
db_set_blob(hContact, m_szModuleName, szSetting, &iValue, sizeof(iValue));
}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+char* time2text(time_t time)
+{
+ if (time == 0)
+ return "";
+
+ tm *local = localtime(&time);
+ if (local) {
+ char *str = asctime(local);
+ str[24] = '\0'; // remove new line
+ return str;
+ }
+
+ return "<invalid>";
+}