public void Edit() { var dest = new MemoryStream(); long size = 0; { var src1 = new MemoryStream(); var obj = new ContentDescriptionObject( null, 0 ); foreach( var data in TestData ) { obj.Write( data.Key, data.Value ); } obj.Save( src1, dest ); dest.Seek( 0, SeekOrigin.Begin ); size = obj.Size; } var header = new ObjectHeader( dest ); var obj2 = new ContentDescriptionObject( dest, header.Size ); Assert.AreEqual( size, dest.Length, "サイズ" ); foreach( var data in TestData ) { var value = obj2.Read( dest, data.Key ); Assert.AreEqual( data.Value, value, "タグ情報" ); } }
/// <summary> /// インスタンスを初期化します。 /// </summary> /// <param name="src"> /// オブジェクト情報を読み取るストリーム。位置はサイズ情報の直後に設定します。 /// このクラスは未知のオブジェクトを表すため、新規作成はおこなえません。 /// よって、この引数に null を指定した場合は例外となります。 /// </param> /// <param name="header">ヘッダ情報。</param> /// <exception cref="ArgumentNullException">src が null 参照です。</exception> public UnknownObject( Stream src, ObjectHeader header ) { if( src == null || header == null ) { throw new ArgumentNullException( "'src' or 'header' is null." ); } this.Id = header.Guid; this.Size = header.Size; this._position = src.Position; this._src = src; }
public void Create() { // 正常系 var src = new MemoryStream(); var header = new ObjectHeader( Guid.NewGuid(), ObjectHeader.ClassByteSize ); { var test = new UnknownObject( src, header ); Assert.AreEqual( header.Guid, test.Id ); Assert.AreEqual( header.Size, test.Size ); } // 異常系 Assert.Throws< ArgumentNullException >( () => { var obj = new UnknownObject( null, null ); } ); Assert.Throws< ArgumentNullException >( () => { var obj = new UnknownObject( src, null ); } ); Assert.Throws< ArgumentNullException >( () => { var obj = new UnknownObject( null, header ); } ); }
/// <summary> /// インスタンスを初期化します。 /// </summary> /// <param name="src">ASF 形式のデータ ストリーム。</param> /// <exception cref="ArgumentNullException">src が null 参照です。</exception> /// <exception cref="NotSupportedException">src の内容が ASF 形式ではありません。</exception> public HeaderObject( Stream src ) { // 現在は新規作成をサポートせず、必ずストリーム先頭に ASF の HeaderObject が格納されていることを前提とする if( src == null ) { throw new ArgumentNullException( "'src' is null." ); } this._src = src; this._src.Seek( 0, SeekOrigin.Begin ); // ASF ファイルであることをチェック { var info = new ObjectHeader( this._src ); if( info.Guid != HeaderObject.Id ) { throw new NotSupportedException( "ASF file format is not." ); } this.Size = info.Size; } // 子オブジェクト総数と Reserved 1、2 を取得 var count = this._src.ReadInt32(); this._src.Read( this._reserved, 0, 2 ); // オブジェクト読み取り for( var i = 0; i < count; ++i ) { var objectBegin = this._src.Position; var objectHeader = new ObjectHeader( this._src ); if( objectHeader.Guid == FilePropertiesObject.Id ) { this._objects.Add( HeaderObjectType.FileProperties, new FilePropertiesObject( this._src ) ); } else if( objectHeader.Guid == ContentDescriptionObject.Id ) { this._objects.Add( HeaderObjectType.ContentDescription, new ContentDescriptionObject( this._src, objectHeader.Size ) ); } else if( objectHeader.Guid == ExtendedContentDescriptionObject.Id ) { this._objects.Add( HeaderObjectType.ExtendedContentDescription, new ExtendedContentDescriptionObject( this._src, objectHeader.Size ) ); } else { this._unknowns.Add( new UnknownObject( this._src, objectHeader ) ); } // 次のオブジェクト始点へ移動 this._src.Seek( objectBegin + objectHeader.Size, SeekOrigin.Begin ); } }
/// <summary> /// 指定されたファイルがサポート対象の形式であることを調べます。 /// </summary> /// <param name="src">ストリーム。</param> /// <returns>サポート対象なら true。それ以外は false。</returns> public static bool IsSupportedFile( Stream src ) { try { var pos = src.Position; src.Seek( 0, SeekOrigin.Begin ); var info = new ObjectHeader( src ); src.Seek( pos, SeekOrigin.Begin ); return ( info.Guid == HeaderObject.Id ); } catch( Exception e ) { Debug.WriteLine( e.Message ); return false; } }
public void Edit() { var src = new MemoryStream(); { var obj = new ExtendedContentDescriptionObject( null, 0 ); foreach( var data in TestData ) { obj.Write( data.Key, data.Value ); } obj.Save( null, src ); src.Seek( 0, SeekOrigin.Begin ); } var header = new ObjectHeader( src ); var obj2 = new ExtendedContentDescriptionObject( src, header.Size ); Assert.AreEqual( src.Length, obj2.Size, "サイズ" ); foreach( var data in TestData ) { var value = obj2.Read( src, data.Key ); Assert.AreEqual( data.Value, value, "タグ情報" ); } }