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,