// ---------------------------------------------------------------------------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,2007 Joe Kucera // Copyright © 2006,2007 [sss], chaos.persei, [sin], Faith Healer, Theif, nullbie // // 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$ // Revision : $Revision: 62 $ // Last change on : $Date: 2007-10-16 14:56:05 +0300 (Ð’Ñ‚, 16 окт 2007) $ // Last change by : $Author: chaos.persei $ // // DESCRIPTION: // // Miranda init file - exported functions of plugin // // ----------------------------------------------------------------------------- #include "icqoscar.h" #include "isee.h" #include "m_updater.h" PLUGINLINK* pluginLink; struct MM_INTERFACE mmi; struct MD5_INTERFACE md5i; HANDLE hHookUserInfoInit = NULL; HANDLE hHookOptionInit = NULL; HANDLE hHookUserMenu = NULL; HANDLE hHookIdleEvent = NULL; HANDLE hHookIconsChanged = NULL; static HANDLE hUserMenuAddServ = NULL; static HANDLE hUserMenuAuth = NULL; static HANDLE hUserMenuGrant = NULL; static HANDLE hUserMenuRevoke = NULL; static HANDLE hUserMenuXStatus = NULL; HANDLE hIconProtocol = NULL; static HANDLE hIconMenuAuth = NULL; static HANDLE hIconMenuGrant = NULL; static HANDLE hIconMenuRevoke = NULL; static HANDLE hIconMenuAddServ = NULL; static HANDLE hUserMenuSetVis = NULL; static HANDLE hUserMenuSetInvis = NULL; static HANDLE hUserMenuIncognito = NULL; static HANDLE hUserMenuSendtZer = NULL; HANDLE hPopUpsList = NULL; HANDLE hUserMenuStatus = NULL; extern HANDLE hServerConn; CRITICAL_SECTION localSeqMutex; CRITICAL_SECTION connectionHandleMutex; HANDLE hsmsgrequest; HANDLE hxstatuschanged; HANDLE hxstatusiconchanged; //popup settings BOOL bPopUpService = FALSE; BOOL bPopUpsEnabled = FALSE; BOOL bSpamPopUp = FALSE; BOOL bUnknownPopUp = FALSE; BOOL bFoundPopUp = TRUE; BOOL bScanPopUp = TRUE; BOOL bClientChangePopUp = FALSE; BOOL bVisPopUp = TRUE; BOOL bPopUpForNotOnList = FALSE; BOOL bPopSelfRem = TRUE; BOOL bIgnoreCheckPop = TRUE; BOOL bInfoRequestPopUp = FALSE; BOOL bAuthPopUp = FALSE; BOOL bXUpdaterPopUp = FALSE; BOOL bUinPopup = FALSE; //visibility variable BYTE bVisibility = 0; BOOL bIncognitoRequest = FALSE; BOOL bIncognitoGlobal = FALSE; BOOL bShowAuth = FALSE; //BOOL bStealthRequest = FALSE; BOOL bPSD = TRUE; BYTE gbASD = 0; BOOL bExcludePSD = FALSE; BOOL bNoASD = TRUE; BOOL bNoPSDForHidden = TRUE; BOOL bNoStatusReply = FALSE; //xstatus settings BOOL bXstatusIconShow = TRUE; //loging options BOOL bLogSelfRemoveFile = FALSE; BOOL bLogIgnoreCheckFile = FALSE; BOOL bLogStatusCheckFile = FALSE; BOOL bLogASDFile = FALSE; BOOL bLogClientChangeFile = FALSE; BOOL bLogAuthFile = FALSE; BOOL bLogInfoRequestFile = FALSE; BOOL bLogSelfRemoveHistory = FALSE; BOOL bLogIgnoreCheckHistory = FALSE; BOOL bLogStatusCheckHistory = FALSE; BOOL bLogASDHistory = FALSE; BOOL bLogClientChangeHistory = FALSE; BOOL bLogAuthHistory = FALSE; BOOL bLogInfoRequestHistory = FALSE; BOOL bHcontactHistory = FALSE; //ASD settings BOOL bASDViaAwayMsg = FALSE; BOOL bASDViaXtraz = FALSE; BOOL bASDViaURL = FALSE; BOOL bASDUnauthorized = FALSE; //work in progress BOOL bASDViaAuth = FALSE; //work in progress //other settings BOOL bTmpContacts = FALSE; BOOL gbSecureIM = FALSE; char* TmpGroupName = 0; BOOL bAddTemp = FALSE; BOOL bServerAutoChange = TRUE; WORD wClass; char szHttpUserAgent[255]; extern int bHideXStatusUI; PLUGININFOEX pluginInfo = { sizeof(PLUGININFOEX), "IcqOscarJ (" ICQ_MODNAME " Mod) Protocol [build #98 (rc 2)]", PLUGIN_MAKE_VERSION(0,3,8,105), "Support for ICQ network, enhanced.", "J.Kucera, Bio, M.berg, R.Hughes, Jon Keating, Faith, S7, BM, sss, chaos.persei, ghazan, baloo, nullbie etc", "sss123next@list.ru, chaos.persei@gmail.com, sin@miranda-me.org, jokusoftware@miranda-im.org", "(C) 2000-2007 M. berg, R.Hughes, J.Keating, Bio, J.Kucera, Angeli-Ka, Faith Healer, chaos.persei, Se7ven, BM, sss, [sin], nullbie and others", "http://dev.mirandaim.ru/sss", 0, 0, //doesn't replace anything built-in { 0xc78614bf, 0x878e, 0x43e4, { 0xa3, 0xf4, 0xa, 0xf9, 0x9a, 0xa5, 0x7a, 0x78 } } }; struct LIST_INTERFACE listInterface; SortedList *lstCustomCaps; static char UnicodeAware[32]; static int OnSystemModulesLoaded(WPARAM wParam,LPARAM lParam); static int OnSystemPreShutdown(WPARAM wParam,LPARAM lParam); static int icq_PrebuildContactMenu(WPARAM wParam, LPARAM lParam); static int IconLibIconsChanged(WPARAM wParam, LPARAM lParam); static BOOL bInited = FALSE; __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) { if (mirandaVersion < PLUGIN_MAKE_VERSION(0, 7, 0, 30)) { MessageBox( NULL, "ICQ plugin cannot be loaded. It requires Miranda IM 0.7.0.30 or later.", "ICQ Plugin", MB_OK|MB_ICONWARNING|MB_SETFOREGROUND|MB_TOPMOST ); return NULL; } else { // Are we running under Unicode Windows version ? gbUnicodeAPI = (GetVersion() & 0x80000000) == 0; if (gbUnicodeAPI) { pluginInfo.flags = 1; } MIRANDA_VERSION = mirandaVersion; bInited = TRUE; } return &pluginInfo; } static const MUUID interfaces[] = {MIID_PROTOCOL, MIID_LAST}; __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void) { return interfaces; } 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); } static HANDLE ICQCreateHookableEvent(const char* szEvent) { char str[MAX_PATH + 32]; strcpy(str, gpszICQProtoName); strcat(str, szEvent); return CreateHookableEvent(str); } static int EnumCustomCapsProc(const char *szSetting,LPARAM lParam) { DBVARIANT dbv; DBCONTACTGETSETTING dbcgs; dbcgs.szModule = (char *)lParam; dbcgs.szSetting = szSetting; dbcgs.pValue = &dbv; CallService(MS_DB_CONTACT_GETSETTING, 0, (LPARAM)&dbcgs); if (dbv.type == DBVT_BLOB) { ICQ_CUSTOMCAP icqCustomCap; icqCustomCap.cbSize = sizeof(icqCustomCap); strncpy(icqCustomCap.name, szSetting, 64); memcpy(icqCustomCap.caps, dbv.pbVal, min(0x10, dbv.cpbVal)); CallProtoService(gpszICQProtoName, PS_ICQ_ADDCAPABILITY, 0, (LPARAM)&icqCustomCap); } else if (dbv.type == DBVT_ASCIIZ) { ICQ_CUSTOMCAP icqCustomCap; icqCustomCap.cbSize = sizeof(icqCustomCap); strncpy(icqCustomCap.name, szSetting, 64); strncpy(icqCustomCap.caps, dbv.pszVal, 0x10); CallProtoService(gpszICQProtoName, PS_ICQ_ADDCAPABILITY, 0, (LPARAM)&icqCustomCap); } CallService(MS_DB_CONTACT_FREEVARIANT, 0, (LPARAM)&dbv); return 0; } void RegEventType(int EventType, char* EventDescription) { DBEVENTTYPEDESCR evt; evt.cbSize=sizeof(evt); evt.module=gpszICQProtoName; evt.eventType=EventType; evt.descr=EventDescription; CallService(MS_DB_EVENT_REGISTERTYPE, 0, (LPARAM)&evt); } void InitVars() { bSpamPopUp = ICQGetContactSettingByte(NULL,"SpamPopUpEnabled",1); bUnknownPopUp = ICQGetContactSettingByte(NULL,"UnknownPopUpEnabled",1); bFoundPopUp = ICQGetContactSettingByte(NULL,"FoundPopUpEnabled",1); bScanPopUp = ICQGetContactSettingByte(NULL,"ScanPopUpEnabled",1); bVisPopUp = ICQGetContactSettingByte(NULL,"VisPopUpEnabled",1); bClientChangePopUp = ICQGetContactSettingByte(NULL,"ClientChangePopup",0); bPopUpForNotOnList = ICQGetContactSettingByte(NULL,"PopUpForNotOnList",0); bPopUpsEnabled = ICQGetContactSettingByte(NULL, "PopupsEnabled", 1); bXstatusIconShow = ICQGetContactSettingByte(NULL, "XStatusIconShow", 1); bIgnoreCheckPop = ICQGetContactSettingByte(NULL, "IgnoreCheckPop", 1); bPopSelfRem = ICQGetContactSettingByte(NULL, "PopSelfRem", 1); bInfoRequestPopUp = ICQGetContactSettingByte(NULL, "InfoRequestPopUp", 0); bAuthPopUp = ICQGetContactSettingByte(NULL, "AuthPopUp", 0); bXUpdaterPopUp = ICQGetContactSettingByte(NULL, "XUpdaterPopUp", 0); bPSD = ICQGetContactSettingByte(NULL, "PSD", 1); bNoASD = ICQGetContactSettingByte(NULL, "NoASD", 1); bLogSelfRemoveFile = ICQGetContactSettingByte(NULL, "LogSelfRemoveFile", 0); bLogIgnoreCheckFile = ICQGetContactSettingByte(NULL, "LogIgnoreCheckFile", 0); bLogStatusCheckFile = ICQGetContactSettingByte(NULL, "LogStatusCheckFile", 0); bLogASDFile = ICQGetContactSettingByte(NULL, "LogASDFile", 0); bLogClientChangeFile = ICQGetContactSettingByte(NULL, "LogClientChangeFile", 0); bLogAuthFile = ICQGetContactSettingByte(NULL, "LogAuthFile", 0); bLogInfoRequestFile = ICQGetContactSettingByte(NULL, "LogRequestFile", 0); bLogSelfRemoveHistory = ICQGetContactSettingByte(NULL, "LogSelfRemoveHistory", 0); bLogIgnoreCheckHistory = ICQGetContactSettingByte(NULL, "LogIgnoreCheckHistory", 0); bLogStatusCheckHistory = ICQGetContactSettingByte(NULL, "LogStatusCheckHistory", 0); bLogASDHistory = ICQGetContactSettingByte(NULL, "LogASDHistory", 0); bLogClientChangeHistory = ICQGetContactSettingByte(NULL, "LogClientChangeHistory", 0); bLogAuthHistory = ICQGetContactSettingByte(NULL, "LogAuthHistory", 0); bLogInfoRequestHistory = ICQGetContactSettingByte(NULL, "LogRequestHistory", 0); bHcontactHistory = ICQGetContactSettingByte(NULL,"LogToHcontact",0); bTmpContacts = ICQGetContactSettingByte(NULL, "TempContacts", 0); TmpGroupName = UniGetContactSettingUtf(NULL,gpszICQProtoName,"TmpContactsGroup", Translate("General")); bAddTemp = ICQGetContactSettingByte(NULL, "AddTemp", 0); bNoStatusReply = ICQGetContactSettingByte(NULL,"NoStatusReply", 0); bServerAutoChange = ICQGetContactSettingByte(NULL,"ServerAutoChange", 1); bIncognitoGlobal = ICQGetContactSettingByte(NULL, "IncognitoGlobal", 0); bShowAuth = ICQGetContactSettingByte(NULL, "ShowAuth", 0); bUinPopup = ICQGetContactSettingByte(NULL, "UinPopup", 0); bNoPSDForHidden = ICQGetContactSettingByte(NULL, "NoPSDForHidden", 1); gbASD = ICQGetContactSettingByte(NULL, "ASD", 0); bASDViaAwayMsg = ICQGetContactSettingByte(NULL, "bASDViaAwayMsg", 0); bASDViaXtraz = ICQGetContactSettingByte(NULL, "bASDViaXtraz", 0); bASDViaURL = ICQGetContactSettingByte(NULL, "bASDViaURL", 0); bASDUnauthorized = ICQGetContactSettingByte(NULL, "bASDUnauthorized", 0); bASDViaAuth = ICQGetContactSettingByte(NULL, "bASDViaAuth", 0); strcpy(szHttpUserAgent, ICQGetContactSettingUtf(NULL, "HttpUserAgent", "Mozilla/4.08 [en] (WinNT; U ;Nav)")); // if(ICQGetContactSettingByte(NULL, "StealthRequest", 0) == 1) // bStealthRequest = TRUE; } int __declspec(dllexport) Load(PLUGINLINK *link) { PROTOCOLDESCRIPTOR pd = {0}; extern void icq_BuildPrivacyMenu(); pluginLink = link; mir_getMMI( &mmi ); mir_getMD5I( &md5i ); ghServerNetlibUser = NULL; // Are we running under Unicode Windows version ? gbUnicodeAPI = (GetVersion() & 0x80000000) == 0; { // Are we running under unicode Miranda core ? char szVer[MAX_PATH]; CallService(MS_SYSTEM_GETVERSIONTEXT, MAX_PATH, (LPARAM)szVer); _strlwr(szVer); // make sure it is lowercase gbUnicodeCore = (strstr(szVer, "unicode") != NULL); if (strstr(szVer, "alpha") != NULL) { // Are we running under Alpha Core MIRANDA_VERSION |= 0x80000000; } else if (MIRANDA_VERSION >= 0x00050000 && strstr(szVer, "preview") == NULL) { // for Final Releases of Miranda 0.5+ clear build number MIRANDA_VERSION &= 0xFFFFFF00; } } 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)); HookEvent(ME_SYSTEM_MODULESLOADED, OnSystemModulesLoaded); HookEvent(ME_SYSTEM_PRESHUTDOWN, OnSystemPreShutdown); InitializeCriticalSection(&connectionHandleMutex); InitializeCriticalSection(&localSeqMutex); InitializeCriticalSection(&modeMsgsMutex); // Initialize core modules InitDB(); // DB interface InitVars(); // global variables InitCookies(); // cookie utils InitCache(); // contacts cache InitReguin(); // reguin module DBWriteContactSettingDword(NULL, gpszICQProtoName, "SrvLastUpdate", 0); DBWriteContactSettingWord(NULL, gpszICQProtoName, "SrvRecordCount", 0); 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)); // Initialize temporary DB settings ICQCreateResidentSetting("Status"); // NOTE: XStatus cannot be temporary ICQCreateResidentSetting("TemporaryVisible"); ICQCreateResidentSetting("TickTS"); ICQCreateResidentSetting("IdleTS"); ICQCreateResidentSetting("LogonTS"); ICQCreateResidentSetting("CapBuf"); ICQCreateResidentSetting("DCStatus"); // 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_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_CONTACTS, IcqRecvContacts); ICQCreateServiceFunction(PSR_AUTH, IcqRecvAuth); ICQCreateServiceFunction(PSS_AUTHREQUEST, IcqSendAuthRequest); ICQCreateServiceFunction(PSS_ADDED, IcqSendYouWereAdded); ICQCreateServiceFunction(PSS_USERISTYPING, IcqSendUserIsTyping); // Session password API ICQCreateServiceFunction(PS_ICQ_SETPASSWORD, IcqSetPassword); // ChangeInfo API ICQCreateServiceFunction(PS_CHANGEINFOEX, IcqChangeInfoEx); // Avatar API ICQCreateServiceFunction(PS_GETAVATARINFO, IcqGetAvatarInfo); ICQCreateServiceFunction(PS_GETAVATARCAPS, IcqGetAvatarCaps); ICQCreateServiceFunction(PS_GETMYAVATAR, IcqGetMyAvatar); ICQCreateServiceFunction(PS_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); ICQCreateServiceFunction(PS_ICQ_GETADVANCEDSTATUSICON, IcqRequestAdvStatusIconIdx); // Custom caps ICQCreateServiceFunction(PS_ICQ_ADDCAPABILITY, IcqAddCapability); ICQCreateServiceFunction(PS_ICQ_CHECKCAPABILITY, IcqCheckCapability); hsmsgrequest = ICQCreateHookableEvent(ME_ICQ_STATUSMSGREQ); hxstatuschanged = ICQCreateHookableEvent(ME_ICQ_CUSTOMSTATUS_CHANGED); hxstatusiconchanged = ICQCreateHookableEvent(ME_ICQ_CUSTOMSTATUS_EXTRAICON_CHANGED); InitDirectConns(); InitOscarFileTransfer(); InitServerLists(); icq_InitInfoUpdate(); RegEventType(ICQEVENTTYPE_IGNORECHECK_STATUS, "Check ICQ Ignore State"); RegEventType(ICQEVENTTYPE_CHECK_STATUS, "Check ICQ Status"); RegEventType(ICQEVENTTYPE_CLIENT_CHANGE, "Chenge ICQ Client"); RegEventType(ICQEVENTTYPE_SELF_REMOVE, "ICQ Contact SelfRemove"); RegEventType(ICQEVENTTYPE_AUTH_DENIED, "ICQ Auth Denied"); RegEventType(ICQEVENTTYPE_AUTH_GRANTED, "ICQ Auth Granted"); RegEventType(ICQEVENTTYPE_AUTH_REQUESTED, "ICQ Auth Requested"); RegEventType(ICQEVENTTYPE_YOU_ADDED, "ICQ You Added"); RegEventType(ICQEVENTTYPE_WAS_FOUND, "Detected via ASD\\PSD"); icq_InitISee(); // Initialize charset conversion routines InitI18N(); UpdateGlobalSettings(); gnCurrentStatus = ID_STATUS_OFFLINE; ICQCreateServiceFunction(MS_ICQ_ADDSERVCONTACT, IcqAddServerContact); 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_INCOGNITO_REQUEST, IncognitoAwayRequest); ICQCreateServiceFunction(MS_SEND_TZER, IcqSendtZer); ICQCreateServiceFunction(MS_XSTATUS_SHOWDETAILS, IcqShowXStatusDetails); hHookIconsChanged = IconLibHookIconsChanged(IconLibIconsChanged); InitXStatusIcons(); // This must be here - the events are called too early, WTF? InitXStatusEvents(); if (DBGetContactSettingByte(NULL, gpszICQProtoName, "PrivacyMenu", DEFAULT_PRIVACY_ENABLED)) icq_BuildPrivacyMenu(); //Custom caps mir_getLI(&listInterface); lstCustomCaps = listInterface.List_Create(0,1); lstCustomCaps->sortFunc = NULL; { char tmp[MAXMODULELABELLENGTH]; DBCONTACTENUMSETTINGS dbces; mir_snprintf(tmp, MAXMODULELABELLENGTH, "%sCaps", gpszICQProtoName); dbces.pfnEnumProc = EnumCustomCapsProc; dbces.lParam = (LPARAM)tmp; dbces.szModule = tmp; CallService(MS_DB_CONTACT_ENUMSETTINGS, 0, (LPARAM)&dbces); } ICQCreateThread(icq_XStatusUpdaterThread, NULL); /* { ICQ_CUSTOMCAP icqCustomCap; IcqBuildMirandaCap(&icqCustomCap, "Miranda ICQ Capability Test", NULL, "TestTest"); CallProtoService(gpszICQProtoName, PS_ICQ_ADDCAPABILITY, 0, (LPARAM)&icqCustomCap); } */ return 0; } int __declspec(dllexport) Unload(void) { extern void icq_DestroyPrivacyMenu(); if (gbXStatusEnabled) gbXStatusEnabled = 10; // block clist changing UninitXStatusEvents(); if (hServerConn) { icq_sendCloseConnection(); icq_serverDisconnect(TRUE); } UninitServerLists(); UninitOscarFileTransfer(); UninitDirectConns(); icq_InfoUpdateCleanup(); icq_ISeeCleanup(); icq_DestroyPrivacyMenu(); NetLib_SafeCloseHandle(&ghDirectNetlibUser); NetLib_SafeCloseHandle(&ghServerNetlibUser); UninitRates(); UninitCookies(); UninitCache(); DeleteCriticalSection(&modeMsgsMutex); DeleteCriticalSection(&localSeqMutex); DeleteCriticalSection(&connectionHandleMutex); SAFE_FREE(&modeMsgs.szOnline); 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 (hxstatuschanged) DestroyHookableEvent(hxstatuschanged); if (hxstatusiconchanged) DestroyHookableEvent(hxstatusiconchanged); if (hHookUserMenu) UnhookEvent(hHookUserMenu); if (hHookIdleEvent) UnhookEvent(hHookIdleEvent); bVisibility = ICQGetContactSettingByte(NULL, "SrvVisibility", 0); 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 pszCapsName[MAX_PATH+10]; char szBuffer[MAX_PATH+64]; char* modules[6] = {0,0,0,0,0,0}; if (ServiceExists(MS_POPUP_ADDPOPUPEX)) bPopUpService = TRUE; if (ServiceExists("SecureIM/IsContactSecured")) gbSecureIM = TRUE; /* if(ServiceExists(MS_ASSOCMGR_ADDNEWFILETYPE)) //need to be finishaed { { FILETYPEDESC ftd; ftd.cbSize=sizeof(ftd); ftd.pwszDescription=TranslateW("ICQ link file"); ftd.pszDescription=Translate("ICQ link file"); ftd.ptszDescription=TranslateT("ICQ link file"); ftd.pszFileExt=".icq"; ftd.pszMimeType="application/x-icq"; ftd.pszService=0; ftd.flags=FTDF_DEFAULTDISABLED; CallService(MS_ASSOCMGR_ADDNEWFILETYPE,0,(LPARAM)&ftd); } { URLTYPEDESC utd; utd.cbSize=sizeof(utd); utd.pszDescription=Translate("ICQ Link"); utd.ptszDescription=TranslateT("ICQ Link"); utd.pwszDescription=TranslateW("ICQ Link"); utd.flags=UTDF_DEFAULTDISABLED; utd.pszService=0; utd.pszProtoPrefix="http:"; CallService(MS_ASSOCMGR_ADDNEWURLTYPE,0,(LPARAM)&utd); } }*/ /* if(ServiceExists(MS_UPDATE_REGISTER)) { Update upd = {0}; char szCurrentVersion[30]; char pszBuild[10]; int i=0; BOOL testing = DBGetContactSettingByte(NULL, "Updater", "UseBetaIcqOscarJ (" ICQ_MODNAME " Mod) Protocol", 0); // get build number char *p=strstr(pluginInfo.shortName, "#"); if(p) p++; while (p && (*p>='0')&&(*p<='9')) { pszBuild[i++]=*p; p++; } pszBuild[i]=0; upd.cbSize = sizeof(upd); upd.szComponentName = "IcqOscarJ (" ICQ_MODNAME " Mod) Protocol"; upd.pbVersion = testing?(BYTE*)pszBuild:(BYTE*)CreateVersionString(pluginInfo.version, szCurrentVersion); upd.cpbVersion = strlen(( char *)upd.pbVersion); upd.szBetaUpdateURL = "http://dev.mirandaim.ru/~sss/get.php?file=icq_test.zip"; upd.szBetaVersionURL = "http://dev.mirandaim.ru/~sss/get.php?file=icq_test.txt"; upd.pbBetaVersionPrefix = (BYTE *)"icq test build "; upd.cpbBetaVersionPrefix = strlen(( char *)upd.pbBetaVersionPrefix); upd.szUpdateURL = testing?upd.szBetaUpdateURL:"http://dev.mirandaim.ru/~sss/get.php?file=icq.zip"; upd.szVersionURL = testing?upd.szBetaVersionURL:"http://dev.mirandaim.ru/~sss/get.php?file=icq.txt"; upd.pbVersionPrefix = testing?upd.pbBetaVersionPrefix:(BYTE *)"icq "; upd.cpbVersionPrefix = strlen(( char *)upd.pbVersionPrefix); upd.szBetaChangelogURL = "http://dev.mirandaim.ru/~sss/get.php?file=icq_test.txt"; CallService(MS_UPDATE_REGISTER, 0, (LPARAM)&upd); } //thx sje */ strcpy(pszP2PName, gpszICQProtoName); strcat(pszP2PName, "P2P"); strcpy(pszGroupsName, gpszICQProtoName); strcat(pszGroupsName, "Groups"); strcpy(pszSrvGroupsName, gpszICQProtoName); strcat(pszSrvGroupsName, "SrvGroups"); strcpy(pszCapsName, gpszICQProtoName); strcat(pszCapsName, "Caps"); modules[0] = gpszICQProtoName; modules[1] = pszP2PName; modules[2] = pszGroupsName; modules[3] = pszSrvGroupsName; modules[4] = pszCapsName; CallService("DBEditorpp/RegisterModule",(WPARAM)modules,(LPARAM)5); null_snprintf(szBuffer, sizeof szBuffer, ICQTranslate("%s server connection"), gpszICQProtoName); nlu.cbSize = sizeof(nlu); nlu.flags = NUF_OUTGOING | NUF_HTTPGATEWAY; nlu.szDescriptiveName = szBuffer; nlu.szSettingsModule = gpszICQProtoName; nlu.szHttpGatewayHello = "http://http.proxy.icq.com/hello"; nlu.szHttpGatewayUserAgent = szHttpUserAgent; 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); hPopUpsList = (HANDLE)CallService(MS_UTILS_ALLOCWINDOWLIST,0,0); icq_FirstRunCheck(); InitAvatars(); // Init extra optional modules //InitPopUps(); InitIconLib(); hHookIconsChanged = IconLibHookIconsChanged(IconLibIconsChanged); // Initialize IconLib icons InitXStatusIcons(); InitXStatusEvents(); InitXStatusItems(FALSE); InitDCEvents(); { // userinfo ICQWriteContactSettingUtf(NULL, "MirVer", Translate("you need to be connected...")); DBWriteContactSettingDword(NULL, gpszICQProtoName, "IP", 0); if(!DBGetContactSettingByte(NULL, gpszICQProtoName, "ConstRealIP", 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); } { 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.hIcon = IconLibGetIcon("req_auth"); mi.pszContactOwner = gpszICQProtoName; mi.pszName = LPGEN("Request authorization"); mi.pszService = pszServiceName; hUserMenuAuth = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi); IconLibReleaseIcon("req_auth"); strcpy(pszServiceName, gpszICQProtoName); strcat(pszServiceName, MS_GRANT_AUTH); ZeroMemory(&mi, sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 1000029999; mi.hIcon = IconLibGetIcon("grant_auth"); mi.pszContactOwner = gpszICQProtoName; mi.pszName = LPGEN("Grant authorization"); mi.pszService = pszServiceName; hUserMenuGrant = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi); IconLibReleaseIcon("grant_auth"); strcpy(pszServiceName, gpszICQProtoName); strcat(pszServiceName, MS_REVOKE_AUTH); ZeroMemory(&mi, sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 1000029998; mi.hIcon = IconLibGetIcon("revoke_auth"); mi.pszContactOwner = gpszICQProtoName; mi.pszName = LPGEN("Revoke authorization"); mi.pszService = pszServiceName; hUserMenuRevoke = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi); IconLibReleaseIcon("revoke_auth"); strcpy(pszServiceName, gpszICQProtoName); strcat(pszServiceName, MS_ICQ_ADDSERVCONTACT); ZeroMemory(&mi, sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = -2049999999; mi.hIcon = IconLibGetIcon("add_to_server"); mi.pszContactOwner = gpszICQProtoName; mi.pszName = LPGEN("Add to server list"); mi.pszService = pszServiceName; hUserMenuAddServ = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi); IconLibReleaseIcon("add_to_server"); strcpy(pszServiceName, gpszICQProtoName); strcat(pszServiceName, MS_XSTATUS_SHOWDETAILS); ZeroMemory(&mi, sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = -2000004999; mi.hIcon = NULL; // dynamically updated mi.pszContactOwner = gpszICQProtoName; mi.pszName = LPGEN("Show custom status details"); mi.pszService = pszServiceName; mi.flags=CMIF_NOTOFFLINE; hUserMenuXStatus = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi); strcpy(pszServiceName, gpszICQProtoName); strcat(pszServiceName, MS_SETVIS); ZeroMemory(&mi, sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 2106000000; mi.flags = 0; mi.hIcon = IconLibGetIcon("set_vis"); mi.pszContactOwner = gpszICQProtoName; mi.pszName = LPGEN("Always visible"); mi.pszService = pszServiceName; hUserMenuSetVis=(HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,0,(LPARAM)&mi); IconLibReleaseIcon("set_vis"); strcpy(pszServiceName, gpszICQProtoName); strcat(pszServiceName, MS_SETINVIS); ZeroMemory(&mi, sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 2107000000; mi.flags = 0; mi.hIcon = IconLibGetIcon("set_invis"); mi.pszContactOwner = gpszICQProtoName; mi.pszName = LPGEN("Always invisible"); mi.pszService = pszServiceName; hUserMenuSetInvis=(HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,0,(LPARAM)&mi); IconLibReleaseIcon("set_invis"); strcpy(pszServiceName, gpszICQProtoName); strcat(pszServiceName, MS_INCOGNITO_REQUEST); ZeroMemory(&mi, sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = -2000005000; mi.flags = 0; mi.hIcon = IconLibGetIcon("incognito"); mi.pszContactOwner = gpszICQProtoName; mi.pszName = LPGEN("Incognito Away-Request"); mi.pszService = pszServiceName; hUserMenuIncognito=(HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,0,(LPARAM)&mi); IconLibReleaseIcon("incognito"); strcpy(pszServiceName, gpszICQProtoName); strcat(pszServiceName, MS_SEND_TZER); ZeroMemory(&mi, sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 2108000000; mi.flags = 0; mi.hIcon = IconLibGetIcon("send_tzer"); mi.pszContactOwner = gpszICQProtoName; mi.pszName = LPGEN("Send tZer"); mi.pszService = pszServiceName; hUserMenuSendtZer=(HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,0,(LPARAM)&mi); IconLibReleaseIcon("send_tzer"); } return 0; } static int OnSystemPreShutdown(WPARAM wParam,LPARAM lParam) { // all threads should be terminated here if (hServerConn) { icq_sendCloseConnection(); icq_serverDisconnect(TRUE); } CheckSelfRemoveShutdown(); 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}; extern HANDLE hStatusMenu; CListShowMenuItem(hUserMenuAuth, bShowAuth?1:ICQGetContactSettingByte((HANDLE)wParam, "Auth", 0) && icqOnline); CListShowMenuItem(hUserMenuGrant, bShowAuth?1:ICQGetContactSettingByte((HANDLE)wParam, "Grant", 0) && icqOnline); CListShowMenuItem(hUserMenuRevoke, icqOnline); CListShowMenuItem(hUserMenuSetVis, icqOnline); CListShowMenuItem(hUserMenuSetInvis, icqOnline); CListShowMenuItem(hUserMenuStatus, icqOnline && gbASD); // CListShowMenuItem(hStatusMenu, icqOnline && gbASD); //not woking ? %), looks like we need other method CListShowMenuItem(hUserMenuIncognito, (/*bStealthRequest && */!bIncognitoGlobal && (ICQGetContactSettingWord((HANDLE)wParam, "Status", 0)!= ID_STATUS_OFFLINE) && (ICQGetContactSettingWord((HANDLE)wParam, "Status", 0)!= ID_STATUS_INVISIBLE) && icqOnline)); //now away messages for online supported CListShowMenuItem(hUserMenuSendtZer, icqOnline && gbTzerEnabled); cli.cbSize=sizeof(CLISTMENUITEM); cli.flags=CMIM_FLAGS; cli.hIcon=NULL; cli.pszContactOwner=NULL; 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; } if (gbSsiEnabled && !ICQGetContactSettingWord((HANDLE)wParam, "ServerId", 0) && !ICQGetContactSettingWord((HANDLE)wParam, "SrvIgnoreId", 0)) CListShowMenuItem(hUserMenuAddServ, 1); else CListShowMenuItem(hUserMenuAddServ, 0); bXStatus = ICQGetContactXStatus((HANDLE)wParam); CListShowMenuItem(hUserMenuXStatus, (BYTE)(bHideXStatusUI ? 0 : bXStatus)); if (bXStatus && !bHideXStatusUI) { CListSetMenuItemIcon(hUserMenuXStatus, GetXStatusIcon(bXStatus, LR_SHARED)); } return 0; } static int IconLibIconsChanged(WPARAM wParam, LPARAM lParam) { CListSetMenuItemIcon(hUserMenuAuth, IconLibGetIcon("req_auth")); IconLibReleaseIcon("req_auth"); CListSetMenuItemIcon(hUserMenuGrant, IconLibGetIcon("grant_auth")); IconLibReleaseIcon("grant_auth"); CListSetMenuItemIcon(hUserMenuRevoke, IconLibGetIcon("revoke_auth")); IconLibReleaseIcon("revoke_auth"); CListSetMenuItemIcon(hUserMenuAddServ, IconLibGetIcon("add_to_server")); IconLibReleaseIcon("add_to_server"); CListSetMenuItemIcon(hUserMenuIncognito, IconLibGetIcon("incognito_request")); IconLibReleaseIcon("incognito_request"); CListSetMenuItemIcon(hUserMenuSendtZer, IconLibGetIcon("send_tzer")); IconLibReleaseIcon("send_tzer"); ChangedIconsXStatus(); return 0; } void UpdateGlobalSettings() { if (ghServerNetlibUser) { NETLIBUSERSETTINGS nlus = {0}; nlus.cbSize = sizeof(NETLIBUSERSETTINGS); if (CallService(MS_NETLIB_GETUSERSETTINGS, (WPARAM)ghServerNetlibUser, (LPARAM)&nlus)) { if (nlus.useProxy && nlus.proxyType == PROXYTYPE_HTTP) gbGatewayMode = 1; else gbGatewayMode = 0; } else gbGatewayMode = 0; } 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); gbCustomCapEnabled = ICQGetContactSettingByte(NULL, "customcap", 1); gbHideIdEnabled = ICQGetContactSettingByte(NULL, "Hide ID", 1); gbRTFEnabled = ICQGetContactSettingByte(NULL, "RTF", 0); gbVerEnabled = ICQGetContactSettingByte(NULL, "CurrentVer", 0); gbTzerEnabled = ICQGetContactSettingByte(NULL, "tZer", 0); }