Port things from MSN to WLM plugin:
[kdenetwork.git] / kopete / protocols / wlm / wlmtransfermanager.cpp
blob3d96392df885bda272ea731da495f1cf44a44423
1 /*
2 wlmtransfermanager.cpp - Kopete Wlm Protocol
4 Copyright (c) 2008 by Tiago Salem Herrmann <tiagosh@gmail.com>
5 Kopete (c) 2002-2003 by the Kopete developers <kopete-devel@kde.org>
7 *************************************************************************
8 * *
9 * This library is free software; you can redistribute it and/or *
10 * modify it under the terms of the GNU General Public *
11 * License as published by the Free Software Foundation; either *
12 * version 2 of the License, or (at your option) any later version. *
13 * *
14 *************************************************************************
17 #include <QObject>
18 #include <kmessagebox.h>
19 #include <kcodecs.h>
20 #include <klocale.h>
22 #include <kdebug.h>
24 #include "wlmtransfermanager.h"
25 #include "wlmcontact.h"
26 #include "kopetecontact.h"
27 #include "kopeteuiglobal.h"
30 WlmTransferManager::WlmTransferManager (WlmAccount * account1) :
31 m_account (account1),
32 nextID (1)
34 QObject::connect (&account ()->server ()->cb,
35 SIGNAL (incomingFileTransfer
36 (MSN::SwitchboardServerConnection *,
37 const MSN::fileTransferInvite &)), this,
38 SLOT (incomingFileTransfer
39 (MSN::SwitchboardServerConnection *,
40 const MSN::fileTransferInvite &)));
42 QObject::connect (&account ()->server ()->cb,
43 SIGNAL (gotFileTransferProgress
44 (MSN::SwitchboardServerConnection *,
45 const unsigned int &,
46 const unsigned long long &)), this,
47 SLOT (gotFileTransferProgress
48 (MSN::SwitchboardServerConnection *,
49 const unsigned int &,
50 const unsigned long long &)));
52 QObject::connect (&account ()->server ()->cb,
53 SIGNAL (gotFileTransferFailed (MSN::SwitchboardServerConnection *,
54 const unsigned int &, const MSN::fileTransferError&)),
55 this,
56 SLOT (gotFileTransferFailed (MSN::SwitchboardServerConnection *,
57 const unsigned int &, const MSN::fileTransferError&)));
59 QObject::connect (&account ()->server ()->cb,
60 SIGNAL (gotFileTransferSucceeded
61 (MSN::SwitchboardServerConnection *,
62 const unsigned int &)), this,
63 SLOT (gotFileTransferSucceeded (MSN::SwitchboardServerConnection *,
64 const unsigned int &)));
66 QObject::connect (&account ()->server ()->cb,
67 SIGNAL (slotfileTransferInviteResponse
68 (MSN::SwitchboardServerConnection *,
69 const unsigned int &, const bool &)), this,
70 SLOT (fileTransferInviteResponse
71 (MSN::SwitchboardServerConnection * ,
72 const unsigned int &, const bool &)));
74 connect (Kopete::TransferManager::transferManager (),
75 SIGNAL (accepted (Kopete::Transfer *, const QString &)),
76 this, SLOT (slotAccepted (Kopete::Transfer *, const QString &)));
77 connect (Kopete::TransferManager::transferManager (),
78 SIGNAL (refused (const Kopete::FileTransferInfo &)),
79 this, SLOT (slotRefused (const Kopete::FileTransferInfo &)));
82 void
83 WlmTransferManager::fileTransferInviteResponse (MSN::SwitchboardServerConnection * conn,
84 const unsigned int &sessionID,
85 const bool & response)
87 if(!transferSessions.count(sessionID))
88 return;
90 if (response)
92 transferSessionData tfd = transferSessions[sessionID];
93 Kopete::ContactPtrList chatmembers;
94 chatmembers.append (account ()->contacts ()[tfd.to]);
95 WlmChatSession *_manager =
96 qobject_cast <WlmChatSession *>(Kopete::ChatSessionManager::self ()->
97 findChatSession (account ()->myself (), chatmembers,
98 account ()->protocol ()));
99 if (!_manager)
101 _manager =
102 new WlmChatSession (account ()->protocol (),
103 account ()->myself (), chatmembers);
106 else
108 transferSessionData tfd = transferSessions[sessionID];
109 if(tfd.internalID)
110 Kopete::TransferManager::transferManager()->
111 cancelIncomingTransfer(tfd.internalID);
112 else
113 tfd.ft->slotError(KIO::ERR_ABORTED, i18n("File transfer cancelled."));
117 WlmTransferManager::~WlmTransferManager ()
121 void
122 WlmTransferManager::incomingFileTransfer (MSN::SwitchboardServerConnection * conn,
123 const MSN::fileTransferInvite & ft)
125 Kopete::Contact * contact =
126 account ()->contacts ()[ft.userPassport.c_str ()];
128 if(!contact)
129 return;
131 if (ft.type == MSN::FILE_TRANSFER_WITH_PREVIEW
132 || ft.type == MSN::FILE_TRANSFER_WITHOUT_PREVIEW)
134 QPixmap preview;
135 if (ft.type == MSN::FILE_TRANSFER_WITH_PREVIEW)
137 preview.
138 loadFromData (KCodecs::
139 base64Decode (QString (ft.preview.c_str ()).
140 toAscii ()));
142 transferSessionData tsd;
143 tsd.from = ft.userPassport.c_str ();
144 tsd.to = account ()->myself ()->contactId ();
145 tsd.ft = NULL;
146 tsd.internalID = 0;
147 account ()->chatManager ()->createChat (conn);
148 WlmChatSession *chat = account ()->chatManager ()->chatSessions[conn];
149 if(chat)
150 chat->setCanBeDeleted (false);
152 tsd.internalID =
153 Kopete::TransferManager::transferManager ()->
154 askIncomingTransfer (contact,
155 ft.filename.c_str (),
156 ft.filesize,
158 QString::number (ft.sessionId),
159 preview);
160 transferSessions[ft.sessionId] = tsd;
164 void
165 WlmTransferManager::gotFileTransferProgress (MSN::SwitchboardServerConnection * conn,
166 const unsigned int &sessionID,
167 const unsigned long long
168 &transferred)
170 if(!transferSessions.count(sessionID))
171 return;
173 Kopete::Transfer * transfer = transferSessions[sessionID].ft;
174 if (transfer)
175 transfer->slotProcessed (transferred);
178 void
179 WlmTransferManager::slotAccepted (Kopete::Transfer * ft,
180 const QString & filename)
182 Kopete::ContactPtrList chatmembers;
184 // grab contactId from the sender
185 unsigned int sessionID = ft->info ().internalId ().toUInt ();
187 if(!transferSessions.count(sessionID))
188 return;
190 QString from = transferSessions[sessionID].from;
192 if (from.isEmpty ())
193 return;
195 // find an existent session, or create a new one
196 chatmembers.append (account ()->contacts ()[from]);
197 WlmChatSession *_manager = qobject_cast <WlmChatSession *>
198 (Kopete::ChatSessionManager::self ()->
199 findChatSession (account ()->myself (), chatmembers,
200 account ()->protocol ()));
202 if (!_manager)
204 _manager =
205 new WlmChatSession (account ()->protocol (),
206 account ()->myself (), chatmembers);
209 MSN::SwitchboardServerConnection * conn = _manager->getChatService ();
210 if (!conn)
211 return;
213 _manager->setCanBeDeleted (false);
214 transferSessions[sessionID].ft = ft;
216 connect (ft, SIGNAL (transferCanceled ()), this, SLOT (slotCanceled ()));
218 conn->fileTransferResponse (sessionID, filename.toLatin1 ().data (),
219 true);
222 void
223 WlmTransferManager::slotRefused (const Kopete::FileTransferInfo & fti)
225 Kopete::ContactPtrList chatmembers;
226 chatmembers.append (fti.contact ());
227 WlmChatSession *_manager = qobject_cast <WlmChatSession *>
228 (Kopete::ChatSessionManager::self ()->
229 findChatSession (account ()->myself (), chatmembers,
230 account ()->protocol ()));
232 if (!_manager)
233 return;
235 MSN::SwitchboardServerConnection * conn = _manager->getChatService ();
236 if (!conn)
237 return;
239 conn->fileTransferResponse (fti.internalId ().toUInt (), "", false);
242 void
243 WlmTransferManager::gotFileTransferFailed (MSN::SwitchboardServerConnection * conn,
244 const unsigned int &sessionID,
245 const MSN::fileTransferError & error)
247 if(!transferSessions.count(sessionID))
248 return;
250 transferSessionData tsd = transferSessions[sessionID];
251 if (tsd.internalID)
253 Kopete::TransferManager::transferManager ()->
254 cancelIncomingTransfer(tsd.internalID);
255 if(tsd.ft)
256 tsd.ft->slotError(KIO::ERR_ABORTED, i18n("File transfer cancelled."));
258 else
260 if (tsd.ft)
262 tsd.ft->slotError(KIO::ERR_ABORTED, i18n("File transfer cancelled."));
265 transferSessions.remove (sessionID);
269 void
270 WlmTransferManager::gotFileTransferSucceeded (MSN::SwitchboardServerConnection * conn,
271 const unsigned int &sessionID)
273 Kopete::Transfer * transfer = transferSessions[sessionID].ft;
274 if (transfer)
276 Kopete::ContactPtrList chatmembers;
277 if (transfer->info ().direction () ==
278 Kopete::FileTransferInfo::Incoming)
279 chatmembers.append (account ()->
280 contacts ()[transferSessions[sessionID].
281 from]);
282 else
283 chatmembers.append (account ()->
284 contacts ()[transferSessions[sessionID].to]);
286 WlmChatSession *_manager = qobject_cast <WlmChatSession *>
287 (Kopete::ChatSessionManager::self ()->
288 findChatSession (account ()->myself (), chatmembers,
289 account ()->protocol ()));
290 if (_manager)
291 _manager->raiseView ();
292 transfer->slotComplete ();
293 transferSessions.remove (sessionID);
297 void
298 WlmTransferManager::slotCanceled ()
300 kDebug (14210) << k_funcinfo;
301 Kopete::Transfer * ft = qobject_cast < Kopete::Transfer * >(sender ());
302 if (!ft)
303 return;
304 unsigned int sessionID = 0;
305 QMap < unsigned int, transferSessionData >::iterator i =
306 transferSessions.begin ();
307 for (; i != transferSessions.end (); ++i)
308 if (i.value ().ft == ft)
309 sessionID = i.key ();
311 if (!sessionID)
312 return;
314 transferSessionData session = transferSessions[sessionID];
316 Kopete::ContactPtrList chatmembers;
317 if (ft->info ().direction () == Kopete::FileTransferInfo::Incoming)
318 chatmembers.append (account ()->contacts ()[session.from]);
319 else
320 chatmembers.append (account ()->contacts ()[session.to]);
322 WlmChatSession *_manager = qobject_cast <WlmChatSession *>
323 (Kopete::ChatSessionManager::self ()->
324 findChatSession (account ()->myself (), chatmembers,
325 account ()->protocol ()));
327 if (!_manager)
328 return;
329 _manager->raiseView ();
331 MSN::SwitchboardServerConnection * conn = _manager->getChatService ();
333 if (!conn)
334 return;
336 if (sessionID)
338 transferSessions.remove (sessionID);
339 conn->cancelFileTransfer (sessionID);
343 #include "wlmtransfermanager.moc"