Index: base/ios/device_util.mm |
diff --git a/base/ios/device_util.mm b/base/ios/device_util.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1d16de4b9b878c3890a64dfcd1fee552e789d9ac |
--- /dev/null |
+++ b/base/ios/device_util.mm |
@@ -0,0 +1,126 @@ |
+// Copyright (c) 2012 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 "base/ios/device_util.h" |
+ |
+#include <CommonCrypto/CommonDigest.h> |
+#import <Foundation/Foundation.h> |
+ |
+#include <ifaddrs.h> |
+#include <net/if_dl.h> |
+#include <string.h> |
+#include <sys/socket.h> |
+#include <sys/sysctl.h> |
+ |
+#include "base/logging.h" |
+#include "base/string_util.h" |
+#include "base/stringprintf.h" |
+#include "base/mac/scoped_cftyperef.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/sys_string_conversions.h" |
+ |
+namespace { |
+ |
+// Client ID key in the user preferences. |
+NSString* const kClientIdPreferenceKey = @"ChromiumClientID"; |
+// Default salt for device ids. |
+const char kDefaultSalt[] = "Salt"; |
+ |
+} // namespace |
+ |
+namespace ios { |
+namespace device_util { |
+ |
+std::string GetPlatform() { |
+ std::string platform; |
+ size_t size = 0; |
+ sysctlbyname("hw.machine", NULL, &size, NULL, 0); |
+ sysctlbyname("hw.machine", WriteInto(&platform, size), &size, NULL, 0); |
+ return platform; |
+} |
+ |
+bool IsRunningOnHighRamDevice() { |
+ uint64_t memory_size = 0; |
+ size_t size = sizeof(memory_size); |
+ if (sysctlbyname("hw.memsize", &memory_size, &size, NULL, 0) == 0) { |
+ // Anything >= 250M, call high ram. |
+ return memory_size >= 250 * 1024 * 1024; |
+ } |
+ return false; |
+} |
+ |
+bool IsSingleCoreDevice() { |
+ uint64_t cpu_number = 0; |
+ size_t sizes = sizeof(cpu_number); |
+ sysctlbyname("hw.physicalcpu", &cpu_number, &sizes, NULL, 0); |
+ return cpu_number == 1; |
+} |
+ |
+std::string GetMacAddress(const std::string& interface_name) { |
+ std::string mac_string; |
+ struct ifaddrs* addresses; |
+ if (getifaddrs(&addresses) == 0) { |
+ for (struct ifaddrs* address = addresses; address; |
+ address = address->ifa_next) { |
+ if ((address->ifa_addr->sa_family == AF_LINK) && |
+ strcmp(interface_name.c_str(), address->ifa_name) == 0) { |
+ const struct sockaddr_dl* found_address_struct = |
+ reinterpret_cast<const struct sockaddr_dl*>(address->ifa_addr); |
+ |
+ // |found_address_struct->sdl_data| contains the interface name followed |
+ // by the interface address. The address part can be accessed based on |
+ // the length of the name, that is, |found_address_struct->sdl_nlen|. |
+ const unsigned char* found_address = |
+ reinterpret_cast<const unsigned char*>( |
+ &found_address_struct->sdl_data[ |
+ found_address_struct->sdl_nlen]); |
+ |
+ int found_address_length = found_address_struct->sdl_alen; |
+ for (int i = 0; i < found_address_length; ++i) { |
+ if (i != 0) |
+ mac_string.push_back(':'); |
+ base::StringAppendF(&mac_string, "%02X", found_address[i]); |
+ } |
+ break; |
+ } |
+ } |
+ freeifaddrs(addresses); |
+ } |
+ return mac_string; |
+} |
+ |
+std::string GetRandomId() { |
+ base::mac::ScopedCFTypeRef<CFUUIDRef> |
+ uuid_object(CFUUIDCreate(kCFAllocatorDefault)); |
+ base::mac::ScopedCFTypeRef<CFStringRef> uuid_string( |
+ CFUUIDCreateString(kCFAllocatorDefault, uuid_object)); |
+ return base::SysCFStringRefToUTF8(uuid_string); |
+} |
+ |
+std::string GetDeviceIdentifier(const char* salt) { |
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
+ NSString* client_id = [defaults stringForKey:kClientIdPreferenceKey]; |
+ |
+ if (!client_id) { |
+ client_id = base::SysUTF8ToNSString(GetRandomId()); |
+ [defaults setObject:client_id forKey:kClientIdPreferenceKey]; |
+ [defaults synchronize]; |
+ } |
+ |
+ NSData* hash_data = [[NSString stringWithFormat:@"%@%s", client_id, |
+ salt ? salt : kDefaultSalt] dataUsingEncoding:NSUTF8StringEncoding]; |
+ |
+ unsigned char hash[CC_SHA256_DIGEST_LENGTH]; |
+ CC_SHA256([hash_data bytes], [hash_data length], hash); |
+ CFUUIDBytes* uuid_bytes = reinterpret_cast<CFUUIDBytes*>(hash); |
+ |
+ base::mac::ScopedCFTypeRef<CFUUIDRef> |
+ uuid_object(CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault, *uuid_bytes)); |
+ base::mac::ScopedCFTypeRef<CFStringRef> device_id( |
+ CFUUIDCreateString(kCFAllocatorDefault, uuid_object)); |
+ return base::SysCFStringRefToUTF8(device_id); |
+} |
+ |
+} // namespace device_util |
+} // namespace ios |