| Index: components/copresence/handlers/gcm_handler_impl.cc
|
| diff --git a/components/copresence/handlers/gcm_handler_impl.cc b/components/copresence/handlers/gcm_handler_impl.cc
|
| deleted file mode 100644
|
| index 362b53550e3c0b1c7a31aea30e136d85ed6b92f8..0000000000000000000000000000000000000000
|
| --- a/components/copresence/handlers/gcm_handler_impl.cc
|
| +++ /dev/null
|
| @@ -1,158 +0,0 @@
|
| -// 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.
|
| -
|
| -#include "components/copresence/handlers/gcm_handler_impl.h"
|
| -
|
| -#include "base/base64.h"
|
| -#include "base/bind.h"
|
| -#include "base/logging.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "components/copresence/handlers/directive_handler.h"
|
| -#include "components/copresence/proto/push_message.pb.h"
|
| -#include "components/gcm_driver/gcm_driver.h"
|
| -
|
| -using gcm::GCMClient;
|
| -
|
| -namespace {
|
| -
|
| -// TODO(ckehoe): Move this to a common library.
|
| -bool Base64Decode(std::string data, std::string* out) {
|
| - // Convert from URL-safe.
|
| - base::ReplaceChars(data, "-", "+", &data);
|
| - base::ReplaceChars(data, "_", "/", &data);
|
| -
|
| - // Add padding if needed.
|
| - while (data.size() % 4)
|
| - data.push_back('=');
|
| -
|
| - // Decode.
|
| - return base::Base64Decode(data, out);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace copresence {
|
| -
|
| -const char GCMHandlerImpl::kCopresenceAppId[] =
|
| - "com.google.android.gms.location.copresence";
|
| -const char GCMHandlerImpl::kCopresenceSenderId[] = "745476177629";
|
| -const char GCMHandlerImpl::kGcmMessageKey[] = "PUSH_MESSAGE";
|
| -
|
| -
|
| -// Public functions.
|
| -
|
| -GCMHandlerImpl::GCMHandlerImpl(gcm::GCMDriver* gcm_driver,
|
| - DirectiveHandler* directive_handler,
|
| - const MessagesCallback& new_messages_callback)
|
| - : driver_(gcm_driver),
|
| - directive_handler_(directive_handler),
|
| - new_messages_callback_(new_messages_callback),
|
| - registration_callback_(base::Bind(&GCMHandlerImpl::RegistrationComplete,
|
| - base::Unretained(this))) {
|
| - DCHECK(driver_);
|
| - DCHECK(directive_handler_);
|
| -
|
| - driver_->AddAppHandler(kCopresenceAppId, this);
|
| - driver_->Register(kCopresenceAppId,
|
| - std::vector<std::string>(1, kCopresenceSenderId),
|
| - registration_callback_.callback());
|
| -}
|
| -
|
| -GCMHandlerImpl::~GCMHandlerImpl() {
|
| - if (driver_)
|
| - driver_->RemoveAppHandler(kCopresenceAppId);
|
| -}
|
| -
|
| -void GCMHandlerImpl::GetGcmId(const RegistrationCallback& callback) {
|
| - if (gcm_id_.empty()) {
|
| - pending_id_requests_.push_back(callback);
|
| - } else {
|
| - callback.Run(gcm_id_);
|
| - }
|
| -}
|
| -
|
| -void GCMHandlerImpl::ShutdownHandler() {
|
| - // The GCMDriver is going away. Make sure we don't try to contact it.
|
| - driver_ = nullptr;
|
| -}
|
| -
|
| -void GCMHandlerImpl::OnMessage(const std::string& app_id,
|
| - const gcm::IncomingMessage& message) {
|
| - DCHECK_EQ(kCopresenceAppId, app_id);
|
| - DVLOG(2) << "Incoming GCM message";
|
| -
|
| - const auto& content = message.data.find(kGcmMessageKey);
|
| - if (content == message.data.end()) {
|
| - LOG(ERROR) << "GCM message missing data key";
|
| - return;
|
| - }
|
| -
|
| - std::string serialized_message;
|
| - if (!Base64Decode(content->second, &serialized_message)) {
|
| - LOG(ERROR) << "Couldn't decode GCM message";
|
| - return;
|
| - }
|
| -
|
| - PushMessage push_message;
|
| - if (!push_message.ParseFromString(serialized_message)) {
|
| - LOG(ERROR) << "GCM message contained invalid proto";
|
| - return;
|
| - }
|
| -
|
| - if (push_message.type() != PushMessage::REPORT) {
|
| - DVLOG(2) << "Discarding non-report GCM message";
|
| - return;
|
| - }
|
| -
|
| - DVLOG(3) << "Processing " << push_message.report().directive_size()
|
| - << " directive(s) from GCM message";
|
| - for (const Directive& directive : push_message.report().directive()) {
|
| - // TODO(ckehoe): Use a callback here so GCMHandler
|
| - // is decoupled from DirectiveHandler.
|
| - directive_handler_->AddDirective(directive);
|
| - }
|
| -
|
| - new_messages_callback_.Run(push_message.report().subscribed_message());
|
| -}
|
| -
|
| -void GCMHandlerImpl::OnMessagesDeleted(const std::string& app_id) {
|
| - DCHECK_EQ(kCopresenceAppId, app_id);
|
| - DVLOG(2) << "GCM message overflow reported";
|
| -}
|
| -
|
| -void GCMHandlerImpl::OnSendError(
|
| - const std::string& /* app_id */,
|
| - const GCMClient::SendErrorDetails& /* send_error_details */) {
|
| - NOTREACHED() << "Copresence clients should not be sending GCM messages";
|
| -}
|
| -
|
| -void GCMHandlerImpl::OnSendAcknowledged(const std::string& /* app_id */,
|
| - const std::string& /* message_id */) {
|
| - NOTREACHED() << "Copresence clients should not be sending GCM messages";
|
| -}
|
| -
|
| -bool GCMHandlerImpl::CanHandle(const std::string& app_id) const {
|
| - return app_id == kCopresenceAppId;
|
| -}
|
| -
|
| -
|
| -// Private functions.
|
| -
|
| -void GCMHandlerImpl::RegistrationComplete(const std::string& registration_id,
|
| - GCMClient::Result result) {
|
| - if (result == GCMClient::SUCCESS) {
|
| - DVLOG(2) << "GCM registration successful. ID: " << registration_id;
|
| - gcm_id_ = registration_id;
|
| - } else {
|
| - LOG(ERROR) << "GCM registration failed with error " << result;
|
| - }
|
| -
|
| - for (const RegistrationCallback& callback : pending_id_requests_) {
|
| - callback.Run(result == GCMClient::SUCCESS ?
|
| - registration_id : std::string());
|
| - }
|
| - pending_id_requests_.clear();
|
| -}
|
| -
|
| -} // namespace copresence
|
|
|