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)

Reply via email to