15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2009, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef OSX 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <CoreFoundation/CoreFoundation.h> 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/logging.h" 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/macconversion.h" 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool p_convertHostCFStringRefToCPPString( 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const CFStringRef cfstr, std::string& cppstr) { 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool result = false; 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // First this must be non-null, 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (NULL != cfstr) { 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // it must actually *be* a CFString, and not something just masquerading 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // as one, 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (CFGetTypeID(cfstr) == CFStringGetTypeID()) { 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // and we must be able to get the characters out of it. 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // (The cfstr owns this buffer; it came from somewhere else, 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // so someone else gets to take care of getting rid of the cfstr, 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // and then this buffer will go away automatically.) 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org unsigned length = CFStringGetLength(cfstr); 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org char* buf = new char[1 + length]; 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (CFStringGetCString(cfstr, buf, 1 + length, kCFStringEncodingASCII)) { 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (strlen(buf) == length) { 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cppstr.assign(buf); 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org result = true; 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete [] buf; 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return result; 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool p_convertCFNumberToInt(CFNumberRef cfn, int* i) { 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool converted = false; 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // It must not be null. 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (NULL != cfn) { 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // It must actually *be* a CFNumber and not something just masquerading 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // as one. 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (CFGetTypeID(cfn) == CFNumberGetTypeID()) { 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CFNumberType ntype = CFNumberGetType(cfn); 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org switch (ntype) { 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberSInt8Type: 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SInt8 sint8; 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint8)); 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(sint8); 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberSInt16Type: 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SInt16 sint16; 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint16)); 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(sint16); 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberSInt32Type: 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SInt32 sint32; 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint32)); 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(sint32); 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberSInt64Type: 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SInt64 sint64; 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint64)); 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(sint64); 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberFloat32Type: 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Float32 float32; 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<void*>(&float32)); 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(float32); 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberFloat64Type: 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Float64 float64; 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<void*>(&float64)); 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(float64); 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberCharType: 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org char charvalue; 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<void*>(&charvalue)); 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(charvalue); 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberShortType: 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org short shortvalue; 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<void*>(&shortvalue)); 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(shortvalue); 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberIntType: 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int intvalue; 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<void*>(&intvalue)); 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(intvalue); 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberLongType: 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org long longvalue; 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<void*>(&longvalue)); 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(longvalue); 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberLongLongType: 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org long long llvalue; 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<void*>(&llvalue)); 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(llvalue); 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberFloatType: 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org float floatvalue; 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<void*>(&floatvalue)); 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(floatvalue); 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberDoubleType: 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org double doublevalue; 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<void*>(&doublevalue)); 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(doublevalue); 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case kCFNumberCFIndexType: 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CFIndex cfindex; 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org converted = CFNumberGetValue(cfn, ntype, 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<void*>(&cfindex)); 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted) *i = static_cast<int>(cfindex); 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org default: 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LOG(LS_ERROR) << "got unknown type."; 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return converted; 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool p_isCFNumberTrue(CFNumberRef cfn) { 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // We assume it's false until proven otherwise. 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool result = false; 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int asInt; 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool converted = p_convertCFNumberToInt(cfn, &asInt); 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (converted && (0 != asInt)) { 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org result = true; 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return result; 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // OSX 177