extern "C" POPUPS2_API PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) { pluginInfo.cbSize = sizeof(PLUGININFOEX); if (!IsWinVerNT() && !GetModuleHandle(_T("unicows.dll"))) { MessageBox(NULL, _T("The yapp plugin cannot be loaded. It requires unicows.dll."), _T("Miranda IM"), MB_OK | MB_ICONWARNING | MB_SETFOREGROUND | MB_TOPMOST); return NULL; } return &pluginInfo; }
BOOL MySystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION ptzi, LPSYSTEMTIME pstUtc, LPSYSTEMTIME pstLoc) { // st is UTC FILETIME ft ; LARGE_INTEGER li ; SYSTEMTIME stDst ; if (IsWinVerNT()) return SystemTimeToTzSpecificLocalTime(ptzi, pstUtc, pstLoc); // Convert time to a LARGE_INTEGER and subtract the bias SystemTimeToFileTime (pstUtc, &ft) ; li = * (LARGE_INTEGER *) (void *) &ft; li.QuadPart -= (LONGLONG) 600000000 * ptzi->Bias ; // Convert to a local date/time before application of daylight saving time. // The local date/time must be used to determine when the conversion occurs. ft = * (FILETIME *) (void *) &li ; FileTimeToSystemTime (&ft, pstLoc) ; // Find the time assuming Daylight Saving Time li.QuadPart -= (LONGLONG) 600000000 * ptzi->DaylightBias ; ft = * (FILETIME *) (void *) &li ; FileTimeToSystemTime (&ft, &stDst) ; // Now put li back the way it was li.QuadPart += (LONGLONG) 600000000 * ptzi->DaylightBias ; if (ptzi->StandardDate.wMonth) // ie, daylight savings time { // Northern hemisphere if ((ptzi->DaylightDate.wMonth < ptzi->StandardDate.wMonth) && (stDst.wMonth >= pstLoc->wMonth) && // avoid the end of year problem LocalGreaterThanTransition (pstLoc, &ptzi->DaylightDate) && !LocalGreaterThanTransition (&stDst, &ptzi->StandardDate)) { li.QuadPart -= (LONGLONG) 600000000 * ptzi->DaylightBias ; } // Southern hemisphere else if ((ptzi->StandardDate.wMonth < ptzi->DaylightDate.wMonth) && (!LocalGreaterThanTransition (&stDst, &ptzi->StandardDate) || LocalGreaterThanTransition (pstLoc, &ptzi->DaylightDate))) { li.QuadPart -= (LONGLONG) 600000000 * ptzi->DaylightBias ; } else { li.QuadPart -= (LONGLONG) 600000000 * ptzi->StandardBias ; } } ft = * (FILETIME *) (void *) &li ; FileTimeToSystemTime (&ft, pstLoc) ; return TRUE ; }
void InitTimeZones(void) { REG_TZI_FORMAT tzi; HKEY hKey; const TCHAR *tszKey = IsWinVerNT() ? _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones") : _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones"); /* * use GetDynamicTimeZoneInformation() on Vista+ - this will return a structure with * the registry key name, so finding our own time zone later will be MUCH easier for * localized systems or systems with a MUI pack installed */ if (IsWinVerVistaPlus()) pfnGetDynamicTimeZoneInformation = (pfnGetDynamicTimeZoneInformation_t)GetProcAddress(GetModuleHandle(_T("kernel32")), "GetDynamicTimeZoneInformation"); if (IsWinVer2000Plus()) { pfnSHLoadIndirectString = (pfnSHLoadIndirectString_t)GetProcAddress(GetModuleHandle(_T("shlwapi")), "SHLoadIndirectString"); pfnGetSystemDefaultUILanguage = (pfnGetSystemDefaultUILanguage_t)GetProcAddress(GetModuleHandle(_T("kernel32")), "GetSystemDefaultUILanguage"); pfnGetUserDefaultUILanguage = (pfnGetUserDefaultUILanguage_t)GetProcAddress(GetModuleHandle(_T("kernel32")), "GetUserDefaultUILanguage"); muiInstalled = pfnSHLoadIndirectString && pfnGetSystemDefaultUILanguage() != pfnGetUserDefaultUILanguage(); } pfnSendMessageW = (pfnSendMessageW_t)GetProcAddress(GetModuleHandle(_T("user32")), "SendMessageW"); if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, tszKey, 0, KEY_ENUMERATE_SUB_KEYS, &hKey)) { DWORD dwIndex = 0; HKEY hSubKey; TCHAR tszName[MIM_TZ_NAMELEN]; DWORD dwSize = SIZEOF(tszName); while (ERROR_NO_MORE_ITEMS != RegEnumKeyEx(hKey, dwIndex++, tszName, &dwSize, NULL, NULL, 0, NULL)) { if (ERROR_SUCCESS == RegOpenKeyEx(hKey, tszName, 0, KEY_QUERY_VALUE, &hSubKey)) { dwSize = sizeof(tszName); DWORD dwLength = sizeof(tzi); if (ERROR_SUCCESS != RegQueryValueEx(hSubKey, _T("TZI"), NULL, NULL, (unsigned char *)&tzi, &dwLength)) continue; MIM_TIMEZONE *tz = new MIM_TIMEZONE; tz->tzi.Bias = tzi.Bias; tz->tzi.StandardDate = tzi.StandardDate; tz->tzi.StandardBias = tzi.StandardBias; tz->tzi.DaylightDate = tzi.DaylightDate; tz->tzi.DaylightBias = tzi.DaylightBias; _tcscpy(tz->tszName, tszName); tz->hash = hashstr(tszName); tz->offset = INT_MIN; GetLocalizedString(hSubKey, _T("Display"), tz->szDisplay, SIZEOF(tz->szDisplay)); GetLocalizedString(hSubKey, _T("Std"), tz->tzi.StandardName, SIZEOF(tz->tzi.StandardName)); GetLocalizedString(hSubKey, _T("Dlt"), tz->tzi.DaylightName, SIZEOF(tz->tzi.DaylightName)); g_timezones.insert(tz); g_timezonesBias.insert(tz); RegCloseKey(hSubKey); } dwSize = SIZEOF(tszName); } RegCloseKey(hKey); } RecalculateTime(); CreateServiceFunction(MS_SYSTEM_GET_TMI, GetTimeApi); CreateServiceFunction(MS_DB_TIME_TIMESTAMPTOLOCAL, TimestampToLocal); CreateServiceFunction(MS_DB_TIME_TIMESTAMPTOSTRINGT, TimestampToStringT); #ifdef _UNICODE CreateServiceFunction(MS_DB_TIME_TIMESTAMPTOSTRING, TimestampToStringA); #else CreateServiceFunction(MS_DB_TIME_TIMESTAMPTOSTRING, TimestampToStringT); #endif tmi.cbSize = sizeof(tmi); GetTimeApi(0, (LPARAM)&tmi); }