15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef GOOGLE_APIS_GCM_ENGINE_CHECKIN_REQUEST_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define GOOGLE_APIS_GCM_ENGINE_CHECKIN_REQUEST_H_
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string>
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h"
130de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "base/time/time.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gcm/base/gcm_export.h"
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "google_apis/gcm/protocol/android_checkin.pb.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "google_apis/gcm/protocol/checkin.pb.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/backoff_entry.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "url/gurl.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace net {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class URLRequestContextGetter;
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace gcm {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class GCMStatsRecorder;
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Enables making check-in requests with the GCM infrastructure. When called
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// with android_id and security_token both set to 0 it is an initial check-in
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// used to obtain credentials. These should be persisted and used for subsequent
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// check-ins.
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GCM_EXPORT CheckinRequest : public net::URLFetcherDelegate {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // A callback function for the checkin request, accepting |checkin_response|
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // protobuf.
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  typedef base::Callback<void(const checkin_proto::AndroidCheckinResponse&
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                  checkin_response)> CheckinRequestCallback;
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Checkin request details.
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  struct GCM_EXPORT RequestInfo {
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    RequestInfo(uint64 android_id,
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                uint64 security_token,
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                const std::string& settings_digest,
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                const checkin_proto::ChromeBuildProto& chrome_build_proto);
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ~RequestInfo();
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Android ID of the device.
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    uint64 android_id;
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Security token of the device.
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    uint64 security_token;
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Digest of GServices settings on the device.
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string settings_digest;
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Information of the Chrome build of this device.
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    checkin_proto::ChromeBuildProto chrome_build_proto;
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckinRequest(const GURL& checkin_url,
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 const RequestInfo& request_info,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const net::BackoffEntry::Policy& backoff_policy,
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                 const CheckinRequestCallback& callback,
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 net::URLRequestContextGetter* request_context_getter,
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 GCMStatsRecorder* recorder);
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~CheckinRequest();
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Start();
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // URLFetcherDelegate implementation.
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Schedules a retry attempt, informs the backoff of a previous request's
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // failure when |update_backoff| is true.
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RetryWithBackoff(bool update_backoff);
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::URLRequestContextGetter* request_context_getter_;
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CheckinRequestCallback callback_;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::BackoffEntry backoff_entry_;
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GURL checkin_url_;
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<net::URLFetcher> url_fetcher_;
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const RequestInfo request_info_;
830de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  base::TimeTicks request_start_time_;
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Recorder that records GCM activities for debugging purpose. Not owned.
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GCMStatsRecorder* recorder_;
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::WeakPtrFactory<CheckinRequest> weak_ptr_factory_;
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CheckinRequest);
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace gcm
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // GOOGLE_APIS_GCM_ENGINE_CHECKIN_REQUEST_H_
96