Hi, All. This patch implement new icq2002 feature "Search by Keyword", also it fix returning value, when more users found than displayed, now licq show correct number of founded users.
SergK.
diff -urN licq/include/licq_icqd.h licq-sk12/include/licq_icqd.h --- licq/include/licq_icqd.h Tue Apr 9 13:35:21 2002 +++ licq-sk12/include/licq_icqd.h Thu Apr 11 09:16:03 2002 @@ -165,6 +165,7 @@ unsigned long icqSetRandomChatGroup(unsigned long nGroup); unsigned long icqRandomChatSearch(unsigned long nGroup); unsigned long icqSearchByInfo(const char *, const char *, const char *, const char *); + unsigned long icqSearchByKeyword(const char *); unsigned long icqSearchByUin(unsigned long); unsigned long icqSearchWhitePages(const char *szFirstName, const char *szLastName, const char *szAlias, diff -urN licq/include/licq_packets.h licq-sk12/include/licq_packets.h --- licq/include/licq_packets.h Tue Apr 9 13:35:22 2002 +++ licq-sk12/include/licq_packets.h Thu Apr 11 09:16:09 2002 @@ -346,12 +346,22 @@ unsigned long m_nMetaCommand; }; +//-----SearchByKeyword---------------------------------------------------------- +class CPU_SearchByKeyword : public CPU_CommonFamily +{ +public: + CPU_SearchByKeyword(const char *_szKeyword); + virtual const unsigned short SubCommand() { return m_nMetaCommand; } +protected: + unsigned long m_nMetaCommand; +}; //-----SearchByUin-------------------------------------------------------------- class CPU_SearchByUin : public CPU_CommonFamily { public: CPU_SearchByUin(unsigned long nUin); + virtual const unsigned short SubCommand() { return m_nMetaCommand; } protected: unsigned long m_nMetaCommand; }; @@ -368,10 +378,10 @@ const char *szState, unsigned short nCountryCode, const char *szCoName, const char *szCoDept, const char *szCoPos, bool bOnlineOnly); - virtual const unsigned short SubCommand() { return m_nMetaCommand; } - unsigned long Uin() { return 0; } + virtual const unsigned short SubCommand() { return m_nMetaCommand; } + unsigned long Uin() { return 0; } protected: - unsigned long m_nMetaCommand; + unsigned long m_nMetaCommand; }; diff -urN licq/plugins/qt-gui/src/searchuserdlg.cpp licq-sk12/plugins/qt-gui/src/searchuserdlg.cpp --- licq/plugins/qt-gui/src/searchuserdlg.cpp Thu Jan 10 05:13:31 2002 +++ licq-sk12/plugins/qt-gui/src/searchuserdlg.cpp Thu Apr 11 09:16:50 2002 @@ -203,6 +203,7 @@ search_tab->addTab(email_tab, tr("&Email")); //-- third tab: search by UIN + uin_tab = new QWidget(this); lay2 = new QHBoxLayout(uin_tab, 10); lay2->addWidget(new QLabel(tr("UIN#:"), uin_tab)); @@ -212,6 +213,16 @@ search_tab->addTab(uin_tab, tr("&Uin#")); + //-- 4 tab: search by keyword + + keyword_tab = new QWidget(this); + lay2 = new QHBoxLayout(keyword_tab, 10); + lay2->addWidget(new QLabel(tr("Keyword:"), keyword_tab)); + edtKeyword = new QLineEdit(keyword_tab); + lay2->addWidget(edtKeyword); + + search_tab->addTab(keyword_tab, tr("&Keyword")); + lay->addWidget(search_tab, 1); lay2 = new QVBoxLayout(lay, 10); lay2->addStretch(1); @@ -281,6 +292,7 @@ edtLast->setEnabled(false); */ edtEmail->setEnabled(false); + edtKeyword->setEnabled(false); edtUin->setEnabled(false); btnSearch->setEnabled(false); btnReset->setEnabled(true); @@ -301,6 +313,10 @@ edtEmail->text().local8Bit().data(), 0, 0, GENDER_UNSPECIFIED, LANGUAGE_UNSPECIFIED, "", "", COUNTRY_UNSPECIFIED, "", "", "", false); + } else if (search_tab->currentPage() == keyword_tab) + { + searchTag = server->icqSearchByKeyword( + edtKeyword->text().local8Bit().data()); } else { @@ -333,6 +349,7 @@ else { edtEmail->clear(); + edtKeyword->clear(); edtLast->clear(); edtFirst->clear(); edtNick->clear(); @@ -346,6 +363,7 @@ edtFirst->setEnabled(true); edtLast->setEnabled(true); edtEmail->setEnabled(true); + edtKeyword->setEnabled(true); edtUin->setEnabled(true); btnSearch->setEnabled(true); btnAdd->setEnabled(false); @@ -363,6 +381,7 @@ edtFirst->setEnabled(true); edtLast->setEnabled(true); edtEmail->setEnabled(true); + edtKeyword->setEnabled(true); edtUin->setEnabled(true); if (e->SearchAck() != NULL && e->SearchAck()->Uin() != 0) diff -urN licq/plugins/qt-gui/src/searchuserdlg.h licq-sk12/plugins/qt-gui/src/searchuserdlg.h --- licq/plugins/qt-gui/src/searchuserdlg.h Fri Mar 23 23:23:15 2001 +++ licq-sk12/plugins/qt-gui/src/searchuserdlg.h Thu Apr 11 09:16:59 2002 @@ -76,11 +76,11 @@ QTabWidget* search_tab; QLabel *lblSearch; - QLineEdit *edtEmail, *edtFirst, *edtLast, *edtNick, *edtUin, + QLineEdit *edtEmail, *edtKeyword, *edtFirst, *edtLast, *edtNick, *edtUin, *edtCity, *edtState, *edtCoName, *edtCoDept, *edtCoPos; QComboBox *cmbAge, *cmbCountry, *cmbGender, *cmbLanguage; - QWidget *alias_tab, *email_tab, *uin_tab; + QWidget *alias_tab, *email_tab, *uin_tab, *keyword_tab; QCheckBox *chkOnlineOnly; unsigned long searchTag; diff -urN licq/src/icqd-srv.cpp licq-sk12/src/icqd-srv.cpp --- licq/src/icqd-srv.cpp Wed Apr 10 09:39:05 2002 +++ licq-sk12/src/icqd-srv.cpp Thu Apr 11 09:23:15 2002 @@ -333,17 +333,6 @@ return e->EventId(); } -//-----icqSearchByUin------------------------------------------------------------ -unsigned long CICQDaemon::icqSearchByUin(unsigned long nUin) -{ - CPU_SearchByUin *p = new CPU_SearchByUin(nUin); - gLog.Info("%sStarting search by UIN for user (#%ld/#%d)...\n", L_SRVxSTR, - p->Sequence(), p->SubSequence()); - ICQEvent *e = SendExpectEvent_Server(0, p, NULL); - PushExtendedEvent(e); - return e->EventId(); -} - //-----icqSetSecurityInfo---------------------------------------------------- unsigned long CICQDaemon::icqSetSecurityInfo(bool bAuthorize, bool bHideIp, bool bWebAware) { @@ -354,7 +343,18 @@ return e->EventId(); } -//-----icqSearchByInfo----------------------------------------------------------- +//-----icqSearchByUin---------------------------------------------------------- +unsigned long CICQDaemon::icqSearchByUin(unsigned long nUin) +{ + CPU_SearchByUin *p = new CPU_SearchByUin(nUin); + gLog.Info("%sStarting search by UIN for user (#%ld/#%d)...\n", L_SRVxSTR, + p->Sequence(), p->SubSequence()); + ICQEvent *e = SendExpectEvent_Server(0, p, NULL); + PushExtendedEvent(e); + return e->EventId(); +} + +//-----icqSearchByInfo--------------------------------------------------------- unsigned long CICQDaemon::icqSearchByInfo(const char *nick, const char *first, const char *last, const char *email) { @@ -366,6 +366,17 @@ return e->EventId(); } +//-----icqSearchByKeyword------------------------------------------------------ +unsigned long CICQDaemon::icqSearchByKeyword(const char *szKeyword) +{ + CPU_SearchByKeyword *p = new CPU_SearchByKeyword(szKeyword); + gLog.Info("%sStarting search by keyword for user (#%ld/#%d)...\n", L_SRVxSTR, + p->Sequence(), p->SubSequence()); + ICQEvent *e = SendExpectEvent_Server(0, p, NULL); + PushExtendedEvent(e); + return e->EventId(); +} + //-----icqSearchWhitePages-------------------------------------------------- unsigned long CICQDaemon::icqSearchWhitePages(const char *szFirstName, const char *szLastName, const char *szAlias, const char *szEmail, @@ -2169,7 +2180,7 @@ break; } - e = DoneExtendedServerEvent(nSubSequence, EVENT_ACKED); + e = DoneExtendedServerEvent(nSubSequence, EVENT_ACKED); if (e == NULL) { gLog.Warn("%sUnmatched extended event (%d)!\n", L_WARNxSTR, nSubSequence); @@ -2187,8 +2198,15 @@ s->m_szFirstName = strdup(msg.UnpackString(szTemp)); s->m_szLastName = strdup(msg.UnpackString(szTemp)); s->m_szEmail = strdup(msg.UnpackString(szTemp)); - msg.UnpackChar(); // authorization required - s->m_nStatus = msg.UnpackChar(); + msg.UnpackChar(); // authorization required + s->m_nStatus = msg.UnpackChar(); + msg.UnpackChar(); // unknown + + if (e->SubCommand() == 0x5F05) { + msg.UnpackChar(); // gender + msg.UnpackChar(); // age + msg.UnpackChar(); // unknown + } // translating string with Translation Table gTranslator.ServerToClient(s->m_szAlias); @@ -2205,7 +2223,7 @@ if (nSubtype & 0x0008) { unsigned long nMore = 0; e2->m_nSubCommand = ICQ_CMDxMETA_SEARCHxWPxLAST_USER; - msg >> nMore; + nMore = msg.UnpackUnsignedLong(); e2->m_pSearchAck->m_nMore = nMore; e2->m_eResult = EVENT_SUCCESS; } else { diff -urN licq/src/icqpacket.cpp licq-sk12/src/icqpacket.cpp --- licq/src/icqpacket.cpp Tue Apr 9 13:37:02 2002 +++ licq-sk12/src/icqpacket.cpp Thu Apr 11 09:15:38 2002 @@ -1220,6 +1220,32 @@ buffer->Pack(szEmail, nLenEmail); } +//-----SearchByKeyword---------------------------------------------------------- +CPU_SearchByKeyword::CPU_SearchByKeyword(const char *szKeyword) + : CPU_CommonFamily(ICQ_SNACxFAM_VARIOUS, ICQ_SNACxSEARCH) +{ + int nLenKeyword = strlen_safe(szKeyword) +3; + int packetSize = 2+2+2+4+2+2+2 + nLenKeyword + 2 + 2; + m_nMetaCommand = 0x5F05; + m_nSize += packetSize; + InitBuffer(); + + buffer->PackUnsignedShortBE(1); + buffer->PackUnsignedShortBE(packetSize-2-2); // TLV 1 + + buffer->PackUnsignedShort(packetSize-2-2-2); // bytes remaining + buffer->PackUnsignedLong(gUserManager.OwnerUin()); + buffer->PackUnsignedShortBE(0xD007); // type + buffer->PackUnsignedShortBE(m_nSubSequence); + buffer->PackUnsignedShortBE(m_nMetaCommand); // subtype + + gTranslator.ClientToServer((char *) szKeyword); + + buffer->PackUnsignedShortBE(0x2602); + buffer->PackUnsignedShort(nLenKeyword); + buffer->PackString(szKeyword); +} + //-----SearchByUin-------------------------------------------------------------- CPU_SearchByUin::CPU_SearchByUin(unsigned long nUin) : CPU_CommonFamily(ICQ_SNACxFAM_VARIOUS, ICQ_SNACxSEARCH)