示例#1
0
        /// <summary>
        /// Gets an integer from the settings.
        /// </summary>
        /// <param key="key"></param>
        /// <param key="defaultVaule"></param>
        /// <param key="provider"></param>
        /// <param key="onNotFound"></param>
        /// <returns></returns>
        public short GetInt16Value(object key, short defaultValue, IFormatProvider provider, OnNotFound onNotFound)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }

            // return...
            return((short)this.GetValue(key, typeof(short), defaultValue, provider, onNotFound));
        }
示例#2
0
        /// <summary>
        /// Gets an integer from the settings.
        /// </summary>
        /// <param name="name"></param>
        /// <param name="defaultVaule"></param>
        /// <param name="provider"></param>
        /// <param name="onNotFound"></param>
        /// <returns></returns>
        // mbr - 07-11-2005 - added..
        public Guid GetGuidValue(string name, Guid defaultValue, IFormatProvider provider = null, OnNotFound onNotFound = OnNotFound.ReturnNull)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (name.Length == 0)
            {
                throw new ArgumentOutOfRangeException("'name' is zero-length.");
            }

            // mbr - 04-10-2006 - wasn't handling null.
            object asObject = this.GetValue(name, typeof(Guid), defaultValue, provider, onNotFound);

            if (asObject != null)
            {
                return((Guid)asObject);
            }
            else
            {
                return(defaultValue);
            }
        }
示例#3
0
 /// <summary>
 /// Gets the entity with the given ID.
 /// </summary>
 /// <param name="keyValues"></param>
 /// <returns></returns>
 public abstract object GetById(object[] keyValues, OnNotFound onNotFound);
示例#4
0
        public override object GetValue(string name, Type type, object defaultValue, IFormatProvider provider, OnNotFound onNotFound)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (name.Length == 0)
            {
                throw new ArgumentOutOfRangeException("'name' is zero-length.");
            }

//			// mbr - 07-03-2006 - do we need to flush?
//			CheckFlush();

            // get...
            ConfigItem item     = (ConfigItem)this.Items[name];
            object     useValue = null;

            if (item != null)
            {
                useValue = item.Data;
            }
            else
            {
                useValue = defaultValue;
            }

            // convert...?
            if (type != null)
            {
                return(ConversionHelper.ChangeType(useValue, type, Cultures.System));
            }
            else
            {
                return(useValue);
            }
        }
示例#5
0
 EntityType IEntityDataControl.GetCurrentEntityType(OnNotFound onNotFound)
 {
     return(this.GetCurrentEntityType(onNotFound));
 }
示例#6
0
        /// <summary>
        /// Gets the value in the given field.
        /// </summary>
        /// <param name="field"></param>
        /// <returns></returns>
        protected object GetFieldValue(EntityField field, Type returnType, ConversionFlags conversionFlags, OnNotFound onNotFound)
        {
            if (field == null)
            {
                throw new ArgumentNullException("field");
            }

            // get it...
            int    index = this.GetFieldIndex(field, onNotFound);
            object value = this.GetFieldValue(index, returnType, conversionFlags);

            // mbr - 31-08-2006 - added change in here for numeric types to round values...
            if (field.NeedsRounding)
            {
                if (value == null)
                {
                    throw new InvalidOperationException("value is null.");
                }

                // convert...
                if (value is decimal)
                {
                    value = Math.Round((decimal)value, field.Scale);
                }
                else if (value is double)
                {
                    value = Math.Round((double)value, field.Scale);
                }
                else if (value is float)
                {
                    value = Math.Round((float)value, field.Scale);
                }
                else
                {
                    throw new NotSupportedException(string.Format("Cannot handle '{0}'.", value.GetType()));
                }
            }

            // return...
            return(value);
        }
