Hi people!

Licq had problem with getting full meat info, becouse this info coming in
many parts, and licq not correctly work in this situation. I hope this patch
fix this problem, please test.
Also licq can't send url, authtorization, etc., becouse it can't send type4
message, i add code, that cat creating type4 messages, and fix sending url,
and authorization grant. I made this code before read in this list, that 
Jon Keating fix this problem too.
So, Jon, please, publish your code, and i sync my changes with your.
This patch against licq-cvs-20010112.

P.S. Sorry for my ugly English.

SergK
diff -urN licq/src/icqd-srv.cpp licq-sergk/src/icqd-srv.cpp
--- licq/src/icqd-srv.cpp       Thu Jan 10 10:08:24 2002
+++ licq-sergk/src/icqd-srv.cpp Wed Jan 16 11:12:26 2002
@@ -49,6 +49,25 @@
   SendExpectEvent_Server(_nUin, p, NULL);
 }
 
+///-----icqAuthorize-------------------------------------------------------------
+unsigned long CICQDaemon::icqAuthorizeGrant(unsigned long uinToAuthorize, const char 
+*szMessage)
+// authorize a user to add you to their contact list
+{
+    char *sz = NULL;
+
+    if (szMessage != NULL)
+    {
+       sz = gTranslator.NToRN(szMessage);
+       gTranslator.ClientToServer(sz);
+    }
+    CPU_ThroughServer *p = new CPU_ThroughServer(uinToAuthorize, 
+ICQ_CMDxSUB_AUTHxGRANTED, "");
+    gLog.Info("%sAuthorizing user %ld (#%ld)...\n", L_SRVxSTR, uinToAuthorize, 
+p->Sequence());
+    delete sz;
+
+    ICQEvent *e = SendExpectEvent_Server(uinToAuthorize, p, NULL);
+    
+    return e->EventId();
+}
 
 //-----NextServer---------------------------------------------------------------
 void CICQDaemon::SwitchServer()
@@ -358,9 +377,17 @@
   ICQEvent* result;
 
   CPU_ThroughServer *p = new CPU_ThroughServer(nUin, format, _sMessage);
-
-  gLog.Info("%sSending message through server (#%ld).\n", L_SRVxSTR, p->Sequence());
-
+  
+  switch (format) {
+    case ICQ_CMDxSUB_MSG:
+       gLog.Info("%sSending message through server (#%ld).\n", L_SRVxSTR, 
+p->Sequence());
+       break;  
+    case ICQ_CMDxSUB_URL:
+        gLog.Info("%sSending url through server (#%ld).\n", L_SRVxSTR, p->Sequence());
+       break;
+    default:
+       gLog.Info("%sSending misc through server (#%ld).\n", L_SRVxSTR, p->Sequence());
+  }
   // If we are already shutting down, don't start any events
   if (m_bShuttingDown) return NULL;
 
@@ -1583,6 +1610,7 @@
        ICQEvent *e = NULL;
        ICQUser *u = NULL;
        unsigned long nUin = 0;
