You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/kopete/protocols/yahoo/libkyahoo/receivefiletask.cpp

244 lines
7.0 KiB

/*
Kopete Yahoo Protocol
Receive a file
Copyright (c) 2006 André Duffeck <andre.duffeck@kdemail.net>
*************************************************************************
* *
* 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 "receivefiletask.h"
#include "transfer.h"
#include "ymsgtransfer.h"
#include "yahootypes.h"
#include "client.h"
#include <qstring.h>
#include <qtimer.h>
#include <kdebug.h>
#include <klocale.h>
#include <kio/global.h>
#include <kio/job.h>
#include <kio/jobclasses.h>
ReceiveFileTask::ReceiveFileTask(Task* parent) : Task(parent)
{
kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
m_transmitted = 0;
m_file = 0;
m_transferJob = 0;
}
ReceiveFileTask::~ReceiveFileTask()
{
delete m_file;
m_file = 0;
}
void ReceiveFileTask::onGo()
{
kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
YMSGTransfer *t = new YMSGTransfer(Yahoo::ServiceFileTransfer7);
switch( m_type )
{
case FileTransferAccept:
m_file = new QFile( m_localUrl.path() );
if( !m_file->open( IO_WriteOnly ) )
{
emit error( m_transferId, KIO::ERR_CANNOT_OPEN_FOR_WRITING, i18n("Could not open file for writing.") );
setSuccess( false );
return;
}
m_transferJob = KIO::get( m_remoteUrl, false, false );
QObject::connect( m_transferJob, SIGNAL( result( KIO::Job* ) ), this, SLOT( slotComplete( KIO::Job* ) ) );
QObject::connect( m_transferJob, SIGNAL( data( KIO::Job*, const QByteArray & ) ), this, SLOT( slotData( KIO::Job*, const QByteArray & ) ) );
delete t;
break;
case FileTransfer7Accept:
t->setId( client()->sessionID() );
t->setParam( 1, client()->userId().local8Bit() );
t->setParam( 5, m_userId.local8Bit() );
t->setParam( 265, m_remoteUrl.url().local8Bit() );
t->setParam( 222, 3 );
send( t );
break;
case FileTransfer7Reject:
t->setId( client()->sessionID() );
t->setParam( 1, client()->userId().local8Bit() );
t->setParam( 5, m_userId.local8Bit() );
t->setParam( 265, m_remoteUrl.url().local8Bit() );
t->setParam( 222, 4 );
send( t );
break;
default:
delete t;
}
}
bool ReceiveFileTask::take( Transfer* transfer )
{
kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
if ( !forMe( transfer ) )
return false;
YMSGTransfer *t = static_cast<YMSGTransfer*>(transfer);
parseFileTransfer7Info( t );
return true;
}
bool ReceiveFileTask::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::ServiceFileTransfer7Info )
{
// Only take this transfer if we are the corresponding task (in case of simultaneous file transfers)
if( t->firstParam( 265 ) == m_remoteUrl.url().local8Bit() )
return true;
else
return false;
}
else
return false;
}
void ReceiveFileTask::slotData( KIO::Job *job, const QByteArray& data )
{
Q_UNUSED( job );
kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
m_transmitted += data.size();
emit bytesProcessed( m_transferId, m_transmitted );
m_file->writeBlock( data.data() , data.size() );
}
void ReceiveFileTask::slotComplete( KIO::Job *job )
{
kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
KIO::TransferJob *transfer = static_cast< KIO::TransferJob * >(job);
if( m_file )
m_file->close();
if ( job->error () || transfer->isErrorPage () )
{
emit error( m_transferId, KIO::ERR_ABORTED, i18n("An error occured while downloading the file.") );
setSuccess( false );
}
else
{
emit complete( m_transferId );
setSuccess( true );
}
}
void ReceiveFileTask::parseFileTransfer7Info( YMSGTransfer *transfer )
{
kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
if( transfer->firstParam( 249 ).toInt() == 1 )
{
// Reject P2P Transfer offer
YMSGTransfer *t = new YMSGTransfer(Yahoo::ServiceFileTransfer7Accept);
t->setId( client()->sessionID() );
t->setParam( 1, client()->userId().local8Bit() );
t->setParam( 5, transfer->firstParam( 4 ) );
t->setParam( 265, transfer->firstParam( 265 ) );
t->setParam( 66, -3 );
send( t );
}
else if( transfer->firstParam( 249 ).toInt() == 3 )
{
m_file = new QFile( m_localUrl.path() );
if( !m_file->open( IO_WriteOnly ) )
{
emit error( m_transferId, KIO::ERR_CANNOT_OPEN_FOR_WRITING, i18n("Could not open file for writing.") );
setSuccess( false );
return;
}
YMSGTransfer *t = new YMSGTransfer(Yahoo::ServiceFileTransfer7Accept);
t->setId( client()->sessionID() );
t->setParam( 1, client()->userId().local8Bit() );
t->setParam( 5, transfer->firstParam( 4 ) );
t->setParam( 265, transfer->firstParam( 265 ) );
t->setParam( 27, transfer->firstParam( 27 ) );
t->setParam( 249, 3 ); // Use Reflection server
t->setParam( 251, transfer->firstParam( 251 ) );
send( t );
// The server expects a HTTP HEAD command prior to the GET
m_mimetypeJob = KIO::mimetype(QString::fromLatin1("http://%1/relay?token=%2&sender=%3&recver=%4")
.arg(transfer->firstParam( 250 )).arg(transfer->firstParam( 251 )).arg(m_userId).arg(client()->userId()), false);
m_mimetypeJob->addMetaData("cookies", "manual");
m_mimetypeJob->addMetaData("setcookies", QString::fromLatin1("Cookie: T=%1; path=/; domain=.yahoo.com; Y=%2; C=%3;")
.arg(client()->tCookie()).arg(client()->yCookie()).arg(client()->cCookie()) );
m_transferJob = KIO::get( QString::fromLatin1("http://%1/relay?token=%2&sender=%3&recver=%4")
.arg(transfer->firstParam( 250 )).arg(transfer->firstParam( 251 )).arg(m_userId).arg(client()->userId()), false, false );
QObject::connect( m_transferJob, SIGNAL( result( KIO::Job* ) ), this, SLOT( slotComplete( KIO::Job* ) ) );
QObject::connect( m_transferJob, SIGNAL( data( KIO::Job*, const QByteArray & ) ), this, SLOT( slotData( KIO::Job*, const QByteArray & ) ) );
m_transferJob->addMetaData("cookies", "manual");
m_transferJob->addMetaData("setcookies", QString::fromLatin1("Cookie: T=%1; path=/; domain=.yahoo.com; Y=%2; C=%3;")
.arg(client()->tCookie()).arg(client()->yCookie()).arg(client()->cCookie()) );
}
}
void ReceiveFileTask::setRemoteUrl( KURL url )
{
m_remoteUrl = url;
}
void ReceiveFileTask::setLocalUrl( KURL url )
{
m_localUrl = url;
}
void ReceiveFileTask::setTransferId( unsigned int transferId )
{
m_transferId = transferId;
}
void ReceiveFileTask::setType( Type type )
{
m_type = type;
}
void ReceiveFileTask::setUserId( const QString &userId )
{
m_userId = userId;
}
void ReceiveFileTask::canceled( unsigned int id )
{
if( m_transferId != id )
return;
if( m_transferJob )
m_transferJob->kill();
setSuccess( false );
}
#include "receivefiletask.moc"