// // Copyright (c) ZeroC, Inc. All rights reserved. // #import "LocalObject.h" #include #include #include #include @class ICERuntimeException; namespace IceSSL { class Certificate; } NSError* convertException(const std::exception_ptr&); NSError* convertException(const std::exception&); std::exception_ptr convertException(ICERuntimeException*); inline NSString* toNSString(const std::string& s) { return [[NSString alloc] initWithUTF8String:s.c_str()]; } inline std::string fromNSString(NSString* s) { return s == nil ? std::string() : [s UTF8String]; } inline NSObject* toObjC(const std::string& s) { return [[NSString alloc] initWithUTF8String:s.c_str()]; } inline void fromObjC(id object, std::string& s) { s = object == [NSNull null] ? ::std::string() : [object UTF8String]; } NSObject* toObjC(const std::shared_ptr& endpoint); void fromObjC(id object, std::shared_ptr& endpoint); NSObject* toObjC(const std::shared_ptr& cert); template NSMutableArray* toNSArray(const std::vector& seq) { NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity:seq.size()]; for(typename std::vector::const_iterator p = seq.begin(); p != seq.end(); ++p) { NSObject* obj = toObjC(*p); [array addObject:obj]; } return array; } template std::vector& fromNSArray(NSArray* array, std::vector& seq) { if(array != nil) { seq.reserve([array count]); NSEnumerator* enumerator = [array objectEnumerator]; id obj = nil; while((obj = [enumerator nextObject])) { T v; fromObjC(obj, v); seq.push_back(v); } } return seq; } template NSMutableData* toNSData(const std::vector& seq) { NSMutableData* array = [[NSMutableData alloc] initWithLength:seq.size() * sizeof(T)]; T* target = (T*)[array bytes]; for(typename std::vector::const_iterator p = seq.begin(); p != seq.end(); ++p) { *target++ = *p; } return array; } template NSMutableDictionary* toNSDictionary(const std::map& dict) { NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] initWithCapacity:dict.size()]; for(typename std::map::const_iterator p = dict.begin(); p != dict.end(); ++p) { NSObject* key = toObjC(p->first); NSObject* value = toObjC(p->second); [dictionary setObject:value forKey:key]; } return dictionary; } template std::map& fromNSDictionary(NSDictionary* dictionary, std::map& dict) { if(dictionary != nil) { NSEnumerator* enumerator = [dictionary keyEnumerator]; id obj = nil; while((obj = [enumerator nextObject])) { K k; fromObjC(obj, k); V v; fromObjC([dictionary objectForKey:obj], v); dict.insert(std::pair(k, v)); } } return dict; }