+       bool multipart = false;
        
        if ((nResult == 0x32) || (nResult == 0x14) || (nResult == 0x1e)) {
                                // error: empty result or nonexistent user (1E =  
readonly???)
@@ -1591,221 +1619,258 @@
                if (e != NULL) ProcessDoneEvent(e);
        } else {
                // Find the relevant event
-               ICQEvent *e = DoneExtendedServerEvent(nSubSequence, EVENT_SUCCESS);
+               e = DoneExtendedServerEvent(nSubSequence, EVENT_SUCCESS);
                if (e == NULL) {
-               gLog.Warn("%sUnmatched extended event (%d)!\n", L_WARNxSTR, 
nSubSequence);
-               break;
+                       gLog.Warn("%sUnmatched extended event (%d)!\n", L_WARNxSTR, 
+nSubSequence);
+                       break;
                }
                nUin = e->Uin();
 
                u = FindUserForInfoUpdate( nUin, e, "extended");
                if (u == NULL) {
-                 gLog.Warn("%scan't find user for updating!\n", L_WARNxSTR);
-                 break;
+                       gLog.Warn("%scan't find user for updating!\n", L_WARNxSTR);
+                       break;
                        }
                }
 
        switch (nSubtype) {
         case ICQ_CMDxMETA_GENERALxINFO:
 
-          gLog.Info("%sGeneral info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), 
u->Uin());
-
-          // main home info
-          u->SetAlias( msg.UnpackString() );
-          u->SetFirstName( msg.UnpackString() );
-          u->SetLastName( msg.UnpackString() );
-          u->SetEmailPrimary( msg.UnpackString() );
-          u->SetCity( msg.UnpackString() );
-          u->SetState( msg.UnpackString() );
-          u->SetPhoneNumber( msg.UnpackString() );
-          u->SetFaxNumber( msg.UnpackString() );
-          u->SetAddress( msg.UnpackString() );
-          u->SetCellularNumber( msg.UnpackString() );
-          u->SetZipCode( msg.UnpackString() );
-          u->SetCountryCode( msg.UnpackUnsignedShort() );
-          u->SetTimezone( msg.UnpackChar() );
-          u->SetHideEmail( msg.UnpackChar() ); // 0 = no, 1 = yes
-
-          // translating string with Translation Table
-          gTranslator.ServerToClient(u->GetAlias());
-          gTranslator.ServerToClient(u->GetFirstName());
-          gTranslator.ServerToClient(u->GetLastName());
-          gTranslator.ServerToClient(u->GetEmailPrimary());
-          gTranslator.ServerToClient(u->GetCity());
-          gTranslator.ServerToClient(u->GetState());
-          gTranslator.ServerToClient(u->GetPhoneNumber());
-          gTranslator.ServerToClient(u->GetFaxNumber());
-          gTranslator.ServerToClient(u->GetAddress());
-          gTranslator.ServerToClient(u->GetCellularNumber());
-          gTranslator.ServerToClient(u->GetZipCode());
-
-          // save the user infomation
-          u->SetEnableSave(true);
-          u->SaveGeneralInfo();
+           gLog.Info("%sGeneral info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), 
+u->Uin());
 
-          PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_GENERAL, 
u->Uin()));
-
-          break;
-        case ICQ_CMDxMETA_WORKxINFO:
+           // main home info
+           u->SetAlias( msg.UnpackString() );
+           u->SetFirstName( msg.UnpackString() );
+           u->SetLastName( msg.UnpackString() );
+           u->SetEmailPrimary( msg.UnpackString() );
+           u->SetCity( msg.UnpackString() );
+           u->SetState( msg.UnpackString() );
+           u->SetPhoneNumber( msg.UnpackString() );
+           u->SetFaxNumber( msg.UnpackString() );
+           u->SetAddress( msg.UnpackString() );
+           u->SetCellularNumber( msg.UnpackString() );
+           u->SetZipCode( msg.UnpackString() );
+           u->SetCountryCode( msg.UnpackUnsignedShort() );
+           u->SetTimezone( msg.UnpackChar() );
+           u->SetHideEmail( msg.UnpackChar() ); // 0 = no, 1 = yes
+
+           // translating string with Translation Table
+           gTranslator.ServerToClient(u->GetAlias());
+           gTranslator.ServerToClient(u->GetFirstName());
+           gTranslator.ServerToClient(u->GetLastName());
+           gTranslator.ServerToClient(u->GetEmailPrimary());
+           gTranslator.ServerToClient(u->GetCity());
+           gTranslator.ServerToClient(u->GetState());
+           gTranslator.ServerToClient(u->GetPhoneNumber());
+           gTranslator.ServerToClient(u->GetFaxNumber());
+           gTranslator.ServerToClient(u->GetAddress());
+           gTranslator.ServerToClient(u->GetCellularNumber());
+           gTranslator.ServerToClient(u->GetZipCode());
+
+           // save the user infomation
+           u->SetEnableSave(true);
+           u->SaveGeneralInfo();
+
+           PushExtendedEvent(e);
+           multipart = true;
+
+           PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_GENERAL, 
+u->Uin()));
+
+           break;
+       
+       case ICQ_CMDxMETA_MORExINFO:
+
+           gLog.Info("%sMore info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), 
+u->Uin());
+
+           u->SetEnableSave(false);
+           u->SetAge( msg.UnpackUnsignedShort() );
+           u->SetGender( msg.UnpackChar() );
+           u->SetHomepage( msg.UnpackString() );
+           u->SetBirthYear( msg.UnpackUnsignedShort() );
+           u->SetBirthMonth( msg.UnpackChar() );
+           u->SetBirthDay (msg.UnpackChar() );
+           u->SetLanguage1( msg.UnpackChar() );
+           u->SetLanguage2( msg.UnpackChar() );
+           u->SetLanguage3( msg.UnpackChar() );
+
+           // translating string with Translation Table
+           gTranslator.ServerToClient(u->GetHomepage());
+
+           // save the user infomation
+           u->SetEnableSave(true);
+           u->SaveMoreInfo();
 
