static HANDLE timeapiGetInfoByContact(HANDLE hContact, DWORD dwFlags) { if (hContact == NULL) return (dwFlags & (TZF_DIFONLY | TZF_KNOWNONLY)) ? NULL : &myInfo.myTZ; DBVARIANT dbv; if (!DBGetContactSettingTString(hContact, "UserInfo", "TzName", &dbv)) { HANDLE res = timeapiGetInfoByName(dbv.ptszVal, dwFlags); DBFreeVariant(&dbv); if (res) return res; } signed char timezone = (signed char)DBGetContactSettingByte(hContact, "UserInfo", "Timezone", -1); if (timezone == -1) { char* szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); if (!DBGetContactSettingTString(hContact, szProto, "TzName", &dbv)) { HANDLE res = timeapiGetInfoByName(dbv.ptszVal, dwFlags); DBFreeVariant(&dbv); if (res) return res; } timezone = (signed char)DBGetContactSettingByte(hContact, szProto, "Timezone", -1); } if (timezone != -1) { MIM_TIMEZONE tzsearch; tzsearch.tzi.Bias = timezone * 30; if (myInfo.myTZ.tzi.Bias == tzsearch.tzi.Bias) { if (dwFlags & TZF_DIFONLY) return NULL; return &myInfo.myTZ; } int i = g_timezonesBias.getIndex(&tzsearch); while (i >= 0 && g_timezonesBias[i]->tzi.Bias == tzsearch.tzi.Bias) --i; int delta = LONG_MAX; for (int j = ++i; j < g_timezonesBias.getCount() && g_timezonesBias[j]->tzi.Bias == tzsearch.tzi.Bias; ++j) { int delta1 = abs(g_timezonesBias[j]->tzi.DaylightDate.wMonth - myInfo.myTZ.tzi.DaylightDate.wMonth); if (delta1 <= delta) { delta = delta1; i = j; } } if (i >= 0) { MIM_TIMEZONE *tz = g_timezonesBias[i]; return ((dwFlags & TZF_DIFONLY) && IsSameTime(tz)) ? NULL : tz; } } return (dwFlags & (TZF_DIFONLY | TZF_KNOWNONLY)) ? NULL : &myInfo.myTZ; }
MIR_CORE_DLL(HANDLE) TimeZone_CreateByContact(MCONTACT hContact, LPCSTR szModule, DWORD dwFlags) { if (hContact == NULL && szModule == NULL) return (dwFlags & (TZF_DIFONLY | TZF_KNOWNONLY)) ? NULL : &myInfo.myTZ; if (szModule == NULL) szModule = "UserInfo"; DBVARIANT dbv; if (!db_get_ts(hContact, szModule, "TzName", &dbv)) { HANDLE res = TimeZone_CreateByName(dbv.ptszVal, dwFlags); db_free(&dbv); if (res) return res; } signed char timezone = (signed char)db_get_b(hContact, szModule, "Timezone", -1); if (timezone == -1) { char *szProto = GetContactProto(hContact); if (!db_get_ts(hContact, szProto, "TzName", &dbv)) { HANDLE res = TimeZone_CreateByName(dbv.ptszVal, dwFlags); db_free(&dbv); if (res) return res; } timezone = (signed char)db_get_b(hContact, szProto, "Timezone", -1); } if (timezone != -1) { MIM_TIMEZONE tzsearch; tzsearch.tzi.Bias = timezone * 30; if (myInfo.myTZ.tzi.Bias == tzsearch.tzi.Bias) { if (dwFlags & TZF_DIFONLY) return NULL; return &myInfo.myTZ; } int i = g_timezonesBias.getIndex(&tzsearch); while (i >= 0 && g_timezonesBias[i]->tzi.Bias == tzsearch.tzi.Bias) --i; int delta = LONG_MAX; for (int j = ++i; j < g_timezonesBias.getCount() && g_timezonesBias[j]->tzi.Bias == tzsearch.tzi.Bias; ++j) { int delta1 = abs(g_timezonesBias[j]->tzi.DaylightDate.wMonth - myInfo.myTZ.tzi.DaylightDate.wMonth); if (delta1 <= delta) { delta = delta1; i = j; } } if (i >= 0) { MIM_TIMEZONE *tz = g_timezonesBias[i]; return ((dwFlags & TZF_DIFONLY) && IsSameTime(tz)) ? NULL : tz; } } return (dwFlags & (TZF_DIFONLY | TZF_KNOWNONLY)) ? NULL : &myInfo.myTZ; }
MIR_CORE_DLL(HANDLE) TimeZone_CreateByName(LPCTSTR tszName, DWORD dwFlags) { if (tszName == NULL) return (dwFlags & (TZF_DIFONLY | TZF_KNOWNONLY)) ? NULL : &myInfo.myTZ; if (mir_tstrcmp(myInfo.myTZ.tszName, tszName) == 0) return (dwFlags & TZF_DIFONLY) ? NULL : &myInfo.myTZ; MIM_TIMEZONE tzsearch; tzsearch.hash = mir_hashstrT(tszName); MIM_TIMEZONE *tz = g_timezones.find(&tzsearch); if (tz == NULL) return (dwFlags & (TZF_DIFONLY | TZF_KNOWNONLY)) ? NULL : &myInfo.myTZ; if (dwFlags & TZF_DIFONLY) return IsSameTime(tz) ? NULL : tz; return tz; }
static HANDLE timeapiGetInfoByName(LPCTSTR tszName, DWORD dwFlags) { if (tszName == NULL) return (dwFlags & (TZF_DIFONLY | TZF_KNOWNONLY)) ? NULL : &myInfo.myTZ; if (_tcscmp(myInfo.myTZ.tszName, tszName) == 0) return (dwFlags & TZF_DIFONLY) ? NULL : &myInfo.myTZ; MIM_TIMEZONE tzsearch; tzsearch.hash = hashstr(tszName); MIM_TIMEZONE *tz = g_timezones.find(&tzsearch); if (tz == NULL) return (dwFlags & (TZF_DIFONLY | TZF_KNOWNONLY)) ? NULL : &myInfo.myTZ; if (dwFlags & TZF_DIFONLY) return IsSameTime(tz) ? NULL : tz; return tz; }