示例#7
0
        /// <summary>
        /// Gets an integer from the settings.
        /// </summary>
        /// <param key="key"></param>
        /// <param key="defaultVaule"></param>
        /// <param key="provider"></param>
        /// <param key="onNotFound"></param>
        /// <returns></returns>
        // mbr - 07-11-2005 - added..
        public Guid GetGuidValue(object key, Guid defaultValue, IFormatProvider provider, OnNotFound onNotFound)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }

            // mbr - 04-10-2006 - wasn't handling null.
            object asObject = this.GetValue(key, typeof(Guid), defaultValue, provider, onNotFound);

            if (asObject != null)
            {
                return((Guid)asObject);
            }
            else
            {
                return(defaultValue);
            }
        }
示例#8
0
 /// <summary>
 /// Gets an encrypted string from the property bag.
 /// </summary>
 /// <param name="name"></param>
 /// <param name="containerName"></param>
 /// <param name="defaultValue"></param>
 /// <param name="provider"></param>
 /// <param name="onNotFound"></param>
 /// <returns></returns>
 // mbr - 2009-05-01 - added.
 public string GetEncryptedStringValue(string name, OnNotFound onNotFound)
 {
     return(this.GetEncryptedStringValue(name, this.DefaultEncryptionContainerName, onNotFound));
 }
示例#9
0
        private async Task <Message> WireDecodeMessage(UInt32 magic)
        {
            var command         = DataDecoder.DecodeFixedString(await ReceiveExactly(12));
            var payloadSize     = DataDecoder.DecodeUInt32(await ReceiveExactly(4));
            var payloadChecksum = DataDecoder.DecodeUInt32(await ReceiveExactly(4));
            var payload         = await ReceiveExactly(payloadSize.ToIntChecked());

            if (!Messaging.VerifyPayloadChecksum(payloadChecksum, payload))
            {
                throw new Exception($"Checksum failed for {command}");
            }

            var message = new Message
                          (
                Magic: magic,
                Command: command,
                PayloadSize: payloadSize,
                PayloadChecksum: payloadChecksum,
                Payload: payload.ToImmutableArray()
                          );

            switch (message.Command)
            {
            case "addr":
            {
                var addressPayload = NetworkEncoder.DecodeAddressPayload(payload);

                OnReceivedAddresses?.Invoke(owner, addressPayload.NetworkAddresses);
            }
            break;

            case "alert":
            {
                var alertPayload = NetworkEncoder.DecodeAlertPayload(payload);
            }
            break;

            case "block":
            {
                var block = DataDecoder.DecodeBlock(null, payload);

                OnBlock?.Invoke(owner, block);
            }
            break;

            case "getblocks":
            {
                var getBlocksPayload = NetworkEncoder.DecodeGetBlocksPayload(payload);

                OnGetBlocks?.Invoke(owner, getBlocksPayload);
            }
            break;

            case "getheaders":
            {
                var getHeadersPayload = NetworkEncoder.DecodeGetBlocksPayload(payload);

                OnGetHeaders?.Invoke(owner, getHeadersPayload);
            }
            break;

            case "getdata":
            {
                var invPayload = NetworkEncoder.DecodeInventoryPayload(payload);

                OnGetData?.Invoke(owner, invPayload);
            }
            break;

            case "headers":
            {
                var blockHeaders = ImmutableList.CreateBuilder <BlockHeader>();

                var offset      = 0;
                var headerCount = payload.ReadVarInt(ref offset).ToIntChecked();

                for (var i = 0; i < headerCount; i++)
                {
                    var blockHeader = DataDecoder.DecodeBlockHeader(null, payload, ref offset);
                    // ignore tx count var int
                    payload.ReadVarInt(ref offset);

                    blockHeaders.Add(blockHeader);
                }

                OnBlockHeaders?.Invoke(owner, blockHeaders.ToImmutable());
            }
            break;

            case "inv":
            {
                var invPayload = NetworkEncoder.DecodeInventoryPayload(payload);

                OnInventoryVectors?.Invoke(owner, invPayload.InventoryVectors);
            }
            break;

            case "notfound":
            {
                var invPayload = NetworkEncoder.DecodeInventoryPayload(payload);

                OnNotFound?.Invoke(owner, invPayload.InventoryVectors);
            }
            break;

            case "ping":
            {
                OnPing?.Invoke(owner, payload.ToImmutableArray());
            }
            break;

            case "tx":
            {
                var tx = DataDecoder.DecodeEncodedTx(null, payload);

                OnTransaction?.Invoke(owner, tx);
            }
            break;

            case "version":
            {
                var versionPayload = NetworkEncoder.DecodeVersionPayload(payload, payload.Length);

                OnVersion?.Invoke(owner, versionPayload);
            }
            break;

            case "verack":
            {
                OnVersionAcknowledged?.Invoke(owner);
            }
            break;

            default:
            {
                logger.Warn($"Unhandled incoming message: {message.Command}");
            }
            break;
            }

            //TODO
            //if (payloadStream.Position != payloadStream.Length)
            //{
            //    var exMessage = $"Wrong number of bytes read for {message.Command}, parser error: read {payloadStream.Position} bytes from a {payloadStream.Length} byte payload";
            //    Debug.WriteLine(exMessage);
            //    throw new Exception(exMessage);
            //}

            return(message);
        }
