| // Copyright 2015 The Weave Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef LIBWEAVE_SRC_NOTIFICATION_XMPP_IQ_STANZA_HANDLER_H_ | 
 | #define LIBWEAVE_SRC_NOTIFICATION_XMPP_IQ_STANZA_HANDLER_H_ | 
 |  | 
 | #include <map> | 
 | #include <memory> | 
 | #include <string> | 
 |  | 
 | #include <base/callback_forward.h> | 
 | #include <base/macros.h> | 
 | #include <base/time/time.h> | 
 | #include <base/memory/weak_ptr.h> | 
 |  | 
 | #include "src/notification/xmpp_stream_parser.h" | 
 |  | 
 | namespace weave { | 
 |  | 
 | class XmppChannelInterface; | 
 |  | 
 | namespace provider { | 
 | class TaskRunner; | 
 | } | 
 |  | 
 | class IqStanzaHandler { | 
 |  public: | 
 |   using ResponseCallback = base::Callback<void(std::unique_ptr<XmlNode>)>; | 
 |   using TimeoutCallback = base::Closure; | 
 |  | 
 |   IqStanzaHandler(XmppChannelInterface* xmpp_channel, | 
 |                   provider::TaskRunner* task_runner); | 
 |  | 
 |   // Sends <iq> request to the server. | 
 |   // |type| is the IQ stanza type, one of "get", "set", "query". | 
 |   // |to| is the target of the message. If empty string, 'to' is omitted. | 
 |   // |body| the XML snipped to include between <iq>...</iq> | 
 |   // |response_callback| is called with result or error XML stanza received | 
 |   // from the server in response to the request sent. | 
 |   // |timeout_callback| is called when the response to the request hasn't been | 
 |   // received within the time allotted. | 
 |   void SendRequest(const std::string& type, | 
 |                    const std::string& from, | 
 |                    const std::string& to, | 
 |                    const std::string& body, | 
 |                    const ResponseCallback& response_callback, | 
 |                    const TimeoutCallback& timeout_callback); | 
 |  | 
 |   // |timeout| is the custom time interval after which requests should be | 
 |   // considered failed. | 
 |   void SendRequestWithCustomTimeout(const std::string& type, | 
 |                                     const std::string& from, | 
 |                                     const std::string& to, | 
 |                                     const std::string& body, | 
 |                                     base::TimeDelta timeout, | 
 |                                     const ResponseCallback& response_callback, | 
 |                                     const TimeoutCallback& timeout_callback); | 
 |  | 
 |   // Processes an <iq> stanza is received from the server. This will match the | 
 |   // stanza's 'id' attribute with pending request ID and if found, will | 
 |   // call the |response_callback|, or if the request is not found, an error | 
 |   // stanza fill be sent back to the server. | 
 |   // Returns false if some unexpected condition occurred and the stream should | 
 |   // be restarted. | 
 |   bool HandleIqStanza(std::unique_ptr<XmlNode> stanza); | 
 |  | 
 |  private: | 
 |   using RequestId = int; | 
 |   void OnTimeOut(RequestId id, const TimeoutCallback& timeout_callback); | 
 |  | 
 |   XmppChannelInterface* xmpp_channel_; | 
 |   provider::TaskRunner* task_runner_{nullptr}; | 
 |   std::map<RequestId, ResponseCallback> requests_; | 
 |   RequestId last_request_id_{0}; | 
 |  | 
 |   base::WeakPtrFactory<IqStanzaHandler> weak_ptr_factory_{this}; | 
 |   DISALLOW_COPY_AND_ASSIGN(IqStanzaHandler); | 
 | }; | 
 |  | 
 | }  // namespace weave | 
 |  | 
 | #endif  // LIBWEAVE_SRC_NOTIFICATION_XMPP_IQ_STANZA_HANDLER_H_ |