ping/pong, message transfering

This commit is contained in:
HanzZ 2011-05-13 23:37:48 +02:00
parent 43ca88c1bd
commit bc585576a9
8 changed files with 94 additions and 16 deletions

View file

@ -317,17 +317,18 @@ static void conv_write_im(PurpleConversation *conv, const char *who, const char
// Don't forwards our own messages.
if (flags & PURPLE_MESSAGE_SEND || flags & PURPLE_MESSAGE_SYSTEM)
return;
SpectrumConversation *s_conv = (SpectrumConversation *) conv->ui_data;
if (!s_conv)
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());
// boost::shared_ptr<Swift::Message> msg(new Swift::Message());
char *striped = purple_markup_strip_html(message);
msg->setBody(message);
std::string msg = stripped;
g_free(striped);
s_conv->handleMessage(msg);
np->handleMessage(np->m_accounts[account], who, msg);
}
static PurpleConversationUiOps conversation_ui_ops =

View file

@ -47,6 +47,10 @@ class ConversationManager {
Component *getComponent() { return m_component; }
Conversation *getConversation(const std::string &name) {
return m_convs[name];
}
void setConversation(Conversation *conv);
void unsetConversation(Conversation *conv);

View file

@ -46,6 +46,8 @@ class NetworkPlugin {
void handleDisconnected(const std::string &user, const std::string &legacyName, int error, const std::string &message);
void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message);
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;

View file

@ -36,6 +36,7 @@ class Component;
class Buddy;
class LocalBuddy;
class Config;
class NetworkConversation;
class NetworkPluginServer {
public:
@ -43,6 +44,8 @@ class NetworkPluginServer {
virtual ~NetworkPluginServer();
void handleMessageReceived(NetworkConversation *conv, boost::shared_ptr<Swift::Message> &message);
private:
void handleNewClientConnection(boost::shared_ptr<Swift::Connection> c);
void handleSessionFinished(boost::shared_ptr<Swift::Connection>);
@ -51,6 +54,7 @@ class NetworkPluginServer {
void handleConnectedPayload(const std::string &payload);
void handleDisconnectedPayload(const std::string &payload);
void handleBuddyChangedPayload(const std::string &payload);
void handleConvMessagePayload(const std::string &payload);
void handleUserCreated(User *user);
void handleUserReadyToConnect(User *user);

View file

@ -164,5 +164,6 @@ namespace Transport {
friend class User;
friend class UserRegistration;
friend class NetworkPluginServer;
};
}

View file

@ -55,6 +55,20 @@ NetworkPlugin::~NetworkPlugin() {
delete m_factories;
}
void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg) {
pbnetwork::ConversationMessage m;
m.set_username(user);
m.set_buddyname(legacyName);
m.set_message(msg);
std::string message;
m.SerializeToString(&message);
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE);
send(message);
}
void NetworkPlugin::handleBuddyChanged(const std::string &user, const std::string &buddyName, const std::string &alias,
const std::string &groups, int status, const std::string &statusMessage, const std::string &iconHash) {
pbnetwork::Buddy buddy;

View file

@ -27,6 +27,7 @@
#include "transport/conversationmanager.h"
#include "transport/localbuddy.h"
#include "transport/config.h"
#include "transport/conversation.h"
#include "Swiften/Swiften.h"
#include "Swiften/Server/ServerStanzaChannel.h"
#include "Swiften/Elements/StreamError.h"
@ -36,6 +37,37 @@
namespace Transport {
class NetworkConversation : public Conversation {
public:
NetworkConversation(ConversationManager *conversationManager, const std::string &legacyName) : Conversation(conversationManager, legacyName) {
}
void sendMessage(boost::shared_ptr<Swift::Message> &message) {
onMessageToSend(this, message);
}
boost::signal<void (NetworkConversation *, boost::shared_ptr<Swift::Message> &)> onMessageToSend;
};
class NetworkFactory : public Factory {
public:
NetworkFactory(NetworkPluginServer *nps) {
m_nps = nps;
}
Conversation *createConversation(ConversationManager *conversationManager, const std::string &legacyName) {
NetworkConversation *nc = new NetworkConversation(conversationManager, legacyName);
nc->onMessageToSend.connect(boost::bind(&NetworkPluginServer::handleMessageReceived, m_nps, _1, _2));
return nc;
}
Buddy *createBuddy(RosterManager *rosterManager, const BuddyInfo &buddyInfo) {
return new LocalBuddy(rosterManager, -1);
}
private:
NetworkPluginServer *m_nps;
};
#define WRAP(MESSAGE, TYPE) pbnetwork::WrapperMessage wrap; \
wrap.set_type(TYPE); \
wrap.set_payload(MESSAGE); \
@ -161,6 +193,26 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) {
}
}
void NetworkPluginServer::handleConvMessagePayload(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;
NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname());
if (!conv) {
conv = new NetworkConversation(user->getConversationManager(), payload.buddyname());
}
boost::shared_ptr<Swift::Message> msg(new Swift::Message());
msg->setBody(payload.message());
conv->handleMessage(msg);
}
void NetworkPluginServer::handleDataRead(boost::shared_ptr<Swift::Connection> c, const Swift::ByteArray &data) {
long expected_size = 0;
m_data += data.toString();
@ -197,6 +249,9 @@ void NetworkPluginServer::handleDataRead(boost::shared_ptr<Swift::Connection> c,
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED:
handleBuddyChangedPayload(wrapper.payload());
break;
case pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE:
handleConvMessagePayload(wrapper.payload());
break;
case pbnetwork::WrapperMessage_Type_TYPE_PONG:
m_pongReceived = true;
break;
@ -261,6 +316,10 @@ void NetworkPluginServer::handleUserDestroyed(User *user) {
send(m_client, message);
}
void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost::shared_ptr<Swift::Message> &message) {
}
void NetworkPluginServer::sendPing() {
std::string message;

View file

@ -33,11 +33,6 @@ message Buddy {
optional string iconHash = 7;
}
message Conversation {
required string userName = 1;
required string buddyName = 2;
}
message ConversationMessage {
required string userName = 1;
required string buddyName = 2;
@ -52,11 +47,9 @@ message WrapperMessage {
TYPE_LOGOUT = 4;
TYPE_BUDDY_CHANGED = 6;
TYPE_BUDDY_REMOVED = 7;
TYPE_CONV_CREATED = 8;
TYPE_CONV_WRITE = 9;
TYPE_CONV_REMOVED = 10;
TYPE_PING = 11;
TYPE_PONG = 12;
TYPE_CONV_MESSAGE = 8;
TYPE_PING = 9;
TYPE_PONG = 10;
}
required Type type = 1;
optional bytes payload = 2;