Hi, I make some fixes, that, I hope needed by many licq users and probably can included in main licq branch.
1. Fixing getting full info about users. Server send full in multiple packet, but old code remove event from list after first packet and other packet ignored. My code put event back until last packet come. 2. Sending urls sending urls via icqSendThroughServer. 3. Security info setting fixing P.S. Sorry for my ugly English. With best wishes, SergK.
diff -urN licq.old/src/icqd-srv.cpp licq/src/icqd-srv.cpp --- licq.old/src/icqd-srv.cpp Thu Jan 24 10:22:35 2002 +++ licq/src/icqd-srv.cpp Thu Jan 24 10:22:56 2002 @@ -1622,6 +1622,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???) @@ -1630,221 +1631,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()); + 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(); + // 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(); - PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_GENERAL, u->Uin())); + PushExtendedEvent(e); + multipart = true; - break; - case ICQ_CMDxMETA_WORKxINFO: - - 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(); - - PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_WORK, 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(); + PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_MORE, u->Uin())); - PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_MORE, u->Uin())); + break; - break; case ICQ_CMDxMETA_EMAILxINFO: { - gLog.Info("%sEmail info on %s (%ld).\n", L_SRVxSTR, u->GetAlias(), u->Uin()); + gLog.Info("%sEmail 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(); // 00? unknown - 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(); + 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; - PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_EXT, u->Uin())); + PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_EXT, u->Uin())); - break; - } - case 0x010e: + break; + } + + case 0x010E: { - // unknown + // unknown - char* buf; - gLog.Unknown("%sunknown info: %04hx\n%s\n", L_UNKNOWNxSTR, - nSubSequence, packet.print(buf)); - delete [] buf; + char* buf; + + gLog.Unknown("%sunknown info: %04hx\n%s\n", L_UNKNOWNxSTR, + nSubSequence, packet.print(buf)); + delete [] buf; - msg.UnpackUnsignedShortBE(); // WORD 0 - break; + msg.UnpackUnsignedShortBE(); // WORD 0 + + PushExtendedEvent(e); + multipart = true; + + break; } + + case ICQ_CMDxMETA_WORKxINFO: + + 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 + + char * buf; + + gLog.Unknown("%spersonal interests: %04hx\n%s\n", L_UNKNOWNxSTR, + nSubSequence, packet.print(buf)); + delete [] buf; + + PushExtendedEvent(e); + multipart = true; - // personal interests info - break; + 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 + + char* buf; - // past background info - break; + 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.old/src/icqd-srv.cpp licq/src/icqd-srv.cpp --- licq.old/src/icqd-srv.cpp Thu Jan 24 10:35:21 2002 +++ licq/src/icqd-srv.cpp Thu Jan 24 10:35:36 2002 @@ -396,9 +396,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; diff -urN licq.old/src/icqd-tcp.cpp licq/src/icqd-tcp.cpp --- licq.old/src/icqd-tcp.cpp Thu Jan 24 10:35:21 2002 +++ licq/src/icqd-tcp.cpp Thu Jan 24 10:35:36 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/include/licq_packets.h licq.new/include/licq_packets.h --- licq/include/licq_packets.h Thu Jan 10 10:08:22 2002 +++ licq.new/include/licq_packets.h Thu Jan 24 11:27:52 2002 @@ -632,7 +632,7 @@ //-----Meta_SetSecurityInfo-------------------------------------------------- -class CPU_Meta_SetSecurityInfo : public CPacketUdp +class CPU_Meta_SetSecurityInfo : public CPU_CommonFamily { public: CPU_Meta_SetSecurityInfo(bool bAuthorization, diff -urN licq/src/icqd-srv.cpp licq.new/src/icqd-srv.cpp --- licq/src/icqd-srv.cpp Wed Jan 23 09:04:11 2002 +++ licq.new/src/icqd-srv.cpp Thu Jan 24 11:28:12 2002 @@ -190,6 +190,16 @@ return e->EventId(); } +//-----icqSetSecurityInfo---------------------------------------------------- +unsigned long CICQDaemon::icqSetSecurityInfo(bool bAuthorize, bool bHideIp, bool +bWebAware) +{ + CPU_Meta_SetSecurityInfo *p = new CPU_Meta_SetSecurityInfo(bAuthorize, bHideIp, +bWebAware); + gLog.Info("%sUpdating security info (#%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) @@ -1550,7 +1560,28 @@ } else /* META_FAILURE */ gLog.Info("%sPassword not updated.\n", L_SRVxSTR); - } + } else if (nSubtype == ICQ_CMDxMETA_SECURITYxRSP) { + if (nResult == META_SUCCESS) { + gLog.Info("%sSecurity info updated.\n", L_SRVxSTR); + ICQEvent *e = DoneExtendedServerEvent(nSubSequence, +EVENT_SUCCESS); + ICQEvent *e2 = new ICQEvent(e); + e2->m_nCommand = ICQ_CMDxSND_META; + e2->m_nSubCommand = ICQ_CMDxMETA_SECURITYxSET; + CPU_Meta_SetSecurityInfo *p = (CPU_Meta_SetSecurityInfo +*)e->m_pPacket; + ICQOwner *o = gUserManager.FetchOwner(LOCK_W); + o->SetEnableSave(false); + o->SetAuthorization(p->Authorization()); + o->SetWebAware(p->WebAware()); + o->SetHideIp(p->HideIp()); + o->SetEnableSave(true); + o->SaveLicqInfo(); + gUserManager.DropOwner(); + PushPluginEvent(e2); + DoneEvent(e, EVENT_SUCCESS); + } + else /* META_FAILURE */ + gLog.Info("%sSecurity info not updated.\n", L_SRVxSTR); + + } // Search results need to be processed differently else if (nSubtype == 0x0190 || nSubtype == 0x019a || nSubtype == 0x01a4 || nSubtype == 0x01ae) { ICQEvent *e = NULL; diff -urN licq/src/icqpacket.cpp licq.new/src/icqpacket.cpp --- licq/src/icqpacket.cpp Wed Jan 23 22:42:31 2002 +++ licq.new/src/icqpacket.cpp Thu Jan 24 11:28:17 2002 @@ -1665,21 +1665,30 @@ bool bAuthorization, bool bHideIp, bool bWebAware) - : CPacketUdp(ICQ_CMDxSND_META) + : CPU_CommonFamily(ICQ_SNACxFAM_VARIOUS, ICQ_SNACxMETA_INFO) { - m_nMetaCommand = ICQ_CMDxMETA_SECURITYxSET; + m_nMetaCommand = 0x2404; m_nAuthorization = bAuthorization ? 0 : 1; m_nHideIp = bHideIp ? 1 : 0; m_nWebAware = bWebAware ? 1 : 0; - m_nSize += 5; + + int packetSize = 2+2+2+4+2+2+2+4; + m_nSize += packetSize; InitBuffer(); - buffer->PackUnsignedShort(m_nMetaCommand); + 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(0x2404); // subtype buffer->PackChar(m_nAuthorization); - buffer->PackChar(m_nHideIp); buffer->PackChar(m_nWebAware); - + buffer->PackChar(m_nHideIp); + buffer->PackChar(0); }