add RoomList support to libtransport, so backends can send list of available rooms

This commit is contained in:
Jan Kaluza 2012-10-15 16:25:36 +02:00
parent feca4f35ee
commit 22679e921b
8 changed files with 70 additions and 7 deletions

View file

@ -37,12 +37,17 @@ class DiscoItemsResponder : public Swift::GetResponder<Swift::DiscoItems> {
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<Swift::DiscoItems> payload);
private:
Component *m_component;
boost::shared_ptr<Swift::DiscoItems> m_commands;
boost::shared_ptr<Swift::DiscoItems> m_rooms;
};
}

View file

@ -24,6 +24,7 @@
#include "transport/protocol.pb.h"
// #include "conversation.h"
#include <iostream>
#include <list>
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<std::string> &rooms, const std::list<std::string> &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.

View file

@ -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<std::string> m_crashedBackends;
AdminInterface *m_adminInterface;
bool m_startingBackend;
DiscoItemsResponder *m_discoItemsResponder;
};
}

View file

@ -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;

View file

@ -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<std::string> &rooms, const std::list<std::string> &names) {
pbnetwork::RoomList d;
for (std::list<std::string>::const_iterator it = rooms.begin(); it != rooms.end(); it++) {
d.add_room(*it);
}
for (std::list<std::string>::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) {

View file

@ -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();

View file

@ -38,6 +38,8 @@ DiscoItemsResponder::DiscoItemsResponder(Component *component) : Swift::GetRespo
m_component = component;
m_commands = boost::shared_ptr<DiscoItems>(new DiscoItems());
m_commands->setNode("http://jabber.org/protocol/commands");
m_rooms = boost::shared_ptr<DiscoItems>(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<DiscoItems>(new DiscoItems());
}
bool DiscoItemsResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr<Swift::DiscoItems> 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<DiscoItems>(new DiscoItems()));
sendResponse(from, id, m_rooms);
}
else {
sendResponse(from, id, boost::shared_ptr<DiscoItems>(new DiscoItems()));

View file

@ -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<Swift::SafeByteArray> 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<Swift::Sa
case pbnetwork::WrapperMessage_Type_TYPE_BACKEND_CONFIG:
handleBackendConfigPayload(wrapper.payload());
break;
case pbnetwork::WrapperMessage_Type_TYPE_ROOM_LIST:
handleRoomListPayload(wrapper.payload());
break;
default:
return;
}