/* * Copyright (c) 2013-2018 Isode Limited. * All rights reserved. * 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, BlockEventType, UnblockEventType }; Event(std::shared_ptr stanza) : type(MessageType), stanza(stanza) {} Event(std::shared_ptr stanza) : type(PresenceType), stanza(stanza) {} Event(const JID& from, std::shared_ptr payload) : type(PubSubEventType), from(from), pubsubEvent(payload) {} Event(const JID& item, Type type) : type(type), item(item) {} Type type; // Message & Presence std::shared_ptr stanza; // PubSubEvent JID from; std::shared_ptr pubsubEvent; // Blocklist JID item; }; SluiftClient( const JID& jid, const std::string& password, NetworkFactories* networkFactories, SimpleEventLoop* eventLoop); ~SluiftClient(); Client* getClient() { return client; } ClientOptions& getOptions() { return options; } void connect(); void waitConnected(int timeout); bool isConnected() const; void setTraceEnabled(bool b); template Sluift::Response sendPubSubRequest( IQ::Type type, const JID& jid, std::shared_ptr payload, int timeout) { return sendRequest(client->getPubSubManager()->createRequest( type, jid, payload), timeout); } template Sluift::Response sendRequest(REQUEST_TYPE request, int timeout) { boost::signals2::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::signals2::scoped_connection c(request->onResponse.connect( boost::bind(&SluiftClient::handleRequestResponse, this, std::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 = boost::function()); std::vector getRoster(int timeout); std::vector getBlockList(int timeout); private: Sluift::Response doSendRequest(std::shared_ptr request, int timeout); void handleIncomingMessage(std::shared_ptr stanza); void handleIncomingPresence(std::shared_ptr stanza); void handleIncomingPubSubEvent(const JID& from, std::shared_ptr event); void handleIncomingBlockEvent(const JID& item); void handleIncomingUnblockEvent(const JID& item); void handleInitialRosterPopulated(); void handleRequestResponse(std::shared_ptr response, std::shared_ptr error); void handleDisconnected(const boost::optional& error); private: NetworkFactories* networkFactories; SimpleEventLoop* eventLoop; Client* client; ClientOptions options; ClientXMLTracer* tracer; bool rosterReceived = false; bool blockListReceived = false; std::deque pendingEvents; boost::optional disconnectedError; bool requestResponseReceived = false; std::shared_ptr requestResponse; std::shared_ptr requestError; }; }