15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_HOST_REGISTER_SUPPORT_HOST_REQUEST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_HOST_REGISTER_SUPPORT_HOST_REQUEST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/base/rsa_key_pair.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/jingle_glue/signal_strategy.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest_prod.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace buzz {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XmlElement;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace buzz
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TimeDelta;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IqRequest;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IqSender;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RegisterSupportHostRequest sends a request to register the host for
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a SupportID, as soon as the associated SignalStrategy becomes
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// connected. When a response is received from the bot, it calls the
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callback specified in the Init() method.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RegisterSupportHostRequest : public SignalStrategy::Listener {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First parameter is set to true on success. Second parameter is
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the new SessionID received from the bot. Third parameter is the
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // amount of time until that id expires.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(bool, const std::string&,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const base::TimeDelta&)> RegisterCallback;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |signal_strategy| and |key_pair| must outlive this
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // object. |callback| is called when registration response is
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // received from the server. Callback is never called if the bot
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // malfunctions and doesn't respond to the request.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sergeyu): This class should have timeout for the bot
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // response.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterSupportHostRequest(SignalStrategy* signal_strategy,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             scoped_refptr<RsaKeyPair> key_pair,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const std::string& directory_bot_jid,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const RegisterCallback& callback);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RegisterSupportHostRequest();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HostStatusObserver implementation.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSignalStrategyStateChange(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalStrategy::State state) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnSignalStrategyIncomingStanza(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const buzz::XmlElement* stanza) OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoSend();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<buzz::XmlElement> CreateRegistrationRequest(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& jid);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<buzz::XmlElement> CreateSignature(const std::string& jid);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessResponse(IqRequest* request, const buzz::XmlElement* response);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ParseResponse(const buzz::XmlElement* response,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     std::string* support_id, base::TimeDelta* lifetime);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CallCallback(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool success, const std::string& support_id, base::TimeDelta lifetime);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SignalStrategy* signal_strategy_;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<RsaKeyPair> key_pair_;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string directory_bot_jid_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterCallback callback_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<IqSender> iq_sender_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<IqRequest> request_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RegisterSupportHostRequest);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // REMOTING_HOST_REGISTER_SUPPORT_HOST_REQUEST_H_
89