1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2009, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef OSX 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <CoreFoundation/CoreFoundation.h> 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/logging.h" 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/macconversion.h" 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool p_convertHostCFStringRefToCPPString( 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const CFStringRef cfstr, std::string& cppstr) { 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool result = false; 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // First this must be non-null, 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (NULL != cfstr) { 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // it must actually *be* a CFString, and not something just masquerading 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // as one, 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (CFGetTypeID(cfstr) == CFStringGetTypeID()) { 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // and we must be able to get the characters out of it. 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // (The cfstr owns this buffer; it came from somewhere else, 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // so someone else gets to take care of getting rid of the cfstr, 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // and then this buffer will go away automatically.) 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch unsigned length = CFStringGetLength(cfstr); 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch char* buf = new char[1 + length]; 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (CFStringGetCString(cfstr, buf, 1 + length, kCFStringEncodingASCII)) { 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (strlen(buf) == length) { 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch cppstr.assign(buf); 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result = true; 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch delete [] buf; 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return result; 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool p_convertCFNumberToInt(CFNumberRef cfn, int* i) { 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool converted = false; 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // It must not be null. 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (NULL != cfn) { 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // It must actually *be* a CFNumber and not something just masquerading 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // as one. 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (CFGetTypeID(cfn) == CFNumberGetTypeID()) { 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch CFNumberType ntype = CFNumberGetType(cfn); 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch switch (ntype) { 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberSInt8Type: 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SInt8 sint8; 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint8)); 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(sint8); 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberSInt16Type: 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SInt16 sint16; 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint16)); 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(sint16); 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberSInt32Type: 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SInt32 sint32; 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint32)); 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(sint32); 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberSInt64Type: 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SInt64 sint64; 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint64)); 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(sint64); 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberFloat32Type: 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Float32 float32; 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static_cast<void*>(&float32)); 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(float32); 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberFloat64Type: 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Float64 float64; 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static_cast<void*>(&float64)); 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(float64); 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberCharType: 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch char charvalue; 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static_cast<void*>(&charvalue)); 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(charvalue); 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberShortType: 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch short shortvalue; 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static_cast<void*>(&shortvalue)); 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(shortvalue); 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberIntType: 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int intvalue; 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static_cast<void*>(&intvalue)); 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(intvalue); 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberLongType: 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch long longvalue; 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static_cast<void*>(&longvalue)); 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(longvalue); 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberLongLongType: 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch long long llvalue; 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static_cast<void*>(&llvalue)); 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(llvalue); 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberFloatType: 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch float floatvalue; 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static_cast<void*>(&floatvalue)); 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(floatvalue); 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberDoubleType: 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch double doublevalue; 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static_cast<void*>(&doublevalue)); 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(doublevalue); 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case kCFNumberCFIndexType: 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch CFIndex cfindex; 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch converted = CFNumberGetValue(cfn, ntype, 150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static_cast<void*>(&cfindex)); 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted) *i = static_cast<int>(cfindex); 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch default: 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch LOG(LS_ERROR) << "got unknown type."; 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return converted; 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool p_isCFNumberTrue(CFNumberRef cfn) { 164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // We assume it's false until proven otherwise. 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool result = false; 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int asInt; 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool converted = p_convertCFNumberToInt(cfn, &asInt); 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (converted && (0 != asInt)) { 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result = true; 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return result; 174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // OSX 177