• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_UNREGISTRATION_REQUEST_H_
6 #define GOOGLE_APIS_GCM_ENGINE_UNREGISTRATION_REQUEST_H_
7 
8 #include "base/basictypes.h"
9 #include "base/callback.h"
10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.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 "net/base/backoff_entry.h"
16 #include "net/url_request/url_fetcher_delegate.h"
17 #include "url/gurl.h"
18 
19 namespace net {
20 class URLRequestContextGetter;
21 }
22 
23 namespace gcm {
24 
25 class GCMStatsRecorder;
26 
27 // Unregistration request is used to revoke registration IDs for applications
28 // that were uninstalled and should no longer receive GCM messages. In case an
29 // attempt to unregister fails, it will retry using the backoff policy.
30 // TODO(fgorski): Consider sharing code with RegistrationRequest if possible.
31 class GCM_EXPORT UnregistrationRequest : public net::URLFetcherDelegate {
32  public:
33   // Outcome of the response parsing. Note that these enums are consumed by a
34   // histogram, so ordering should not be modified.
35   enum Status {
36     SUCCESS,                  // Unregistration completed successfully.
37     URL_FETCHING_FAILED,      // URL fetching failed.
38     NO_RESPONSE_BODY,         // No response body.
39     RESPONSE_PARSING_FAILED,  // Failed to parse a meaningful output from
40                               // response
41                               // body.
42     INCORRECT_APP_ID,         // App ID returned by the fetcher does not match
43                               // request.
44     INVALID_PARAMETERS,       // Request parameters were invalid.
45     SERVICE_UNAVAILABLE,      // Unregistration service unavailable.
46     INTERNAL_SERVER_ERROR,    // Internal server error happened during request.
47     HTTP_NOT_OK,              // HTTP response code was not OK.
48     UNKNOWN_ERROR,            // Unknown error.
49     // NOTE: Always keep this entry at the end. Add new status types only
50     // immediately above this line. Make sure to update the corresponding
51     // histogram enum accordingly.
52     UNREGISTRATION_STATUS_COUNT,
53   };
54 
55   // Callback completing the unregistration request.
56   typedef base::Callback<void(Status success)> UnregistrationCallback;
57 
58   // Details of the of the Unregistration Request. All parameters are mandatory.
59   struct GCM_EXPORT RequestInfo {
60     RequestInfo(uint64 android_id,
61                 uint64 security_token,
62                 const std::string& app_id);
63     ~RequestInfo();
64 
65     // Android ID of the device.
66     uint64 android_id;
67     // Security token of the device.
68     uint64 security_token;
69     // Application ID.
70     std::string app_id;
71   };
72 
73   // Creates an instance of UnregistrationRequest. |callback| will be called
74   // once registration has been revoked or there has been an error that makes
75   // further retries pointless.
76   UnregistrationRequest(
77       const GURL& registration_url,
78       const RequestInfo& request_info,
79       const net::BackoffEntry::Policy& backoff_policy,
80       const UnregistrationCallback& callback,
81       scoped_refptr<net::URLRequestContextGetter> request_context_getter,
82       GCMStatsRecorder* recorder);
83   virtual ~UnregistrationRequest();
84 
85   // Starts an unregistration request.
86   void Start();
87 
88   // URLFetcherDelegate implementation.
89   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
90 
91  private:
92   // Schedules a retry attempt and informs the backoff of previous request's
93   // failure, when |update_backoff| is true.
94   void RetryWithBackoff(bool update_backoff);
95 
96   UnregistrationCallback callback_;
97   RequestInfo request_info_;
98   GURL registration_url_;
99 
100   net::BackoffEntry backoff_entry_;
101   scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
102   scoped_ptr<net::URLFetcher> url_fetcher_;
103   base::TimeTicks request_start_time_;
104 
105   // Recorder that records GCM activities for debugging purpose. Not owned.
106   GCMStatsRecorder* recorder_;
107 
108   base::WeakPtrFactory<UnregistrationRequest> weak_ptr_factory_;
109 
110   DISALLOW_COPY_AND_ASSIGN(UnregistrationRequest);
111 };
112 
113 }  // namespace gcm
114 
115 #endif  // GOOGLE_APIS_GCM_ENGINE_UNREGISTRATION_REQUEST_H_
116