/* Kopete Yahoo Protocol Handles logging into to the Yahoo service Copyright (c) 2004 Duncan Mac-Vicar P. Copyright (c) 2005 André Duffeck Kopete (c) 2002-2005 by the Kopete developers ************************************************************************* * * * 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 #include "ymsgtransfer.h" #include "yahootypes.h" #include "kdebug.h" #include #include #include #include using namespace Yahoo; class YMSGTransferPrivate { public: int yflag; int version; int packetLength; Yahoo::Service service; Yahoo::Status status; unsigned int id; ParamList data; bool valid; }; YMSGTransfer::YMSGTransfer() { d = new YMSGTransferPrivate; d->valid = true; d->id = 0; d-> status = Yahoo::StatusAvailable; } YMSGTransfer::YMSGTransfer(Yahoo::Service service) { d = new YMSGTransferPrivate; d->valid = true; d->service = service; d->id = 0; d->status = Yahoo::StatusAvailable; } YMSGTransfer::YMSGTransfer(Yahoo::Service service, Yahoo::Status status) { d = new YMSGTransferPrivate; d->valid = true; d->service = service; d->id = 0; d->status = status; } YMSGTransfer::~YMSGTransfer() { delete d; } Transfer::TransferType YMSGTransfer::type() { return Transfer::YMSGTransfer; } bool YMSGTransfer::isValid() const { return d->valid; } Yahoo::Service YMSGTransfer::service() const { return d->service; } void YMSGTransfer::setService(Yahoo::Service service) { d->service = service; } Yahoo::Status YMSGTransfer::status() const { return d->status; } void YMSGTransfer::setStatus(Yahoo::Status status) { d->status = status; } unsigned int YMSGTransfer::id() const { return d->id; } void YMSGTransfer::setId(unsigned int id) { d->id = id; } int YMSGTransfer::packetLength() const { return d->packetLength; } void YMSGTransfer::setPacketLength(int len) { d->packetLength = len; } ParamList YMSGTransfer::paramList() const { return d->data; } int YMSGTransfer::paramCount( int index ) const { int cnt = 0; for (ParamList::ConstIterator it = d->data.constBegin(); it != d->data.constEnd(); ++it) { if( (*it).first == index ) cnt++; } return cnt; } TQCString YMSGTransfer::nthParam( int index, int occurrence ) const { int cnt = 0; for (ParamList::ConstIterator it = d->data.constBegin(); it != d->data.constEnd(); ++it) { if( (*it).first == index && cnt++ == occurrence) return (*it).second; } return TQCString(); } TQCString YMSGTransfer::nthParamSeparated( int index, int occurrence, int separator ) const { int cnt = -1; for (ParamList::ConstIterator it = d->data.constBegin(); it != d->data.constEnd(); ++it) { if( (*it).first == separator ) cnt++; if( (*it).first == index && cnt == occurrence) return (*it).second; } return TQCString(); } TQCString YMSGTransfer::firstParam( int index ) const { for (ParamList::ConstIterator it = d->data.constBegin(); it != d->data.constEnd(); ++it) { if( (*it).first == index ) return (*it).second; } return TQCString(); } void YMSGTransfer::setParam(int index, const TQCString &data) { d->data.append( Param( index, data ) ); } void YMSGTransfer::setParam( int index, int data ) { d->data.append( Param( index, TQString::number( data ).local8Bit() ) ); } int YMSGTransfer::length() const { int len = 0; for (ParamList::ConstIterator it = d->data.constBegin(); it != d->data.constEnd(); ++it) { len += TQString::number( (*it).first ).length(); len += 2; len += (*it).second.length(); len += 2; } return len; } TQByteArray YMSGTransfer::serialize() const { /* <------- 4B -------><------- 4B -------><---2B---> +-------------------+-------------------+---------+ | Y M S G | version | pkt_len | +---------+---------+---------+---------+---------+ | service | status | session_id | +---------+-------------------+-------------------+ | | : D A T A : / 0 - 65535* | +-------------------------------------------------+ */ int pos = 0; TQStringList::ConstIterator listIt = 0; TQByteArray buffer; TQDataStream stream( buffer, IO_WriteOnly ); stream << (TQ_INT8)'Y' << (TQ_INT8)'M' << (TQ_INT8)'S' << (TQ_INT8)'G'; if( d->service == Yahoo::ServicePictureUpload ) stream << (TQ_INT16)0x0f00; else stream << (TQ_INT16)0x000f; stream << (TQ_INT16)0x0000; if( d->service == Yahoo::ServicePictureUpload || d->service == Yahoo::ServiceFileTransfer ) stream << (TQ_INT16)(length()+4); else stream << (TQ_INT16)length(); stream << (TQ_INT16)d->service; stream << (TQ_INT32)d->status; stream << (TQ_INT32)d->id; for (ParamList::ConstIterator it = d->data.constBegin(); it != d->data.constEnd(); ++it) { kdDebug(YAHOO_RAW_DEBUG) << " Serializing key " << (*it).first << " value " << (*it).second << endl; stream.writeRawBytes ( TQString::number( (*it).first ).local8Bit(), TQString::number( (*it).first ).length() ); stream << (TQ_INT8)0xc0 << (TQ_INT8)0x80; stream.writeRawBytes( (*it).second, (*it).second.length() ); stream << (TQ_INT8)0xc0 << (TQ_INT8)0x80; } kdDebug(YAHOO_RAW_DEBUG) << " pos=" << pos << " (packet size)" << buffer << endl; return buffer; }