summaryrefslogtreecommitdiff
path: root/icqj_mod/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'icqj_mod/init.c')
-rw-r--r--icqj_mod/init.c646
1 files changed, 646 insertions, 0 deletions
diff --git a/icqj_mod/init.c b/icqj_mod/init.c
new file mode 100644
index 0000000..829b7d1
--- /dev/null
+++ b/icqj_mod/init.c
@@ -0,0 +1,646 @@
+// ---------------------------------------------------------------------------80
+// ICQ plugin for Miranda Instant Messenger
+// ________________________________________
+//
+// Copyright © 2000,2001 Richard Hughes, Roland Rabien, Tristan Van de Vreede
+// Copyright © 2001,2002 Jon Keating, Richard Hughes
+// Copyright © 2002,2003,2004 Martin berg, Sam Kothari, Robert Rainwater
+// Copyright © 2004,2005,2006 Joe Kucera
+//
+// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+// -----------------------------------------------------------------------------
+//
+// File name : $Source: /cvsroot/miranda/miranda/protocols/IcqOscarJ/init.c,v $
+// Revision : $Revision: 3237 $
+// Last change on : $Date: 2006-06-27 19:57:56 +0200 (Tue, 27 Jun 2006) $
+// Last change by : $Author: jokusoftware $
+//
+// DESCRIPTION:
+//
+// Describe me here please...
+//
+// -----------------------------------------------------------------------------
+
+#include "icqoscar.h"
+#include "isee.h"
+
+#include "m_updater.h"
+
+
+PLUGINLINK* pluginLink;
+HANDLE hHookUserInfoInit = NULL;
+HANDLE hHookOptionInit = NULL;
+HANDLE hHookUserMenu = NULL;
+HANDLE hHookIdleEvent = NULL;
+HANDLE hHookIconsChanged = NULL;
+static HANDLE hUserMenuAuth = NULL;
+static HANDLE hUserMenuGrant = NULL;
+static HANDLE hUserMenuRevoke = NULL;
+static HANDLE hUserMenuXStatus = NULL;
+static HANDLE hUserMenuSetVis = NULL;
+static HANDLE hUserMenuSetInvis = NULL;
+HANDLE hUserMenuStatus = NULL;
+
+extern HANDLE hServerConn;
+CRITICAL_SECTION localSeqMutex;
+CRITICAL_SECTION connectionHandleMutex;
+HANDLE hsmsgrequest;
+HANDLE hxstatusiconchanged;
+
+extern int bHideXStatusUI;
+
+PLUGININFO pluginInfo = {
+ sizeof(PLUGININFO),
+ NULL,
+ PLUGIN_MAKE_VERSION(0,3,7,39),
+ "Support for ICQ network, enhanced.",
+ "Joe Kucera, Bio, Martin berg, Richard Hughes, Jon Keating, Se7ven, etc",
+ "jokusoftware@miranda-im.org",
+ "(C) 2000-2006 M. berg, R.Hughes, J.Keating, Bio, J.Kucera, Angeli-Ka, Faith Healer, Se7ven",
+ "http://icqjmod.jino-net.ru/miranda/",
+ 0, //not transient
+ 0 //doesn't replace anything built-in
+};
+
+static char pluginName[64];
+
+static int OnSystemModulesLoaded(WPARAM wParam,LPARAM lParam);
+static int icq_PrebuildContactMenu(WPARAM wParam, LPARAM lParam);
+static int IconLibIconsChanged(WPARAM wParam, LPARAM lParam);
+extern char* MirandaVersionToString(char* szStr, int v, int m);
+
+
+PLUGININFO __declspec(dllexport) *MirandaPluginInfo(DWORD mirandaVersion)
+{
+ // Only load for 0.4.0.1 or greater
+ // Miranda IM v0.4.0.1 contained important DB bug fix
+ if (mirandaVersion < PLUGIN_MAKE_VERSION(0, 4, 0, 1))
+ {
+ return NULL;
+ }
+ else
+ {
+ // Are we running under Unicode Windows version ?
+ gbUnicodeAPI = (GetVersion() & 0x80000000) == 0;
+ strcpy(pluginName, "IcqOscarJ Mod (S7) Protocol");
+ if (gbUnicodeAPI)
+ strcat(pluginName, " (Unicode)");
+ pluginInfo.shortName = pluginName;
+ MIRANDA_VERSION = mirandaVersion;
+ return &pluginInfo;
+ }
+}
+
+
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
+{
+ hInst = hinstDLL;
+
+ return TRUE;
+}
+
+
+
+static HANDLE ICQCreateServiceFunction(const char* szService, MIRANDASERVICE serviceProc)
+{
+ char str[MAX_PATH + 32];
+ strcpy(str, gpszICQProtoName);
+ strcat(str, szService);
+ return CreateServiceFunction(str, serviceProc);
+}
+
+
+
+int __declspec(dllexport) Load(PLUGINLINK *link)
+{
+ PROTOCOLDESCRIPTOR pd = {0};
+
+ pluginLink = link;
+
+ ghServerNetlibUser = NULL;
+
+ // Are we running under Unicode Windows version ?
+ gbUnicodeAPI = (GetVersion() & 0x80000000) == 0;
+ // Do we have new LangPack module ready ?
+ gbUtfLangpack = ServiceExists(MS_LANGPACK_GETCODEPAGE);
+ { // Are we running under unicode Miranda core ?
+ char szVer[MAX_PATH];
+
+ CallService(MS_SYSTEM_GETVERSIONTEXT, MAX_PATH, (LPARAM)szVer);
+ gbUnicodeCore = (strstr(szVer, "Unicode") != NULL);
+ }
+
+ srand(time(NULL));
+ _tzset();
+
+ // Get module name from DLL file name
+ {
+ char* str1;
+ char str2[MAX_PATH];
+ int nProtoNameLen;
+
+ GetModuleFileName(hInst, str2, MAX_PATH);
+ str1 = strrchr(str2, '\\');
+ nProtoNameLen = strlennull(str1);
+ if (str1 != NULL && (nProtoNameLen > 5))
+ {
+ strncpy(gpszICQProtoName, str1+1, nProtoNameLen-5);
+ gpszICQProtoName[nProtoNameLen-4] = 0;
+ }
+ CharUpper(gpszICQProtoName);
+ }
+
+ ZeroMemory(gpszPassword, sizeof(gpszPassword));
+
+ icq_FirstRunCheck();
+
+ HookEvent(ME_SYSTEM_MODULESLOADED, OnSystemModulesLoaded);
+
+ InitializeCriticalSection(&connectionHandleMutex);
+ InitializeCriticalSection(&localSeqMutex);
+ InitializeCriticalSection(&modeMsgsMutex);
+
+ // Initialize core modules
+ InitDB(); // DB interface
+ InitCookies(); // cookie utils
+ InitRates(); // rate management
+
+ // Register the module
+ pd.cbSize = sizeof(pd);
+ pd.szName = gpszICQProtoName;
+ pd.type = PROTOTYPE_PROTOCOL;
+ CallService(MS_PROTO_REGISTERMODULE, 0, (LPARAM)&pd);
+
+ // Initialize status message struct
+ ZeroMemory(&modeMsgs, sizeof(icq_mode_messages));
+
+ InitCache(); // contacts cache
+
+ // Reset a bunch of session specific settings
+ ResetSettingsOnLoad();
+
+ // Setup services
+ ICQCreateServiceFunction(PS_GETCAPS, IcqGetCaps);
+ ICQCreateServiceFunction(PS_GETNAME, IcqGetName);
+ ICQCreateServiceFunction(PS_LOADICON, IcqLoadIcon);
+ ICQCreateServiceFunction(PS_SETSTATUS, IcqSetStatus);
+ ICQCreateServiceFunction(PS_GETSTATUS, IcqGetStatus);
+ ICQCreateServiceFunction(PS_SETAWAYMSG, IcqSetAwayMsg);
+ ICQCreateServiceFunction(PS_AUTHALLOW, IcqAuthAllow);
+ ICQCreateServiceFunction(PS_AUTHDENY, IcqAuthDeny);
+ ICQCreateServiceFunction(PS_BASICSEARCH, IcqBasicSearch);
+ ICQCreateServiceFunction(PS_SEARCHBYEMAIL, IcqSearchByEmail);
+ ICQCreateServiceFunction(MS_ICQ_SEARCHBYDETAILS, IcqSearchByDetails);
+ ICQCreateServiceFunction(PS_SEARCHBYNAME, IcqSearchByDetails);
+ ICQCreateServiceFunction(PS_CREATEADVSEARCHUI, IcqCreateAdvSearchUI);
+ ICQCreateServiceFunction(PS_SEARCHBYADVANCED, IcqSearchByAdvanced);
+ ICQCreateServiceFunction(MS_ICQ_SENDSMS, IcqSendSms);
+ ICQCreateServiceFunction(PS_ADDTOLIST, IcqAddToList);
+ ICQCreateServiceFunction(PS_ADDTOLISTBYEVENT, IcqAddToListByEvent);
+ ICQCreateServiceFunction(PS_FILERESUME, IcqFileResume);
+ ICQCreateServiceFunction(PS_SET_NICKNAME, IcqSetNickName);
+ ICQCreateServiceFunction(PSS_GETINFO, IcqGetInfo);
+ ICQCreateServiceFunction(PSS_MESSAGE, IcqSendMessage);
+ ICQCreateServiceFunction(PSS_MESSAGE"W", IcqSendMessageW);
+ ICQCreateServiceFunction(PSS_URL, IcqSendUrl);
+ ICQCreateServiceFunction(PSS_CONTACTS, IcqSendContacts);
+ ICQCreateServiceFunction(PSS_SETAPPARENTMODE, IcqSetApparentMode);
+ ICQCreateServiceFunction(PSS_GETAWAYMSG, IcqGetAwayMsg);
+ ICQCreateServiceFunction(PSS_FILEALLOW, IcqFileAllow);
+ ICQCreateServiceFunction(PSS_FILEDENY, IcqFileDeny);
+ ICQCreateServiceFunction(PSS_FILECANCEL, IcqFileCancel);
+ ICQCreateServiceFunction(PSS_FILE, IcqSendFile);
+ ICQCreateServiceFunction(PSR_AWAYMSG, IcqRecvAwayMsg);
+ ICQCreateServiceFunction(PSR_FILE, IcqRecvFile);
+ ICQCreateServiceFunction(PSR_MESSAGE, IcqRecvMessage);
+ ICQCreateServiceFunction(PSR_URL, IcqRecvUrl);
+ ICQCreateServiceFunction(PSR_CONTACTS, IcqRecvContacts);
+ ICQCreateServiceFunction(PSR_AUTH, IcqRecvAuth);
+ ICQCreateServiceFunction(PSS_AUTHREQUEST, IcqSendAuthRequest);
+ ICQCreateServiceFunction(PSS_ADDED, IcqSendYouWereAdded);
+ ICQCreateServiceFunction(PSS_USERISTYPING, IcqSendUserIsTyping);
+ ICQCreateServiceFunction(PS_GETAVATARINFO, IcqGetAvatarInfo);
+ // ChangeInfo API
+ ICQCreateServiceFunction(PS_CHANGEINFOEX, IcqChangeInfoEx);
+ // My Avatar API
+ ICQCreateServiceFunction(PS_ICQ_GETMYAVATARMAXSIZE, IcqGetMaxAvatarSize);
+ ICQCreateServiceFunction(PS_ICQ_ISAVATARFORMATSUPPORTED, IcqAvatarFormatSupported);
+ ICQCreateServiceFunction(PS_ICQ_GETMYAVATAR, IcqGetMyAvatar);
+ ICQCreateServiceFunction(PS_ICQ_SETMYAVATAR, IcqSetMyAvatar);
+ // Custom Status API
+ ICQCreateServiceFunction(PS_ICQ_SETCUSTOMSTATUS, IcqSetXStatus); // obsolete (remove in next version)
+ ICQCreateServiceFunction(PS_ICQ_GETCUSTOMSTATUS, IcqGetXStatus); // obsolete
+ ICQCreateServiceFunction(PS_ICQ_SETCUSTOMSTATUSEX, IcqSetXStatusEx);
+ ICQCreateServiceFunction(PS_ICQ_GETCUSTOMSTATUSEX, IcqGetXStatusEx);
+ ICQCreateServiceFunction(PS_ICQ_GETCUSTOMSTATUSICON, IcqGetXStatusIcon);
+ ICQCreateServiceFunction(PS_ICQ_REQUESTCUSTOMSTATUS, IcqRequestXStatusDetails);
+
+ {
+ char pszServiceName[MAX_PATH + 32];
+
+ strcpy(pszServiceName, gpszICQProtoName); strcat(pszServiceName, ME_ICQ_STATUSMSGREQ);
+ hsmsgrequest = CreateHookableEvent(pszServiceName);
+
+ strcpy(pszServiceName, gpszICQProtoName); strcat(pszServiceName, ME_ICQ_CUSTOMSTATUS_EXTRAICON_CHANGED);
+ hxstatusiconchanged = CreateHookableEvent(pszServiceName);
+ }
+
+ InitDirectConns();
+ InitServerLists();
+ icq_InitInfoUpdate();
+
+ icq_InitISee();
+ // Initialize charset conversion routines
+ InitI18N();
+
+ UpdateGlobalSettings();
+
+ gnCurrentStatus = ID_STATUS_OFFLINE;
+
+ ICQCreateServiceFunction(MS_REQ_AUTH, icq_RequestAuthorization);
+ ICQCreateServiceFunction(MS_GRANT_AUTH, IcqGrantAuthorization);
+ ICQCreateServiceFunction(MS_REVOKE_AUTH, IcqRevokeAuthorization);
+ ICQCreateServiceFunction(MS_SETINVIS, IcqSetInvis);
+ ICQCreateServiceFunction(MS_SETVIS, IcqSetVis);
+
+ ICQCreateServiceFunction(MS_XSTATUS_SHOWDETAILS, IcqShowXStatusDetails);
+
+ // This must be here - the events are called too early, WTF?
+ InitXStatusEvents();
+
+ return 0;
+}
+
+
+
+int __declspec(dllexport) Unload(void)
+{
+ if (gbXStatusEnabled) gbXStatusEnabled = 10; // block clist changing
+
+ UninitXStatusEvents();
+
+ if (hServerConn)
+ {
+ icq_sendCloseConnection();
+
+ icq_serverDisconnect(TRUE);
+ }
+
+ UninitServerLists();
+ UninitDirectConns();
+ icq_InfoUpdateCleanup();
+ icq_ISeeCleanup();
+
+ Netlib_CloseHandle(ghDirectNetlibUser);
+ Netlib_CloseHandle(ghServerNetlibUser);
+ UninitRates();
+ UninitCookies();
+ UninitCache();
+ DeleteCriticalSection(&modeMsgsMutex);
+ DeleteCriticalSection(&localSeqMutex);
+ DeleteCriticalSection(&connectionHandleMutex);
+ SAFE_FREE(&modeMsgs.szAway);
+ SAFE_FREE(&modeMsgs.szNa);
+ SAFE_FREE(&modeMsgs.szOccupied);
+ SAFE_FREE(&modeMsgs.szDnd);
+ SAFE_FREE(&modeMsgs.szFfc);
+
+ if (hHookIconsChanged)
+ UnhookEvent(hHookIconsChanged);
+
+ if (hHookUserInfoInit)
+ UnhookEvent(hHookUserInfoInit);
+
+ if (hHookOptionInit)
+ UnhookEvent(hHookOptionInit);
+
+ if (hsmsgrequest)
+ DestroyHookableEvent(hsmsgrequest);
+
+ if (hxstatusiconchanged)
+ DestroyHookableEvent(hxstatusiconchanged);
+
+ if (hHookUserMenu)
+ UnhookEvent(hHookUserMenu);
+
+ if (hHookIdleEvent)
+ UnhookEvent(hHookIdleEvent);
+
+ return 0;
+}
+
+
+
+static int OnSystemModulesLoaded(WPARAM wParam,LPARAM lParam)
+{
+ NETLIBUSER nlu = {0};
+ char pszP2PName[MAX_PATH+3];
+ char pszGroupsName[MAX_PATH+10];
+ char pszSrvGroupsName[MAX_PATH+10];
+ char szBuffer[MAX_PATH+64];
+ char* modules[5] = {0,0,0,0,0};
+
+static Update upd = {0};
+ static char szCurrentVersion[30];
+ static char *szVersionUrl = "http://icqjmod.jino-net.ru/miranda/icq_mod.txt";
+ static char *szUpdateUrl = "http://icqjmod.jino-net.ru/miranda/icq.zip";
+ static char *szPrefix = "icq ";
+ upd.cbSize = sizeof(upd);
+ upd.szComponentName = pluginInfo.shortName;
+ upd.pbVersion = (BYTE *)CreateVersionStringPlugin(&pluginInfo, szCurrentVersion);
+ upd.cpbVersion = strlen((char *)upd.pbVersion);
+ upd.szUpdateURL = szUpdateUrl;
+ upd.pbVersionPrefix = (BYTE *)szPrefix;
+
+ upd.szBetaUpdateURL = szUpdateUrl;
+ upd.szBetaVersionURL = szVersionUrl;
+ upd.szBetaChangelogURL = "http://icqjmod.jino-net.ru/miranda/changelog.txt";
+ upd.pbBetaVersionPrefix = (BYTE *)szPrefix;
+
+
+ upd.cpbVersionPrefix = strlen((char *)upd.pbVersionPrefix);
+ upd.cpbBetaVersionPrefix = strlen((char *)upd.pbBetaVersionPrefix);
+
+ if(ServiceExists(MS_UPDATE_REGISTER))
+ CallService(MS_UPDATE_REGISTER, 0, (LPARAM)&upd);
+
+ strcpy(pszP2PName, gpszICQProtoName);
+ strcat(pszP2PName, "P2P");
+
+ strcpy(pszGroupsName, gpszICQProtoName);
+ strcat(pszGroupsName, "Groups");
+ strcpy(pszSrvGroupsName, gpszICQProtoName);
+ strcat(pszSrvGroupsName, "SrvGroups");
+ modules[0] = gpszICQProtoName;
+ modules[1] = pszP2PName;
+ modules[2] = pszGroupsName;
+ modules[3] = pszSrvGroupsName;
+ CallService("DBEditorpp/RegisterModule",(WPARAM)modules,(LPARAM)4);
+
+
+ null_snprintf(szBuffer, sizeof szBuffer, ICQTranslate("%s server connection"), gpszICQProtoName);
+ nlu.cbSize = sizeof(nlu);
+ nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS;
+ nlu.szDescriptiveName = szBuffer;
+ nlu.szSettingsModule = gpszICQProtoName;
+
+ if (ICQGetContactSettingByte(NULL, "UseGateway", 0))
+ {
+ nlu.flags |= NUF_HTTPGATEWAY;
+ nlu.szHttpGatewayHello = "http://http.proxy.icq.com/hello";
+ nlu.szHttpGatewayUserAgent = "Mozilla/4.08 [en] (WinNT; U ;Nav)";
+ nlu.pfnHttpGatewayInit = icq_httpGatewayInit;
+ nlu.pfnHttpGatewayBegin = icq_httpGatewayBegin;
+ nlu.pfnHttpGatewayWrapSend = icq_httpGatewayWrapSend;
+ nlu.pfnHttpGatewayUnwrapRecv = icq_httpGatewayUnwrapRecv;
+ }
+ ghServerNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu);
+
+ null_snprintf(szBuffer, sizeof szBuffer, ICQTranslate("%s client-to-client connections"), gpszICQProtoName);
+ nlu.flags = NUF_OUTGOING | NUF_INCOMING;
+ nlu.szDescriptiveName = szBuffer;
+ nlu.szSettingsModule = pszP2PName;
+ nlu.minIncomingPorts = 1;
+ ghDirectNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu);
+
+ hHookOptionInit = HookEvent(ME_OPT_INITIALISE, IcqOptInit);
+ hHookUserInfoInit = HookEvent(ME_USERINFO_INITIALISE, OnDetailsInit);
+ hHookUserMenu = HookEvent(ME_CLIST_PREBUILDCONTACTMENU, icq_PrebuildContactMenu);
+ hHookIdleEvent = HookEvent(ME_IDLE_CHANGED, IcqIdleChanged);
+
+ // Init extra optional modules
+ InitPopUps();
+ InitIconLib();
+
+ hHookIconsChanged = IconLibHookIconsChanged(IconLibIconsChanged);
+
+ {
+ char str[MAX_PATH], proto[MAX_PATH];
+
+ ICQTranslateUtfStatic(gpszICQProtoName, proto);
+
+ IconLibDefine(ICQTranslateUtfStatic("Request authorization", str), proto, "req_auth", LoadImage(hInst,MAKEINTRESOURCE(IDI_AUTH),IMAGE_ICON,0,0,LR_SHARED), NULL, 0);
+ IconLibDefine(ICQTranslateUtfStatic("Grant authorization", str), proto, "grant_auth", LoadImage(hInst,MAKEINTRESOURCE(IDI_GRANT),IMAGE_ICON,0,0,LR_SHARED), NULL, 0);
+ IconLibDefine(ICQTranslateUtfStatic("Revoke authorization", str), proto, "revoke_auth", LoadImage(hInst,MAKEINTRESOURCE(IDI_REMOVE),IMAGE_ICON,0,0,LR_SHARED), NULL, 0);
+ IconLibDefine(ICQTranslateUtfStatic("Always visible", str), proto, "set_vis", LoadImage(hInst,MAKEINTRESOURCE(IDI_SET_VIS),IMAGE_ICON,0,0,LR_SHARED), NULL, 0);
+ IconLibDefine(ICQTranslateUtfStatic("Never visible", str), proto, "set_invis", LoadImage(hInst,MAKEINTRESOURCE(IDI_SET_INVIS),IMAGE_ICON,0,0,LR_SHARED), NULL, 0);
+ }
+
+
+ // Initialize IconLib icons
+ InitXStatusIcons();
+ InitXStatusEvents();
+ InitXStatusItems(FALSE);
+
+ {
+ // userinfo
+ //char Ver[32];
+ LPSTR szClient = NULL;
+ char szClientBuf[MAX_PATH];
+
+ szClient = MirandaVersionToString(szClientBuf, ICQ_PLUG_VERSION, 0);
+ //mir_snprintf(Ver, sizeof(Ver), "Miranda %s", );
+
+ DBWriteContactSettingString(NULL, gpszICQProtoName, "MirVer", szClient);
+
+ DBWriteContactSettingDword(NULL, gpszICQProtoName, "IP", 0);
+ DBWriteContactSettingDword(NULL, gpszICQProtoName, "RealIP", 0);
+ DBWriteContactSettingWord(NULL, gpszICQProtoName, "UserPort", 0);
+ DBWriteContactSettingDword(NULL, gpszICQProtoName, "LogonTS", 0);
+ DBWriteContactSettingDword(NULL, gpszICQProtoName, "IdleTS", 0);
+ DBWriteContactSettingDword(NULL, gpszICQProtoName, "Status", ID_STATUS_OFFLINE);
+// DBWriteContactSettingWord(NULL, gpszICQProtoName, "Version", ICQ_VERSION);
+ }
+ {
+ CLISTMENUITEM mi;
+ char pszServiceName[MAX_PATH+30];
+
+ strcpy(pszServiceName, gpszICQProtoName);
+ strcat(pszServiceName, MS_REQ_AUTH);
+
+ ZeroMemory(&mi, sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.position = 1000030000;
+ mi.flags = 0;
+ mi.hIcon = IconLibProcess(LoadImage(hInst,MAKEINTRESOURCE(IDI_AUTH),IMAGE_ICON,0,0,LR_SHARED), "req_auth");
+ mi.pszContactOwner = gpszICQProtoName;
+ mi.pszName = ICQTranslate("Request authorization");
+ mi.pszService = pszServiceName;
+ hUserMenuAuth = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi);
+
+ strcpy(pszServiceName, gpszICQProtoName);
+ strcat(pszServiceName, MS_GRANT_AUTH);
+
+ mi.position = 1000029999;
+ mi.hIcon = IconLibProcess(LoadImage(hInst,MAKEINTRESOURCE(IDI_GRANT),IMAGE_ICON,0,0,LR_SHARED), "grant_auth");
+ mi.pszName = ICQTranslate("Grant authorization");
+ hUserMenuGrant = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi);
+
+ strcpy(pszServiceName, gpszICQProtoName);
+ strcat(pszServiceName, MS_REVOKE_AUTH);
+
+ mi.position = 1000029998;
+ mi.hIcon = IconLibProcess(LoadImage(hInst,MAKEINTRESOURCE(IDI_REMOVE),IMAGE_ICON,0,0,LR_SHARED), "revoke_auth");
+ mi.pszName = ICQTranslate("Revoke authorization");
+ hUserMenuRevoke = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi);
+
+ strcpy(pszServiceName, gpszICQProtoName);
+ strcat(pszServiceName, MS_SETVIS);
+
+
+ mi.position=1000029997;
+ mi.hIcon = IconLibProcess(NULL, "set_vis");
+ mi.pszName=Translate("Always visible");
+ hUserMenuSetVis=(HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,0,(LPARAM)&mi);
+
+ strcpy(pszServiceName, gpszICQProtoName);
+ strcat(pszServiceName, MS_SETINVIS);
+
+ mi.position=1000029996;
+ mi.hIcon = IconLibProcess(NULL, "set_invis");
+ mi.pszName=Translate("Never visible");
+ hUserMenuSetInvis=(HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,0,(LPARAM)&mi);
+
+
+ strcpy(pszServiceName, gpszICQProtoName);
+ strcat(pszServiceName, MS_XSTATUS_SHOWDETAILS);
+
+ mi.position = -2000004999;
+ mi.hIcon = NULL; // dynamically updated
+ mi.pszName = ICQTranslate("Show custom status details");
+ mi.flags=CMIF_NOTOFFLINE;
+ hUserMenuXStatus = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi);
+ }
+
+ {
+ // TODO: add beta builds support to devel builds :)
+
+ //CallService(MS_UPDATE_REGISTERFL, 1683, (WPARAM)&pluginInfo);
+ }
+
+ return 0;
+}
+
+
+
+void CListShowMenuItem(HANDLE hMenuItem, BYTE bShow)
+{
+ CLISTMENUITEM mi = {0};
+
+ mi.cbSize = sizeof(mi);
+ if (bShow)
+ mi.flags = CMIM_FLAGS;
+ else
+ mi.flags = CMIM_FLAGS | CMIF_HIDDEN;
+
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuItem, (LPARAM)&mi);
+}
+
+
+
+void CListSetMenuItemIcon(HANDLE hMenuItem, HICON hIcon)
+{
+ CLISTMENUITEM mi = {0};
+
+ mi.cbSize = sizeof(mi);
+ mi.flags = CMIM_FLAGS | CMIM_ICON;
+
+ mi.hIcon = hIcon;
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuItem, (LPARAM)&mi);
+}
+
+
+
+static int icq_PrebuildContactMenu(WPARAM wParam, LPARAM lParam)
+{
+ BYTE bXStatus;
+ CLISTMENUITEM cli={0};
+
+ CListShowMenuItem(hUserMenuAuth, ICQGetContactSettingByte((HANDLE)wParam, "Auth", 0));
+ CListShowMenuItem(hUserMenuGrant, ICQGetContactSettingByte((HANDLE)wParam, "Grant", 0));
+ CListShowMenuItem(hUserMenuRevoke, (BYTE)(ICQGetContactSettingByte(NULL, "PrivacyItems", 0) && !ICQGetContactSettingByte((HANDLE)wParam, "Grant", 0)));
+ CListShowMenuItem(hUserMenuSetVis, (BYTE)(ICQGetContactSettingByte(NULL, "VisibilityItems", 0)));
+ CListShowMenuItem(hUserMenuSetInvis, (BYTE)(ICQGetContactSettingByte(NULL, "VisibilityItems", 0)));
+ CListShowMenuItem(hUserMenuStatus, (BYTE)(ICQGetContactSettingByte(NULL, "PrivacyItems", 0) && icqOnline));
+
+ cli.cbSize=sizeof(CLISTMENUITEM);
+ cli.flags=CMIM_FLAGS;
+ cli.hIcon=NULL;
+ cli.pszContactOwner=NULL;
+
+ if((BYTE)(ICQGetContactSettingByte(NULL, "VisibilityItems", 0))){
+ switch(ICQGetContactSettingWord((HANDLE)wParam, "ApparentMode",0))
+ {
+ case ID_STATUS_ONLINE:
+ cli.flags|=CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hUserMenuSetVis,(LPARAM)&cli);
+ break;
+
+ case ID_STATUS_OFFLINE:
+ cli.flags|=CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hUserMenuSetInvis,(LPARAM)&cli);
+ break;
+
+ default:
+ break;
+ }}
+
+
+ bXStatus = ICQGetContactSettingByte((HANDLE)wParam, DBSETTING_XSTATUSID, 0);
+ CListShowMenuItem(hUserMenuXStatus, (BYTE)(bHideXStatusUI ? 0 : bXStatus));
+ if (bXStatus && !bHideXStatusUI)
+ {
+ HICON iXStatus = GetXStatusIcon(bXStatus);
+ CListSetMenuItemIcon(hUserMenuXStatus, iXStatus);
+
+ if (iXStatus && !IconLibInstalled())
+ DestroyIcon(iXStatus); // release icon
+ }
+
+ return 0;
+}
+
+
+
+static int IconLibIconsChanged(WPARAM wParam, LPARAM lParam)
+{
+ CListSetMenuItemIcon(hUserMenuAuth, IconLibProcess(LoadImage(hInst,MAKEINTRESOURCE(IDI_AUTH),IMAGE_ICON,0,0,LR_SHARED), "req_auth"));
+ CListSetMenuItemIcon(hUserMenuGrant, IconLibProcess(LoadImage(hInst,MAKEINTRESOURCE(IDI_GRANT),IMAGE_ICON,0,0,LR_SHARED), "grant_auth"));
+ CListSetMenuItemIcon(hUserMenuRevoke, IconLibProcess(LoadImage(hInst,MAKEINTRESOURCE(IDI_REMOVE),IMAGE_ICON,0,0,LR_SHARED), "revoke_auth"));
+ CListSetMenuItemIcon(hUserMenuSetVis, IconLibProcess(LoadImage(hInst,MAKEINTRESOURCE(IDI_SET_VIS),IMAGE_ICON,0,0,LR_SHARED), "set_vis"));
+ CListSetMenuItemIcon(hUserMenuSetInvis, IconLibProcess(LoadImage(hInst,MAKEINTRESOURCE(IDI_SET_INVIS),IMAGE_ICON,0,0,LR_SHARED), "set_invis"));
+
+ ChangedIconsXStatus();
+
+ return 0;
+}
+
+
+
+void UpdateGlobalSettings()
+{
+ gbSecureLogin = ICQGetContactSettingByte(NULL, "SecureLogin", DEFAULT_SECURE_LOGIN);
+ gbAimEnabled = ICQGetContactSettingByte(NULL, "AimEnabled", DEFAULT_AIM_ENABLED);
+ gbUtfEnabled = ICQGetContactSettingByte(NULL, "UtfEnabled", DEFAULT_UTF_ENABLED);
+ gwAnsiCodepage = ICQGetContactSettingWord(NULL, "AnsiCodePage", DEFAULT_ANSI_CODEPAGE);
+ gbDCMsgEnabled = ICQGetContactSettingByte(NULL, "DirectMessaging", DEFAULT_DCMSG_ENABLED);
+ gbTempVisListEnabled = ICQGetContactSettingByte(NULL, "TempVisListEnabled", DEFAULT_TEMPVIS_ENABLED);
+ gbSsiEnabled = ICQGetContactSettingByte(NULL, "UseServerCList", DEFAULT_SS_ENABLED);
+ gbAvatarsEnabled = ICQGetContactSettingByte(NULL, "AvatarsEnabled", DEFAULT_AVATARS_ENABLED);
+ gbXStatusEnabled = ICQGetContactSettingByte(NULL, "XStatusEnabled", DEFAULT_XSTATUS_ENABLED);
+ gbVisibleMode = DBGetContactSettingByte(NULL, gpszICQProtoName, "Privacy", DEFAULT_VISIBLEMODE);
+}