diff -r 000000000000 -r 044383f39525 imgtools/romtools/rofsbuild/r_smrimage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/romtools/rofsbuild/r_smrimage.cpp Tue Oct 27 16:36:35 2009 +0000 @@ -0,0 +1,227 @@ +/* +* Copyright (c) 1996-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: +* +*/ + + +#include +#include +#include + +#ifdef __VC32__ + #ifdef __MSVCDOTNET__ + #include + #include + #else //__MSVCDOTNET__ + #include + #include + #endif //__MSVCDOTNET__ +#else // !__VC32__ +#ifdef __TOOLS2__ + #include + #include + #include + #include + using namespace std; +#else + #include + #include +#endif + +#endif //__VC32__ +#include +#include "h_utl.h" +#include "r_smrimage.h" + +CSmrImage::CSmrImage(CObeyFile* aObeyFile) + :iObeyFile(aObeyFile) +{ + HMem::Set(&iSmrRomHeader, 0, sizeof(SSmrRomHeader)); +} +CSmrImage::~CSmrImage() +{ +} +TBool CSmrImage::SetImageName(const StringVector& aValues) +{ + if(aValues.size() == 0) + { + Print(EError, "Keyword Imageanme has not been set!"); + return EFalse; + + } + if(aValues.size() > 1) + { + Print(EError, "Keyword Imagename has been set more than one time!"); + return EFalse; + } + iImageName = aValues.at(0); + if(iImageName.find(".img") == std::string::npos) + { + iImageName += ".img"; + } + return ETrue; +} +TBool CSmrImage::SetFormatVersion(const StringVector& aValues) +{ + if(aValues.size() == 0) + { + Print(EError, "keyword formatversion has not been set!"); + return EFalse; + } + if(aValues.size() > 1) + { + Print(EError, "Keyword Formatversion has been set more than one time!"); + return EFalse; + } + iSmrRomHeader.iImageVersion = StrToInt(aValues.at(0).c_str()); + return ETrue; +} +TBool CSmrImage::SetHcrData(const StringVector& aValues) +{ + + if(aValues.size() == 0) + { + Print(EError, "keyword hcrdata has not been set!"); + return EFalse; + } + if(aValues.size() > 1) + { + Print(EError, "Keyword hcrdata has been set more than one time!"); + return EFalse; + } + iHcrData = aValues.at(0); +#if defined(__MSVCDOTNET__) || defined(__TOOLS2__) + ifstream is(iHcrData.c_str(), ios_base::binary ); +#else //!__MSVCDOTNET__ + ifstream is(iHcrData.c_str(), ios::nocreate | ios::binary ); +#endif //__MSVCDOTNET__ + if(!is) + { + Print(EError, "HCR data file: %s dose not exist!", iHcrData.c_str()); + return EFalse; + } + TUint32 magicWord = 0; + is.read(reinterpret_cast(&magicWord),sizeof(TUint32)); + if(0x66524348 != magicWord){ + Print(EError, "HCR data file: %s is an invalid HCR data file!", iHcrData.c_str()); + return EFalse; + } + is.close(); + return ETrue; +} +TBool CSmrImage::SetPayloadUID(const StringVector& aValues) +{ + + if(aValues.size() == 0) + { + Print(EError, "keyword PayloadUID has not been set!"); + return EFalse; + } + if(aValues.size() > 1) + { + Print(EError, "Keyword PayloadUID has been set more than one time!"); + return EFalse; + } + iSmrRomHeader.iPayloadUID = StrToInt(aValues.at(0).c_str()); + return ETrue; +} +TBool CSmrImage::SetPayloadFlags(const StringVector& aValues) +{ + + if(aValues.size() == 0) + { + Print(EError, "keyword Payloadflags has not been set!"); + return EFalse; + } + if(aValues.size() > 1) + { + Print(EError, "Keyword Payloadfalgs has been set more than one time!"); + return EFalse; + } + iSmrRomHeader.iPayloadFlags = StrToInt(aValues.at(0).c_str()); + return ETrue; +} +TUint32 CSmrImage::StrToInt(const char* aStr) +{ + + TUint32 value; +#ifdef __TOOLS2__ + istringstream val(aStr); +#else + istrstream val(aStr, strlen(aStr)); +#endif +#if defined(__MSVCDOTNET__) || defined(__TOOLS2__) + val >> setbase(0); +#endif //__MSVCDOTNET + val >> value; + return value; +} +TInt CSmrImage::Initialise() +{ + TInt result = KErrGeneral; + if(! SetImageName(iObeyFile->getValues("imagename"))) + return result; + if(! SetFormatVersion(iObeyFile->getValues("formatversion"))) + return result; + if(! SetHcrData(iObeyFile->getValues("hcrdata"))) + return result; + if(! SetPayloadUID(iObeyFile->getValues("payloaduid"))) + return result; + if(! SetPayloadFlags(iObeyFile->getValues("payloadflags"))) + return result; + result = KErrNone; + return result; +} +TInt CSmrImage::CreateImage() +{ + TInt imageSize = 0; + ifstream is; + is.open(iHcrData.c_str(), ios::binary); + if(!is) + { + Print(EError, "Open HCR data file: %s error!\n", iHcrData.c_str()); + return KErrGeneral; + } + is.seekg(0, ios::end); + TInt fsize = is.tellg(); + imageSize = sizeof(SSmrRomHeader) + fsize; + imageSize += (4 - imageSize) & 3; + char* vImage = new (std::nothrow) char[imageSize]; + if(vImage == NULL) + { + Print(EError, "Not enough system memory generate SMR partition!\n"); + return KErrNoMemory; + } + HMem::Set(vImage, 0, imageSize); + HMem::Copy(vImage, &iSmrRomHeader, sizeof(SSmrRomHeader)); + SSmrRomHeader* pSmrHeader = (SSmrRomHeader *) vImage; + pSmrHeader->iFingerPrint[0] = 0x5F524D53; + pSmrHeader->iFingerPrint[1] = 0x54524150; + is.seekg(0, ios::beg); + is.read(vImage + sizeof(SSmrRomHeader), fsize); + pSmrHeader->iPayloadChecksum = HMem::CheckSum((TUint *)(vImage + sizeof(SSmrRomHeader)), imageSize - sizeof(SSmrRomHeader)); + pSmrHeader->iImageSize = imageSize; + pSmrHeader->iImageTimestamp = time(0); + ofstream os(iImageName.c_str(), ios::binary); + os.write(vImage, imageSize); + os.close(); + is.close(); + delete[] vImage; + + + return KErrNone; + + +}