diff --git a/include/transport/buddy.h b/include/transport/buddy.h index 2d4d4008..adbe9a38 100644 --- a/include/transport/buddy.h +++ b/include/transport/buddy.h @@ -39,12 +39,18 @@ typedef enum { BUDDY_NO_FLAG = 0, class Buddy { public: /// Constructor. + + /// \param rosterManager RosterManager associated with this buddy. + /// \param id ID which identifies the buddy in database or -1 if it's new buddy which is + /// not in database yet. Buddy(RosterManager *rosterManager, long id = -1); /// Destructor virtual ~Buddy(); - /// Sets unique ID used to identify this buddy by StorageBackend. This is set + /// Sets unique ID used to identify this buddy by StorageBackend. + + /// This is set /// by RosterStorage class once the buddy is stored into database or when the /// buddy is loaded from database. /// You should not need to set this ID manually. @@ -52,16 +58,19 @@ class Buddy { void setID(long id); /// Returns unique ID used to identify this buddy by StorageBackend. - /// \see Buddy::setID(long) - /// \return ID + + /// \return ID which identifies the buddy in database or -1 if it's new buddy which is + /// not in database yet. long getID(); /// Returns full JID of this buddy. + /// \param hostname hostname used as domain in returned JID /// \return full JID of this buddy const Swift::JID &getJID(); /// Generates whole Presennce stanza with current status/show for this buddy. + /// Presence stanza does not containt "to" attribute, it has to be added manually. /// \param features features used in returned stanza /// \param only_new if True, this function returns Presence stanza only if it's different @@ -76,65 +85,84 @@ class Buddy { void setOffline(); /// Returns true if this buddy is marked as available/online. + /// \return true if this buddy is marked as available/online. bool isOnline(); /// Sets current subscription. + /// \param subscription "to", "from", "both", "ask" void setSubscription(const std::string &subscription); /// Returns current subscription + /// \return subscription "to", "from", "both", "ask" const std::string &getSubscription(); /// Sets this buddy's flags. + /// \param flags flags void setFlags(BuddyFlag flags); /// Returns this buddy's flags. + /// \param flags flags BuddyFlag getFlags(); - /// Returns RosterManager associated with this buddy - /// \return rosterManager + /// Returns RosterManager associated with this buddy. + + /// \return RosterManager associated with this buddy. RosterManager *getRosterManager() { return m_rosterManager; } /// Returns legacy network username which does not contain unsafe characters, /// so it can be used in JIDs. std::string getSafeName(); - void buddyChanged(); + /// This method should be called whenever some information returned by virtual functions changes. - void handleVCardReceived(const std::string &id, const Swift::JID &to, Swift::VCard::ref vcard); + /// This method sends presence to XMPP user. + void handleBuddyChanged(); + /// Handles VCard from legacy network and forwards it to XMPP user. + + /// \param id ID used in IQ-result. + /// \param vcard VCard which will be sent. + void handleVCardReceived(const std::string &id, Swift::VCard::ref vcard); + + /// This signal is emitted when buddyChanged method is called. boost::signal onBuddyChanged; - virtual void getVCard(const std::string &id, const Swift::JID &to) = 0; + /// Returns legacy network username of this buddy. (for example UIN for ICQ, JID for Jabber, ...). - /// Returns legacy network username of this buddy. (for example UIN for ICQ, - /// JID for Jabber, ...). /// \return legacy network username virtual std::string getName() = 0; /// Returns alias (nickname) of this buddy. + /// \return alias (nickname) virtual std::string getAlias() = 0; /// Returns list of groups this buddy is in. + /// \return groups virtual std::vector getGroups() = 0; /// Returns current legacy network status and statuMessage of this buddy. + /// \param status current status/show is stored here /// \param statusMessage current status message is stored here /// \return true if status was stored successfully virtual bool getStatus(Swift::StatusShow &status, std::string &statusMessage) = 0; - /// Returns SHA-1 hash of buddy icon (avatar) or empty string if there is no avatar - /// for this buddy. + /// Returns SHA-1 hash of buddy icon (avatar) or empty string if there is no avatar for this buddy. + /// \return avatar hash or empty string. virtual std::string getIconHash() = 0; + /// Returns legacy name of buddy from JID. + + /// \param jid Jabber ID. + /// \return legacy name of buddy from JID. static std::string JIDToLegacyName(const Swift::JID &jid); private: diff --git a/include/transport/config.h b/include/transport/config.h index dff687d8..ea21f562 100644 --- a/include/transport/config.h +++ b/include/transport/config.h @@ -53,23 +53,30 @@ class Config { /// Destructor virtual ~Config() {} - /// Loads data from config file. You can pass your extra options which will be recognized by + /// Loads data from config file. + + /// You can pass your extra options which will be recognized by /// the parser using opts parameter. /// \param configfile path to config file /// \param opts extra options which will be recognized by a parser bool load(const std::string &configfile, boost::program_options::options_description &opts); - /// Loads data from config file. This function loads only config variables needed by libtransport. + /// Loads data from config file. + + /// This function loads only config variables needed by libtransport. /// \see load(const std::string &, boost::program_options::options_description &) /// \param configfile path to config file bool load(const std::string &configfile); - /// Returns value of variable defined by key. For variables in sections you can use "section.variable" key format. + /// Returns value of variable defined by key. + + /// For variables in sections you can use "section.variable" key format. /// \param key config variable name const boost::program_options::variable_value &operator[] (const std::string &key) { return m_variables[key]; } + /// Returns path to config file from which data were loaded. const std::string &getConfigFile() { return m_file; } /// This signal is emitted when config is loaded/reloaded. diff --git a/include/transport/conversation.h b/include/transport/conversation.h index 17de85f0..82a35b0c 100644 --- a/include/transport/conversation.h +++ b/include/transport/conversation.h @@ -31,38 +31,79 @@ namespace Transport { class ConversationManager; +/// Represents one XMPP-Legacy network conversation. class Conversation { public: + /// Type of participants in MUC rooms. enum ParticipantFlag {None, Moderator}; - /// Constructor. - Conversation(ConversationManager *conversationManager, const std::string &legacyName, bool m_muc = false); + /// Creates new conversation. - /// Destructor + /// \param conversationManager ConversationManager associated with this Conversation. + /// \param legacyName Legacy network name of recipient. + /// \param muc True if this conversation is Multi-user chat. + Conversation(ConversationManager *conversationManager, const std::string &legacyName, bool muc = false); + + /// Destructor. virtual ~Conversation(); + /// Returns legacy network name of this conversation. + + /// \return legacy network name of this conversation. const std::string &getLegacyName() { return m_legacyName; } + /// Handles new message from Legacy network and forwards it to XMPP. + + /// \param message Message received from legacy network. + /// \param nickname For MUC conversation this is nickname of room participant who sent this message. void handleMessage(boost::shared_ptr &message, const std::string &nickname = ""); + + /// Handles participant change in MUC. + + /// \param nickname Nickname of participant which changed. + /// \param flag ParticipantFlag. + /// \param status Current status of this participant. + /// \param statusMessage Current status message of this participant. + /// \param newname If participant was renamed, this variable contains his new name. void handleParticipantChanged(const std::string &nickname, int flag, int status = Swift::StatusShow::None, const std::string &statusMessage = "", const std::string &newname = ""); + + /// Sets XMPP user nickname in MUC rooms. + + /// \param nickname XMPP user nickname in MUC rooms. void setNickname(const std::string &nickname) { m_nickname = nickname; } + /// Sends message to Legacy network. + + /// \param message Message. virtual void sendMessage(boost::shared_ptr &message) = 0; + /// Returns ConversationManager associated with this Conversation. + + /// \return ConversationManager associated with this Conversation. ConversationManager *getConversationManager() { return m_conversationManager; } + /// Returns True if this conversation is MUC room. + + /// \return True if this conversation is MUC room. bool isMUC() { return m_muc; } + /// Sets room name associated with this Conversation. + + /// This is used to detect Private messages associated with particular room. + /// \param room room name associated with this Conversation. void setRoom(const std::string &room) { m_room = room; } + /// Returns room name associated with this Conversation. + + /// \return room name associated with this Conversation. const std::string &getRoom() { return m_room; } diff --git a/include/transport/conversationmanager.h b/include/transport/conversationmanager.h index d7804b93..fd56f877 100644 --- a/include/transport/conversationmanager.h +++ b/include/transport/conversationmanager.h @@ -31,29 +31,45 @@ class Conversation; class User; class Component; +/// Manages all Conversations of particular User. class ConversationManager { public: /// Creates new ConversationManager. + /// \param user User associated with this ConversationManager. - /// \param component Transport instance associated with this roster. + /// \param component Transport instance associated with this ConversationManager. ConversationManager(User *user, Component *component); /// Destructor. virtual ~ConversationManager(); /// Returns user associated with this manager. + /// \return User User *getUser() { return m_user; } + /// Returns component associated with this ConversationManager. + + /// \return component associated with this ConversationManager. Component *getComponent() { return m_component; } + /// Returns Conversation by its legacy network name (for example by UIN in case of ICQ). + + /// \param name legacy network name. + /// \return Conversation or NULL. Conversation *getConversation(const std::string &name) { return m_convs[name]; } - void setConversation(Conversation *conv); + /// Adds new Conversation to the manager. - void unsetConversation(Conversation *conv); + /// \param conv Conversation. + void addConversation(Conversation *conv); + + /// Removes Conversation from the manager. + + /// \param conv Conversation. + void removeConversation(Conversation *conv); private: void handleMessageReceived(Swift::Message::ref message); diff --git a/include/transport/localbuddy.h b/include/transport/localbuddy.h index 3b1e7569..588126ea 100644 --- a/include/transport/localbuddy.h +++ b/include/transport/localbuddy.h @@ -56,8 +56,6 @@ class LocalBuddy : public Buddy { std::vector getGroups() { return m_groups; } void setGroups(const std::vector &groups) { m_groups = groups; } - void getVCard(const std::string &id, const Swift::JID &to) {} - private: std::string m_name; std::string m_alias; diff --git a/include/transport/transport.h b/include/transport/transport.h index 5c91442b..cd43e238 100644 --- a/include/transport/transport.h +++ b/include/transport/transport.h @@ -52,61 +52,92 @@ namespace Transport { /// Represents one transport instance. - /// It's used to connect - /// the Jabber server and provides transaction layer between Jabber server - /// and other classes. + /// It's used to connect the Jabber server and provides transaction layer + /// between Jabber server and other classes. + /// + /// In server mode it represents Jabber server to which users can connect and use + /// it as transport. class Component { public: /// Creates new Component instance. - /// \param loop main event loop - /// \param config cofiguration, this class uses following Config values: + + /// \param loop Main event loop. + /// \param config Cofiguration; this class uses following Config values: /// - service.jid /// - service.password /// - service.server /// - service.port + /// - service.server_mode + /// \param factory Transport Abstract factory used to create basic transport structures. Component(Swift::EventLoop *loop, Config *config, Factory *factory); /// Component destructor. ~Component(); - /// Returns Swift::Component associated with this Transport::Component. - /// You can use it to send presences and other stanzas. - /// \return Swift::Component associated with this Transport::Component + /// Returns Swift::StanzaChannel associated with this Transport::Component. + + /// It can be used to send presences and other stanzas. + /// \return Swift::StanzaChannel associated with this Transport::Component. Swift::StanzaChannel *getStanzaChannel(); + /// Returns Swift::IQRouter associated with this Component. + + /// \return Swift::IQRouter associated with this Component. Swift::IQRouter *getIQRouter() { return m_iqRouter; } /// Returns Swift::PresenceOracle associated with this Transport::Component. + /// You can use it to check current resource connected for particular user. - /// \return Swift::PresenceOracle associated with this Transport::Component + /// \return Swift::PresenceOracle associated with this Transport::Component. Swift::PresenceOracle *getPresenceOracle(); + /// Returns True if the component is in server mode. + + /// \return True if the component is in server mode. bool inServerMode() { return m_server != NULL; } + + /// Returns user password from internal UserRegistry. + + /// In server mode, the password user used for login can be obtained by + /// this method. + /// \param barejid User's bare JID. + /// \return User's password. const std::string &getUserRegistryPassword(const std::string &barejid); /// Connects the Jabber server. - /// \see Component() + + /// In server mode this function does nothing. void connect(); - /// Sets disco#info features which are sent as answer to - /// disco#info IQ-get. This sets features of transport contact (For example "j2j.domain.tld"). + /// Sets disco#info features which are sent as answer to disco#info IQ-get. + + /// This sets features of transport contact (For example "j2j.domain.tld"). /// \param features list of features as sent in disco#info response void setTransportFeatures(std::list &features); - /// Sets disco#info features which are sent as answer to - /// disco#info IQ-get. This sets features of legacy network buddies (For example "me\40gmail.com@j2j.domain.tld"). + /// Sets disco#info features which are sent as answer to disco#info IQ-get. + + /// This sets features of legacy network buddies (For example "me\40gmail.com@j2j.domain.tld"). /// \param features list of features as sent in disco#info response void setBuddyFeatures(std::list &features); /// Returns Jabber ID of this transport. + /// \return Jabber ID of this transport Swift::JID &getJID() { return m_jid; } - Swift::BoostNetworkFactories *getFactories() { return m_factories; } + /// Returns Swift::NetworkFactories which can be used to create new connections. + /// \return Swift::NetworkFactories which can be used to create new connections. + Swift::BoostNetworkFactories *getNetworkFactories() { return m_factories; } + + /// Returns Transport Factory used to create basic Transport components. + + /// \return Transport Factory used to create basic Transport components. Factory *getFactory() { return m_factory; } /// This signal is emitted when server disconnects the transport because of some error. + /// \param error disconnection error boost::signal onConnectionError; @@ -114,15 +145,18 @@ namespace Transport { boost::signal onConnected; /// This signal is emitted when XML stanza is sent to server. + /// \param xml xml stanza boost::signal onXMLOut; /// This signal is emitted when XML stanza is received from server. + /// \param xml xml stanza boost::signal onXMLIn; - /// This signal is emitted when presence from XMPP user (for example "user@domain.tld") - /// is received. It's emitted only for presences addressed to transport itself + /// This signal is emitted when presence from XMPP user is received. + + /// It's emitted only for presences addressed to transport itself /// (for example to="j2j.domain.tld"). /// \param presence presence data boost::signal onUserPresenceReceived; diff --git a/src/buddy.cpp b/src/buddy.cpp index 2edda8eb..b9879a04 100644 --- a/src/buddy.cpp +++ b/src/buddy.cpp @@ -146,7 +146,7 @@ std::string Buddy::getSafeName() { return name; } -void Buddy::buddyChanged() { +void Buddy::handleBuddyChanged() { Swift::Presence::ref presence = generatePresenceStanza(255); if (presence) { m_rosterManager->getUser()->getComponent()->getStanzaChannel()->sendPresence(presence); @@ -154,7 +154,7 @@ void Buddy::buddyChanged() { onBuddyChanged(); } -void Buddy::handleVCardReceived(const std::string &id, const Swift::JID &to, Swift::VCard::ref vcard) { +void Buddy::handleVCardReceived(const std::string &id, Swift::VCard::ref vcard) { boost::shared_ptr > request(new Swift::GenericRequest(Swift::IQ::Result, m_rosterManager->getUser()->getJID(), vcard, m_rosterManager->getUser()->getComponent()->getIQRouter())); request->send(); } diff --git a/src/conversation.cpp b/src/conversation.cpp index 64c40093..2ae9fcf8 100644 --- a/src/conversation.cpp +++ b/src/conversation.cpp @@ -30,12 +30,12 @@ namespace Transport { Conversation::Conversation(ConversationManager *conversationManager, const std::string &legacyName, bool isMUC) : m_conversationManager(conversationManager) { m_legacyName = legacyName; - m_conversationManager->setConversation(this); + m_conversationManager->addConversation(this); m_muc = isMUC; } Conversation::~Conversation() { - m_conversationManager->unsetConversation(this); + m_conversationManager->removeConversation(this); } void Conversation::handleMessage(boost::shared_ptr &message, const std::string &nickname) { diff --git a/src/conversationmanager.cpp b/src/conversationmanager.cpp index c1a4f764..4110132e 100644 --- a/src/conversationmanager.cpp +++ b/src/conversationmanager.cpp @@ -41,11 +41,11 @@ ConversationManager::~ConversationManager() { } } -void ConversationManager::setConversation(Conversation *conv) { +void ConversationManager::addConversation(Conversation *conv) { m_convs[conv->getLegacyName()] = conv; } -void ConversationManager::unsetConversation(Conversation *conv) { +void ConversationManager::removeConversation(Conversation *conv) { for (std::map::const_iterator it = m_convs.begin(); it != m_convs.end(); it++) { if ((*it).second->getRoom() == conv->getLegacyName()) { (*it).second->setRoom(""); diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 2e635fcb..78fe349b 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -120,7 +120,7 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U m_userManager->onUserCreated.connect(boost::bind(&NetworkPluginServer::handleUserCreated, this, _1)); m_userManager->onUserDestroyed.connect(boost::bind(&NetworkPluginServer::handleUserDestroyed, this, _1)); - m_pingTimer = component->getFactories()->getTimerFactory()->createTimer(10000); + m_pingTimer = component->getNetworkFactories()->getTimerFactory()->createTimer(10000); m_pingTimer->onTick.connect(boost::bind(&NetworkPluginServer::pingTimeout, this)); m_vcardResponder = new VCardResponder(component->getIQRouter(), userManager); @@ -130,7 +130,7 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U m_rosterResponder = new RosterResponder(component->getIQRouter(), userManager); m_rosterResponder->start(); - m_server = component->getFactories()->getConnectionFactory()->createConnectionServer(10000); + m_server = component->getNetworkFactories()->getConnectionFactory()->createConnectionServer(10000); m_server->onNewConnection.connect(boost::bind(&NetworkPluginServer::handleNewClientConnection, this, _1)); m_server->start(); @@ -234,7 +234,7 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) { LocalBuddy *buddy = (LocalBuddy *) user->getRosterManager()->getBuddy(payload.buddyname()); if (buddy) { handleBuddyPayload(buddy, payload); - buddy->buddyChanged(); + buddy->handleBuddyChanged(); } else { buddy = new LocalBuddy(user->getRosterManager(), -1); diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 261b7b0c..566eb6ce 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -36,8 +36,8 @@ RosterManager::RosterManager(User *user, Component *component){ m_rosterStorage = NULL; m_user = user; m_component = component; - m_setBuddyTimer = m_component->getFactories()->getTimerFactory()->createTimer(1000); - m_RIETimer = m_component->getFactories()->getTimerFactory()->createTimer(5000); + m_setBuddyTimer = m_component->getNetworkFactories()->getTimerFactory()->createTimer(1000); + m_RIETimer = m_component->getNetworkFactories()->getTimerFactory()->createTimer(5000); m_RIETimer->onTick.connect(boost::bind(&RosterManager::sendRIE, this)); @@ -121,7 +121,7 @@ void RosterManager::unsetBuddy(Buddy *buddy) { void RosterManager::handleBuddyRosterPushResponse(Swift::ErrorPayload::ref error, const std::string &key) { if (m_buddies[key] != NULL) { - m_buddies[key]->buddyChanged(); + m_buddies[key]->handleBuddyChanged(); } } diff --git a/src/rosterstorage.cpp b/src/rosterstorage.cpp index 270e0257..294f19e8 100644 --- a/src/rosterstorage.cpp +++ b/src/rosterstorage.cpp @@ -77,7 +77,7 @@ namespace Transport { RosterStorage::RosterStorage(User *user, StorageBackend *storageBackend) { m_user = user; m_storageBackend = storageBackend; - m_storageTimer = m_user->getComponent()->getFactories()->getTimerFactory()->createTimer(5000); + m_storageTimer = m_user->getComponent()->getNetworkFactories()->getTimerFactory()->createTimer(5000); m_storageTimer->onTick.connect(boost::bind(&RosterStorage::storeBuddies, this)); } diff --git a/src/user.cpp b/src/user.cpp index 2c7d5d09..4b64736c 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -42,7 +42,7 @@ User::User(const Swift::JID &jid, UserInfo &userInfo, Component *component, User m_connected = false; m_readyForConnect = false; - m_reconnectTimer = m_component->getFactories()->getTimerFactory()->createTimer(10000); + m_reconnectTimer = m_component->getNetworkFactories()->getTimerFactory()->createTimer(10000); m_reconnectTimer->onTick.connect(boost::bind(&User::onConnectingTimeout, this)); m_rosterManager = new RosterManager(this, m_component);