char* CIcqProto::getSettingStringUtf(HANDLE hContact, const char *szModule, const char *szSetting, char *szDef) { DBVARIANT dbv = {DBVT_DELETED}; if (DBGetContactSettingUTF8String(hContact, szModule, szSetting, &dbv)) { ICQFreeVariant(&dbv); // for a setting with invalid contents/type return null_strdup(szDef); } char *szRes = null_strdup(dbv.pszVal); ICQFreeVariant(&dbv); return szRes; }
int CIcqProto::getContactUid(HANDLE hContact, DWORD *pdwUin, uid_str *ppszUid) { DBVARIANT dbv = {DBVT_DELETED}; int iRes = 1; *pdwUin = 0; if (ppszUid) *ppszUid[0] = '\0'; if (!getSetting(hContact, UNIQUEIDSETTING, &dbv)) { if (dbv.type == DBVT_DWORD) { *pdwUin = dbv.dVal; iRes = 0; } else if (dbv.type == DBVT_ASCIIZ) { if (ppszUid && m_bAimEnabled) { strcpy(*ppszUid, dbv.pszVal); iRes = 0; } else NetLog_Server("AOL screennames not accepted"); } ICQFreeVariant(&dbv); } return iRes; }
int CIcqProto::getSettingStringW(HANDLE hContact, const char *szSetting, DBVARIANT *dbv) { int res = DBGetContactSettingWString(hContact, m_szModuleName, szSetting, dbv); if (res) ICQFreeVariant(dbv); return res; }
void CIcqProto::setStatusMsgVar(HANDLE hContact, char* szStatusMsg, bool isAnsi) { if (szStatusMsg && szStatusMsg[0]) { if (isAnsi) { char* szStatusNote = getSettingStringUtf(hContact, DBSETTING_STATUS_NOTE, ""); wchar_t* szStatusNoteW = make_unicode_string(szStatusNote); int len = (int)wcslen(szStatusNoteW) * 3 + 1; char* szStatusNoteAnsi = (char*)alloca(len); WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, szStatusNoteW, -1, szStatusNoteAnsi, len, NULL, NULL); bool notmatch = false; for (int i=0; ;++i) { if (szStatusNoteAnsi[i] != szStatusMsg[i] && szStatusNoteAnsi[i] != '?' && szStatusMsg[i] != '?') { notmatch = true; break; } if (!szStatusNoteAnsi[i] || !szStatusMsg[i]) break; } szStatusMsg = notmatch ? ansi_to_utf8(szStatusMsg) : szStatusNote; SAFE_FREE(&szStatusNoteW); if (notmatch) SAFE_FREE(&szStatusNote); } char* oldStatusMsg = NULL; DBVARIANT dbv; if (!DBGetContactSetting(hContact, "CList", "StatusMsg", &dbv)) { switch (dbv.type) { case DBVT_UTF8: oldStatusMsg = null_strdup(dbv.pszVal); break; case DBVT_WCHAR: oldStatusMsg = make_utf8_string(dbv.pwszVal); break; } ICQFreeVariant(&dbv); } if (!oldStatusMsg || strcmp(oldStatusMsg, szStatusMsg)) setSettingStringUtf(hContact, "CList", "StatusMsg", szStatusMsg); SAFE_FREE(&oldStatusMsg); if (isAnsi) SAFE_FREE(&szStatusMsg); } else DBDeleteContactSetting(hContact, "CList", "StatusMsg"); }
double CIcqProto::getSettingDouble(HANDLE hContact, const char *szSetting, double dDef) { DBVARIANT dbv = {DBVT_DELETED}; double dRes; if (getSetting(hContact, szSetting, &dbv)) return dDef; // not found, give default if (dbv.type != DBVT_BLOB || dbv.cpbVal != sizeof(double)) dRes = dDef; else dRes = *(double*)dbv.pbVal; ICQFreeVariant(&dbv); return dRes; }
DWORD CIcqProto::getSettingDword(HANDLE hContact, const char *szSetting, DWORD dwDef) { DBVARIANT dbv = {DBVT_DELETED}; DWORD dwRes; if (getSetting(hContact, szSetting, &dbv)) return dwDef; // not found, give default if (dbv.type != DBVT_DWORD) dwRes = dwDef; // invalid type, give default else // found and valid, give result dwRes = dbv.dVal; ICQFreeVariant(&dbv); return dwRes; }
static void file_sendNick(CIcqProto* ppro, directconnect* dc) { icq_packet packet; char* szNick; WORD wNickLen; DBVARIANT dbv = {DBVT_DELETED}; if (ppro->getSettingString(NULL, "Nick", &dbv)) szNick = ""; else szNick = dbv.pszVal; wNickLen = strlennull(szNick); directPacketInit(&packet, (WORD)(8 + wNickLen)); packByte(&packet, PEER_FILE_INIT_ACK); /* Ident */ packLEDWord(&packet, dc->ft->dwTransferSpeed); packLEWord(&packet, (WORD)(wNickLen + 1)); packBuffer(&packet, (LPBYTE)szNick, (WORD)(wNickLen + 1)); ppro->sendDirectPacket(dc, &packet); ICQFreeVariant(&dbv); }