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

Unified Diff: ios/chrome/browser/geolocation/CLLocation+XGeoHeader.mm

Issue 1103293002: [iOS] Upstream iOS geolocation code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments Created 5 years, 8 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: ios/chrome/browser/geolocation/CLLocation+XGeoHeader.mm
diff --git a/ios/chrome/browser/geolocation/CLLocation+XGeoHeader.mm b/ios/chrome/browser/geolocation/CLLocation+XGeoHeader.mm
new file mode 100644
index 0000000000000000000000000000000000000000..1aa9ed7a6c3b27e4a4911801678b50ba48bbbaf9
--- /dev/null
+++ b/ios/chrome/browser/geolocation/CLLocation+XGeoHeader.mm
@@ -0,0 +1,74 @@
+// Copyright 2013 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.
+
+#import "ios/chrome/browser/geolocation/CLLocation+XGeoHeader.h"
+
+#include "base/basictypes.h"
+#import "third_party/google_toolbox_for_mac/src/Foundation/GTMStringEncoding.h"
+
+NSString* const kGMOLocationDescriptorFormat =
+ @"role: CURRENT_LOCATION\n"
+ @"producer: DEVICE_LOCATION\n"
+ @"timestamp: %lld\n"
+ @"radius: %ld\n"
+ @"latlng <\n"
+ @" latitude_e7: %.f\n"
+ @" longitude_e7: %.f\n"
+ @">";
+
+@implementation CLLocation (XGeoHeader)
+
+- (NSString*)cr_serializeStringToWebSafeBase64String:(NSString*)data {
+ GTMStringEncoding* encoder =
+ [GTMStringEncoding rfc4648Base64WebsafeStringEncoding];
+ NSString* base64 =
+ [encoder encode:[data dataUsingEncoding:NSUTF8StringEncoding]];
+ if (base64) {
+ return base64;
+ } else {
+ return @"";
+ }
+}
+
+// Returns the timestamp of this location in microseconds since the UNIX epoch.
+// Returns 0 if the timestamp is unavailable or invalid.
+- (int64)cr_timestampInMicroseconds {
+ NSTimeInterval seconds = [self.timestamp timeIntervalSince1970];
+ if (seconds > 0) {
+ const int64 kSecondsToMicroseconds = 1000000;
+ return (int64)(seconds * kSecondsToMicroseconds);
+ }
+ return 0;
+}
+
+// Returns the horizontal accuracy radius of |location|. The smaller the value,
+// the more accurate the location. A value -1 is returned if accuracy is
+// unavailable.
+- (long)cr_accuracyInMillimeters {
+ const long kMetersToMillimeters = 1000;
+ if (self.horizontalAccuracy > 0) {
+ return (long)(self.horizontalAccuracy * kMetersToMillimeters);
+ }
+ return -1L;
+}
+
+// Returns the LocationDescriptor as an ASCII proto.
+- (NSString*)cr_locationDescriptor {
+ // Construct the location descriptor using its format string.
+ return [NSString stringWithFormat:kGMOLocationDescriptorFormat,
+ [self cr_timestampInMicroseconds],
+ [self cr_accuracyInMillimeters],
+ floor(self.coordinate.latitude * 1e7),
+ floor(self.coordinate.longitude * 1e7)];
+}
+
+- (NSString*)cr_xGeoString {
+ NSString* locationDescriptor = [self cr_locationDescriptor];
+ // The "a" indicates that it is an ASCII proto.
+ return [NSString
+ stringWithFormat:@"a %@", [self cr_serializeStringToWebSafeBase64String:
+ locationDescriptor]];
+}
+
+@end
« no previous file with comments | « ios/chrome/browser/geolocation/CLLocation+XGeoHeader.h ('k') | ios/chrome/browser/geolocation/CLLocation+XGeoHeaderTest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698