/* Kopete Yahoo Protocol Receive Messages Copyright (c) 2005 André Duffeck ************************************************************************* * * * 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 "messagereceivertask.h" #include "transfer.h" #include "ymsgtransfer.h" #include "yahootypes.h" #include "client.h" #include MessageReceiverTask::MessageReceiverTask(Task* tqparent) : Task(tqparent) { kdDebug(YAHOO_RAW_DEBUG) ; } MessageReceiverTask::~MessageReceiverTask() { } bool MessageReceiverTask::take( Transfer* transfer ) { if ( !forMe( transfer ) ) return false; YMSGTransfer *t = 0L; t = dynamic_cast(transfer); if (!t) return false; if( t->service() == Yahoo::ServiceNotify ) parseNotify( t ); else parseMessage( t ); return true; } bool MessageReceiverTask::forMe( const Transfer* transfer ) const { const YMSGTransfer *t = 0L; t = dynamic_cast(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) ; int cnt = t->paramCount( 5 ); for( int i = 0; i < cnt; ++i ) { TQString to = t->nthParam( 5, i ); TQString timestamp = t->nthParamSeparated( 15, i, 4 ); TQString utf8 = t->nthParamSeparated( 97, i, 4 ); TQString from = t->nthParamSeparated( 1, i, 4 ).isEmpty() ? t->nthParam( 4, i ) : t->nthParamSeparated( 1, i, 4 ); TQString msg = t->nthParamSeparated( 14, i, 4 ); TQString 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) << "Got a empty message. Dropped." << endl; continue; } if( utf8.startsWith( "1" ) ) msg = TQString::fromUtf8( msg.latin1() ); if( t->service() == Yahoo::ServiceSysMessage ) emit systemMessage( sysmsg ); else { if( msg.startsWith( "" ) ) emit gotBuzz( from, timestamp.toLong() ); else emit gotIm( from, msg, timestamp.toLong(), 0); } } } void MessageReceiverTask::parseNotify( YMSGTransfer *t ) { kdDebug(YAHOO_RAW_DEBUG) ; TQString from = t->firstParam( 4 ); //TQString to = t->firstParam( 5 ); TQString type = t->firstParam( 49 ); TQString stat = t->firstParam( 13 ); TQString 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) << "Got a WebcamInvitation." << endl; emit gotWebcamInvite( from ); } else { kdDebug(YAHOO_RAW_DEBUG) << "Got a WebcamRequest-Response: " << ind.toInt() << endl; } } } #include "messagereceivertask.moc"