crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianImageLib/ROFS/Header/SIHeaderROF.cs
--- /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
+ }
+}