-          gLog.Info("%sWork info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), u->Uin());
+           PushExtendedEvent(e);
+           multipart = true;
 
-          u->SetEnableSave(false);
-          u->SetCompanyCity( msg.UnpackString() );
-          u->SetCompanyState( msg.UnpackString() );
-          u->SetCompanyPhoneNumber( msg.UnpackString() );
-          u->SetCompanyFaxNumber( msg.UnpackString() );
-          u->SetCompanyAddress( msg.UnpackString() );  // u->SetCompanyStreet( 
msg.UnpackString() );
-          msg.UnpackString();        // u->SetCompanyZip( msg.UnpackString() );
-          msg.UnpackUnsignedShort(); // u->SetCompanyCountry( 
msg.UnpackUnsignedShort() );
-          u->SetCompanyName( msg.UnpackString() );
-          u->SetCompanyDepartment( msg.UnpackString() );
-          u->SetCompanyPosition( msg.UnpackString() );
-          msg.UnpackUnsignedShort(); // unknown
-          u->SetCompanyHomepage( msg.UnpackString() );
-
-          // translating string with Translation Table
-          gTranslator.ServerToClient(u->GetCompanyCity());
-          gTranslator.ServerToClient(u->GetCompanyState());
-          gTranslator.ServerToClient(u->GetCompanyPhoneNumber());
-          gTranslator.ServerToClient(u->GetCompanyFaxNumber());
-          gTranslator.ServerToClient(u->GetCompanyAddress());
-          gTranslator.ServerToClient(u->GetCompanyName());
-          gTranslator.ServerToClient(u->GetCompanyDepartment());
-          gTranslator.ServerToClient(u->GetCompanyPosition());
-          gTranslator.ServerToClient(u->GetCompanyHomepage());
-
-          // save the user infomation
-          u->SetEnableSave(true);
-          u->SaveWorkInfo();
+           PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_MORE, u->Uin()));
 
-          PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_WORK, u->Uin()));
+           break;
 
-          break;
-        case ICQ_CMDxMETA_MORExINFO:
+        case ICQ_CMDxMETA_EMAILxINFO:
+        {
+           gLog.Info("%sEmail info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), 
+u->Uin());
 
-          gLog.Info("%sMore info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), u->Uin());
+           u->SetEnableSave(false);
+           // let's just grab the first 2 for now
+           int nEmail = (int)msg.UnpackChar();
+           if (nEmail > 2) nEmail = 2;
+           for(int i = 0; i < nEmail; i++) {
+               msg.UnpackChar(); // publish email, not yet implemented
+               if(i == 0) {
+                   u->SetEmailPrimary( msg.UnpackString() );
+                   gTranslator.ServerToClient(u->GetEmailPrimary());
+               }
+               if(i == 1) {
+                   u->SetEmailSecondary( msg.UnpackString() );
+                   gTranslator.ServerToClient(u->GetEmailSecondary());
+               }
+           }
+
+           // save the user infomation
+           u->SetEnableSave(true);
+           u->SaveGeneralInfo();
+
+           PushExtendedEvent(e);
+           multipart = true;
 
-          u->SetEnableSave(false);
-          u->SetAge( msg.UnpackUnsignedShort() );
-          u->SetGender( msg.UnpackChar() );
-          u->SetHomepage( msg.UnpackString() );
-          u->SetBirthYear( msg.UnpackUnsignedShort() );
-          u->SetBirthMonth( msg.UnpackChar() );
-          u->SetBirthDay (msg.UnpackChar() );
-          u->SetLanguage1( msg.UnpackChar() );
-          u->SetLanguage2( msg.UnpackChar() );
-          u->SetLanguage3( msg.UnpackChar() );
-
-          // translating string with Translation Table
-          gTranslator.ServerToClient(u->GetHomepage());
-
-          // save the user infomation
-          u->SetEnableSave(true);
-          u->SaveMoreInfo();
+           PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_EXT, u->Uin()));
 
