LCOV - code coverage report
Current view: top level - source/lobby/glooxwrapper - glooxwrapper.cpp (source / functions) Hit Total Coverage
Test: 0 A.D. test coverage report Lines: 3 462 0.6 %
Date: 2023-01-19 00:18:29 Functions: 2 147 1.4 %

          Line data    Source code
       1             : /* Copyright (C) 2021 Wildfire Games.
       2             :  * This file is part of 0 A.D.
       3             :  *
       4             :  * 0 A.D. is free software: you can redistribute it and/or modify
       5             :  * it under the terms of the GNU General Public License as published by
       6             :  * the Free Software Foundation, either version 2 of the License, or
       7             :  * (at your option) any later version.
       8             :  *
       9             :  * 0 A.D. is distributed in the hope that it will be useful,
      10             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12             :  * GNU General Public License for more details.
      13             :  *
      14             :  * You should have received a copy of the GNU General Public License
      15             :  * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
      16             :  */
      17             : 
      18             : #include "precompiled.h"
      19             : 
      20             : #include "glooxwrapper.h"
      21             : 
      22             : #include <gloox/connectionlistener.h>
      23             : #include <gloox/error.h>
      24             : #include <gloox/glooxversion.h>
      25             : #include <gloox/messagehandler.h>
      26             : 
      27             : #if OS_WIN
      28             : const std::string gloox::EmptyString = "";
      29             : #endif
      30             : 
      31           0 : void* glooxwrapper::glooxwrapper_alloc(size_t size)
      32             : {
      33           0 :     void* p = malloc(size);
      34           0 :     if (p == NULL)
      35           0 :         throw std::bad_alloc();
      36           0 :     return p;
      37             : }
      38             : 
      39           0 : void glooxwrapper::glooxwrapper_free(void* p)
      40             : {
      41           0 :     free(p);
      42           0 : }
      43             : 
      44             : 
      45             : namespace glooxwrapper
      46             : {
      47             : 
      48           0 : class ConnectionListenerWrapper : public gloox::ConnectionListener
      49             : {
      50             :     glooxwrapper::ConnectionListener* m_Wrapped;
      51             : public:
      52           0 :     ConnectionListenerWrapper(glooxwrapper::ConnectionListener* wrapped) : m_Wrapped(wrapped) {}
      53             : 
      54           0 :     virtual void onConnect()
      55             :     {
      56           0 :         m_Wrapped->onConnect();
      57           0 :     }
      58             : 
      59           0 :     virtual void onDisconnect(gloox::ConnectionError e)
      60             :     {
      61           0 :         m_Wrapped->onDisconnect(e);
      62           0 :     }
      63             : 
      64           0 :     virtual bool onTLSConnect(const gloox::CertInfo& info)
      65             :     {
      66           0 :         glooxwrapper::CertInfo infoWrapped;
      67             : #define COPY(n) infoWrapped.n = info.n
      68           0 :         COPY(status);
      69           0 :         COPY(chain);
      70           0 :         COPY(issuer);
      71           0 :         COPY(server);
      72           0 :         COPY(date_from);
      73           0 :         COPY(date_to);
      74           0 :         COPY(protocol);
      75           0 :         COPY(cipher);
      76           0 :         COPY(mac);
      77           0 :         COPY(compression);
      78             : #undef COPY
      79           0 :         return m_Wrapped->onTLSConnect(infoWrapped);
      80             :     }
      81             : };
      82             : 
      83           0 : class IqHandlerWrapper : public gloox::IqHandler
      84             : {
      85             :     glooxwrapper::IqHandler* m_Wrapped;
      86             : public:
      87           0 :     IqHandlerWrapper(glooxwrapper::IqHandler* wrapped) : m_Wrapped(wrapped) {}
      88             : 
      89           0 :     virtual bool handleIq(const gloox::IQ& iq)
      90             :     {
      91           0 :         glooxwrapper::IQ iqWrapper(iq);
      92           0 :         return m_Wrapped->handleIq(iqWrapper);
      93             :     }
      94             : 
      95           0 :     virtual void handleIqID(const gloox::IQ& iq, int context)
      96             :     {
      97           0 :         glooxwrapper::IQ iqWrapper(iq);
      98           0 :         m_Wrapped->handleIqID(iqWrapper, context);
      99           0 :     }
     100             : };
     101             : 
     102           0 : class MessageHandlerWrapper : public gloox::MessageHandler
     103             : {
     104             :     glooxwrapper::MessageHandler* m_Wrapped;
     105             : public:
     106           0 :     MessageHandlerWrapper(glooxwrapper::MessageHandler* wrapped) : m_Wrapped(wrapped) {}
     107             : 
     108           0 :     virtual void handleMessage(const gloox::Message& msg, gloox::MessageSession* UNUSED(session))
     109             :     {
     110             :         /* MessageSession not supported */
     111           0 :         glooxwrapper::Message msgWrapper(const_cast<gloox::Message*>(&msg), false);
     112           0 :         m_Wrapped->handleMessage(msgWrapper, NULL);
     113           0 :     }
     114             : };
     115             : 
     116             : class MUCRoomHandlerWrapper : public gloox::MUCRoomHandler
     117             : {
     118             :     glooxwrapper::MUCRoomHandler* m_Wrapped;
     119             : public:
     120           0 :     MUCRoomHandlerWrapper(glooxwrapper::MUCRoomHandler* wrapped) : m_Wrapped(wrapped) {}
     121             : 
     122           0 :     virtual ~MUCRoomHandlerWrapper() {}
     123             : 
     124           0 :     virtual void handleMUCParticipantPresence(gloox::MUCRoom* room, const gloox::MUCRoomParticipant participant, const gloox::Presence& presence)
     125             :     {
     126           0 :         glooxwrapper::MUCRoom roomWrapper(room, false);
     127           0 :         glooxwrapper::MUCRoomParticipant part;
     128           0 :         glooxwrapper::JID nick(*participant.nick);
     129           0 :         glooxwrapper::JID jid(*participant.jid);
     130           0 :         glooxwrapper::JID actor(*participant.actor);
     131           0 :         glooxwrapper::JID alternate(*participant.alternate);
     132           0 :         part.nick = participant.nick ? &nick : NULL;
     133           0 :         part.affiliation = participant.affiliation;
     134           0 :         part.role = participant.role;
     135           0 :         part.jid = participant.jid ? &jid : NULL;
     136           0 :         part.flags = participant.flags;
     137           0 :         part.reason = participant.reason;
     138           0 :         part.actor = participant.actor ? &actor : NULL;
     139           0 :         part.newNick = participant.newNick;
     140           0 :         part.status = participant.status;
     141           0 :         part.alternate = participant.alternate ? &alternate : NULL;
     142             : 
     143           0 :         m_Wrapped->handleMUCParticipantPresence(roomWrapper, part, glooxwrapper::Presence(presence.presence()));
     144             : 
     145             :         /* gloox 1.0 leaks some JIDs (fixed in 1.0.1), so clean them up */
     146             : #if GLOOXVERSION == 0x10000
     147             :         delete participant.jid;
     148             :         delete participant.actor;
     149             :         delete participant.alternate;
     150             : #endif
     151           0 :     }
     152             : 
     153           0 :     virtual void handleMUCMessage(gloox::MUCRoom* room, const gloox::Message& msg, bool priv)
     154             :     {
     155           0 :         glooxwrapper::MUCRoom roomWrapper(room, false);
     156           0 :         glooxwrapper::Message msgWrapper(const_cast<gloox::Message*>(&msg), false);
     157           0 :         m_Wrapped->handleMUCMessage(roomWrapper, msgWrapper, priv);
     158           0 :     }
     159             : 
     160           0 :     virtual bool handleMUCRoomCreation(gloox::MUCRoom* UNUSED(room))
     161             :     {
     162             :         /* Not supported */
     163           0 :         return false;
     164             :     }
     165             : 
     166           0 :     virtual void handleMUCSubject(gloox::MUCRoom* room, const std::string& nick, const std::string& subject)
     167             :     {
     168           0 :         glooxwrapper::MUCRoom roomWrapper(room, false);
     169           0 :         m_Wrapped->handleMUCSubject(roomWrapper, nick, subject);
     170           0 :     }
     171             : 
     172           0 :     virtual void handleMUCInviteDecline(gloox::MUCRoom* UNUSED(room), const gloox::JID& UNUSED(invitee), const std::string& UNUSED(reason))
     173             :     {
     174             :         /* Not supported */
     175           0 :     }
     176             : 
     177           0 :     virtual void handleMUCError(gloox::MUCRoom* room, gloox::StanzaError error)
     178             :     {
     179           0 :         glooxwrapper::MUCRoom roomWrapper(room, false);
     180           0 :         m_Wrapped->handleMUCError(roomWrapper, error);
     181           0 :     }
     182             : 
     183           0 :     virtual void handleMUCInfo(gloox::MUCRoom* UNUSED(room), int UNUSED(features), const std::string& UNUSED(name), const gloox::DataForm* UNUSED(infoForm))
     184             :     {
     185             :         /* Not supported */
     186           0 :     }
     187             : 
     188           0 :     virtual void handleMUCItems(gloox::MUCRoom* UNUSED(room), const gloox::Disco::ItemList& UNUSED(items))
     189             :     {
     190             :         /* Not supported */
     191           0 :     }
     192             : };
     193             : 
     194           0 : class RegistrationHandlerWrapper : public gloox::RegistrationHandler
     195             : {
     196             :     glooxwrapper::RegistrationHandler* m_Wrapped;
     197             : public:
     198           0 :     RegistrationHandlerWrapper(glooxwrapper::RegistrationHandler* wrapped) : m_Wrapped(wrapped) {}
     199             : 
     200           0 :     virtual void handleRegistrationFields(const gloox::JID& from, int fields, std::string instructions)
     201             :     {
     202           0 :         glooxwrapper::JID fromWrapped(from);
     203           0 :         m_Wrapped->handleRegistrationFields(fromWrapped, fields, instructions);
     204           0 :     }
     205             : 
     206           0 :     virtual void handleAlreadyRegistered(const gloox::JID& from)
     207             :     {
     208           0 :         glooxwrapper::JID fromWrapped(from);
     209           0 :         m_Wrapped->handleAlreadyRegistered(fromWrapped);
     210           0 :     }
     211             : 
     212           0 :     virtual void handleRegistrationResult(const gloox::JID& from, gloox::RegistrationResult regResult)
     213             :     {
     214           0 :         glooxwrapper::JID fromWrapped(from);
     215           0 :         m_Wrapped->handleRegistrationResult(fromWrapped, regResult);
     216           0 :     }
     217             : 
     218           0 :     virtual void handleDataForm(const gloox::JID& UNUSED(from), const gloox::DataForm& UNUSED(form))
     219             :     {
     220             :         /* DataForm not supported */
     221           0 :     }
     222             : 
     223           0 :     virtual void handleOOB(const gloox::JID& UNUSED(from), const gloox::OOB& UNUSED(oob))
     224             :     {
     225             :         /* OOB not supported */
     226           0 :     }
     227             : };
     228             : 
     229             : class StanzaExtensionWrapper : public gloox::StanzaExtension
     230             : {
     231             : public:
     232             :     const glooxwrapper::StanzaExtension* m_Wrapped;
     233             :     bool m_Owned;
     234             :     std::string m_FilterString;
     235             : 
     236           0 :     StanzaExtensionWrapper(const glooxwrapper::StanzaExtension* wrapped, bool owned) :
     237           0 :     gloox::StanzaExtension(wrapped->extensionType()), m_Wrapped(wrapped), m_Owned(owned)
     238             :     {
     239           0 :         m_FilterString = m_Wrapped->filterString().to_string();
     240           0 :     }
     241             : 
     242           0 :     ~StanzaExtensionWrapper()
     243           0 :     {
     244           0 :         if (m_Owned)
     245           0 :             delete m_Wrapped;
     246           0 :     }
     247             : 
     248           0 :     virtual const std::string& filterString() const
     249             :     {
     250           0 :         return m_FilterString;
     251             :     }
     252             : 
     253           0 :     virtual gloox::StanzaExtension* newInstance(const gloox::Tag* tag) const
     254             :     {
     255           0 :         glooxwrapper::Tag* tagWrapper = glooxwrapper::Tag::allocate(const_cast<gloox::Tag*>(tag), false);
     256           0 :         gloox::StanzaExtension* ret = new StanzaExtensionWrapper(m_Wrapped->newInstance(tagWrapper), true);
     257           0 :         glooxwrapper::Tag::free(tagWrapper);
     258           0 :         return ret;
     259             :     }
     260             : 
     261           0 :     virtual gloox::Tag* tag() const
     262             :     {
     263           0 :         glooxwrapper::Tag* wrapper = m_Wrapped->tag();
     264           0 :         gloox::Tag* ret = wrapper->stealWrapped();
     265           0 :         glooxwrapper::Tag::free(wrapper);
     266           0 :         return ret;
     267             :     }
     268             : 
     269           0 :     virtual gloox::StanzaExtension* clone() const
     270             :     {
     271           0 :         return new StanzaExtensionWrapper(m_Wrapped->clone(), true);
     272             :     }
     273             : };
     274             : 
     275             : class SessionHandlerWrapper : public gloox::Jingle::SessionHandler
     276             : {
     277             : public:
     278             :     glooxwrapper::Jingle::SessionHandler* m_Wrapped;
     279             :     bool m_Owned;
     280             : 
     281           0 :     SessionHandlerWrapper(glooxwrapper::Jingle::SessionHandler* wrapped, bool owned)
     282           0 :         : m_Wrapped(wrapped), m_Owned(owned) {}
     283             : 
     284           0 :     ~SessionHandlerWrapper()
     285           0 :     {
     286           0 :         if (m_Owned)
     287           0 :             delete m_Wrapped;
     288           0 :     }
     289             : 
     290           0 :     virtual void handleSessionAction(gloox::Jingle::Action action, gloox::Jingle::Session* session, const gloox::Jingle::Session::Jingle* jingle)
     291             :     {
     292           0 :         glooxwrapper::Jingle::Session sessionWrapper(session, false);
     293           0 :         glooxwrapper::Jingle::Session::Jingle jingleWrapper(jingle, false);
     294           0 :         m_Wrapped->handleSessionAction(action, sessionWrapper, jingleWrapper);
     295           0 :     }
     296             : 
     297           0 :     virtual void handleSessionActionError(gloox::Jingle::Action UNUSED(action), gloox::Jingle::Session* UNUSED(session), const gloox::Error* UNUSED(error))
     298             :     {
     299           0 :     }
     300             : 
     301           0 :     virtual void handleIncomingSession(gloox::Jingle::Session* UNUSED(session))
     302             :     {
     303           0 :     }
     304             : };
     305             : 
     306           0 : class ClientImpl
     307             : {
     308             : public:
     309             :     // List of registered callback wrappers, to get deleted when Client is deleted
     310             :     std::list<std::shared_ptr<gloox::ConnectionListener>> m_ConnectionListeners;
     311             :     std::list<std::shared_ptr<gloox::MessageHandler>> m_MessageHandlers;
     312             :     std::list<std::shared_ptr<gloox::IqHandler>> m_IqHandlers;
     313             : };
     314             : 
     315           1 : static const std::string XMLNS = "xmlns";
     316           1 : static const std::string XMLNS_JINGLE_0AD_GAME = "urn:xmpp:jingle:apps:0ad-game:1";
     317             : 
     318             : } // namespace glooxwrapper
     319             : 
     320             : 
     321           0 : glooxwrapper::Client::Client(const string& server)
     322             : {
     323           0 :     m_Wrapped = new gloox::Client(server.to_string());
     324           0 :     m_DiscoWrapper = new glooxwrapper::Disco(m_Wrapped->disco());
     325           0 :     m_Impl = new ClientImpl;
     326           0 : }
     327             : 
     328           0 : glooxwrapper::Client::Client(const JID& jid, const string& password, int port)
     329             : {
     330           0 :     m_Wrapped = new gloox::Client(jid.getWrapped(), password.to_string(), port);
     331           0 :     m_DiscoWrapper = new glooxwrapper::Disco(m_Wrapped->disco());
     332           0 :     m_Impl = new ClientImpl;
     333           0 : }
     334             : 
     335           0 : glooxwrapper::Client::~Client()
     336             : {
     337           0 :     delete m_Wrapped;
     338           0 :     delete m_DiscoWrapper;
     339           0 :     delete m_Impl;
     340           0 : }
     341             : 
     342           0 : bool glooxwrapper::Client::connect(bool block)
     343             : {
     344           0 :     return m_Wrapped->connect(block);
     345             : }
     346             : 
     347           0 : gloox::ConnectionError glooxwrapper::Client::recv(int timeout)
     348             : {
     349           0 :     return m_Wrapped->recv(timeout);
     350             : }
     351             : 
     352           0 : const glooxwrapper::string glooxwrapper::Client::getID() const
     353             : {
     354           0 :     return m_Wrapped->getID();
     355             : }
     356             : 
     357           0 : const glooxwrapper::string glooxwrapper::Client::getJID() const
     358             : {
     359           0 :     return m_Wrapped->jid().full();
     360             : }
     361             : 
     362           0 : void glooxwrapper::Client::send(const IQ& iq)
     363             : {
     364           0 :     m_Wrapped->send(iq.getWrapped());
     365           0 : }
     366             : 
     367           0 : void glooxwrapper::Client::setTls(gloox::TLSPolicy tls)
     368             : {
     369           0 :     m_Wrapped->setTls(tls);
     370           0 : }
     371             : 
     372           0 : void glooxwrapper::Client::setCompression(bool compression)
     373             : {
     374           0 :     m_Wrapped->setCompression(compression);
     375           0 : }
     376             : 
     377           0 : void glooxwrapper::Client::setSASLMechanisms(int mechanisms)
     378             : {
     379           0 :     m_Wrapped->setSASLMechanisms(mechanisms);
     380           0 : }
     381             : 
     382           0 : void glooxwrapper::Client::disconnect()
     383             : {
     384           0 :     m_Wrapped->disconnect();
     385           0 : }
     386             : 
     387           0 : void glooxwrapper::Client::registerStanzaExtension(glooxwrapper::StanzaExtension* ext)
     388             : {
     389             :     // ~StanzaExtensionFactory() deletes this new StanzaExtensionWrapper
     390           0 :     m_Wrapped->registerStanzaExtension(new StanzaExtensionWrapper(ext, true));
     391           0 : }
     392             : 
     393           0 : void glooxwrapper::Client::registerConnectionListener(glooxwrapper::ConnectionListener* hnd)
     394             : {
     395           0 :     gloox::ConnectionListener* listener = new ConnectionListenerWrapper(hnd);
     396           0 :     m_Wrapped->registerConnectionListener(listener);
     397           0 :     m_Impl->m_ConnectionListeners.push_back(std::shared_ptr<gloox::ConnectionListener>(listener));
     398           0 : }
     399             : 
     400           0 : void glooxwrapper::Client::registerMessageHandler(glooxwrapper::MessageHandler* hnd)
     401             : {
     402           0 :     gloox::MessageHandler* handler = new MessageHandlerWrapper(hnd);
     403           0 :     m_Wrapped->registerMessageHandler(handler);
     404           0 :     m_Impl->m_MessageHandlers.push_back(std::shared_ptr<gloox::MessageHandler>(handler));
     405           0 : }
     406             : 
     407           0 : void glooxwrapper::Client::registerIqHandler(glooxwrapper::IqHandler* ih, int exttype)
     408             : {
     409           0 :     gloox::IqHandler* handler = new IqHandlerWrapper(ih);
     410           0 :     m_Wrapped->registerIqHandler(handler, exttype);
     411           0 :     m_Impl->m_IqHandlers.push_back(std::shared_ptr<gloox::IqHandler>(handler));
     412           0 : }
     413             : 
     414           0 : bool glooxwrapper::Client::removePresenceExtension(int type)
     415             : {
     416           0 :     return m_Wrapped->removePresenceExtension(type);
     417             : }
     418             : 
     419           0 : void glooxwrapper::Client::setPresence(gloox::Presence::PresenceType pres, int priority, const string& status)
     420             : {
     421           0 :     m_Wrapped->setPresence(pres, priority, status.to_string());
     422           0 : }
     423             : 
     424             : 
     425           0 : glooxwrapper::DelayedDelivery::DelayedDelivery(const gloox::DelayedDelivery* wrapped)
     426             : {
     427           0 :     m_Wrapped = wrapped;
     428           0 : }
     429             : 
     430           0 : const glooxwrapper::string glooxwrapper::DelayedDelivery::stamp() const
     431             : {
     432           0 :     return m_Wrapped->stamp();
     433             : }
     434             : 
     435             : 
     436           0 : glooxwrapper::Disco::Disco(gloox::Disco* wrapped)
     437             : {
     438           0 :     m_Wrapped = wrapped;
     439           0 : }
     440             : 
     441           0 : void glooxwrapper::Disco::setVersion(const string& name, const string& version, const string& os)
     442             : {
     443           0 :     m_Wrapped->setVersion(name.to_string(), version.to_string(), os.to_string());
     444           0 : }
     445             : 
     446           0 : void glooxwrapper::Disco::setIdentity(const string& category, const string& type, const string& name)
     447             : {
     448           0 :     m_Wrapped->setIdentity(category.to_string(), type.to_string(), name.to_string());
     449           0 : }
     450             : 
     451             : 
     452           0 : glooxwrapper::IQ::IQ(gloox::IQ::IqType type, const JID& to, const string& id)
     453             : {
     454           0 :     m_Wrapped = new gloox::IQ(type, to.getWrapped(), id.to_string());
     455           0 :     m_Owned = true;
     456           0 : }
     457             : 
     458           0 : glooxwrapper::IQ::~IQ()
     459             : {
     460           0 :     if (m_Owned)
     461           0 :         delete m_Wrapped;
     462           0 : }
     463             : 
     464           0 : void glooxwrapper::IQ::addExtension(const glooxwrapper::StanzaExtension* se)
     465             : {
     466           0 :     m_Wrapped->addExtension(new StanzaExtensionWrapper(se, true));
     467           0 : }
     468             : 
     469           0 : const glooxwrapper::StanzaExtension* glooxwrapper::IQ::findExtension(int type) const
     470             : {
     471           0 :     const gloox::StanzaExtension* ext = m_Wrapped->findExtension(type);
     472           0 :     if (!ext)
     473           0 :         return NULL;
     474           0 :     return static_cast<const StanzaExtensionWrapper*>(ext)->m_Wrapped;
     475             : }
     476             : 
     477           0 : gloox::StanzaError glooxwrapper::IQ::error_error() const
     478             : {
     479           0 :     const gloox::Error* error = m_Wrapped->error();
     480           0 :     if (!error)
     481           0 :         return gloox::StanzaErrorInternalServerError;
     482           0 :     return error->error();
     483             : }
     484             : 
     485           0 : glooxwrapper::Tag* glooxwrapper::IQ::tag() const
     486             : {
     487           0 :     return Tag::allocate(m_Wrapped->tag(), true);
     488             : }
     489             : 
     490           0 : gloox::IQ::IqType glooxwrapper::IQ::subtype() const
     491             : {
     492           0 :     return m_Wrapped->subtype();
     493             : }
     494             : 
     495           0 : const glooxwrapper::string glooxwrapper::IQ::id() const
     496             : {
     497           0 :     return m_Wrapped->id();
     498             : }
     499             : 
     500           0 : const gloox::JID& glooxwrapper::IQ::from() const
     501             : {
     502           0 :     return m_Wrapped->from();
     503             : }
     504             : 
     505           0 : glooxwrapper::JID::JID()
     506             : {
     507           0 :     m_Wrapped = new gloox::JID();
     508           0 :     m_Owned = true;
     509           0 : }
     510             : 
     511           0 : glooxwrapper::JID::JID(const glooxwrapper::string& jid)
     512             : {
     513           0 :     m_Wrapped = new gloox::JID(jid.to_string());
     514           0 :     m_Owned = true;
     515           0 : }
     516             : 
     517           0 : void glooxwrapper::JID::init(const char* data, size_t len)
     518             : {
     519           0 :     m_Wrapped = new gloox::JID(std::string(data, data+len));
     520           0 :     m_Owned = true;
     521           0 : }
     522             : 
     523           0 : glooxwrapper::JID::~JID()
     524             : {
     525           0 :     if (m_Owned)
     526           0 :         delete m_Wrapped;
     527           0 : }
     528             : 
     529           0 : glooxwrapper::string glooxwrapper::JID::username() const
     530             : {
     531           0 :     return m_Wrapped->username();
     532             : }
     533             : 
     534           0 : glooxwrapper::string glooxwrapper::JID::resource() const
     535             : {
     536           0 :     return m_Wrapped->resource();
     537             : };
     538             : 
     539             : 
     540           0 : glooxwrapper::Message::Message(gloox::Message* wrapped, bool owned)
     541             :     : m_Wrapped(wrapped),
     542             :       m_Owned(owned),
     543           0 :       m_From(m_Wrapped->from()),
     544           0 :       m_DelayedDelivery(m_Wrapped->when() ? new glooxwrapper::DelayedDelivery(m_Wrapped->when()) : nullptr)
     545             : {
     546           0 : }
     547             : 
     548           0 : glooxwrapper::Message::~Message()
     549             : {
     550           0 :     if (m_Owned)
     551           0 :         delete m_Wrapped;
     552           0 :     delete m_DelayedDelivery;
     553           0 : }
     554             : 
     555           0 : gloox::Message::MessageType glooxwrapper::Message::subtype() const
     556             : {
     557           0 :     return m_Wrapped->subtype();
     558             : }
     559             : 
     560           0 : const glooxwrapper::JID& glooxwrapper::Message::from() const
     561             : {
     562           0 :     return m_From;
     563             : }
     564             : 
     565           0 : glooxwrapper::string glooxwrapper::Message::body() const
     566             : {
     567           0 :     return m_Wrapped->body();
     568             : }
     569             : 
     570           0 : glooxwrapper::string glooxwrapper::Message::subject(const string& lang) const
     571             : {
     572           0 :     return m_Wrapped->subject(lang.to_string());
     573             : }
     574             : 
     575           0 : glooxwrapper::string glooxwrapper::Message::thread() const
     576             : {
     577           0 :     return m_Wrapped->thread();
     578             : }
     579             : 
     580           0 : const glooxwrapper::DelayedDelivery* glooxwrapper::Message::when() const
     581             : {
     582           0 :     return m_DelayedDelivery;
     583             : }
     584             : 
     585           0 : glooxwrapper::MUCRoom::MUCRoom(gloox::MUCRoom* room, bool owned)
     586           0 :     : m_Wrapped(room), m_Owned(owned), m_HandlerWrapper(nullptr)
     587             : {
     588           0 : }
     589             : 
     590           0 : glooxwrapper::MUCRoom::MUCRoom(Client* parent, const JID& nick, MUCRoomHandler* mrh, MUCRoomConfigHandler* UNUSED(mrch))
     591             : {
     592           0 :     m_HandlerWrapper = new MUCRoomHandlerWrapper(mrh);
     593           0 :     m_Wrapped = new gloox::MUCRoom(parent ? parent->getWrapped() : NULL, nick.getWrapped(), m_HandlerWrapper);
     594           0 :     m_Owned = true;
     595           0 : }
     596             : 
     597           0 : glooxwrapper::MUCRoom::~MUCRoom()
     598             : {
     599           0 :     if (m_Owned)
     600           0 :         delete m_Wrapped;
     601             : 
     602           0 :     delete m_HandlerWrapper;
     603           0 : }
     604             : 
     605           0 : const glooxwrapper::string glooxwrapper::MUCRoom::nick() const
     606             : {
     607           0 :     return m_Wrapped->nick();
     608             : }
     609             : 
     610           0 : const glooxwrapper::string glooxwrapper::MUCRoom::name() const
     611             : {
     612           0 :     return m_Wrapped->name();
     613             : }
     614             : 
     615           0 : const glooxwrapper::string glooxwrapper::MUCRoom::service() const
     616             : {
     617           0 :     return m_Wrapped->service();
     618             : }
     619             : 
     620           0 : void glooxwrapper::MUCRoom::join(gloox::Presence::PresenceType type, const string& status, int priority)
     621             : {
     622           0 :     m_Wrapped->join(type, status.to_string(), priority);
     623           0 : }
     624             : 
     625           0 : void glooxwrapper::MUCRoom::leave(const string& msg)
     626             : {
     627           0 :     m_Wrapped->leave(msg.to_string());
     628           0 : }
     629             : 
     630           0 : void glooxwrapper::MUCRoom::send(const string& message)
     631             : {
     632           0 :     m_Wrapped->send(message.to_string());
     633           0 : }
     634             : 
     635           0 : void glooxwrapper::MUCRoom::setNick(const string& nick)
     636             : {
     637           0 :     m_Wrapped->setNick(nick.to_string());
     638           0 : }
     639             : 
     640           0 : void glooxwrapper::MUCRoom::setPresence(gloox::Presence::PresenceType presence, const string& msg)
     641             : {
     642           0 :     m_Wrapped->setPresence(presence, msg.to_string());
     643           0 : }
     644             : 
     645           0 : void glooxwrapper::MUCRoom::setRequestHistory(int value, gloox::MUCRoom::HistoryRequestType type)
     646             : {
     647           0 :     m_Wrapped->setRequestHistory(value, type);
     648           0 : }
     649             : 
     650           0 : void glooxwrapper::MUCRoom::kick(const string& nick, const string& reason)
     651             : {
     652           0 :     m_Wrapped->kick(nick.to_string(), reason.to_string());
     653           0 : }
     654             : 
     655           0 : void glooxwrapper::MUCRoom::ban(const string& nick, const string& reason)
     656             : {
     657           0 :     m_Wrapped->ban(nick.to_string(), reason.to_string());
     658           0 : }
     659             : 
     660             : 
     661           0 : glooxwrapper::Registration::Registration(Client* parent)
     662             : {
     663           0 :     m_Wrapped = new gloox::Registration(parent->getWrapped());
     664           0 : }
     665             : 
     666           0 : glooxwrapper::Registration::~Registration()
     667             : {
     668           0 :     delete m_Wrapped;
     669           0 : }
     670             : 
     671           0 : void glooxwrapper::Registration::fetchRegistrationFields()
     672             : {
     673           0 :     m_Wrapped->fetchRegistrationFields();
     674           0 : }
     675             : 
     676           0 : bool glooxwrapper::Registration::createAccount(int fields, const glooxwrapper::RegistrationFields& values)
     677             : {
     678           0 :     gloox::RegistrationFields valuesUnwrapped;
     679             : #define COPY(n) valuesUnwrapped.n = values.n.to_string()
     680           0 :     COPY(username);
     681           0 :     COPY(nick);
     682           0 :     COPY(password);
     683           0 :     COPY(name);
     684           0 :     COPY(first);
     685           0 :     COPY(last);
     686           0 :     COPY(email);
     687           0 :     COPY(address);
     688           0 :     COPY(city);
     689           0 :     COPY(state);
     690           0 :     COPY(zip);
     691           0 :     COPY(phone);
     692           0 :     COPY(url);
     693           0 :     COPY(date);
     694           0 :     COPY(misc);
     695           0 :     COPY(text);
     696             : #undef COPY
     697           0 :     return m_Wrapped->createAccount(fields, valuesUnwrapped);
     698             : }
     699             : 
     700           0 : void glooxwrapper::Registration::registerRegistrationHandler(RegistrationHandler* rh)
     701             : {
     702           0 :     gloox::RegistrationHandler* handler = new RegistrationHandlerWrapper(rh);
     703           0 :     m_Wrapped->registerRegistrationHandler(handler);
     704           0 :     m_RegistrationHandlers.push_back(std::shared_ptr<gloox::RegistrationHandler>(handler));
     705           0 : }
     706             : 
     707             : 
     708           0 : glooxwrapper::Tag::Tag(const string& name)
     709             : {
     710           0 :     m_Wrapped = new gloox::Tag(name.to_string());
     711           0 :     m_Owned = true;
     712           0 : }
     713             : 
     714           0 : glooxwrapper::Tag::Tag(const string& name, const string& cdata)
     715             : {
     716           0 :     m_Wrapped = new gloox::Tag(name.to_string(), cdata.to_string());
     717           0 :     m_Owned = true;
     718           0 : }
     719             : 
     720           0 : glooxwrapper::Tag::~Tag()
     721             : {
     722           0 :     if (m_Owned)
     723           0 :         delete m_Wrapped;
     724           0 : }
     725             : 
     726           0 : glooxwrapper::Tag* glooxwrapper::Tag::allocate(const string& name)
     727             : {
     728           0 :     return new glooxwrapper::Tag(name);
     729             : }
     730             : 
     731           0 : glooxwrapper::Tag* glooxwrapper::Tag::allocate(const string& name, const string& cdata)
     732             : {
     733           0 :     return new glooxwrapper::Tag(name, cdata);
     734             : }
     735             : 
     736           0 : glooxwrapper::Tag* glooxwrapper::Tag::allocate(gloox::Tag* wrapped, bool owned)
     737             : {
     738           0 :     return new glooxwrapper::Tag(wrapped, owned);
     739             : }
     740             : 
     741           0 : void glooxwrapper::Tag::free(const glooxwrapper::Tag* tag)
     742             : {
     743           0 :     delete tag;
     744           0 : }
     745             : 
     746           0 : bool glooxwrapper::Tag::addAttribute(const string& name, const string& value)
     747             : {
     748           0 :     return m_Wrapped->addAttribute(name.to_string(), value.to_string());
     749             : }
     750             : 
     751           0 : glooxwrapper::string glooxwrapper::Tag::findAttribute(const string& name) const
     752             : {
     753           0 :     return m_Wrapped->findAttribute(name.to_string());
     754             : }
     755             : 
     756           0 : glooxwrapper::Tag* glooxwrapper::Tag::clone() const
     757             : {
     758           0 :     return new glooxwrapper::Tag(m_Wrapped->clone(), true);
     759             : }
     760             : 
     761           0 : glooxwrapper::string glooxwrapper::Tag::xmlns() const
     762             : {
     763           0 :     return m_Wrapped->xmlns();
     764             : }
     765             : 
     766           0 : bool glooxwrapper::Tag::setXmlns(const string& xmlns)
     767             : {
     768           0 :     return m_Wrapped->setXmlns(xmlns.to_string());
     769             : }
     770             : 
     771           0 : glooxwrapper::string glooxwrapper::Tag::xml() const
     772             : {
     773           0 :     return m_Wrapped->xml();
     774             : }
     775             : 
     776           0 : void glooxwrapper::Tag::addChild(Tag* child)
     777             : {
     778           0 :     m_Wrapped->addChild(child->stealWrapped());
     779           0 :     Tag::free(child);
     780           0 : }
     781             : 
     782           0 : glooxwrapper::string glooxwrapper::Tag::name() const
     783             : {
     784           0 :     return m_Wrapped->name();
     785             : }
     786             : 
     787           0 : glooxwrapper::string glooxwrapper::Tag::cdata() const
     788             : {
     789           0 :     return m_Wrapped->cdata();
     790             : }
     791             : 
     792           0 : const glooxwrapper::Tag* glooxwrapper::Tag::findTag_clone(const string& expression) const
     793             : {
     794           0 :     const gloox::Tag* tag = m_Wrapped->findTag(expression.to_string());
     795           0 :     if (!tag)
     796           0 :         return NULL;
     797           0 :     return new glooxwrapper::Tag(const_cast<gloox::Tag*>(tag), false);
     798             : }
     799             : 
     800           0 : glooxwrapper::ConstTagList glooxwrapper::Tag::findTagList_clone(const string& expression) const
     801             : {
     802           0 :     glooxwrapper::ConstTagList tagListWrapper;
     803           0 :     for (const gloox::Tag* const& t : m_Wrapped->findTagList(expression.to_string()))
     804           0 :         tagListWrapper.push_back(new glooxwrapper::Tag(const_cast<gloox::Tag*>(t), false));
     805           0 :     return tagListWrapper;
     806             : }
     807             : 
     808           0 : glooxwrapper::Jingle::Plugin::~Plugin()
     809             : {
     810           0 :     if (m_Owned)
     811           0 :         delete m_Wrapped;
     812           0 : }
     813             : 
     814           0 : const glooxwrapper::Jingle::Plugin glooxwrapper::Jingle::Plugin::findPlugin(int type) const
     815             : {
     816           0 :     return glooxwrapper::Jingle::Plugin(m_Wrapped->findPlugin(type), false);
     817             : }
     818             : 
     819           0 : glooxwrapper::Jingle::ICEUDP::Candidate glooxwrapper::Jingle::Session::Jingle::getCandidate() const
     820             : {
     821           0 :     const gloox::Jingle::Content* content = static_cast<const gloox::Jingle::Content*>(m_Wrapped->plugins().front());
     822           0 :     if (!content)
     823           0 :         return glooxwrapper::Jingle::ICEUDP::Candidate();
     824             : 
     825           0 :     const gloox::Jingle::ICEUDP* iceUDP = static_cast<const gloox::Jingle::ICEUDP*>(content->findPlugin(gloox::Jingle::PluginICEUDP));
     826           0 :     if (!iceUDP)
     827           0 :         return glooxwrapper::Jingle::ICEUDP::Candidate();
     828             : 
     829           0 :     gloox::Jingle::ICEUDP::Candidate glooxCandidate = iceUDP->candidates().front();
     830           0 :     return glooxwrapper::Jingle::ICEUDP::Candidate{glooxCandidate.ip, glooxCandidate.port};
     831             : }
     832             : 
     833           0 : glooxwrapper::Jingle::Session::Session(gloox::Jingle::Session* wrapped, bool owned)
     834           0 :     : m_Wrapped(wrapped), m_Owned(owned)
     835             : {
     836           0 : }
     837             : 
     838           0 : glooxwrapper::Jingle::Session::~Session()
     839             : {
     840           0 :     if (m_Owned)
     841           0 :         delete m_Wrapped;
     842           0 : }
     843             : 
     844           0 : bool glooxwrapper::Jingle::Session::sessionInitiate(const char* ipStr, u16 port)
     845             : {
     846           0 :     gloox::Jingle::ICEUDP::CandidateList candidateList;
     847             : 
     848           0 :     candidateList.push_back(gloox::Jingle::ICEUDP::Candidate
     849             :     {
     850             :         "1", // component_id,
     851             :         "1", // foundation
     852             :         "0", // andidate_generation
     853             :         "1", // candidate_id
     854             :         ipStr,
     855             :         "0", // network
     856             :         port,
     857             :         0, // priotiry
     858             :         "udp",
     859             :         "", // base_ip
     860             :         0, // base_port
     861             :         gloox::Jingle::ICEUDP::ServerReflexive
     862             :     });
     863             : 
     864             :     // sessionInitiate deletes the new Content, and
     865             :     // the Plugin destructor inherited by Content frees the ICEUDP plugin.
     866             : 
     867           0 :     gloox::Jingle::PluginList pluginList;
     868           0 :     pluginList.push_back(new gloox::Jingle::ICEUDP(/*local_pwd*/"", /*local_ufrag*/"", candidateList));
     869             : 
     870           0 :     return m_Wrapped->sessionInitiate(new gloox::Jingle::Content(std::string("game-data"), pluginList));
     871             : }
     872             : 
     873           0 : glooxwrapper::SessionManager::SessionManager(Client* parent, Jingle::SessionHandler* sh)
     874             : {
     875           0 :     m_HandlerWrapper = new SessionHandlerWrapper(sh, false);
     876           0 :     m_Wrapped = new gloox::Jingle::SessionManager(parent->getWrapped(), m_HandlerWrapper);
     877           0 : }
     878             : 
     879           0 : glooxwrapper::SessionManager::~SessionManager()
     880             : {
     881           0 :     delete m_Wrapped;
     882           0 :     delete m_HandlerWrapper;
     883           0 : }
     884             : 
     885           0 : void glooxwrapper::SessionManager::registerPlugins()
     886             : {
     887             :     // This calls m_factory.registerPlugin (see jinglesessionmanager.cpp), hence
     888             :     // ~PluginFactory() will delete these new plugin templates.
     889           0 :     m_Wrapped->registerPlugin(new gloox::Jingle::Content());
     890           0 :     m_Wrapped->registerPlugin(new gloox::Jingle::ICEUDP());
     891           0 : }
     892             : 
     893           0 : glooxwrapper::Jingle::Session glooxwrapper::SessionManager::createSession(const JID& callee)
     894             : {
     895             :     // The wrapped gloox SessionManager keeps track of this session and deletes it on ~SessionManager().
     896           0 :     gloox::Jingle::Session* glooxSession = m_Wrapped->createSession(callee.getWrapped(), m_HandlerWrapper);
     897             : 
     898             :     // Hence the glooxwrapper::Jingle::Session may not own the gloox::Jingle::Session.
     899           0 :     return glooxwrapper::Jingle::Session(glooxSession, false);
     900           3 : }

Generated by: LCOV version 1.13