bool FindContactsMetaRequest::handleData(quint16 type, const DataUnit &data) { Q_D(FindContactsMetaRequest); if (type != 0x01A4 && type != 0x01AE) return false; data.skipData(2); // data size FoundContact contact; contact.uin = QString::number(data.read<quint32>(LittleEndian)); contact.nick = readSString(data); contact.firstName = readSString(data); contact.lastName = readSString(data); contact.email = readSString(data); contact.authFlag = data.read<quint8>(); contact.status = static_cast<Status>(data.read<quint16>(LittleEndian)); contact.gender = genders().value(data.read<quint8>()); contact.age = data.read<quint16>(LittleEndian); qDebug() << "Contact found" << contact.uin << contact.nick << contact.firstName << contact.lastName << contact.email << contact.authFlag << contact.status << contact.gender << contact.age; emit contactFound(contact); d->contacts.insert(contact.uin, contact); if (type == 0x01AE) close(true); return true; }
void FullInfoMetaRequestPrivate::handleMoreInfo(const DataUnit &data) { quint16 age = data.read<quint16>(LittleEndian); if (age != 0) values.insert(Age, age); { quint8 genderId = data.read<quint8>(); if (genderId) values.insert(Gender, genders().value(genderId)); } readString(Homepage, data); { quint16 y = data.read<quint16>(LittleEndian); quint8 m = data.read<quint8>(); quint8 d = data.read<quint8>(); if (QDate::isValid(y, m, d)) values.insert(Birthday, QDate(y, m, d)); } { QStringList langList; for (int i = 0; i < 3; ++i) { QString lang = languages().value(data.read<quint8>()); if (!lang.isEmpty()) langList << lang; } if (!langList.isEmpty()) values.insert(Languages, langList); } data.skipData(2); // 0x0000 unknown readString(OriginalCity, data); readString(OriginalState, data); readField<quint16>(OriginalCountry, data, countries()); values.insert(GMT, data.read<qint8>()); }
bool ShortInfoMetaRequest::handleData(quint16 type, const DataUnit &data) { Q_D(ShortInfoMetaRequest); if (type != 0x0104) return false; d->readString(Nick, data); d->readString(FirstName, data); d->readString(LastName, data); d->readString(Email, data); d->readFlag(AuthFlag, data); data.skipData(2); // 0x00 unknown { quint8 genderId = data.read<quint8>(); if (genderId) d->values.insert(Gender, genders().value(genderId)); } debug() << d->uin << "short info:"; d->dump(); close(true); return true; }
void OftSocket::onReadyRead() { if (m_state & Proxy) { DataUnit data; if (m_len == 0) { if (bytesAvailable() <= 4) return; data.setData(read(4)); m_len = data.read<quint16>() - 2; if (data.read<quint16>() != 0x044A) debug() << "Unknown proxy protocol version"; } if (bytesAvailable() <= m_len) { data.setData(read(m_len)); m_len = 0; } else { return; } quint16 type = data.read<quint16>(); data.skipData(4); // unknown quint16 flags = data.read<quint16>(); Q_UNUSED(flags); debug() << "Rendezvous proxy packet. Type" << type; switch (type) { case 0x0001 : { // error quint16 code = data.read<quint16>(); QString str; if (code == 0x000d || code == 0x000e) str = "Bad Request"; else if (code == 0x0010) str = "Initial Request Timed Out"; else if (code == 0x001a) str = "Accept Period Timed Out"; else str = QString("Unknown rendezvous proxy error: %1").arg(code); debug() << "Rendezvous proxy error:" << str; setSocketError(QAbstractSocket::ProxyProtocolError); setErrorString(str); emit error(QAbstractSocket::ProxyProtocolError); break; } case 0x0003 : { // Acknowledge if (m_state != ProxyInit) { setSocketError(QAbstractSocket::ProxyProtocolError); setErrorString("Rendezvous proxy acknowledge packets are forbidden"); emit error(QAbstractSocket::ProxyProtocolError); break; } m_proxyPort = data.read<quint16>(); m_proxyIP.setAddress(data.read<quint32>()); emit proxyInitialized(); break; } case 0x0005 : { // Ready m_state = ReadHeader; emit initialized(); break; } default: setSocketError(QAbstractSocket::ProxyProtocolError); setErrorString(QString("Unknown rendezvous proxy request").arg(type)); emit error(QAbstractSocket::ProxyProtocolError); } } else { if (m_state == ReadHeader) { m_lastHeader.readData(this, m_client->asciiCodec()); if (m_lastHeader.isFinished()) { m_state = ReadData; emit headerReaded(m_lastHeader); } } if (m_state == ReadData && bytesAvailable() > 0) emit newData(); } }