OLD | NEW |
(Empty) | |
| 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 #include "chrome/browser/copresence/chrome_whispernet_client.h" |
| 6 |
| 7 #include "chrome/browser/extensions/api/copresence_private/copresence_private_ap
i.h" |
| 8 #include "chrome/browser/extensions/component_loader.h" |
| 9 #include "chrome/browser/extensions/extension_service.h" |
| 10 #include "chrome/common/extensions/api/copresence_private.h" |
| 11 #include "content/public/browser/browser_context.h" |
| 12 #include "extensions/browser/event_router.h" |
| 13 #include "extensions/browser/extension_system.h" |
| 14 #include "grit/browser_resources.h" |
| 15 |
| 16 namespace copresence { |
| 17 |
| 18 // Once the CL for the copresence component lands, these constants will be |
| 19 // need to be picked up from components/copresence/copresence_constants.h |
| 20 const int kDefaultRepetitions = 5; |
| 21 const float kDefaultSampleRate = 48000.0; |
| 22 const int kDefaultBitsPerSample = 16; |
| 23 const float kDefaultCarrierFrequency = 18500.0; |
| 24 const int kDefaultChannels = 2; |
| 25 |
| 26 } // namespace copresence |
| 27 |
| 28 // static |
| 29 const char ChromeWhispernetClient::kWhispernetProxyExtensionId[] = |
| 30 "bpfmnplchembfbdgieamdodgaencleal"; |
| 31 |
| 32 // Public: |
| 33 |
| 34 ChromeWhispernetClient::ChromeWhispernetClient( |
| 35 content::BrowserContext* browser_context) |
| 36 : browser_context_(browser_context), extension_loaded_(false) { |
| 37 } |
| 38 |
| 39 ChromeWhispernetClient::~ChromeWhispernetClient() { |
| 40 } |
| 41 |
| 42 void ChromeWhispernetClient::Initialize(const SuccessCallback& init_callback) { |
| 43 DVLOG(3) << "Initializing whispernet proxy client."; |
| 44 init_callback_ = init_callback; |
| 45 |
| 46 extensions::ExtensionSystem* es = |
| 47 extensions::ExtensionSystem::Get(browser_context_); |
| 48 DCHECK(es); |
| 49 ExtensionService* service = es->extension_service(); |
| 50 DCHECK(service); |
| 51 extensions::ComponentLoader* loader = service->component_loader(); |
| 52 DCHECK(loader); |
| 53 |
| 54 // This callback is cancelled in Shutdown(). |
| 55 extension_loaded_callback_ = base::Bind( |
| 56 &ChromeWhispernetClient::OnExtensionLoaded, base::Unretained(this)); |
| 57 |
| 58 if (!loader->Exists(kWhispernetProxyExtensionId)) { |
| 59 DVLOG(3) << "Loading Whispernet proxy."; |
| 60 loader->Add(IDR_WHISPERNET_PROXY_MANIFEST, |
| 61 base::FilePath(FILE_PATH_LITERAL("whispernet_proxy"))); |
| 62 } else { |
| 63 init_callback_.Run(true); |
| 64 } |
| 65 } |
| 66 |
| 67 void ChromeWhispernetClient::Shutdown() { |
| 68 extension_loaded_callback_.Reset(); |
| 69 init_callback_.Reset(); |
| 70 tokens_callback_.Reset(); |
| 71 samples_callback_.Reset(); |
| 72 db_callback_.Reset(); |
| 73 } |
| 74 |
| 75 // Fire an event to request a token encode. |
| 76 void ChromeWhispernetClient::EncodeToken(const std::string& token) { |
| 77 DCHECK(extension_loaded_); |
| 78 DCHECK(browser_context_); |
| 79 DCHECK(extensions::EventRouter::Get(browser_context_)); |
| 80 |
| 81 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 82 extensions::api::copresence_private::OnEncodeTokenRequest::kEventName, |
| 83 extensions::api::copresence_private::OnEncodeTokenRequest::Create(token), |
| 84 browser_context_)); |
| 85 |
| 86 extensions::EventRouter::Get(browser_context_) |
| 87 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); |
| 88 } |
| 89 |
| 90 // Fire an event to request a decode for the given samples. |
| 91 void ChromeWhispernetClient::DecodeSamples(const std::string& samples) { |
| 92 DCHECK(extension_loaded_); |
| 93 DCHECK(browser_context_); |
| 94 DCHECK(extensions::EventRouter::Get(browser_context_)); |
| 95 |
| 96 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 97 extensions::api::copresence_private::OnDecodeSamplesRequest::kEventName, |
| 98 extensions::api::copresence_private::OnDecodeSamplesRequest::Create( |
| 99 samples), |
| 100 browser_context_)); |
| 101 |
| 102 extensions::EventRouter::Get(browser_context_) |
| 103 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); |
| 104 } |
| 105 |
| 106 void ChromeWhispernetClient::DetectBroadcast() { |
| 107 DCHECK(extension_loaded_); |
| 108 DCHECK(browser_context_); |
| 109 DCHECK(extensions::EventRouter::Get(browser_context_)); |
| 110 |
| 111 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 112 extensions::api::copresence_private::OnDetectBroadcastRequest::kEventName, |
| 113 make_scoped_ptr(new base::ListValue()), |
| 114 browser_context_)); |
| 115 |
| 116 extensions::EventRouter::Get(browser_context_) |
| 117 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); |
| 118 } |
| 119 |
| 120 void ChromeWhispernetClient::RegisterTokensCallback( |
| 121 const TokensCallback& tokens_callback) { |
| 122 tokens_callback_ = tokens_callback; |
| 123 } |
| 124 |
| 125 void ChromeWhispernetClient::RegisterSamplesCallback( |
| 126 const SamplesCallback& samples_callback) { |
| 127 samples_callback_ = samples_callback; |
| 128 } |
| 129 |
| 130 void ChromeWhispernetClient::RegisterDetectBroadcastCallback( |
| 131 const SuccessCallback& db_callback) { |
| 132 db_callback_ = db_callback; |
| 133 } |
| 134 |
| 135 ChromeWhispernetClient::TokensCallback |
| 136 ChromeWhispernetClient::GetTokensCallback() { |
| 137 return tokens_callback_; |
| 138 } |
| 139 |
| 140 ChromeWhispernetClient::SamplesCallback |
| 141 ChromeWhispernetClient::GetSamplesCallback() { |
| 142 return samples_callback_; |
| 143 } |
| 144 |
| 145 ChromeWhispernetClient::SuccessCallback |
| 146 ChromeWhispernetClient::GetDetectBroadcastCallback() { |
| 147 return db_callback_; |
| 148 } |
| 149 |
| 150 ChromeWhispernetClient::SuccessCallback |
| 151 ChromeWhispernetClient::GetInitializedCallback() { |
| 152 return extension_loaded_callback_; |
| 153 } |
| 154 |
| 155 // Private: |
| 156 |
| 157 // Fire an event to initialize whispernet with the given parameters. |
| 158 void ChromeWhispernetClient::InitializeWhispernet( |
| 159 const extensions::api::copresence_private::AudioParameters& params) { |
| 160 DCHECK(browser_context_); |
| 161 DCHECK(extensions::EventRouter::Get(browser_context_)); |
| 162 |
| 163 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 164 extensions::api::copresence_private::OnInitialize::kEventName, |
| 165 extensions::api::copresence_private::OnInitialize::Create(params), |
| 166 browser_context_)); |
| 167 |
| 168 extensions::EventRouter::Get(browser_context_) |
| 169 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); |
| 170 } |
| 171 |
| 172 void ChromeWhispernetClient::OnExtensionLoaded(bool success) { |
| 173 if (extension_loaded_) { |
| 174 if (!init_callback_.is_null()) |
| 175 init_callback_.Run(success); |
| 176 return; |
| 177 } |
| 178 |
| 179 // Our extension just got loaded, initialize whispernet. |
| 180 extension_loaded_ = true; |
| 181 |
| 182 // This will fire another OnExtensionLoaded call once the initialization is |
| 183 // done, which means we've initialized for realz, hence call the init |
| 184 // callback. |
| 185 |
| 186 // At this point, we have the same parameters for record and play. This |
| 187 // may change later though (ongoing discussion with research). |
| 188 extensions::api::copresence_private::AudioParameters params; |
| 189 params.play.sample_rate = copresence::kDefaultSampleRate; |
| 190 params.play.bits_per_sample = copresence::kDefaultBitsPerSample; |
| 191 params.play.carrier_frequency = copresence::kDefaultCarrierFrequency; |
| 192 params.play.repetitions = copresence::kDefaultRepetitions; |
| 193 |
| 194 params.record.sample_rate = copresence::kDefaultSampleRate; |
| 195 params.record.bits_per_sample = copresence::kDefaultBitsPerSample; |
| 196 params.record.carrier_frequency = copresence::kDefaultCarrierFrequency; |
| 197 params.record.channels = copresence::kDefaultChannels; |
| 198 |
| 199 InitializeWhispernet(params); |
| 200 } |
OLD | NEW |