From 2c526db0f32ebe75ad0ef42297413bb8bc329839 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 18 May 2011 15:32:54 +0200 Subject: [PATCH] leaving the room works --- backends/libircclient-qt/main.cpp | 7 +++++++ include/transport/networkplugin.h | 2 ++ include/transport/networkpluginserver.h | 1 + src/networkplugin.cpp | 13 +++++++++++++ src/networkpluginserver.cpp | 25 +++++++++++++++++++++++++ src/pbnetwork.proto | 2 +- src/user.cpp | 7 ++++++- 7 files changed, 55 insertions(+), 2 deletions(-) diff --git a/backends/libircclient-qt/main.cpp b/backends/libircclient-qt/main.cpp index 2815cb4a..c62c59de 100644 --- a/backends/libircclient-qt/main.cpp +++ b/backends/libircclient-qt/main.cpp @@ -56,6 +56,13 @@ class IRCNetworkPlugin : public NetworkPlugin { handleRoomChanged(user, room, m_sessions[user]->nick().toStdString()); } + void handleLeaveRoomRequest(const std::string &user, const std::string &room) { + std::cout << "PART\n"; + if (m_sessions[user] == NULL) + return; + m_sessions[user]->part(QString::fromStdString(room)); + } + std::map m_sessions; private: diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 67365153..bf8bb021 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -56,6 +56,7 @@ class NetworkPlugin { virtual void handleLogoutRequest(const std::string &user, const std::string &legacyName) = 0; virtual void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message) = 0; virtual void handleJoinRoomRequest(const std::string &/*user*/, const std::string &/*room*/, const std::string &/*nickname*/, const std::string &/*pasword*/) {} + virtual void handleLeaveRoomRequest(const std::string &/*user*/, const std::string &/*room*/) {} private: @@ -64,6 +65,7 @@ class NetworkPlugin { void handleLogoutPayload(const std::string &payload); void handleConvMessagePayload(const std::string &payload); void handleJoinRoomPayload(const std::string &payload); + void handleLeaveRoomPayload(const std::string &payload); void handleDataRead(const Swift::ByteArray&); void handleConnected(bool error); void handleDisconnected(); diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 81959971..7644314e 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -60,6 +60,7 @@ class NetworkPluginServer { void handleUserCreated(User *user); void handleRoomJoined(User *user, const std::string &room, const std::string &nickname, const std::string &password); + void handleRoomLeft(User *user, const std::string &room); void handleUserReadyToConnect(User *user); void handleUserDestroyed(User *user); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 7a1c4516..f41cfab2 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -196,6 +196,16 @@ void NetworkPlugin::handleJoinRoomPayload(const std::string &data) { handleJoinRoomRequest(payload.username(), payload.room(), payload.nickname(), payload.password()); } +void NetworkPlugin::handleLeaveRoomPayload(const std::string &data) { + pbnetwork::Room payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + + handleLeaveRoomRequest(payload.username(), payload.room()); +} + void NetworkPlugin::handleDataRead(const Swift::ByteArray &data) { long expected_size = 0; m_data += data.toString(); @@ -236,6 +246,9 @@ void NetworkPlugin::handleDataRead(const Swift::ByteArray &data) { case pbnetwork::WrapperMessage_Type_TYPE_JOIN_ROOM: handleJoinRoomPayload(wrapper.payload()); break; + case pbnetwork::WrapperMessage_Type_TYPE_LEAVE_ROOM: + handleLeaveRoomPayload(wrapper.payload()); + break; default: return; } diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 3c088ba2..1a0c2705 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -342,6 +342,7 @@ void NetworkPluginServer::handleUserCreated(User *user) { // UserInfo userInfo = user->getUserInfo(); user->onReadyToConnect.connect(boost::bind(&NetworkPluginServer::handleUserReadyToConnect, this, user)); user->onRoomJoined.connect(boost::bind(&NetworkPluginServer::handleRoomJoined, this, user, _1, _2, _3)); + user->onRoomLeft.connect(boost::bind(&NetworkPluginServer::handleRoomLeft, this, user, _1)); } void NetworkPluginServer::handleUserReadyToConnect(User *user) { @@ -381,6 +382,30 @@ void NetworkPluginServer::handleRoomJoined(User *user, const std::string &r, con conv->setNickname(nickname); } +void NetworkPluginServer::handleRoomLeft(User *user, const std::string &r) { + UserInfo userInfo = user->getUserInfo(); + + pbnetwork::Room room; + room.set_username(user->getJID().toBare()); + room.set_nickname(""); + room.set_room(r); + room.set_password(""); + + std::string message; + room.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_LEAVE_ROOM); + + send(m_client, message); + + NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(r); + if (!conv) { + return; + } + + delete conv; +} + void NetworkPluginServer::handleUserDestroyed(User *user) { UserInfo userInfo = user->getUserInfo(); diff --git a/src/pbnetwork.proto b/src/pbnetwork.proto index 99478b20..5fb332b4 100644 --- a/src/pbnetwork.proto +++ b/src/pbnetwork.proto @@ -65,7 +65,7 @@ message WrapperMessage { TYPE_PING = 9; TYPE_PONG = 10; TYPE_JOIN_ROOM = 11; - TYPE_PART_ROOM = 12; + TYPE_LEAVE_ROOM = 12; TYPE_PARTICIPANT_CHANGED = 13; TYPE_PARTICIPANT_LEFT = 14; TYPE_ROOM_NICKNAME_CHANGED = 15; diff --git a/src/user.cpp b/src/user.cpp index c1db53f6..045fd2eb 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -86,7 +86,12 @@ void User::handlePresence(Swift::Presence::ref presence) { bool isMUC = presence->getPayload() != NULL || *presence->getTo().getNode().c_str() == '#'; if (isMUC) { std::cout << "AAAAAAAAA\n"; - onRoomJoined(presence->getTo().getNode(), presence->getTo().getResource(), ""); + if (presence->getType() == Swift::Presence::Unavailable) { + onRoomLeft(presence->getTo().getNode()); + } + else { + onRoomJoined(presence->getTo().getNode(), presence->getTo().getResource(), ""); + } return; }