You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
405 lines
16 KiB
405 lines
16 KiB
/*
|
|
Kopete Yahoo Protocol
|
|
|
|
Copyright (c) 2004 Duncan Mac-Vicar Prett <duncan@kde.org>
|
|
|
|
Copyright (c) 2005 André Duffeck <duffeck@kde.org>
|
|
Kopete (c) 2002-2005 by the Kopete developers <kopete-devel@kde.org>
|
|
|
|
*************************************************************************
|
|
* *
|
|
* This library is free software; you can redistribute it and/or *
|
|
* modify it under the terms of the GNU Lesser General Public *
|
|
* License as published by the Free Software Foundation; either *
|
|
* version 2 of the License, or (at your option) any later version. *
|
|
* *
|
|
*************************************************************************
|
|
*/
|
|
|
|
//#include <TQDataStream>
|
|
//#include <TQMap>
|
|
//#include <TQObject>
|
|
//#include <TQStringList>
|
|
|
|
//#include <tqcstring.h>
|
|
#include <tqdatastream.h>
|
|
#include <tqmap.h>
|
|
#include <tqobject.h>
|
|
#include <tqstringlist.h>
|
|
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include "ymsgprotocol.h"
|
|
#include "ymsgtransfer.h"
|
|
#include "yahootypes.h"
|
|
|
|
using namespace Yahoo;
|
|
|
|
YMSGProtocol::YMSGProtocol(TQObject *parent, const char *name)
|
|
: InputProtocolBase(parent, name)
|
|
{
|
|
}
|
|
|
|
YMSGProtocol::~YMSGProtocol()
|
|
{
|
|
}
|
|
|
|
Transfer* YMSGProtocol::parse( const TQByteArray & packet, uint& bytes )
|
|
{
|
|
/*
|
|
<------- 4B -------><------- 4B -------><---2B--->
|
|
+-------------------+-------------------+---------+
|
|
| Y M S G | version | pkt_len |
|
|
+---------+---------+---------+---------+---------+
|
|
| service | status | session_id |
|
|
+---------+-------------------+-------------------+
|
|
| |
|
|
: D A T A :
|
|
/ 0 - 65535* |
|
|
+-------------------------------------------------+
|
|
*/
|
|
kdDebug(YAHOO_RAW_DEBUG) << packet << endl;
|
|
|
|
int pos = 0;
|
|
int len = 0;
|
|
|
|
Yahoo::tqStatus status = Yahoo::StatusAvailable;
|
|
Yahoo::Service service = Yahoo::ServiceAuth;
|
|
int statusnum = 0;
|
|
int sessionid = 0;
|
|
int servicenum;
|
|
int version1, version2;
|
|
|
|
TQMap<TQString, TQString> params;
|
|
|
|
// Skip the YMSG header
|
|
pos += 4;
|
|
|
|
// Skip the version
|
|
version1 = yahoo_get16(packet.data() + pos);
|
|
pos += 2;
|
|
version2 = yahoo_get16(packet.data() + pos);
|
|
pos += 2;
|
|
kdDebug(YAHOO_RAW_DEBUG) << " - parsed packet version " << version1 << " " << version2 << endl;
|
|
|
|
len = yahoo_get16(packet.data() + pos);
|
|
pos += 2;
|
|
kdDebug(YAHOO_RAW_DEBUG) << " - parsed packet len " << len << endl;
|
|
|
|
servicenum = yahoo_get16(packet.data() + pos);
|
|
pos += 2;
|
|
|
|
switch (servicenum)
|
|
{
|
|
// TODO add remamining services
|
|
case (Yahoo::ServiceAuth) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceAuth " << servicenum << endl;
|
|
service = Yahoo::ServiceAuth;
|
|
break;
|
|
case (Yahoo::ServiceAuthResp) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceAuthResp " << servicenum << endl;
|
|
service = Yahoo::ServiceAuthResp;
|
|
break;
|
|
case (Yahoo::ServiceVerify) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceVerify " << servicenum << endl;
|
|
service = Yahoo::ServiceVerify;
|
|
break;
|
|
case (Yahoo::ServiceList) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceList " << servicenum << endl;
|
|
service = Yahoo::ServiceList;
|
|
break;
|
|
case (Yahoo::ServiceLogon) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceLogon " << servicenum << endl;
|
|
service = Yahoo::ServiceLogon;
|
|
break;
|
|
case (Yahoo::ServicePing) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServicePing " << servicenum << endl;
|
|
service = Yahoo::ServicePing;
|
|
break;
|
|
case (Yahoo::ServiceNewMail) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceNewMail " << servicenum << endl;
|
|
service = Yahoo::ServiceNewMail;
|
|
break;
|
|
case (Yahoo::ServiceLogoff) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceLogoff " << servicenum << endl;
|
|
service = Yahoo::ServiceLogoff;
|
|
break;
|
|
case (Yahoo::ServiceIsAway) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceIsAway " << servicenum << endl;
|
|
service = Yahoo::ServiceIsAway;
|
|
break;
|
|
case (Yahoo::ServiceIsBack) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceIsBack " << servicenum << endl;
|
|
service = Yahoo::ServiceIsBack;
|
|
break;
|
|
case (Yahoo::ServiceGameLogon) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceGameLogon " << servicenum << endl;
|
|
service = Yahoo::ServiceGameLogon;
|
|
break;
|
|
case (Yahoo::ServiceGameLogoff) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceGameLogoff " << servicenum << endl;
|
|
service = Yahoo::ServiceGameLogoff;
|
|
break;
|
|
case (Yahoo::ServiceIdAct) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceIdAct " << servicenum << endl;
|
|
service = Yahoo::ServiceIdAct;
|
|
break;
|
|
case (Yahoo::ServiceIddeAct) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceIddeAct " << servicenum << endl;
|
|
service = Yahoo::ServiceIddeAct;
|
|
break;
|
|
case (Yahoo::ServicetqStatus) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceStatus " << servicenum << endl;
|
|
service = Yahoo::ServicetqStatus;
|
|
break;
|
|
case (Yahoo::ServiceMessage) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceMessage " << servicenum << endl;
|
|
service = Yahoo::ServiceMessage;
|
|
break;
|
|
case (Yahoo::ServiceNotify) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceNotify " << servicenum << endl;
|
|
service = Yahoo::ServiceNotify;
|
|
break;
|
|
case (Yahoo::ServiceBuddyAdd) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceBuddyAdd " << servicenum << endl;
|
|
service = Yahoo::ServiceBuddyAdd;
|
|
break;
|
|
case (Yahoo::ServiceBuddyRemove) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << "Parsed packet service - This means ServiceBuddyRemove " << servicenum << endl;
|
|
service = Yahoo::ServiceBuddyRemove;
|
|
break;
|
|
case (Yahoo::ServiceBuddyChangeGroup) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << "Parsed packet service - This means ServiceBuddyChangeGroup " << servicenum << endl;
|
|
service = Yahoo::ServiceBuddyChangeGroup;
|
|
break;
|
|
case (Yahoo::ServicePictureChecksum) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServicePictureChecksum " << servicenum << endl;
|
|
service = Yahoo::ServicePictureChecksum;
|
|
break;
|
|
case (Yahoo::ServicePicturetqStatus) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServicePictureStatus " << servicenum << endl;
|
|
service = Yahoo::ServicePicturetqStatus;
|
|
break;
|
|
case (Yahoo::ServicePicture) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServicePicture " << servicenum << endl;
|
|
service = Yahoo::ServicePicture;
|
|
break;
|
|
case (Yahoo::ServiceStealthOnline) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceStealthOnline " << servicenum << endl;
|
|
service = Yahoo::ServiceStealthOnline;
|
|
break;
|
|
case (Yahoo::ServiceStealthOffline) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceStealthOffline " << servicenum << endl;
|
|
service = Yahoo::ServiceStealthOffline;
|
|
break;
|
|
case (Yahoo::ServicePictureUpload) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServicePictureUpload " << servicenum << endl;
|
|
service = Yahoo::ServicePictureUpload;
|
|
break;
|
|
case (Yahoo::ServiceWebcam) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceWebcam " << servicenum << endl;
|
|
service = Yahoo::ServiceWebcam;
|
|
break;
|
|
case (Yahoo::ServiceConfInvite) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceConfInvite " << servicenum << endl;
|
|
service = Yahoo::ServiceConfInvite;
|
|
break;
|
|
case (Yahoo::ServiceConfLogon) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceConfLogon " << servicenum << endl;
|
|
service = Yahoo::ServiceConfLogon;
|
|
break;
|
|
case (Yahoo::ServiceConfDecline) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceConfDecline " << servicenum << endl;
|
|
service = Yahoo::ServiceConfDecline;
|
|
break;
|
|
case (Yahoo::ServiceConfLogoff) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceConfLogoff " << servicenum << endl;
|
|
service = Yahoo::ServiceConfLogoff;
|
|
break;
|
|
case (Yahoo::ServiceConfAddInvite) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceConfAddInvite " << servicenum << endl;
|
|
service = Yahoo::ServiceConfAddInvite;
|
|
break;
|
|
case (Yahoo::ServiceConfMsg) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceConfMsg " << servicenum << endl;
|
|
service = Yahoo::ServiceConfMsg;
|
|
break;
|
|
case (Yahoo::ServiceAuthorization) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceAuthorization " << servicenum << endl;
|
|
service = Yahoo::ServiceAuthorization;
|
|
break;
|
|
case (Yahoo::ServiceContactDetails) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceContactDetails " << servicenum << endl;
|
|
service = Yahoo::ServiceContactDetails;
|
|
break;
|
|
case (Yahoo::ServiceFileTransfer) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceFileTransfer " << servicenum << endl;
|
|
service = Yahoo::ServiceFileTransfer;
|
|
break;
|
|
case (Yahoo::ServiceFileTransfer7) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceFileTransfer7 " << servicenum << endl;
|
|
service = Yahoo::ServiceFileTransfer7;
|
|
break;
|
|
case (Yahoo::ServiceFileTransfer7Info) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceFileTransfer7Info " << servicenum << endl;
|
|
service = Yahoo::ServiceFileTransfer7Info;
|
|
break;
|
|
case (Yahoo::ServiceFileTransfer7Accept) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceFileTransfer7Accept " << servicenum << endl;
|
|
service = Yahoo::ServiceFileTransfer7Accept;
|
|
break;
|
|
case (Yahoo::ServicePeerToPeer) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServicePeerToPeer " << servicenum << endl;
|
|
service = Yahoo::ServicePeerToPeer;
|
|
break;
|
|
case (Yahoo::ServiceChatOnline) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceChatOnline " << servicenum << endl;
|
|
service = Yahoo::ServiceChatOnline;
|
|
break;
|
|
case (Yahoo::ServiceChatGoto) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceChatGoto " << servicenum << endl;
|
|
service = Yahoo::ServiceChatGoto;
|
|
break;
|
|
case (Yahoo::ServiceChatJoin) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceChatJoin " << servicenum << endl;
|
|
service = Yahoo::ServiceChatJoin;
|
|
break;
|
|
case (Yahoo::ServiceChatleave) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceChatleave " << servicenum << endl;
|
|
service = Yahoo::ServiceChatleave;
|
|
break;
|
|
case (Yahoo::ServiceChatExit) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceChatExit " << servicenum << endl;
|
|
service = Yahoo::ServiceChatExit;
|
|
break;
|
|
case (Yahoo::ServiceChatLogout) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceChatLogout " << servicenum << endl;
|
|
service = Yahoo::ServiceChatLogout;
|
|
break;
|
|
case (Yahoo::ServiceChatPing) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServicePeerToPeer " << servicenum << endl;
|
|
service = Yahoo::ServiceChatPing;
|
|
break;
|
|
case (Yahoo::ServiceChatLogon) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceChatLogon " << servicenum << endl;
|
|
service = Yahoo::ServiceChatLogon;
|
|
break;
|
|
case (Yahoo::ServiceChatLogoff) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceChatLogoff " << servicenum << endl;
|
|
service = Yahoo::ServiceChatLogoff;
|
|
break;
|
|
case (Yahoo::ServiceChatMsg) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceChatMsg " << servicenum << endl;
|
|
service = Yahoo::ServiceChatMsg;
|
|
break;
|
|
case (Yahoo::ServiceComment) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceComment " << servicenum << endl;
|
|
service = Yahoo::ServiceComment;
|
|
break;
|
|
case (Yahoo::ServiceBuddytqStatus) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceBuddyStatus " << servicenum << endl;
|
|
service = Yahoo::ServiceBuddytqStatus;
|
|
break;
|
|
case (Yahoo::ServiceBuddyList) :
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means ServiceBuddyList " << servicenum << endl;
|
|
service = Yahoo::ServiceBuddyList;
|
|
break;
|
|
/*
|
|
ServiceIdle, // 5 (placemarker)
|
|
ServiceMailStat,
|
|
ServiceUserStat, // 0xa
|
|
ServiceChatInvite,
|
|
ServiceCalendar,
|
|
ServiceNewPersonalMail,
|
|
ServiceNewContact,
|
|
ServiceAddIdent, // 0x10
|
|
ServiceAddIgnore,
|
|
ServiceGotGroupRename, // < 1, 36(old), 37(new)
|
|
ServiceSysMessage = 0x14,
|
|
ServicePassThrough2 = 0x16,
|
|
ServiceGameMsg = 0x2a,
|
|
ServiceFileTransfer = 0x46,
|
|
ServiceVoiceChat = 0x4A,
|
|
ServiceVerify = 76,
|
|
ServiceP2PFileXfer,
|
|
ServiceRemBuddy,
|
|
ServiceIgnoreContact, // > 1, 7, 13 < 1, 66, 13, 0
|
|
ServiceRejectContact,
|
|
ServiceGroupRename = 0x89, // > 1, 65(new), 66(0), 67(old)
|
|
ServicePictureUpdate = 0xc1,
|
|
ServiceVisibility = 0xc5, // YMSG13, key 13: 2 = invisible, 1 = visible
|
|
ServicetqStatus = 0xc6, // YMSG13
|
|
*/
|
|
|
|
default:
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed packet service - This means an unknown service " << servicenum << endl;
|
|
break;
|
|
}
|
|
|
|
statusnum = yahoo_get32(packet.data() + pos);
|
|
pos += 4;
|
|
|
|
switch (statusnum)
|
|
{
|
|
// TODO add remaining status
|
|
case (Yahoo::StatusAvailable) :
|
|
status = Yahoo::StatusAvailable;
|
|
break;
|
|
case (Yahoo::StatusBRB) :
|
|
status = Yahoo::StatusBRB;
|
|
break;
|
|
case (Yahoo::StatusDisconnected) :
|
|
status = Yahoo::StatusDisconnected;
|
|
break;
|
|
/*StatusBusy
|
|
StatusNotAtHome
|
|
StatusNotAtDesk
|
|
StatusNotInOffice
|
|
StatusOnPhone
|
|
StatusOnVacation
|
|
StatusOutToLunch
|
|
StatusSteppedOut
|
|
StatusInvisible
|
|
StatusCustom
|
|
StatusIdle
|
|
StatusOffline
|
|
StatusNotify*/
|
|
default:
|
|
kdDebug(YAHOO_RAW_DEBUG) << " - unknown status " << statusnum << endl;
|
|
break;
|
|
}
|
|
|
|
sessionid = yahoo_get32(packet.data() + pos);
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Parsed session id: " << (void *)sessionid << endl;
|
|
pos += 4;
|
|
|
|
kdDebug(YAHOO_RAW_DEBUG) << " Setting incoming transfer basic information." << endl;
|
|
YMSGTransfer *t = new YMSGTransfer();
|
|
t->setService(service);
|
|
t->setId(sessionid);
|
|
t->settqStatus(status);
|
|
t->setPacketLength(len);
|
|
|
|
TQString d = TQString::fromAscii( packet.data() + pos, packet.size() - pos );
|
|
TQStringList list = TQStringList::split( "\xc0\x80", d );
|
|
for( int i = 0; i+1 < list.size() && pos+1 < len+20; i += 2 ) {
|
|
TQString key = list[i];
|
|
TQString value = TQString::fromUtf8( list[i+1].ascii() );
|
|
pos += key.utf8().length() + value.utf8().length() + 4;
|
|
t->setParam( TQString(key).toInt(), value.utf8() );
|
|
kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << "Key: " << key << " Value: " << value << endl;
|
|
}
|
|
|
|
while( pos < packet.size() && packet.data()[pos] == '\x00' )
|
|
pos++;
|
|
|
|
// kdDebug(YAHOO_RAW_DEBUG) << " Returning transfer";
|
|
// tell them we have parsed offset bytes
|
|
|
|
bytes = pos;
|
|
return t;
|
|
}
|
|
|
|
#include "ymsgprotocol.moc"
|