bool ICQClient::setMailInfo(ICQUser *u) { if (m_state != Logged) return false; bool bChange = false; NPARAM(EMails); serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_MODIFY_BACKGROUND; char c = u->EMails.size(); c--; if (c < 0) c = 0; writeBuffer << c; bool bFirst = true; for (EMailList::iterator it = u->EMails.begin(); it != u->EMails.end(); ++it){ EMailInfo *info = static_cast<EMailInfo*>(*it); if (bFirst){ bFirst = false; continue; } string s; if (info->Email) s = info->Email; toServer(s); char hide = info->Hide ? 1 : 0; writeBuffer << hide << s; } sendServerRequest(); SetMailInfo *e = new SetMailInfo(m_nMsgSequence, u); varEvents.push_back(e); return true; }
void ICQClientPrivate::processMsgQueueSMS() { list<ICQEvent*>::iterator it; for (it = msgQueue.begin(); it != msgQueue.end();){ if ((sock == NULL) || (sock->isError())) return; ICQEvent *e = *it; if (e->message() == NULL){ it++; continue; } if (e->message()->Type() != ICQ_MSGxSMS){ it++; continue; } ICQSMS *msg = static_cast<ICQSMS*>(e->message()); XmlBranch xmltree("icq_sms_message"); string destination = "+"; for (const char *p = msg->Phone.c_str(); *p; p++){ if ((*p >= '0') && (*p <= '9')) destination += *p; } string text = msg->Message.c_str(); client->translate("utf8", msg->Charset.c_str(), text); text = client->clearHTML(text); string sender = client->owner->name(true); char uin[13]; snprintf(uin, sizeof(uin), "%lu", client->owner->Uin); xmltree.pushnode(new XmlLeaf("destination",destination)); xmltree.pushnode(new XmlLeaf("text",text)); xmltree.pushnode(new XmlLeaf("codepage","1252")); xmltree.pushnode(new XmlLeaf("encoding","utf8")); xmltree.pushnode(new XmlLeaf("senders_UIN",uin)); xmltree.pushnode(new XmlLeaf("senders_name",sender)); xmltree.pushnode(new XmlLeaf("delivery_receipt","Yes")); /* Time string, format: Wkd, DD Mnm YYYY HH:MM:SS TMZ */ char timestr[30]; time_t t; struct tm *tm; time(&t); tm = gmtime(&t); snprintf(timestr, sizeof(timestr), "%s, %02u %s %04u %02u:%02u:%02u GMT", w_days[tm->tm_wday], tm->tm_mday, months[tm->tm_mon], tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec); xmltree.pushnode(new XmlLeaf("time",string(timestr))); string xmlstr = xmltree.toString(0); serverRequest(ICQ_SRVxREQ_MORE); sock->writeBuffer << ICQ_SRVxREQ_SEND_SMS << 0x00010016L << 0x00000000L << 0x00000000L << 0x00000000L << 0x00000000L << (unsigned long)(xmlstr.size()); sock->writeBuffer << xmlstr.c_str(); sendServerRequest(); msgQueue.remove(e); e->m_nId = m_nMsgSequence; varEvents.push_back(e); it = msgQueue.begin(); } }
bool ICQClient::setMoreInfo(ICQUser *u) { if (m_state != Logged) return false; bool bChange = false; NPARAM(Age); NPARAM(Gender); NPARAM(BirthYear); NPARAM(BirthMonth); NPARAM(BirthDay); NPARAM(Language1); NPARAM(Language2); NPARAM(Language3); SPARAM(Homepage); if (!bChange) return false; serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_MODIFY_MORE << u->Age() << u->Gender() << s_Homepage << u->BirthYear() << u->BirthMonth() << u->BirthDay() << u->Language1() << u->Language2() << u->Language3(); sendServerRequest(); SetMoreInfo *e = new SetMoreInfo(m_nMsgSequence, u); varEvents.push_back(e); return true; }
void ICQClientPrivate::sendShareUpdate() { serverRequest(ICQ_SRVxREQ_MORE); sock->writeBuffer << (unsigned short)ICQ_SRVxREQ_PHONE_UPDATE; sock->writeBuffer.pack((char*)SHARED_FILES_SIGN, 0x10); sock->writeBuffer.pack((unsigned short)4); sock->writeBuffer.pack((unsigned long)(client->ShareOn ? 1 : 0)); sendServerRequest(); }
void ICQClient::sendPhoneInit() { serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << (unsigned short)ICQ_SRVxREQ_PHONE_INIT; writeBuffer << 0x01000000L << 0x03200000L << 0x00000000L << 0x00000000L << 0x00000408L << 0x00000000L << 0x00000050L << 0x00000003L << (char)0 << (unsigned short)0; sendServerRequest(); }
void ICQClient::requestKey(const char *key) { serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_XML_KEY; string s = "<key>"; s += key; s += "</key>"; writeBuffer << s; sendServerRequest(); }
void ICQClient::requestInfo(unsigned long uin) { if (uin >= UIN_SPECIAL) return; log(L_DEBUG, "Request info about %lu", uin); serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_FULL_INFO; writeBuffer << (unsigned long)htonl(uin); sendServerRequest(); varEvents.push_back(new FullInfoEvent(m_nMsgSequence, uin)); }
void ICQClient::processMsgQueueSMS() { list<ICQEvent*>::iterator it; for (it = msgQueue.begin(); it != msgQueue.end();){ ICQEvent *e = *it; if (e->message() == NULL){ it++; continue; } if (e->message()->Type() != ICQ_MSGxSMS){ it++; continue; } ICQSMS *msg = static_cast<ICQSMS*>(e->message()); XmlBranch xmltree("icq_sms_message"); string destination = "+"; for (const char *p = msg->Phone.c_str(); *p; p++){ if ((*p >= '0') && (*p <= '9')) destination += *p; } string text = clearHTML(msg->Message.c_str()); toUTF(text); string sender = name(true); char uin[13]; snprintf(uin, sizeof(uin), "%lu", Uin()); xmltree.pushnode(new XmlLeaf("destination",destination)); xmltree.pushnode(new XmlLeaf("text",text)); xmltree.pushnode(new XmlLeaf("codepage","1252")); xmltree.pushnode(new XmlLeaf("encoding","urf8")); xmltree.pushnode(new XmlLeaf("senders_UIN",uin)); xmltree.pushnode(new XmlLeaf("senders_name",sender)); xmltree.pushnode(new XmlLeaf("delivery_receipt","Yes")); /* Time string, format: Wkd, DD Mnm YYYY HH:MM:SS TMZ */ char timestr[30]; time_t t; struct tm *tm; time(&t); tm = gmtime(&t); strftime(timestr, 30, "%a, %d %b %Y %T %Z", tm); xmltree.pushnode(new XmlLeaf("time",string(timestr))); string xmlstr = xmltree.toString(0); serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_SEND_SMS << 0x00010016L << 0x00000000L << 0x00000000L << 0x00000000L << 0x00000000L << (unsigned long)(xmlstr.size()); writeBuffer << xmlstr.c_str(); sendServerRequest(); msgQueue.remove(e); e->m_nId = m_nMsgSequence; varEvents.push_back(e); it = msgQueue.begin(); } }
bool ICQClientPrivate::requestInfo(unsigned long uin, bool) { if (uin >= UIN_SPECIAL) return false; log(L_DEBUG, "Request info about %lu", uin); serverRequest(ICQ_SRVxREQ_MORE); sock->writeBuffer << ICQ_SRVxREQ_FULL_INFO; sock->writeBuffer.pack(uin); sendServerRequest(); varEvents.push_back(new FullInfoEvent(m_nMsgSequence, uin)); return true; }
void ICQClient::setPassword(const char *passwd) { if (m_state != Logged) return; serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_CHANGE_PASSWD; string p = passwd; toServer(p); writeBuffer << p; sendServerRequest(); SetPasswordEvent *e = new SetPasswordEvent(m_nMsgSequence, passwd); varEvents.push_back(e); }
void ICQClient::sendPhoneStatus() { serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << (unsigned short)ICQ_SRVxREQ_PHONE_UPDATE; writeBuffer.pack((char*)PHONEBOOK_SIGN, 0x10); writeBuffer << (unsigned short)0x0200 << PhoneState << (char)0 << (unsigned short)0; sendServerRequest(); }
ICQEvent *ICQClient::searchByUin(unsigned long uin) { if (m_state != Logged) return 0; serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_WP_INFO_UIN << 0x36010400L << (unsigned long)htonl(uin); sendServerRequest(); ICQEvent *e = new SearchEvent(m_nMsgSequence); varEvents.push_back(e); return e; }
void ICQClient::setSecurityInfo(bool bAuthorize, bool bWebAware) { if (m_state != Logged) return; serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_PERMISSIONS << (char)(bAuthorize ? 0 : 0x01) << (char)(bWebAware ? 0x01 : 0) << (char)0x01 << (char)0; sendServerRequest(); SetSecurityInfo *e = new SetSecurityInfo(m_nMsgSequence, bAuthorize, bWebAware); varEvents.push_back(e); }
bool ICQClient::setInterestsInfo(ICQUser *u) { if (m_state != Logged) return false; bool bChange = false; NPARAM(Interests); serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_MODIFY_INTERESTS; packInfoList(u->Interests); sendServerRequest(); SetInterestsInfo *e = new SetInterestsInfo(m_nMsgSequence, u); varEvents.push_back(e); return true; }
bool ICQClient::setAboutInfo(ICQUser *u) { if (m_state != Logged) return false; bool bChange = false; SPARAM(About); if (!bChange) return false; serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_MODIFY_ABOUT << s_About; sendServerRequest(); SetAboutInfo *e = new SetAboutInfo(m_nMsgSequence, u); varEvents.push_back(e); return true; }
bool ICQClientPrivate::setMainInfo(ICQUser *u) { if (m_state != Logged) return false; bool bChange = false; SPARAM(Nick); SPARAM(FirstName); SPARAM(LastName); SPARAM(EMail); SPARAM(City); SPARAM(State); SPARAM(HomePhone); SPARAM(HomeFax); SPARAM(Address); SPARAM(PrivateCellular); SPARAM(Zip); NPARAM(Country); NPARAM(TimeZone); NPARAM(HiddenEMail); // if (!bChange) return false; serverRequest(ICQ_SRVxREQ_MORE); sock->writeBuffer << ICQ_SRVxREQ_MODIFY_MAIN << s_Nick << s_FirstName << s_LastName << s_EMail << s_City << s_State << s_HomePhone << s_HomeFax << s_Address << s_PrivateCellular << s_Zip; sock->writeBuffer.pack(u->Country); sock->writeBuffer << u->TimeZone << u->HiddenEMail; sendServerRequest(); SetMainInfo *e = new SetMainInfo(m_nMsgSequence, u); varEvents.push_back(e); return true; }
bool ICQClient::setBackgroundInfo(ICQUser *u) { if (m_state != Logged) return false; bool bChange = false; NPARAM(Backgrounds); NPARAM(Affilations); if (!bChange) return false; serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_MODIFY_BACKGROUND; packInfoList(u->Backgrounds); packInfoList(u->Affilations); sendServerRequest(); SetBackgroundInfo *e = new SetBackgroundInfo(m_nMsgSequence, u); varEvents.push_back(e); return true; }
bool ICQClientPrivate::setWorkInfo(ICQUser *u) { if (m_state != Logged) return false; bool bChange = false; SPARAM(WorkCity); SPARAM(WorkState); SPARAM(WorkPhone); SPARAM(WorkFax); SPARAM(WorkAddress); SPARAM(WorkZip); NPARAM(WorkCountry); SPARAM(WorkName); SPARAM(WorkDepartment); SPARAM(WorkPosition); NPARAM(Occupation); SPARAM(WorkHomepage); // if (!bChange) return false; serverRequest(ICQ_SRVxREQ_MORE); sock->writeBuffer << ICQ_SRVxREQ_MODIFY_WORK << s_WorkCity << s_WorkState << s_WorkPhone << s_WorkFax << s_WorkAddress << s_WorkZip; sock->writeBuffer.pack(u->WorkCountry); sock->writeBuffer << s_WorkName << s_WorkDepartment << s_WorkPosition; sock->writeBuffer.pack(u->Occupation); sock->writeBuffer << s_WorkHomepage; sendServerRequest(); SetWorkInfo *e = new SetWorkInfo(m_nMsgSequence, u); varEvents.push_back(e); return true; }
ICQEvent *ICQClient::searchByName(const char *first, const char *last, const char *nick) { if (m_state != Logged) return 0; serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_WP_SHORT; string sFirst = first ? first : ""; string sLast = last ? last : ""; string sNick = nick ? nick : ""; log(L_DEBUG, "-- [%s] [%s] [%s]", first, last, nick); toServer(sFirst); toServer(sLast); toServer(sNick); writeBuffer << sNick << sFirst << sNick; sendServerRequest(); ICQEvent *e = new SearchEvent(m_nMsgSequence); varEvents.push_back(e); return e; }
void ICQClient::sendMessageRequest() { serverRequest(ICQ_SRVxREQ_OFFLINE_MSG); sendServerRequest(); }
ICQEvent *ICQClient::searchWP(const char *szFirst, const char *szLast, const char *szNick, const char *szEmail, char age, char nGender, char nLanguage, const char *szCity, const char *szState, unsigned short nCountryCode, const char *szCoName, const char *szCoDept, const char *szCoPos, bool bOnlineOnly) { if (m_state != Logged) return 0; serverRequest(ICQ_SRVxREQ_MORE); writeBuffer << ICQ_SRVxREQ_WP_FULL; string sFirst = szFirst ? szFirst : ""; string sLast = szLast ? szLast : ""; string sNick = szNick ? szNick : ""; string sEmail = szEmail ? szEmail : ""; string sCity = szCity ? szCity : ""; string sState = szState ? szState : ""; string sCoName = szCoName ? szCoName : ""; string sCoDept = szCoDept ? szCoDept : ""; string sCoPos = szCoPos ? szCoPos : ""; toServer(sFirst); toServer(sLast); toServer(sNick); toServer(sEmail); toServer(sCity); toServer(sState); toServer(sCoName); toServer(sCoDept); toServer(sCoPos); unsigned short nMinAge = 0; unsigned short nMaxAge = 0; switch (age){ case 1: nMinAge = 18; nMaxAge = 22; break; case 2: nMinAge = 23; nMaxAge = 29; break; case 3: nMinAge = 30; nMaxAge = 39; break; case 4: nMinAge = 40; nMaxAge = 49; break; case 5: nMinAge = 50; nMaxAge = 59; break; case 6: nMinAge = 60; nMaxAge = 120; break; } writeBuffer << sFirst << sLast << sNick << sEmail << (unsigned short)htons(nMinAge) << (unsigned short)htons(nMaxAge) << nGender << nLanguage << sCity << sState << (unsigned short)htons(nCountryCode) << sCoName << sCoDept << sCoPos << (char)0x00 << (unsigned short)0x0000; for (unsigned short i = 0; i < 3; i++) { writeBuffer << (char)0x01 << 0x00000000L; } writeBuffer << (char)0x01 << (unsigned short)0x0000; char c = bOnlineOnly ? 1 : 0; writeBuffer << c; sendServerRequest(); ICQEvent *e = new SearchEvent(m_nMsgSequence); varEvents.push_back(e); return e; }
void ICQClient::snac_various(unsigned short type, unsigned short) { switch (type){ case ICQ_SNACxVAR_DATA:{ TlvList tlv(readBuffer); if (tlv(0x0001) == NULL){ log(L_WARN, "Bad server response"); break; } Buffer msg(*tlv(1)); unsigned short len, nType, nId; unsigned long own_uin; msg >> len >> own_uin >> nType >> nId; switch (nType){ case ICQ_SRVxEND_OFFLINE_MSG: log(L_DEBUG, "End offline messages"); serverRequest(ICQ_SRVxREQ_ACK_OFFLINE_MSG); sendServerRequest(); break; case ICQ_SRVxOFFLINE_MSG:{ log(L_DEBUG, "Offline message"); unsigned long uin; char type, flag; struct tm sendTM; memset(&sendTM, 0, sizeof(sendTM)); string message; unsigned short year; char month, day, hours, min; msg >> uin >> year >> month >> day >> hours >> min >> type >> flag; msg >> message; uin = htonl(uin); year = htons(year); sendTM.tm_year = year-1900; sendTM.tm_mon = month-1; sendTM.tm_mday = day; sendTM.tm_hour = hours; sendTM.tm_min = min; sendTM.tm_sec = 0; time_t send_time = mktime(&sendTM); log(L_DEBUG, "Offline message %u [%08lX] %02X %02X %s", uin, uin, type & 0xFF, flag & 0xFF, message.c_str()); ICQMessage *m = parseMessage(type, uin, message, msg, 0, 0, 0, 0); if (m){ m->Time = (unsigned long)send_time; messageReceived(m); } break; } case ICQ_SRVxANSWER_MORE:{ unsigned short nSubtype; char nResult; msg >> nSubtype >> nResult; log(L_DEBUG, "Server answer %02X %04X", nResult & 0xFF, nSubtype); if ((nResult == 0x32) || (nResult == 0x14) || (nResult == 0x1E)){ ICQEvent *e = findVarEvent(htons(nId)); if (e == NULL){ log(L_WARN, "Various event ID %04X not found (%X)", nId, nResult); break; } e->failAnswer(this); varEvents.remove(e); delete e; break; } ICQEvent *e = findVarEvent(htons(nId)); if (e == NULL){ log(L_WARN, "Various event ID %04X not found (%X)", nId, nResult); break; } bool nDelete = e->processAnswer(this, msg, nSubtype); if (nDelete){ log(L_DEBUG, "Delete event"); varEvents.remove(e); delete e; } break; } default: log(L_WARN, "Unknown SNAC(15,03) response type %04X", nType); } break; } default: log(L_WARN, "Unknown various family type %04X", type); } }