summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kopete/protocols/yahoo/libkyahoo/yahoochattask.cpp348
-rw-r--r--kopete/protocols/yahoo/libkyahoo/yahoochattask.h87
2 files changed, 435 insertions, 0 deletions
diff --git a/kopete/protocols/yahoo/libkyahoo/yahoochattask.cpp b/kopete/protocols/yahoo/libkyahoo/yahoochattask.cpp
new file mode 100644
index 00000000..56834a83
--- /dev/null
+++ b/kopete/protocols/yahoo/libkyahoo/yahoochattask.cpp
@@ -0,0 +1,348 @@
+/*
+ Kopete Yahoo Protocol
+ yahoochattask.cpp - Handle Yahoo Chat
+
+ Copyright (c) 2006 André Duffeck <duffeck@kde.org>
+ Kopete (c) 2002-2006 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 "yahoochattask.h"
+#include "transfer.h"
+#include "ymsgtransfer.h"
+#include "yahootypes.h"
+#include "client.h"
+#include <kdebug.h>
+#include <klocale.h>
+#include <kio/global.h>
+#include <kio/job.h>
+#include <kio/jobclasses.h>
+#include <qdom.h>
+
+YahooChatTask::YahooChatTask(Task* parent) : Task(parent)
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+ m_loggedIn = false;
+}
+
+YahooChatTask::~YahooChatTask()
+{
+}
+
+bool YahooChatTask::take( Transfer* transfer )
+{
+ if ( !forMe( transfer ) )
+ return false;
+
+ YMSGTransfer *t = 0L;
+ t = dynamic_cast<YMSGTransfer*>(transfer);
+ if (!t)
+ return false;
+
+ if( t->service() == Yahoo::ServiceChatOnline )
+ parseLoginResponse( t );
+ else if( t->service() == Yahoo::ServiceComment )
+ parseChatMessage( t );
+ else if( t->service() == Yahoo::ServiceChatJoin )
+ parseJoin( t );
+ else if( t->service() == Yahoo::ServiceChatExit )
+ parseChatExit( t );
+ else if( t->service() == Yahoo::ServiceChatLogout )
+ parseLogout( t );
+ return true;
+}
+
+bool YahooChatTask::forMe( const Transfer* transfer ) const
+{
+ const YMSGTransfer *t = 0L;
+ t = dynamic_cast<const YMSGTransfer*>(transfer);
+ if (!t)
+ return false;
+
+ if ( t->service() == Yahoo::ServiceChatOnline ||
+ t->service() == Yahoo::ServiceChatGoto ||
+ t->service() == Yahoo::ServiceChatJoin ||
+ t->service() == Yahoo::ServiceChatleave ||
+ t->service() == Yahoo::ServiceChatExit ||
+ t->service() == Yahoo::ServiceChatLogout ||
+ t->service() == Yahoo::ServiceChatPing ||
+ t->service() == Yahoo::ServiceChatLogon ||
+ t->service() == Yahoo::ServiceChatLogoff ||
+ t->service() == Yahoo::ServiceComment )
+ return true;
+ else
+ return false;
+}
+
+void YahooChatTask::onGo()
+{
+}
+
+void YahooChatTask::getYahooChatCategories()
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+ KIO::TransferJob *transfer;
+
+ transfer = KIO::get( KURL("http://insider.msg.yahoo.com/ycontent/?chatcat=0"), false, false );
+ transfer->addMetaData( "UserAgent", "Mozilla/4.0 (compatible; MSIE 5.5)");
+ transfer->addMetaData( "no-cache", "true" );
+ transfer->addMetaData( "cookies", "manual" );
+ transfer->addMetaData("setcookies", QString("Cookie: %1; %2; %3").arg(client()->tCookie(), client()->yCookie()) );
+
+
+ connect( transfer, SIGNAL( result( KIO::Job* ) ), this, SLOT( slotCategoriesComplete( KIO::Job* ) ) );
+ connect( transfer, SIGNAL( data( KIO::Job*, const QByteArray& ) ), this, SLOT( slotData( KIO::Job*, const QByteArray& ) ) );
+}
+
+void YahooChatTask::getYahooChatRooms( const Yahoo::ChatCategory &category )
+{
+ kdDebug(YAHOO_RAW_DEBUG) << "Category Id: " << category.id << endl;
+ KIO::TransferJob *transfer;
+
+ transfer = KIO::get( KURL(QString("http://insider.msg.yahoo.com/ycontent/?chatroom_%1=0").arg( category.id )), false, false );
+ transfer->addMetaData( "UserAgent", "Mozilla/4.0 (compatible; MSIE 5.5)");
+ transfer->addMetaData( "no-cache", "true" );
+ transfer->addMetaData( "cookies", "manual" );
+ transfer->addMetaData("setcookies", QString("Cookie: %1; %2; %3").arg(client()->tCookie(), client()->yCookie()) );
+
+
+ connect( transfer, SIGNAL( result( KIO::Job* ) ), this, SLOT( slotChatRoomsComplete( KIO::Job* ) ) );
+ connect( transfer, SIGNAL( data( KIO::Job*, const QByteArray& ) ), this, SLOT( slotData( KIO::Job*, const QByteArray& ) ) );
+
+ m_jobs[ transfer ].category = category;
+}
+
+void YahooChatTask::slotData( KIO::Job *job, const QByteArray& data)
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+ // FIXME (same)
+ //m_jobs[job].data.append( data );
+}
+
+void YahooChatTask::slotCategoriesComplete( KIO::Job *job )
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+
+ KIO::TransferJob *transfer = static_cast< KIO::TransferJob * >(job);
+
+ if ( job->error () || transfer->isErrorPage () )
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << "An error occurred while downloading the chat categories list." << endl;
+ }
+ else
+ {
+ QDomDocument doc;
+ doc.setContent( m_jobs[ transfer ].data );
+ emit gotYahooChatCategories( doc );
+ }
+
+ m_jobs.remove( transfer );
+}
+
+void YahooChatTask::slotChatRoomsComplete( KIO::Job *job )
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+
+ KIO::TransferJob *transfer = static_cast< KIO::TransferJob * >(job);
+
+ if ( job->error () || transfer->isErrorPage () )
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << "An error occurred while downloading the chat categories list." << endl;
+ }
+ else
+ {
+ QDomDocument doc;
+ doc.setContent( m_jobs[ transfer ].data );
+// kdDebug(YAHOO_RAW_DEBUG) << doc.toString();
+ emit gotYahooChatRooms( m_jobs[ transfer ].category, doc );
+ }
+
+ m_jobs.remove( transfer );
+}
+
+void YahooChatTask::joinRoom( const Yahoo::ChatRoom &room )
+{
+ kdDebug(YAHOO_RAW_DEBUG) << "Joining room " << room.name << " (" << room.id << ")..." << endl;
+ if( !m_loggedIn )
+ {
+ m_pendingJoins.append( room );
+ login();
+ return;
+ }
+
+ YMSGTransfer *t = new YMSGTransfer(Yahoo::ServiceChatJoin);
+ t->setId( client()->sessionID() );
+ t->setParam( 1, client()->userId().local8Bit() );
+ t->setParam( 104, room.name.local8Bit() );
+ t->setParam( 129, room.id );
+ t->setParam( 62, 2 );
+
+ send( t );
+}
+
+void YahooChatTask::sendYahooChatMessage( const QString &msg, const QString &handle )
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+ if( !m_loggedIn )
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << "Error: trying to send, but not logged in." << endl;
+ return;
+ }
+
+ YMSGTransfer *t = new YMSGTransfer(Yahoo::ServiceComment);
+ t->setId( client()->sessionID() );
+ t->setParam( 1, client()->userId().local8Bit() );
+ t->setParam( 104, handle.local8Bit() );
+ t->setParam( 117, msg.local8Bit() );
+ t->setParam( 124, 1 );
+
+ send( t );
+}
+
+void YahooChatTask::login()
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+
+ YMSGTransfer *t = new YMSGTransfer(Yahoo::ServiceChatOnline);
+ t->setId( client()->sessionID() );
+ t->setParam( 1, client()->userId().local8Bit() );
+ t->setParam( 135, QString("ym%1").arg(YMSG_PROGRAM_VERSION_STRING).local8Bit() );
+
+ send( t );
+}
+
+void YahooChatTask::logout()
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+
+ YMSGTransfer *t = new YMSGTransfer(Yahoo::ServiceChatLogout);
+ t->setId( client()->sessionID() );
+ t->setParam( 1, client()->userId().local8Bit() );
+
+ send( t );
+}
+
+void YahooChatTask::parseLoginResponse( YMSGTransfer *t )
+{
+ if( !QString(t->firstParam( 1 )).startsWith( client()->userId().local8Bit() ) )
+ return;
+ m_loggedIn = true;
+
+ QValueList< Yahoo::ChatRoom >::iterator it;
+ for ( it = m_pendingJoins.begin(); it != m_pendingJoins.end(); ++it )
+ //for( int i = 0; i < m_pendingJoins.size(); ++i )
+ {
+ // FIXME (same)
+ // Yahoo::ChatRoom entry = m_pendingJoins.at( i );
+ Yahoo::ChatRoom entry = *it;
+ joinRoom( entry );
+
+ // FIXME (same)
+ //m_pendingJoins.removeAt( i );
+ m_pendingJoins.erase(it);
+ }
+}
+
+void YahooChatTask::parseJoin( YMSGTransfer *t )
+{
+ int room;
+ int category;
+ QString handle;
+ QString comment;
+ bool suppressJoinNotification = false;
+ QString error;
+
+ room = t->firstParam( 129 ).toInt();
+ category = t->firstParam( 128 ).toInt();
+ handle = t->firstParam( 104 );
+ comment = t->firstParam( 105 );
+ error = t->firstParam( 114 );
+
+ if( error.startsWith( "-35" ) ) {
+ client()->notifyError( i18n("Could not join chat"),
+ i18n("The room is full. Please choose another one."), Client::Error );
+ return;
+ } else if( error.startsWith( "-15" ) ) {
+ client()->notifyError( i18n("Could not join chat"),
+ i18n("Invalid user."), Client::Error );
+ return;
+ } else if( !error.isEmpty() ) {
+ client()->notifyError( i18n("Could not join chat"),
+ i18n("An unknown error occurred while joining the chat room."), Client::Error );
+ return;
+ }
+
+ // Yahoo sends a captcha requests before we can join the room
+ if( room == 0 && category == 0 && !comment.isEmpty() )
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << "Showing captcha request" << endl;
+ emit chatRoomJoined( room, category, "", handle );
+ emit chatMessageReceived( "Yahoo", comment, handle );
+ }
+
+ if( room > 0 && category > 0 )
+ {
+ // We have just joined this room. Suppress join notifications for the people
+ // that are already in here.
+ suppressJoinNotification = true;
+ emit chatRoomJoined( room, category, comment, handle );
+ }
+
+ QString nick;
+ for( int i = 0; i < t->paramCount( 109 ); ++i )
+ {
+ nick = t->nthParam( 109 , i );
+ emit chatBuddyHasJoined( nick, handle, suppressJoinNotification );
+ }
+}
+
+void YahooChatTask::parseChatMessage( YMSGTransfer *t )
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+
+ QString handle;
+ QString msg;
+ QString nick;
+
+ handle = t->firstParam( 104 );
+ for( int i = 0; i < t->paramCount( 109 ); ++i )
+ {
+ nick = t->nthParam( 109, i );
+ msg = t->nthParamSeparated( 117, i, 109 );
+ emit chatMessageReceived( nick, msg, handle );
+ }
+}
+
+void YahooChatTask::parseChatExit( YMSGTransfer *t )
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+
+ QString handle;
+ QString nick;
+
+ handle = t->firstParam( 104 );
+ for( int i = 0; i < t->paramCount( 109 ); ++i )
+ {
+ nick = t->nthParam( 109, i );
+ emit chatBuddyHasLeft( nick, handle );
+ }
+}
+
+void YahooChatTask::parseLogout( YMSGTransfer *t )
+{
+ kdDebug(YAHOO_RAW_DEBUG) ;
+
+ QString nick = t->firstParam( 1 );
+ if( nick == client()->userId() )
+ m_loggedIn = false;
+}
+
+#include "yahoochattask.moc"
diff --git a/kopete/protocols/yahoo/libkyahoo/yahoochattask.h b/kopete/protocols/yahoo/libkyahoo/yahoochattask.h
new file mode 100644
index 00000000..310b174d
--- /dev/null
+++ b/kopete/protocols/yahoo/libkyahoo/yahoochattask.h
@@ -0,0 +1,87 @@
+/*
+ Kopete Yahoo Protocol
+ yahoochattask.h - Handle Yahoo Chat
+
+ Copyright (c) 2006 André Duffeck <duffeck@kde.org>
+ Kopete (c) 2002-2006 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. *
+ * *
+ *************************************************************************
+*/
+
+#ifndef YAHOOCHATTASK_H
+#define YAHOOCHATTASK_H
+
+#include "task.h"
+#include "yahootypes.h"
+#include <qmap.h>
+#include <qvaluelist.h>
+#include <qpair.h>
+
+class QDomDocument;
+class YMSGTransfer;
+namespace KIO {
+ class Job;
+}
+
+struct YahooChatJob {
+ QByteArray data;
+ Yahoo::ChatCategory category;
+};
+
+/**
+@author André Duffeck
+*/
+class YahooChatTask : public Task
+{
+Q_OBJECT
+public:
+ YahooChatTask(Task *parent);
+ virtual ~YahooChatTask();
+
+ virtual void onGo();
+ virtual bool forMe( const Transfer *transfer ) const;
+ bool take(Transfer *transfer);
+
+ void getYahooChatCategories();
+ void getYahooChatRooms( const Yahoo::ChatCategory &category );
+
+ void joinRoom( const Yahoo::ChatRoom &room );
+
+ void sendYahooChatMessage( const QString &msg, const QString &handle );
+
+ void logout();
+
+signals:
+ void gotYahooChatCategories( const QDomDocument & );
+ void gotYahooChatRooms( const Yahoo::ChatCategory &, const QDomDocument & );
+
+ void chatRoomJoined( int roomId, int categoryId, const QString &comment, const QString &handle );
+ void chatBuddyHasJoined( const QString &nick, const QString &handle, bool suppressNotification );
+ void chatBuddyHasLeft( const QString &nick, const QString &handle );
+ void chatMessageReceived( const QString &nick, const QString &message, const QString &handle );
+private:
+ void login();
+ void parseLoginResponse( YMSGTransfer *t );
+ void parseJoin( YMSGTransfer *t );
+ void parseChatMessage( YMSGTransfer * );
+ void parseChatExit( YMSGTransfer * );
+ void parseLogout( YMSGTransfer * );
+
+private slots:
+ void slotData( KIO::Job *, const QByteArray & );
+ void slotCategoriesComplete( KIO::Job * );
+ void slotChatRoomsComplete( KIO::Job * );
+private:
+ QMap< KIO::Job *, YahooChatJob > m_jobs;
+ QValueList< Yahoo::ChatRoom > m_pendingJoins;
+ bool m_loggedIn;
+};
+
+#endif