1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef GOOGLE_APIS_GCM_ENGINE_CHECKIN_REQUEST_H_ 6#define GOOGLE_APIS_GCM_ENGINE_CHECKIN_REQUEST_H_ 7 8#include <string> 9 10#include "base/basictypes.h" 11#include "base/callback.h" 12#include "base/memory/weak_ptr.h" 13#include "base/time/time.h" 14#include "google_apis/gcm/base/gcm_export.h" 15#include "google_apis/gcm/protocol/android_checkin.pb.h" 16#include "google_apis/gcm/protocol/checkin.pb.h" 17#include "net/base/backoff_entry.h" 18#include "net/url_request/url_fetcher_delegate.h" 19#include "url/gurl.h" 20 21namespace net { 22class URLRequestContextGetter; 23} 24 25namespace gcm { 26 27class GCMStatsRecorder; 28 29// Enables making check-in requests with the GCM infrastructure. When called 30// with android_id and security_token both set to 0 it is an initial check-in 31// used to obtain credentials. These should be persisted and used for subsequent 32// check-ins. 33class GCM_EXPORT CheckinRequest : public net::URLFetcherDelegate { 34 public: 35 // A callback function for the checkin request, accepting |checkin_response| 36 // protobuf. 37 typedef base::Callback<void(const checkin_proto::AndroidCheckinResponse& 38 checkin_response)> CheckinRequestCallback; 39 40 // Checkin request details. 41 struct GCM_EXPORT RequestInfo { 42 RequestInfo(uint64 android_id, 43 uint64 security_token, 44 const std::string& settings_digest, 45 const checkin_proto::ChromeBuildProto& chrome_build_proto); 46 ~RequestInfo(); 47 48 // Android ID of the device. 49 uint64 android_id; 50 // Security token of the device. 51 uint64 security_token; 52 // Digest of GServices settings on the device. 53 std::string settings_digest; 54 // Information of the Chrome build of this device. 55 checkin_proto::ChromeBuildProto chrome_build_proto; 56 }; 57 58 CheckinRequest(const GURL& checkin_url, 59 const RequestInfo& request_info, 60 const net::BackoffEntry::Policy& backoff_policy, 61 const CheckinRequestCallback& callback, 62 net::URLRequestContextGetter* request_context_getter, 63 GCMStatsRecorder* recorder); 64 virtual ~CheckinRequest(); 65 66 void Start(); 67 68 // URLFetcherDelegate implementation. 69 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 70 71 private: 72 // Schedules a retry attempt, informs the backoff of a previous request's 73 // failure when |update_backoff| is true. 74 void RetryWithBackoff(bool update_backoff); 75 76 net::URLRequestContextGetter* request_context_getter_; 77 CheckinRequestCallback callback_; 78 79 net::BackoffEntry backoff_entry_; 80 GURL checkin_url_; 81 scoped_ptr<net::URLFetcher> url_fetcher_; 82 const RequestInfo request_info_; 83 base::TimeTicks request_start_time_; 84 85 // Recorder that records GCM activities for debugging purpose. Not owned. 86 GCMStatsRecorder* recorder_; 87 88 base::WeakPtrFactory<CheckinRequest> weak_ptr_factory_; 89 90 DISALLOW_COPY_AND_ASSIGN(CheckinRequest); 91}; 92 93} // namespace gcm 94 95#endif // GOOGLE_APIS_GCM_ENGINE_CHECKIN_REQUEST_H_ 96