示例#10
0
        /// <summary>
        /// Gets an integer from the settings.
        /// </summary>
        /// <param key="key"></param>
        /// <param key="defaultVaule"></param>
        /// <param key="provider"></param>
        /// <param key="onNotFound"></param>
        /// <returns></returns>
        public decimal GetDecimalValue(object key, decimal defaultValue, IFormatProvider provider, OnNotFound onNotFound)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }

            // return...
            return((decimal)this.GetValue(key, typeof(decimal), defaultValue, provider, onNotFound));
        }
示例#11
0
 /// <summary>
 /// Loads the entities for the filter.
 /// </summary>
 /// <returns></returns>
 public virtual object ExecuteEntity(OnNotFound onNotFound)
 {
     return(Database.ExecuteEntity(this, onNotFound));
 }
示例#12
0
        private async Task ReadStream()
        {
            while (!Closing)
            {
                try
                {
                    //try to read a header
                    var hdata = new byte[24];
                    await Stream.ReadAsyncExact(hdata, 0, hdata.Length);

                    var h = new MessageHeader();
                    h.ReadFromPayload(hdata, 0);
                    if (h != null)
                    {
                        //read the payload
                        var pl = new byte[h.PayloadSize];
                        await Stream.ReadAsyncExact(pl, 0, pl.Length);

                        bool checksumOk = false;

                        //verify hash
                        using (var sha = SHA256.Create())
                        {
                            var h1 = sha.ComputeHash(pl);
                            var h2 = sha.ComputeHash(h1);

                            checksumOk = h2[0] == h.Checksum[0] && h2[1] == h.Checksum[1] && h2[2] == h.Checksum[2] && h2[3] == h.Checksum[3];
                        }

                        if (checksumOk)
                        {
                            switch (h.Command)
                            {
                            case "addr\0\0\0\0\0\0\0\0":
                            {
                                if (OnAddr != null)
                                {
                                    var a = new Addr();
                                    a.ReadFromPayload(pl, 0);

                                    await OnAddr?.Invoke(this, a);
                                }
                                break;
                            }

                            case "alert\0\0\0\0\0\0\0":
                            {
                                if (OnAlert != null)
                                {
                                    var a = new Alert();
                                    a.ReadFromPayload(pl, 0);

                                    await OnAlert?.Invoke(this, a);
                                }
                                break;
                            }

                            case "feefilter\0\0\0":
                            {
                                if (OnFeeFilter != null)
                                {
                                    var f = new FeeFilter();
                                    f.ReadFromPayload(pl, 0);

                                    await OnFeeFilter?.Invoke(this, f);
                                }
                                break;
                            }

                            case "filteradd\0\0\0":
                            {
                                if (OnFilterAdd != null)
                                {
                                    var f = new FilterAdd();
                                    f.ReadFromPayload(pl, 0);

                                    await OnFilterAdd?.Invoke(this, f);
                                }
                                break;
                            }

                            case "filterclear\0":
                            {
                                if (OnFilterClear != null)
                                {
                                    var f = new FilterClear();
                                    f.ReadFromPayload(pl, 0);

                                    await OnFilterClear?.Invoke(this, f);
                                }
                                break;
                            }

                            case "filterload\0\0":
                            {
                                if (OnFilterLoad != null)
                                {
                                    var f = new FilterLoad();
                                    f.ReadFromPayload(pl, 0);

                                    await OnFilterLoad?.Invoke(this, f);
                                }
                                break;
                            }

                            case "getaddr\0\0\0\0\0":
                            {
                                if (OnGetAddr != null)
                                {
                                    var ga = new GetAddr();
                                    ga.ReadFromPayload(pl, 0);

                                    await OnGetAddr?.Invoke(this, ga);
                                }
                                break;
                            }

                            case "getblocks\0\0\0":
                            {
                                if (OnGetBlocks != null)
                                {
                                    var gb = new GetBlocks();
                                    gb.ReadFromPayload(pl, 0);

                                    await OnGetBlocks?.Invoke(this, gb);
                                }
                                break;
                            }

                            case "getdata\0\0\0\0\0":
                            {
                                if (OnGetData != null)
                                {
                                    var gd = new GetData();
                                    gd.ReadFromPayload(pl, 0);

                                    await OnGetData?.Invoke(this, gd);
                                }
                                break;
                            }

                            case "getheaders\0\0":
                            {
                                if (OnGetHeaders != null)
                                {
                                    var gh = new GetHeaders();
                                    gh.ReadFromPayload(pl, 0);

                                    await OnGetHeaders?.Invoke(this, gh);
                                }
                                break;
                            }

                            case "headers\0\0\0\0\0":
                            {
                                if (OnHeaders != null)
                                {
                                    var hd = new Headers();
                                    hd.ReadFromPayload(pl, 0);

                                    await OnHeaders?.Invoke(this, hd);
                                }
                                break;
                            }

                            case "inv\0\0\0\0\0\0\0\0\0":
                            {
                                if (OnInv != null)
                                {
                                    var iv = new Inv();
                                    iv.ReadFromPayload(pl, 0);

                                    await OnInv?.Invoke(this, iv);
                                }
                                break;
                            }

                            case "mempool\0\0\0\0\0":
                            {
                                if (OnMemPool != null)
                                {
                                    var mp = new MemPool();
                                    mp.ReadFromPayload(pl, 0);

                                    await OnMemPool?.Invoke(this, mp);
                                }
                                break;
                            }

                            case "notfound\0\0\0\0":
                            {
                                if (OnNotFound != null)
                                {
                                    var nf = new NotFound();
                                    nf.ReadFromPayload(pl, 0);

                                    await OnNotFound?.Invoke(this, nf);
                                }
                                break;
                            }

                            case "ping\0\0\0\0\0\0\0\0":
                            {
                                if (OnPing != null)
                                {
                                    var ping = new Ping();
                                    ping.ReadFromPayload(pl, 0);

                                    await OnPing?.Invoke(this, ping);
                                }
                                break;
                            }

                            case "pong\0\0\0\0\0\0\0\0":
                            {
                                if (OnPong != null)
                                {
                                    var pong = new Pong();
                                    pong.ReadFromPayload(pl, 0);

                                    await OnPong?.Invoke(this, pong);
                                }
                                break;
                            }

                            case "reject\0\0\0\0\0\0":
                            {
                                if (OnReject != null)
                                {
                                    var re = new Reject();
                                    re.ReadFromPayload(pl, 0);

                                    await OnReject?.Invoke(this, re);
                                }
                                break;
                            }

                            case "sendheaders\0":
                            {
                                if (OnSendHeaders != null)
                                {
                                    var sh = new SendHeaders();
                                    sh.ReadFromPayload(pl, 0);

                                    await OnSendHeaders?.Invoke(this, sh);
                                }
                                break;
                            }

                            case "verack\0\0\0\0\0\0":
                            {
                                if (OnVerAck != null)
                                {
                                    var va = new VerAck();
                                    va.ReadFromPayload(pl, 0);

                                    await OnVerAck.Invoke(this, va);
                                }
                                break;
                            }

                            case "version\0\0\0\0\0":
                            {
                                if (OnVersion != null)
                                {
                                    var v = new bitcoin_lib.P2P.Version("");
                                    v.ReadFromPayload(pl, 0);

                                    await OnVersion?.Invoke(this, v);
                                }
                                break;
                            }

                            default:
                            {
                                //Console.WriteLine($"Got cmd: {h.Command}");
                                break;
                            }
                            }
                        }
                        else
                        {
                            Closing = true;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Closing = true;
                }
            }
        }
示例#13
0
 public T GetValue <T>(T defaultValue, OnNotFound onNotFound, [CallerMemberName] string name = null)
 {
     return((T)this.GetValue(name, typeof(T), defaultValue, Cultures.System, onNotFound));
 }
示例#14
0
 public abstract object GetValue(string name, Type type, object defaultValue, IFormatProvider provider = null,
                                 OnNotFound onNotFound = OnNotFound.ReturnNull);
示例#15
0
        /// <summary>
        /// Gets an integer from the settings.
        /// </summary>
        /// <param key="key"></param>
        /// <param key="defaultVaule"></param>
        /// <param key="provider"></param>
        /// <param key="onNotFound"></param>
        /// <returns></returns>
        public bool GetBooleanValue(object key, bool defaultValue, IFormatProvider provider, OnNotFound onNotFound)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }

            // return...
            return((bool)this.GetValue(key, typeof(bool), defaultValue, provider, onNotFound));
        }
