crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianImageLib/ROFS/Header/SIHeaderROF.cs
changeset 0 818e61de6cd1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianImageLib/ROFS/Header/SIHeaderROF.cs	Thu Feb 11 15:50:58 2010 +0200
@@ -0,0 +1,148 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+* 
+* Description:
+*
+*/
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using SymbianUtils.Strings;
+using SymbianUtils.Streams;
+using SymbianImageLib.Common.Header;
+using SymbianImageLib.Common.Image;
+using SymbianStructuresLib.Compression.Common;
+using SymbianImageLib.ROFS.Structures;
+using SymbianImageLib.ROFS.Header.Types;
+
+namespace SymbianImageLib.ROFS.Header
+{
+    internal abstract class SIHeaderROF : SIHeader
+    {
+        #region Static constructor
+        public static SIHeaderROF New( SIImage aImage, Stream aStream )
+        {
+            byte[] signature = new byte[ 4 ];
+            int readResult = aStream.Read( signature, 0, signature.Length );
+            if ( readResult != 4 )
+            {
+                throw new Exception( "Unable to read ROF signature" );
+            }
+            
+            // Put us back where we were
+            aStream.Seek( -signature.Length, SeekOrigin.Current );
+
+            // Convert signature to string and compare against known types.
+            string headerText = StringParsingUtils.BytesToString( signature );
+            aImage.Trace( "[SymbianImageHeaderROF] New() - headerText: {0}", headerText );
+            //
+            SIHeaderROF ret = null;
+            switch ( headerText )
+            {
+            case "ROFX":
+                ret = new SIHeaderROFS( aImage, aStream );
+                break;
+            case "ROFS":
+                ret = new SIHeaderROFX( aImage, aStream );
+                break;
+            default:
+                throw new NotSupportedException( "Unsupported ROF type" );
+            }
+            //
+            return ret;
+        }
+        #endregion
+
+        #region Constructors
+        protected SIHeaderROF( SIImage aImage, Stream aStream )
+            : base( aImage )
+        {
+            // Skip over identifier
+            aStream.Seek( 4, SeekOrigin.Begin );
+
+            // Read header size and then put us back at the start of the stream
+            // ready to read the entire header.
+            int headerSize = aStream.ReadByte();
+            aStream.Seek( 0, SeekOrigin.Begin );
+            //
+            iHeaderData = new byte[ headerSize ];
+            aStream.Read( iHeaderData, 0, iHeaderData.Length );
+            //
+            ReadHeaderData( iHeaderData );
+        }
+        #endregion
+
+        #region API
+        public static bool IsROFS( Stream aStream )
+        {
+            using ( SymbianStreamReaderLE reader = SymbianStreamReaderLE.New( aStream, SymbianStreamReaderLE.TCloseOperation.EResetPosition ) )
+            {
+                string signature = reader.ReadString( 4 );
+                bool ret = ( signature == KImageROFS || signature == KImageROFX );
+                return ret;
+            }
+        }
+        #endregion
+
+        #region Constants
+        public const string KImageROFS = "ROFS";
+        public const string KImageROFX = "ROFX";
+        #endregion
+
+        #region From SymbianImageHeader
+        public override TSymbianCompressionType CompressionType
+        {
+            get
+            {
+                // ROFS image itself is not compressed - however, the individual ROFS entries 
+                // themselves are likely compressed.
+                return TSymbianCompressionType.ENone;
+            }
+        }
+
+        public override uint HeaderSize
+        {
+            get { return iRofsHdr.Size; }
+        }
+        #endregion
+
+        #region API
+        #endregion
+
+        #region Properties
+        internal TRofsHeader InternalHeader
+        {
+            get { return iRofsHdr; }
+        }
+        #endregion
+
+        #region Internal methods
+        private void ReadHeaderData( byte[] aBuffer )
+        {
+            using ( MemoryStream stream = new MemoryStream( aBuffer ) )
+            {
+                using ( BinaryReader reader = new BinaryReader( stream ) )
+                {
+                    iRofsHdr.Read( reader );
+                }
+            }
+        }
+        #endregion
+
+        #region Data members
+        private TRofsHeader iRofsHdr = new TRofsHeader();
+        private readonly byte[] iHeaderData;
+        #endregion
+    }
+}