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

Unified Diff: chrome/browser/geolocation/win7_location_api_win.cc

Issue 6591034: Move core pieces of geolocation from chrome to content.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix Linux build Created 9 years, 10 months 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/geolocation/win7_location_api_win.cc
===================================================================
--- chrome/browser/geolocation/win7_location_api_win.cc (revision 76198)
+++ chrome/browser/geolocation/win7_location_api_win.cc (working copy)
@@ -1,167 +0,0 @@
-// Copyright (c) 2010 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 "chrome/browser/geolocation/win7_location_api_win.h"
-
-#include "base/base_paths_win.h"
-#include "base/command_line.h"
-#include "base/file_path.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "base/scoped_ptr.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/common/geoposition.h"
-
-namespace {
-const double kKnotsToMetresPerSecondConversionFactor = 0.5144;
-
-void ConvertKnotsToMetresPerSecond(double* knots) {
- *knots *= kKnotsToMetresPerSecondConversionFactor;
-}
-
-HINSTANCE LoadWin7Library(const string16& lib_name) {
- FilePath sys_dir;
- PathService::Get(base::DIR_SYSTEM, &sys_dir);
- return LoadLibrary(sys_dir.Append(lib_name).value().c_str());
-}
-}
-
-Win7LocationApi::Win7LocationApi()
- : prop_lib_(0),
- PropVariantToDouble_function_(0),
- locator_(0) {
-}
-
-void Win7LocationApi::Init(HINSTANCE prop_library,
- PropVariantToDoubleFunction PropVariantToDouble_function,
- ILocation* locator) {
- prop_lib_ = prop_library;
- PropVariantToDouble_function_ = PropVariantToDouble_function;
- locator_ = locator;
-}
-
-Win7LocationApi::~Win7LocationApi() {
- if (prop_lib_ != NULL)
- FreeLibrary(prop_lib_);
-}
-
-Win7LocationApi* Win7LocationApi::Create() {
- if (!CommandLine::ForCurrentProcess()
- ->HasSwitch(switches::kExperimentalLocationFeatures))
- return NULL;
-
- scoped_ptr<Win7LocationApi> result(new Win7LocationApi);
- // Load probsys.dll
- string16 lib_needed = L"propsys.dll";
- HINSTANCE prop_lib = LoadWin7Library(lib_needed);
- if (!prop_lib)
- return NULL;
- // Get pointer to function.
- PropVariantToDoubleFunction PropVariantToDouble_function;
- PropVariantToDouble_function =
- reinterpret_cast<PropVariantToDoubleFunction>(
- GetProcAddress(prop_lib, "PropVariantToDouble"));
- if (!PropVariantToDouble_function) {
- FreeLibrary(prop_lib);
- return NULL;
- }
- // Create the ILocation object that receives location reports.
- HRESULT result_type;
- CComPtr<ILocation> locator;
- result_type = CoCreateInstance(
- CLSID_Location, NULL, CLSCTX_INPROC, IID_PPV_ARGS(&locator));
- if (!SUCCEEDED(result_type)) {
- FreeLibrary(prop_lib);
- return NULL;
- }
- IID reports_needed[] = { IID_ILatLongReport };
- result_type = locator->RequestPermissions(NULL, reports_needed, 1, TRUE);
- result->Init(prop_lib, PropVariantToDouble_function, locator);
- return result.release();
-}
-
-Win7LocationApi* Win7LocationApi::CreateForTesting(
- PropVariantToDoubleFunction PropVariantToDouble_function,
- ILocation* locator) {
- Win7LocationApi* result = new Win7LocationApi;
- result->Init(NULL, PropVariantToDouble_function, locator);
- return result;
-}
-
-void Win7LocationApi::GetPosition(Geoposition* position) {
- DCHECK(position);
- position->error_code = Geoposition::ERROR_CODE_POSITION_UNAVAILABLE;
- if (!locator_)
- return;
- // Try to get a position fix
- if (!GetPositionIfFixed(position))
- return;
- position->error_code = Geoposition::ERROR_CODE_NONE;
- if (!position->IsValidFix()) {
- // GetPositionIfFixed returned true, yet we've not got a valid fix.
- // This shouldn't happen; something went wrong in the conversion.
- NOTREACHED() << "Invalid position from GetPositionIfFixed: lat,long "
- << position->latitude << "," << position->longitude
- << " accuracy " << position->accuracy << " time "
- << position->timestamp.ToDoubleT();
- position->error_code = Geoposition::ERROR_CODE_POSITION_UNAVAILABLE;
- position->error_message = "Bad fix from Win7 provider";
- }
-}
-
-bool Win7LocationApi::GetPositionIfFixed(Geoposition* position) {
- HRESULT result_type;
- CComPtr<ILocationReport> location_report;
- CComPtr<ILatLongReport> lat_long_report;
- result_type = locator_->GetReport(IID_ILatLongReport, &location_report);
- // Checks to see if location access is allowed.
- if (result_type == E_ACCESSDENIED)
- position->error_code = Geoposition::ERROR_CODE_PERMISSION_DENIED;
- // Checks for any other errors while requesting a location report.
- if (!SUCCEEDED(result_type))
- return false;
- result_type = location_report->QueryInterface(&lat_long_report);
- if (!SUCCEEDED(result_type))
- return false;
- result_type = lat_long_report->GetLatitude(&position->latitude);
- if (!SUCCEEDED(result_type))
- return false;
- result_type = lat_long_report->GetLongitude(&position->longitude);
- if (!SUCCEEDED(result_type))
- return false;
- result_type = lat_long_report->GetErrorRadius(&position->accuracy);
- if (!SUCCEEDED(result_type) || position->accuracy <= 0)
- return false;
- double temp_dbl;
- result_type = lat_long_report->GetAltitude(&temp_dbl);
- if (SUCCEEDED(result_type))
- position->altitude = temp_dbl;
- result_type = lat_long_report->GetAltitudeError(&temp_dbl);
- if (SUCCEEDED(result_type))
- position->altitude_accuracy = temp_dbl;
- PROPVARIANT heading;
- PropVariantInit(&heading);
- result_type = lat_long_report->GetValue(
- SENSOR_DATA_TYPE_TRUE_HEADING_DEGREES, &heading);
- if (SUCCEEDED(result_type))
- PropVariantToDouble_function_(heading, &position->heading);
- PROPVARIANT speed;
- PropVariantInit(&speed);
- result_type = lat_long_report->GetValue(
- SENSOR_DATA_TYPE_SPEED_KNOTS, &speed);
- if (SUCCEEDED(result_type)) {
- PropVariantToDouble_function_(speed, &position->speed);
- ConvertKnotsToMetresPerSecond(&position->speed);
- }
- position->timestamp = base::Time::Now();
- return true;
-}
-
-bool Win7LocationApi::SetHighAccuracy(bool acc) {
- HRESULT result_type;
- result_type = locator_->SetDesiredAccuracy(IID_ILatLongReport,
- acc ? LOCATION_DESIRED_ACCURACY_HIGH :
- LOCATION_DESIRED_ACCURACY_DEFAULT);
- return SUCCEEDED(result_type);
-}

Powered by Google App Engine
This is Rietveld 408576698