1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1102ff9117b54ff67984a451666705d659bb75b0c1Yuriy Shevchuk#if defined(WEBRTC_MAC) || defined(WEBRTC_IOS)
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <CoreFoundation/CoreFoundation.h>
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/logging.h"
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/macconversion.h"
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool p_convertHostCFStringRefToCPPString(
19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  const CFStringRef cfstr, std::string& cppstr) {
20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool result = false;
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // First this must be non-null,
23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (NULL != cfstr) {
24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // it must actually *be* a CFString, and not something just masquerading
25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // as one,
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (CFGetTypeID(cfstr) == CFStringGetTypeID()) {
27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      // and we must be able to get the characters out of it.
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      // (The cfstr owns this buffer; it came from somewhere else,
29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      // so someone else gets to take care of getting rid of the cfstr,
30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      // and then this buffer will go away automatically.)
31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      unsigned length = CFStringGetLength(cfstr);
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      char* buf = new char[1 + length];
33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      if (CFStringGetCString(cfstr, buf, 1 + length, kCFStringEncodingASCII)) {
34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        if (strlen(buf) == length) {
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          cppstr.assign(buf);
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          result = true;
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        }
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      }
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      delete [] buf;
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return result;
44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool p_convertCFNumberToInt(CFNumberRef cfn, int* i) {
47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool converted = false;
48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // It must not be null.
50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (NULL != cfn) {
51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // It must actually *be* a CFNumber and not something just masquerading
52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // as one.
53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (CFGetTypeID(cfn) == CFNumberGetTypeID()) {
54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      CFNumberType ntype = CFNumberGetType(cfn);
55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      switch (ntype) {
56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberSInt8Type:
57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          SInt8 sint8;
58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint8));
59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(sint8);
60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberSInt16Type:
62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          SInt16 sint16;
63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint16));
64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(sint16);
65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberSInt32Type:
67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          SInt32 sint32;
68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint32));
69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(sint32);
70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberSInt64Type:
72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          SInt64 sint64;
73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype, static_cast<void*>(&sint64));
74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(sint64);
75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberFloat32Type:
77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          Float32 float32;
78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype,
79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                       static_cast<void*>(&float32));
80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(float32);
81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberFloat64Type:
83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          Float64 float64;
84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype,
85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                       static_cast<void*>(&float64));
86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(float64);
87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberCharType:
89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          char charvalue;
90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype,
91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                       static_cast<void*>(&charvalue));
92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(charvalue);
93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberShortType:
95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          short shortvalue;
96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype,
97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                       static_cast<void*>(&shortvalue));
98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(shortvalue);
99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberIntType:
101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          int intvalue;
102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype,
103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                       static_cast<void*>(&intvalue));
104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(intvalue);
105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberLongType:
107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          long longvalue;
108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype,
109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                     static_cast<void*>(&longvalue));
110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(longvalue);
111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberLongLongType:
113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          long long llvalue;
114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype,
115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                       static_cast<void*>(&llvalue));
116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(llvalue);
117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberFloatType:
119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          float floatvalue;
120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype,
121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                       static_cast<void*>(&floatvalue));
122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(floatvalue);
123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberDoubleType:
125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          double doublevalue;
126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype,
127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                       static_cast<void*>(&doublevalue));
128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(doublevalue);
129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        case kCFNumberCFIndexType:
131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          CFIndex cfindex;
132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          converted = CFNumberGetValue(cfn, ntype,
133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                       static_cast<void*>(&cfindex));
134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          if (converted) *i = static_cast<int>(cfindex);
135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        default:
137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          LOG(LS_ERROR) << "got unknown type.";
138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          break;
139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      }
140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return converted;
144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool p_isCFNumberTrue(CFNumberRef cfn) {
147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // We assume it's false until proven otherwise.
148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool result = false;
149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int asInt;
150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool converted = p_convertCFNumberToInt(cfn, &asInt);
151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (converted && (0 != asInt)) {
153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    result = true;
154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return result;
157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
15902ff9117b54ff67984a451666705d659bb75b0c1Yuriy Shevchuk#endif  // WEBRTC_MAC || WEBRTC_IOS
160