Beispiel #1
0
 public void CFNumberRoundTrip_Int32(int number)
 {
     using (var cfNumber = new CFNumber(number))
         Assert.Equal(number, cfNumber.ToInt32());
 }
Beispiel #2
0
        protected override bool StorageTryGetValue(
            string key,
            Type valueType,
            TypeCode valueTypeCode,
            out object value)
        {
            using (var cfKey = new CFString(key)) {
                var valuePtr = CFPreferences.CopyValue(
                    cfKey.Handle,
                    applicationId.Handle,
                    CFPreferences.kCFPreferencesCurrentUser,
                    CFPreferences.kCFPreferencesAnyHost);

                if (valuePtr == IntPtr.Zero)
                {
                    value = null;
                    return(false);
                }

                var typeId = CoreFoundation.CFGetTypeID(valuePtr);

                if (typeId == CoreFoundation.CFTypeID.CFBoolean)
                {
                    value = CFBoolean.ToBoolean(valuePtr);
                    return(true);
                }

                if (typeId == CoreFoundation.CFTypeID.CFString)
                {
                    using (var cfString = new CFString(valuePtr))
                        value = cfString.ToString();
                    return(true);
                }

                if (typeId == CoreFoundation.CFTypeID.CFNumber)
                {
                    using (var cfNumber = new CFNumber(valuePtr)) {
                        switch (cfNumber.Type)
                        {
                        case CFNumberType.SInt8:
                        case CFNumberType.Char:
                            value = valueTypeCode == TypeCode.Byte
                                ? cfNumber.ToByte()
                                : (object)cfNumber.ToSByte();
                            return(true);

                        case CFNumberType.SInt16:
                        case CFNumberType.Short:
                            value = valueTypeCode == TypeCode.UInt16
                                ? cfNumber.ToUInt16()
                                : (object)cfNumber.ToInt16();
                            return(true);

                        case CFNumberType.SInt32:
                        case CFNumberType.Int:
                        case CFNumberType.Long:
                            value = valueTypeCode == TypeCode.UInt32
                                ? cfNumber.ToUInt32()
                                : (object)cfNumber.ToInt32();
                            return(true);

                        case CFNumberType.SInt64:
                        case CFNumberType.LongLong:
                        case CFNumberType.CFIndex:
                        case CFNumberType.NSInteger:
                            value = valueTypeCode == TypeCode.UInt64
                                ? cfNumber.ToUInt64()
                                : (object)cfNumber.ToInt64();
                            return(true);

                        case CFNumberType.Float32:
                        case CFNumberType.Float:
                            value = cfNumber.ToSingle();
                            return(true);

                        case CFNumberType.Float64:
                        case CFNumberType.Double:
                        case CFNumberType.CGFloat:
                            value = cfNumber.ToDouble();
                            return(true);
                        }
                    }
                }

                if (typeId == CoreFoundation.CFTypeID.CFArray)
                {
                    try {
                        value = CFArray
                                .FromCFStringArray(valuePtr)
                                ?.ToArray();
                        return(value != null);
                    } catch {
                        value = null;
                        return(false);
                    }
                }

                value = null;
                return(false);
            }
        }