From 4530fb627722a4c2018184dcdaea7fa9f44c10d7 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 29 Jun 2014 12:24:18 +0000 Subject: - fixes #646 (Database Encryption mode, ICQ and email contacts); - code cleaning; git-svn-id: http://svn.miranda-ng.org/main/trunk@9614 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/IcqOscarJ/src/capabilities.cpp | 96 ++++++---------- protocols/IcqOscarJ/src/cookies.cpp | 87 +++++---------- protocols/IcqOscarJ/src/fam_03buddy.cpp | 182 +++++++++++++------------------ protocols/IcqOscarJ/src/icq_db.cpp | 31 ++++-- protocols/IcqOscarJ/src/icq_server.cpp | 48 +++----- 5 files changed, 175 insertions(+), 269 deletions(-) (limited to 'protocols') diff --git a/protocols/IcqOscarJ/src/capabilities.cpp b/protocols/IcqOscarJ/src/capabilities.cpp index 8a61dc9f44..00b6250a9a 100644 --- a/protocols/IcqOscarJ/src/capabilities.cpp +++ b/protocols/IcqOscarJ/src/capabilities.cpp @@ -34,7 +34,6 @@ // ----------------------------------------------------------------------------- #include "icqoscar.h" - struct icq_capability { DWORD capID; // A bitmask, we use it in order to save database space @@ -43,14 +42,14 @@ struct icq_capability static const icq_capability CapabilityRecord[] = { - {CAPF_SRV_RELAY, {CAP_SRV_RELAY }}, - {CAPF_UTF, {CAP_UTF }}, - {CAPF_RTF, {CAP_RTF }}, - {CAPF_CONTACTS, {CAP_CONTACTS }}, - {CAPF_TYPING, {CAP_TYPING }}, - {CAPF_ICQDIRECT, {CAP_ICQDIRECT }}, - {CAPF_XTRAZ, {CAP_XTRAZ }}, - {CAPF_OSCAR_FILE,{CAP_OSCAR_FILE}} + { CAPF_SRV_RELAY, { CAP_SRV_RELAY }}, + { CAPF_UTF, { CAP_UTF }}, + { CAPF_RTF, { CAP_RTF }}, + { CAPF_CONTACTS, { CAP_CONTACTS }}, + { CAPF_TYPING, { CAP_TYPING }}, + { CAPF_ICQDIRECT, { CAP_ICQDIRECT }}, + { CAPF_XTRAZ, { CAP_XTRAZ }}, + { CAPF_OSCAR_FILE, { CAP_OSCAR_FILE }} }; // Mask of all handled capabilities' flags @@ -66,17 +65,17 @@ struct icq_capability_name static const icq_capability_name CapabilityNames[] = { - {CAPF_SRV_RELAY, "ServerRelay"}, - {CAPF_UTF, "UTF8 Messages"}, - {CAPF_RTF, "RTF Messages"}, - {CAPF_CONTACTS, "Contact Transfer"}, - {CAPF_TYPING, "Typing Notifications"}, - {CAPF_ICQDIRECT, "Direct Connections"}, - {CAPF_XTRAZ, "Xtraz"}, - {CAPF_OSCAR_FILE, "File Transfers"}, - {CAPF_STATUS_MESSAGES,"Individual Status Messages"}, - {CAPF_STATUS_MOOD, "Mood"}, - {CAPF_XSTATUS, "Custom Status"} + { CAPF_SRV_RELAY, "ServerRelay"}, + { CAPF_UTF, "UTF8 Messages"}, + { CAPF_RTF, "RTF Messages"}, + { CAPF_CONTACTS, "Contact Transfer"}, + { CAPF_TYPING, "Typing Notifications"}, + { CAPF_ICQDIRECT, "Direct Connections"}, + { CAPF_XTRAZ, "Xtraz"}, + { CAPF_OSCAR_FILE, "File Transfers"}, + { CAPF_STATUS_MESSAGES,"Individual Status Messages"}, + { CAPF_STATUS_MOOD, "Mood"}, + { CAPF_XSTATUS, "Custom Status"} }; void NetLog_CapabilityChange(CIcqProto *ppro, const char *szChange, DWORD fdwCapabilities) @@ -85,11 +84,9 @@ void NetLog_CapabilityChange(CIcqProto *ppro, const char *szChange, DWORD fdwCap if (!fdwCapabilities) return; - for (int nIndex = 0; nIndex < SIZEOF(CapabilityNames); nIndex++) - { + for (int nIndex = 0; nIndex < SIZEOF(CapabilityNames); nIndex++) { // Check if the current capability is present - if ((fdwCapabilities & CapabilityNames[nIndex].capID) == CapabilityNames[nIndex].capID) - { + if ((fdwCapabilities & CapabilityNames[nIndex].capID) == CapabilityNames[nIndex].capID) { if (strlennull(szBuffer)) strcat(szBuffer, ", "); strcat(szBuffer, CapabilityNames[nIndex].capName); @@ -100,22 +97,18 @@ void NetLog_CapabilityChange(CIcqProto *ppro, const char *szChange, DWORD fdwCap } #endif - // Deletes all oscar capabilities for a given contact void CIcqProto::ClearAllContactCapabilities(MCONTACT hContact) { setDword(hContact, DBSETTING_CAPABILITIES, 0); } - // Deletes one or many oscar capabilities for a given contact void CIcqProto::ClearContactCapabilities(MCONTACT hContact, DWORD fdwCapabilities) { // Get current capability flags - DWORD fdwContactCaps = getDword(hContact, DBSETTING_CAPABILITIES, 0); - - if (fdwContactCaps != (fdwContactCaps & ~fdwCapabilities)) - { + DWORD fdwContactCaps = getDword(hContact, DBSETTING_CAPABILITIES, 0); + if (fdwContactCaps != (fdwContactCaps & ~fdwCapabilities)) { #ifdef _DEBUG NetLog_CapabilityChange(this, "Removed", fdwCapabilities & fdwContactCaps); #endif @@ -127,15 +120,12 @@ void CIcqProto::ClearContactCapabilities(MCONTACT hContact, DWORD fdwCapabilitie } } - // Sets one or many oscar capabilities for a given contact void CIcqProto::SetContactCapabilities(MCONTACT hContact, DWORD fdwCapabilities) { // Get current capability flags - DWORD fdwContactCaps = getDword(hContact, DBSETTING_CAPABILITIES, 0); - - if (fdwContactCaps != (fdwContactCaps | fdwCapabilities)) - { + DWORD fdwContactCaps = getDword(hContact, DBSETTING_CAPABILITIES, 0); + if (fdwContactCaps != (fdwContactCaps | fdwCapabilities)) { #ifdef _DEBUG NetLog_CapabilityChange(this, "Added", fdwCapabilities & ~fdwContactCaps); #endif @@ -147,7 +137,6 @@ void CIcqProto::SetContactCapabilities(MCONTACT hContact, DWORD fdwCapabilities) } } - // Returns true if the given contact supports the requested capabilites BOOL CIcqProto::CheckContactCapabilities(MCONTACT hContact, DWORD fdwCapabilities) { @@ -165,17 +154,12 @@ BOOL CIcqProto::CheckContactCapabilities(MCONTACT hContact, DWORD fdwCapabilitie // Scan capability against the capability buffer capstr* MatchCapability(BYTE *buf, int bufsize, const capstr *cap, int capsize) { - while (bufsize >= BINARY_CAP_SIZE) // search the buffer for a capability - { + while (bufsize >= BINARY_CAP_SIZE) { // search the buffer for a capability if (!memcmp(buf, cap, capsize)) - { return (capstr*)buf; // give found capability for version info - } - else - { - buf += BINARY_CAP_SIZE; - bufsize -= BINARY_CAP_SIZE; - } + + buf += BINARY_CAP_SIZE; + bufsize -= BINARY_CAP_SIZE; } return 0; } @@ -185,7 +169,6 @@ capstr* MatchCapability(BYTE *buf, int bufsize, const capstr *cap, int capsize) capstr* MatchShortCapability(BYTE *buf, int bufsize, const shortcapstr *cap) { capstr fullCap; - memcpy(fullCap, capShortCaps, BINARY_CAP_SIZE); fullCap[2] = (*cap)[0]; fullCap[3] = (*cap)[1]; @@ -193,7 +176,6 @@ capstr* MatchShortCapability(BYTE *buf, int bufsize, const shortcapstr *cap) return MatchCapability(buf, bufsize, &fullCap, BINARY_CAP_SIZE); } - // Scans a binary buffer for OSCAR capabilities. DWORD GetCapabilitiesFromBuffer(BYTE *pBuffer, int nLength) { @@ -204,18 +186,15 @@ DWORD GetCapabilitiesFromBuffer(BYTE *pBuffer, int nLength) // Loop over all capabilities in the buffer and // compare them to our own record of capabilities - for (int nIndex = 0; nIndex < nRecordSize; nIndex++) - { + for (int nIndex = 0; nIndex < nRecordSize; nIndex++) { + // Match, add capability flag if (MatchCapability(pBuffer, nLength, &CapabilityRecord[nIndex].capCLSID, BINARY_CAP_SIZE)) - { // Match, add capability flag fdwCaps |= CapabilityRecord[nIndex].capID; - } } return fdwCaps; } - // Scans a binary buffer for oscar capabilities and adds them to the contact. // You probably want to call ClearAllContactCapabilities() first. void CIcqProto::AddCapabilitiesFromBuffer(MCONTACT hContact, BYTE *pBuffer, int nLength) @@ -225,8 +204,7 @@ void CIcqProto::AddCapabilitiesFromBuffer(MCONTACT hContact, BYTE *pBuffer, int // Get capability flags from buffer DWORD fdwCapabilities = GetCapabilitiesFromBuffer(pBuffer, nLength); - if (fdwContactCaps != (fdwContactCaps | fdwCapabilities)) - { + if (fdwContactCaps != (fdwContactCaps | fdwCapabilities)) { #ifdef _DEBUG NetLog_CapabilityChange(this, "Added", fdwCapabilities & ~fdwContactCaps); #endif @@ -238,7 +216,6 @@ void CIcqProto::AddCapabilitiesFromBuffer(MCONTACT hContact, BYTE *pBuffer, int } } - // Scans a binary buffer for oscar capabilities and adds them to the contact. // You probably want to call ClearAllContactCapabilities() first. void CIcqProto::SetCapabilitiesFromBuffer(MCONTACT hContact, BYTE *pBuffer, int nLength, BOOL bReset) @@ -251,15 +228,14 @@ void CIcqProto::SetCapabilitiesFromBuffer(MCONTACT hContact, BYTE *pBuffer, int #ifdef _DEBUG if (bReset) NetLog_CapabilityChange(this, "Set", fdwCapabilities); - else - { + else { NetLog_CapabilityChange(this, "Removed", fdwContactCaps & ~fdwCapabilities & CapabilityFlagsMask); - NetLog_CapabilityChange(this, "Added", fdwCapabilities & ~fdwContactCaps); + NetLog_CapabilityChange(this, "Added", fdwCapabilities & ~fdwContactCaps); } #endif - if (fdwCapabilities != (fdwContactCaps & ~CapabilityFlagsMask)) - { // Get current unmanaged capability flags + if (fdwCapabilities != (fdwContactCaps & ~CapabilityFlagsMask)) { + // Get current unmanaged capability flags fdwContactCaps &= ~CapabilityFlagsMask; // Add capability flags from buffer diff --git a/protocols/IcqOscarJ/src/cookies.cpp b/protocols/IcqOscarJ/src/cookies.cpp index 7ede14d96f..750b6280c5 100644 --- a/protocols/IcqOscarJ/src/cookies.cpp +++ b/protocols/IcqOscarJ/src/cookies.cpp @@ -27,8 +27,8 @@ // Handles packet & message cookies // // ----------------------------------------------------------------------------- -#include "icqoscar.h" +#include "icqoscar.h" #define INVALID_COOKIE_INDEX -1 @@ -36,19 +36,15 @@ void CIcqProto::RemoveExpiredCookies() { time_t tNow = time(NULL); - for (int i = cookies.getCount()-1; i >= 0; i--) - { + for (int i = cookies.getCount() - 1; i >= 0; i--) { icq_cookie_info *cookie = cookies[i]; - - if ((cookie->dwTime + COOKIE_TIMEOUT) < tNow) - { + if ((cookie->dwTime + COOKIE_TIMEOUT) < tNow) { cookies.remove(i); SAFE_FREE((void**)&cookie); } } } - // Generate and allocate cookie DWORD CIcqProto::AllocateCookie(BYTE bType, WORD wIdent, MCONTACT hContact, void *pvExtra) { @@ -56,11 +52,10 @@ DWORD CIcqProto::AllocateCookie(BYTE bType, WORD wIdent, MCONTACT hContact, void DWORD dwThisSeq = wCookieSeq++; dwThisSeq &= 0x7FFF; - dwThisSeq |= wIdent<<0x10; + dwThisSeq |= wIdent << 0x10; icq_cookie_info* p = (icq_cookie_info*)SAFE_MALLOC(sizeof(icq_cookie_info)); - if (p) - { + if (p) { p->bType = bType; p->dwCookie = dwThisSeq; p->hContact = hContact; @@ -71,31 +66,27 @@ DWORD CIcqProto::AllocateCookie(BYTE bType, WORD wIdent, MCONTACT hContact, void return dwThisSeq; } - DWORD CIcqProto::GenerateCookie(WORD wIdent) { icq_lock l(cookieMutex); DWORD dwThisSeq = wCookieSeq++; dwThisSeq &= 0x7FFF; - dwThisSeq |= wIdent<<0x10; - + dwThisSeq |= wIdent << 0x10; return dwThisSeq; } - int CIcqProto::GetCookieType(DWORD dwCookie) { icq_lock l(cookieMutex); - int i = cookies.getIndex(( icq_cookie_info* )&dwCookie ); - if ( i != INVALID_COOKIE_INDEX ) + int i = cookies.getIndex((icq_cookie_info*)&dwCookie); + if (i != INVALID_COOKIE_INDEX) i = cookies[i]->bType; return i; } - int CIcqProto::FindCookie(DWORD dwCookie, MCONTACT *phContact, void **ppvExtra) { icq_lock l(cookieMutex); @@ -114,15 +105,12 @@ int CIcqProto::FindCookie(DWORD dwCookie, MCONTACT *phContact, void **ppvExtra) return 0; } - int CIcqProto::FindCookieByData(void *pvExtra, DWORD *pdwCookie, MCONTACT *phContact) { icq_lock l(cookieMutex); - for (int i = 0; i < cookies.getCount(); i++) - { - if (pvExtra == cookies[i]->pvExtra) - { + for (int i = 0; i < cookies.getCount(); i++) { + if (pvExtra == cookies[i]->pvExtra) { if (phContact) *phContact = cookies[i]->hContact; if (pdwCookie) @@ -136,15 +124,12 @@ int CIcqProto::FindCookieByData(void *pvExtra, DWORD *pdwCookie, MCONTACT *phCon return 0; } - int CIcqProto::FindCookieByType(BYTE bType, DWORD *pdwCookie, MCONTACT *phContact, void** ppvExtra) { icq_lock l(cookieMutex); - for (int i = 0; i < cookies.getCount(); i++) - { - if (bType == cookies[i]->bType) - { + for (int i = 0; i < cookies.getCount(); i++) { + if (bType == cookies[i]->bType) { if (pdwCookie) *pdwCookie = cookies[i]->dwCookie; if (phContact) @@ -160,19 +145,16 @@ int CIcqProto::FindCookieByType(BYTE bType, DWORD *pdwCookie, MCONTACT *phContac return 0; } - int CIcqProto::FindMessageCookie(DWORD dwMsgID1, DWORD dwMsgID2, DWORD *pdwCookie, MCONTACT *phContact, cookie_message_data **ppvExtra) { icq_lock l(cookieMutex); - for (int i = 0; i < cookies.getCount(); i++) - { - if (cookies[i]->bType == CKT_MESSAGE || cookies[i]->bType == CKT_FILE || cookies[i]->bType == CKT_REVERSEDIRECT) - { // message cookie found + for (int i = 0; i < cookies.getCount(); i++) { + if (cookies[i]->bType == CKT_MESSAGE || cookies[i]->bType == CKT_FILE || cookies[i]->bType == CKT_REVERSEDIRECT) { + // message cookie found cookie_message_data *pCookie = (cookie_message_data*)cookies[i]->pvExtra; - if (pCookie->dwMsgID1 == dwMsgID1 && pCookie->dwMsgID2 == dwMsgID2) - { + if (pCookie->dwMsgID1 == dwMsgID1 && pCookie->dwMsgID2 == dwMsgID2) { if (phContact) *phContact = cookies[i]->hContact; if (pdwCookie) @@ -189,14 +171,13 @@ int CIcqProto::FindMessageCookie(DWORD dwMsgID1, DWORD dwMsgID2, DWORD *pdwCooki return 0; } - void CIcqProto::FreeCookie(DWORD dwCookie) { icq_lock l(cookieMutex); int i = cookies.getIndex((icq_cookie_info*)&dwCookie); - if (i != INVALID_COOKIE_INDEX) - { // Cookie found, remove from list + if (i != INVALID_COOKIE_INDEX) { + // Cookie found, remove from list icq_cookie_info *cookie = cookies[i]; cookies.remove(i); @@ -206,17 +187,14 @@ void CIcqProto::FreeCookie(DWORD dwCookie) RemoveExpiredCookies(); } - void CIcqProto::FreeCookieByData(BYTE bType, void *pvExtra) { icq_lock l(cookieMutex); - for (int i = 0; i < cookies.getCount(); i++) - { + for (int i = 0; i < cookies.getCount(); i++) { icq_cookie_info *cookie = cookies[i]; - - if (bType == cookie->bType && pvExtra == cookie->pvExtra) - { // Cookie found, remove from list + if (bType == cookie->bType && pvExtra == cookie->pvExtra) { + // Cookie found, remove from list cookies.remove(i); SAFE_FREE((void**)&cookie); break; @@ -226,14 +204,13 @@ void CIcqProto::FreeCookieByData(BYTE bType, void *pvExtra) RemoveExpiredCookies(); } - void CIcqProto::ReleaseCookie(DWORD dwCookie) { icq_lock l(cookieMutex); int i = cookies.getIndex(( icq_cookie_info* )&dwCookie ); - if (i != INVALID_COOKIE_INDEX) - { // Cookie found, remove from list + if (i != INVALID_COOKIE_INDEX) { + // Cookie found, remove from list icq_cookie_info *cookie = cookies[i]; cookies.remove(i); @@ -243,31 +220,28 @@ void CIcqProto::ReleaseCookie(DWORD dwCookie) RemoveExpiredCookies(); } - void CIcqProto::InitMessageCookie(cookie_message_data *pCookie) { DWORD dwMsgID1; DWORD dwMsgID2; - do - { // ensure that message ids are unique + do { + // ensure that message ids are unique dwMsgID1 = time(NULL); dwMsgID2 = RandRange(0, 0x0FFFF); - } while (FindMessageCookie(dwMsgID1, dwMsgID2, NULL, NULL, NULL)); + } + while (FindMessageCookie(dwMsgID1, dwMsgID2, NULL, NULL, NULL)); - if (pCookie) - { + if (pCookie) { pCookie->dwMsgID1 = dwMsgID1; pCookie->dwMsgID2 = dwMsgID2; } } - cookie_message_data* CIcqProto::CreateMessageCookie(WORD bMsgType, BYTE bAckType) { cookie_message_data *pCookie = (cookie_message_data*)SAFE_MALLOC(sizeof(cookie_message_data)); - if (pCookie) - { + if (pCookie) { pCookie->bMessageType = bMsgType; pCookie->nAckType = bAckType; @@ -276,7 +250,6 @@ cookie_message_data* CIcqProto::CreateMessageCookie(WORD bMsgType, BYTE bAckType return pCookie; } - cookie_message_data* CIcqProto::CreateMessageCookieData(BYTE bMsgType, MCONTACT hContact, DWORD dwUin, int bUseSrvRelay) { BYTE bAckType; @@ -292,7 +265,7 @@ cookie_message_data* CIcqProto::CreateMessageCookieData(BYTE bMsgType, MCONTACT cookie_message_data* pCookieData = CreateMessageCookie(bMsgType, bAckType); // set flag for offline messages - to allow proper error handling - if (wStatus == ID_STATUS_OFFLINE || wStatus == ID_STATUS_INVISIBLE) + if (wStatus == ID_STATUS_OFFLINE || wStatus == ID_STATUS_INVISIBLE) pCookieData->isOffline = TRUE; return pCookieData; diff --git a/protocols/IcqOscarJ/src/fam_03buddy.cpp b/protocols/IcqOscarJ/src/fam_03buddy.cpp index bf1a5ff66e..06783be2df 100644 --- a/protocols/IcqOscarJ/src/fam_03buddy.cpp +++ b/protocols/IcqOscarJ/src/fam_03buddy.cpp @@ -34,8 +34,7 @@ extern const char* cliSpamBot; void CIcqProto::handleBuddyFam(BYTE *pBuffer, WORD wBufferLength, snac_header *pSnacHeader, serverthread_info *info) { - switch (pSnacHeader->wSubtype) - { + switch (pSnacHeader->wSubtype) { case ICQ_USER_ONLINE: handleUserOnline(pBuffer, wBufferLength, info); break; @@ -58,12 +57,12 @@ void CIcqProto::handleBuddyFam(BYTE *pBuffer, WORD wBufferLength, snac_header *p if (wBufferLength >= 2) unpackWord(&pBuffer, &wError); - else + else wError = 0; LogFamilyError(ICQ_BUDDY_FAMILY, wError); - break; } + break; default: debugLogA("Warning: Ignoring SNAC(x%02x,x%02x) - Unknown SNAC (Flags: %u, Ref: %u)", ICQ_BUDDY_FAMILY, pSnacHeader->wSubtype, pSnacHeader->wFlags, pSnacHeader->dwRef); @@ -75,9 +74,7 @@ void CIcqProto::handleBuddyFam(BYTE *pBuffer, WORD wBufferLength, snac_header *p void CIcqProto::handleReplyBuddy(BYTE *buf, WORD wPackLen) { oscar_tlv_chain *pChain = readIntoTLVChain(&buf, wPackLen, 0); - - if (pChain) - { + if (pChain) { DWORD wMaxUins = pChain->getWord(1, 1); DWORD wMaxWatchers = pChain->getWord(2, 1); DWORD wMaxTemporary = pChain->getWord(4, 1); @@ -88,30 +85,25 @@ void CIcqProto::handleReplyBuddy(BYTE *buf, WORD wPackLen) disposeChain(&pChain); } - else - { - debugLogA("Error: Malformed BuddyReply"); - } + else debugLogA("Error: Malformed BuddyReply"); } int unpackSessionDataItem(oscar_tlv_chain *pChain, WORD wItemType, BYTE **ppItemData, WORD *pwItemSize, BYTE *pbItemFlags) { - oscar_tlv *tlv = pChain->getTLV(0x1D, 1); int len = 0; BYTE *data; - if (tlv) - { + oscar_tlv *tlv = pChain->getTLV(0x1D, 1); + if (tlv) { len = tlv->wLen; data = tlv->pData; } - while (len >= 4) - { // parse session data items one by one + while (len >= 4) { + // parse session data items one by one WORD itemType; - BYTE itemFlags; - BYTE itemLen; + BYTE itemFlags, itemLen; unpackWord(&data, &itemType); unpackByte(&data, &itemFlags); @@ -122,8 +114,8 @@ int unpackSessionDataItem(oscar_tlv_chain *pChain, WORD wItemType, BYTE **ppItem if (itemLen > len) itemLen = len; - if (itemType == wItemType) - { // found the requested item + if (itemType == wItemType) { + // found the requested item if (ppItemData) *ppItemData = data; if (pwItemSize) @@ -181,7 +173,8 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) char szStrBuf[MAX_PATH]; // Unpack the sender's user ID - if (!unpackUID(&buf, &wLen, &dwUIN, &szUID)) return; + if (!unpackUID(&buf, &wLen, &dwUIN, &szUID)) + return; // Syntax check if (wLen < 4) @@ -197,8 +190,7 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) // Ignore status notification if the user is not already on our list MCONTACT hContact = HContactFromUID(dwUIN, szUID, NULL); - if (hContact == INVALID_CONTACT_ID) - { + if (hContact == INVALID_CONTACT_ID) { #ifdef _DEBUG debugLogA("Ignoring user online (%s)", strUID(dwUIN, szUID)); #endif @@ -221,12 +213,10 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) WORD wClass = pChain->getWord(0x01, 1); int nIsICQ = wClass & CLASS_ICQ; - if (dwUIN) - { + if (dwUIN) { // Get DC info TLV pTLV = pChain->getTLV(0x0C, 1); - if (pTLV && (pTLV->wLen >= 15)) - { + if (pTLV && (pTLV->wLen >= 15)) { BYTE *pBuffer = pTLV->pData; nIsICQ = TRUE; @@ -240,29 +230,21 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) pBuffer += 4; // Client features // Get faked time signatures, used to identify clients - if (pTLV->wLen >= 0x23) - { + if (pTLV->wLen >= 0x23) { unpackDWord(&pBuffer, &dwFT1); unpackDWord(&pBuffer, &dwFT2); unpackDWord(&pBuffer, &dwFT3); } } - else - { - // This client doesnt want DCs - } // Get Status info TLV pTLV = pChain->getTLV(0x06, 1); - if (pTLV && (pTLV->wLen >= 4)) - { + if (pTLV && (pTLV->wLen >= 4)) { BYTE *pBuffer = pTLV->pData; - unpackWord(&pBuffer, &wStatusFlags); unpackWord(&pBuffer, &wStatus); } - else if (!nIsICQ) - { + else if (!nIsICQ) { // Connected thru AIM client, guess by user class if (wClass & CLASS_AWAY) wStatus = ID_STATUS_AWAY; @@ -273,15 +255,13 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) wStatusFlags = 0; } - else - { + else { // Huh? No status TLV? Lets guess then... wStatusFlags = 0; wStatus = ICQ_STATUS_ONLINE; } } - else - { + else { nIsICQ = FALSE; if (wClass & CLASS_AWAY) @@ -314,11 +294,10 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) // Get Idle timer TLV WORD wIdleTimer = pChain->getWord(0x04, 1); time_t tIdleTS = 0; - if (wIdleTimer) - { + if (wIdleTimer) { time(&tIdleTS); tIdleTS -= (wIdleTimer*60); - }; + } #ifdef _DEBUG if (wIdleTimer) @@ -329,8 +308,7 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) #endif // Check client capabilities - if (hContact != NULL) - { + if (hContact != NULL) { wOldStatus = getContactStatus(hContact); // Collect all Capability info from TLV chain @@ -349,21 +327,20 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) capBuf = (BYTE*)_alloca(capLen + BINARY_CAP_SIZE); - if (capLen) - { + if (capLen) { BYTE *pCapability = capBuf; capLen = 0; // we need to recount that - if (pFullTLV && (pFullTLV->wLen >= BINARY_CAP_SIZE)) - { // copy classic Capabilities + if (pFullTLV && (pFullTLV->wLen >= BINARY_CAP_SIZE)) { + // copy classic Capabilities BYTE *cData = pFullTLV->pData; int cLen = pFullTLV->wLen; - while (cLen) - { // be impervious to duplicates (AOL sends them sometimes) - if (!capLen || !MatchCapability(capBuf, capLen, (capstr*)cData, BINARY_CAP_SIZE)) - { // not present, add + while (cLen) { + // be impervious to duplicates (AOL sends them sometimes) + if (!capLen || !MatchCapability(capBuf, capLen, (capstr*)cData, BINARY_CAP_SIZE)) { + // not present, add memcpy(pCapability, cData, BINARY_CAP_SIZE); capLen += BINARY_CAP_SIZE; pCapability += BINARY_CAP_SIZE; @@ -373,20 +350,20 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) } } - if (pShortTLV && (pShortTLV->wLen >= 2)) - { // copy short Capabilities + if (pShortTLV && (pShortTLV->wLen >= 2)) { + // copy short Capabilities capstr tmp; BYTE *cData = pShortTLV->pData; int cLen = pShortTLV->wLen; memcpy(tmp, capShortCaps, BINARY_CAP_SIZE); - while (cLen) - { // be impervious to duplicates (AOL sends them sometimes) + while (cLen) { + // be impervious to duplicates (AOL sends them sometimes) tmp[2] = cData[0]; tmp[3] = cData[1]; - if (!capLen || !MatchCapability(capBuf, capLen, &tmp, BINARY_CAP_SIZE)) - { // not present, add + if (!capLen || !MatchCapability(capBuf, capLen, &tmp, BINARY_CAP_SIZE)) { + // not present, add memcpy(pCapability, tmp, BINARY_CAP_SIZE); capLen += BINARY_CAP_SIZE; pCapability += BINARY_CAP_SIZE; @@ -480,25 +457,25 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) // Save contacts details in database if (hContact != NULL) { - setDword(hContact, "LogonTS", dwOnlineSince); - setDword(hContact, "AwayTS", dwAwaySince); - setDword(hContact, "IdleTS", tIdleTS); + setDword(hContact, "LogonTS", dwOnlineSince); + setDword(hContact, "AwayTS", dwAwaySince); + setDword(hContact, "IdleTS", tIdleTS); if (dwMemberSince) - setDword(hContact, "MemberTS", dwMemberSince); + setDword(hContact, "MemberTS", dwMemberSince); if (nIsICQ) { // on AIM these are not used setDword(hContact, "DirectCookie", dwDirectConnCookie); - setByte(hContact, "DCType", (BYTE)nTCPFlag); - setWord(hContact, "UserPort", (WORD)(dwPort & 0xffff)); - setWord(hContact, "Version", wVersion); + setByte(hContact, "DCType", (BYTE)nTCPFlag); + setWord(hContact, "UserPort", (WORD)(dwPort & 0xffff)); + setWord(hContact, "Version", wVersion); } else { - delSetting(hContact, "DirectCookie"); - delSetting(hContact, "DCType"); - delSetting(hContact, "UserPort"); - delSetting(hContact, "Version"); + delSetting(hContact, "DirectCookie"); + delSetting(hContact, "DCType"); + delSetting(hContact, "UserPort"); + delSetting(hContact, "Version"); } // if no detection, set uknown @@ -507,19 +484,19 @@ void CIcqProto::handleUserOnline(BYTE *buf, WORD wLen, serverthread_info *info) if (szClient != (char*)-1) { db_set_utf(hContact, m_szModuleName, "MirVer", szClient); - setByte(hContact, "ClientID", bClientId); + setByte(hContact, "ClientID", bClientId); } if (wOldStatus == ID_STATUS_OFFLINE) { - setDword(hContact, "IP", dwIP); - setDword(hContact, "RealIP", dwRealIP); + setDword(hContact, "IP", dwIP); + setDword(hContact, "RealIP", dwRealIP); } else { // if not first notification only write significant information if (dwIP) - setDword(hContact, "IP", dwIP); + setDword(hContact, "IP", dwIP); if (dwRealIP) - setDword(hContact, "RealIP", dwRealIP); + setDword(hContact, "RealIP", dwRealIP); } setWord(hContact, "Status", (WORD)IcqStatusToMiranda(wStatus)); @@ -584,8 +561,7 @@ void CIcqProto::handleUserOffline(BYTE *buf, WORD wLen) wLen -= 4; // Skip the TLV chain - while (wTLVCount && wLen >= 4) - { + while (wTLVCount && wLen >= 4) { WORD wTLVType; WORD wTLVLen; @@ -594,20 +570,19 @@ void CIcqProto::handleUserOffline(BYTE *buf, WORD wLen) wLen -= 4; // stop parsing overflowed packet - if (wTLVLen > wLen) - { + if (wTLVLen > wLen) { disposeChain(&pChain); return; } - if (wTLVType == 0x1D) - { // read only TLV with Session data into chain + if (wTLVType == 0x1D) { + // read only TLV with Session data into chain BYTE *pTLV = buf - 4; disposeChain(&pChain); pChain = readIntoTLVChain(&pTLV, wLen + 4, 1); } - else if (wTLVType == 0x29 && wTLVLen == sizeof(DWORD)) - { // get Away Since value + else if (wTLVType == 0x29 && wTLVLen == sizeof(DWORD)) { + // get Away Since value BYTE *pData = buf; unpackDWord(&pData, &dwAwaySince); } @@ -621,8 +596,7 @@ void CIcqProto::handleUserOffline(BYTE *buf, WORD wLen) MCONTACT hContact = HContactFromUID(dwUIN, szUID, NULL); // Skip contacts that are not already on our list or are already offline - if (hContact != INVALID_CONTACT_ID) - { + if (hContact != INVALID_CONTACT_ID) { WORD wOldStatus = getContactStatus(hContact); // Process Avatar Hash @@ -643,8 +617,7 @@ void CIcqProto::handleUserOffline(BYTE *buf, WORD wLen) char tmp = NULL; handleXStatusCaps(dwUIN, szUID, hContact, (BYTE*)&tmp, 0, &tmp, 0); - if (wOldStatus != ID_STATUS_OFFLINE) - { + if (wOldStatus != ID_STATUS_OFFLINE) { debugLogA("%s went offline.", strUID(dwUIN, szUID)); setWord(hContact, "Status", ID_STATUS_OFFLINE); @@ -677,12 +650,10 @@ void CIcqProto::parseStatusNote(DWORD dwUin, char *szUid, MCONTACT hContact, osc unpackDWord(&pStatusNoteTS, &dwStatusNoteTS); // Get Status Note session item - if (unpackSessionDataItem(pChain, 0x02, &pStatusNote, &wStatusNoteLen, &bStatusNoteFlags)) - { + if (unpackSessionDataItem(pChain, 0x02, &pStatusNote, &wStatusNoteLen, &bStatusNoteFlags)) { char *szStatusNote = NULL; - if ((bStatusNoteFlags & 4) == 4 && wStatusNoteLen >= 4) - { + if ((bStatusNoteFlags & 4) == 4 && wStatusNoteLen >= 4) { BYTE *buf = pStatusNote; WORD buflen = wStatusNoteLen - 2; WORD wTextLen; @@ -691,8 +662,7 @@ void CIcqProto::parseStatusNote(DWORD dwUin, char *szUid, MCONTACT hContact, osc if (wTextLen > buflen) wTextLen = buflen; - if (wTextLen > 0) - { + if (wTextLen > 0) { szStatusNote = (char*)_alloca(wStatusNoteLen + 1); unpackString(&buf, szStatusNote, wTextLen); szStatusNote[wTextLen] = '\0'; @@ -704,8 +674,8 @@ void CIcqProto::parseStatusNote(DWORD dwUin, char *szUid, MCONTACT hContact, osc if (buflen >= 2) unpackWord(&buf, &wEncodingType); - if (wEncodingType == 1 && buflen > 6) - { // Encoding specified + if (wEncodingType == 1 && buflen > 6) { + // Encoding specified buf += 2; buflen -= 2; unpackWord(&buf, &wTextLen); @@ -722,8 +692,7 @@ void CIcqProto::parseStatusNote(DWORD dwUin, char *szUid, MCONTACT hContact, osc } } // Check if the status note was changed - if (dwStatusNoteTS > getDword(hContact, DBSETTING_STATUS_NOTE_TIME, 0)) - { + if (dwStatusNoteTS > getDword(hContact, DBSETTING_STATUS_NOTE_TIME, 0)) { DBVARIANT dbv = {DBVT_DELETED}; if (strlennull(szStatusNote) || (!getString(hContact, DBSETTING_STATUS_NOTE, &dbv) && (dbv.type == DBVT_ASCIIZ || dbv.type == DBVT_UTF8) && strlennull(dbv.pszVal))) @@ -740,25 +709,20 @@ void CIcqProto::parseStatusNote(DWORD dwUin, char *szUid, MCONTACT hContact, osc if (getContactXStatus(hContact) != 0 || !CheckContactCapabilities(hContact, CAPF_STATUS_MESSAGES)) { setStatusMsgVar(hContact, szStatusNote, false); - TCHAR* tszNote = mir_utf8decodeT(szStatusNote); + TCHAR *tszNote = mir_utf8decodeT(szStatusNote); ProtoBroadcastAck(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, NULL, (LPARAM)tszNote); mir_free(tszNote); } } SAFE_FREE(&szStatusNote); } - else - { - if (getContactStatus(hContact) == ID_STATUS_OFFLINE) - { - setStatusMsgVar(hContact, NULL, false); - delSetting(hContact, DBSETTING_STATUS_NOTE); - setDword(hContact, DBSETTING_STATUS_NOTE_TIME, dwStatusNoteTS); - } + else if (getContactStatus(hContact) == ID_STATUS_OFFLINE) { + setStatusMsgVar(hContact, NULL, false); + delSetting(hContact, DBSETTING_STATUS_NOTE); + setDword(hContact, DBSETTING_STATUS_NOTE_TIME, dwStatusNoteTS); } } - void CIcqProto::handleNotifyRejected(BYTE *buf, WORD wPackLen) { DWORD dwUIN; diff --git a/protocols/IcqOscarJ/src/icq_db.cpp b/protocols/IcqOscarJ/src/icq_db.cpp index e99ffa649f..25250c66fb 100644 --- a/protocols/IcqOscarJ/src/icq_db.cpp +++ b/protocols/IcqOscarJ/src/icq_db.cpp @@ -36,7 +36,7 @@ int CIcqProto::getSetting(MCONTACT hContact, const char *szSetting, DBVARIANT *d double CIcqProto::getSettingDouble(MCONTACT hContact, const char *szSetting, double dDef) { - DBVARIANT dbv = {DBVT_DELETED}; + DBVARIANT dbv = { DBVT_DELETED }; double dRes; if (getSetting(hContact, szSetting, &dbv)) @@ -58,24 +58,35 @@ DWORD CIcqProto::getContactUin(MCONTACT hContact) int CIcqProto::getContactUid(MCONTACT hContact, DWORD *pdwUin, uid_str *ppszUid) { - DBVARIANT dbv = {DBVT_DELETED}; + DBVARIANT dbv = { DBVT_DELETED }; int iRes = 1; *pdwUin = 0; if (ppszUid) *ppszUid[0] = '\0'; if (!getSetting(hContact, UNIQUEIDSETTING, &dbv)) { - if (dbv.type == DBVT_DWORD) { + switch (dbv.type) { + case DBVT_DWORD: *pdwUin = dbv.dVal; iRes = 0; - } - else if (dbv.type == DBVT_ASCIIZ) { + break; + + case DBVT_ASCIIZ: + if (ppszUid && m_bAimEnabled) { + strcpy(*ppszUid, dbv.pszVal); + iRes = 0; + } + else debugLogA("AOL screennames not accepted"); + break; + + case DBVT_UTF8: if (ppszUid && m_bAimEnabled) { strcpy(*ppszUid, dbv.pszVal); + mir_utf8decode(*ppszUid, NULL); iRes = 0; } - else - debugLogA("AOL screennames not accepted"); + else debugLogA("AOL screennames not accepted"); + break; } db_free(&dbv); } @@ -84,8 +95,8 @@ int CIcqProto::getContactUid(MCONTACT hContact, DWORD *pdwUin, uid_str *ppszUid) char* CIcqProto::getSettingStringUtf(MCONTACT hContact, const char *szModule, const char *szSetting, char *szDef) { - DBVARIANT dbv = {DBVT_DELETED}; - if ( db_get_utf(hContact, szModule, szSetting, &dbv)) { + DBVARIANT dbv = { DBVT_DELETED }; + if (db_get_utf(hContact, szModule, szSetting, &dbv)) { db_free(&dbv); // for a setting with invalid contents/type return null_strdup(szDef); } @@ -158,7 +169,7 @@ void CIcqProto::setStatusMsgVar(MCONTACT hContact, char* szStatusMsg, bool isAns char *oldStatusMsg = NULL; DBVARIANT dbv; - if ( !db_get_ts(hContact, "CList", "StatusMsg", &dbv)) { + if (!db_get_ts(hContact, "CList", "StatusMsg", &dbv)) { oldStatusMsg = make_utf8_string(dbv.ptszVal); db_free(&dbv); } diff --git a/protocols/IcqOscarJ/src/icq_server.cpp b/protocols/IcqOscarJ/src/icq_server.cpp index d32369a0c9..b82ebcfa1a 100644 --- a/protocols/IcqOscarJ/src/icq_server.cpp +++ b/protocols/IcqOscarJ/src/icq_server.cpp @@ -62,10 +62,8 @@ void __cdecl CIcqProto::ServerThread(serverthread_start_info *infoParam) SAFE_FREE((void**)&nloc.szHost); SAFE_FREE((void**)&infoParam); - if (hServerConn && m_bSecureConnection) - { - if (!CallService(MS_NETLIB_STARTSSL, (WPARAM)hServerConn, 0)) - { + if (hServerConn && m_bSecureConnection) { + if (!CallService(MS_NETLIB_STARTSSL, (WPARAM)hServerConn, 0)) { icq_LogMessage(LOG_ERROR, LPGEN("Unable to connect to ICQ login server, SSL could not be negotiated")); SetCurrentStatus(ID_STATUS_OFFLINE); NetLib_CloseConnection(&hServerConn, TRUE); @@ -75,8 +73,7 @@ void __cdecl CIcqProto::ServerThread(serverthread_start_info *infoParam) } // Login error - if (hServerConn == NULL) - { + if (hServerConn == NULL) { DWORD dwError = GetLastError(); SetCurrentStatus(ID_STATUS_OFFLINE); @@ -91,8 +88,7 @@ void __cdecl CIcqProto::ServerThread(serverthread_start_info *infoParam) BYTE bConstInternalIP = getByte("ConstRealIP", 0); info.hDirectBoundPort = NetLib_BindPort(icq_newConnectionReceived, this, &wListenPort, &dwInternalIP); - if (!info.hDirectBoundPort) - { + if (!info.hDirectBoundPort) { icq_LogUsingErrorCode(LOG_WARNING, GetLastError(), LPGEN("Miranda was unable to allocate a port to listen for direct peer-to-peer connections between clients. You will be able to use most of the ICQ network without problems but you may be unable to send or receive files.\n\nIf you have a firewall this may be blocking Miranda, in which case you should configure your firewall to leave some ports open and tell Miranda which ports to use in M->Options->ICQ->Network.")); wListenPort = 0; if (!bConstInternalIP) delSetting("RealIP"); @@ -102,9 +98,8 @@ void __cdecl CIcqProto::ServerThread(serverthread_start_info *infoParam) } // Initialize rate limiting queues - { + { icq_lock l(m_ratesMutex); - m_ratesQueue_Request = new rates_queue(this, "request", RML_IDLE_30, RML_IDLE_50, 1); m_ratesQueue_Response = new rates_queue(this, "response", RML_IDLE_10, RML_IDLE_30, -1); } @@ -112,15 +107,13 @@ void __cdecl CIcqProto::ServerThread(serverthread_start_info *infoParam) // This is the "infinite" loop that receives the packets from the ICQ server { int recvResult; - NETLIBPACKETRECVER packetRecv = {0}; + NETLIBPACKETRECVER packetRecv = { 0 }; info.hPacketRecver = (HANDLE)CallService(MS_NETLIB_CREATEPACKETRECVER, (WPARAM)hServerConn, 0x2400); packetRecv.cbSize = sizeof(packetRecv); packetRecv.dwTimeout = INFINITE; - while (serverThreadHandle) - { - if (info.bReinitRecver) - { // we reconnected, reinit struct + while (serverThreadHandle) { + if (info.bReinitRecver) { // we reconnected, reinit struct info.bReinitRecver = 0; ZeroMemory(&packetRecv, sizeof(packetRecv)); packetRecv.cbSize = sizeof(packetRecv); @@ -129,20 +122,17 @@ void __cdecl CIcqProto::ServerThread(serverthread_start_info *infoParam) recvResult = CallService(MS_NETLIB_GETMOREPACKETS, (WPARAM)info.hPacketRecver, (LPARAM)&packetRecv); - if (recvResult == 0) - { + if (recvResult == 0) { debugLogA("Clean closure of server socket"); break; } - if (recvResult == SOCKET_ERROR) - { + if (recvResult == SOCKET_ERROR) { debugLogA("Abortive closure of server socket, error: %d", GetLastError()); break; } - if (m_iDesiredStatus == ID_STATUS_OFFLINE) - { // Disconnect requested, send disconnect packet + if (m_iDesiredStatus == ID_STATUS_OFFLINE) { // Disconnect requested, send disconnect packet icq_sendCloseConnection(); // disconnected upon request @@ -171,8 +161,7 @@ void __cdecl CIcqProto::ServerThread(serverthread_start_info *infoParam) // disable auto info-update thread icq_EnableUserLookup(FALSE); - if (m_iStatus != ID_STATUS_OFFLINE && m_iDesiredStatus != ID_STATUS_OFFLINE) - { + if (m_iStatus != ID_STATUS_OFFLINE && m_iDesiredStatus != ID_STATUS_OFFLINE) { if (!info.bLoggedIn) icq_LogMessage(LOG_FATAL, LPGEN("Connection failed.\nLogin sequence failed for unknown reason.\nTry again later.")); @@ -192,16 +181,11 @@ void __cdecl CIcqProto::ServerThread(serverthread_start_info *infoParam) StopAvatarThread(); // Offline all contacts - MCONTACT hContact = db_find_first(m_szModuleName); - while (hContact) - { + for (MCONTACT hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName)) { DWORD dwUIN; uid_str szUID; - - if (!getContactUid(hContact, &dwUIN, &szUID)) - { - if (getContactStatus(hContact) != ID_STATUS_OFFLINE) - { + if (!getContactUid(hContact, &dwUIN, &szUID)) { + if (getContactStatus(hContact) != ID_STATUS_OFFLINE) { char tmp = 0; setWord(hContact, "Status", ID_STATUS_OFFLINE); @@ -209,8 +193,6 @@ void __cdecl CIcqProto::ServerThread(serverthread_start_info *infoParam) handleXStatusCaps(dwUIN, szUID, hContact, (BYTE*)&tmp, 0, &tmp, 0); } } - - hContact = db_find_next(hContact, m_szModuleName); } setDword("LogonTS", 0); // clear logon time -- cgit v1.2.3