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 |