add RoomList support to libtransport, so backends can send list of available rooms
This commit is contained in:
parent
feca4f35ee
commit
22679e921b
8 changed files with 70 additions and 7 deletions
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue