summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/yahoo/libkyahoo/sendfiletask.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/protocols/yahoo/libkyahoo/sendfiletask.cpp')
-rw-r--r--kopete/protocols/yahoo/libkyahoo/sendfiletask.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/kopete/protocols/yahoo/libkyahoo/sendfiletask.cpp b/kopete/protocols/yahoo/libkyahoo/sendfiletask.cpp
new file mode 100644
index 00000000..d0f843f2
--- /dev/null
+++ b/kopete/protocols/yahoo/libkyahoo/sendfiletask.cpp
@@ -0,0 +1,189 @@
+/*
+ Kopete Yahoo Protocol
+ Send a file
+
+ Copyright (c) 2006 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 "sendfiletask.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 <kstreamsocket.h>
+#include <kio/global.h>
+
+using namespace KNetwork;
+
+SendFileTask::SendFileTask(Task* parent) : Task(parent)
+{
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
+ m_transmitted = 0;
+ m_socket = 0;
+}
+
+SendFileTask::~SendFileTask()
+{
+ m_socket->deleteLater();
+ m_socket = 0;
+}
+
+void SendFileTask::onGo()
+{
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
+
+ QTimer::singleShot( 0, this, SLOT(initiateUpload()) );
+}
+
+void SendFileTask::initiateUpload()
+{
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
+ m_socket = new KStreamSocket( "filetransfer.msg.yahoo.com", QString::number(80) );
+ m_socket->setBlocking( true );
+ connect( m_socket, SIGNAL( connected( const KResolverEntry& ) ), this, SLOT( connectSucceeded() ) );
+ connect( m_socket, SIGNAL( gotError(int) ), this, SLOT( connectFailed(int) ) );
+
+ m_socket->connect();
+}
+
+void SendFileTask::connectFailed( int i )
+{
+ QString err = m_socket->errorString();
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << i << ": " << err << endl;
+ emit error( m_transferId, i, err );
+ setSuccess( false );
+}
+
+void SendFileTask::connectSucceeded()
+{
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
+ YMSGTransfer t( Yahoo::ServiceFileTransfer );
+
+ m_file.setName( m_url.path() );
+
+ t.setId( client()->sessionID() );
+ t.setParam( 0, client()->userId().local8Bit());
+ t.setParam( 5, m_target.local8Bit());
+ t.setParam( 28, m_file.size() );
+ t.setParam( 27, m_url.fileName().local8Bit() );
+ t.setParam( 14, "" );
+ QByteArray buffer;
+ QByteArray paket;
+ QDataStream stream( buffer, IO_WriteOnly );
+
+ if ( m_file.open(IO_ReadOnly ) )
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << "File successfully opened. Reading..." << endl;
+ }
+ else
+ {
+ client()->notifyError( i18n( "An error occured sending the file." ), m_file.errorString(), Client::Error );
+ setSuccess( false );
+ return;
+ }
+
+ paket = t.serialize();
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << "Sizes: File (" << m_url << "): " << m_file.size() << " - paket: " << paket.size() << endl;
+ QString header = QString::fromLatin1("POST http://filetransfer.msg.yahoo.com:80/notifyft HTTP/1.1\r\n"
+ "Cookie: Y=%1; T=%2; C=%3 ;B=fckeert1kk1nl&b=2\r\n"
+ "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n"
+ "Host: filetransfer.msg.yahoo.com:80\r\n"
+ "Content-length: %4\r\n"
+ "Cache-Control: no-cache\r\n\r\n").arg(client()->yCookie()).arg(client()->tCookie()).arg(client()->cCookie()).arg(m_file.size()+4+paket.size());
+ stream.writeRawBytes( header.local8Bit(), header.length() );
+ stream.writeRawBytes( paket.data(), paket.size() );
+ stream << (Q_INT8)0x32 << (Q_INT8)0x39 << (Q_INT8)0xc0 << (Q_INT8)0x80;
+
+ if( !m_socket->writeBlock( buffer, buffer.size() ) )
+ {
+ emit error( m_transferId, m_socket->error(), m_socket->errorString() );
+ m_socket->close();
+ }
+ else
+ {
+ connect( m_socket, SIGNAL(readyWrite()), this, SLOT(transmitData()) );
+ m_socket->enableWrite( true );
+ }
+}
+
+void SendFileTask::transmitData()
+{
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << endl;
+ int read = 0;
+ int written = 0;
+ char buf[1024];
+
+ m_socket->enableWrite( false );
+ read = m_file.readBlock( buf, 1024 );
+ written = m_socket->writeBlock( buf, read );
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << "read:" << read << " written: " << written << endl;
+
+ m_transmitted += read;
+ emit bytesProcessed( m_transferId, m_transmitted );
+
+ if( written != read )
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << "Upload Failed!" << endl;
+ emit error( m_transferId, m_socket->error(), m_socket->errorString() );
+ setSuccess( false );
+ return;
+ }
+ if( m_transmitted == m_file.size() )
+ {
+ kdDebug(YAHOO_RAW_DEBUG) << k_funcinfo << "Upload Successful: " << m_transmitted << endl;
+ emit complete( m_transferId );
+ setSuccess( true );
+ m_socket->close();
+ }
+ else
+ {
+ m_socket->enableWrite( true );
+ }
+}
+void SendFileTask::setTarget( const QString &to )
+{
+ m_target = to;
+}
+
+void SendFileTask::setMessage( const QString &msg )
+{
+ m_msg = msg;
+}
+
+void SendFileTask::setFileUrl( KURL url )
+{
+ m_url = url;
+
+}
+
+void SendFileTask::setTransferId( unsigned int transferId )
+{
+ m_transferId = transferId;
+}
+
+void SendFileTask::canceled( unsigned int id )
+{
+ if( m_transferId != id )
+ return;
+
+ if( m_socket )
+ m_socket->close();
+
+ setSuccess( false );
+}
+
+#include "sendfiletask.moc"
+