コード例 #1
0
	// This method clears the list and adds contacts again, according to the current filter settings.
	void RebuildList()
	{
		LPSTR pszProto;
		MTime mtNow;
		MAnnivDate ad;
		int i = 0;
		DWORD age = 0;
		WORD wDaysBefore = db_get_w(NULL, MODNAME, SET_REMIND_OFFSET, DEFVAL_REMIND_OFFSET);
		WORD numMale = 0;
		WORD numFemale = 0;
		WORD numContacts = 0;
		WORD numBirthContacts = 0;

		ShowWindow(_hList, SW_HIDE);
		DeleteAllItems();
		mtNow.GetLocalTime();

		// insert the items into the list
		for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) {
			// ignore meta subcontacts here, as they are not interesting.
			if (!db_mc_isSub(hContact)) {
				// filter protocol
				pszProto = Proto_GetBaseAccountName(hContact);
				if (pszProto) {
					numContacts++;
					switch (GenderOf(hContact, pszProto)) {
					case 'M':
						numMale++;
						break;
					case 'F':
						numFemale++;
					}

					if (!ad.DBGetBirthDate(hContact, pszProto)) {
						age += ad.Age(&mtNow);
						numBirthContacts++;

						// add birthday
						if ((_filter.bFilterIndex != FILTER_ANNIV) && (!_filter.pszProto || !_strcmpi(pszProto, _filter.pszProto)))
							AddRow(hContact, pszProto, ad, mtNow, wDaysBefore);
					}

					// add anniversaries
					if (_filter.bFilterIndex != FILTER_BIRTHDAY && (!_filter.pszProto || !_strcmpi(pszProto, _filter.pszProto))) 
						for (i = 0; !ad.DBGetAnniversaryDate(hContact, i); i++)
							if (!_filter.pszAnniv || !mir_tstrcmpi(_filter.pszAnniv, ad.Description()))
								AddRow(hContact, pszProto, ad, mtNow, wDaysBefore);
				}
			}
		}
		ListView_SortItemsEx(_hList, (CMPPROC)cmpProc, this);
		ShowWindow(_hList, SW_SHOW);

		// display statistics
		SetDlgItemInt(_hDlg, TXT_NUMBIRTH, numBirthContacts, FALSE);
		SetDlgItemInt(_hDlg, TXT_NUMCONTACT, numContacts, FALSE);
		SetDlgItemInt(_hDlg, TXT_FEMALE, numFemale, FALSE);
		SetDlgItemInt(_hDlg, TXT_MALE, numMale, FALSE);
		SetDlgItemInt(_hDlg, TXT_AGE, numBirthContacts > 0 ? (age - (age % numBirthContacts)) / numBirthContacts : 0, FALSE);
	}
コード例 #2
0
ファイル: svc_phone.cpp プロジェクト: kmdtukl/miranda-ng
static INT_PTR Get(MCONTACT hContact)
{
	INT_PTR nType = PHONE_NONE;

	// ignore owner
	if (hContact != NULL) {
		LPCSTR pszProto = Proto_GetBaseAccountName(hContact);
		if (pszProto != NULL) {
			LPCSTR e[2][4] = {
				{ SET_CONTACT_CELLULAR,         SET_CONTACT_PHONE,         "MyPhone0"        },
				{ SET_CONTACT_COMPANY_CELLULAR, SET_CONTACT_COMPANY_PHONE, "MyCompanyPhone0" }
			};

			for (int i = 0; (i < 2) && (nType == PHONE_NONE); i++) {
				for (int j = 0; (j < 3) && (nType == PHONE_NONE); j++) {
					LPSTR pszPhone = DB::Setting::GetAStringEx(hContact, USERINFO, pszProto, e[i][j]);
					if (pszPhone) {
						nType = (strstr(pszPhone, " SMS")) ? PHONE_SMS : PHONE_NORMAL;
						MIR_FREE(pszPhone);
						break;
					}
				}
			}
		}
	}
	return nType;
}
コード例 #3
0
ファイル: svc_ExImVCF.cpp プロジェクト: kmdtukl/miranda-ng
/**
 * name:	Open
 * desc:	open a specified filename and link to the contact
 * param:	hContact	- handle to the contact to link with the vCard file
 *			pszFileName	- path to the file to open
 *			pszMode		- the mode the file should be opened with
 * return	TRUE or FALSE
 **/
BYTE CVCardFileVCF::Open(MCONTACT hContact,	LPCSTR pszFileName, LPCSTR pszMode)
{
	if (!(_pFile = fopen(pszFileName, pszMode)))
		return FALSE;
	if ((_hContact = hContact) == INVALID_CONTACT_ID)
		return FALSE;
	if (!(_pszBaseProto = Proto_GetBaseAccountName(_hContact)))
		return FALSE;
	return TRUE;
}
コード例 #4
0
CTimeZone* GetContactTimeZone(MCONTACT hContact)
{
    return GetContactTimeZone(hContact, Proto_GetBaseAccountName(hContact));
}
コード例 #5
0
BYTE GenderOf(MCONTACT hContact)
{
	return GenderOf(hContact, Proto_GetBaseAccountName(hContact));
}
コード例 #6
0
ファイル: contacts.cpp プロジェクト: Seldom/miranda-ng
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;
}