messages in both directions

This commit is contained in:
HanzZ 2011-05-14 15:31:29 +02:00
parent 4c87620c9f
commit b62274f1dd
5 changed files with 49 additions and 7 deletions

View file

@ -107,6 +107,21 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
}
}
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message) {
const char *protocol = CONFIG_STRING(config, "service.protocol").c_str();
PurpleAccount *account = purple_accounts_find(user.c_str(), protocol);
std::cout << user << "\n";
if (account) {
PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, legacyName.c_str(), account);
if (!conv) {
conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, legacyName.c_str());
}
gchar *_markup = purple_markup_escape_text(message.c_str(), -1);
purple_conv_im_send(PURPLE_CONV_IM(conv), _markup);
g_free(_markup);
}
}
std::map<PurpleAccount *, std::string> m_accounts;
private:
Config *config;
@ -318,11 +333,6 @@ static void conv_write_im(PurpleConversation *conv, const char *who, const char
if (flags & PURPLE_MESSAGE_SEND || flags & PURPLE_MESSAGE_SYSTEM)
return;
PurpleAccount *account = purple_conversation_get_account(conv);
// SpectrumConversation *s_conv = (SpectrumConversation *) conv->ui_data;
// if (!s_conv)
// return;
// boost::shared_ptr<Swift::Message> msg(new Swift::Message());
char *striped = purple_markup_strip_html(message);
std::string msg = striped;

View file

@ -45,6 +45,10 @@ class Conversation {
virtual void sendMessage(boost::shared_ptr<Swift::Message> &message) = 0;
ConversationManager *getConversationManager() {
return m_conversationManager;
}
private:
ConversationManager *m_conversationManager;
std::string m_legacyName;

View file

@ -50,11 +50,14 @@ class NetworkPlugin {
virtual void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) = 0;
virtual void handleLogoutRequest(const std::string &user, const std::string &legacyName) = 0;
virtual void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message) = 0;
private:
void connect();
void handleLoginPayload(const std::string &payload);
void handleLogoutPayload(const std::string &payload);
void handleConvMessagePayload(const std::string &payload);
void handleDataRead(const Swift::ByteArray&);
void handleConnected(bool error);
void handleDisconnected();

View file

@ -146,6 +146,16 @@ void NetworkPlugin::handleLogoutPayload(const std::string &data) {
handleLogoutRequest(payload.user(), payload.legacyname());
}
void NetworkPlugin::handleConvMessagePayload(const std::string &data) {
pbnetwork::ConversationMessage payload;
if (payload.ParseFromString(data) == false) {
// TODO: ERROR
return;
}
handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message());
}
void NetworkPlugin::handleDataRead(const Swift::ByteArray &data) {
long expected_size = 0;
m_data += data.toString();
@ -180,6 +190,9 @@ void NetworkPlugin::handleDataRead(const Swift::ByteArray &data) {
case pbnetwork::WrapperMessage_Type_TYPE_PING:
sendPong();
break;
case pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE:
handleConvMessagePayload(wrapper.payload());
break;
default:
return;
}

View file

@ -105,6 +105,7 @@ static void handleBuddyPayload(LocalBuddy *buddy, const pbnetwork::Buddy &payloa
NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, UserManager *userManager) {
m_userManager = userManager;
m_config = config;
component->m_factory = new NetworkFactory(this);
m_pongReceived = false;
m_userManager->onUserCreated.connect(boost::bind(&NetworkPluginServer::handleUserCreated, this, _1));
m_userManager->onUserDestroyed.connect(boost::bind(&NetworkPluginServer::handleUserDestroyed, this, _1));
@ -208,6 +209,7 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data) {
NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname());
if (!conv) {
conv = new NetworkConversation(user->getConversationManager(), payload.buddyname());
conv->onMessageToSend.connect(boost::bind(&NetworkPluginServer::handleMessageReceived, this, _1, _2));
}
boost::shared_ptr<Swift::Message> msg(new Swift::Message());
msg->setBody(payload.message());
@ -317,8 +319,18 @@ void NetworkPluginServer::handleUserDestroyed(User *user) {
send(m_client, message);
}
void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost::shared_ptr<Swift::Message> &message) {
void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost::shared_ptr<Swift::Message> &msg) {
pbnetwork::ConversationMessage m;
m.set_username(conv->getConversationManager()->getUser()->getUserInfo().uin);
m.set_buddyname(conv->getLegacyName());
m.set_message(msg->getBody());
std::string message;
m.SerializeToString(&message);
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE);
send(m_client, message);
}
void NetworkPluginServer::sendPing() {