// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <SystemConfiguration/SystemConfiguration.h>
#include <stddef.h>
#include <string>
#include "base/apple/scoped_cftyperef.h"
#include "base/strings/string_util.h"
#include "base/strings/sys_string_conversions.h"
#include "base/system/sys_info.h"
namespace syncer {
// Returns the Hardware model name, without trailing numbers, if possible. See
// https://everymac.com/systems/by_capability/mac-specs-by-machine-model-machine-id.html
// for example. If an error occurs trying to read the model, this simply returns
// "Unknown".
std::string GetPersonalizableDeviceNameInternal() {
// Do not use NSHost currentHost, as it's very slow. http://crbug.com/138570
SCDynamicStoreContext context = {0};
base::apple::ScopedCFTypeRef<SCDynamicStoreRef> store(
SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("chrome_sync"),
/*callout=*/nullptr, &context));
base::apple::ScopedCFTypeRef<CFStringRef> machine_name(
SCDynamicStoreCopyLocalHostName(store.get()));
if (machine_name) {
return base::SysCFStringRefToUTF8(machine_name.get());
}
// Fall back to get computer name.
base::apple::ScopedCFTypeRef<CFStringRef> computer_name(
SCDynamicStoreCopyComputerName(store.get(), /*nameEncoding=*/nullptr));
if (computer_name) {
return base::SysCFStringRefToUTF8(computer_name.get());
}
// If all else fails, return to using a slightly nicer version of the hardware
// model. Warning: This will soon return just a useless "Mac" string.
std::string model = base::SysInfo::HardwareModelName();
std::optional<base::SysInfo::HardwareModelNameSplit> split =
base::SysInfo::SplitHardwareModelNameDoNotUse(model);
if (!split) {
if (model.empty()) {
return "Unknown";
}
return model;
}
return split.value().category;
}
} // namespace syncer