diff --git a/server/serverSession.cpp b/server/serverSession.cpp index 68c5e745..6973f7fd 100644 --- a/server/serverSession.cpp +++ b/server/serverSession.cpp @@ -51,7 +51,7 @@ void ServerSession::start() void ServerSession::stop() { std::unique_lock mlock(mutex_); - active_ = false; + setActive(false); try { boost::system::error_code ec; @@ -146,7 +146,6 @@ void ServerSession::getNextMessage() void ServerSession::reader() { - active_ = true; try { while (active_) @@ -158,7 +157,7 @@ void ServerSession::reader() { logS(kLogErr) << "Exception in ServerSession::reader(): " << e.what() << endl; } - active_ = false; + setActive(false); } @@ -195,7 +194,15 @@ void ServerSession::writer() { logS(kLogErr) << "Exception in ServerSession::writer(): " << e.what() << endl; } - active_ = false; + setActive(false); +} + + +void ServerSession::setActive(bool active) +{ + if (active_ && !active && (messageReceiver_ != NULL)) + messageReceiver_->onDisconnect(this); + active_ = active; } diff --git a/server/serverSession.h b/server/serverSession.h index 388c6d4d..2d895b8b 100644 --- a/server/serverSession.h +++ b/server/serverSession.h @@ -42,6 +42,7 @@ class MessageReceiver { public: virtual void onMessageReceived(ServerSession* connection, const msg::BaseMessage& baseMessage, char* buffer) = 0; + virtual void onDisconnect(ServerSession* connection) = 0; }; @@ -96,6 +97,7 @@ protected: void getNextMessage(); void reader(); void writer(); + void setActive(bool active); std::atomic active_; std::atomic streamActive_; diff --git a/server/streamServer.cpp b/server/streamServer.cpp index 5147b079..01b1bffe 100644 --- a/server/streamServer.cpp +++ b/server/streamServer.cpp @@ -81,6 +81,16 @@ void StreamServer::onResync(const PipeReader* pipeReader, double ms) } +void StreamServer::onDisconnect(ServerSession* connection) +{ + ClientInfoPtr client = Config::instance().getClientInfo(connection->macAddress); + client->connected = false; + gettimeofday(&client->lastSeen, NULL); + json notification = JsonNotification::getJson("Client.OnDisconnect", client->toJson()); + controlServer->send(notification.dump(4)); +} + + void StreamServer::onMessageReceived(ServerSession* connection, const msg::BaseMessage& baseMessage, char* buffer) { // logO << "getNextMessage: " << baseMessage.type << ", size: " << baseMessage.size << ", id: " << baseMessage.id << ", refers: " << baseMessage.refersTo << ", sent: " << baseMessage.sent.sec << "," << baseMessage.sent.usec << ", recv: " << baseMessage.received.sec << "," << baseMessage.received.usec << "\n"; @@ -144,7 +154,6 @@ void StreamServer::onMessageReceived(ServerSession* connection, const msg::BaseM gettimeofday(&client->lastSeen, NULL); json notification = JsonNotification::getJson("Client.OnConnect", client->toJson()); - logO << std::setw(4) << notification << std::endl; controlServer->send(notification.dump(4)); } } diff --git a/server/streamServer.h b/server/streamServer.h index 322b54b9..4e3b0eb5 100644 --- a/server/streamServer.h +++ b/server/streamServer.h @@ -82,6 +82,7 @@ public: /// Clients call this when they receive a message. Implementation of MessageReceiver::onMessageReceived virtual void onMessageReceived(ServerSession* connection, const msg::BaseMessage& baseMessage, char* buffer); + virtual void onDisconnect(ServerSession* connection); /// Implementation of PipeListener virtual void onChunkRead(const PipeReader* pipeReader, const msg::PcmChunk* chunk, double duration);