| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright 2007 The WebRTC Project Authors. All rights reserved. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license | |
| 5 * that can be found in the LICENSE file in the root of the source | |
| 6 * tree. An additional intellectual property rights grant can be found | |
| 7 * in the file PATENTS. All contributing project authors may | |
| 8 * be found in the AUTHORS file in the root of the source tree. | |
| 9 */ | |
| 10 | |
| 11 #include <cstring> | |
| 12 #include <memory> | |
| 13 #include <sstream> | |
| 14 | |
| 15 #include <sys/utsname.h> | |
| 16 | |
| 17 #include "webrtc/base/checks.h" | |
| 18 #include "webrtc/base/logging.h" | |
| 19 #include "webrtc/base/macutils.h" | |
| 20 #include "webrtc/base/stringutils.h" | |
| 21 | |
| 22 namespace rtc { | |
| 23 | |
| 24 /////////////////////////////////////////////////////////////////////////////// | |
| 25 | |
| 26 bool ToUtf8(const CFStringRef str16, std::string* str8) { | |
| 27 if ((nullptr == str16) || (nullptr == str8)) { | |
| 28 return false; | |
| 29 } | |
| 30 size_t maxlen = CFStringGetMaximumSizeForEncoding(CFStringGetLength(str16), | |
| 31 kCFStringEncodingUTF8) + 1; | |
| 32 std::unique_ptr<char[]> buffer(new char[maxlen]); | |
| 33 if (!buffer || !CFStringGetCString(str16, buffer.get(), maxlen, | |
| 34 kCFStringEncodingUTF8)) { | |
| 35 return false; | |
| 36 } | |
| 37 str8->assign(buffer.get()); | |
| 38 return true; | |
| 39 } | |
| 40 | |
| 41 bool ToUtf16(const std::string& str8, CFStringRef* str16) { | |
| 42 if (nullptr == str16) { | |
| 43 return false; | |
| 44 } | |
| 45 *str16 = CFStringCreateWithBytes(kCFAllocatorDefault, | |
| 46 reinterpret_cast<const UInt8*>(str8.data()), | |
| 47 str8.length(), kCFStringEncodingUTF8, | |
| 48 false); | |
| 49 return nullptr != *str16; | |
| 50 } | |
| 51 | |
| 52 void DecodeFourChar(UInt32 fc, std::string* out) { | |
| 53 std::stringstream ss; | |
| 54 ss << '\''; | |
| 55 bool printable = true; | |
| 56 for (int i = 3; i >= 0; --i) { | |
| 57 char ch = (fc >> (8 * i)) & 0xFF; | |
| 58 if (isprint(static_cast<unsigned char>(ch))) { | |
| 59 ss << ch; | |
| 60 } else { | |
| 61 printable = false; | |
| 62 break; | |
| 63 } | |
| 64 } | |
| 65 if (printable) { | |
| 66 ss << '\''; | |
| 67 } else { | |
| 68 ss.str(""); | |
| 69 ss << "0x" << std::hex << fc; | |
| 70 } | |
| 71 out->append(ss.str()); | |
| 72 } | |
| 73 | |
| 74 static bool GetOSVersion(int* major, int* minor, int* bugfix) { | |
| 75 RTC_DCHECK(major && minor && bugfix); | |
| 76 struct utsname uname_info; | |
| 77 if (uname(&uname_info) != 0) | |
| 78 return false; | |
| 79 | |
| 80 if (strcmp(uname_info.sysname, "Darwin") != 0) | |
| 81 return false; | |
| 82 *major = 10; | |
| 83 | |
| 84 // The market version of macOS is always 4 lower than the internal version. | |
| 85 int minor_version = atoi(uname_info.release); | |
| 86 RTC_CHECK(minor_version >= 6); | |
| 87 *minor = minor_version - 4; | |
| 88 | |
| 89 const char* dot = ::strchr(uname_info.release, '.'); | |
| 90 if (!dot) | |
| 91 return false; | |
| 92 *bugfix = atoi(dot + 1); | |
| 93 return true; | |
| 94 } | |
| 95 | |
| 96 MacOSVersionName GetOSVersionName() { | |
| 97 int major = 0, minor = 0, bugfix = 0; | |
| 98 if (!GetOSVersion(&major, &minor, &bugfix)) { | |
| 99 return kMacOSUnknown; | |
| 100 } | |
| 101 if (major > 10) { | |
| 102 return kMacOSNewer; | |
| 103 } | |
| 104 if ((major < 10) || (minor < 3)) { | |
| 105 return kMacOSOlder; | |
| 106 } | |
| 107 switch (minor) { | |
| 108 case 3: | |
| 109 return kMacOSPanther; | |
| 110 case 4: | |
| 111 return kMacOSTiger; | |
| 112 case 5: | |
| 113 return kMacOSLeopard; | |
| 114 case 6: | |
| 115 return kMacOSSnowLeopard; | |
| 116 case 7: | |
| 117 return kMacOSLion; | |
| 118 case 8: | |
| 119 return kMacOSMountainLion; | |
| 120 case 9: | |
| 121 return kMacOSMavericks; | |
| 122 } | |
| 123 return kMacOSNewer; | |
| 124 } | |
| 125 } // namespace rtc | |
| OLD | NEW |