Working attention from XMPP -> legacy network

This commit is contained in:
Jan Kaluza 2011-06-22 12:11:24 +02:00
parent d6c003bad3
commit fb420ef125
8 changed files with 45 additions and 3 deletions

View file

@ -433,6 +433,13 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
}
}
void handleAttentionRequest(const std::string &user, const std::string &buddyName, const std::string &message) {
PurpleAccount *account = m_sessions[user];
if (account) {
purple_prpl_send_attention(purple_account_get_connection(account), buddyName.c_str(), 0);
}
}
std::map<std::string, PurpleAccount *> m_sessions;
std::map<PurpleAccount *, std::string> m_accounts;
std::map<std::string, unsigned int> m_vcards;

View file

@ -100,7 +100,7 @@ void Server::handleNewClientConnection(boost::shared_ptr<Connection> connection)
boost::shared_ptr<ServerFromClientSession> serverFromClientSession = boost::shared_ptr<ServerFromClientSession>(
new ServerFromClientSession(idGenerator.generateID(), connection,
&payloadParserFactories, &payloadSerializers, userRegistry_));
getPayloadParserFactories(), getPayloadSerializers(), userRegistry_));
//serverFromClientSession->setAllowSASLEXTERNAL();
serverFromClientSession->onSessionStarted.connect(

View file

@ -67,8 +67,6 @@ namespace Swift {
private:
IDGenerator idGenerator;
FullPayloadParserFactoryCollection payloadParserFactories;
FullPayloadSerializerCollection payloadSerializers;
UserRegistry *userRegistry_;
int port_;
EventLoop* eventLoop;

View file

@ -80,6 +80,7 @@ class NetworkPlugin {
virtual void handleTypingRequest(const std::string &/*user*/, const std::string &/*buddyName*/) {}
virtual void handleTypedRequest(const std::string &/*user*/, const std::string &/*buddyName*/) {}
virtual void handleStoppedTypingRequest(const std::string &/*user*/, const std::string &/*buddyName*/) {}
virtual void handleAttentionRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*message*/) {}
private:
@ -94,6 +95,7 @@ class NetworkPlugin {
void handleBuddyChangedPayload(const std::string &payload);
void handleBuddyRemovedPayload(const std::string &payload);
void handleChatStatePayload(const std::string &payload, Swift::ChatState::ChatStateType type);
void handleAttentionPayload(const std::string &payload);
void handleDataRead(const Swift::SafeByteArray&);
void _handleConnected(bool error);
void handleDisconnected();

View file

@ -61,9 +61,11 @@ void ConversationManager::handleMessageReceived(Swift::Message::ref message) {
name.replace(name.find_last_of("%"), 1, "@");
}
// create conversation if it does not exist.
if (!m_convs[name]) {
m_convs[name] = m_component->getFactory()->createConversation(this, name);
}
// if it exists and it's MUC, but this message is PM, get PM conversation or create new one.
else if (m_convs[name]->isMUC() && message->getType() != Swift::Message::Groupchat) {
std::string room_name = name;
name = message->getTo().getResource();

View file

@ -303,6 +303,16 @@ void NetworkPlugin::handleConvMessagePayload(const std::string &data) {
handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message());
}
void NetworkPlugin::handleAttentionPayload(const std::string &data) {
pbnetwork::ConversationMessage payload;
if (payload.ParseFromString(data) == false) {
// TODO: ERROR
return;
}
handleAttentionRequest(payload.username(), payload.buddyname(), payload.message());
}
void NetworkPlugin::handleJoinRoomPayload(const std::string &data) {
pbnetwork::Room payload;
if (payload.ParseFromString(data) == false) {
@ -443,6 +453,9 @@ void NetworkPlugin::handleDataRead(const Swift::SafeByteArray &data) {
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_STOPPED_TYPING:
handleChatStatePayload(wrapper.payload(), Swift::ChatState::Active);
break;
case pbnetwork::WrapperMessage_Type_TYPE_ATTENTION:
handleAttentionPayload(wrapper.payload());
break;
default:
return;
}

View file

@ -34,6 +34,7 @@
#include "Swiften/Server/ServerStanzaChannel.h"
#include "Swiften/Elements/StreamError.h"
#include "Swiften/Network/BoostConnectionServer.h"
#include "Swiften/Elements/AttentionPayload.h"
#include "pbnetwork.pb.h"
#include "sys/wait.h"
#include "sys/signal.h"
@ -649,6 +650,24 @@ void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost
}
}
boost::shared_ptr<Swift::AttentionPayload> attentionPayload = msg->getPayload<Swift::AttentionPayload>();
if (attentionPayload) {
pbnetwork::ConversationMessage m;
m.set_username(conv->getConversationManager()->getUser()->getJID().toBare());
m.set_buddyname(conv->getLegacyName());
m.set_message(msg->getBody());
std::string message;
m.SerializeToString(&message);
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ATTENTION);
Client *c = (Client *) conv->getConversationManager()->getUser()->getData();
send(c->connection, message);
return;
}
if (!msg->getBody().empty()) {
pbnetwork::ConversationMessage m;
m.set_username(conv->getConversationManager()->getUser()->getJID().toBare());

View file

@ -93,6 +93,7 @@ message WrapperMessage {
TYPE_BUDDY_STOPPED_TYPING = 19;
TYPE_BUDDY_TYPED = 20;
TYPE_AUTH_REQUEST = 21;
TYPE_ATTENTION = 22;
}
required Type type = 1;
optional bytes payload = 2;