// 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); }
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; }
/** * 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; }
CTimeZone* GetContactTimeZone(MCONTACT hContact) { return GetContactTimeZone(hContact, Proto_GetBaseAccountName(hContact)); }
BYTE GenderOf(MCONTACT hContact) { return GenderOf(hContact, Proto_GetBaseAccountName(hContact)); }
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; }