/// <summary> /// Push new context collection state to internal stack. /// </summary> /// <param name="header">Header of collection object.</param> /// <param name="count">Items count of collection object. If collection is map, this value indicates count of entries.</param> public void NewContextCollection( MessagePackHeader header, uint count ) { #if DEBUG Contract.Assert( ( header.Type & MessageType.IsRawBinary ) == 0, header.Type.ToString() ); #endif this._collectionContextStack.Push( CollectionContextState.Create( header, count ) ); }
private static MessagePackHeader[] InitializeHeaderArray() { MessagePackHeader[] result = new MessagePackHeader[ 0x100 ]; for ( int i = 0; i < 0x80; i++ ) { result[ i ] = new MessagePackHeader( MessageType.PositiveFixNum, i ); } for ( int i = 0x80; i < 0x90; i++ ) { result[ i ] = new MessagePackHeader( MessageType.FixMap, i & 0x0f ); } for ( int i = 0x90; i < 0xa0; i++ ) { result[ i ] = new MessagePackHeader( MessageType.FixArray, i & 0x0f ); } for ( int i = 0xa0; i < 0xc0; i++ ) { result[ i ] = new MessagePackHeader( MessageType.FixRaw, i & 0x1f ); } result[ 0xc0 ] = MessageType.Nil; // 0xc1 : Undefined result[ 0xc2 ] = MessageType.False; result[ 0xc3 ] = MessageType.True; // 0xc4-0xc9 : Undefined result[ 0xca ] = MessageType.Single; // 1 result[ 0xcb ] = MessageType.Double; result[ 0xcc ] = MessageType.UInt8; result[ 0xcd ] = MessageType.UInt16; result[ 0xce ] = MessageType.UInt32; result[ 0xcf ] = MessageType.UInt64; result[ 0xd0 ] = MessageType.Int8; result[ 0xd1 ] = MessageType.Int16; result[ 0xd2 ] = MessageType.Int32; result[ 0xd3 ] = MessageType.Int64; // 0xd4-0xd9 : Undefined result[ 0xda ] = MessageType.Raw16; result[ 0xdb ] = MessageType.Raw32; result[ 0xdc ] = MessageType.Array16; result[ 0xdd ] = MessageType.Array32; result[ 0xde ] = MessageType.Map16; result[ 0xdf ] = MessageType.Map32; for ( int i = 0xe0; i < 0x100; i++ ) { result[ i ] = new MessagePackHeader( MessageType.NegativeFixNum, i & 0x1f ); } return result; }
/// <summary> /// Create <see cref="MessagePackObject"/> which wraps appropriate empty collection. /// </summary> /// <param name="header">Header which has type information.</param> /// <returns><see cref="MessagePackObject"/> which wraps appropriate empty collection.</returns> private static MessagePackObject CreateEmptyCollection( MessagePackHeader header ) { Contract.Assert( header.ValueOrLength == 0, header.ToString() ); if ( ( header.Type & MessageType.IsArray ) != 0 ) { return new MessagePackObject( _emptyArray, true ); } else if ( ( header.Type & MessageType.IsMap ) != 0 ) { return new MessagePackObject( _emptyMap, true ); } else { return _emptyBinary.Value; } }
/// <summary> /// Transit current stage to unpackContextCollection stage with cleanuping states. /// </summary> private void TransitToUnpackContextCollection() { this._next = this._unpackHeader; this._isInCollection = true; this._contextValueHeader = MessagePackHeader.Null; this._bytesBuffer = BytesBuffer.Null; }
private bool UnpackHeader( Stream source, UnpackingMode unpackingMode, out MessagePackObject? result ) { var b = source.ReadByte(); if ( b < 0 ) { result = null; return false; } this._readByteLength++; this._contextValueHeader = _headerArray[ b ]; return _headerUnpackings[ b ]( this, b, source, unpackingMode, out result ); }
public static CollectionContextState Create( MessagePackHeader header, uint count ) { if ( ( header.Type & MessageType.IsArray ) != 0 ) { return new ArrayForgettingCollectionContextState( count ); } else if ( ( header.Type & MessageType.IsMap ) != 0 ) { return new MapForgettingCollectionContextState( count ); } else { throw new InvalidMessagePackStreamException(); } }