Beispiel #1
0
static void TZ_LoadTimeZone(MCONTACT hContact, struct TExtraCache *c)
{
	DWORD flags = 0;
	if (cfg::dat.bShowLocalTimeSelective)
		flags |= TZF_DIFONLY;
	c->hTimeZone = TimeZone_CreateByContact(hContact, 0, flags);
}
void Cache_GetTimezone(ClcData *dat, MCONTACT hContact)
{
	ClcCacheEntry *pdnce = pcli->pfnGetCacheEntry(hContact);
	if (dat == NULL && pcli->hwndContactTree)
		dat = (ClcData *)GetWindowLongPtr(pcli->hwndContactTree, 0);

	if (dat && dat->hWnd == pcli->hwndContactTree) {
		DWORD flags = dat->contact_time_show_only_if_different ? TZF_DIFONLY : 0;
		pdnce->hTimeZone = TimeZone_CreateByContact(hContact, 0, flags);
	}
}
/////////////////////////////////////////////////////////////////////////////////////////
// Get time zone for contact
//
void Cache_GetTimezone(ClcData *dat, MCONTACT hContact)
{
	ClcCacheEntry *pdnce = Clist_GetCacheEntry(hContact);
	if (dat == nullptr && g_clistApi.hwndContactTree)
		dat = (ClcData *)GetWindowLongPtr(g_clistApi.hwndContactTree, 0);

	if (dat && dat->hWnd == g_clistApi.hwndContactTree) {
		DWORD flags = dat->contact_time_show_only_if_different ? TZF_DIFONLY : 0;
		pdnce->hTimeZone = TimeZone_CreateByContact(hContact, nullptr, flags);
	}
}
Beispiel #4
0
char* ChangeInfoData::GetItemSettingText(int i, char *buf, size_t bufsize)
{
	char *text = buf;
	int alloced = 0;

	buf[0] = '\0';

	const SettingItem &si = setting[i];
	SettingItemData &sid = settingData[i];
	if (sid.value == 0 && !(si.displayType & LIF_ZEROISVALID)) {
		if (si.displayType & LIF_CHANGEONLY)
			text = ICQTranslateUtfStatic(LPGEN("<unremovable once applied>"), buf, bufsize);
		else
			text = ICQTranslateUtfStatic(LPGEN("<empty>"), buf, bufsize);
	}
	else {
		switch (si.displayType & LIM_TYPE) {
		case LI_STRING:
		case LI_LONGSTRING:
			text = BinaryToEscapes((char*)sid.value);
			alloced = 1;
			break;

		case LI_NUMBER:
			_itoa(sid.value, text, 10);
			break;

		case LI_LIST:
			if (si.dbType == DBVT_ASCIIZ)
				text = ICQTranslateUtfStatic((char*)sid.value, buf, bufsize);
			else {
				text = ICQTranslateUtfStatic(LPGEN("Unknown value"), buf, bufsize);

				FieldNamesItem *list = (FieldNamesItem*)si.pList;
				if (list == timezonesField) {
					HANDLE tz = TimeZone_CreateByContact(NULL, ppro->m_szModuleName, 0);
					text = make_utf8_string_static(TimeZone_GetDescription(TimeZone_GetName(tz)), buf, bufsize);
					break;
				}

				for (int j = 0;; j++) {
					if (list[j].code == sid.value) {
						text = ICQTranslateUtfStatic(list[j].text, buf, bufsize);
						break;
					}
					else if (!list[j].text) {
						if (list[j].code == sid.value)
							text = ICQTranslateUtfStatic("Unspecified", buf, bufsize);
						break;
					}
				}
			}
			break;
		}
	}

	if (si.displayType & LIF_PASSWORD) {
		if (sid.changed) {
			for (int j = 0; text[j]; j++)
				text[j] = '*';
		}
		else {
			if (alloced) {
				SAFE_FREE(&text);
				alloced = 0;
			}
			text = "********";
		}
	}
	if (text != buf) {
		char *tmp = text;

		text = null_strcpy(buf, text, bufsize - 1);
		if (alloced)
			SAFE_FREE(&tmp);
	}

	return text;
}
Beispiel #5
0
static INT_PTR GetContactInfo(WPARAM, LPARAM lParam)
{
	DBVARIANT dbv;
	CONTACTINFO *ci = (CONTACTINFO*)lParam;
	if (ci == NULL) return 1;
	if (ci->szProto == NULL) ci->szProto = Proto_GetBaseAccountName(ci->hContact);
	if (ci->szProto == NULL) return 1;
	
	ci->type = 0;
	switch (ci->dwFlag & 0x7F) {
	case CNF_FIRSTNAME:  return ProcessDatabaseValueDefault(ci, "FirstName");
	case CNF_LASTNAME:   return ProcessDatabaseValueDefault(ci, "LastName");
	case CNF_NICK:       return ProcessDatabaseValueDefault(ci, "Nick");
	case CNF_EMAIL:      return ProcessDatabaseValueDefault(ci, "e-mail");
	case CNF_CITY:       return ProcessDatabaseValueDefault(ci, "City");
	case CNF_STATE:      return ProcessDatabaseValueDefault(ci, "State");
	case CNF_PHONE:      return ProcessDatabaseValueDefault(ci, "Phone");
	case CNF_HOMEPAGE:   return ProcessDatabaseValueDefault(ci, "Homepage");
	case CNF_ABOUT:      return ProcessDatabaseValueDefault(ci, "About");
	case CNF_AGE:        return ProcessDatabaseValueDefault(ci, "Age");
	case CNF_GENDER:     return ProcessDatabaseValueDefault(ci, "Gender");
	case CNF_FAX:        return ProcessDatabaseValueDefault(ci, "Fax");
	case CNF_CELLULAR:	return ProcessDatabaseValueDefault(ci, "Cellular");
	case CNF_BIRTHDAY:	return ProcessDatabaseValueDefault(ci, "BirthDay");
	case CNF_BIRTHMONTH:	return ProcessDatabaseValueDefault(ci, "BirthMonth");
	case CNF_BIRTHYEAR:	return ProcessDatabaseValueDefault(ci, "BirthYear");
	case CNF_STREET:		return ProcessDatabaseValueDefault(ci, "Street");
	case CNF_ZIP:			return ProcessDatabaseValueDefault(ci, "ZIP");
	case CNF_LANGUAGE1:	return ProcessDatabaseValueDefault(ci, "Language1");
	case CNF_LANGUAGE2:	return ProcessDatabaseValueDefault(ci, "Language2");
	case CNF_LANGUAGE3:	return ProcessDatabaseValueDefault(ci, "Language3");
	case CNF_CONAME:		return ProcessDatabaseValueDefault(ci, "Company");
	case CNF_CODEPT:     return ProcessDatabaseValueDefault(ci, "CompanyDepartment");
	case CNF_COPOSITION: return ProcessDatabaseValueDefault(ci, "CompanyPosition");
	case CNF_COSTREET:   return ProcessDatabaseValueDefault(ci, "CompanyStreet");
	case CNF_COCITY:     return ProcessDatabaseValueDefault(ci, "CompanyCity");
	case CNF_COSTATE:    return ProcessDatabaseValueDefault(ci, "CompanyState");
	case CNF_COZIP:      return ProcessDatabaseValueDefault(ci, "CompanyZIP");
	case CNF_COHOMEPAGE: return ProcessDatabaseValueDefault(ci, "CompanyHomepage");

	case CNF_CUSTOMNICK:
		{
			char* saveProto = ci->szProto; ci->szProto = "CList";
			if (ci->hContact != NULL && !ProcessDatabaseValueDefault(ci, "MyHandle")) {
				ci->szProto = saveProto;
				return 0;
			}
			ci->szProto = saveProto;
		}
		break;

	case CNF_COUNTRY:
	case CNF_COCOUNTRY:
		if (!GetDatabaseString(ci, (ci->dwFlag & 0x7F) == CNF_COUNTRY ? "CountryName" : "CompanyCountryName", &dbv))
			return 0;

		if (!db_get(ci->hContact, ci->szProto, (ci->dwFlag & 0x7F) == CNF_COUNTRY ? "Country" : "CompanyCountry", &dbv)) {
			if (dbv.type == DBVT_WORD) {
				int i, countryCount;
				struct CountryListEntry *countries;
				CallService(MS_UTILS_GETCOUNTRYLIST, (WPARAM)&countryCount, (LPARAM)&countries);
				for (i = 0; i < countryCount; i++) {
					if (countries[i].id != dbv.wVal) continue;

					if (ci->dwFlag & CNF_UNICODE) {
						int cbLen = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)countries[i].szName, -1, NULL, 0);
						WCHAR* buf = (WCHAR*)mir_alloc(sizeof(WCHAR)*(cbLen + 1));
						if (buf != NULL)
							MultiByteToWideChar(CP_ACP, 0, (LPCSTR)countries[i].szName, -1, buf, cbLen);
						ci->pszVal = (TCHAR*)buf;
					}
					else ci->pszVal = (TCHAR*)mir_strdup(countries[i].szName);

					ci->type = CNFT_ASCIIZ;
					db_free(&dbv);
					return 0;
				}
			}
			else return ProcessDatabaseValueDefault(ci, (ci->dwFlag & 0x7F) == CNF_COUNTRY ? "Country" : "CompanyCountry");
			db_free(&dbv);
		}
		break;

	case CNF_FIRSTLAST:
		if (!GetDatabaseString(ci, "FirstName", &dbv)) {
			DBVARIANT dbv2;
			if (!GetDatabaseString(ci, "LastName", &dbv2)) {
				ci->type = CNFT_ASCIIZ;
				if (ci->dwFlag & CNF_UNICODE) {
					size_t len = mir_wstrlen(dbv.pwszVal) + mir_wstrlen(dbv2.pwszVal) + 2;
					WCHAR* buf = (WCHAR*)mir_alloc(sizeof(WCHAR)*len);
					if (buf != NULL)
						mir_wstrcat(mir_wstrcat(mir_wstrcpy(buf, dbv.pwszVal), L" "), dbv2.pwszVal);
					ci->pszVal = (TCHAR*)buf;
				}
				else {
					size_t len = mir_strlen(dbv.pszVal) + mir_strlen(dbv2.pszVal) + 2;
					char* buf = (char*)mir_alloc(len);
					if (buf != NULL)
						mir_strcat(mir_strcat(mir_strcpy(buf, dbv.pszVal), " "), dbv2.pszVal);
					ci->pszVal = (TCHAR*)buf;
				}
				db_free(&dbv);
				db_free(&dbv2);
				return 0;
			}
			db_free(&dbv);
		}
		break;

	case CNF_UNIQUEID:
		{
			if (db_mc_isMeta(ci->hContact)) {
				TCHAR buf[40];
				_itot(ci->hContact, buf, 10);
				ci->pszVal = mir_tstrdup(buf);
				ci->type = CNFT_ASCIIZ;
				return 0;
			}

			char *uid = (char*)CallProtoService(ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
			if ((INT_PTR)uid != CALLSERVICE_NOTFOUND && uid)
				if (!ProcessDatabaseValueDefault(ci, uid))
					return 0;
		}
		break;

	case CNF_DISPLAYUID:
		{
			if (!ProcessDatabaseValueDefault(ci, "display_uid"))
				return 0;
			char *uid = (char*)CallProtoService(ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
			if ((INT_PTR)uid != CALLSERVICE_NOTFOUND && uid)
				if (!ProcessDatabaseValueDefault(ci, uid))
					return 0;

		}
		break;

	case CNF_DISPLAYNC:
	case CNF_DISPLAY:
		for (int i = 0; i < NAMEORDERCOUNT; i++) {
			switch (nameOrder[i]) {
			case 0: // custom name
				// make sure we aren't in CNF_DISPLAYNC mode
				// don't get custom name for NULL contact
				{
					char *saveProto = ci->szProto; ci->szProto = "CList";
					if (ci->hContact != NULL && (ci->dwFlag & 0x7F) == CNF_DISPLAY && !ProcessDatabaseValueDefault(ci, "MyHandle")) {
						ci->szProto = saveProto;
						return 0;
					}
					ci->szProto = saveProto;
				}
				break;
			case 1:
				if (!ProcessDatabaseValueDefault(ci, "Nick")) // nick
					return 0;
				break;
			case 2:
				if (!ProcessDatabaseValueDefault(ci, "FirstName")) // First Name
					return 0;
				break;
			case 3:
				if (!ProcessDatabaseValueDefault(ci, "e-mail")) // E-mail
					return 0;
				break;
			case 4:
				if (!ProcessDatabaseValueDefault(ci, "LastName")) // Last Name
					return 0;
				break;
			case 5: // Unique id
				{
					// protocol must define a PFLAG_UNIQUEIDSETTING
					char *uid = (char*)CallProtoService(ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
					if ((INT_PTR)uid != CALLSERVICE_NOTFOUND && uid) {
						if (!GetDatabaseString(ci, uid, &dbv)) {
							if (dbv.type == DBVT_BYTE || dbv.type == DBVT_WORD || dbv.type == DBVT_DWORD) {
								long value = (dbv.type == DBVT_BYTE) ? dbv.bVal : (dbv.type == DBVT_WORD ? dbv.wVal : dbv.dVal);
								if (ci->dwFlag & CNF_UNICODE) {
									WCHAR buf[40];
									_ltow(value, buf, 10);
									ci->pszVal = (TCHAR*)mir_wstrdup(buf);
								}
								else {
									char buf[40];
									_ltoa(value, buf, 10);
									ci->pszVal = (TCHAR*)mir_strdup(buf);
								}
								ci->type = CNFT_ASCIIZ;
								return 0;
							}
							if (dbv.type == DBVT_ASCIIZ && !(ci->dwFlag & CNF_UNICODE)) {
								ci->type = CNFT_ASCIIZ;
								ci->pszVal = dbv.ptszVal;
								return 0;
							}
							if (dbv.type == DBVT_WCHAR && (ci->dwFlag & CNF_UNICODE)) {
								ci->type = CNFT_ASCIIZ;
								ci->pszVal = dbv.ptszVal;
								return 0;
							}
						}
					}
				}
				break;
			case 6: // first + last name
			case 7: // last + first name
				if (!GetDatabaseString(ci, nameOrder[i] == 6 ? "FirstName" : "LastName", &dbv)) {
					DBVARIANT dbv2;
					if (!GetDatabaseString(ci, nameOrder[i] == 6 ? "LastName" : "FirstName", &dbv2)) {
						ci->type = CNFT_ASCIIZ;

						if (ci->dwFlag & CNF_UNICODE) {
							size_t len = mir_wstrlen(dbv.pwszVal) + mir_wstrlen(dbv2.pwszVal) + 2;
							WCHAR* buf = (WCHAR*)mir_alloc(sizeof(WCHAR)*len);
							if (buf != NULL)
								mir_wstrcat(mir_wstrcat(mir_wstrcpy(buf, dbv.pwszVal), L" "), dbv2.pwszVal);
							ci->pszVal = (TCHAR*)buf;
						}
						else {
							size_t len = mir_strlen(dbv.pszVal) + mir_strlen(dbv2.pszVal) + 2;
							char* buf = (char*)mir_alloc(len);
							if (buf != NULL)
								mir_strcat(mir_strcat(mir_strcpy(buf, dbv.pszVal), " "), dbv2.pszVal);
							ci->pszVal = (TCHAR*)buf;
						}

						db_free(&dbv);
						db_free(&dbv2);
						return 0;
					}
					db_free(&dbv);
				}
				break;

			case 8:
				if (ci->dwFlag & CNF_UNICODE)
					ci->pszVal = (TCHAR*)mir_wstrdup(TranslateW(L"'(Unknown contact)'"));
				else
					ci->pszVal = (TCHAR*)mir_strdup(Translate("'(Unknown contact)'"));
				ci->type = CNFT_ASCIIZ;
				return 0;
			}
		}
		break;

	case CNF_TIMEZONE:
		{
			HANDLE hTz = TimeZone_CreateByContact(ci->hContact, 0, TZF_KNOWNONLY);
			if (hTz) {
				LPTIME_ZONE_INFORMATION tzi = TimeZone_GetInfo(hTz);
				int offset = tzi->Bias + tzi->StandardBias;

				char str[80];
				mir_snprintf(str, offset ? "UTC%+d:%02d" : "UTC", offset / -60, abs(offset % 60));
				ci->pszVal = ci->dwFlag & CNF_UNICODE ? (TCHAR*)mir_a2u(str) : (TCHAR*)mir_strdup(str);
				ci->type = CNFT_ASCIIZ;
				return 0;
			}
		}
		break;

	case CNF_MYNOTES:
		char* saveProto = ci->szProto; ci->szProto = "UserInfo";
		if (!ProcessDatabaseValueDefault(ci, "MyNotes")) {
			ci->szProto = saveProto;
			return 0;
		}
		ci->szProto = saveProto;
		break;
	}

	return 1;
}