blob: e9a513125ead55ff86698c2047ee4ca5af8a7db4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
// Copyright 2014 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 COMPONENTS_INVALIDATION_GCM_NETWORK_CHANNEL_H_
#define COMPONENTS_INVALIDATION_GCM_NETWORK_CHANNEL_H_
#include <string>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/threading/non_thread_safe.h"
#include "components/invalidation/gcm_network_channel_delegate.h"
#include "components/invalidation/invalidation_export.h"
#include "components/invalidation/sync_system_resources.h"
#include "net/base/backoff_entry.h"
#include "net/base/network_change_notifier.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "url/gurl.h"
class GoogleServiceAuthError;
namespace syncer {
class GCMNetworkChannel;
// POD with copy of some statuses for debugging purposes.
struct GCMNetworkChannelDiagnostic {
explicit GCMNetworkChannelDiagnostic(GCMNetworkChannel* parent);
// Collect all the internal variables in a single readable dictionary.
scoped_ptr<base::DictionaryValue> CollectDebugData() const;
// TODO(pavely): Move this toString to a more appropiate place in GCMClient.
std::string GCMClientResultToString(
const gcm::GCMClient::Result result) const;
GCMNetworkChannel* parent_;
bool last_message_empty_echo_token_;
base::Time last_message_received_time_;
int last_post_response_code_;
std::string registration_id_;
gcm::GCMClient::Result registration_result_;
int sent_messages_count_;
};
// GCMNetworkChannel is an implementation of SyncNetworkChannel that routes
// messages through GCMService.
class INVALIDATION_EXPORT_PRIVATE GCMNetworkChannel
: public SyncNetworkChannel,
public net::URLFetcherDelegate,
public net::NetworkChangeNotifier::NetworkChangeObserver,
public base::NonThreadSafe {
public:
GCMNetworkChannel(
scoped_refptr<net::URLRequestContextGetter> request_context_getter,
scoped_ptr<GCMNetworkChannelDelegate> delegate);
virtual ~GCMNetworkChannel();
// invalidation::NetworkChannel implementation.
virtual void SendMessage(const std::string& message) OVERRIDE;
virtual void SetMessageReceiver(
invalidation::MessageCallback* incoming_receiver) OVERRIDE;
// SyncNetworkChannel implementation.
virtual void UpdateCredentials(const std::string& email,
const std::string& token) OVERRIDE;
virtual int GetInvalidationClientType() OVERRIDE;
virtual void RequestDetailedStatus(
base::Callback<void(const base::DictionaryValue&)> callback) OVERRIDE;
// URLFetcherDelegate implementation.
virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
// NetworkChangeObserver implementation.
virtual void OnNetworkChanged(
net::NetworkChangeNotifier::ConnectionType connection_type) OVERRIDE;
protected:
void ResetRegisterBackoffEntryForTest(
const net::BackoffEntry::Policy* policy);
virtual GURL BuildUrl(const std::string& registration_id);
private:
friend class GCMNetworkChannelTest;
void Register();
void OnRegisterComplete(const std::string& registration_id,
gcm::GCMClient::Result result);
void RequestAccessToken();
void OnGetTokenComplete(const GoogleServiceAuthError& error,
const std::string& token);
void OnIncomingMessage(const std::string& message,
const std::string& echo_token);
// Base64 encoding/decoding with URL safe alphabet.
// http://tools.ietf.org/html/rfc4648#page-7
static void Base64EncodeURLSafe(const std::string& input,
std::string* output);
static bool Base64DecodeURLSafe(const std::string& input,
std::string* output);
scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
scoped_ptr<GCMNetworkChannelDelegate> delegate_;
// Message is saved until all conditions are met: there is valid
// registration_id and access_token.
std::string cached_message_;
// Access token is saved because in case of auth failure from server we need
// to invalidate it.
std::string access_token_;
// GCM registration_id is requested one at startup and never refreshed until
// next restart.
std::string registration_id_;
scoped_ptr<net::BackoffEntry> register_backoff_entry_;
scoped_ptr<net::URLFetcher> fetcher_;
// cacheinvalidation client receives echo_token with incoming message from
// GCM and shuld include it in headers with outgoing message over http.
std::string echo_token_;
GCMNetworkChannelDiagnostic diagnostic_info_;
base::WeakPtrFactory<GCMNetworkChannel> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(GCMNetworkChannel);
};
} // namespace syncer
#endif // COMPONENTS_INVALIDATION_GCM_NETWORK_CHANNEL_H_
|