/* * Copyright (c) 2014-2016 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 namespace Swift { struct SluiftGlobals; class ComponentXMLTracer; class Component; class Stanza; class Payload; class ErrorPayload; class JID; class SluiftComponent { public: struct Event { enum Type { MessageType, PresenceType }; Event(std::shared_ptr stanza) : type(MessageType), stanza(stanza) {} Event(std::shared_ptr stanza) : type(PresenceType), stanza(stanza) {} Type type; // Message & Presence std::shared_ptr stanza; }; SluiftComponent( const JID& jid, const std::string& password, NetworkFactories* networkFactories, SimpleEventLoop* eventLoop); ~SluiftComponent(); Component* getComponent() { return component; } void connect(const std::string& host, int port); void waitConnected(int timeout); bool isConnected() const; void setTraceEnabled(bool b); template Sluift::Response sendRequest(REQUEST_TYPE request, int timeout) { boost::signals::scoped_connection c = request->onResponse.connect( boost::bind(&SluiftComponent::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(&SluiftComponent::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 = 0); private: Sluift::Response doSendRequest(std::shared_ptr request, int timeout); void handleIncomingMessage(std::shared_ptr stanza); void handleIncomingPresence(std::shared_ptr stanza); void handleRequestResponse(std::shared_ptr response, std::shared_ptr error); void handleError(const boost::optional& error); private: NetworkFactories* networkFactories; SimpleEventLoop* eventLoop; Component* component; ComponentXMLTracer* tracer; std::deque pendingEvents; boost::optional disconnectedError; bool requestResponseReceived; std::shared_ptr requestResponse; std::shared_ptr requestError; }; }