summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/irc/irctransferhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/protocols/irc/irctransferhandler.cpp')
-rw-r--r--kopete/protocols/irc/irctransferhandler.cpp183
1 files changed, 183 insertions, 0 deletions
diff --git a/kopete/protocols/irc/irctransferhandler.cpp b/kopete/protocols/irc/irctransferhandler.cpp
new file mode 100644
index 00000000..4715679e
--- /dev/null
+++ b/kopete/protocols/irc/irctransferhandler.cpp
@@ -0,0 +1,183 @@
+/*
+ irctransferhandler.cpp - IRC transfer.
+
+ Copyright (c) 2004 by Michel Hermier <michel.hermier@wanadoo.fr>
+
+ Kopete (c) 2004 by the Kopete developers <kopete-devel@kde.org>
+
+ *************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ *************************************************************************
+*/
+
+#include <kdebug.h>
+
+#include <kopetetransfermanager.h>
+
+#include "libkirc/kirctransfer.h"
+#include "libkirc/kirctransferhandler.h"
+
+#include "kopetemetacontact.h"
+#include "irccontact.h"
+#include "irccontactmanager.h"
+
+#include "irctransferhandler.h"
+
+IRCTransferHandler *IRCTransferHandler::self()
+{
+ static IRCTransferHandler sm_self;
+ return &sm_self;
+}
+
+KIRC::TransferHandler *IRCTransferHandler::handler()
+{
+ return KIRC::TransferHandler::self();
+}
+
+IRCTransferHandler::IRCTransferHandler()
+{
+ connect(handler(), SIGNAL(transferCreated(KIRC::Transfer *)),
+ this, SLOT(transferCreated(KIRC::Transfer *)));
+
+ connect(Kopete::TransferManager::transferManager(), SIGNAL(accepted(Kopete::Transfer *, const QString &)),
+ this, SLOT(transferAccepted(Kopete::Transfer *, const QString&)));
+ connect( Kopete::TransferManager::transferManager(), SIGNAL(refused(const Kopete::FileTransferInfo &)),
+ this, SLOT(transferRefused(const Kopete::FileTransferInfo &)));
+}
+
+void IRCTransferHandler::transferCreated(KIRC::Transfer *t)
+{
+ kdDebug(14120) << k_funcinfo << endl;
+
+ IRCContact *contact = IRCContactManager::existContact(t->engine(), t->nick());
+ QString fileName = t->fileName();
+ unsigned long fileSize = t->fileSize();
+
+ if(!contact)
+ {
+ kdDebug(14120) << k_funcinfo << "Trying to create transfer for a non existing contact(" << t->nick() << ")." << endl;
+ return;
+ }
+
+ switch(t->type())
+ {
+// case KIRC::Transfer::Chat:
+ case KIRC::Transfer::FileOutgoing:
+ {
+ Kopete::Transfer *kt = Kopete::TransferManager::transferManager()->addTransfer(
+ contact, fileName, fileSize, contact->metaContact()->displayName(),
+ Kopete::FileTransferInfo::Outgoing);
+ connectKopeteTransfer(kt, t);
+ }
+ break;
+ case KIRC::Transfer::FileIncoming:
+ {
+ int ID = Kopete::TransferManager::transferManager()->askIncomingTransfer(
+ contact , fileName, fileSize);
+ m_idMap.insert(ID, t);
+ }
+ break;
+ default:
+ kdDebug(14120) << k_funcinfo << "Unknown transfer type" << endl;
+ t->deleteLater();
+ }
+}
+
+void IRCTransferHandler::transferAccepted(Kopete::Transfer *kt, const QString &file)
+{
+ kdDebug(14120) << k_funcinfo << endl;
+
+ KIRC::Transfer *t = getKIRCTransfer(kt->info());
+ if(t)
+ {
+ t->setFileName(file);
+ connectKopeteTransfer(kt, t);
+ }
+}
+void IRCTransferHandler::transferRefused(const Kopete::FileTransferInfo &info)
+{
+ kdDebug(14120) << k_funcinfo << endl;
+
+ KIRC::Transfer *t = getKIRCTransfer(info);
+ if(t)
+ {
+ t->deleteLater();
+ }
+}
+
+void IRCTransferHandler::connectKopeteTransfer(Kopete::Transfer *kt, KIRC::Transfer *t)
+{
+ kdDebug(14120) << k_funcinfo << endl;
+
+ if(kt && t)
+ {
+ switch(t->type())
+ {
+// case KIRC::Transfer::Chat:
+ case KIRC::Transfer::FileOutgoing:
+ case KIRC::Transfer::FileIncoming:
+ connect(t , SIGNAL(fileSizeAcknowledge(unsigned int)),
+ kt, SLOT(slotProcessed(unsigned int)));
+ break;
+ default:
+ kdDebug(14120) << k_funcinfo << "Unknown transfer connections for type" << endl;
+ t->deleteLater();
+ return;
+ }
+
+ connect(t , SIGNAL(complete()),
+ kt, SLOT(slotComplete()));
+
+// connect(kt , SIGNAL(transferCanceled()),
+// t, SLOT(abort()));
+// connect(kt, SIGNAL(destroyed()),
+// t, SLOT(slotKopeteTransferDestroyed()));
+
+ connect(kt, SIGNAL(result(KIO::Job *)),
+ this , SLOT(kioresult(KIO::Job *)));
+
+ t->initiate();
+ }
+}
+
+void IRCTransferHandler::kioresult(KIO::Job *job)
+{
+ Kopete::Transfer *kt= (Kopete::Transfer *)job; // FIXME: move to *_cast
+ if(!kt)
+ {
+ kdDebug(14120) << k_funcinfo << "Kopete::Transfer not found from kio:" << job << endl;
+ return;
+ }
+
+ switch(kt->error())
+ {
+ case 0: // 0 means no error
+ break;
+ case KIO::ERR_USER_CANCELED:
+ kdDebug(14120) << k_funcinfo << "User canceled transfer." << endl;
+ // KIO::buildErrorString form error don't provide a result string ...
+// if (t->)
+// kt->userAbort(i18n("User canceled transfer."));
+// else
+// kt->userAbort(i18n("User canceled transfer for file:%1").arg(t->fileName()));
+ break;
+ default:
+ kdDebug(14120) << k_funcinfo << "Transfer halted:" << kt->error() << endl;
+// kt->userAbort(KIO::buildErrorString(kt->error(), kt->fileName()));
+ break;
+ }
+}
+
+KIRC::Transfer *IRCTransferHandler::getKIRCTransfer(const Kopete::FileTransferInfo &info)
+{
+ KIRC::Transfer *t = m_idMap[info.transferId()];
+ m_idMap.remove(info.transferId());
+ return t;
+}
+
+#include "irctransferhandler.moc"