void MoreInfo::fill() { ICQUserData *data = m_data; if (data == NULL) data = &m_client->data.owner; edtHomePage->setText(data->getHomepage()); initCombo(cmbGender, data->getGender(), genders); if (spnAge->text() == "0") spnAge->setSpecialValueText(QString::null); if (data->getBirthYear() > 0 && data->getBirthMonth() > 0 && data->getBirthDay() > 0) { QDate date; date.setYMD(data->getBirthYear(), data->getBirthMonth(), data->getBirthDay()); edtDate->setDate(date); birthDayChanged(); } unsigned l = data->getLanguage(); char l1 = (char)(l & 0xFF); l = l >> 8; char l2 = (char)(l & 0xFF); l = l >> 8; char l3 = (char)(l & 0xFF); initCombo(cmbLang1, l1, languages); initCombo(cmbLang2, l2, languages); initCombo(cmbLang3, l3, languages); setLang(0); urlChanged(edtHomePage->text()); }
void HomeInfo::fill() { ICQUserData *data = m_data; if (data == NULL) data = &m_client->data.owner; edtAddress->setPlainText(data->getAddress()); edtCity->setText(data->getCity()); edtState->setText(data->getState()); edtZip->setText(data->getZip()); initCombo(cmbCountry, data->getCountry(), getCountries()); initTZCombo(cmbZone, data->getTimeZone()); }
void AIMInfo::fill() { ICQUserData *data = m_data; if (data == NULL) data = &m_client->data.owner; edtScreen->setText(data->getScreen()); edtFirst->setText(data->getFirstName()); edtLast->setText(data->getLastName()); edtMiddle->setText(data->getMiddleName()); edtMaiden->setText(data->getMaiden()); edtNick->setText(data->getNick()); edtStreet->setText(data->getAddress()); edtCity->setText(data->getCity()); edtState->setText(data->getState()); edtZip->setText(data->getZip()); initCombo(cmbCountry, data->getCountry(), getCountries()); if (m_data == NULL){ if (edtFirst->text().isEmpty()) { QString firstName = getContacts()->owner()->getFirstName(); firstName = getToken(firstName, '/'); edtFirst->setText(firstName); } if (edtLast->text().isEmpty()) { QString lastName = getContacts()->owner()->getLastName(); lastName = getToken(lastName, '/'); edtLast->setText(lastName); } } cmbStatus->clear(); unsigned status = STATUS_ONLINE; if (m_data){ switch (m_data->getStatus()){ case STATUS_ONLINE: case STATUS_OFFLINE: status = m_data->getStatus(); break; default: status = STATUS_AWAY; } }else{ status = m_client->getStatus(); } if (m_data && !m_data->getAutoReply().isEmpty()){ edtAutoReply->setPlainText(m_data->getAutoReply()); }else{ edtAutoReply->hide(); } int current = 0; QString text; ProtocolPtr proto = ICQPlugin::icq_plugin->m_aim; AIMProtocol* aim = static_cast<AIMProtocol*>(proto.data()); for (const CommandDef *cmd = aim->statusList(); cmd->id; cmd++){ if (cmd->flags & COMMAND_CHECK_STATE) continue; if (status == cmd->id){ current = cmbStatus->count(); text = cmd->text; } cmbStatus->addItem(Pict(cmd->icon), i18n(cmd->text)); } cmbStatus->setCurrentIndex(current); disableWidget(cmbStatus); if (status == STATUS_OFFLINE){ lblOnline->setText(i18n("Last online") + ':'); edtOnline->setText(formatDateTime(QDateTime::fromTime_t(data->getStatusTime()))); lblNA->hide(); edtNA->hide(); }else{ if (data->getOnlineTime()){ edtOnline->setText(formatDateTime(QDateTime::fromTime_t(data->getOnlineTime()))); }else{ lblOnline->hide(); edtOnline->hide(); } if ((status == STATUS_ONLINE) || text.isEmpty()){ lblNA->hide(); edtNA->hide(); }else{ lblNA->setText(i18n(text)); edtNA->setText(formatDateTime(QDateTime::fromTime_t(data->getStatusTime()))); } } if (data->getIP()){ edtExtIP->setText(formatAddr(data->getIP(), data->getPort())); }else{ lblExtIP->hide(); edtExtIP->hide(); } if (data->getRealIP() && ((data->getIP() == 0) || ((data->getIP()) != (data->getRealIP())))){ edtIntIP->setText(formatAddr(data->getRealIP(), data->getPort())); }else{ lblIntIP->hide(); edtIntIP->hide(); } if (m_data){ QString client_name = m_client->clientName(data); if (client_name.length()){ edtClient->setText(client_name); }else{ lblClient->hide(); edtClient->hide(); } }else{ QString name = PACKAGE; name += ' '; name += VERSION; #ifdef WIN32 name += "/win32"; #endif edtClient->setText(name); } }
bool SnacIcqBuddy::process(unsigned short subtype, ICQBuffer* buf, unsigned short seq) { switch (subtype) { case ICQ_SNACxBDY_RIGHTSxGRANTED: log(L_DEBUG, "Buddy rights granted"); break; case ICQ_SNACxBDY_USEROFFLINE: { Contact *contact; QString screen = buf->unpackScreen(); log(L_DEBUG, "Buddy offline: %s", qPrintable(screen)); ICQUserData *data = m_client->findContact(screen, NULL, false, contact); if(!data) break; if(data->getStatus() != ICQ_STATUS_OFFLINE) { m_client->setOffline(data); StatusMessage *m = new StatusMessage; m->setContact(contact->id()); m->setClient(m_client->dataName(data)); m->setStatus(STATUS_OFFLINE); m->setFlags(MESSAGE_RECEIVED); EventMessageReceived e(m); if(!e.process()) delete m; } else { // hack for trillian EventContact e(contact, EventContact::eOnline); e.process(); } break; } case ICQ_SNACxBDY_USERONLINE: { Contact *contact; QString screen = buf->unpackScreen(); log(L_DEBUG, "Buddy online: %s", qPrintable(screen)); ICQUserData *data = m_client->findContact(screen, NULL, false, contact); if(data) { bool bChanged = false; bool bAwayChanged = false; unsigned long prevStatus = data->getStatus(); unsigned short level, len; (*buf) >> level >> len; data->setWarningLevel(level); TlvList tlv((*buf)); Tlv* tlvClass = tlv(TLV_USER_CLASS); if(tlvClass) { unsigned short userClass = *tlvClass; if(userClass != data->getClass()) { if ((userClass & CLASS_AWAY) != (data->getClass() & CLASS_AWAY)) { data->setStatusTime((unsigned long)time(NULL)); bAwayChanged = true; } data->setClass(userClass); bChanged = true; } if(data->getUin() == 0) { if (userClass & CLASS_AWAY) { m_client->fetchAwayMessage(data); } else { data->setAutoReply(QString::null); } } } // Status TLV Tlv *tlvStatus = tlv(TLV_USER_STATUS); if(tlvStatus) { uint32_t status = *tlvStatus; if (status != data->getStatus()) { data->setStatus(status); if ((status & 0xFF) == 0) data->setAutoReply(QString::null); data->setStatusTime((unsigned long)time(NULL)); } } else if(data->getStatus() == ICQ_STATUS_OFFLINE) { data->setStatus(ICQ_STATUS_ONLINE); data->setStatusTime((unsigned long)time(NULL)); } // Online time TLV Tlv *tlvOnlineTime = tlv(TLV_USER_SIGNON_TIME); if(tlvOnlineTime) { uint32_t OnlineTime = *tlvOnlineTime; if(OnlineTime != data->getOnlineTime()) { data->setOnlineTime(OnlineTime); bChanged = true; } } Tlv *tlvNATime = tlv(0x0004); if(tlvNATime) { unsigned short na_time = *tlvNATime; unsigned long StatusTime = (unsigned long)time(NULL) - na_time * 60; if(StatusTime != data->getStatusTime()) { data->setStatusTime(StatusTime); bChanged = true; } } // IP TLV Tlv *tlvIP = tlv(TLV_USER_EXT_IP); unsigned long oldip = data->getIP(); data->setIP(htonl((uint32_t)(*tlvIP))); if(tlvIP) bChanged |= oldip != data->getIP(); // short caps tlv Tlv *tlvCapShort = tlv(TLV_USER_NEWCAPS); if(tlvCapShort) { data->setCaps(0); data->setCaps2(0); ICQBuffer info(*tlvCapShort); for (; info.readPos() < (unsigned)info.size(); ) { unsigned char shortcap[2]; info.unpack((char*)shortcap, sizeof(shortcap)); for (unsigned i = 0;; i++) { if (!memcmp(m_client->capabilities[i],"\x00\x00\x00\x00", 4)) { log(L_DEBUG, "%lu unknown cap %s", data->getUin(), makeCapStr(shortcap, sizeof(shortcap)).toLatin1().data()); break; } // we don't go through all caps, only the starting with 0x09 if (*m_client->capabilities[i] != '\x09') continue; if(!memcmp(&m_client->capabilities[i][2], shortcap, sizeof(shortcap))) { m_client->setCap(data, (cap_id_t)i); break; } } } } // normal cap tlv Tlv *tlvCapability = tlv(TLV_USER_CAPS); if (tlvCapability) { if(!tlvCapShort) { data->setCaps(0); data->setCaps2(0); } ICQBuffer info(*tlvCapability); for(; info.readPos() < (unsigned)info.size(); ) { capability cap; info.unpack((char*)cap, sizeof(capability)); for(unsigned i = 0;; i++) { unsigned size = sizeof(capability); if (i == CAP_SIMOLD) size--; if (!memcmp(m_client->capabilities[i], "\x00\x00\x00\x00", 4)) { log( L_DEBUG, "%lu unknown cap %s", data->getUin(), qPrintable(makeCapStr( cap, size )) ); break; } if (i == CAP_MICQ || i == CAP_LICQ || i == CAP_SIM || i == CAP_KOPETE || i == CAP_QIP2010) size -= 4; if (i == CAP_ANDRQ) size -= 7; if (i == CAP_MIRANDA) size -= 8; if ((i == CAP_JIMM)) size -= 11; if (i == CAP_ICQJP) size -= (16 - 4); if (!memcmp(cap, m_client->capabilities[i], size)) { if (i == CAP_SIMOLD) { unsigned char build = cap[sizeof(capability)-1]; if (build && (build == 0x92 || build < (1 << 6))) continue; data->setBuild(build); } if (i == CAP_MICQ || i == CAP_LICQ || i == CAP_SIM || i == CAP_KOPETE) { unsigned char *p = (unsigned char*)cap; p += 12; data->setBuild((p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]); } if (i == CAP_ANDRQ) { unsigned char *p = (unsigned char*)cap; p += 9; data->setBuild((p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]); } if (i == CAP_MIRANDA) { unsigned char *p = (unsigned char*)cap; p += 8; data->setBuild((p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]); } if (i == CAP_JIMM) { char *p = (char*)cap; p += 5; const QString str = QString::fromAscii(p, 10); const QStringList sl = str.split('.'); unsigned char maj = 0, min = 0; unsigned short rev = 0; if(sl.count() > 0) maj = sl[0].toUShort(); if(sl.count() > 1) min = sl[1].toUShort(); if(sl.count() > 2) rev = sl[2].toUShort(); data->setBuild((maj << 24) + (min << 16) + rev); } if (i == CAP_ICQJP) { log(L_DEBUG, "%lu ICQJP cap is set", data->getUin()); data->setBuild(cap[0x4] << 0x18 | cap[0x5] << 0x10 | cap[0x6] << 8 | cap[0x7]); } m_client->setCap(data, (cap_id_t)i); break; } } } } // buddy info Tlv *tlvBuddy = tlv(TLV_USER_BUDDYINFO); if (tlvBuddy) { QByteArray ba = data->getBuddyHash(); unsigned short iconID; unsigned char iconFlags, hashSize; ICQBuffer info(*tlvBuddy); QByteArray hash; QString fname = m_client->pictureFile(data); QFileInfo fi(fname); info >> iconID >> iconFlags >> hashSize; hash.resize(hashSize); info.unpack(hash.data(), hashSize); if(data->getBuddyID() != iconID || ba != hash || !fi.exists() || fi.size() == 0) { data->setBuddyID(iconID); data->setBuddyHash(hash); m_client->requestBuddy(data); } } unsigned long infoUpdateTime = 0; unsigned long pluginInfoTime = 0; unsigned long pluginStatusTime = 0; // Direct connection info Tlv *tlvDirect = tlv(TLV_USER_DC_INFO); if(tlvDirect) { ICQBuffer info(*tlvDirect); unsigned long realIP; unsigned short port; char mode, version, junk; info >> realIP; info.incReadPos(2); info >> port; if (realIP == 0x7F000001) realIP = 0; unsigned long oldip = data->getRealIP(); data->setRealIP(htonl(realIP)); bChanged |= oldip != data->getRealIP(); data->setPort(port); unsigned long DCcookie; info >> mode >> junk >> version >> DCcookie; data->setDCcookie(DCcookie); info.incReadPos(8); info >> infoUpdateTime >> pluginInfoTime >> pluginStatusTime; if (mode == MODE_DENIED || mode != MODE_DIRECT && mode != MODE_INDIRECT) mode = MODE_INDIRECT; data->setMode(mode); data->setVersion(version); } Tlv *tlvPlugin = tlv(0x0011); if(tlvPlugin && data->getUin()) { ICQBuffer info(*tlvPlugin); char type; unsigned long time; info >> type; info.unpack(time); plugin p; unsigned plugin_index; unsigned long plugin_status; switch (type){ case 1: m_client->addFullInfoRequest(data->getUin()); break; case 2: if (!m_client->getInvisible() && data->getInvisibleId() == 0 || m_client->getInvisible() && data->getVisibleId()){ info.incReadPos(6); info.unpack((char*)p, sizeof(p)); data->setPluginInfoTime(time); for (plugin_index = 0; plugin_index < PLUGIN_NULL; plugin_index++) if (!memcmp(p, m_client->plugins[plugin_index], sizeof(p))) break; switch (plugin_index) { case PLUGIN_PHONEBOOK: log(L_DEBUG, "Updated phonebook"); m_client->addPluginInfoRequest(data->getUin(), plugin_index); break; case PLUGIN_PICTURE: log(L_DEBUG, "Updated picture"); // when buddyID -> new avatar support, no need to ask for old picture plugin if(data->getBuddyID() == 0 || data->getBuddyHash().size() != 16) { data->setBuddyID(0); m_client->addPluginInfoRequest(data->getUin(), plugin_index); } break; case PLUGIN_QUERYxINFO: log(L_DEBUG, "Updated info plugin list"); m_client->addPluginInfoRequest(data->getUin(), plugin_index); break; default: if (plugin_index >= PLUGIN_NULL) log(L_WARN, "Unknown plugin sign (%04X %04X)", type, plugin_index); } } break; case 3: info.incReadPos(6); info.unpack((char*)p, sizeof(p)); info.incReadPos(1); info.unpack(plugin_status); data->setPluginStatusTime(time); for (plugin_index = 0; plugin_index < PLUGIN_NULL; plugin_index++) if (!memcmp(p, m_client->plugins[plugin_index], sizeof(p))) break; switch (plugin_index){ case PLUGIN_FOLLOWME: if (data->getFollowMe() == plugin_status) break; data->setFollowMe(plugin_status); bChanged = true; break; case PLUGIN_FILESERVER: if ((data->getSharedFiles() != 0) == (plugin_status != 0)) break; data->setSharedFiles(plugin_status != 0); bChanged = true; break; case PLUGIN_ICQPHONE: if (data->getICQPhone() == plugin_status) break; data->setICQPhone(plugin_status); bChanged = true; break; default: if (plugin_index >= PLUGIN_NULL) log(L_WARN, "Unknown plugin sign (%04X %04X)", type, plugin_index); } break; } } else { data->setInfoUpdateTime(infoUpdateTime); data->setPluginInfoTime(pluginInfoTime); data->setPluginStatusTime(pluginStatusTime); if ( !m_client->getDisableAutoUpdate() && (!m_client->getInvisible() || data->getVisibleId()) && (m_client->getInvisible() || data->getInvisibleId() == 0)) { if (infoUpdateTime == 0) infoUpdateTime = 1; if (infoUpdateTime != data->getInfoFetchTime()) m_client->addFullInfoRequest(data->getUin()); if ( data->getPluginInfoTime() != data->getPluginInfoFetchTime() && data->getPluginInfoTime()) m_client->addPluginInfoRequest(data->getUin(), PLUGIN_QUERYxINFO); if ( data->getPluginInfoTime() != data->getPluginInfoFetchTime() || data->getPluginStatusTime() != data->getPluginStatusFetchTime()){ if (data->getSharedFiles()) { data->setSharedFiles(false); bChanged = true; } if (data->getFollowMe()) { data->setFollowMe(0); bChanged = true; } if (data->getICQPhone()) { data->setICQPhone(0); bChanged = true; } if (data->getPluginStatusTime()) m_client->addPluginInfoRequest(data->getUin(), PLUGIN_QUERYxSTATUS); } } } if (data->getInvisible()) { data->setInvisible(false); bChanged = true; } if (bChanged) EventContact(contact, EventContact::eChanged).process(); if (data->getStatus() != prevStatus || bAwayChanged){ unsigned status = STATUS_OFFLINE; if ((data->getStatus() & 0xFFFF) != ICQ_STATUS_OFFLINE) { status = STATUS_ONLINE; if (data->getStatus() & ICQ_STATUS_DND) status = STATUS_DND; else if (data->getStatus() & ICQ_STATUS_OCCUPIED) status = STATUS_OCCUPIED; else if (data->getStatus() & ICQ_STATUS_NA) status = STATUS_NA; else if (data->getStatus() & ICQ_STATUS_AWAY) status = STATUS_AWAY; else if (data->getStatus() & ICQ_STATUS_FFC) status = STATUS_FFC; } if((status == STATUS_ONLINE) && (data->getClass() & CLASS_AWAY)) status = STATUS_AWAY; StatusMessage *m = new StatusMessage(); m->setContact(contact->id()); m->setClient(m_client->dataName(data)); m->setStatus(status); m->setFlags(MESSAGE_RECEIVED); EventMessageReceived e(m); if(!e.process()) delete m; if ( !contact->getIgnore() && (data->getClass() & CLASS_AWAY) == 0 && ((data->getStatus() & 0xFF) == ICQ_STATUS_ONLINE && (prevStatus & 0xFF) != ICQ_STATUS_ONLINE || bAwayChanged) && ((prevStatus & 0xFFFF) != ICQ_STATUS_OFFLINE || data->getOnlineTime() > m_client->data.owner.getOnlineTime()) ) { EventContact e(contact, EventContact::eOnline); e.process(); } if ( !m_client->getDisableAutoReplyUpdate() && (data->getStatus() & 0xFF) != ICQ_STATUS_ONLINE && (!m_client->getInvisible() || data->getVisibleId()) && (m_client->getInvisible() || data->getInvisibleId() == 0) ) m_client->addPluginInfoRequest(data->getUin(), PLUGIN_AR); } } break; }
void PastInfo::fill() { ICQUserData *data = m_data; if (data == NULL) data = &m_client->data.owner; unsigned i = 0; QString str = data->getBackgrounds(); while (str.length()){ QString info = getToken(str, ';', false); QString n = getToken(info, ','); unsigned short category = n.toUShort(); switch (i){ case 0: edtBg1->setText(info); initCombo(cmbBg1, category, pasts); break; case 1: edtBg2->setText(info); initCombo(cmbBg2, category, pasts); break; case 2: edtBg3->setText(info); initCombo(cmbBg3, category, pasts); break; } i++; } for (; i < 4; i++){ switch (i){ case 0: initCombo(cmbBg1, 0, pasts); break; case 1: initCombo(cmbBg2, 0, pasts); break; case 2: initCombo(cmbBg3, 0, pasts); break; } } i = 0; str = data->getAffilations(); while (str.length()){ QString info = getToken(str, ';', false); QString n = getToken(info, ','); unsigned short category = n.toUShort(); switch (i){ case 0: edtAf1->setText(info); initCombo(cmbAf1, category, affilations); break; case 1: edtAf2->setText(info); initCombo(cmbAf2, category, affilations); break; case 2: edtAf3->setText(info); initCombo(cmbAf3, category, affilations); break; } i++; } for (; i < 4; i++){ switch (i){ case 0: initCombo(cmbAf1, 0, affilations); break; case 1: initCombo(cmbAf2, 0, affilations); break; case 2: initCombo(cmbAf3, 0, affilations); break; } } if (m_data == NULL){ cmbBgChanged(0); cmbAfChanged(0); } }