using CPF.Mac.CoreFoundation; using CPF.Mac.Foundation; using CPF.Mac.ObjCRuntime; using System; using System.Collections.Generic; namespace CPF.Mac.CoreText { internal static class Adapter { public static void AssertWritable(NSDictionary dictionary) { if (!(dictionary is NSMutableDictionary)) { throw new NotSupportedException(); } } public static int? BitwiseOr(int? a, int? b) { if (!a.HasValue) { return b; } return a.Value | (b ?? 0); } public static uint? BitwiseOr(uint? a, uint? b) { if (!a.HasValue) { return b; } return a.Value | (b ?? 0); } public static int? GetInt32Value(IDictionary dictionary, NSObject key) { NSObject nSObject = dictionary[key]; if (nSObject == null) { return null; } return ((NSNumber)nSObject).Int32Value; } public static T[] GetNativeArray(NSDictionary dictionary, NSObject key, Converter converter) { IntPtr value = CFDictionary.GetValue(dictionary.Handle, key.Handle); if (value == IntPtr.Zero || CFArray.GetCount(value) == 0) { return new T[0]; } return NSArray.ArrayFromHandle(value, converter); } public static float? GetSingleValue(IDictionary dictionary, NSObject key) { NSObject nSObject = dictionary[key]; if (nSObject == null) { return null; } return ((NSNumber)nSObject).FloatValue; } public static string[] GetStringArray(IDictionary dictionary, NSObject key) { NSObject nSObject = dictionary[key]; if (nSObject == null) { return new string[0]; } return NSArray.StringArrayFromHandle(nSObject.Handle); } public static string GetStringValue(IDictionary dictionary, NSObject key) { NSObject nSObject = dictionary[key]; if (nSObject == null) { return null; } return ((NSString)nSObject).ToString(); } public static uint? GetUInt32Value(IDictionary dictionary, NSObject key) { NSObject nSObject = dictionary[key]; if (nSObject == null) { return null; } return ((NSNumber)nSObject).UInt32Value; } public static void SetValue(IDictionary dictionary, NSObject key, int? value) { if (value.HasValue) { dictionary[key] = new NSNumber(value.Value); } else { dictionary.Remove(key); } } public static void SetValue(IDictionary dictionary, NSObject key, float? value) { if (value.HasValue) { dictionary[key] = new NSNumber(value.Value); } else { dictionary.Remove(key); } } public static void SetValue(IDictionary dictionary, NSObject key, uint? value) { if (value.HasValue) { dictionary[key] = new NSNumber(value.Value); } else { dictionary.Remove(key); } } public static void SetValue(IDictionary dictionary, NSObject key, IEnumerable value) { List list; if (value == null || (list = new List(value)).Count == 0) { SetValue(dictionary, key, (NSObject)null); } else { using (NSArray value2 = NSArray.FromStrings(list.ToArray())) { SetValue(dictionary, key, value2); } } } public static void SetValue(IDictionary dictionary, NSObject key, NSObject value) { if (value != null) { dictionary[key] = value; } else { dictionary.Remove(key); } } public static void SetValue(IDictionary dictionary, NSObject key, string value) { if (value == null) { SetValue(dictionary, key, (NSObject)null); } else { using (NSString value2 = new NSString(value)) { SetValue(dictionary, key, (NSObject)value2); } } } public static void SetNativeValue(NSDictionary dictionary, NSObject key, IEnumerable value) where T : INativeObject { List handles; if (value == null || (handles = GetHandles(value)).Count == 0) { SetNativeValue(dictionary, key, null); } else { using (CFArray value2 = CFArray.FromIntPtrs(handles.ToArray())) { SetNativeValue(dictionary, key, value2); } } } private static List GetHandles(IEnumerable value) where T : INativeObject { List list = new List(); foreach (T item in value) { list.Add(item.Handle); } return list; } public static void SetNativeValue(NSDictionary dictionary, NSObject key, INativeObject value) { if (value != null) { AssertWritable(dictionary); CFMutableDictionary.SetValue(dictionary.Handle, key.Handle, value.Handle); } else { ((IDictionary)dictionary).Remove(key); } } } }