示例#16
0
 public T GetValue <T>(string name, T defaultValue = default(T), IFormatProvider provider = null,
                       OnNotFound onNotFound       = OnNotFound.ReturnNull)
 {
     return((T)GetValue(name, typeof(T), defaultValue, provider, onNotFound));
 }
示例#17
0
        /// <summary>
        /// Gets a string from the settings.
        /// </summary>
        /// <param key="key"></param>
        /// <param key="defaultVaule"></param>
        /// <param key="provider"></param>
        /// <param key="onNotFound"></param>
        /// <returns></returns>
        public string GetStringValue(object key, string defaultValue, IFormatProvider provider, OnNotFound onNotFound)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }

            // return...
            return((string)this.GetValue(key, typeof(string), defaultValue, provider, onNotFound));
        }
示例#18
0
        /// <summary>
        /// Gets a date/time from the settings.
        /// </summary>
        /// <param name="name"></param>
        /// <param name="defaultVaule"></param>
        /// <param name="provider"></param>
        /// <param name="onNotFound"></param>
        /// <returns></returns>
        public DateTime GetDateTimeValue(string name, DateTime defaultValue, IFormatProvider provider = null, OnNotFound onNotFound = OnNotFound.ReturnNull)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (name.Length == 0)
            {
                throw new ArgumentOutOfRangeException("'name' is zero-length.");
            }

            // return...
            return((DateTime)this.GetValue(name, typeof(DateTime), defaultValue, provider, onNotFound));
        }
