Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(410)

Side by Side Diff: components/copresence/copresence_manager_impl.cc

Issue 764673003: Adding CopresenceState (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/copresence/copresence_manager_impl.h" 5 #include "components/copresence/copresence_manager_impl.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
11 #include "base/time/time.h"
11 #include "base/timer/timer.h" 12 #include "base/timer/timer.h"
13 #include "components/copresence/copresence_state_impl.h"
12 #include "components/copresence/handlers/directive_handler_impl.h" 14 #include "components/copresence/handlers/directive_handler_impl.h"
13 #include "components/copresence/handlers/gcm_handler_impl.h" 15 #include "components/copresence/handlers/gcm_handler_impl.h"
14 #include "components/copresence/proto/rpcs.pb.h" 16 #include "components/copresence/proto/rpcs.pb.h"
15 #include "components/copresence/public/whispernet_client.h" 17 #include "components/copresence/public/whispernet_client.h"
16 #include "components/copresence/rpc/rpc_handler.h" 18 #include "components/copresence/rpc/rpc_handler.h"
17 19
18 namespace { 20 namespace {
19 21
20 const int kPollTimerIntervalMs = 3000; // milliseconds. 22 const int kPollTimerIntervalMs = 3000; // milliseconds.
21 const int kAudioCheckIntervalMs = 1000; // milliseconds. 23 const int kAudioCheckIntervalMs = 1000; // milliseconds.
22 24
23 } // namespace 25 } // namespace
24 26
25 namespace copresence { 27 namespace copresence {
26 28
27 // Public functions. 29 // Public functions.
28 30
29 CopresenceManagerImpl::CopresenceManagerImpl(CopresenceDelegate* delegate) 31 CopresenceManagerImpl::CopresenceManagerImpl(CopresenceDelegate* delegate)
30 : delegate_(delegate), 32 : delegate_(delegate),
31 whispernet_init_callback_(base::Bind( 33 whispernet_init_callback_(base::Bind(
32 &CopresenceManagerImpl::WhispernetInitComplete, 34 &CopresenceManagerImpl::WhispernetInitComplete,
33 // This callback gets cancelled when we are destroyed. 35 // This callback gets cancelled when we are destroyed.
34 base::Unretained(this))), 36 base::Unretained(this))),
35 init_failed_(false), 37 init_failed_(false),
36 directive_handler_(new DirectiveHandlerImpl), 38 state_(new CopresenceStateImpl),
39 directive_handler_(new DirectiveHandlerImpl(
40 // The directive handler and its descendants
41 // will be destructed before the CopresenceState instance.
42 base::Bind(&CopresenceStateImpl::UpdateDirectives,
43 base::Unretained(state_.get())))),
37 poll_timer_(new base::RepeatingTimer<CopresenceManagerImpl>), 44 poll_timer_(new base::RepeatingTimer<CopresenceManagerImpl>),
38 audio_check_timer_(new base::RepeatingTimer<CopresenceManagerImpl>) { 45 audio_check_timer_(new base::RepeatingTimer<CopresenceManagerImpl>) {
39 DCHECK(delegate_); 46 DCHECK(delegate_);
40 DCHECK(delegate_->GetWhispernetClient()); 47 DCHECK(delegate_->GetWhispernetClient());
41 delegate_->GetWhispernetClient()->Initialize( 48 delegate_->GetWhispernetClient()->Initialize(
42 whispernet_init_callback_.callback()); 49 whispernet_init_callback_.callback());
43 50
44 if (delegate->GetGCMDriver()) 51 if (delegate->GetGCMDriver())
45 gcm_handler_.reset(new GCMHandlerImpl(delegate->GetGCMDriver(), 52 gcm_handler_.reset(new GCMHandlerImpl(delegate->GetGCMDriver(),
46 directive_handler_.get())); 53 directive_handler_.get()));
47 54
48 rpc_handler_.reset(new RpcHandler(delegate, 55 rpc_handler_.reset(new RpcHandler(delegate,
56 state_.get(),
49 directive_handler_.get(), 57 directive_handler_.get(),
50 gcm_handler_.get())); 58 gcm_handler_.get()));
51 } 59 }
52 60
53 CopresenceManagerImpl::~CopresenceManagerImpl() { 61 CopresenceManagerImpl::~CopresenceManagerImpl() {
54 whispernet_init_callback_.Cancel(); 62 whispernet_init_callback_.Cancel();
55 } 63 }
56 64
65 CopresenceState* CopresenceManagerImpl::state() {
66 return state_.get();
67 }
68
57 // Returns false if any operations were malformed. 69 // Returns false if any operations were malformed.
58 void CopresenceManagerImpl::ExecuteReportRequest( 70 void CopresenceManagerImpl::ExecuteReportRequest(
59 const ReportRequest& request, 71 const ReportRequest& request,
60 const std::string& app_id, 72 const std::string& app_id,
61 const std::string& auth_token, 73 const std::string& auth_token,
62 const StatusCallback& callback) { 74 const StatusCallback& callback) {
63 // If initialization has failed, reject all requests. 75 // If initialization has failed, reject all requests.
64 if (init_failed_) { 76 if (init_failed_) {
65 callback.Run(FAIL); 77 callback.Run(FAIL);
66 return; 78 return;
67 } 79 }
68 80
69 // We'll need to modify the ReportRequest, so we make our own copy to send. 81 // We'll need to modify the ReportRequest, so we make our own copy to send.
70 scoped_ptr<ReportRequest> request_copy(new ReportRequest(request)); 82 scoped_ptr<ReportRequest> request_copy(new ReportRequest(request));
71 rpc_handler_->SendReportRequest( 83 rpc_handler_->SendReportRequest(
72 request_copy.Pass(), app_id, auth_token, callback); 84 request_copy.Pass(), app_id, auth_token, callback);
73 } 85 }
74 86
75 87
76 // Private functions. 88 // Private functions.
77 89
78 void CopresenceManagerImpl::WhispernetInitComplete(bool success) { 90 void CopresenceManagerImpl::WhispernetInitComplete(bool success) {
79 if (success) { 91 if (success) {
80 DVLOG(3) << "Whispernet initialized successfully."; 92 DVLOG(3) << "Whispernet initialized successfully.";
81 93
82 // We destroy |directive_handler_| before |rpc_handler_|, hence passing
83 // in |rpc_handler_|'s pointer is safe here.
84 directive_handler_->Start(delegate_->GetWhispernetClient(), 94 directive_handler_->Start(delegate_->GetWhispernetClient(),
85 base::Bind(&RpcHandler::ReportTokens, 95 base::Bind(&CopresenceManagerImpl::ReceivedTokens,
86 base::Unretained(rpc_handler_.get()))); 96 base::Unretained(this)));
87 97
88 // Start up timers. 98 // Start up timers.
89 poll_timer_->Start(FROM_HERE, 99 poll_timer_->Start(FROM_HERE,
90 base::TimeDelta::FromMilliseconds(kPollTimerIntervalMs), 100 base::TimeDelta::FromMilliseconds(kPollTimerIntervalMs),
91 base::Bind(&CopresenceManagerImpl::PollForMessages, 101 base::Bind(&CopresenceManagerImpl::PollForMessages,
92 base::Unretained(this))); 102 base::Unretained(this)));
93 audio_check_timer_->Start( 103 audio_check_timer_->Start(
94 FROM_HERE, base::TimeDelta::FromMilliseconds(kAudioCheckIntervalMs), 104 FROM_HERE, base::TimeDelta::FromMilliseconds(kAudioCheckIntervalMs),
95 base::Bind(&CopresenceManagerImpl::AudioCheck, base::Unretained(this))); 105 base::Bind(&CopresenceManagerImpl::AudioCheck, base::Unretained(this)));
96 } else { 106 } else {
97 LOG(ERROR) << "Whispernet initialization failed!"; 107 LOG(ERROR) << "Whispernet initialization failed!";
98 init_failed_ = true; 108 init_failed_ = true;
99 } 109 }
100 } 110 }
101 111
112 void CopresenceManagerImpl::ReceivedTokens(
113 const std::vector<AudioToken>& tokens) {
114 rpc_handler_->ReportTokens(tokens);
115
116 // Update the CopresenceState.
117 for (const AudioToken audio_token : tokens) {
118 DVLOG(3) << "Heard token: " << audio_token.token;
119 ReceivedToken token(
120 audio_token.token,
121 audio_token.audible ? AUDIO_AUDIBLE_DTMF : AUDIO_ULTRASOUND_PASSBAND,
122 base::Time::Now());
123 state_->UpdateReceivedToken(token);
124 }
125 }
126
102 void CopresenceManagerImpl::PollForMessages() { 127 void CopresenceManagerImpl::PollForMessages() {
103 // Report our currently playing tokens. 128 // Report our currently playing tokens.
104 const std::string& audible_token = 129 const std::string& audible_token =
105 directive_handler_->GetCurrentAudioToken(AUDIBLE); 130 directive_handler_->GetCurrentAudioToken(AUDIBLE);
106 const std::string& inaudible_token = 131 const std::string& inaudible_token =
107 directive_handler_->GetCurrentAudioToken(INAUDIBLE); 132 directive_handler_->GetCurrentAudioToken(INAUDIBLE);
108 133
109 std::vector<AudioToken> tokens; 134 std::vector<AudioToken> tokens;
110 if (!audible_token.empty()) 135 if (!audible_token.empty())
111 tokens.push_back(AudioToken(audible_token, true)); 136 tokens.push_back(AudioToken(audible_token, true));
112 if (!inaudible_token.empty()) 137 if (!inaudible_token.empty())
113 tokens.push_back(AudioToken(inaudible_token, false)); 138 tokens.push_back(AudioToken(inaudible_token, false));
114 139
115 if (!tokens.empty()) 140 if (!tokens.empty())
116 rpc_handler_->ReportTokens(tokens); 141 rpc_handler_->ReportTokens(tokens);
117 } 142 }
118 143
119 void CopresenceManagerImpl::AudioCheck() { 144 void CopresenceManagerImpl::AudioCheck() {
120 if (!directive_handler_->GetCurrentAudioToken(AUDIBLE).empty() && 145 if (!directive_handler_->GetCurrentAudioToken(AUDIBLE).empty() &&
121 !directive_handler_->IsAudioTokenHeard(AUDIBLE)) { 146 !directive_handler_->IsAudioTokenHeard(AUDIBLE)) {
122 delegate_->HandleStatusUpdate(AUDIO_FAIL); 147 delegate_->HandleStatusUpdate(AUDIO_FAIL);
123 } else if (!directive_handler_->GetCurrentAudioToken(INAUDIBLE).empty() && 148 } else if (!directive_handler_->GetCurrentAudioToken(INAUDIBLE).empty() &&
124 !directive_handler_->IsAudioTokenHeard(INAUDIBLE)) { 149 !directive_handler_->IsAudioTokenHeard(INAUDIBLE)) {
125 delegate_->HandleStatusUpdate(AUDIO_FAIL); 150 delegate_->HandleStatusUpdate(AUDIO_FAIL);
126 } 151 }
127 } 152 }
128 153
129 } // namespace copresence 154 } // namespace copresence
OLDNEW
« no previous file with comments | « components/copresence/copresence_manager_impl.h ('k') | components/copresence/copresence_state_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698