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