summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Client')
-rw-r--r--Swiften/Client/Client.cpp10
-rw-r--r--Swiften/Client/Client.h1
-rw-r--r--Swiften/Client/DummyStanzaChannel.h10
-rw-r--r--Swiften/Client/StanzaChannel.h1
4 files changed, 18 insertions, 4 deletions
diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp
index 2406b0f..bf651cc 100644
--- a/Swiften/Client/Client.cpp
+++ b/Swiften/Client/Client.cpp
@@ -37,7 +37,7 @@ Client::~Client() {
}
bool Client::isAvailable() {
- return session_;
+ return session_ && session_->getState() == ClientSession::Initialized;
}
void Client::connect() {
@@ -80,7 +80,7 @@ void Client::handleConnectorFinished(boost::shared_ptr<Connection> connection, C
sessionStream_->initialize();
session_ = ClientSession::create(jid_, sessionStream_);
- session_->onInitialized.connect(boost::bind(boost::ref(onConnected)));
+ session_->onInitialized.connect(boost::bind(&Client::handleSessionInitialized, this));
session_->onStanzaAcked.connect(boost::bind(&Client::handleStanzaAcked, this, _1));
session_->onFinished.connect(boost::bind(&Client::handleSessionFinished, this, _1));
session_->onNeedCredentials.connect(boost::bind(&Client::handleNeedCredentials, this));
@@ -162,6 +162,7 @@ void Client::setCertificate(const String& certificate) {
void Client::handleSessionFinished(boost::shared_ptr<Error> error) {
session_.reset();
closeConnection();
+ onAvailableChanged(false);
if (error) {
ClientError clientError;
if (boost::shared_ptr<ClientSession::Error> actualError = boost::dynamic_pointer_cast<ClientSession::Error>(error)) {
@@ -242,4 +243,9 @@ void Client::handleStanzaAcked(boost::shared_ptr<Stanza> stanza) {
onStanzaAcked(stanza);
}
+void Client::handleSessionInitialized() {
+ onConnected();
+ onAvailableChanged(true);
+}
+
}
diff --git a/Swiften/Client/Client.h b/Swiften/Client/Client.h
index 57228ef..1023108 100644
--- a/Swiften/Client/Client.h
+++ b/Swiften/Client/Client.h
@@ -58,6 +58,7 @@ namespace Swift {
private:
void handleConnectorFinished(boost::shared_ptr<Connection>, Connector::ref);
+ void handleSessionInitialized();
void send(boost::shared_ptr<Stanza>);
virtual String getNewIQID();
void handleStanza(boost::shared_ptr<Stanza>);
diff --git a/Swiften/Client/DummyStanzaChannel.h b/Swiften/Client/DummyStanzaChannel.h
index d43d68a..05066a8 100644
--- a/Swiften/Client/DummyStanzaChannel.h
+++ b/Swiften/Client/DummyStanzaChannel.h
@@ -13,12 +13,17 @@
namespace Swift {
class DummyStanzaChannel : public StanzaChannel {
public:
- DummyStanzaChannel() {}
+ DummyStanzaChannel() : available_(true) {}
virtual void sendStanza(boost::shared_ptr<Stanza> stanza) {
sentStanzas.push_back(stanza);
}
+ void setAvailable(bool available) {
+ available_ = available;
+ onAvailableChanged(available);
+ }
+
virtual void sendIQ(boost::shared_ptr<IQ> iq) {
sentStanzas.push_back(iq);
}
@@ -36,7 +41,7 @@ namespace Swift {
}
virtual bool isAvailable() {
- return true;
+ return available_;
}
virtual bool getStreamManagementEnabled() const {
@@ -49,5 +54,6 @@ namespace Swift {
}
std::vector<boost::shared_ptr<Stanza> > sentStanzas;
+ bool available_;
};
}
diff --git a/Swiften/Client/StanzaChannel.h b/Swiften/Client/StanzaChannel.h
index 09a6db3..f7bb26a 100644
--- a/Swiften/Client/StanzaChannel.h
+++ b/Swiften/Client/StanzaChannel.h
@@ -21,6 +21,7 @@ namespace Swift {
virtual bool isAvailable() = 0;
virtual bool getStreamManagementEnabled() const = 0;
+ boost::signal<void (bool /* isAvailable */)> onAvailableChanged;
boost::signal<void (boost::shared_ptr<Message>)> onMessageReceived;
boost::signal<void (boost::shared_ptr<Presence>) > onPresenceReceived;
boost::signal<void (boost::shared_ptr<Stanza>)> onStanzaAcked;