summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Limber/main.cpp27
-rw-r--r--Swiften/Parser/XMPPParser.cpp2
-rw-r--r--Swiften/Parser/XMPPParserClient.h7
-rw-r--r--Swiften/Server/Makefile.inc1
-rw-r--r--Swiften/Server/ServerFromClientSession.cpp47
-rw-r--r--Swiften/Server/ServerFromClientSession.h41
-rw-r--r--Swiften/StreamStack/IncomingConnectionLayer.h22
-rw-r--r--Swiften/StreamStack/XMPPLayer.cpp4
-rw-r--r--Swiften/StreamStack/XMPPLayer.h4
9 files changed, 121 insertions, 34 deletions
diff --git a/Limber/main.cpp b/Limber/main.cpp
index 8378c52..6dad151 100644
--- a/Limber/main.cpp
+++ b/Limber/main.cpp
@@ -11,38 +11,14 @@
#include "Swiften/Base/ByteArray.h"
#include "Swiften/EventLoop/MainEventLoop.h"
#include "Swiften/EventLoop/SimpleEventLoop.h"
-#include "Swiften/Network/IncomingConnection.h"
#include "Swiften/Network/ConnectionServer.h"
#include "Swiften/Network/BoostIOServiceThread.h"
+#include "Swiften/Server/ServerFromClientSession.h"
#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h"
#include "Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h"
using namespace Swift;
-class ServerFromClientSession {
- public:
- ServerFromClientSession(
- boost::shared_ptr<IncomingConnection> connection,
- PayloadParserFactoryCollection* payloadParserFactories,
- PayloadSerializerCollection* payloadSerializers) :
- connection_(connection),
- payloadParserFactories_(payloadParserFactories),
- payloadSerializers_(payloadSerializers) {
- }
-
- void start() {
- connection_->write("Hello\n");
- onSessionFinished();
- }
-
- boost::signal<void()> onSessionFinished;
-
- private:
- boost::shared_ptr<IncomingConnection> connection_;
- PayloadParserFactoryCollection* payloadParserFactories_;
- PayloadSerializerCollection* payloadSerializers_;
-};
-
// A reference-counted non-modifiable buffer class.
class SharedBuffer {
public:
@@ -134,7 +110,6 @@ class Server {
ServerFromClientSession* session = new ServerFromClientSession(c, &payloadParserFactories_, &payloadSerializers_);
serverFromClientSessions_.push_back(session);
session->onSessionFinished.connect(boost::bind(&Server::handleSessionFinished, this, session));
- session->start();
}
void handleSessionFinished(ServerFromClientSession* session) {
diff --git a/Swiften/Parser/XMPPParser.cpp b/Swiften/Parser/XMPPParser.cpp
index e05cbca..59cfce7 100644
--- a/Swiften/Parser/XMPPParser.cpp
+++ b/Swiften/Parser/XMPPParser.cpp
@@ -54,7 +54,7 @@ bool XMPPParser::parse(const String& data) {
void XMPPParser::handleStartElement(const String& element, const String& ns, const AttributeMap& attributes) {
if (!inStream()) {
if (element == "stream" && ns == "http://etherx.jabber.org/streams") {
- client_->handleStreamStart();
+ client_->handleStreamStart(attributes.getAttribute("to"));
}
else {
parseErrorOccurred_ = true;
diff --git a/Swiften/Parser/XMPPParserClient.h b/Swiften/Parser/XMPPParserClient.h
index abecc71..d19c7d0 100644
--- a/Swiften/Parser/XMPPParserClient.h
+++ b/Swiften/Parser/XMPPParserClient.h
@@ -6,12 +6,13 @@
#include "Swiften/Elements/Element.h"
namespace Swift {
- class XMPPParserClient
- {
+ class String;
+
+ class XMPPParserClient {
public:
virtual ~XMPPParserClient();
- virtual void handleStreamStart() = 0;
+ virtual void handleStreamStart(const String& header) = 0;
virtual void handleElement(boost::shared_ptr<Element>) = 0;
virtual void handleStreamEnd() = 0;
};
diff --git a/Swiften/Server/Makefile.inc b/Swiften/Server/Makefile.inc
index 54f09ce..1ab98d7 100644
--- a/Swiften/Server/Makefile.inc
+++ b/Swiften/Server/Makefile.inc
@@ -1,5 +1,6 @@
SWIFTEN_SOURCES += \
Swiften/Server/ServerSession.cpp \
+ Swiften/Server/ServerFromClientSession.cpp \
Swiften/Server/ServerStanzaRouter.cpp \
Swiften/Server/IncomingConnection.cpp
diff --git a/Swiften/Server/ServerFromClientSession.cpp b/Swiften/Server/ServerFromClientSession.cpp
new file mode 100644
index 0000000..e85021e
--- /dev/null
+++ b/Swiften/Server/ServerFromClientSession.cpp
@@ -0,0 +1,47 @@
+#include "Swiften/Server/ServerFromClientSession.h"
+
+#include <boost/bind.hpp>
+
+#include "Swiften/Network/IncomingConnection.h"
+#include "Swiften/StreamStack/StreamStack.h"
+#include "Swiften/StreamStack/IncomingConnectionLayer.h"
+#include "Swiften/StreamStack/XMPPLayer.h"
+
+namespace Swift {
+
+ServerFromClientSession::ServerFromClientSession(
+ boost::shared_ptr<IncomingConnection> connection,
+ PayloadParserFactoryCollection* payloadParserFactories,
+ PayloadSerializerCollection* payloadSerializers) :
+ connection_(connection),
+ payloadParserFactories_(payloadParserFactories),
+ payloadSerializers_(payloadSerializers) {
+ xmppLayer_ = new XMPPLayer(payloadParserFactories_, payloadSerializers_);
+ xmppLayer_->onStreamStart.connect(
+ boost::bind(&ServerFromClientSession::handleStreamStart, this, _1));
+ xmppLayer_->onElement.connect(
+ boost::bind(&ServerFromClientSession::handleElement, this, _1));
+ //xmppLayer_->onError.connect(
+ // boost::bind(&ServerFromClientSession::setError, this, XMLError));
+ xmppLayer_->onDataRead.connect(
+ boost::bind(boost::ref(onDataRead), _1));
+ xmppLayer_->onWriteData.connect(
+ boost::bind(boost::ref(onDataWritten), _1));
+ connectionLayer_ = new IncomingConnectionLayer(connection_.get());
+ streamStack_ = new StreamStack(xmppLayer_, connectionLayer_);
+}
+
+ServerFromClientSession::~ServerFromClientSession() {
+ delete streamStack_;
+ delete connectionLayer_;
+ delete xmppLayer_;
+}
+
+void ServerFromClientSession::handleElement(boost::shared_ptr<Element>) {
+}
+
+void ServerFromClientSession::handleStreamStart(const String& domain) {
+ xmppLayer_->writeHeader(domain);
+}
+
+}
diff --git a/Swiften/Server/ServerFromClientSession.h b/Swiften/Server/ServerFromClientSession.h
new file mode 100644
index 0000000..cedfcdb
--- /dev/null
+++ b/Swiften/Server/ServerFromClientSession.h
@@ -0,0 +1,41 @@
+#pragma once
+
+#include <boost/shared_ptr.hpp>
+#include <boost/signal.hpp>
+
+namespace Swift {
+ class Element;
+ class PayloadParserFactoryCollection;
+ class PayloadSerializerCollection;
+ class StreamStack;
+ class XMPPLayer;
+ class IncomingConnectionLayer;
+ class IncomingConnection;
+ class ByteArray;
+ class String;
+
+ class ServerFromClientSession {
+ public:
+ ServerFromClientSession(
+ boost::shared_ptr<IncomingConnection> connection,
+ PayloadParserFactoryCollection* payloadParserFactories,
+ PayloadSerializerCollection* payloadSerializers);
+ ~ServerFromClientSession();
+
+ boost::signal<void()> onSessionFinished;
+ boost::signal<void (const ByteArray&)> onDataWritten;
+ boost::signal<void (const ByteArray&)> onDataRead;
+
+ private:
+ void handleElement(boost::shared_ptr<Element>);
+ void handleStreamStart(const String& domain);
+
+ private:
+ boost::shared_ptr<IncomingConnection> connection_;
+ PayloadParserFactoryCollection* payloadParserFactories_;
+ PayloadSerializerCollection* payloadSerializers_;
+ IncomingConnectionLayer* connectionLayer_;
+ StreamStack* streamStack_;
+ XMPPLayer* xmppLayer_;
+ };
+}
diff --git a/Swiften/StreamStack/IncomingConnectionLayer.h b/Swiften/StreamStack/IncomingConnectionLayer.h
new file mode 100644
index 0000000..c1a9eab
--- /dev/null
+++ b/Swiften/StreamStack/IncomingConnectionLayer.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include <boost/signal.hpp>
+
+#include "Swiften/StreamStack/LowLayer.h"
+#include "Swiften/Network/IncomingConnection.h"
+
+namespace Swift {
+ class IncomingConnectionLayer : public LowLayer {
+ public:
+ IncomingConnectionLayer(IncomingConnection* connection) : connection_(connection) {
+ connection_->onDataRead.connect(onDataRead);
+ }
+
+ void writeData(const ByteArray& data) {
+ connection_->write(data);
+ }
+
+ private:
+ IncomingConnection* connection_;
+ };
+}
diff --git a/Swiften/StreamStack/XMPPLayer.cpp b/Swiften/StreamStack/XMPPLayer.cpp
index 7afa762..464d4b0 100644
--- a/Swiften/StreamStack/XMPPLayer.cpp
+++ b/Swiften/StreamStack/XMPPLayer.cpp
@@ -56,8 +56,8 @@ void XMPPLayer::doResetParser() {
resetParserAfterParse_ = false;
}
-void XMPPLayer::handleStreamStart() {
- onStreamStart();
+void XMPPLayer::handleStreamStart(const String& domain) {
+ onStreamStart(domain);
}
void XMPPLayer::handleElement(boost::shared_ptr<Element> stanza) {
diff --git a/Swiften/StreamStack/XMPPLayer.h b/Swiften/StreamStack/XMPPLayer.h
index 07b5b1c..e064d94 100644
--- a/Swiften/StreamStack/XMPPLayer.h
+++ b/Swiften/StreamStack/XMPPLayer.h
@@ -31,14 +31,14 @@ namespace Swift {
void resetParser();
public:
- boost::signal<void ()> onStreamStart;
+ boost::signal<void (const String& domain)> onStreamStart;
boost::signal<void (boost::shared_ptr<Element>)> onElement;
boost::signal<void (const ByteArray&)> onWriteData;
boost::signal<void (const ByteArray&)> onDataRead;
boost::signal<void ()> onError;
private:
- void handleStreamStart();
+ void handleStreamStart(const String&);
void handleElement(boost::shared_ptr<Element>);
void handleStreamEnd();