1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* 2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * 4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */ 10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1102ff9117b54ff67984a451666705d659bb75b0c1Yuriy Shevchuk#if defined(WEBRTC_MAC) || defined(WEBRTC_IOS) 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <CoreFoundation/CoreFoundation.h> 14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/logging.h" 16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/macconversion.h" 17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool p_convertHostCFStringRefToCPPString( 19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const CFStringRef cfstr, std::string& cppstr) { 20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool result = false; 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // First this must be non-null, 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (NULL != cfstr) { 24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // it must actually *be* a CFString, and not something just masquerading 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // as one, 26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (CFGetTypeID(cfstr) == CFStringGetTypeID()) { 27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // and we must be able to get the characters out of it. 28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // (The cfstr owns this buffer; it came from somewhere else, 29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // so someone else gets to take care of getting rid of the cfstr, 30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // and then this buffer will go away automatically.) 31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org unsigned length = CFStringGetLength(cfstr); 32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char* buf = new char[1 + length]; 33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (CFStringGetCString(cfstr, buf, 1 + length, kCFStringEncodingASCII)) { 34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (strlen(buf) == length) { 35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org cppstr.assign(buf); 36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = true; 37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete [] buf; 40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return result; 44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool p_convertCFNumberToInt(CFNumberRef cfn, int* i) { 47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool converted = false; 48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // It must not be null. 50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (NULL != cfn) { 51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // It must actually *be* a CFNumber and not something just masquerading 52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // as one. 53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (CFGetTypeID(cfn) == CFNumberGetTypeID()) { 54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CFNumberType ntype = CFNumberGetType(cfn); 55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org switch (ntype) { 56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberSInt8Type: 57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SInt8 sint8; 58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint8)); 59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(sint8); 60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberSInt16Type: 62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SInt16 sint16; 63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint16)); 64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(sint16); 65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberSInt32Type: 67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SInt32 sint32; 68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint32)); 69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(sint32); 70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberSInt64Type: 72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SInt64 sint64; 73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint64)); 74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(sint64); 75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberFloat32Type: 77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Float32 float32; 78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, 79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<void*>(&float32)); 80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(float32); 81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberFloat64Type: 83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Float64 float64; 84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, 85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<void*>(&float64)); 86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(float64); 87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberCharType: 89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char charvalue; 90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, 91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<void*>(&charvalue)); 92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(charvalue); 93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberShortType: 95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org short shortvalue; 96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, 97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<void*>(&shortvalue)); 98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(shortvalue); 99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberIntType: 101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int intvalue; 102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, 103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<void*>(&intvalue)); 104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(intvalue); 105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberLongType: 107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org long longvalue; 108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, 109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<void*>(&longvalue)); 110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(longvalue); 111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberLongLongType: 113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org long long llvalue; 114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, 115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<void*>(&llvalue)); 116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(llvalue); 117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberFloatType: 119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org float floatvalue; 120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, 121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<void*>(&floatvalue)); 122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(floatvalue); 123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberDoubleType: 125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double doublevalue; 126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, 127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<void*>(&doublevalue)); 128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(doublevalue); 129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org case kCFNumberCFIndexType: 131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CFIndex cfindex; 132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org converted = CFNumberGetValue(cfn, ntype, 133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<void*>(&cfindex)); 134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted) *i = static_cast<int>(cfindex); 135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org default: 137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_ERROR) << "got unknown type."; 138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return converted; 144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool p_isCFNumberTrue(CFNumberRef cfn) { 147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // We assume it's false until proven otherwise. 148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool result = false; 149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int asInt; 150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool converted = p_convertCFNumberToInt(cfn, &asInt); 151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (converted && (0 != asInt)) { 153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = true; 154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return result; 157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 15902ff9117b54ff67984a451666705d659bb75b0c1Yuriy Shevchuk#endif // WEBRTC_MAC || WEBRTC_IOS 160