Forwarding Chatstate into legacy network

This commit is contained in:
HanzZ 2011-06-12 13:51:35 +02:00
parent bf5cc016f8
commit d699f6614f
4 changed files with 100 additions and 9 deletions

View file

@ -244,6 +244,27 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
}
}
void handleTypingRequest(const std::string &user, const std::string &buddyName) {
PurpleAccount *account = m_sessions[user];
if (account) {
serv_send_typing(purple_account_get_connection(account), buddyName.c_str(), PURPLE_TYPING);
}
}
void handleTypedRequest(const std::string &user, const std::string &buddyName) {
PurpleAccount *account = m_sessions[user];
if (account) {
serv_send_typing(purple_account_get_connection(account), buddyName.c_str(), PURPLE_TYPED);
}
}
void handleStoppedTypingRequest(const std::string &user, const std::string &buddyName) {
PurpleAccount *account = m_sessions[user];
if (account) {
serv_send_typing(purple_account_get_connection(account), buddyName.c_str(), PURPLE_NOT_TYPING);
}
}
std::map<std::string, PurpleAccount *> m_sessions;
std::map<PurpleAccount *, std::string> m_accounts;
std::map<std::string, unsigned int> m_vcards;

View file

@ -73,6 +73,10 @@ class NetworkPlugin {
virtual void handleStatusChangeRequest(const std::string &/*user*/, int status, const std::string &statusMessage) {}
virtual void handleBuddyUpdatedRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*alias*/, const std::string &/*groups*/) {}
virtual void handleBuddyRemovedRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*groups*/) {}
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*/) {}
private:
@ -86,6 +90,7 @@ class NetworkPlugin {
void handleVCardPayload(const std::string &payload);
void handleBuddyChangedPayload(const std::string &payload);
void handleBuddyRemovedPayload(const std::string &payload);
void handleChatStatePayload(const std::string &payload, Swift::ChatState::ChatStateType type);
void handleDataRead(const Swift::SafeByteArray&);
void _handleConnected(bool error);
void handleDisconnected();

View file

@ -334,6 +334,28 @@ void NetworkPlugin::handleBuddyRemovedPayload(const std::string &data) {
handleBuddyRemovedRequest(payload.username(), payload.buddyname(), payload.groups());
}
void NetworkPlugin::handleChatStatePayload(const std::string &data, Swift::ChatState::ChatStateType type) {
pbnetwork::Buddy payload;
if (payload.ParseFromString(data) == false) {
// TODO: ERROR
return;
}
switch(type) {
case Swift::ChatState::Composing:
handleTypingRequest(payload.username(), payload.buddyname());
break;
case Swift::ChatState::Paused:
handleTypedRequest(payload.username(), payload.buddyname());
break;
case Swift::ChatState::Active:
handleStoppedTypingRequest(payload.username(), payload.buddyname());
break;
default:
break;
}
}
void NetworkPlugin::handleDataRead(const Swift::SafeByteArray &data) {
m_data.insert(m_data.end(), data.begin(), data.end());
@ -388,6 +410,15 @@ void NetworkPlugin::handleDataRead(const Swift::SafeByteArray &data) {
case pbnetwork::WrapperMessage_Type_TYPE_STATUS_CHANGED:
handleStatusChangedPayload(wrapper.payload());
break;
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPING:
handleChatStatePayload(wrapper.payload(), Swift::ChatState::Composing);
break;
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPED:
handleChatStatePayload(wrapper.payload(), Swift::ChatState::Paused);
break;
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_STOPPED_TYPING:
handleChatStatePayload(wrapper.payload(), Swift::ChatState::Active);
break;
default:
return;
}

View file

@ -560,18 +560,52 @@ void NetworkPluginServer::handleUserDestroyed(User *user) {
}
void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost::shared_ptr<Swift::Message> &msg) {
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);
boost::shared_ptr<Swift::ChatState> statePayload = msg->getPayload<Swift::ChatState>();
if (statePayload) {
pbnetwork::WrapperMessage_Type type = pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED;
switch (statePayload->getChatState()) {
case Swift::ChatState::Active:
type = pbnetwork::WrapperMessage_Type_TYPE_BUDDY_STOPPED_TYPING;
break;
case Swift::ChatState::Composing:
type = pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPING;
break;
case Swift::ChatState::Paused:
type = pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPED;
break;
default:
break;
}
if (type != pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED) {
pbnetwork::Buddy buddy;
buddy.set_username(conv->getConversationManager()->getUser()->getJID().toBare());
buddy.set_buddyname(conv->getLegacyName());
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE);
std::string message;
buddy.SerializeToString(&message);
Client *c = (Client *) conv->getConversationManager()->getUser()->getData();
send(c->connection, message);
WRAP(message, type);
Client *c = (Client *) conv->getConversationManager()->getUser()->getData();
send(c->connection, message);
}
}
if (!msg->getBody().empty()) {
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_CONV_MESSAGE);
Client *c = (Client *) conv->getConversationManager()->getUser()->getData();
send(c->connection, message);
}
}
void NetworkPluginServer::handleBuddyRemoved(Buddy *b) {