#include "common.h" #include "updater.h" HINSTANCE hInst; PLUGINLINK *pluginLink; HANDLE hNetlibUser = 0; DWORD mainThreadId; HANDLE mainThread; bool is_idle = false; bool unicode_system; //#define TESTING // defined here to reduce build time blowout caused by changing common.h PLUGININFOEX pluginInfo={ sizeof(PLUGININFOEX), __PLUGIN_NAME, #ifdef TESTING 0x00000001, #else PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), #endif __DESC, __AUTHOR, __AUTHOREMAIL, __COPYRIGHT, __AUTHORWEB, UNICODE_AWARE, //not transient 0, //doesn't replace anything built-in #ifdef _UNICODE { 0x66dceb80, 0x384, 0x4507, { 0x97, 0x74, 0xcc, 0x20, 0xa7, 0xef, 0x1d, 0x6d } } // {66DCEB80-0384-4507-9774-CC20A7EF1D6D} #else { 0x37f59333, 0x8c51, 0x4886, { 0x96, 0xdb, 0xb9, 0xd9, 0xe3, 0x7c, 0xad, 0x38 } } // {37F59333-8C51-4886-96DB-B9D9E37CAD38} #endif }; extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { hInst=hinstDLL; return TRUE; } extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) { return &pluginInfo; } extern "C" __declspec(dllexport) PLUGININFO* MirandaPluginInfo(DWORD mirandaVersion) { pluginInfo.cbSize = sizeof(PLUGININFO); return (PLUGININFO*)&pluginInfo; } static const MUUID interfaces[] = {MIID_UPDATER, MIID_LAST}; extern "C" __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void) { return interfaces; } int IdleChanged(WPARAM wParam, LPARAM lParam) { is_idle = (lParam & IDF_ISIDLE); return 0; } void InitNetlib() { NETLIBUSER nl_user = {0}; nl_user.cbSize = sizeof(nl_user); nl_user.szSettingsModule = MODULE; nl_user.flags = NUF_OUTGOING | NUF_HTTPCONNS; nl_user.szDescriptiveName = Translate("Updater connection"); hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nl_user); } void DeinitNetlib() { if(hNetlibUser) CallService(MS_NETLIB_CLOSEHANDLE, (WPARAM)hNetlibUser, 0); } HANDLE hEventIdleChanged; int ModulesLoaded(WPARAM wParam, LPARAM lParam) { LoadOptions(); /* // done by DoStartupProcess in second 'services' modules loaded hook...i hope :) if(!options.check_on_startup) { RestoreStatus(); } */ /*{ char buff[265]; sprintf(buff, "sizeof(Update) == %d", sizeof(Update)); PUShowMessage(buff, SM_NOTIFY); }*/ InitIcons(); InitOptionsMenuItems(); InitNetlib(); InitPopups(); #ifdef USE_MY_SERVER Update update = {0}; char szVersion[16]; update.cbSize = sizeof(Update); update.szComponentName = pluginInfo.shortName; update.pbVersion = (BYTE *)CreateVersionString(&pluginInfo, szVersion); update.cpbVersion = strlen((char *)update.pbVersion); #ifdef _UNICODE update.szUpdateURL = BETA_HOST_URL_PREFIX "/ver_updater_unicode.zip"; update.szVersionURL = BETA_HOST_URL_PREFIX "/updater_unicode.html"; update.pbVersionPrefix = (BYTE *)"Updater (Unicode) version "; update.cpbVersionPrefix = strlen((char *)update.pbVersionPrefix); #else //!_UNICODE update.szUpdateURL = BETA_HOST_URL_PREFIX "/updater.zip"; update.szVersionURL = BETA_HOST_URL_PREFIX "/ver_updater.html"; update.pbVersionPrefix = (BYTE *)"Updater version "; update.cpbVersionPrefix = strlen((char *)update.pbVersionPrefix); #endif //_UNICODE CallService(MS_UPDATE_REGISTER, 0, (WPARAM)&update); #else //!USE_MY_SERVER #ifdef REGISTER_BETA Update update = {0}; char szVersion[16]; update.cbSize = sizeof(Update); update.szComponentName = pluginInfo.shortName; update.pbVersion = (BYTE *)CreateVersionStringPluginEx(&pluginInfo, szVersion); update.cpbVersion = strlen((char *)update.pbVersion); update.szBetaChangelogURL = "https://server.scottellis.com.au/websvn/log.php?repname=Miranda+Plugins&path=%2Fupdater%2F&rev=0&sc=0&isdir=1"; if(unicode_system) { #ifdef REGISTER_AUTO update.szUpdateURL = UPDATER_AUTOREGISTER; #else //!REGISTER_AUTO update.szUpdateURL = MIM_DOWNLOAD_URL_PREFIX "2596"; update.szVersionURL = MIM_VIEW_URL_PREFIX "2596"; update.pbVersionPrefix = (BYTE *)"Updater (Unicode) "; update.cpbVersionPrefix = strlen((char *)update.pbVersionPrefix); #endif //REGISTER_AUTO update.szBetaUpdateURL = BETA_HOST_URL_PREFIX "/updater_unicode.zip"; update.szBetaVersionURL = BETA_HOST_URL_PREFIX "/ver_updater_unicode.html"; update.pbBetaVersionPrefix = (BYTE *)"Updater (Unicode) version "; update.cpbBetaVersionPrefix = strlen((char *)update.pbBetaVersionPrefix); } else { #ifdef REGISTER_AUTO update.szUpdateURL = UPDATER_AUTOREGISTER; #else //!REGISTER_AUTO update.szUpdateURL = MIM_DOWNLOAD_URL_PREFIX "2254"; update.szVersionURL = MIM_VIEW_URL_PREFIX "2254"; update.pbVersionPrefix = (BYTE *)"Updater "; update.cpbVersionPrefix = strlen((char *)update.pbVersionPrefix); #endif //REGISTER_AUTO update.szBetaUpdateURL = BETA_HOST_URL_PREFIX "/updater.zip"; update.szBetaVersionURL = BETA_HOST_URL_PREFIX "/ver_updater.html"; update.pbBetaVersionPrefix = (BYTE *)"Updater version "; update.cpbBetaVersionPrefix = strlen((char *)update.pbBetaVersionPrefix); } CallService(MS_UPDATE_REGISTER, 0, (WPARAM)&update); #else // !REGISTER_BETA #ifdef _UNICODE CallService(MS_UPDATE_REGISTERFL, (WPARAM)2596, (LPARAM)&pluginInfo); #else //!_UNICODE CallService(MS_UPDATE_REGISTERFL, (WPARAM)2254, (LPARAM)&pluginInfo); #endif //_UNICODE #endif // REGISTER_BETA #endif // USE_MY_SERVER hEventIdleChanged = HookEvent(ME_IDLE_CHANGED, IdleChanged); if(ServiceExists(MS_TRIGGER_REGISTERACTION)) { // create update action for triggerplugin ACTIONREGISTER ar = {0}; ar.cbSize = sizeof(ACTIONREGISTER); ar.pszName = Translate("Check for Updates"); ar.pszService = MS_UPDATE_CHECKFORUPDATESTRGR; CallService(MS_TRIGGER_REGISTERACTION, 0, (LPARAM)&ar); } return 0; } int Shutdown(WPARAM wParam, LPARAM lParam) { if(hNetlibUser) { SOCKET s = CallService( MS_NETLIB_GETSOCKET, (WPARAM)hNetlibUser, 0 ); if ( s != INVALID_SOCKET ) shutdown( s, 2 ); } return 0; } HANDLE hEventOptInit, hEventPreShutdown, hEventModulesLoaded; extern "C" int __declspec(dllexport) Load(PLUGINLINK *link) { pluginLink = link; char szVer[128]; unicode_system = (CallService(MS_SYSTEM_GETVERSIONTEXT, (WPARAM)sizeof(szVer), (LPARAM)szVer) == 0 && strstr(szVer, "Unicode")); /* #ifdef _UNICODE if(!unicode_system) { TCHAR fp[256], *fn; GetModuleFileName(hInst, fp, 256); fn = _tcsrchr(fp, '\\'); if(fn) fn++; MessageBox(0, TranslateT("You are using the wrong version of this plugin.\nPlease download the NON-UNICODE version.\nPlugin disabled."), fn, MB_OK); return 1; } #else if(unicode_system) { TCHAR fp[256], *fn; GetModuleFileName(hInst, fp, 256); fn = _tcsrchr(fp, '\\'); if(fn) fn++; MessageBox(0, TranslateT("You are using the wrong version of this plugin.\nPlease download the UNICODE version.\nPlugin disabled."), fn, MB_OK); return 1; } #endif */ mainThreadId = GetCurrentThreadId(); DuplicateHandle( GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &mainThread, THREAD_SET_CONTEXT, FALSE, 0 ); // save global status from clist - will be restored after update check if that option is enabled, or in modules loaded if not options.start_offline = (DBGetContactSettingByte(0, MODULE, "StartOffline", 1) == 1); // load option here - rest loading in modulesloaded if(options.start_offline) { WORD saved_status = DBGetContactSettingWord(0, "CList", "Status", ID_STATUS_OFFLINE); if(saved_status != ID_STATUS_OFFLINE) { DBWriteContactSettingWord(0, MODULE, "SavedGlobalStatus", saved_status); DBWriteContactSettingWord(0, "CList", "Status", ID_STATUS_OFFLINE); } } INITCOMMONCONTROLSEX icex; // Ensure that the common control DLL is loaded (for listview) icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_LISTVIEW_CLASSES; InitCommonControlsEx(&icex); OleInitialize(0); HookEvent(ME_OPT_INITIALISE, OptInit); HookEvent(ME_SYSTEM_PRESHUTDOWN, Shutdown); // do this before init services, so that InitPopups is called before startup update HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded); InitServices(); return 0; } extern "C" int __declspec(dllexport) Unload(void) { UnhookEvent(hEventIdleChanged); UnhookEvent(hEventOptInit); UnhookEvent(hEventPreShutdown); UnhookEvent(hEventModulesLoaded); DeinitServices(); DeinitPopups(); DeinitNetlib(); DeinitIcons(); OleUninitialize(); return 0; }