diff --git a/include/transport/discoitemsresponder.h b/include/transport/discoitemsresponder.h index 44bdc364..2558b8b6 100644 --- a/include/transport/discoitemsresponder.h +++ b/include/transport/discoitemsresponder.h @@ -37,12 +37,17 @@ class DiscoItemsResponder : public Swift::GetResponder { void addAdHocCommand(const std::string &node, const std::string &name); // void removeAdHocCommand(const std::string &node); + void addRoom(const std::string &node, const std::string &name); + void clearRooms(); + private: virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); + private: Component *m_component; boost::shared_ptr m_commands; + boost::shared_ptr m_rooms; }; } \ No newline at end of file diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index ea594225..3d5c87da 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -24,6 +24,7 @@ #include "transport/protocol.pb.h" // #include "conversation.h" #include +#include namespace Transport { @@ -164,6 +165,8 @@ class NetworkPlugin { void handleFTData(unsigned long ftID, const std::string &data); + void handleRoomList(const std::string &user, const std::list &rooms, const std::list &names); + /// Called when XMPP user wants to connect legacy network. /// You should connect him to legacy network and call handleConnected or handleDisconnected function later. /// \param user XMPP JID of user for which this event occurs. diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 62fc5b08..3aef279d 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -43,6 +43,7 @@ class RosterResponder; class BlockResponder; class DummyReadBytestream; class AdminInterface; +class DiscoItemsResponder; class NetworkPluginServer { public: @@ -60,7 +61,7 @@ class NetworkPluginServer { std::string id; }; - NetworkPluginServer(Component *component, Config *config, UserManager *userManager, FileTransferManager *ftManager); + NetworkPluginServer(Component *component, Config *config, UserManager *userManager, FileTransferManager *ftManager, DiscoItemsResponder *discoItemsResponder); virtual ~NetworkPluginServer(); @@ -109,6 +110,7 @@ class NetworkPluginServer { void handleFTDataPayload(Backend *b, const std::string &payload); void handleQueryPayload(Backend *b, const std::string &payload); void handleBackendConfigPayload(const std::string &payload); + void handleRoomListPayload(const std::string &payload); void handleUserCreated(User *user); void handleRoomJoined(User *user, const Swift::JID &who, const std::string &room, const std::string &nickname, const std::string &password); @@ -154,6 +156,7 @@ class NetworkPluginServer { std::vector m_crashedBackends; AdminInterface *m_adminInterface; bool m_startingBackend; + DiscoItemsResponder *m_discoItemsResponder; }; } diff --git a/include/transport/protocol.proto b/include/transport/protocol.proto index 929c02b7..de423598 100644 --- a/include/transport/protocol.proto +++ b/include/transport/protocol.proto @@ -78,6 +78,11 @@ message Room { optional string password = 4; } +message RoomList { + repeated string room = 1; + repeated string name = 2; +} + message Participant { required string userName = 1; required string room = 2; @@ -159,6 +164,7 @@ message WrapperMessage { TYPE_EXIT = 29; TYPE_BACKEND_CONFIG = 30; TYPE_QUERY = 31; + TYPE_ROOM_LIST = 32; } required Type type = 1; optional bytes payload = 2; diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index eba6dcff..fccd33f3 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -336,6 +336,24 @@ void NetworkPlugin::handleFTData(unsigned long ftID, const std::string &data) { send(message); } +void NetworkPlugin::handleRoomList(const std::string &user, const std::list &rooms, const std::list &names) { + pbnetwork::RoomList d; + for (std::list::const_iterator it = rooms.begin(); it != rooms.end(); it++) { + d.add_room(*it); + } + + for (std::list::const_iterator it = names.begin(); it != names.end(); it++) { + d.add_name(*it); + } + + std::string message; + d.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ROOM_LIST); + + send(message); +} + void NetworkPlugin::handleLoginPayload(const std::string &data) { pbnetwork::Login payload; if (payload.ParseFromString(data) == false) { diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 4df436d4..b966014e 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -398,7 +398,10 @@ int main(int argc, char **argv) FileTransferManager ftManager(&transport, &userManager); - NetworkPluginServer plugin(&transport, &config, &userManager, &ftManager); + DiscoItemsResponder discoItemsResponder(&transport); + discoItemsResponder.start(); + + NetworkPluginServer plugin(&transport, &config, &userManager, &ftManager, &discoItemsResponder); AdminInterface adminInterface(&transport, &userManager, &plugin, storageBackend, userRegistration); plugin.setAdminInterface(&adminInterface); @@ -409,9 +412,6 @@ int main(int argc, char **argv) GatewayResponder gatewayResponder(transport.getIQRouter(), &userManager); gatewayResponder.start(); - DiscoItemsResponder discoItemsResponder(&transport); - discoItemsResponder.start(); - AdHocManager adhocmanager(&transport, &discoItemsResponder, &userManager, storageBackend); adhocmanager.start(); diff --git a/src/discoitemsresponder.cpp b/src/discoitemsresponder.cpp index 2365b27e..ec5417f3 100644 --- a/src/discoitemsresponder.cpp +++ b/src/discoitemsresponder.cpp @@ -38,6 +38,8 @@ DiscoItemsResponder::DiscoItemsResponder(Component *component) : Swift::GetRespo m_component = component; m_commands = boost::shared_ptr(new DiscoItems()); m_commands->setNode("http://jabber.org/protocol/commands"); + + m_rooms = boost::shared_ptr(new DiscoItems()); } DiscoItemsResponder::~DiscoItemsResponder() { @@ -48,6 +50,14 @@ void DiscoItemsResponder::addAdHocCommand(const std::string &node, const std::st m_commands->addItem(DiscoItems::Item(name, m_component->getJID(), node)); } +void DiscoItemsResponder::addRoom(const std::string &node, const std::string &name) { + m_rooms->addItem(DiscoItems::Item(name, m_component->getJID(), node)); +} + +void DiscoItemsResponder::clearRooms() { + m_rooms = boost::shared_ptr(new DiscoItems()); +} + bool DiscoItemsResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr info) { LOG4CXX_INFO(logger, "get request received with node " << info->getNode()); @@ -55,7 +65,7 @@ bool DiscoItemsResponder::handleGetRequest(const Swift::JID& from, const Swift:: sendResponse(from, id, m_commands); } else if (to.getNode().empty()) { - sendResponse(from, id, boost::shared_ptr(new DiscoItems())); + sendResponse(from, id, m_rooms); } else { sendResponse(from, id, boost::shared_ptr(new DiscoItems())); diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 8b8f8cbc..13138055 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -44,6 +44,7 @@ #include "Swiften/Elements/SpectrumErrorPayload.h" #include "transport/protocol.pb.h" #include "transport/util.h" +#include "transport/discoitemsresponder.h" #include "utf8.h" @@ -244,7 +245,7 @@ static void handleBuddyPayload(LocalBuddy *buddy, const pbnetwork::Buddy &payloa buddy->setBlocked(payload.blocked()); } -NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, UserManager *userManager, FileTransferManager *ftManager) { +NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, UserManager *userManager, FileTransferManager *ftManager, DiscoItemsResponder *discoItemsResponder) { m_ftManager = ftManager; m_userManager = userManager; m_config = config; @@ -252,6 +253,7 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U m_isNextLongRun = false; m_adminInterface = NULL; m_startingBackend = false; + m_discoItemsResponder = discoItemsResponder; m_component->m_factory = new NetworkFactory(this); m_userManager->onUserCreated.connect(boost::bind(&NetworkPluginServer::handleUserCreated, this, _1)); m_userManager->onUserDestroyed.connect(boost::bind(&NetworkPluginServer::handleUserDestroyed, this, _1)); @@ -850,6 +852,19 @@ void NetworkPluginServer::handleBackendConfigPayload(const std::string &data) { m_config->updateBackendConfig(payload.config()); } +void NetworkPluginServer::handleRoomListPayload(const std::string &data) { + pbnetwork::RoomList payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + + m_discoItemsResponder->clearRooms(); + for (int i = 0; i < payload.room_size() && i < payload.name_size(); i++) { + m_discoItemsResponder->addRoom(payload.room(i), payload.name(i)); + } +} + void NetworkPluginServer::handleDataRead(Backend *c, boost::shared_ptr data) { // Append data to buffer c->data.insert(c->data.end(), data->begin(), data->end()); @@ -947,6 +962,9 @@ void NetworkPluginServer::handleDataRead(Backend *c, boost::shared_ptr