示例#19
0
        /// <summary>
        /// Gets an enumeration value from the settings.
        /// </summary>
        /// <param key="key"></param>
        /// <param key="defaultValue"></param>
        /// <param key="enumerationType"></param>
        /// <param key="provider"></param>
        /// <param key="onNotFound"></param>
        /// <returns></returns>
        public object GetEnumerationValue(object key, object defaultValue, Type enumerationType, IFormatProvider provider, OnNotFound onNotFound)
        {
            if (enumerationType == null)
            {
                throw new ArgumentNullException("enumerationType");
            }
            if (!(enumerationType.IsEnum))
            {
                throw new InvalidOperationException(string.Format("Type '{0}' is not an enumeration type.", enumerationType));
            }

            // get...
            string defaultAsString = null;

            if (defaultValue != null)
            {
                defaultAsString = defaultValue.ToString();
            }
            string asString = this.GetStringValue(key, defaultAsString, provider, onNotFound);

            if (asString != null && asString.Length > 0)
            {
                try
                {
                    return(Enum.Parse(enumerationType, asString, true));
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException(string.Format("Failed to convert '{0}' to '{1}'.", asString, enumerationType), ex);
                }
            }
            else
            {
                return(null);
            }
        }
示例#20
0
        /// <summary>
        /// Gets the value in the given field.
        /// </summary>
        /// <returns></returns>
        protected object GetFieldValue(string fieldName, Type returnType, ConversionFlags conversionFlags, OnNotFound onNotFound)
        {
            if (fieldName == null)
            {
                throw new ArgumentNullException("fieldName");
            }
            if (fieldName.Length == 0)
            {
                throw ExceptionHelper.CreateZeroLengthArgumentException("fieldName");
            }

            // get it...
            int index = this.GetFieldIndex(fieldName, onNotFound);

            return(this.GetFieldValue(index, returnType, conversionFlags));
        }
