Set adhoc settings according to config even when storage backend is not set
This commit is contained in:
parent
8761e976ae
commit
f7dc91ccb4
23 changed files with 127 additions and 31 deletions
|
@ -245,7 +245,7 @@ class FrotzNetworkPlugin : public NetworkPlugin {
|
|||
return games;
|
||||
}
|
||||
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "") {
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "", const std::string &id = "") {
|
||||
std::cout << "aaa\n";
|
||||
if (message.find("start") == 0) {
|
||||
std::string game = message.substr(6);
|
||||
|
|
|
@ -144,7 +144,7 @@ std::string IRCNetworkPlugin::getTargetName(const std::string &legacyName) {
|
|||
return r;
|
||||
}
|
||||
|
||||
void IRCNetworkPlugin::handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &/*xhtml*/) {
|
||||
void IRCNetworkPlugin::handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &/*xhtml*/, const std::string &/*id*/) {
|
||||
std::string session = getSessionName(user, legacyName);
|
||||
if (m_sessions[session] == NULL) {
|
||||
LOG4CXX_WARN(logger, user << ": Session name: " << session << ", No session for user");
|
||||
|
|
|
@ -20,7 +20,7 @@ class IRCNetworkPlugin : public QObject, public NetworkPlugin {
|
|||
|
||||
void handleLogoutRequest(const std::string &user, const std::string &legacyName);
|
||||
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &/*xhtml*/);
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &/*xhtml*/, const std::string &/*id*/);
|
||||
|
||||
void handleJoinRoomRequest(const std::string &user, const std::string &room, const std::string &nickname, const std::string &password);
|
||||
|
||||
|
|
|
@ -427,7 +427,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml) {
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml, const std::string &id) {
|
||||
PurpleAccount *account = m_sessions[user];
|
||||
if (account) {
|
||||
PurpleConversation *conv = purple_find_conversation_with_account_wrapped(PURPLE_CONV_TYPE_CHAT, legacyName.c_str(), account);
|
||||
|
|
|
@ -145,7 +145,7 @@ class YahooPlugin : public NetworkPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "") {
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "", const std::string &id = "") {
|
||||
YahooLocalAccount *account = m_users[user];
|
||||
if (account) {
|
||||
LOG4CXX_INFO(logger, "Sending message from " << user << " to " << legacyName << ": " << message << ".");
|
||||
|
|
|
@ -207,7 +207,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml) {
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "", const std::string &id = "") {
|
||||
Skype *skype = m_sessions[user];
|
||||
if (skype) {
|
||||
skype->send_command("MESSAGE " + legacyName + " " + message);
|
||||
|
|
|
@ -193,7 +193,7 @@ class SMSNetworkPlugin : public NetworkPlugin {
|
|||
void handleLogoutRequest(const std::string &user, const std::string &legacyName) {
|
||||
}
|
||||
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "") {
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "", const std::string &id = "") {
|
||||
// Remove trailing +, because smstools doesn't use it in "From: " field for received messages.
|
||||
std::string n = legacyName;
|
||||
if (n.find("+") == 0) {
|
||||
|
|
|
@ -202,7 +202,7 @@ class SwiftenPlugin : public NetworkPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &xhtml = "") {
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &xhtml = "", const std::string &id = "") {
|
||||
LOG4CXX_INFO(logger, "Sending message from " << user << " to " << legacyName << ".");
|
||||
boost::shared_ptr<Swift::Client> client = m_users[user];
|
||||
if (client) {
|
||||
|
|
|
@ -45,7 +45,7 @@ void Plugin::handleLoginRequest(const std::string &user, const std::string &lega
|
|||
void Plugin::handleLogoutRequest(const std::string &user, const std::string &legacyName) {
|
||||
}
|
||||
|
||||
void Plugin::handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml) {
|
||||
void Plugin::handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml, const std::string &id) {
|
||||
LOG4CXX_INFO(logger, "Sending message from " << user << " to " << legacyName << ".");
|
||||
if (legacyName == "echo") {
|
||||
handleMessage(user, legacyName, message);
|
||||
|
|
|
@ -16,7 +16,7 @@ class Plugin : public Transport::NetworkPlugin {
|
|||
|
||||
void handleLogoutRequest(const std::string &user, const std::string &legacyName);
|
||||
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "");
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "", const std::string &id = "");
|
||||
|
||||
void handleBuddyUpdatedRequest(const std::string &user, const std::string &buddyName, const std::string &alias, const std::vector<std::string> &groups);
|
||||
|
||||
|
|
|
@ -194,7 +194,7 @@ void TwitterPlugin::handleLeaveRoomRequest(const std::string &user, const std::s
|
|||
}
|
||||
|
||||
// Messages to be sent to Twitter
|
||||
void TwitterPlugin::handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml)
|
||||
void TwitterPlugin::handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml, const std::string &/*id*/)
|
||||
{
|
||||
|
||||
LOG4CXX_INFO(logger, "Received " << user << " --> " << legacyName << " - " << message)
|
||||
|
|
|
@ -74,7 +74,7 @@ class TwitterPlugin : public NetworkPlugin {
|
|||
|
||||
void handleLeaveRoomRequest(const std::string &/*user*/, const std::string &/*room*/);
|
||||
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "");
|
||||
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "", const std::string &id = "");
|
||||
|
||||
void handleBuddyUpdatedRequest(const std::string &user, const std::string &buddyName, const std::string &alias, const std::vector<std::string> &groups);
|
||||
|
||||
|
|
|
@ -126,6 +126,7 @@ class Config {
|
|||
boost::signal<void ()> onConfigReloaded;
|
||||
|
||||
void updateBackendConfig(const std::string &backendConfig);
|
||||
boost::signal<void ()> onBackendConfigUpdated;
|
||||
|
||||
static Config *createFromArgs(int argc, char **argv, std::string &error, std::string &host, int &port);
|
||||
|
||||
|
|
|
@ -113,6 +113,8 @@ class NetworkPlugin {
|
|||
/// \param xhtml XHTML message.
|
||||
void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = "", const std::string &xhtml = "", const std::string ×tamp = "", bool headline = false);
|
||||
|
||||
void handleMessageAck(const std::string &user, const std::string &legacyName, const std::string &id);
|
||||
|
||||
/// Call this function when subject in room changed.
|
||||
/// \param user XMPP JID of user for which this event occurs. You can get it from NetworkPlugin::handleLoginRequest(). (eg. "user%gmail.com@xmpp.domain.tld")
|
||||
/// \param legacyName Name of room. (eg. "#spectrum")
|
||||
|
@ -199,7 +201,7 @@ class NetworkPlugin {
|
|||
/// \param legacyName Legacy network name of buddy or room.
|
||||
/// \param message Plain text message.
|
||||
/// \param xhtml XHTML message.
|
||||
virtual void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "") = 0;
|
||||
virtual void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "", const std::string &id = "") = 0;
|
||||
|
||||
/// Called when XMPP user requests VCard of buddy.
|
||||
/// \param user XMPP JID of user for which this event occurs.
|
||||
|
|
|
@ -100,6 +100,7 @@ class NetworkPluginServer {
|
|||
void handleBuddyChangedPayload(const std::string &payload);
|
||||
void handleBuddyRemovedPayload(const std::string &payload);
|
||||
void handleConvMessagePayload(const std::string &payload, bool subject = false);
|
||||
void handleConvMessageAckPayload(const std::string &payload);
|
||||
void handleParticipantChangedPayload(const std::string &payload);
|
||||
void handleRoomChangedPayload(const std::string &payload);
|
||||
void handleVCardPayload(const std::string &payload);
|
||||
|
|
|
@ -71,6 +71,7 @@ message ConversationMessage {
|
|||
optional string xhtml = 5;
|
||||
optional string timestamp = 6;
|
||||
optional bool headline = 7;
|
||||
optional string id = 8;
|
||||
}
|
||||
|
||||
message Room {
|
||||
|
@ -167,6 +168,7 @@ message WrapperMessage {
|
|||
TYPE_BACKEND_CONFIG = 30;
|
||||
TYPE_QUERY = 31;
|
||||
TYPE_ROOM_LIST = 32;
|
||||
TYPE_CONV_MESSAGE_ACK = 33;
|
||||
}
|
||||
required Type type = 1;
|
||||
optional bytes payload = 2;
|
||||
|
|
|
@ -100,6 +100,21 @@ void NetworkPlugin::handleMessage(const std::string &user, const std::string &le
|
|||
send(message);
|
||||
}
|
||||
|
||||
void NetworkPlugin::handleMessageAck(const std::string &user, const std::string &legacyName, const std::string &id) {
|
||||
pbnetwork::ConversationMessage m;
|
||||
m.set_username(user);
|
||||
m.set_buddyname(legacyName);
|
||||
m.set_message("");
|
||||
m.set_id(id);
|
||||
|
||||
std::string message;
|
||||
m.SerializeToString(&message);
|
||||
|
||||
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE_ACK);
|
||||
|
||||
send(message);
|
||||
}
|
||||
|
||||
void NetworkPlugin::handleAttention(const std::string &user, const std::string &buddyName, const std::string &msg) {
|
||||
pbnetwork::ConversationMessage m;
|
||||
m.set_username(user);
|
||||
|
@ -391,7 +406,7 @@ void NetworkPlugin::handleConvMessagePayload(const std::string &data) {
|
|||
return;
|
||||
}
|
||||
|
||||
handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message(), payload.xhtml());
|
||||
handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message(), payload.xhtml(), payload.id());
|
||||
}
|
||||
|
||||
void NetworkPlugin::handleRoomSubjectChangedPayload(const std::string &data) {
|
||||
|
|
|
@ -69,15 +69,13 @@ void AdHocManager::stop() {
|
|||
}
|
||||
|
||||
void AdHocManager::handleUserCreated(User *user) {
|
||||
if (!m_storageBackend) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (std::map<std::string, AdHocCommandFactory *>::const_iterator it = m_factories.begin(); it != m_factories.end(); it++) {
|
||||
for (std::map<std::string, std::string>::const_iterator it2 = it->second->getUserSettings().begin(); it2 != it->second->getUserSettings().end(); it2++) {
|
||||
std::string value = CONFIG_STRING_DEFAULTED(m_component->getConfig(), it->second->getNode() + "." + it2->first, it2->second);
|
||||
if (m_storageBackend) {
|
||||
int type = (int) TYPE_BOOLEAN;
|
||||
m_storageBackend->getUserSetting(user->getUserInfo().id, it2->first, type, value);
|
||||
}
|
||||
user->addUserSetting(it2->first, value);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -312,6 +312,7 @@ void Config::updateBackendConfig(const std::string &backendConfig) {
|
|||
("registration.needPassword", value<bool>()->default_value(true), "")
|
||||
("registration.needRegistration", value<bool>()->default_value(false), "")
|
||||
("registration.extraField", value<std::vector<std::string> >()->multitoken(), "")
|
||||
("features.receipts", value<bool>()->default_value(false), "")
|
||||
;
|
||||
|
||||
std::stringstream ifs(backendConfig);
|
||||
|
@ -319,6 +320,8 @@ void Config::updateBackendConfig(const std::string &backendConfig) {
|
|||
|
||||
store(parsed, m_backendConfig);
|
||||
notify(m_backendConfig);
|
||||
|
||||
onBackendConfigUpdated();
|
||||
}
|
||||
|
||||
Config *Config::createFromArgs(int argc, char **argv, std::string &error, std::string &host, int &port) {
|
||||
|
|
|
@ -39,11 +39,12 @@ namespace Transport {
|
|||
|
||||
DiscoInfoResponder::DiscoInfoResponder(Swift::IQRouter *router, Config *config) : Swift::GetResponder<DiscoInfo>(router) {
|
||||
m_config = config;
|
||||
m_config->onBackendConfigUpdated.connect(boost::bind(&DiscoInfoResponder::updateBuddyFeatures, this));
|
||||
m_buddyInfo = NULL;
|
||||
m_transportInfo.addIdentity(DiscoInfo::Identity(CONFIG_STRING(m_config, "identity.name"),
|
||||
CONFIG_STRING(m_config, "identity.category"),
|
||||
CONFIG_STRING(m_config, "identity.type")));
|
||||
|
||||
m_buddyInfo.addIdentity(DiscoInfo::Identity(CONFIG_STRING(m_config, "identity.name"), "client", "pc"));
|
||||
std::list<std::string> features;
|
||||
features.push_back("jabber:iq:register");
|
||||
features.push_back("jabber:iq:gateway");
|
||||
|
@ -52,16 +53,23 @@ DiscoInfoResponder::DiscoInfoResponder(Swift::IQRouter *router, Config *config)
|
|||
features.push_back("http://jabber.org/protocol/commands");
|
||||
setTransportFeatures(features);
|
||||
|
||||
features.clear();
|
||||
updateBuddyFeatures();
|
||||
}
|
||||
|
||||
DiscoInfoResponder::~DiscoInfoResponder() {
|
||||
delete m_buddyInfo;
|
||||
}
|
||||
|
||||
void DiscoInfoResponder::updateBuddyFeatures() {
|
||||
std::list<std::string> features;
|
||||
features.push_back("http://jabber.org/protocol/disco#items");
|
||||
features.push_back("http://jabber.org/protocol/disco#info");
|
||||
features.push_back("http://jabber.org/protocol/chatstates");
|
||||
features.push_back("http://jabber.org/protocol/xhtml-im");
|
||||
setBuddyFeatures(features);
|
||||
if (CONFIG_BOOL_DEFAULTED(m_config, "features.receipts", false)) {
|
||||
features.push_back("urn:xmpp:receipts");
|
||||
}
|
||||
|
||||
DiscoInfoResponder::~DiscoInfoResponder() {
|
||||
|
||||
setBuddyFeatures(features);
|
||||
}
|
||||
|
||||
void DiscoInfoResponder::setTransportFeatures(std::list<std::string> &features) {
|
||||
|
@ -73,14 +81,18 @@ void DiscoInfoResponder::setTransportFeatures(std::list<std::string> &features)
|
|||
}
|
||||
|
||||
void DiscoInfoResponder::setBuddyFeatures(std::list<std::string> &f) {
|
||||
delete m_buddyInfo;
|
||||
m_buddyInfo = new Swift::DiscoInfo;
|
||||
m_buddyInfo->addIdentity(DiscoInfo::Identity(CONFIG_STRING(m_config, "identity.name"), "client", "pc"));
|
||||
|
||||
for (std::list<std::string>::iterator it = f.begin(); it != f.end(); it++) {
|
||||
if (!m_buddyInfo.hasFeature(*it)) {
|
||||
m_buddyInfo.addFeature(*it);
|
||||
if (!m_buddyInfo->hasFeature(*it)) {
|
||||
m_buddyInfo->addFeature(*it);
|
||||
}
|
||||
}
|
||||
|
||||
CapsInfoGenerator caps("spectrum");
|
||||
m_capsInfo = caps.generateCapsInfo(m_buddyInfo);
|
||||
m_capsInfo = caps.generateCapsInfo(*m_buddyInfo);
|
||||
onBuddyCapsInfoChanged(m_capsInfo);
|
||||
}
|
||||
|
||||
|
@ -136,7 +148,7 @@ bool DiscoInfoResponder::handleGetRequest(const Swift::JID& from, const Swift::J
|
|||
}
|
||||
// disco#info for buddy
|
||||
else {
|
||||
boost::shared_ptr<DiscoInfo> res(new DiscoInfo(m_buddyInfo));
|
||||
boost::shared_ptr<DiscoInfo> res(new DiscoInfo(*m_buddyInfo));
|
||||
res->setNode(info->getNode());
|
||||
sendResponse(from, to, id, res);
|
||||
}
|
||||
|
|
|
@ -51,9 +51,10 @@ class DiscoInfoResponder : public Swift::GetResponder<Swift::DiscoInfo> {
|
|||
|
||||
private:
|
||||
virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr<Swift::DiscoInfo> payload);
|
||||
void updateBuddyFeatures();
|
||||
|
||||
Swift::DiscoInfo m_transportInfo;
|
||||
Swift::DiscoInfo m_buddyInfo;
|
||||
Swift::DiscoInfo *m_buddyInfo;
|
||||
Config *m_config;
|
||||
Swift::CapsInfo m_capsInfo;
|
||||
std::map<std::string, std::string> m_rooms;
|
||||
|
|
|
@ -686,6 +686,33 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool
|
|||
m_userManager->messageToXMPPSent();
|
||||
}
|
||||
|
||||
void NetworkPluginServer::handleConvMessageAckPayload(const std::string &data) {
|
||||
pbnetwork::ConversationMessage payload;
|
||||
|
||||
if (payload.ParseFromString(data) == false) {
|
||||
// TODO: ERROR
|
||||
return;
|
||||
}
|
||||
|
||||
User *user = m_userManager->getUser(payload.username());
|
||||
if (!user)
|
||||
return;
|
||||
|
||||
|
||||
boost::shared_ptr<Swift::Message> msg(new Swift::Message());
|
||||
msg->addPayload(boost::make_shared<Swift::DeliveryReceipt>(payload.id()));
|
||||
|
||||
NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname());
|
||||
|
||||
// Receipts don't create conversation
|
||||
if (!conv) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Forward it
|
||||
conv->handleMessage(msg);
|
||||
}
|
||||
|
||||
void NetworkPluginServer::handleAttentionPayload(const std::string &data) {
|
||||
pbnetwork::ConversationMessage payload;
|
||||
if (payload.ParseFromString(data) == false) {
|
||||
|
@ -1023,6 +1050,9 @@ void NetworkPluginServer::handleDataRead(Backend *c, boost::shared_ptr<Swift::Sa
|
|||
case pbnetwork::WrapperMessage_Type_TYPE_ROOM_LIST:
|
||||
handleRoomListPayload(wrapper.payload());
|
||||
break;
|
||||
case pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE_ACK:
|
||||
handleConvMessageAckPayload(wrapper.payload());
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
@ -1406,6 +1436,10 @@ void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost
|
|||
m.set_buddyname(conv->getLegacyName());
|
||||
m.set_message(msg->getBody());
|
||||
m.set_xhtml(xhtml);
|
||||
boost::shared_ptr<Swift::DeliveryReceiptRequest> receiptPayload = msg->getPayload<Swift::DeliveryReceiptRequest>();
|
||||
if (receiptPayload && !msg->getID().empty()) {
|
||||
m.set_id(msg->getID());
|
||||
}
|
||||
|
||||
std::string message;
|
||||
m.SerializeToString(&message);
|
||||
|
|
|
@ -28,6 +28,7 @@ class DiscoItemsResponderTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
|||
CPPUNIT_TEST(roomList);
|
||||
CPPUNIT_TEST(roomInfo);
|
||||
CPPUNIT_TEST(clearRooms);
|
||||
CPPUNIT_TEST(receipts);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
public:
|
||||
|
@ -94,6 +95,32 @@ class DiscoItemsResponderTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
|||
CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoItems>()->getItems().empty());
|
||||
}
|
||||
|
||||
void receipts() {
|
||||
boost::shared_ptr<Swift::DiscoInfo> payload(new Swift::DiscoInfo());
|
||||
boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Get, Swift::JID("localhost"), "id", payload);
|
||||
iq->setFrom("user@localhost");
|
||||
iq->setTo("buddy@localhost");
|
||||
injectIQ(iq);
|
||||
loop->processEvents();
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
|
||||
CPPUNIT_ASSERT(dynamic_cast<Swift::IQ *>(getStanza(received[0])));
|
||||
CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoInfo>());
|
||||
CPPUNIT_ASSERT(!getStanza(received[0])->getPayload<Swift::DiscoInfo>()->hasFeature("urn:xmpp:receipts"));
|
||||
received.clear();
|
||||
|
||||
cfg->updateBackendConfig("[features]\nreceipts=1\n");
|
||||
|
||||
injectIQ(iq);
|
||||
loop->processEvents();
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
|
||||
CPPUNIT_ASSERT(dynamic_cast<Swift::IQ *>(getStanza(received[0])));
|
||||
CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoInfo>());
|
||||
CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoInfo>()->hasFeature("urn:xmpp:receipts"));
|
||||
received.clear();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION (DiscoItemsResponderTest);
|
||||
|
|
Loading…
Add table
Reference in a new issue