/// <summary> /// インスタンスを初期化します。 /// </summary> /// <param name="headerObject">タグの所属する ASF オブジェクト。</param> /// <param name="type">データ種別。</param> /// <param name="name">名前。</param> /// <param name="canEdit">編集可能なら true。それ以外は false。</param> internal AsfTagInfo( string name, AsfTagDataType type, bool canEdit, HeaderObjectType headerObject ) { this.HeaderObject = headerObject; this.Name = name; this.Type = type; this.CanEdit = canEdit; }
/// <summary> /// 値を新規作成するための情報から、インスタンスを初期化します。 /// </summary> /// <param name="type">値の型。</param> /// <param name="value">値のバイト配列。</param> public ObjectTagValue( AsfTagDataType type, object value ) { if( type == AsfTagDataType.Binary && value is byte[] ) { this._value = ( byte[] )value; this.Type = ObjectTagValueType.Binary; } else if( type == AsfTagDataType.Bool && value is bool ) { // WMT_TYPE_BOOL は 4 バイトなので uint として扱う this._value = BitConverter.GetBytes( ( uint )( ( bool )value ? 1 : 0 ) ); this.Type = ObjectTagValueType.Bool; } else if( type == AsfTagDataType.Guid && value is Guid ) { // GUID は文字列として扱う this._value = ( ( Guid )value ).ToByteArray(); this.Type = ObjectTagValueType.String; } else if( type == AsfTagDataType.String && value is string ) { this._value = BinaryUtility.StringToBytesUtf16String( ( string )value ); this.Type = ObjectTagValueType.String; } else if( type == AsfTagDataType.UInt16 && value is ushort ) { this._value = BitConverter.GetBytes( ( ushort )value ); this.Type = ObjectTagValueType.UInt16; } else if( type == AsfTagDataType.UInt32 && value is uint ) { this._value = BitConverter.GetBytes( ( uint )value ); this.Type = ObjectTagValueType.UInt32; } else if( type == AsfTagDataType.UInt64 && value is ulong ) { this._value = BitConverter.GetBytes( ( ulong )value ); this.Type = ObjectTagValueType.UInt64; } else { throw new ArgumentException( "Invalid combination of value and type." ); } }
/// <summary> /// インスタンスを初期化します。 /// </summary> /// <param name="name">名前。</param> /// <param name="type">データ種別。</param> internal AsfTagInfo( string name, AsfTagDataType type ) : this(name, type, false) { }
/// <summary> /// インスタンスを初期化します。 /// </summary> /// <param name="name">名前。</param> /// <param name="type">データ種別。</param> /// <param name="canEdit">編集可能なら true。それ以外は false。</param> internal AsfTagInfo( string name, AsfTagDataType type, bool canEdit ) : this(name, type, canEdit, HeaderObjectType.Unknown) { }
/// <summary> /// タグの内容を ASF の値として取得します。 /// </summary> /// <param name="type">ASF のデータ型。</param> /// <param name="src">タグ情報を読み込むストリーム。</param> /// <returns>値。type に適合するデータが存在しない場合は null 参照。</returns> public object Read( AsfTagDataType type, Stream src ) { var value = ( this._value != null ? this._value : this._reader.Read( src ) ); switch( type ) { case AsfTagDataType.Binary: return value; case AsfTagDataType.Bool: return this.ValueOfBool( value ); case AsfTagDataType.Guid: return this.ValueOfGuid( value ); case AsfTagDataType.String: return this.ValueOfString( value ); case AsfTagDataType.UInt16: return this.ValueOfUInt16( value ); case AsfTagDataType.UInt32: return this.ValueOfUInt32( value ); case AsfTagDataType.UInt64: return this.ValueOfUInt64( value ); default: return null; } }