summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/yahoo/libkyahoo/messagereceivertask.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/protocols/yahoo/libkyahoo/messagereceivertask.cpp')
-rw-r--r--kopete/protocols/yahoo/libkyahoo/messagereceivertask.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/kopete/protocols/yahoo/libkyahoo/messagereceivertask.cpp b/kopete/protocols/yahoo/libkyahoo/messagereceivertask.cpp
new file mode 100644
index 00000000..f814d244
--- /dev/null
+++ b/kopete/protocols/yahoo/libkyahoo/messagereceivertask.cpp
@@ -0,0 +1,148 @@
+/*
+ Kopete Yahoo Protocol
+ Receive Messages
+
+ Copyright (c) 2005 AndrĂ© Duffeck <[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 <qstring.h>
+
+#include "messagereceivertask.h"
+#include "transfer.h"
+#include "ymsgtransfer.h"
+#include "yahootypes.h"
+#include "client.h"
+#include <qstring.h>
+#include <kdebug.h>
+
+MessageReceiverTask::MessageReceiverTask(Task* parent) : Task(parent)
+{
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
+}
+
+MessageReceiverTask::~MessageReceiverTask()
+{
+}
+
+bool MessageReceiverTask::take( Transfer* transfer )
+{
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
+
+ if ( !forMe( transfer ) )
+ return false;
+
+ YMSGTransfer *t = 0L;
+ t = dynamic_cast<YMSGTransfer*>(transfer);
+ if (!t)
+ return false;
+
+ if( t->service() == Yahoo::ServiceNotify )
+ parseNotify( t );
+ else
+ parseMessage( t );
+
+ return true;
+}
+
+bool MessageReceiverTask::forMe( Transfer* transfer ) const
+{
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
+
+ YMSGTransfer *t = 0L;
+ t = dynamic_cast<YMSGTransfer*>(transfer);
+ if (!t)
+ return false;
+
+ if ( t->service() == Yahoo::ServiceMessage ||
+ t->service() == Yahoo::ServiceGameMsg ||
+ t->service() == Yahoo::ServiceSysMessage ||
+ t->service() == Yahoo::ServiceNotify )
+ return true;
+ else
+ return false;
+}
+
+void MessageReceiverTask::parseMessage( YMSGTransfer *t )
+{
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
+
+ int cnt = t->paramCount( 5 );
+ for( int i = 0; i < cnt; ++i )
+ {
+ QString to = t->nthParam( 5, i );
+ QString timestamp = t->nthParamSeparated( 15, i, 4 );
+ QString utf8 = t->nthParamSeparated( 97, i, 4 );
+ QString from = t->nthParamSeparated( 1, i, 4 ).isEmpty() ? t->nthParam( 4, i ) : t->nthParamSeparated( 1, i, 4 );
+ QString msg = t->nthParamSeparated( 14, i, 4 );
+ QString sysmsg = t->nthParamSeparated( 16, i, 4 );
+
+ // The arrangement of the key->value pairs is different when there is only one message in the packet.
+ // Separating by key "5" (sender) doesn't work in that case, because the "1" and "4" keys are sent before the "5" key
+ if( cnt == 1 )
+ from = t->firstParam( 1 ).isEmpty() ? t->firstParam( 4 ) : t->firstParam( 1 );
+
+ if( !sysmsg.isEmpty() )
+ {
+ client()->notifyError( "Server message received: ", sysmsg, Client::Error );
+ continue;
+ }
+
+ if( msg.isEmpty() )
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << "Got a empty message. Dropped." << endl;
+ continue;
+ }
+
+ if( utf8.startsWith( "1" ) )
+ msg = QString::fromUtf8( msg.latin1() );
+
+ if( t->service() == Yahoo::ServiceSysMessage )
+ emit systemMessage( sysmsg );
+ else
+ {
+ if( msg.startsWith( "<ding>" ) )
+ emit gotBuzz( from, timestamp.toLong() );
+ else
+ emit gotIm( from, msg, timestamp.toLong(), 0);
+ }
+ }
+}
+
+void MessageReceiverTask::parseNotify( YMSGTransfer *t )
+{
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
+
+ QString from = t->firstParam( 4 );
+ //QString to = t->firstParam( 5 );
+ QString type = t->firstParam( 49 );
+ QString stat = t->firstParam( 13 );
+ QString ind = t->firstParam( 14 );
+
+ if( type.startsWith( "TYPING" ) )
+ emit gotTypingNotify( from, stat.toInt() );
+ else if( type.startsWith( "GAME" ) )
+ ;
+ else if( type.startsWith( "WEBCAMINVITE" ) )
+ {
+ if( ind.startsWith(" ") )
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << "Got a WebcamInvitation." << endl;
+ emit gotWebcamInvite( from );
+ }
+ else
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << "Got a WebcamRequest-Response: " << ind.toInt() << endl;
+ }
+ }
+}
+
+#include "messagereceivertask.moc"