summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/yahoo/libkyahoo/ymsgtransfer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/protocols/yahoo/libkyahoo/ymsgtransfer.cpp')
-rw-r--r--kopete/protocols/yahoo/libkyahoo/ymsgtransfer.cpp239
1 files changed, 239 insertions, 0 deletions
diff --git a/kopete/protocols/yahoo/libkyahoo/ymsgtransfer.cpp b/kopete/protocols/yahoo/libkyahoo/ymsgtransfer.cpp
new file mode 100644
index 00000000..f47a07d1
--- /dev/null
+++ b/kopete/protocols/yahoo/libkyahoo/ymsgtransfer.cpp
@@ -0,0 +1,239 @@
+/*
+ Kopete Yahoo Protocol
+ Handles logging into to the Yahoo service
+
+ Copyright (c) 2004 Duncan Mac-Vicar P. <[email protected]>
+
+ Copyright (c) 2005 AndrĂ© Duffeck <[email protected]>
+
+ Kopete (c) 2002-2005 by the Kopete developers <[email protected]>
+
+ *************************************************************************
+ * *
+ * 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 <string>
+
+#include "ymsgtransfer.h"
+#include "yahootypes.h"
+#include "kdebug.h"
+#include <qdatastream.h>
+#include <qmap.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+
+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()
+{
+ return d->valid;
+}
+
+Yahoo::Service YMSGTransfer::service()
+{
+ return d->service;
+}
+
+void YMSGTransfer::setService(Yahoo::Service service)
+{
+ d->service = service;
+}
+
+Yahoo::Status YMSGTransfer::status()
+{
+ return d->status;
+}
+
+void YMSGTransfer::setStatus(Yahoo::Status status)
+{
+ d->status = status;
+}
+
+unsigned int YMSGTransfer::id()
+{
+ return d->id;
+}
+
+void YMSGTransfer::setId(unsigned int id)
+{
+ d->id = id;
+}
+
+ParamList YMSGTransfer::paramList()
+{
+ return d->data;
+}
+
+int YMSGTransfer::paramCount( int index )
+{
+ int cnt = 0;
+ for (ParamList::ConstIterator it = d->data.begin(); it != d->data.end(); ++it)
+ {
+ if( (*it).first == index )
+ cnt++;
+ }
+ return cnt;
+}
+
+
+QCString YMSGTransfer::nthParam( int index, int occurence )
+{
+ int cnt = 0;
+ for (ParamList::ConstIterator it = d->data.begin(); it != d->data.end(); ++it)
+ {
+ if( (*it).first == index && cnt++ == occurence)
+ return (*it).second;
+ }
+ return QCString();
+}
+
+QCString YMSGTransfer::nthParamSeparated( int index, int occurence, int separator )
+{
+
+ int cnt = -1;
+ for (ParamList::ConstIterator it = d->data.begin(); it != d->data.end(); ++it)
+ {
+ if( (*it).first == separator )
+ cnt++;
+ if( (*it).first == index && cnt == occurence)
+ return (*it).second;
+ }
+ return QCString();
+}
+
+QCString YMSGTransfer::firstParam( int index )
+{
+ for (ParamList::ConstIterator it = d->data.begin(); it != d->data.end(); ++it)
+ {
+ if( (*it).first == index )
+ return (*it).second;
+ }
+ return QCString();
+}
+
+void YMSGTransfer::setParam(int index, const QCString &data)
+{
+ d->data.append( Param( index, data ) );
+}
+
+void YMSGTransfer::setParam( int index, int data )
+{
+ d->data.append( Param( index, QString::number( data ).local8Bit() ) );
+}
+
+int YMSGTransfer::length()
+{
+ int len = 0;
+ for (ParamList::ConstIterator it = d->data.begin(); it != d->data.end(); ++it)
+ {
+ len += QString::number( (*it).first ).length();
+ len += 2;
+ len += (*it).second.length();
+ len += 2;
+ }
+ return len;
+}
+
+
+QByteArray YMSGTransfer::serialize()
+{
+ /*
+ <------- 4B -------><------- 4B -------><---2B--->
+ +-------------------+-------------------+---------+
+ | Y M S G | version | pkt_len |
+ +---------+---------+---------+---------+---------+
+ | service | status | session_id |
+ +---------+-------------------+-------------------+
+ | |
+ : D A T A :
+ / 0 - 65535* |
+ +-------------------------------------------------+
+ */
+
+ int pos = 0;
+ QStringList::ConstIterator listIt = 0;
+ QByteArray buffer;
+ QDataStream stream( buffer, IO_WriteOnly );
+
+ stream << (Q_INT8)'Y' << (Q_INT8)'M' << (Q_INT8)'S' << (Q_INT8)'G';
+ if( d->service == Yahoo::ServicePictureUpload )
+ stream << (Q_INT16)0x0e00;
+ else
+ stream << (Q_INT16)0x000e;
+ stream << (Q_INT16)0x0000;
+ if( d->service == Yahoo::ServicePictureUpload ||
+ d->service == Yahoo::ServiceFileTransfer )
+ stream << (Q_INT16)(length()+4);
+ else
+ stream << (Q_INT16)length();
+ stream << (Q_INT16)d->service;
+ stream << (Q_INT32)d->status;
+ stream << (Q_INT32)d->id;
+ for (ParamList::ConstIterator it = d->data.begin(); it != d->data.end(); ++it)
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << " Serializing key " << (*it).first << " value " << (*it).second << endl;
+ stream.writeRawBytes ( QString::number( (*it).first ).local8Bit(), QString::number( (*it).first ).length() );
+ stream << (Q_INT8)0xc0 << (Q_INT8)0x80;
+ stream.writeRawBytes( (*it).second, (*it).second.length() );
+ stream << (Q_INT8)0xc0 << (Q_INT8)0x80;
+ }
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << " pos=" << pos << " (packet size)" << buffer << endl;
+ return buffer;
+}
+