-          PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_MORE, u->Uin()));
+           break;
+       }
 
-          break;
-        case ICQ_CMDxMETA_EMAILxINFO:
+        case 0x010E:
         {
-          gLog.Info("%sEmail info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), 
u->Uin());
+           // unknown
 
-          u->SetEnableSave(false);
-          // let's just grab the first 2 for now
-          int nEmail = (int)msg.UnpackChar();
-          if(nEmail > 2) nEmail = 2;
-          for(int i=0;i<nEmail;i++) {
-            msg.UnpackChar(); // 00? unknown
-            if(i == 0) {
-              u->SetEmailPrimary( msg.UnpackString() );
-              gTranslator.ServerToClient(u->GetEmailPrimary());
-            }
-            if(i == 1) {
-              u->SetEmailSecondary( msg.UnpackString() );
-              gTranslator.ServerToClient(u->GetEmailSecondary());
-            }
-          }
+           char* buf;
 
-          // save the user infomation
-          u->SetEnableSave(true);
-          u->SaveGeneralInfo();
+           gLog.Unknown("%sunknown info: %04hx\n%s\n", L_UNKNOWNxSTR,
+                                   nSubSequence, packet.print(buf));
+           delete [] buf;
 
-          PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_EXT, u->Uin()));
+           msg.UnpackUnsignedShortBE(); // WORD 0
 
-          break;
+           PushExtendedEvent(e);
+           multipart = true;
+
+           break;
         }
-        case 0x010e:
-        {
-          // unknown
 
-          char* buf;
-          gLog.Unknown("%sunknown info: %04hx\n%s\n", L_UNKNOWNxSTR,
-                       nSubSequence, packet.print(buf));
-          delete [] buf;
+        case ICQ_CMDxMETA_WORKxINFO:
 
-          msg.UnpackUnsignedShortBE(); // WORD 0
-          break;
-        }
+           gLog.Info("%sWork info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), 
+u->Uin());
+
+           u->SetEnableSave(false);
+           u->SetCompanyCity( msg.UnpackString() );
+           u->SetCompanyState( msg.UnpackString() );
+           u->SetCompanyPhoneNumber( msg.UnpackString() );
+           u->SetCompanyFaxNumber( msg.UnpackString() );
+           u->SetCompanyAddress( msg.UnpackString() );  // u->SetCompanyStreet( 
+msg.UnpackString() );
+           msg.UnpackString();        // u->SetCompanyZip( msg.UnpackString() );
+           msg.UnpackUnsignedShort(); // u->SetCompanyCountry( 
+msg.UnpackUnsignedShort() );
+           u->SetCompanyName( msg.UnpackString() );
+           u->SetCompanyDepartment( msg.UnpackString() );
+           u->SetCompanyPosition( msg.UnpackString() );
+           msg.UnpackUnsignedShort(); // unknown
+           u->SetCompanyHomepage( msg.UnpackString() );
+
+           // translating string with Translation Table
+           gTranslator.ServerToClient(u->GetCompanyCity());
+           gTranslator.ServerToClient(u->GetCompanyState());
+           gTranslator.ServerToClient(u->GetCompanyPhoneNumber());
+           gTranslator.ServerToClient(u->GetCompanyFaxNumber());
+           gTranslator.ServerToClient(u->GetCompanyAddress());
+           gTranslator.ServerToClient(u->GetCompanyName());
+           gTranslator.ServerToClient(u->GetCompanyDepartment());
+           gTranslator.ServerToClient(u->GetCompanyPosition());
+           gTranslator.ServerToClient(u->GetCompanyHomepage());
+
+           // save the user infomation
+           u->SetEnableSave(true);
+           u->SaveWorkInfo();
+
+           PushExtendedEvent(e);
+           multipart = true;
+
+           PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_WORK, u->Uin()));
+
+           break;
+        
         case ICQ_CMDxMETA_ABOUT:
         {
-          gLog.Info("%sAbout info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), 
u->Uin());
+           gLog.Info("%sAbout info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), 
+u->Uin());
 
-          char* rawmsg = msg.UnpackString();
-          char* msg = gTranslator.RNToN(rawmsg);
-          delete [] rawmsg;
+           char* rawmsg = msg.UnpackString();
+           char* msg = gTranslator.RNToN(rawmsg);
+           delete [] rawmsg;
 
-          u->SetAbout( msg );
-          delete [] msg;
+           u->SetAbout( msg );
+           delete [] msg;
 
-          // translating string with Translation Table
-          gTranslator.ServerToClient(u->GetAbout());
+           // translating string with Translation Table
+           gTranslator.ServerToClient(u->GetAbout());
 
-          // save the user infomation
-          u->SetEnableSave(true);
-          u->SaveAboutInfo();
+           // save the user infomation
+           u->SetEnableSave(true);
+           u->SaveAboutInfo();
 
-          PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_ABOUT, u->Uin()));
+           PushExtendedEvent(e);
+           multipart = true;
 