示例#21
0
 /// <summary>
 /// Gets a value.
 /// </summary>
 /// <param key="key"></param>
 /// <param key="type"></param>
 /// <param key="defaultValue"></param>
 /// <param key="provider"></param>
 /// <param key="onNotFound"></param>
 /// <returns></returns>
 public abstract object GetValue(object key, Type type, object defaultValue, IFormatProvider provider, OnNotFound onNotFound);
示例#22
0
        /// <summary>
        /// Creates a parameter for the given field.
        /// </summary>
        /// <param name="field"></param>
        /// <returns></returns>
        protected SqlStatementParameter CreateParameterForField(EntityField field, bool forceToDbNull, OnNotFound throwIfNotFound)
        {
            if (field == null)
            {
                throw new ArgumentNullException("field");
            }

            // mbr - 27-10-2005 - added ability to force to DBNull...
            object value = null;

            if (forceToDbNull)
            {
                value = DBNull.Value;
            }
            else
            {
                value = this.GetFieldValue(field, null, ConversionFlags.Safe, throwIfNotFound);

                // do we have a DB null equivalent?
                if (field.HasDBNullEquivalent)
                {
                    // check...
                    if (object.Equals(value, field.DBNullEquivalent))
                    {
                        value = DBNull.Value;
                    }
                }

                // if we're null, or a min date time, use DB null.
                if (value == null || (value is DateTime && ((DateTime)value) == DateTime.MinValue))
                {
                    value = DBNull.Value;
                }

                //				// mbr - 27-10-2005 - if we are DBNull, and we have an equivalent, use that...
                //				if(value is DBNull && field.HasDBNullEquivalent)
                //					value = field.DBNullEquivalent;
            }

            // return...
            return(new SqlStatementParameter(field.NativeName.Name, field.DBType, value));
        }
示例#23
0
        /// <summary>
        /// Gets a date/time from the settings.
        /// </summary>
        /// <param key="key"></param>
        /// <param key="defaultVaule"></param>
        /// <param key="provider"></param>
        /// <param key="onNotFound"></param>
        /// <returns></returns>
        public DateTime GetDateTimeValue(object key, DateTime defaultValue, IFormatProvider provider, OnNotFound onNotFound)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }

            // return...
            return((DateTime)this.GetValue(key, typeof(DateTime), defaultValue, provider, onNotFound));
        }
示例#24
0
        public override object GetValue(object key, Type type, object defaultValue, IFormatProvider provider, OnNotFound onNotFound)
        {
            // get it...
            object value = this.GetValue(key);

            // do we have a type?
            if (value != null)
            {
                if (type != null)
                {
                    return(ConversionHelper.ChangeType(value, type, provider));
                }
                else
                {
                    return(value);
                }
            }
            else
            {
                switch (onNotFound)
                {
                case OnNotFound.ReturnNull:
                    return(defaultValue);

                case OnNotFound.ThrowException:
                    throw new InvalidOperationException(string.Format("An item with key '{0}' ({1}) was not found.", key, key.GetType()));

                default:
                    throw new NotSupportedException(string.Format("Cannot handle '{0}' ({1}).", onNotFound, onNotFound.GetType()));
                }
            }
        }
