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'