blob: c05526affb73fb36d0f8f28113ebc951849b7f98 [file] [log] [blame]
/*
* Copyright 2007 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include <memory>
#include <sstream>
#include <CoreServices/CoreServices.h>
#include "webrtc/base/common.h"
#include "webrtc/base/logging.h"
#include "webrtc/base/macutils.h"
#include "webrtc/base/stringutils.h"
namespace rtc {
///////////////////////////////////////////////////////////////////////////////
bool ToUtf8(const CFStringRef str16, std::string* str8) {
if ((NULL == str16) || (NULL == str8)) {
return false;
}
size_t maxlen = CFStringGetMaximumSizeForEncoding(CFStringGetLength(str16),
kCFStringEncodingUTF8) + 1;
std::unique_ptr<char[]> buffer(new char[maxlen]);
if (!buffer || !CFStringGetCString(str16, buffer.get(), maxlen,
kCFStringEncodingUTF8)) {
return false;
}
str8->assign(buffer.get());
return true;
}
bool ToUtf16(const std::string& str8, CFStringRef* str16) {
if (NULL == str16) {
return false;
}
*str16 = CFStringCreateWithBytes(kCFAllocatorDefault,
reinterpret_cast<const UInt8*>(str8.data()),
str8.length(), kCFStringEncodingUTF8,
false);
return NULL != *str16;
}
void DecodeFourChar(UInt32 fc, std::string* out) {
std::stringstream ss;
ss << '\'';
bool printable = true;
for (int i = 3; i >= 0; --i) {
char ch = (fc >> (8 * i)) & 0xFF;
if (isprint(static_cast<unsigned char>(ch))) {
ss << ch;
} else {
printable = false;
break;
}
}
if (printable) {
ss << '\'';
} else {
ss.str("");
ss << "0x" << std::hex << fc;
}
out->append(ss.str());
}
static bool GetGestalt(OSType ostype, int* value) {
ASSERT(NULL != value);
SInt32 native_value;
OSStatus result = Gestalt(ostype, &native_value);
if (noErr == result) {
*value = native_value;
return true;
}
std::string str;
DecodeFourChar(ostype, &str);
LOG_E(LS_ERROR, OS, result) << "Gestalt(" << str << ")";
return false;
}
static bool GetOSVersion(int* major, int* minor, int* bugfix) {
ASSERT(major && minor && bugfix);
if (!GetGestalt(gestaltSystemVersion, major)) {
return false;
}
if (*major < 0x1040) {
*bugfix = *major & 0xF;
*minor = (*major >> 4) & 0xF;
*major = (*major >> 8);
return true;
}
return GetGestalt(gestaltSystemVersionMajor, major) &&
GetGestalt(gestaltSystemVersionMinor, minor) &&
GetGestalt(gestaltSystemVersionBugFix, bugfix);
}
MacOSVersionName GetOSVersionName() {
int major = 0, minor = 0, bugfix = 0;
if (!GetOSVersion(&major, &minor, &bugfix)) {
return kMacOSUnknown;
}
if (major > 10) {
return kMacOSNewer;
}
if ((major < 10) || (minor < 3)) {
return kMacOSOlder;
}
switch (minor) {
case 3:
return kMacOSPanther;
case 4:
return kMacOSTiger;
case 5:
return kMacOSLeopard;
case 6:
return kMacOSSnowLeopard;
case 7:
return kMacOSLion;
case 8:
return kMacOSMountainLion;
case 9:
return kMacOSMavericks;
}
return kMacOSNewer;
}
} // namespace rtc