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