示例#25
0
        /// <summary>
        /// Gets the given value.
        /// </summary>
        /// <param name="name"></param>
        /// <param name="type"></param>
        /// <param name="defaultValue"></param>
        /// <param name="onNotFound">In this case, <see cref="OnNotFound.ReturnNull"></see> means 'return default value'.</param>
        /// <returns></returns>
        public override object GetValue(string name, Type type, object defaultValue, IFormatProvider provider, OnNotFound onNotFound)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (name.Length == 0)
            {
                throw new ArgumentOutOfRangeException("'name' is zero-length.");
            }

            // mbr - 21-07-2006 - type can be null.
            if (type == null)
            {
//				throw new ArgumentNullException("type");
                type = typeof(object);
            }

            // ensure...
            this.EnsureInitialized();

            // look up the value...
            object key   = this.GetKey(name);
            object value = null;
            bool   found = false;

            if (this.InnerValues.Contains(key) == false)
            {
                // load it...
                value = this.LoadValue(name, ref found);

                // did we find it?
                if (found == false)
                {
                    value = MissingItem.Value;
                }

                // add...
                this.InnerValues[key] = value;
            }
            else
            {
                value = this.InnerValues[key];
            }

            // found?
            if (value is MissingItem)
            {
                // now what?
                switch (onNotFound)
                {
                case OnNotFound.ReturnNull:
                    value = defaultValue;
                    break;

                case OnNotFound.ThrowException:
                    throw new InvalidOperationException(string.Format(Cultures.Exceptions, "A value with name '{0}' was not found.", name));

                default:
                    throw new NotSupportedException(string.Format("Cannot handle '{0}' ({1}).", onNotFound, onNotFound.GetType()));
                }
            }

            // return it...
            if (type != typeof(object))
            {
                // were we asked for a type?
                if (typeof(Type).IsAssignableFrom(type) == true)
                {
                    if (value is Type)
                    {
                        return(value);
                    }

                    // value...
                    value = Convert.ToString(value);
                    if (value == null || ((string)value).Length == 0)
                    {
                        if (onNotFound == OnNotFound.ThrowException)
                        {
                            throw new InvalidOperationException(string.Format(Cultures.System, "The value for '{0}' was an empty string, and an empty string cannot be used to load a type.", name));
                        }
                        else
                        {
                            return(null);
                        }
                    }

                    // try and load it...
                    try
                    {
                        return(Type.GetType((string)value, true, true));
                    }
                    catch (Exception ex)
                    {
                        // mbr - 28-05-2006 - if we can't do it -- perhaps we're in the GAC?  look for the name...
                        string[] parts = ((string)value).Split(',');
                        if (parts.Length == 2)
                        {
                            if (parts[1].Trim().ToLower().StartsWith("BootFX.Common"))
                            {
                                AssemblyName asmName = this.GetType().Assembly.GetName();

                                // append...
                                StringBuilder builder = new StringBuilder();
                                builder.Append(value);
                                builder.Append(", Version=");
                                builder.Append(asmName.Version.ToString());
                                builder.Append(", Culture=neutral, PublicKeyToken=");
                                foreach (byte b in asmName.GetPublicKeyToken())
                                {
                                    builder.Append(b.ToString("x2"));
                                }

                                // try again...
                                try
                                {
                                    return(Type.GetType(builder.ToString(), true, true));
                                }
                                catch (Exception ex2)
                                {
                                    throw new InvalidOperationException(string.Format(Cultures.System, "Neither the value '{0}', nor the value '{1}' could be used to load a type.\r\n(Original exception: {2})",
                                                                                      value, builder, ex.Message), ex2);
                                }
                            }
                        }

                        // still failed?
                        throw new InvalidOperationException(string.Format(Cultures.System, "The value '{0}' cannot be used to load a type.", value), ex);
                    }
                }
                else
                {
                    // convert it...
                    return(ConversionHelper.ChangeType(value, type, provider, ConversionFlags.Safe));
                }
            }
            else
            {
                // just return the value...
                return(value);
            }
        }