/* * libjingle * Copyright 2004--2009, Google Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef OSX #include #include "talk/base/logging.h" #include "talk/base/macconversion.h" bool p_convertHostCFStringRefToCPPString( const CFStringRef cfstr, std::string& cppstr) { bool result = false; // First this must be non-null, if (NULL != cfstr) { // it must actually *be* a CFString, and not something just masquerading // as one, if (CFGetTypeID(cfstr) == CFStringGetTypeID()) { // and we must be able to get the characters out of it. // (The cfstr owns this buffer; it came from somewhere else, // so someone else gets to take care of getting rid of the cfstr, // and then this buffer will go away automatically.) unsigned length = CFStringGetLength(cfstr); char* buf = new char[1 + length]; if (CFStringGetCString(cfstr, buf, 1 + length, kCFStringEncodingASCII)) { if (strlen(buf) == length) { cppstr.assign(buf); result = true; } } delete [] buf; } } return result; } bool p_convertCFNumberToInt(CFNumberRef cfn, int* i) { bool converted = false; // It must not be null. if (NULL != cfn) { // It must actually *be* a CFNumber and not something just masquerading // as one. if (CFGetTypeID(cfn) == CFNumberGetTypeID()) { CFNumberType ntype = CFNumberGetType(cfn); switch (ntype) { case kCFNumberSInt8Type: SInt8 sint8; converted = CFNumberGetValue(cfn, ntype, static_cast(&sint8)); if (converted) *i = static_cast(sint8); break; case kCFNumberSInt16Type: SInt16 sint16; converted = CFNumberGetValue(cfn, ntype, static_cast(&sint16)); if (converted) *i = static_cast(sint16); break; case kCFNumberSInt32Type: SInt32 sint32; converted = CFNumberGetValue(cfn, ntype, static_cast(&sint32)); if (converted) *i = static_cast(sint32); break; case kCFNumberSInt64Type: SInt64 sint64; converted = CFNumberGetValue(cfn, ntype, static_cast(&sint64)); if (converted) *i = static_cast(sint64); break; case kCFNumberFloat32Type: Float32 float32; converted = CFNumberGetValue(cfn, ntype, static_cast(&float32)); if (converted) *i = static_cast(float32); break; case kCFNumberFloat64Type: Float64 float64; converted = CFNumberGetValue(cfn, ntype, static_cast(&float64)); if (converted) *i = static_cast(float64); break; case kCFNumberCharType: char charvalue; converted = CFNumberGetValue(cfn, ntype, static_cast(&charvalue)); if (converted) *i = static_cast(charvalue); break; case kCFNumberShortType: short shortvalue; converted = CFNumberGetValue(cfn, ntype, static_cast(&shortvalue)); if (converted) *i = static_cast(shortvalue); break; case kCFNumberIntType: int intvalue; converted = CFNumberGetValue(cfn, ntype, static_cast(&intvalue)); if (converted) *i = static_cast(intvalue); break; case kCFNumberLongType: long longvalue; converted = CFNumberGetValue(cfn, ntype, static_cast(&longvalue)); if (converted) *i = static_cast(longvalue); break; case kCFNumberLongLongType: long long llvalue; converted = CFNumberGetValue(cfn, ntype, static_cast(&llvalue)); if (converted) *i = static_cast(llvalue); break; case kCFNumberFloatType: float floatvalue; converted = CFNumberGetValue(cfn, ntype, static_cast(&floatvalue)); if (converted) *i = static_cast(floatvalue); break; case kCFNumberDoubleType: double doublevalue; converted = CFNumberGetValue(cfn, ntype, static_cast(&doublevalue)); if (converted) *i = static_cast(doublevalue); break; case kCFNumberCFIndexType: CFIndex cfindex; converted = CFNumberGetValue(cfn, ntype, static_cast(&cfindex)); if (converted) *i = static_cast(cfindex); break; default: LOG(LS_ERROR) << "got unknown type."; break; } } } return converted; } bool p_isCFNumberTrue(CFNumberRef cfn) { // We assume it's false until proven otherwise. bool result = false; int asInt; bool converted = p_convertCFNumberToInt(cfn, &asInt); if (converted && (0 != asInt)) { result = true; } return result; } #endif // OSX