/* * Copyright (c) 2013 Remko Tronçon * Licensed under the GNU General Public License. * See the COPYING file for more information. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Swift { struct SluiftGlobals; class ClientXMLTracer; class Client; class Stanza; class Payload; class ErrorPayload; class JID; class SluiftClient { public: struct Event { enum Type { MessageType, PresenceType, PubSubEventType }; Event(boost::shared_ptr stanza) : type(MessageType), stanza(stanza) {} Event(boost::shared_ptr stanza) : type(PresenceType), stanza(stanza) {} Event(const JID& from, boost::shared_ptr payload) : type(PubSubEventType), from(from), pubsubEvent(payload) {} Type type; // Message & Presence boost::shared_ptr stanza; // PubSubEvent JID from; boost::shared_ptr pubsubEvent; }; SluiftClient( const JID& jid, const std::string& password, NetworkFactories* networkFactories, SimpleEventLoop* eventLoop, SluiftGlobals* globals); ~SluiftClient(); Client* getClient() { return client; } ClientOptions& getOptions() { return options; } void connect(); void connect(const std::string& host); void waitConnected(); bool isConnected() const; template Sluift::Response sendPubSubRequest( IQ::Type type, const JID& jid, boost::shared_ptr payload, int timeout) { return sendRequest(client->getPubSubManager()->createRequest( type, jid, payload), timeout); } template Sluift::Response sendRequest(REQUEST_TYPE request, int timeout) { boost::signals::scoped_connection c = request->onResponse.connect( boost::bind(&SluiftClient::handleRequestResponse, this, _1, _2)); return doSendRequest(request, timeout); } template Sluift::Response sendVoidRequest(REQUEST_TYPE request, int timeout) { boost::signals::scoped_connection c = request->onResponse.connect( boost::bind(&SluiftClient::handleRequestResponse, this, boost::shared_ptr(), _1)); return doSendRequest(request, timeout); } void disconnect(); void setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os); boost::optional getNextEvent(int timeout, boost::function condition = 0); std::vector getRoster(); private: Sluift::Response doSendRequest(boost::shared_ptr request, int timeout); void handleIncomingMessage(boost::shared_ptr stanza); void handleIncomingPresence(boost::shared_ptr stanza); void handleIncomingPubSubEvent(const JID& from, boost::shared_ptr event); void handleInitialRosterPopulated(); void handleRequestResponse(boost::shared_ptr response, boost::shared_ptr error); void handleDisconnected(const boost::optional& error); private: NetworkFactories* networkFactories; SimpleEventLoop* eventLoop; SluiftGlobals* globals; Client* client; ClientOptions options; ClientXMLTracer* tracer; bool rosterReceived; std::deque pendingEvents; boost::optional disconnectedError; bool requestResponseReceived; boost::shared_ptr requestResponse; boost::shared_ptr requestError; }; }