From 1978f9fcdc400c76c58b176ed9404882d425cd5c Mon Sep 17 00:00:00 2001 From: dknn Date: Sat, 14 Jul 2012 10:21:33 +0200 Subject: Add a small imperfect example diff --git a/Swiften/Examples/ScreenSharing/Client.cpp b/Swiften/Examples/ScreenSharing/Client.cpp new file mode 100644 index 0000000..1e73055 --- /dev/null +++ b/Swiften/Examples/ScreenSharing/Client.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2012 Yoann Blein + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Swift; + +SimpleEventLoop eventLoop; +BoostNetworkFactories networkFactories(&eventLoop); + +int exitCode = 2; + +static const std::string CLIENT_NAME = "Swiften FT Test"; +static const std::string CLIENT_NODE = "http://swift.im"; + +class ScreenReceiver { + public: + ScreenReceiver(const JID& jid, const std::string& password) : jid(jid), password(password) { + client = new Swift::Client(jid, password, &networkFactories); + client->onConnected.connect(boost::bind(&ScreenReceiver::handleConnected, this)); + client->onDisconnected.connect(boost::bind(&ScreenReceiver::handleDisconnected, this, _1)); + tracer = new ClientXMLTracer(client); + } + + ~ScreenReceiver() { + delete tracer; + client->onDisconnected.disconnect(boost::bind(&ScreenReceiver::handleDisconnected, this, _1)); + client->onConnected.disconnect(boost::bind(&ScreenReceiver::handleConnected, this)); + delete client; + } + + void start() { + ClientOptions options; + options.useTLS = ClientOptions::NeverUseTLS; + client->connect(); + } + + void stop() { + //foreach(const IncomingFileTransfer::ref transfer, incomingFileTransfers) { + //transfer->stop(); + //} + client->disconnect(); + } + + private: + void handleConnected() { + Swift::logging = true; + client->getScreenSharingManager()->onIncomingScreenSharing.connect(boost::bind(&ScreenReceiver::handleIncomingScreenSharing, this, _1)); + + DiscoInfo discoInfo; + discoInfo.addIdentity(DiscoInfo::Identity(CLIENT_NAME, "client", "pc")); + discoInfo.addFeature(DiscoInfo::JingleFeature); + discoInfo.addFeature(DiscoInfo::JingleRTPFeature); + discoInfo.addFeature(DiscoInfo::JingleTransportRawUDPFeature); + client->getDiscoManager()->setCapsNode(CLIENT_NODE); + client->getDiscoManager()->setDiscoInfo(discoInfo); + client->getPresenceSender()->sendPresence(Presence::create()); + } + + void handleIncomingScreenSharing(IncomingScreenSharing::ref sharing) { + SWIFT_LOG(debug) << "Incoming screen sharing" << std::endl; + incomingScreenSharings.push_back(sharing); + sharing->onNewImageReceived.connect(boost::bind(&ScreenReceiver::handleNewImageReceived, this, _1)); + sharing->onFinished.connect(boost::bind(&ScreenReceiver::handleScreenSharingFinished, this)); + sharing->accept(); + //transfer->onFinished.connect(boost::bind(&ScreenReceiver::handleFileTransferFinished, this, _1)); + //transfer->start(); + } + + void handleDisconnected(const boost::optional&) { + std::cerr << "Error!" << std::endl; + exit(-1); + } + + void handleNewImageReceived(const Image& img) { + const std::vector& data = img.data; + std::cout << "Image received: " << (int)data[0] << ", " << (int)data[1] << ", " << (int)data[2] << std::endl; + } + + void handleScreenSharingFinished() { + std::cout << "Screen sharing finished" << std::endl; + exit(0); + } + + void exit(int code) { + exitCode = code; + stop(); + eventLoop.stop(); + } + + private: + JID jid; + std::string password; + Client* client; + ClientXMLTracer* tracer; + std::vector incomingScreenSharings; +}; + + +int main(int argc, char* argv[]) { + if (argc != 3) { + std::cerr << "Usage: " << argv[0] << " " << std::endl; + return -1; + } + + JID jid(argv[1]); + ScreenReceiver screenReceiver(jid, std::string(argv[2])); + screenReceiver.start(); + + eventLoop.run(); + + return exitCode; +} diff --git a/Swiften/Examples/ScreenSharing/Host.cpp b/Swiften/Examples/ScreenSharing/Host.cpp new file mode 100644 index 0000000..ea7f79a --- /dev/null +++ b/Swiften/Examples/ScreenSharing/Host.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2012 Yoann Blein + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +//#include +#include +//#include +#include + +#include +#include +#include +//#include +//#include +#include +//#include +#include +#include +//#include +//#include +//#include +//#include +//#include +#include +//#include +#include +//#include +//#include +//#include +//#include +//#include +//#include +#include +#include + +using namespace Swift; + +SimpleEventLoop eventLoop; +BoostNetworkFactories networkFactories(&eventLoop); + +int exitCode = 2; + +class ScreenSharer { + public: + ScreenSharer(const JID& jid, const std::string& password, const JID& recipient) + : jid(jid), password(password), recipient(recipient) + { + client = new Swift::Client(jid, password, &networkFactories); + client->onConnected.connect(boost::bind(&ScreenSharer::handleConnected, this)); + client->onDisconnected.connect(boost::bind(&ScreenSharer::handleDisconnected, this, _1)); + tracer = new ClientXMLTracer(client); + client->getEntityCapsProvider()->onCapsChanged.connect(boost::bind(&ScreenSharer::handleCapsChanged, this, _1)); + } + + ~ScreenSharer() { + delete tracer; + client->onDisconnected.disconnect(boost::bind(&ScreenSharer::handleDisconnected, this, _1)); + client->onConnected.disconnect(boost::bind(&ScreenSharer::handleConnected, this)); + delete client; + } + + void start() { + ClientOptions options; + options.useTLS = ClientOptions::NeverUseTLS; + client->connect(options); + } + + private: + void handleConnected() { + client->sendPresence(Presence::create()); + } + + void handleCapsChanged(JID jid) { + if (jid.toBare() == recipient) { + std::cout << "Recipient found" << std::endl; + outgoingScreenSharing = client->getScreenSharingManager()->createOutgoingScreenSharing(recipient); + + if (outgoingScreenSharing) { + std::cout << "started screen sharing" << std::endl; + outgoingScreenSharing->onReady.connect(boost::bind(&ScreenSharer::handleRTPReady, this)); + outgoingScreenSharing->onFinished.connect(boost::bind(&ScreenSharer::handleScreenSharingFinished, this)); + outgoingScreenSharing->start(200, 200); + } else { + std::cout << "[ ERROR ] " << recipient << " doesn't support any kind of screen sharing!" << std::endl; + //client->disconnect(); + } + } + } + + void handleRTPReady() { + uint8_t *data = new uint8_t[200*200*3]; + data[0] = 0; + data[1] = 128; + data[2] = 255; + Image img(200, 200, data); + for (int i = 0; i < 10; ++i) + outgoingScreenSharing->addImage(img); + outgoingScreenSharing->stop(); + + } + + void handleDisconnected(const boost::optional&) { + std::cerr << "Error!" << std::endl; + exit(-1); + } + + void handleScreenSharingFinished() { + std::cout << "Screen sharing finished" << std::endl; + exit(0); + } + + void exit(int code) { + exitCode = code; + eventLoop.stop(); + } + + private: + OutgoingScreenSharing::ref outgoingScreenSharing; + JID jid; + std::string password; + JID recipient; + Client* client; + ClientXMLTracer* tracer; +}; + + +int main(int argc, char* argv[]) { + if (argc < 4) { + std::cerr << "Usage: " << argv[0] << " " << std::endl; + return -1; + } + + JID sender(argv[1]); + JID recipient(argv[3]); + Swift::logging = true; + ScreenSharer screenSharer(sender, std::string(argv[2]), recipient); + screenSharer.start(); + + eventLoop.run(); + + return exitCode; +} diff --git a/Swiften/Examples/ScreenSharing/SConscript b/Swiften/Examples/ScreenSharing/SConscript new file mode 100644 index 0000000..7532f54 --- /dev/null +++ b/Swiften/Examples/ScreenSharing/SConscript @@ -0,0 +1,8 @@ +Import("env") + +myenv = env.Clone() +myenv.MergeFlags(myenv["SWIFTEN_FLAGS"]) +myenv.MergeFlags(myenv["SWIFTEN_DEP_FLAGS"]) + +myenv.Program("Host", ["Host.cpp"]) +myenv.Program("Client", ["Client.cpp"]) -- cgit v0.10.2-6-g49f6