| // 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 "content/browser/geofencing/geofencing_dispatcher_host.h" |
| |
| #include "content/browser/geofencing/geofencing_manager.h" |
| #include "content/browser/service_worker/service_worker_context_core.h" |
| #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| #include "content/browser/service_worker/service_worker_registration.h" |
| #include "content/common/geofencing_messages.h" |
| #include "third_party/WebKit/public/platform/WebCircularGeofencingRegion.h" |
| |
| namespace content { |
| |
| static const int kMaxRegionIdLength = 200; |
| |
| GeofencingDispatcherHost::GeofencingDispatcherHost( |
| GeofencingManager* geofencing_manager) |
| : BrowserMessageFilter(GeofencingMsgStart), |
| manager_(geofencing_manager), |
| weak_factory_(this) { |
| } |
| |
| GeofencingDispatcherHost::~GeofencingDispatcherHost() { |
| } |
| |
| bool GeofencingDispatcherHost::OnMessageReceived(const IPC::Message& message) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(GeofencingDispatcherHost, message) |
| IPC_MESSAGE_HANDLER(GeofencingHostMsg_RegisterRegion, OnRegisterRegion) |
| IPC_MESSAGE_HANDLER(GeofencingHostMsg_UnregisterRegion, OnUnregisterRegion) |
| IPC_MESSAGE_HANDLER(GeofencingHostMsg_GetRegisteredRegions, |
| OnGetRegisteredRegions) |
| IPC_MESSAGE_FORWARD(GeofencingHostMsg_SetMockProvider, manager_.get(), |
| GeofencingManager::SetMockProvider) |
| IPC_MESSAGE_FORWARD(GeofencingHostMsg_SetMockPosition, manager_.get(), |
| GeofencingManager::SetMockPosition) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| return handled; |
| } |
| |
| void GeofencingDispatcherHost::OnRegisterRegion( |
| int thread_id, |
| int request_id, |
| const std::string& region_id, |
| const blink::WebCircularGeofencingRegion& region, |
| int64 service_worker_registration_id) { |
| // Sanity check on region_id |
| if (region_id.length() > kMaxRegionIdLength) { |
| Send(new GeofencingMsg_RegisterRegionComplete( |
| thread_id, request_id, GeofencingStatus::GEOFENCING_STATUS_ERROR)); |
| return; |
| } |
| |
| manager_->RegisterRegion( |
| service_worker_registration_id, |
| region_id, |
| region, |
| base::Bind(&GeofencingDispatcherHost::RegisterRegionCompleted, |
| weak_factory_.GetWeakPtr(), |
| thread_id, |
| request_id)); |
| } |
| |
| void GeofencingDispatcherHost::OnUnregisterRegion( |
| int thread_id, |
| int request_id, |
| const std::string& region_id, |
| int64 service_worker_registration_id) { |
| // Sanity check on region_id |
| if (region_id.length() > kMaxRegionIdLength) { |
| Send(new GeofencingMsg_UnregisterRegionComplete( |
| thread_id, request_id, GeofencingStatus::GEOFENCING_STATUS_ERROR)); |
| return; |
| } |
| |
| manager_->UnregisterRegion( |
| service_worker_registration_id, |
| region_id, |
| base::Bind(&GeofencingDispatcherHost::UnregisterRegionCompleted, |
| weak_factory_.GetWeakPtr(), |
| thread_id, |
| request_id)); |
| } |
| |
| void GeofencingDispatcherHost::OnGetRegisteredRegions( |
| int thread_id, |
| int request_id, |
| int64 service_worker_registration_id) { |
| GeofencingRegistrations result; |
| |
| GeofencingStatus status = |
| manager_->GetRegisteredRegions(service_worker_registration_id, &result); |
| Send(new GeofencingMsg_GetRegisteredRegionsComplete( |
| thread_id, request_id, status, result)); |
| } |
| |
| void GeofencingDispatcherHost::RegisterRegionCompleted( |
| int thread_id, |
| int request_id, |
| GeofencingStatus status) { |
| Send(new GeofencingMsg_RegisterRegionComplete(thread_id, request_id, status)); |
| } |
| |
| void GeofencingDispatcherHost::UnregisterRegionCompleted( |
| int thread_id, |
| int request_id, |
| GeofencingStatus status) { |
| Send(new GeofencingMsg_UnregisterRegionComplete( |
| thread_id, request_id, status)); |
| } |
| |
| } // namespace content |