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, "タグ情報" );
            }
        }
Beispiel #2
0
        /// <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;
        }
Beispiel #3
0
        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 ); } );
        }
Beispiel #4
0
        /// <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 );
            }
        }
Beispiel #5
0
        /// <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, "タグ情報" );
            }
        }