/** * name: fromIni * class: CExImContactBase * desc: get contact information from a row of a ini file * param: row - the rows data * return: TRUE if successful or FALSE otherwise **/ BYTE CExImContactBase::fromIni(LPSTR& row) { LPSTR p1, p2 = NULL; LPSTR pszUIDValue, pszUIDSetting, pszProto = NULL; LPSTR pszBuf = &row[0]; size_t cchBuf = strlen(row); MIR_FREE(_pszProtoOld); MIR_FREE(_pszProto); MIR_FREE(_pszAMPro); MIR_FREE(_pszNick); MIR_FREE(_pszDisp); MIR_FREE(_pszGroup); MIR_FREE(_pszUIDKey); db_free(&_dbvUID); ZeroMemory(&_dbvUID, sizeof(DBVARIANT)); _dbvUIDHash = 0; // read uid value if (cchBuf > 10 && (p1 = mir_strrchr(pszBuf, '*{')) && (p2 = mir_strchr(p1, '}*')) && p1 + 2 < p2) { pszUIDValue = p1 + 1; *p1 = *(p2 - 1) = 0; // insulate the uid setting from buffer pointer if (cchBuf > 0 && (p1 = mir_strrchr(pszBuf, '*<')) && (p2 = mir_strchr(p1, '>*')) && p1 + 2 < p2) { pszUIDSetting = p1 + 1; *p1 = *(p2 - 1) = 0; // insulate the protocol name from buffer pointer if (cchBuf > 0 && (p1 = mir_strrchr(pszBuf, '*(')) && (p2 = mir_strchr(p1, ')*')) && p1 + 2 < p2) { pszProto = p1 + 1; *(--p1) = *(p2 - 1) = 0; // DBVT_DWORD if (strspn(pszUIDValue, "0123456789") == mir_strlen(pszUIDValue)) { _dbvUID.dVal = _atoi64(pszUIDValue); _dbvUID.type = DBVT_DWORD; } else { // DBVT_UTF8 _dbvUID.pszVal = mir_strdup(pszUIDValue); _dbvUID.type = DBVT_UTF8; } _pszUIDKey = mir_strdup(pszUIDSetting); _pszProto = mir_strdup(pszProto); } //end insulate the protocol name from buffer pointer } //end insulate the uid setting from buffer pointer } //end read uid value // create valid nickname _pszNick = mir_strdup(pszBuf); size_t i = strlen(_pszNick)-1; while (i > 0 && (_pszNick[i] == ' ' || _pszNick[i] == '\t')) { _pszNick[i] = 0; i--; } // finally try to find contact in contact list findHandle(); return FALSE; }
/** * name: GlobalName * class: CPsTreeItem * desc: return item name without prepended protocol name * param: nothing * return: item name without protocol name **/ LPCSTR CPsTreeItem::GlobalName() { LPSTR pgn = NULL; if (_dwFlags & PSPF_PROTOPREPENDED) { pgn = mir_strchr(_pszName, '\\'); if (pgn && pgn[1]) pgn++; } return (!pgn || !*pgn) ?_pszName : pgn; }
/** * name: CVCardFileVCF::Import * desc: imports all lines from the file and writes them to database * param: nothing * * return: number of characters read from the file or EOF **/ BYTE CVCardFileVCF::Import() { CHAR szEnt[MAX_PATH]; LPSTR pszParam; int cbLine; BYTE numEmails = 0; while (EOF != (cbLine = readLine(szEnt, MAX_PATH))) { // ignore empty lines if (!cbLine) continue; // isolate the param string if (pszParam = mir_strchr(szEnt, ';')) { *(pszParam++) = 0; } switch (*szEnt) { case 'A': if (!mir_strcmp(szEnt, "ABOUT")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_ABOUT); continue; } if (!mir_strcmp(szEnt, "ADR")) { if (!pszParam) continue; if (!mir_strcmp(pszParam, "HOME")) { _clVal.GetTokenFirst(';', NULL); _clVal.GetTokenNext(';', NULL); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_STREET, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_CITY, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_STATE, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_ZIP, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_COUNTRY, ';'); continue; } if (!mir_strcmp(pszParam, "WORK")) { _clVal.GetTokenFirst(';', NULL); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_COMPANY_OFFICE, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_COMPANY_STREET, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_COMPANY_CITY, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_COMPANY_STATE, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_COMPANY_ZIP, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_COMPANY_COUNTRY, ';'); continue; } if (!mir_strcmp(pszParam, "POSTAL")) { _clVal.GetTokenFirst(';', NULL); _clVal.GetTokenNext(';', NULL); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_ORIGIN_STREET, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_ORIGIN_CITY, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_ORIGIN_STATE, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_ORIGIN_ZIP, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_ORIGIN_COUNTRY, ';'); } } continue; case 'B': if (!mir_strcmp(szEnt, "BDAY")) { if (_clVal.GetLength() == 8) { CHAR buf[5]; memcpy(buf, _clVal.GetBuffer(), 4); buf[4] = 0; db_set_w(_hContact, MOD_MBIRTHDAY, SET_CONTACT_BIRTHYEAR, (WORD)strtol(buf, NULL, 10)); memcpy(buf, _clVal.GetBuffer() + 4, 2); buf[2] = 0; db_set_b(_hContact, MOD_MBIRTHDAY, SET_CONTACT_BIRTHMONTH, (BYTE)strtol(buf, NULL, 10)); memcpy(buf, _clVal.GetBuffer() + 6, 2); buf[2] = 0; db_set_b(_hContact, MOD_MBIRTHDAY, SET_CONTACT_BIRTHDAY, (BYTE)strtol(buf, NULL, 10)); } } continue; case 'E': if (!mir_strcmp(szEnt, "EMAIL")) { if (!pszParam || !strstr(pszParam, "intERNET")) continue; if (strstr(pszParam, "PREF")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_EMAIL); continue; } switch (numEmails++) { case 0: _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_EMAIL0); break; case 1: _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_EMAIL1); break; } } continue; /* case 'I': if (!mir_strcmp(szEnt, "IM")) { LPSTR pszModule, pszSetting; if (pszParam && (pszModule = strtok(pszParam, DELIM)) && (pszSetting = strtok(NULL, DELIM))) _clVal.DBWriteSettingString(_hContact, pszModule, pszSetting); } continue; */ case 'N': if (!mir_strcmp(szEnt, "N")) { _clVal.DBWriteTokenFirst(_hContact, USERINFO, SET_CONTACT_LASTNAME, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_FIRSTNAME, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_SECONDNAME, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_TITLE, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_PREFIX, ';'); continue; } if (!mir_strcmp(szEnt, "NICKNAME")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_NICK); continue; } if (!mir_strcmp(szEnt, "NOTE")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_MYNOTES); } continue; case 'O': if (!mir_strcmp(szEnt, "ORG")) { _clVal.DBWriteTokenFirst(_hContact, USERINFO, SET_CONTACT_COMPANY, ';'); _clVal.DBWriteTokenNext(_hContact, USERINFO, SET_CONTACT_COMPANY_DEPARTMENT, ';'); } continue; case 'R': if (!mir_strcmp(szEnt, "ROLE")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_COMPANY_OCCUPATION); } continue; case 'T': if (!mir_strcmp(szEnt, "TITLE")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_COMPANY_POSITION); continue; } if (!mir_strcmp(szEnt, "TEL")) { if (!pszParam) continue; if (!mir_strcmp(pszParam, "HOME;VOICE")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_PHONE); continue; } if (!mir_strcmp(pszParam, "HOME;FAX")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_FAX); continue; } if (!mir_strcmp(pszParam, "CELL;VOICE")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_CELLULAR); continue; } if (!mir_strcmp(pszParam, "WORK;VOICE")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_COMPANY_PHONE); continue; } if (!mir_strcmp(pszParam, "WORK;FAX")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_COMPANY_FAX); continue; } if (!mir_strcmp(pszParam, "PAGER;VOICE")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_COMPANY_CELLULAR); continue; } } continue; case 'U': if (!mir_strcmp(szEnt, "URL")) { if (!pszParam) continue; if (!mir_strcmp(pszParam, "HOME")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_HOMEPAGE); continue; } if (!mir_strcmp(pszParam, "WORK")) { _clVal.DBWriteSettingString(_hContact, USERINFO, SET_CONTACT_COMPANY_HOMEPAGE); } } continue; case 'X': if (!mir_strcmp(szEnt, "X-WAB-GENDER")) { if (!mir_strcmp(_clVal.GetBuffer(), "1")) db_set_b(_hContact, USERINFO, SET_CONTACT_GENDER, 'F'); else if (!mir_strcmp(_clVal.GetBuffer(), "2")) db_set_b(_hContact, USERINFO, SET_CONTACT_GENDER, 'M'); } continue; } } return TRUE; }
/** * name: ImportSetting * desc: This function writes a line identified as a setting to the database * param: hContact - handle to contact to match or NULL to match all existing * pszModule - module to write the setting to * strLine - string with the setting and its value to write to db * return: 0 if writing was ok, 1 otherwise **/ int ImportSetting(MCONTACT hContact, LPCSTR pszModule, LPSTR &strLine) { DBVARIANT dbv; LPSTR end, value; size_t numLines = 0; size_t brk; LPSTR pszLine = strLine; // check Module and filter "Protocol" if (!pszModule || !*pszModule || mir_strncmp(pszModule,"Protocol",8) == 0) return 1; if ((end = value = mir_strchr(pszLine, '=')) == NULL) return 1; // truncate setting string if it has spaces at the end do { if (end == pszLine) return 1; *(end--) = 0; } while (*end == '\t' || *end == ' ' || *end < 27); // skip spaces from the beginning of the value do { value++; // if the value is empty, delete it from db if (*value == '\0') return db_unset(hContact, pszModule, pszLine); } while (*value == '\t' || *value == ' '); // decode database type and value switch (*(value++)) { case 'b': case 'B': if (brk = strspn(value, "0123456789-")) *(value + brk) = 0; dbv.type = DBVT_BYTE; dbv.bVal = (BYTE)atoi(value); break; case 'w': case 'W': if (brk = strspn(value, "0123456789-")) *(value + brk) = 0; dbv.type = DBVT_WORD; dbv.wVal = (WORD)atoi(value); break; case 'd': case 'D': if (brk = strspn(value, "0123456789-")) *(value + brk) = 0; dbv.type = DBVT_DWORD; dbv.dVal = (DWORD)_atoi64(value); break; case 's': case 'S': case 'u': case 'U': for (end = value; end && *end; end++) { switch (*end) { // convert STX back to \r case 2: *end = '\r'; break; // convert ETX back to \n case 3: *end = '\n'; break; } } switch (*(value - 1)) { case 's': case 'S': dbv.type = DBVT_ASCIIZ; dbv.pszVal = value; break; case 'u': case 'U': dbv.type = DBVT_UTF8; dbv.pszVal = value; break; } break; case 'n': case 'N': { PBYTE dest; dbv.type = DBVT_BLOB; dbv.cpbVal = (WORD)mir_strlen(value) / 3; dbv.pbVal = (PBYTE)value; for ( dest = dbv.pbVal, value = strtok(value, " "); value && *value; value = strtok(NULL, " ")) *(dest++) = (BYTE)strtol(value, NULL, 16); *dest = 0; break; } default: dbv.type = DBVT_DELETED; //return 1; } return db_set(hContact, pszModule, pszLine, &dbv); }