void ICQClient::snac_service(unsigned short type, unsigned short) { switch (type){ case ICQ_SNACxSRV_PAUSE: log(L_DEBUG, "Server pause"); m_bNoSend = true; snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_PAUSExACK); m_socket->writeBuffer << ICQ_SNACxFAM_SERVICE << ICQ_SNACxFAM_LOCATION << ICQ_SNACxFAM_BUDDY << ICQ_SNACxFAM_MESSAGE << ICQ_SNACxFAM_BOS << ICQ_SNACxFAM_PING << ICQ_SNACxFAM_LISTS << ICQ_SNACxFAM_VARIOUS << ICQ_SNACxFAM_LOGIN; sendPacket(true); break; case ICQ_SNACxSRV_RESUME: log(L_DEBUG, "Server resume"); m_bNoSend = false; processSendQueue(); break; case ICQ_SNACxSRV_MIGRATE:{ log(L_DEBUG, "Server migrate"); m_bNoSend = true; int i; unsigned short cnt; unsigned short fam[0x17]; m_socket->readBuffer >> cnt; for (i = 0; i < cnt; i++) { m_socket->readBuffer >> fam[i]; } TlvList tlv(m_socket->readBuffer); Tlv *tlv_adr = tlv(0x05); Tlv *tlv_cookie = tlv(0x06); for (; i >= 0; i--) { setServiceSocket(tlv_adr,tlv_cookie,fam[i]); } break; } case ICQ_SNACxSRV_RATExINFO: case ICQ_SNACxSRV_RATExCHANGE:{ const char *msg_text = NULL; unsigned short msg_code; unsigned short class_id; unsigned long window_size; unsigned long clear_level; unsigned long alert_level; unsigned long limit_level; unsigned long discon_level; unsigned long current_level; unsigned long max_level; unsigned long last_level; char current_state; m_socket->readBuffer >> msg_code >> class_id >> window_size >> clear_level >> alert_level >> limit_level >> discon_level >> current_level >> max_level >> last_level >> current_state; if (type == ICQ_SNACxSRV_RATExCHANGE){ switch (msg_code) { case 0x0001: msg_text = "Rate limits parameters changed"; break; case 0x0002: msg_text = "Rate limits warning"; break; case 0x0003: msg_text = "Rate limit hit"; break; case 0x0004: msg_text = "Rate limit clear"; break; default: msg_text = "Unknown"; } log(L_DEBUG, msg_text); } log(L_DEBUG, "ws: %04X, cl %04X, al %04X, ll %04X, dl: %04X, cur %04X, ml %04X", window_size,clear_level,alert_level,limit_level,discon_level, current_level,max_level); m_winSize = window_size; m_maxLevel = max_level; m_minLevel = alert_level; m_curLevel = current_level; m_lastSend = QDateTime::currentDateTime(); processSendQueue(); } if (type != ICQ_SNACxSRV_RATExINFO) break; snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_RATExACK); m_socket->writeBuffer << 0x00010002L << 0x00030004L << 0x0005; sendPacket(true); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_GETxUSERxINFO); sendPacket(true); listsRequest(); locationRequest(); buddyRequest(); icmbRequest(); bosRequest(); break; case ICQ_SNACxSRV_MOTD: break; case ICQ_SNACxSRV_ACKxIMxICQ: snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_REQxRATExINFO); sendPacket(true); break; case ICQ_SNACxSRV_NAMExINFO:{ string screen = m_socket->readBuffer.unpackScreen(); if (screen.length() == 0){ char n; m_socket->readBuffer >> n; m_socket->readBuffer.incReadPos(n); screen = m_socket->readBuffer.unpackScreen(); } if ((unsigned)atol(screen.c_str()) != data.owner.Uin.value){ log(L_WARN, "No my name info (%s)", screen.c_str()); break; } m_socket->readBuffer.incReadPos(4); TlvList tlv(m_socket->readBuffer); Tlv *tlvIP = tlv(0x000A); if (tlvIP) set_ip(&data.owner.IP, htonl((unsigned long)(*tlvIP))); log(L_DEBUG, "Name info"); break; } case ICQ_SNACxSRV_SERVICExRESP:{ TlvList tlv(m_socket->readBuffer); Tlv *tlv_id = tlv(0x0D); if (!tlv_id){ log(L_WARN, "No service id in response"); break; } Tlv *tlv_adr = tlv(0x05); Tlv *tlv_cookie = tlv(0x06); setServiceSocket(tlv_adr,tlv_cookie,(unsigned short)(*tlv_id)); break; } case ICQ_SNACxSRV_READYxSERVER: log(L_DEBUG, "Server ready"); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_IMxICQ); if (m_bAIM){ m_socket->writeBuffer << 0x00010003L << 0x00130003L << 0x00020001L << 0x00030001L << 0x00040001L << 0x00060001L << 0x00080001L << 0x00090001L << 0x000A0001L << 0x000B0001L; }else{ m_socket->writeBuffer << 0x00010004L << 0x00130004L << 0x00020001L << 0x00030001L << 0x00150001L << 0x00040001L << 0x00060001L << 0x00090001L << 0x000A0001L << 0x000B0001L; } sendPacket(true); break; case ICQ_SNACxSRV_ERROR: break; case ICQ_SNACxSRV_EVIL:{ unsigned short level; m_socket->readBuffer.unpack(level); string from = m_socket->readBuffer.unpackScreen(); data.owner.WarningLevel.value = level; QString f; f = from.c_str(); if (f.isEmpty()) f = i18n("anonymous"); clientErrorData d; d.client = this; d.code = 0; d.err_str = I18N_NOOP("You've been warned by %1"); d.args = strdup(f.utf8()); d.flags = ERR_INFO; d.options = NULL; d.id = CmdShowWarning; Event e(EventClientError, &d); e.process(); free(d.args); break; } default: log(L_WARN, "Unknown service family type %04X", type); }
void ICQClient::snac_service(unsigned short type, unsigned short) { switch (type){ case ICQ_SNACxSRV_PAUSE: log(L_DEBUG, "Server pause"); m_bNoSend = true; snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_PAUSExACK); m_socket->writeBuffer << ICQ_SNACxFAM_SERVICE << ICQ_SNACxFAM_LOCATION << ICQ_SNACxFAM_BUDDY << ICQ_SNACxFAM_MESSAGE << ICQ_SNACxFAM_BOS << ICQ_SNACxFAM_PING << ICQ_SNACxFAM_LISTS << ICQ_SNACxFAM_VARIOUS << ICQ_SNACxFAM_LOGIN; sendPacket(true); break; case ICQ_SNACxSRV_RESUME: log(L_DEBUG, "Server resume"); m_bNoSend = false; processSendQueue(); break; case ICQ_SNACxSRV_MIGRATE:{ log(L_DEBUG, "Server migrate"); m_bNoSend = true; int i; unsigned short cnt; unsigned short fam[0x17]; m_socket->readBuffer >> cnt; for (i = 0; i < cnt; i++) { m_socket->readBuffer >> fam[i]; } TlvList tlv(m_socket->readBuffer); Tlv *tlv_adr = tlv(0x05); Tlv *tlv_cookie = tlv(0x06); for (; i >= 0; i--) { setServiceSocket(tlv_adr,tlv_cookie,fam[i]); } break; } case ICQ_SNACxSRV_RATExCHANGE:{ const char *msg_text = NULL; unsigned short msg_code; unsigned short class_id; unsigned long window_size; unsigned long clear_level; unsigned long alert_level; unsigned long limit_level; unsigned long discon_level; unsigned long current_level; unsigned long max_level; unsigned long last_send; char current_state; m_socket->readBuffer >> msg_code >> class_id >> window_size >> clear_level >> alert_level >> limit_level >> discon_level >> current_level >> max_level >> last_send >> current_state; if (type == ICQ_SNACxSRV_RATExCHANGE){ switch (msg_code) { case 0x0001: msg_text = "Rate limits parameters changed"; break; case 0x0002: msg_text = "Rate limits warning"; break; case 0x0003: msg_text = "Rate limit hit"; break; case 0x0004: msg_text = "Rate limit clear"; break; default: msg_text = "Unknown"; } log(L_DEBUG, "%s", msg_text); } log(L_DEBUG, "grp: %02X, ws: %04lX, cl %04lX, al %04lX, ll %04lX, dl: %04lX, cur %04lX, ml %04lX", class_id,window_size,clear_level,alert_level,limit_level,discon_level, current_level,max_level); if (--class_id < m_rates.size()){ RateInfo &r = m_rates[class_id]; r.m_winSize = window_size; r.m_maxLevel = max_level; r.m_minLevel = alert_level; r.m_curLevel = current_level; r.m_lastSend = QDateTime::currentDateTime(); processSendQueue(); } break; } case ICQ_SNACxSRV_RATExINFO: if (m_rates.size() == 0){ unsigned short n_rates; m_socket->readBuffer >> n_rates; unsigned n; for (n = 0; n < n_rates; n++){ unsigned short class_id; unsigned long window_size; unsigned long clear_level; unsigned long alert_level; unsigned long limit_level; unsigned long discon_level; unsigned long current_level; unsigned long max_level; unsigned long last_send; char current_state; m_socket->readBuffer >> class_id >> window_size >> clear_level >> alert_level >> limit_level >> discon_level >> current_level >> max_level >> last_send >> current_state; log(L_DEBUG, "grp: %02X, ws: %04lX, cl %04lX, al %04lX, ll %04lX, dl: %04lX, cur %04lX, ml %04lX", class_id,window_size,clear_level,alert_level,limit_level,discon_level, current_level,max_level); RateInfo r; r.m_winSize = window_size; r.m_minLevel = alert_level; r.m_maxLevel = max_level; r.m_curLevel = current_level; r.m_lastSend = QDateTime::currentDateTime(); m_rates.push_back(r); } for (n = 0; n < n_rates; n++){ unsigned short class_id; unsigned short pairs; m_socket->readBuffer >> class_id >> pairs; class_id--; for (unsigned i = 0; i < pairs; i++){ unsigned long snac; m_socket->readBuffer >> snac; if (class_id >= m_rates.size()) continue; RATE_MAP::iterator it = m_rate_grp.find(snac); if (it != m_rate_grp.end()) continue; m_rate_grp.insert(RATE_MAP::value_type(snac, class_id)); } } snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_RATExACK); m_socket->writeBuffer << 0x00010002L << 0x00030004L << 0x0005; sendPacket(true); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_GETxUSERxINFO); sendPacket(true); listsRequest(); locationRequest(); buddyRequest(); icmbRequest(); bosRequest(); } break; case ICQ_SNACxSRV_MOTD: break; case ICQ_SNACxSRV_ACKxIMxICQ: snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_REQxRATExINFO); sendPacket(true); break; case ICQ_SNACxSRV_NAMExINFO:{ string screen = m_socket->readBuffer.unpackScreen(); if (screen.length() == 0){ char n; m_socket->readBuffer >> n; m_socket->readBuffer.incReadPos(n); screen = m_socket->readBuffer.unpackScreen(); } if ((unsigned)atol(screen.c_str()) != data.owner.Uin.value){ log(L_WARN, "No my name info (%s)", screen.c_str()); break; } m_socket->readBuffer.incReadPos(4); TlvList tlv(m_socket->readBuffer); Tlv *tlvIP = tlv(0x000A); if (tlvIP) set_ip(&data.owner.IP, htonl((unsigned long)(*tlvIP))); break; }
void ICQClient::snac_service(unsigned short type, unsigned short) { switch (type){ case ICQ_SNACxSRV_RATExCHANGE: log(L_DEBUG, "Rate change"); if (m_nSendTimeout < 200){ m_nSendTimeout = m_nSendTimeout + 2; if (m_sendTimer->isActive()){ m_sendTimer->stop(); m_sendTimer->start(m_nSendTimeout * 500); } } break; case ICQ_SNACxSRV_RATExINFO: log(L_DEBUG, "Rate info"); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_RATExACK); m_socket->writeBuffer << 0x00010002L << 0x00030004L << 0x0005; sendPacket(); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_GETxUSERxINFO); sendPacket(); listsRequest(); locationRequest(); buddyRequest(); icmbRequest(); bosRequest(); break; case ICQ_SNACxSRV_MOTD: log(L_DEBUG, "Motd"); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_REQxRATExINFO); sendPacket(); break; case ICQ_SNACxSRV_ACKxIMxICQ: log(L_DEBUG, "Ack im icq"); break; case ICQ_SNACxSRV_NAMExINFO:{ string screen = m_socket->readBuffer.unpackScreen(); if (screen.length() == 0){ char n; m_socket->readBuffer >> n; m_socket->readBuffer.incReadPos(n); screen = m_socket->readBuffer.unpackScreen(); } if (atol(screen.c_str()) != data.owner.Uin){ log(L_WARN, "No my name info (%s)", screen.c_str()); break; } m_socket->readBuffer.incReadPos(4); TlvList tlv(m_socket->readBuffer); Tlv *tlvIP = tlv(0x000A); if (tlvIP) set_ip(&data.owner.IP, htonl((unsigned long)(*tlvIP))); log(L_DEBUG, "Name info"); break; } case ICQ_SNACxSRV_READYxSERVER: log(L_DEBUG, "Server ready"); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_IMxICQ); m_socket->writeBuffer << 0x00010003L << 0x00130002L << 0x00020001L << 0x00030001L << 0x00150001L << 0x00040001L << 0x00060001L << 0x00090001L << 0x000a0001L << 0x000b0001L; sendPacket(); break; case ICQ_SNACxSRV_ERROR: break; default: log(L_WARN, "Unknown service family type %04X", type); }
void ICQClient::snac_service(unsigned short type, unsigned short) { switch (type){ case ICQ_SNACxSRV_PAUSE: log(L_DEBUG, "Server pause"); /* we now shouldn't send any packets to the server ... but I don't know how to solve this. Valdimir do you have an idea? */ /* m_bDontSendPakets = true; */ snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_PAUSExACK); m_socket->writeBuffer << ICQ_SNACxFAM_SERVICE << ICQ_SNACxFAM_LOCATION << ICQ_SNACxFAM_BUDDY << ICQ_SNACxFAM_MESSAGE << ICQ_SNACxFAM_BOS << ICQ_SNACxFAM_PING << ICQ_SNACxFAM_LISTS << ICQ_SNACxFAM_VARIOUS << ICQ_SNACxFAM_LOGIN; sendPacket(); break; case ICQ_SNACxSRV_RESUME: /* m_bDontSendPakets = true; emit canSendPakets(); */ break; case ICQ_SNACxSRV_MIGRATE:{ int i; unsigned short cnt; unsigned short fam[0x17]; m_socket->readBuffer >> cnt; for (i = 0; i < cnt; i++) { m_socket->readBuffer >> fam[i]; } TlvList tlv(m_socket->readBuffer); Tlv *tlv_adr = tlv(0x05); Tlv *tlv_cookie = tlv(0x06); for (; i >= 0; i--) { setServiceSocket(tlv_adr,tlv_cookie,fam[i]); } /* m_bDontSendPakets = true; emit canSendPakets(); */ break; } case ICQ_SNACxSRV_RATExCHANGE: log(L_DEBUG, "Rate change"); if (m_nSendTimeout < 200){ m_nSendTimeout = m_nSendTimeout + 2; if (m_sendTimer->isActive()){ m_sendTimer->stop(); m_sendTimer->start(m_nSendTimeout * 500); } } break; case ICQ_SNACxSRV_RATExINFO: snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_RATExACK); m_socket->writeBuffer << 0x00010002L << 0x00030004L << 0x0005; sendPacket(); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_GETxUSERxINFO); sendPacket(); listsRequest(); locationRequest(); buddyRequest(); icmbRequest(); bosRequest(); break; case ICQ_SNACxSRV_MOTD: break; case ICQ_SNACxSRV_ACKxIMxICQ: snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_REQxRATExINFO); sendPacket(); break; case ICQ_SNACxSRV_NAMExINFO:{ string screen = m_socket->readBuffer.unpackScreen(); if (screen.length() == 0){ char n; m_socket->readBuffer >> n; m_socket->readBuffer.incReadPos(n); screen = m_socket->readBuffer.unpackScreen(); } if ((unsigned)atol(screen.c_str()) != data.owner.Uin.value){ log(L_WARN, "No my name info (%s)", screen.c_str()); break; } m_socket->readBuffer.incReadPos(4); TlvList tlv(m_socket->readBuffer); Tlv *tlvIP = tlv(0x000A); if (tlvIP) set_ip(&data.owner.IP, htonl((unsigned long)(*tlvIP))); log(L_DEBUG, "Name info"); break; } case ICQ_SNACxSRV_SERVICExRESP:{ TlvList tlv(m_socket->readBuffer); Tlv *tlv_id = tlv(0x0D); if (!tlv_id){ log(L_WARN, "No service id in response"); break; } Tlv *tlv_adr = tlv(0x05); Tlv *tlv_cookie = tlv(0x06); setServiceSocket(tlv_adr,tlv_cookie,(unsigned short)(*tlv_id)); break; } case ICQ_SNACxSRV_READYxSERVER: log(L_DEBUG, "Server ready"); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_IMxICQ); if (m_bAIM){ m_socket->writeBuffer << 0x00010003L << 0x00130003L << 0x00020001L << 0x00030001L << 0x00040001L << 0x00060001L << 0x00080001L << 0x00090001L << 0x000A0001L << 0x000B0001L; }else{ m_socket->writeBuffer << 0x00010004L << 0x00130004L << 0x00020001L << 0x00030001L << 0x00150001L << 0x00040001L << 0x00060001L << 0x00090001L << 0x000A0001L << 0x000B0001L; } sendPacket(); break; case ICQ_SNACxSRV_ERROR: break; case ICQ_SNACxSRV_EVIL:{ unsigned short level; m_socket->readBuffer.unpack(level); string from = m_socket->readBuffer.unpackScreen(); data.owner.WarningLevel.value = level; QString f; f = from.c_str(); if (f.isEmpty()) f = i18n("anonymous"); clientErrorData d; d.client = this; d.code = 0; d.err_str = I18N_NOOP("You've been warned by %1"); d.args = strdup(f.utf8()); Event e(EventClientError, &d); e.process(); free(d.args); break; } default: log(L_WARN, "Unknown service family type %04X", type); }
void ICQClient::snac_service(unsigned short type, unsigned short) { switch (type){ case ICQ_SNACxSRV_RATExCHANGE: log(L_DEBUG, "Rate change"); if (m_nSendTimeout < 200){ m_nSendTimeout = m_nSendTimeout + 2; if (m_sendTimer->isActive()){ m_sendTimer->stop(); m_sendTimer->start(m_nSendTimeout * 500); } } break; case ICQ_SNACxSRV_RATExINFO: snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_RATExACK); m_socket->writeBuffer << 0x00010002L << 0x00030004L << 0x0005; sendPacket(); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_GETxUSERxINFO); sendPacket(); listsRequest(); locationRequest(); buddyRequest(); icmbRequest(); bosRequest(); break; case ICQ_SNACxSRV_MOTD: break; case ICQ_SNACxSRV_ACKxIMxICQ: snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_REQxRATExINFO); sendPacket(); break; case ICQ_SNACxSRV_NAMExINFO:{ string screen = m_socket->readBuffer.unpackScreen(); if (screen.length() == 0){ char n; m_socket->readBuffer >> n; m_socket->readBuffer.incReadPos(n); screen = m_socket->readBuffer.unpackScreen(); } if ((unsigned)atol(screen.c_str()) != data.owner.Uin){ log(L_WARN, "No my name info (%s)", screen.c_str()); break; } m_socket->readBuffer.incReadPos(4); TlvList tlv(m_socket->readBuffer); Tlv *tlvIP = tlv(0x000A); if (tlvIP) set_ip(&data.owner.IP, htonl((unsigned long)(*tlvIP))); log(L_DEBUG, "Name info"); break; } case ICQ_SNACxSRV_READYxSERVER: log(L_DEBUG, "Server ready"); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_IMxICQ); if (m_bAIM){ m_socket->writeBuffer << 0x00010003L << 0x00130003L << 0x00020001L << 0x00030001L << 0x00040001L << 0x00060001L << 0x00080001L << 0x00090001L << 0x000A0001L << 0x000B0001L; }else{ m_socket->writeBuffer << 0x00010004L << 0x00130004L << 0x00020001L << 0x00030001L << 0x00150001L << 0x00040001L << 0x00060001L << 0x00090001L << 0x000A0001L << 0x000B0001L; } sendPacket(); break; case ICQ_SNACxSRV_ERROR: break; case ICQ_SNACxSRV_EVIL:{ unsigned short level; m_socket->readBuffer.unpack(level); string from = m_socket->readBuffer.unpackScreen(); data.owner.WarningLevel = level; QString f; f = from.c_str(); if (f.isEmpty()) f = i18n("anonymous"); clientErrorData d; d.client = this; d.code = 0; d.err_str = I18N_NOOP("You've been warned by %1"); d.args = strdup(f.utf8()); Event e(EventClientError, &d); e.process(); free(d.args); break; } default: log(L_WARN, "Unknown service family type %04X", type); }
void ICQClient::snac_service(unsigned short type, unsigned short) { switch (type){ case ICQ_SNACxSRV_RATExCHANGE: log(L_DEBUG, "Rate change"); if (m_nSendTimeout < 200){ m_nSendTimeout = m_nSendTimeout + 2; if (m_sendTimer->isActive()){ m_sendTimer->stop(); m_sendTimer->start(m_nSendTimeout * 500); } } break; case ICQ_SNACxSRV_RATExINFO: snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_RATExACK); m_socket->writeBuffer << 0x00010002L << 0x00030004L << 0x0005; sendPacket(); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_GETxUSERxINFO); sendPacket(); listsRequest(); locationRequest(); buddyRequest(); icmbRequest(); bosRequest(); break; case ICQ_SNACxSRV_MOTD: break; case ICQ_SNACxSRV_ACKxIMxICQ: snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_REQxRATExINFO); sendPacket(); break; case ICQ_SNACxSRV_NAMExINFO:{ string screen = m_socket->readBuffer.unpackScreen(); if (screen.length() == 0){ char n; m_socket->readBuffer >> n; m_socket->readBuffer.incReadPos(n); screen = m_socket->readBuffer.unpackScreen(); } if ((unsigned)atol(screen.c_str()) != data.owner.Uin){ log(L_WARN, "No my name info (%s)", screen.c_str()); break; } m_socket->readBuffer.incReadPos(4); TlvList tlv(m_socket->readBuffer); Tlv *tlvIP = tlv(0x000A); if (tlvIP) set_ip(&data.owner.IP, htonl((unsigned long)(*tlvIP))); log(L_DEBUG, "Name info"); break; } case ICQ_SNACxSRV_SERVICExRESP:{ TlvList tlv(m_socket->readBuffer); Tlv *tlv_id = tlv(0x0D); if (tlv_id == NULL){ log(L_WARN, "No service id in response"); break; } ServiceSocket *s = NULL; for (list<ServiceSocket*>::iterator it = m_services.begin(); it != m_services.end(); ++it){ if ((*it)->id() == (unsigned short)(*tlv_id)){ s = *it; break; } } if (s == NULL){ log(L_WARN, "Service not found"); break; } Tlv *tlv_addr = tlv(0x05); if (tlv_addr == NULL){ s->error_state("No address for service", 0); break; } Tlv *tlv_cookie = tlv(0x06); if (tlv_cookie == NULL){ s->error_state("No cookie for service", 0); break; } unsigned short port = getPort(); string addr; addr = (const char*)(*tlv_addr); char *p = (char*)strchr(addr.c_str(), ':'); if (p){ *p = 0; port = (unsigned short)atol(p + 1); } s->connect(addr.c_str(), port, *tlv_cookie, tlv_cookie->Size()); break; } case ICQ_SNACxSRV_READYxSERVER: log(L_DEBUG, "Server ready"); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_IMxICQ); if (m_bAIM){ m_socket->writeBuffer << 0x00010003L << 0x00130003L << 0x00020001L << 0x00030001L << 0x00040001L << 0x00060001L << 0x00080001L << 0x00090001L << 0x000A0001L << 0x000B0001L; }else{ m_socket->writeBuffer << 0x00010004L << 0x00130004L << 0x00020001L << 0x00030001L << 0x00150001L << 0x00040001L << 0x00060001L << 0x00090001L << 0x000A0001L << 0x000B0001L; } sendPacket(); break; case ICQ_SNACxSRV_ERROR: break; case ICQ_SNACxSRV_EVIL:{ unsigned short level; m_socket->readBuffer.unpack(level); string from = m_socket->readBuffer.unpackScreen(); data.owner.WarningLevel = level; QString f; f = from.c_str(); if (f.isEmpty()) f = i18n("anonymous"); clientErrorData d; d.client = this; d.code = 0; d.err_str = I18N_NOOP("You've been warned by %1"); d.args = strdup(f.utf8()); Event e(EventClientError, &d); e.process(); free(d.args); break; } default: log(L_WARN, "Unknown service family type %04X", type); }
void ICQClient::snac_service(unsigned short type, unsigned short) { switch (type){ case ICQ_SNACxSRV_RATExCHANGE: break; case ICQ_SNACxSRV_RATExINFO: log(L_DEBUG, "Rate info"); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_RATExACK); writeBuffer << 0x00010002L << 0x00030004L << 0x0005; sendPacket(); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_GETxUSERxINFO); sendPacket(); listsRequest(); locationRequest(); buddyRequest(); messageRequest(); bosRequest(); break; case ICQ_SNACxSRV_MOTD: log(L_DEBUG, "Motd"); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_REQxRATExINFO); sendPacket(); break; case ICQ_SNACxSRV_ACKxIMxICQ: log(L_DEBUG, "Ack im icq"); break; case ICQ_SNACxSRV_NAMExINFO:{ unsigned long uin = readBuffer.unpackUin(); if (uin == 0){ char n; readBuffer >> n; readBuffer.incReadPos(n); uin = readBuffer.unpackUin(); } if (uin != Uin()){ log(L_WARN, "No my name info (%lu)", uin); break; } readBuffer.incReadPos(4); TlvList tlv(readBuffer); Tlv *tlvIP = tlv(0x000A); if (tlvIP) RealIP = htonl((unsigned long)(*tlvIP)); log(L_DEBUG, "Name info"); bool bSend = true; if (needPhonebookUpdate){ sendInfoUpdate(); needPhonebookUpdate = false; bSend = false; } if (needPhoneStatusUpdate){ sendPhoneStatus(); needPhoneStatusUpdate = false; bSend = false; } break; } case ICQ_SNACxSRV_READYxSERVER: log(L_DEBUG, "Server ready"); snac(ICQ_SNACxFAM_SERVICE, ICQ_SNACxSRV_IMxICQ); writeBuffer << 0x00010003L; writeBuffer << 0x00130002L; writeBuffer << 0x00020001L; writeBuffer << 0x00030001L; writeBuffer << 0x00150001L; writeBuffer << 0x00040001L; writeBuffer << 0x00060001L; writeBuffer << 0x00090001L; writeBuffer << 0x000a0001L; writeBuffer << 0x000b0001L; sendPacket(); break; default: log(L_WARN, "Unknown service family type %04X", type); }