1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/*
* Copyright (c) 2010 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#include <boost/bind.hpp>
#include <boost/filesystem.hpp>
#include <boost/smart_ptr/make_shared.hpp>
#include <iostream>
#include <Swiften/Elements/Presence.h>
#include <Swiften/Base/foreach.h>
#include <Swiften/Client/Client.h>
#include <Swiften/Network/BoostNetworkFactories.h>
#include <Swiften/EventLoop/SimpleEventLoop.h>
#include <Swiften/Client/ClientXMLTracer.h>
#include <Swiften/FileTransfer/IncomingFileTransferManager.h>
#include <Swiften/FileTransfer/FileWriteBytestream.h>
#include <Swiften/Jingle/JingleSessionManager.h>
using namespace Swift;
SimpleEventLoop eventLoop;
BoostNetworkFactories networkFactories(&eventLoop);
int exitCode = 2;
class FileReceiver {
public:
FileReceiver(const JID& jid, const std::string& password) : jid(jid), password(password), jingleSessionManager(NULL), incomingFileTransferManager(NULL) {
client = new Swift::Client(jid, password, &networkFactories);
client->onConnected.connect(boost::bind(&FileReceiver::handleConnected, this));
client->onDisconnected.connect(boost::bind(&FileReceiver::handleDisconnected, this, _1));
//tracer = new ClientXMLTracer(client);
}
~FileReceiver() {
delete incomingFileTransferManager;
delete jingleSessionManager;
//delete tracer;
client->onDisconnected.disconnect(boost::bind(&FileReceiver::handleDisconnected, this, _1));
client->onConnected.disconnect(boost::bind(&FileReceiver::handleConnected, this));
delete client;
}
void start() {
client->connect();
}
void stop() {
foreach(const IncomingFileTransfer::ref transfer, incomingFileTransfers) {
//transfer->stop();
}
client->disconnect();
}
private:
void handleConnected() {
client->sendPresence(Presence::create());
jingleSessionManager = new JingleSessionManager(client->getIQRouter());
incomingFileTransferManager = new IncomingFileTransferManager(jingleSessionManager, client->getIQRouter());
incomingFileTransferManager->onIncomingFileTransfer.connect(boost::bind(&FileReceiver::handleIncomingFileTransfer, this, _1));
}
void handleIncomingFileTransfer(IncomingFileTransfer::ref transfer) {
incomingFileTransfers.push_back(transfer);
transfer->accept(boost::make_shared<FileWriteBytestream>("out"));
//transfer->onFinished.connect(boost::bind(&FileReceiver::handleFileTransferFinished, this, _1));
//transfer->start();
}
void handleDisconnected(const boost::optional<ClientError>&) {
std::cerr << "Error!" << std::endl;
exit(-1);
}
/*
void handleFileTransferFinished(const boost::optional<FileTransferError>& error) {
std::cout << "File transfer finished" << std::endl;
if (error) {
exit(-1);
}
else {
exit(0);
}
}*/
void exit(int code) {
exitCode = code;
stop();
eventLoop.stop();
}
private:
JID jid;
std::string password;
Client* client;
ClientXMLTracer* tracer;
JingleSessionManager* jingleSessionManager;
IncomingFileTransferManager* incomingFileTransferManager;
std::vector<IncomingFileTransfer::ref> incomingFileTransfers;
};
int main(int argc, char* argv[]) {
if (argc != 3) {
std::cerr << "Usage: " << argv[0] << " <jid> <password>" << std::endl;
return -1;
}
JID jid(argv[1]);
FileReceiver fileReceiver(jid, std::string(argv[2]));
fileReceiver.start();
eventLoop.run();
return exitCode;
}
|