void ICQClient::createGroup(const char *name) { ICQGroup *grp = new ICQGroup; unsigned short id = contacts.getGroupId(grp); CreateGroupEvent *e = new CreateGroupEvent(grp); snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_EDIT); sendPacket(); sendRoster(e, ICQ_SNACxLISTS_CREATE, name, id, 0, ICQ_GROUPS); snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_SAVE); sendPacket(); }
void ICQClient::fetchProfile(ICQUserData *data) { snac(ICQ_SNACxFAM_LOCATION, ICQ_SNACxLOC_REQUESTxUSERxINFO, true); m_socket->writeBuffer << (unsigned short)0x0001; m_socket->writeBuffer.packScreen(screen(data).c_str()); sendPacket(false); snac(ICQ_SNACxFAM_LOCATION, ICQ_SNACxLOC_REQUESTxDIRxINFO, true); m_socket->writeBuffer.packScreen(screen(data).c_str()); sendPacket(false); m_info_req.insert(INFO_REQ_MAP::value_type(m_nMsgSequence, screen(data))); }
void ICQClientPrivate::createGroup(const char *name) { if (m_state != Logged) return; ICQGroup *grp = client->createGroup(); unsigned short id = client->contacts.getGroupId(grp); CreateGroupEvent *e = new CreateGroupEvent(grp); snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_EDIT); sendPacket(); sendRoster(e, ICQ_SNACxLISTS_CREATE, name, id, 0, ICQ_GROUPS); snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_SAVE); sendPacket(); }
void ICQClientPrivate::listsRequest() { log(L_DEBUG, "lists request"); snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_REQxRIGHTS); sendPacket(); if (client->contacts.Invisible == 0){ client->contacts.Time = 0; client->contacts.Len = 0; } snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_REQxROSTER); sock->writeBuffer << client->contacts.Time << client->contacts.Len; sendPacket(); }
void ICQClient::listsRequest() { log(L_DEBUG, "lists request"); snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_REQxRIGHTS); sendPacket(); if (contacts.Invisible() == 0){ contacts.Time = 0; contacts.Len = 0; } snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_REQxROSTER); writeBuffer << contacts.Time() << contacts.Len(); sendPacket(); }
void ICQClientPrivate::moveUser(ICQUser *u, ICQGroup *g) { if (m_state != Logged) return; unsigned short id = client->contacts.getUserId(u, 0, false); MoveUserEvent *e = new MoveUserEvent(u->Uin, g->Id); if (!u->GrpId){ snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_CREATE_USER); sock->writeBuffer.packUin(u->Uin); sock->writeBuffer << 0x00000000L; sendPacket(); } snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_EDIT); sendPacket(); sendRoster(e, ICQ_SNACxLISTS_CREATE, u->Uin, g->Id, id, 0, u->Alias.c_str(), u->WaitAuth); }
void ICQClient::addToVisibleList(unsigned long uin) { if (uin >= UIN_SPECIAL) return; snac(ICQ_SNACxFAM_BOS, ICQ_SNACxBOS_ADDxVISIBLExLIST); sock->writeBuffer.packUin(uin); sendPacket(); }
void ICQClientPrivate::sendRoster(ICQEvent *e, unsigned short cmd, const char *name, unsigned short grp_id, unsigned short usr_id, unsigned short subCmd, const char *alias, bool waitAuth) { snac(ICQ_SNACxFAM_LISTS, cmd, true); string sName; if (name) sName = name; client->toUTF(sName, client->owner->Encoding.c_str()); sock->writeBuffer.pack(sName); sock->writeBuffer << grp_id << usr_id << subCmd; if (alias){ string sAlias = alias; client->toUTF(sAlias, client->owner->Encoding.c_str()); unsigned short size = sAlias.length() + 4 + (waitAuth ? 4 : 0); sock->writeBuffer << size << (unsigned short)0x0131; sock->writeBuffer.pack(sAlias); if (waitAuth){ sock->writeBuffer << (unsigned short)0x66 << (unsigned short)0; } }else{ sock->writeBuffer << (unsigned short)0; } sendPacket(); e->m_nId = m_nMsgSequence - 1; listEvents.push_back(e); }
void ICQClient::sendCapability() { Buffer cap; capability c; memcpy(c, capabilities[CAP_SIM], sizeof(c)); const char *ver = VERSION; unsigned char *pack_ver = c + sizeof(capability) - 4; *(pack_ver++) = get_ver(ver); *(pack_ver++) = get_ver(ver); *(pack_ver++) = get_ver(ver); unsigned char os_ver; #ifdef WIN32 os_ver = 0x80; #else os_ver = 0; #endif *(pack_ver++) = os_ver; cap.pack((char*)capabilities[CAP_DIRECT], sizeof(capability)); cap.pack((char*)capabilities[CAP_SRV_RELAY], sizeof(capability)); if (getSendFormat() <= 1) cap.pack((char*)capabilities[CAP_UTF], sizeof(capability)); if (getSendFormat() == 0) cap.pack((char*)capabilities[CAP_RTF], sizeof(capability)); if (getTypingNotification()) cap.pack((char*)capabilities[CAP_TYPING], sizeof(capability)); cap.pack((char*)c, sizeof(c)); snac(ICQ_SNACxFAM_LOCATION, ICQ_SNACxLOC_SETxUSERxINFO); m_socket->writeBuffer.tlv(0x0005, cap); sendPacket(); }
void ICQClient::removeFromInvisibleList(unsigned long uin) { if (uin >= UIN_SPECIAL) return; snac(ICQ_SNACxFAM_BOS, ICQ_SNACxBOS_REMxINVISIBLExLIST); sock->writeBuffer.packUin(uin); sendPacket(); }
void ICQClient::fetchAwayMessage(ICQUserData *data) { snac(ICQ_SNACxFAM_LOCATION, ICQ_SNACxLOC_REQUESTxUSERxINFO, true); m_socket->writeBuffer << (unsigned short)0x0003; m_socket->writeBuffer.packScreen(screen(data).c_str()); sendPacket(false); }
void ICQClientPrivate::sendRosterGrp(const char *name, unsigned short grpId, unsigned short usrId) { snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_RENAME, true); string sName = name; client->toUTF(sName, client->owner->Encoding.c_str()); sock->writeBuffer.pack(sName); sock->writeBuffer << grpId << (unsigned long) ICQ_GROUPS; if (usrId){ sock->writeBuffer << (unsigned short) 6 << (unsigned short) 0xC8 << (unsigned short) 2 << (unsigned short) usrId; }else{ sock->writeBuffer << (unsigned short) 4 << (unsigned short) 0xC8 << (unsigned short) 0; } sendPacket(); MoveUserDummyEvent *e = new MoveUserDummyEvent; e->m_nId = m_nMsgSequence - 1; listEvents.push_back(e); }
void OscarConnection::finishLogin() { setState(Connected); sendUserInfo(true); m_is_idle = true; setIdle(false); SNAC snac(ServiceFamily, ServiceClientReady); // imitate ICQ 6 behaviour snac.append(QByteArray::fromHex( "0022 0001 0110 164f" "0001 0004 0110 164f" "0013 0004 0110 164f" "0002 0001 0110 164f" "0003 0001 0110 164f" "0015 0001 0110 164f" "0004 0001 0110 164f" "0006 0001 0110 164f" "0009 0001 0110 164f" "000a 0001 0110 164f" "000b 0001 0110 164f")); send(snac); m_account->finishLogin(); if (m_account->d_func()->name.isEmpty()) { ShortInfoMetaRequest *req = new ShortInfoMetaRequest(m_account); // Requesting own information. connect(req, SIGNAL(done(bool)), this, SLOT(accountInfoReceived(bool))); req->send(); }
void ICQClient::sendCapability(const QString &away_msg) { Buffer cap; capability c; memcpy(c, capabilities[CAP_SIM], sizeof(c)); const char *ver = VERSION; unsigned char *pack_ver = c + sizeof(capability) - 4; *(pack_ver++) = get_ver(ver); *(pack_ver++) = get_ver(ver); *(pack_ver++) = get_ver(ver); unsigned char os_ver; #ifdef WIN32 os_ver = 0x80; #else #ifdef QT_MACOSX_VERSION os_ver = 0x40; #else os_ver = 0; #endif #endif *(pack_ver++) = os_ver; addCapability(cap, CAP_AIM_SHORTCAPS); addCapability(cap, CAP_AIM_SUPPORT); // addCapability(cap, CAP_AVATAR); if (m_bAIM){ addCapability(cap, CAP_AIM_CHAT); addCapability(cap, CAP_AIM_BUDDYCON); addCapability(cap, CAP_AIM_IMIMAGE); addCapability(cap, CAP_AIM_SENDFILE); addCapability(cap, CAP_AIM_BUDDYLIST); }else{ addCapability(cap, CAP_DIRECT); addCapability(cap, CAP_SRV_RELAY); addCapability(cap, CAP_XTRAZ); if (getSendFormat() <= 1) addCapability(cap, CAP_UTF); if (getSendFormat() == 0) addCapability(cap, CAP_RTF); } if (!getDisableTypingNotification()) cap.pack((char*)capabilities[CAP_TYPING], sizeof(capability)); cap.pack((char*)c, sizeof(c)); snac(ICQ_SNACxFAM_LOCATION, ICQ_SNACxLOC_SETxUSERxINFO); if (m_bAIM){ if (data.owner.ProfileFetch.bValue){ QString profile; profile = QString("<HTML>") + data.owner.About.ptr + "</HTML>"; encodeString(profile, "text/aolrtf", 1, 2); } if (!away_msg.isNull()) encodeString(away_msg, "text/plain", 3, 4); } m_socket->writeBuffer.tlv(0x0005, cap); if (m_bAIM) m_socket->writeBuffer.tlv(0x0006, "\x00\x04\x00\x02\x00\x02", 6); sendPacket(true); }
void ICQClientPrivate::serverRequest(unsigned short cmd, unsigned short seq) { snac(ICQ_SNACxFAM_VARIOUS, ICQ_SNACxVAR_REQxSRV, true); sock->writeBuffer.tlv(0x0001, 0); sock->writeBuffer.pack((char*)&client->owner->Uin, 4); sock->writeBuffer << cmd; sock->writeBuffer.pack((unsigned short)(seq ? seq : m_nMsgSequence)); }
void ICQClient::serverRequest(unsigned short cmd, unsigned short seq) { snac(ICQ_SNACxFAM_VARIOUS, ICQ_SNACxVAR_REQxSRV, true); writeBuffer.tlv(0x0001, 0); writeBuffer.pack((char*)&Uin(), 4); writeBuffer << cmd; writeBuffer << htons(seq ? seq : m_nMsgSequence); }
void __cdecl CAimProto::aim_avatar_negotiation(void*) { HANDLE hServerPacketRecver = (HANDLE)CallService(MS_NETLIB_CREATEPACKETRECVER, (WPARAM)m_hAvatarConn, 2048 * 8); NETLIBPACKETRECVER packetRecv = { 0 }; packetRecv.cbSize = sizeof(packetRecv); packetRecv.dwTimeout = 300000;//5 minutes connected for (;;) { int recvResult = CallService(MS_NETLIB_GETMOREPACKETS, (WPARAM)hServerPacketRecver, (LPARAM)& packetRecv); if (recvResult == 0) break; if (recvResult == SOCKET_ERROR) break; if (recvResult > 0) { unsigned short flap_length = 0; for (; packetRecv.bytesUsed < packetRecv.bytesAvailable; packetRecv.bytesUsed = flap_length) { if (!packetRecv.buffer) break; FLAP flap((char*)&packetRecv.buffer[packetRecv.bytesUsed], packetRecv.bytesAvailable - packetRecv.bytesUsed); if (!flap.len()) break; flap_length += FLAP_SIZE + flap.len(); if (flap.cmp(0x01)) { aim_send_cookie(m_hAvatarConn, m_avatar_seqno, AVATAR_COOKIE_LENGTH, AVATAR_COOKIE); // cookie challenge mir_free(AVATAR_COOKIE); AVATAR_COOKIE = NULL; AVATAR_COOKIE_LENGTH = 0; } else if (flap.cmp(0x02)) { SNAC snac(flap.val(), flap.snaclen()); if (snac.cmp(0x0001)) { snac_supported_families(snac, m_hAvatarConn, m_avatar_seqno); snac_supported_family_versions(snac, m_hAvatarConn, m_avatar_seqno); snac_avatar_rate_limitations(snac, m_hAvatarConn, m_avatar_seqno); snac_error(snac); } if (snac.cmp(0x0010)) { snac_retrieve_avatar(snac); snac_upload_reply_avatar(snac); } } else if (flap.cmp(0x04)) goto exit; } } } exit: Netlib_CloseHandle(hServerPacketRecver); Netlib_CloseHandle(m_hAvatarConn); m_hAvatarConn = NULL; ResetEvent(m_hAvatarEvent); debugLogA("Avatar Server Connection has ended"); }
void ICQClient::snac_login(unsigned short type, unsigned short) { unsigned long newUin; switch (type){ case ICQ_SNACxLOGIN_ERROR: m_reconnect = NO_RECONNECT; m_socket->error_state(I18N_NOOP("Login error"), AuthError); break; case ICQ_SNACxLOGIN_REGISTER: if (data.owner.Uin.value){ m_socket->error_state(I18N_NOOP("Registered in no register state")); break; } m_socket->readBuffer.incReadPos(0x2E); m_socket->readBuffer.unpack(newUin); log(L_DEBUG, "Register %u %08lX", newUin, newUin); setUin(newUin); setState(Connecting); m_socket->connect(getServer(), getPort(), this); break; case ICQ_SNACxLOGIN_AUTHxKEYxRESPONSE: if (data.owner.Screen.ptr){ string md5_key; m_socket->readBuffer.unpackStr(md5_key); snac(ICQ_SNACxFAM_LOGIN, ICQ_SNACxLOGIN_MD5xLOGIN, false, false); m_socket->writeBuffer.tlv(0x0001, data.owner.Screen.ptr); MD5_CTX c; MD5_Init(&c); unsigned char md[MD5_DIGEST_LENGTH]; MD5_Update(&c, md5_key.c_str(), md5_key.length()); string pswd = getContacts()->fromUnicode(NULL, getPassword()); MD5_Update(&c, pswd.c_str(), pswd.length()); pswd = "AOL Instant Messenger (SM)"; MD5_Update(&c, pswd.c_str(), pswd.length()); MD5_Final(md, &c); m_socket->writeBuffer.tlv(0x0025, (char*)&md, sizeof(md)); m_socket->writeBuffer.tlv(0x0003, "AOL Instant Messenger, version 5.1.3036/WIN32"); m_socket->writeBuffer.tlv(0x0016, (unsigned short)0x0109); m_socket->writeBuffer.tlv(0x0017, (unsigned short)0x0005); m_socket->writeBuffer.tlv(0x0018, (unsigned short)0x0001); m_socket->writeBuffer.tlv(0x0019, (unsigned short)0x0000); m_socket->writeBuffer.tlv(0x001A, (unsigned short)0x0BDC); m_socket->writeBuffer.tlv(0x0014, 0x000000D2L); m_socket->writeBuffer.tlv(0x000F, "en"); m_socket->writeBuffer.tlv(0x000E, "us"); m_socket->writeBuffer.tlv(0x004A, "\x01"); sendPacket(); } break; case ICQ_SNACxLOGIN_LOGINxREPLY: chn_close(); break; default: log(L_WARN, "Unknown login family type %04X", type); } }
void ICQClient::sendCapability(const char *away_msg) { Buffer cap; capability c; memcpy(c, capabilities[CAP_SIM], sizeof(c)); const char *ver = VERSION; unsigned char *pack_ver = c + sizeof(capability) - 4; *(pack_ver++) = get_ver(ver); *(pack_ver++) = get_ver(ver); *(pack_ver++) = get_ver(ver); unsigned char os_ver; #ifdef WIN32 os_ver = 0x80; #else #ifdef QT_MACOSX_VERSION os_ver = 0x40; #else os_ver = 0; #endif #endif *(pack_ver++) = os_ver; if (m_bAIM) { cap.pack((char*)capabilities[CAP_AIM_CHAT], sizeof(capability)); cap.pack((char*)capabilities[CAP_AIM_BUDDYCON], sizeof(capability)); cap.pack((char*)capabilities[CAP_AIM_IMIMAGE], sizeof(capability)); cap.pack((char*)capabilities[CAP_AIM_SENDFILE], sizeof(capability)); cap.pack((char*)capabilities[CAP_AIM_BUDDYLIST], sizeof(capability)); } else { cap.pack((char*)capabilities[CAP_DIRECT], sizeof(capability)); cap.pack((char*)capabilities[CAP_SRV_RELAY], sizeof(capability)); if (getSendFormat() <= 1) cap.pack((char*)capabilities[CAP_UTF], sizeof(capability)); if (getSendFormat() == 0) cap.pack((char*)capabilities[CAP_RTF], sizeof(capability)); } if (getTypingNotification()) cap.pack((char*)capabilities[CAP_TYPING], sizeof(capability)); cap.pack((char*)capabilities[CAP_AIM_SUPPORT], sizeof(capability)); cap.pack((char*)c, sizeof(c)); snac(ICQ_SNACxFAM_LOCATION, ICQ_SNACxLOC_SETxUSERxINFO); if (m_bAIM) { if (data.owner.ProfileFetch.bValue) { QString profile; if (data.owner.About.ptr) profile = QString::fromUtf8(data.owner.About.ptr); profile = QString("<HTML>") + profile + "</HTML>"; encodeString(profile, "text/aolrtf", 1, 2); } if (away_msg) encodeString(QString::fromUtf8(away_msg), "text/plain", 3, 4); } m_socket->writeBuffer.tlv(0x0005, cap); if (m_bAIM) m_socket->writeBuffer.tlv(0x0006, "\x00\x04\x00\x02\x00\x02", 6); sendPacket(); }
void ICQClient::setAwayMessage(const char *msg) { snac(ICQ_SNACxFAM_LOCATION, ICQ_SNACxLOC_SETxUSERxINFO); if (msg){ encodeString(QString::fromUtf8(msg), "text/plain", 3, 4); }else{ m_socket->writeBuffer.tlv(0x0004); } sendPacket(true); }
void AIMNetManager::SearchByEmail( BMessage* msg ) { // calculate the next request ID emailSearchID = requestID++; // Set up a SNAC object, with the correct fields to search for an address SNAC_Object snac( 0x0a, 0x02, 0x00, 0x00, emailSearchID ); snac.data << (char*)msg->FindString( "email" ); SendSNACPacket( mainNetlet, snac ); }
void ICQClient::setProfile(ICQUserData *data) { snac(ICQ_SNACxFAM_LOCATION, ICQ_SNACxLOC_SETxUSERxINFO); QString profile; if (data->About.ptr) profile = QString::fromUtf8(data->About.ptr); profile = QString("<HTML>") + profile + "</HTML>"; encodeString(profile, "text/aolrtf", 1, 2); sendPacket(false); }
void ICQClientPrivate::deleteGroup(ICQGroup *g) { if (m_state != Logged) return; unsigned short id = client->contacts.getGroupId(g); if (client->contacts.groups.size() <= 1) return; for (list<ICQUser*>::iterator u = client->contacts.users.begin(); u != client->contacts.users.end() ; u++){ if ((*u)->GrpId != id) continue; moveUser(*u, (client->contacts.groups[0] == g) ? client->contacts.groups[1] : client->contacts.groups[0]); } vector<ICQGroup*>::iterator it; for (it = client->contacts.groups.begin(); it != client->contacts.groups.end(); it++) if (*it == g) break; if (it == client->contacts.groups.end()) return; DeleteGroupEvent *e = new DeleteGroupEvent(id); snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_EDIT); sendPacket(); sendRoster(e, ICQ_SNACxLISTS_DELETE, g->Name.c_str(), id, 0, ICQ_GROUPS); snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_SAVE); sendPacket(); }
void ICQClient::sendThroughServer(unsigned long uin, unsigned short type, Buffer &b, unsigned long id_l, unsigned long id_h, bool addTlv) { snac(ICQ_SNACxFAM_MESSAGE, ICQ_SNACxMSG_SENDxSERVER); m_socket->writeBuffer << id_l << id_h; m_socket->writeBuffer << type; m_socket->writeBuffer.packUin(uin); m_socket->writeBuffer.tlv((type == 1) ? 2 : 5, b); if (addTlv && (((id_l == 0) && (id_h == 0)) || (type == 2))) m_socket->writeBuffer.tlv((type == 2) ? 3 : 6); sendPacket(); }
void ICQClient::sendVisibleList() { if (contacts.Invisible() == 0) contacts.Invisible = rand() & 0x7FFF; snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_RENAME, true); writeBuffer << 0x00000000L << contacts.Invisible() << (unsigned short)0x0004 << (unsigned short)0x0005 << 0x00CA0001L << (char)3; sendPacket(); }
void ICQClientPrivate::sendInvisibleList() { if (client->contacts.Invisible == 0) client->contacts.Invisible = rand() & 0x7FFF; snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_RENAME, true); sock->writeBuffer << 0x00000000L << client->contacts.Invisible << (unsigned short)0x0004 << (unsigned short)0x0005 << 0x00CA0001L << (char)4; sendPacket(); }
void ICQClient::moveUser(ICQUser *u, ICQGroup *g) { unsigned short id = contacts.getUserId(u); MoveUserEvent *e = new MoveUserEvent(u->Uin, g->Id()); if (u->Uin() >= UIN_SPECIAL){ if (e->process(this, 0)) process_event(e); delete e; return; } if (m_state != Logged) return; if (!u->GrpId()){ snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_CREATE_USER); writeBuffer.packUin(u->Uin); writeBuffer << 0x00000000L; sendPacket(); } snac(ICQ_SNACxFAM_LISTS, ICQ_SNACxLISTS_EDIT); sendPacket(); sendRoster(e, ICQ_SNACxLISTS_CREATE, u->Uin, g->Id(), id, 0, u->Alias.c_str(), u->WaitAuth()); }
void ICQClient::sendICMB(unsigned short channel, unsigned long flags) { snac(ICQ_SNACxFAM_MESSAGE, ICQ_SNACxMSG_SETxICQxMODE); m_socket->writeBuffer << channel << flags << (unsigned short)8000 // max message size << (unsigned short)999 // max sender warning level << (unsigned short)999 // max receiver warning level << (unsigned short)0 // min message interval << (unsigned short)0; // unknown sendPacket(); }
void MetaInfoManager::sendMetaRequest(Word type, Buffer& metadata) { Tlv tlv(0x01); // ENCAPSULATED_METADATA tlv.addLEWord( metadata.size() + 8 ); // data chunk size (tlv size - 2 ) tlv.addLEDWord( d->uin.toUInt() ); // own UIN tlv.addLEWord(type); tlv.addLEWord( ++(d->metaSequence) ); // request sequence number tlv.addData(metadata); SnacBuffer snac(0x15, 0x02); snac.addTlv(tlv); d->socket->write(snac); }
Spectrum Analyzer::computeSnac(const QVector<double> acf, const QVector<double> signal) const { Spectrum snac(m_sampleSize); const quint32 W = m_sampleSize; qreal mSum = 2 * acf[0]; int tau = 0; for (auto &s : snac) { s = Tone(tau, 2 * acf[tau] / mSum); ++tau; const auto m1 = signal[tau - 1]; const auto m2 = signal[W - tau]; mSum -= m1 * m1 + m2 * m2; } return snac; }