// Functions really sending Xtraz stuff DWORD CIcqProto::SendXtrazNotifyRequest(MCONTACT hContact, char* szQuery, char* szNotify, int bForced) { char *szQueryBody; char *szNotifyBody; DWORD dwUin; int nBodyLen; char *szBody; DWORD dwCookie; if (getContactUid(hContact, &dwUin, NULL)) return 0; // Invalid contact if (!CheckContactCapabilities(hContact, CAPF_XTRAZ) && !bForced) return 0; // Contact does not support xtraz, do not send anything szQueryBody = MangleXml(szQuery, strlennull(szQuery)); szNotifyBody = MangleXml(szNotify, strlennull(szNotify)); nBodyLen = strlennull(szQueryBody) + strlennull(szNotifyBody) + 41; szBody = (char*)_alloca(nBodyLen); nBodyLen = mir_snprintf(szBody, nBodyLen, "<N><QUERY>%s</QUERY><NOTIFY>%s</NOTIFY></N>", szQueryBody, szNotifyBody); SAFE_FREE((void**)&szQueryBody); SAFE_FREE((void**)&szNotifyBody); // Set up the ack type cookie_message_data *pCookieData = CreateMessageCookie(MTYPE_SCRIPT_NOTIFY, ACKTYPE_CLIENT); dwCookie = AllocateCookie(CKT_MESSAGE, 0, hContact, (void*)pCookieData); // have we a open DC, send through that if (m_bDCMsgEnabled && IsDirectConnectionOpen(hContact, DIRECTCONN_STANDARD, 0)) icq_sendXtrazRequestDirect(hContact, dwCookie, szBody, nBodyLen, MTYPE_SCRIPT_NOTIFY); else icq_sendXtrazRequestServ(dwUin, dwCookie, szBody, nBodyLen, pCookieData); return dwCookie; }
cookie_message_data* CIcqProto::CreateMessageCookieData(BYTE bMsgType, MCONTACT hContact, DWORD dwUin, int bUseSrvRelay) { BYTE bAckType; WORD wStatus = getContactStatus(hContact); if (!getByte(hContact, "SlowSend", getByte("SlowSend", DEFAULT_SLOWSEND)) || (!dwUin && wStatus == ID_STATUS_OFFLINE)) bAckType = ACKTYPE_NONE; else if (bUseSrvRelay) bAckType = ACKTYPE_CLIENT; else bAckType = ACKTYPE_SERVER; 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) pCookieData->isOffline = TRUE; return pCookieData; }