summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Slimber/MainController.cpp')
-rw-r--r--Slimber/MainController.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/Slimber/MainController.cpp b/Slimber/MainController.cpp
new file mode 100644
index 0000000..c8c2ad1
--- /dev/null
+++ b/Slimber/MainController.cpp
@@ -0,0 +1,123 @@
+#include "Slimber/MainController.h"
+
+#include <boost/bind.hpp>
+#include <boost/lexical_cast.hpp>
+#include <iostream>
+
+#include "Swiften/Base/foreach.h"
+#include "Swiften/Application/Platform/PlatformApplication.h"
+#include "Swiften/LinkLocal/LinkLocalService.h"
+#include "Swiften/LinkLocal/LinkLocalServiceBrowser.h"
+#include "Swiften/LinkLocal/DNSSD/PlatformDNSSDQuerierFactory.h"
+#include "Slimber/Server.h"
+#include "Slimber/FileVCardCollection.h"
+#include "Slimber/MenuletController.h"
+#include "Slimber/Menulet.h"
+
+using namespace Swift;
+
+MainController::MainController(Menulet* menulet) : menulet(menulet) {
+ menuletController = new MenuletController(menulet);
+ menuletController->onRestartRequested.connect(boost::bind(
+ &MainController::handleRestartRequested, this));
+
+ dnsSDQuerier = PlatformDNSSDQuerierFactory().createQuerier();
+ if (!dnsSDQuerier) {
+ // TODO
+ assert(false);
+ }
+
+ linkLocalServiceBrowser = new LinkLocalServiceBrowser(dnsSDQuerier);
+ linkLocalServiceBrowser->onServiceAdded.connect(
+ boost::bind(&MainController::handleServicesChanged, this));
+ linkLocalServiceBrowser->onServiceRemoved.connect(
+ boost::bind(&MainController::handleServicesChanged, this));
+ linkLocalServiceBrowser->onServiceChanged.connect(
+ boost::bind(&MainController::handleServicesChanged, this));
+
+ vCardCollection = new FileVCardCollection(
+ PlatformApplication("Slimber").getSettingsDir());
+
+ server = new Server(5222, 5562, linkLocalServiceBrowser, vCardCollection);
+ server->onStopped.connect(
+ boost::bind(&MainController::handleServerStopped, this, _1));
+ server->onSelfConnected.connect(
+ boost::bind(&MainController::handleSelfConnected, this, _1));
+
+ start();
+}
+
+MainController::~MainController() {
+ delete menuletController;
+ delete server;
+ delete vCardCollection;
+ linkLocalServiceBrowser->stop();
+ delete linkLocalServiceBrowser;
+ dnsSDQuerier->stop();
+}
+
+void MainController::start() {
+ dnsSDQuerier->start();
+ linkLocalServiceBrowser->start();
+
+ handleSelfConnected(false);
+ handleServicesChanged();
+
+ server->start();
+}
+
+void MainController::stop() {
+ server->stop();
+ linkLocalServiceBrowser->stop();
+ dnsSDQuerier->stop();
+}
+
+void MainController::handleSelfConnected(bool b) {
+ if (b) {
+ menuletController->setXMPPStatus("You are logged in", MenuletController::Online);
+ }
+ else {
+ menuletController->setXMPPStatus("You are not logged in", MenuletController::Offline);
+ }
+}
+
+void MainController::handleServicesChanged() {
+ std::vector<String> names;
+ foreach(const LinkLocalService& service, linkLocalServiceBrowser->getServices()) {
+ String description = service.getDescription();
+ if (description != service.getName()) {
+ description += " (" + service.getName() + ")";
+ }
+ names.push_back(description);
+ }
+ menuletController->setUserNames(names);
+}
+
+void MainController::handleServerStopped(boost::optional<ServerError> error) {
+ if (error) {
+ String message;
+ switch (error->getType()) {
+ case ServerError::C2SPortConflict:
+ message = String("Error: Port ") + boost::lexical_cast<std::string>(server->getClientToServerPort()) + String(" in use");
+ break;
+ case ServerError::C2SError:
+ message = String("Local connection server error");
+ break;
+ case ServerError::LinkLocalPortConflict:
+ message = String("Error: Port ") + boost::lexical_cast<std::string>(server->getLinkLocalPort()) + String(" in use");
+ break;
+ case ServerError::LinkLocalError:
+ message = String("External connection server error");
+ break;
+ }
+ menuletController->setXMPPStatus(message, MenuletController::Offline);
+ }
+ else {
+ menuletController->setXMPPStatus("XMPP Server Not Running", MenuletController::Offline);
+ }
+}
+
+void MainController::handleRestartRequested() {
+ stop();
+ start();
+}