// ---------------------------------------------------------------------------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); }