// Copyright 2013 The Chromium 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 CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_IMPL_H_ #define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_IMPL_H_ #include #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/local_discovery/privet_http.h" namespace local_discovery { class PrivetHTTPClientImpl; class PrivetInfoOperationImpl : public PrivetInfoOperation, public PrivetURLFetcher::Delegate { public: PrivetInfoOperationImpl(PrivetHTTPClientImpl* privet_client, PrivetInfoOperation::Delegate* delegate); virtual ~PrivetInfoOperationImpl(); virtual void Start() OVERRIDE; virtual void OnError(PrivetURLFetcher* fetcher, PrivetURLFetcher::ErrorType error) OVERRIDE; virtual void OnParsedJson(PrivetURLFetcher* fetcher, const base::DictionaryValue* value, bool has_error) OVERRIDE; private: PrivetHTTPClientImpl* privet_client_; PrivetInfoOperation::Delegate* delegate_; scoped_ptr url_fetcher_; }; class PrivetRegisterOperationImpl : public PrivetRegisterOperation, public PrivetURLFetcher::Delegate, public PrivetInfoOperation::Delegate, public base::SupportsWeakPtr { public: PrivetRegisterOperationImpl(PrivetHTTPClientImpl* privet_client, const std::string& user, PrivetRegisterOperation::Delegate* delegate); virtual ~PrivetRegisterOperationImpl(); virtual void Start() OVERRIDE; virtual void Cancel() OVERRIDE; virtual void CompleteRegistration() OVERRIDE; virtual void OnError(PrivetURLFetcher* fetcher, PrivetURLFetcher::ErrorType error) OVERRIDE; virtual void OnParsedJson(PrivetURLFetcher* fetcher, const base::DictionaryValue* value, bool has_error) OVERRIDE; virtual void OnPrivetInfoDone(int http_code, const base::DictionaryValue* value) OVERRIDE; private: // Arguments is JSON value from request. typedef base::Callback ResponseHandler; void StartResponse(const base::DictionaryValue& value); void GetClaimTokenResponse(const base::DictionaryValue& value); void CompleteResponse(const base::DictionaryValue& value); void StartInfoOperation(); void SendRequest(const std::string& action); bool PrivetErrorTransient(const std::string& error); std::string user_; std::string current_action_; scoped_ptr url_fetcher_; PrivetRegisterOperation::Delegate* delegate_; PrivetHTTPClientImpl* privet_client_; ResponseHandler next_response_handler_; // Required to ensure destroying completed register operations doesn't cause // extraneous cancelations. bool ongoing_; scoped_ptr info_operation_; }; class PrivetHTTPClientImpl : public PrivetHTTPClient { public: PrivetHTTPClientImpl(const net::HostPortPair& host_port, net::URLRequestContextGetter* request_context); virtual ~PrivetHTTPClientImpl(); virtual const base::DictionaryValue* GetCachedInfo() const OVERRIDE; virtual scoped_ptr CreateRegisterOperation( const std::string& user, PrivetRegisterOperation::Delegate* delegate) OVERRIDE; virtual scoped_ptr CreateInfoOperation( PrivetInfoOperation::Delegate* delegate) OVERRIDE; const PrivetURLFetcherFactory& fetcher_factory() const { return fetcher_factory_; } const net::HostPortPair& host_port() const { return host_port_; } void CacheInfo(const base::DictionaryValue* cached_info); private: PrivetURLFetcherFactory fetcher_factory_; net::HostPortPair host_port_; scoped_ptr cached_info_; }; } // namespace local_discovery #endif // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_IMPL_H_