/**
 * 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;
}
Exemple #3
0
/**
 * 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;
}
Exemple #4
0
/**
 * 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);
}