/*
* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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: 
*
*/


/**
@file
@internalComponent
@released
*/

#include "typedefs.h"
#include "rofsimage.h"

/** 
Constructor.

@internalComponent
@released

@param aReader - image reader pointer
*/
RofsImage::RofsImage(RCoreImageReader *aReader)
: CCoreImage(aReader) ,
iRofsHeader(0), iRofsExtnHeader(0),iAdjustment(0), 
iImageType((RCoreImageReader::TImageType)0) {
}

/** 
Destructor deletes iRofsHeader and iRofsExtnHeader.

@internalComponent
@released

@param aReader - image reader pointer
*/
RofsImage::~RofsImage() {
	DELETE(iRofsHeader);
	DELETE(iRofsExtnHeader);
}

/** 
Function responsible to read the ROFS image and to construct the tree for the 
elements available in Directory section.

@internalComponent
@released

@return - returns the error code
*/
TInt RofsImage::ProcessImage() {
	int result = CreateRootDir();
	if (result == KErrNone) {
		if (iReader->Open()) {
			iImageType = iReader->ReadImageType();
			if (iImageType == RCoreImageReader::E_ROFS) {
				iRofsHeader = new TRofsHeader;
				result = iReader->ReadCoreHeader(*iRofsHeader);
				if (result != KErrNone){
					cerr << "error is :"<< result << endl;
					return result;
				}


				SaveDirInfo(*iRofsHeader);
				result = ProcessDirectory(0);
			}
			else if (iImageType == RCoreImageReader::E_ROFX) {
				iRofsExtnHeader = new TExtensionRofsHeader ;
				result = iReader->ReadExtensionHeader(*iRofsExtnHeader);
				if(result != KErrNone)
					return result;

				long filePos = iReader->FilePosition();
				iAdjustment = iRofsExtnHeader->iDirTreeOffset - filePos;

				SaveDirInfo(*iRofsExtnHeader);
				result = ProcessDirectory(iAdjustment);
			}
			else {
				result = KErrNotSupported;
			}
		}
		else {
			result = KErrGeneral;
		}
	}
	return result;
}