-          break;
-        }
-        case 0x000f:
+           PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_ABOUT, u->Uin()));
+
+           break;
+       }
+
+       case 0x00F0:
         {
-          char * buf;
-          gLog.Unknown("%spersonal interests: %04hx\n%s\n", L_UNKNOWNxSTR,
-                       nSubSequence, packet.print(buf));
-          delete [] buf;
+           // personal interests info
 
-          // personal interests info
-          break;
+           char * buf;
+
+           gLog.Unknown("%spersonal interests: %04hx\n%s\n", L_UNKNOWNxSTR,
+                                   nSubSequence, packet.print(buf));
+           delete [] buf;
+
+           PushExtendedEvent(e);
+           multipart = true;
+
+           break;
         }
+
         case ICQ_CMDxMETA_PASTxINFO:
         {
-          char* buf;
-          gLog.Unknown("%spast backgrounds: %04hx\n%s\n", L_UNKNOWNxSTR,
-                       nSubSequence, packet.print(buf));
-          delete [] buf;
+           // past background info
 
-          // past background info
-          break;
+           char* buf;
+
+           gLog.Unknown("%spast backgrounds: %04hx\n%s\n", L_UNKNOWNxSTR,
+                                   nSubSequence, packet.print(buf));
+           delete [] buf;
+
+           break;
         }
+
         default: {
           char* buf;
+
           gLog.Unknown("%sunknown info: %04hx\n%s\n", L_UNKNOWNxSTR,
                        nSubtype, packet.print(buf));
           delete [] buf;
        }
         }
 
-        if (e != NULL)
-               ProcessDoneEvent(e);
-           else
-         {
-         gLog.Warn("%sResponse to unknown extended info request for %s (%ld).\n",
-                   L_WARNxSTR, u->GetAlias(), nUin);
-               }
+       if (!multipart) {
+           if (e != NULL)
+               ProcessDoneEvent(e);
+           else {
+               gLog.Warn("%sResponse to unknown extended info request for %s 
+(%ld).\n",
+               L_WARNxSTR, u->GetAlias(), nUin);
+           }
+       }
 
-               PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_EXT, 
u->Uin()));
+       PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_EXT, u->Uin()));
                gUserManager.DropUser(u);
       }
       break;
