12#ifndef OPENVPN_APPLECRYPTO_CF_CF_H
13#define OPENVPN_APPLECRYPTO_CF_CF_H
22#include <CoreFoundation/CoreFoundation.h>
26#define OPENVPN_CF_WRAP(cls, castmeth, cftype, idmeth) \
30 static CFTypeRef cast(CFTypeRef obj) \
32 if (obj && CFGetTypeID(obj) == idmeth()) \
38 typedef Wrap<cftype> cls; \
39 inline cls castmeth(CFTypeRef obj) \
41 CFTypeRef o = Type<cftype>::cast(obj); \
43 return cls(cftype(o), GET); \
71 if (rule ==
GET && obj)
104 other.obj_ =
nullptr;
115 if (rule ==
GET && obj)
124 return obj_ !=
nullptr;
127 explicit operator bool() const noexcept
137 CFTypeRef
generic()
const
139 return (CFTypeRef)
obj_;
163 return (CFTypeRef)
ret;
183 std::cerr <<
"CF_UNDEFINED" << std::endl;
205OPENVPN_CF_WRAP(MutableArray, mutable_array_cast, CFMutableArrayRef, CFArrayGetTypeID)
206OPENVPN_CF_WRAP(Dict, dict_cast, CFDictionaryRef, CFDictionaryGetTypeID)
207OPENVPN_CF_WRAP(MutableDict, mutable_dict_cast, CFMutableDictionaryRef, CFDictionaryGetTypeID)
223 return String(CFStringCreateWithCString(kCFAllocatorDefault,
str, kCFStringEncodingUTF8));
238 return String(CFStringCreateWithCString(kCFAllocatorDefault,
str.c_str(), kCFStringEncodingUTF8));
243 return String(CFStringCreateWithCString(kCFAllocatorDefault,
str->c_str(), kCFStringEncodingUTF8));
248 return Number(CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &n));
253 return Number(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &n));
258 return Number(CFNumberCreate(kCFAllocatorDefault, kCFNumberLongLongType, &n));
263 return Number(CFNumberCreate(kCFAllocatorDefault, kCFNumberCFIndexType, &n));
266inline Data
data(
const void *bytes, CFIndex length)
268 return Data(CFDataCreate(kCFAllocatorDefault, (
const UInt8 *)bytes, length));
271inline Array
array(
const void **values, CFIndex numValues)
273 return Array(CFArrayCreate(kCFAllocatorDefault, values, numValues, &kCFTypeArrayCallBacks));
276inline Dict
dict(
const void **keys,
const void **values, CFIndex numValues)
278 return Dict(CFDictionaryCreate(kCFAllocatorDefault,
282 &kCFTypeDictionaryKeyCallBacks,
283 &kCFTypeDictionaryValueCallBacks));
293 return Array(marray(),
CF::GET);
298 return Dict(CFDictionaryCreate(kCFAllocatorDefault,
302 &kCFTypeDictionaryKeyCallBacks,
303 &kCFTypeDictionaryValueCallBacks));
308 return MutableArray(CFArrayCreateMutable(kCFAllocatorDefault, capacity, &kCFTypeArrayCallBacks));
313 return MutableDict(CFDictionaryCreateMutable(kCFAllocatorDefault, capacity, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
316template <
typename DICT>
320 return MutableDict(CFDictionaryCreateMutableCopy(kCFAllocatorDefault, capacity,
dict()));
325inline Error
error(CFStringRef domain, CFIndex code, CFDictionaryRef userInfo)
327 return Error(CFErrorCreate(kCFAllocatorDefault, domain, code, userInfo));
332template <
typename ARRAY>
336 return CFArrayGetCount(
array());
341template <
typename DICT>
345 return CFDictionaryGetCount(
dict());
350template <
typename ARRAY>
353 if (
array.defined() && CFArrayGetCount(
array()) > idx)
354 return CFArrayGetValueAtIndex(
array(), idx);
359template <
typename DICT,
typename KEY>
364 String keystr =
string(key);
365 if (keystr.defined())
366 return CFDictionaryGetValue(
dict(), keystr());
375 const char *
what() const noexcept
override
377 return "cppstring_error";
383 const CFStringEncoding encoding = kCFStringEncodingUTF8;
386 const CFIndex len = CFStringGetLength(
str);
389 const CFIndex maxsize = CFStringGetMaximumSizeForEncoding(len, encoding);
390 char *buf =
new char[maxsize];
391 const Boolean status = CFStringGetCString(
str, buf, maxsize, encoding);
394 std::string
ret(buf);
417 String s(CFCopyDescription(obj));
425template <
typename ARRAY>
428 std::ostringstream
os;
433 for (CFIndex i = 0; i < len; ++i)
448inline bool string_equal(
const String &s1,
const String &s2,
const CFStringCompareFlags compareOptions = 0)
450 return s1.defined() && s2.defined() && CFStringCompare(s1(), s2(), compareOptions) == kCFCompareEqualTo;
456 return Data(CFPropertyListCreateData(kCFAllocatorDefault,
458 kCFPropertyListBinaryFormat_v1_0,
#define OPENVPN_CF_WRAP(cls, castmeth, cftype, idmeth)
Wrap & operator=(T obj)=delete
Wrap(Wrap &&other) noexcept
static Wrap from_generic(CFTypeRef obj, const Rule rule=CREATE)
CFTypeRef generic_release()
Wrap & operator=(const Wrap &other)
Wrap & operator=(Wrap &&other) noexcept
static T cast(CFTypeRef obj)
Wrap(T obj, const Rule rule=CREATE)
void reset(T obj=nullptr, const Rule rule=CREATE)
Data data(const void *bytes, CFIndex length)
CFIndex array_len(const ARRAY &array)
MutableArray mutable_array(const CFIndex capacity=0)
std::string array_to_string(const ARRAY &array, const char delim=',')
MutableDict mutable_dict_copy(const DICT &dict, const CFIndex capacity=0)
Array array(const void **values, CFIndex numValues)
Number number_from_int(const int n)
Array const_array(MutableArray &marray)
Generic generic_cast(CFTypeRef obj)
CFTypeRef array_index(const ARRAY &array, const CFIndex idx)
Number number_from_long_long(const long long n)
CFIndex dict_len(const DICT &dict)
String string(const char *str)
Wrap< CFTypeRef > Generic
std::string cppstring(CFStringRef str)
Number number_from_index(const CFIndex n)
Error error(CFStringRef domain, CFIndex code, CFDictionaryRef userInfo)
Number number_from_int32(const SInt32 n)
bool string_equal(const String &s1, const String &s2, const CFStringCompareFlags compareOptions=0)
Dict dict(const void **keys, const void **values, CFIndex numValues)
MutableDict mutable_dict(const CFIndex capacity=0)
std::string description(CFTypeRef obj)
Dict const_dict(MutableDict &mdict)
CFTypeRef dict_index(const DICT &dict, const KEY &key)
Data plist(CFTypeRef obj)
const char * what() const noexcept override
os<< "Session Name: "<< tbc-> session_name<< '\n';os<< "Layer: "<< tbc-> layer str()<< '\n'