summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'SwifTools/Notifier')
-rw-r--r--SwifTools/Notifier/GNTPNotifier.cpp89
-rw-r--r--SwifTools/Notifier/GNTPNotifier.h38
-rw-r--r--SwifTools/Notifier/SConscript1
3 files changed, 128 insertions, 0 deletions
diff --git a/SwifTools/Notifier/GNTPNotifier.cpp b/SwifTools/Notifier/GNTPNotifier.cpp
new file mode 100644
index 0000000..f96f94b
--- /dev/null
+++ b/SwifTools/Notifier/GNTPNotifier.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include "SwifTools/Notifier/GNTPNotifier.h"
+
+#include <cassert>
+#include <iostream>
+#include <boost/bind.hpp>
+#include <sstream>
+
+#include "Swiften/Base/foreach.h"
+#include "Swiften/Network/ConnectionFactory.h"
+
+namespace Swift {
+
+GNTPNotifier::GNTPNotifier(const String& name, const boost::filesystem::path& icon, ConnectionFactory* connectionFactory) : name(name), icon(icon), connectionFactory(connectionFactory), initialized(false), registered(false) {
+ // Registration message
+ std::ostringstream message;
+ message << "GNTP/1.0 REGISTER NONE\r\n";
+ message << "Application-Name: " << name << "\r\n";
+ message << "Application-Icon: file://" << icon.string() << "\r\n";
+ message << "Notifications-Count: " << getAllTypes().size() << "\r\n";
+ std::vector<Notifier::Type> defaultTypes = getDefaultTypes();
+ std::vector<Notifier::Type> allTypes = getAllTypes();
+ foreach(Notifier::Type type, allTypes) {
+ message << "\r\n";
+ message << "Notification-Name: " << typeToString(type) << "\r\n";
+ message << "Notification-Enabled: " << (std::find(defaultTypes.begin(), defaultTypes.end(), type) == defaultTypes.end() ? "false" : "true") << "\r\n";
+ }
+ message << "\r\n";
+
+ send(message.str());
+}
+
+GNTPNotifier::~GNTPNotifier() {
+}
+
+void GNTPNotifier::send(const std::string& message) {
+ std::cout << "Send " << currentConnection << std::endl;
+
+ if (currentConnection) {
+ return;
+ }
+ currentMessage = message;
+ currentConnection = connectionFactory->createConnection();
+ currentConnection->onConnectFinished.connect(boost::bind(&GNTPNotifier::handleConnectFinished, this, _1));
+ currentConnection->onDataRead.connect(boost::bind(&GNTPNotifier::handleDataRead, this, _1));
+ currentConnection->connect(HostAddressPort(HostAddress("127.0.0.1"), 23053));
+}
+
+void GNTPNotifier::showMessage(Type type, const String& subject, const String& description, const boost::filesystem::path& picture, boost::function<void()> callback) {
+ std::cout << "showMessage " << registered << std::endl;
+ if (registered) {
+ std::ostringstream message;
+ message << "GNTP/1.0 NOTIFY NONE\r\n";
+ message << "Application-Name: " << name << "\r\n";
+ message << "Notification-Name: " << typeToString(type) << "\r\n";
+ message << "Notification-Title: " << subject << "\r\n";
+ message << "Notification-Text: " << description << "\r\n";
+ message << "Notification-Icon: " << picture.string() << "\r\n";
+ message << "\r\n";
+ send(message.str());
+ }
+}
+
+void GNTPNotifier::handleConnectFinished(bool error) {
+ if (!initialized) {
+ initialized = true;
+ registered = !error;
+ }
+ std::cout << "Connect: " << initialized << " " << registered << std::endl;
+
+ if (!error) {
+ std::cout << "Write data: " << currentMessage << std::endl;
+ currentConnection->write(currentMessage.c_str());
+ }
+}
+
+void GNTPNotifier::handleDataRead(const ByteArray& data) {
+ std::cout << "Data read: " << data.getData() << std::endl;
+ currentConnection->onDataRead.disconnect(boost::bind(&GNTPNotifier::handleDataRead, this, _1));
+ currentConnection->onConnectFinished.disconnect(boost::bind(&GNTPNotifier::handleConnectFinished, this, _1));
+ currentConnection.reset();
+}
+
+}
diff --git a/SwifTools/Notifier/GNTPNotifier.h b/SwifTools/Notifier/GNTPNotifier.h
new file mode 100644
index 0000000..47b0c01
--- /dev/null
+++ b/SwifTools/Notifier/GNTPNotifier.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <boost/filesystem.hpp>
+
+#include "SwifTools/Notifier/Notifier.h"
+#include "Swiften/Network/Connection.h"
+
+namespace Swift {
+ class ConnectionFactory;
+
+ class GNTPNotifier : public Notifier {
+ public:
+ GNTPNotifier(const String& name, const boost::filesystem::path& icon, ConnectionFactory* connectionFactory);
+ ~GNTPNotifier();
+
+ virtual void showMessage(Type type, const String& subject, const String& description, const boost::filesystem::path& picture, boost::function<void()> callback);
+
+ private:
+ void handleConnectFinished(bool error);
+ void handleDataRead(const ByteArray& data);
+ void send(const std::string& message);
+
+ private:
+ String name;
+ boost::filesystem::path icon;
+ ConnectionFactory* connectionFactory;
+ bool initialized;
+ bool registered;
+ std::string currentMessage;
+ Connection::ref currentConnection;
+ };
+}
diff --git a/SwifTools/Notifier/SConscript b/SwifTools/Notifier/SConscript
index 9ad2fd7..7a991e8 100644
--- a/SwifTools/Notifier/SConscript
+++ b/SwifTools/Notifier/SConscript
@@ -4,6 +4,7 @@ myenv = swiftools_env.Clone()
sources = [
"Notifier.cpp",
+ "GNTPNotifier.cpp",
]
if swiftools_env.get("HAVE_GROWL", False) :