diff -urN licq/src/icqd-tcp.cpp licq-sergk/src/icqd-tcp.cpp
--- licq/src/icqd-tcp.cpp       Sun Jan  6 16:40:03 2002
+++ licq-sergk/src/icqd-tcp.cpp Wed Jan 16 09:55:58 2002
@@ -127,10 +127,7 @@
   if (!online) // send offline
   {
     e = new CEventUrl(url, description, ICQ_CMDxSND_THRUxSERVER, TIME_NOW, f);
-    CPU_ThroughServer *p = new CPU_ThroughServer(_nUin,
-       ICQ_CMDxSUB_URL | (bMultipleRecipients ? ICQ_CMDxSUB_FxMULTIREC : 0), m);
-    gLog.Info("%sSending url through server (#%ld).\n", L_SRVxSTR, p->Sequence());
-    result = SendExpectEvent_Server(_nUin, p, e);
+    result = icqSendThroughServer(_nUin, ICQ_CMDxSUB_URL | (bMultipleRecipients ? 
+ICQ_CMDxSUB_FxMULTIREC : 0), m, e);
   }
   else
   {
diff -urN licq/src/icqpacket.cpp licq-sergk/src/icqpacket.cpp
--- licq/src/icqpacket.cpp      Thu Jan 10 10:08:24 2002
+++ licq-sergk/src/icqpacket.cpp        Wed Jan 16 09:23:25 2002
@@ -956,33 +956,63 @@
 CPU_ThroughServer::CPU_ThroughServer(unsigned long nDestinationUin, unsigned char 
msgType, char *szMessage)
   : CPU_CommonFamily(ICQ_SNACxFAM_MESSAGE, ICQ_SNACxMSG_SENDxSERVER)
 {
-  m_nDestinationUin = nDestinationUin;
-  int msgLen = strlen(szMessage);
-  char uin[13];
-  uin[12] = '\0';
-  int n = snprintf(uin, 12, "%lu", m_nDestinationUin);
-
-  m_nSize += 32 + n + strlen(szMessage);
-
-  InitBuffer();
-
-  buffer->PackUnsignedLongBE(0); // timestamp 1
-  buffer->PackUnsignedLongBE(0); // timestamp 2
-
-  buffer->PackUnsignedShortBE(1); // message format
-  buffer->PackChar(n);
-  buffer->Pack(uin, n);
-
-  buffer->PackUnsignedShortBE(0x02); // type
-  buffer->PackUnsignedShortBE(msgLen + 17); // length
-  buffer->PackUnsignedLongBE(0x05010001);
-  buffer->PackUnsignedShortBE(0x0101);
-  buffer->PackChar(0x01);
-  buffer->PackUnsignedShortBE(msgLen + 4);
-  buffer->PackUnsignedLongBE(0);
-  buffer->Pack(szMessage, msgLen);
-  buffer->PackUnsignedShortBE(0x0006);
-  buffer->PackUnsignedShortBE(0x0000);
+    m_nDestinationUin = nDestinationUin;
+    int msgLen = strlen(szMessage);
+    char uin[13];
+    uin[12] = '\0';
+    int n = snprintf(uin, 12, "%lu", m_nDestinationUin);
+    ICQOwner *o = gUserManager.FetchOwner(LOCK_R);
+
+    switch (msgType) {
+    case ICQ_CMDxSUB_AUTHxREQUEST:
+    case ICQ_CMDxSUB_AUTHxREFUSED:
+    case ICQ_CMDxSUB_AUTHxGRANTED:
+    case ICQ_CMDxSUB_URL:
+
+       m_nSize += 28 + n + strlen(szMessage);
+
+       InitBuffer();
+
+       buffer->PackUnsignedLongBE(0); // timestamp 1
+       buffer->PackUnsignedLongBE(1); // timestamp 2
+
+       buffer->PackUnsignedShortBE(4); // message format
+       buffer->PackChar(n);
+       buffer->Pack(uin, n);
+
+       buffer->PackUnsignedShortBE(0x0005); // TLV(5)
+       buffer->PackUnsignedShortBE(msgLen + 9); // length
+       buffer->PackUnsignedLong(o->Uin());
+       buffer->PackUnsignedShort(msgType);
+       buffer->PackLNTS(szMessage);
+       buffer->PackUnsignedShortBE(0x0006);
+       buffer->PackUnsignedShortBE(0x0000);
+       break;
+
+    default:
+       m_nSize += 32 + n + strlen(szMessage);
+
+       InitBuffer();
+
+       buffer->PackUnsignedLongBE(0); // timestamp 1
+       buffer->PackUnsignedLongBE(0); // timestamp 2
+
+       buffer->PackUnsignedShortBE(1); // message format
+       buffer->PackChar(n);
+       buffer->Pack(uin, n);
+
+       buffer->PackUnsignedShortBE(0x02); // type
+       buffer->PackUnsignedShortBE(msgLen + 17); // length
+       buffer->PackUnsignedLongBE(0x05010001);
+       buffer->PackUnsignedShortBE(0x0101);
+       buffer->PackChar(0x01);
+       buffer->PackUnsignedShortBE(msgLen + 4);
+       buffer->PackUnsignedLongBE(0);
+       buffer->Pack(szMessage, msgLen);
+       buffer->PackUnsignedShortBE(0x0006);
+       buffer->PackUnsignedShortBE(0x0000);
+       break;
+    }
 }
 
 CPU_AckThroughServer::CPU_AckThroughServer(unsigned long Uin, unsigned long 
timestamp1, unsigned long timestamp2,

Reply via email to