// reads as much info as it can // at least captions and icons must be setup on return from this method (using defaults if necessary) TBool CAppInfoReader::ReadL() { TUint fileOffset = 0; TInt fileLength = 0; TUid firstUid(KExecutableImageUidVal); TUid middleUid(KUidApp); TInt err; TInt LocalizeError = 0; TUid reguid; CResourceFile* registrationFile = new CResourceFile(iRegistrationFileName, fileOffset, fileLength); if(NULL==registrationFile) { std::string errMsg= "Failed : Error in Reading File. Memory Allocation Failed"; throw CResourceFileException(errMsg); } if(registrationFile) { iAppUid = registrationFile->ReadAppUidL(); if(!iAppUid.GetUid()) { std::string errMsg= "Failed : Invalid Resource File. Null Application UID."; throw CResourceFileException(errMsg); } reguid = registrationFile->ReadFileUidL(); if(reguid.GetUid()!= KUidAppRegistrationResourceFile) { std::string errMsg= "Failed : Invalid Resource File. UID2 is not defined."; throw CResourceFileException(errMsg); } } // set the TUidType for the app binary // cannot read the TEntry info from the app binary because it's in \sys\bin iAppBinaryUidType = TUidType(firstUid, middleUid, iAppUid); RResourceReader resourceReader; resourceReader.OpenL(registrationFile, KAppRegistrationInfoResourceId); TUint localisableResourceId = 1; // only initialising this here to keep the compiler happy, as it's concerned that the variable might be used without having been initialised. The variable should be initialised later, before it's used try { ReadMandatoryInfoL(resourceReader); err = ReadNonLocalisableInfoL(resourceReader, localisableResourceId); if (!err) { err = ReadNonLocalisableOptionalInfoL(resourceReader, registrationFile); } } catch(const CResourceFileException& aObject) { delete registrationFile; cout<< aObject.GetMsg()<< endl; return EFalse; // might have read something, but failed to setup enough info to make it worthwhile trying to read any more } TBool useDefaultIcons = ETrue; if(iLocalisableResourceFileName) { std::string localizeFileName = Ptr16ToString(iLocalisableResourceFileName); std::string folder; std::string file; size_t found; std::string iLocalPath(iDrivePath); #ifdef __LINUX__ found=localizeFileName.find_last_of("//"); #else found=localizeFileName.find_last_of("/\\"); #endif if(found) folder = localizeFileName.substr(0,found); else { #ifdef __LINUX__ folder.assign("/"); #else folder.assign("\\"); #endif } file = localizeFileName.substr(found+1); file.append("."); iLocalPath.append(folder); std::wstring iFilePath = string2wstring(iLocalPath); std::wstring iFileName = string2wstring(file); #ifdef __LINUX__ iLocalPath.append("/"); #else iLocalPath.append("\\"); #endif std::list<std::wstring> locDirs; GetDirContents( iFilePath, locDirs ); std::list<std::wstring>::iterator curr = locDirs.begin(); for( curr = locDirs.begin(); curr != locDirs.end(); ++curr ) { if (curr->find(iFileName,0) != std::wstring::npos) { std::string fName; std::string sAbsolutePath; sAbsolutePath.assign(iLocalPath); fName = wstring2string( *curr ); sAbsolutePath.append(fName); //cout << sAbsolutePath<<endl; std::string Locale; int iLocale = 0; found=fName.rfind(".r"); if(found!=string::npos) Locale = fName.substr(found+2); else continue; iLocale = atoi(Locale.c_str()); if(!iLocale) iLocale = KNonLocalized; CResourceFile* tlocalisableFile = NULL; try { // open the localisable resource file tlocalisableFile = new CResourceFile(sAbsolutePath, 0, 0); if(NULL==tlocalisableFile) { std::string errMsg= "Failed : Error in Reading File. Memory Allocation Failed"; throw CResourceFileException(errMsg); } if (!err) { if (tlocalisableFile && (localisableResourceId & KResourceOffsetMask)) tlocalisableFile->ConfirmSignatureL(); err = ReadLocalisableInfoLoopL(*tlocalisableFile, localisableResourceId, useDefaultIcons, iLocale); } delete tlocalisableFile; } catch(const CResourceFileException& aObject) { LocalizeError = 1; aObject.Display(); delete tlocalisableFile; } } } } // if anything went wrong, we tell the caller that the read was unsuccessful. Some // of the members of this class may contain data which is not complete, but this doesn't matter // because the caller shouldn't try to access the data if the read was unsuccessful TBool readSuccessful = 0; if(!LocalizeError) readSuccessful = (err == KErrNone); delete registrationFile; return readSuccessful; }
TBool CAppInfoReader::ReadL(const std::vector<FileDescription*>& aFileDescription, std::string& aRomPath, int aInRom ) { TUint fileOffset = 0; TInt fileLength = 0; TUid firstUid(KExecutableImageUidVal); TUid middleUid(KUidApp); TInt err; TInt LocalizeError = 0; TUid reguid; CResourceFile* registrationFile = new CResourceFile(iRegistrationFileName, fileOffset, fileLength); if(NULL==registrationFile) { std::string errMsg= "Failed : Error in Reading File. Memory Allocation Failed"; throw CResourceFileException(errMsg); } if(registrationFile) { iAppUid = registrationFile->ReadAppUidL(); if(!iAppUid.GetUid()) { std::string errMsg= "Failed : Invalid Resource File. Null Application UID."; throw CResourceFileException(errMsg); } reguid = registrationFile->ReadFileUidL(); if(reguid.GetUid()!= KUidAppRegistrationResourceFile) { std::string errMsg= "Failed : Invalid Resource File. UID2 is not defined."; throw CResourceFileException(errMsg); } } // set the TUidType for the app binary // cannot read the TEntry info from the app binary because it's in \sys\bin iAppBinaryUidType = TUidType(firstUid, middleUid, iAppUid); RResourceReader resourceReader; resourceReader.OpenL(registrationFile, KAppRegistrationInfoResourceId); TUint localisableResourceId = 1; // only initialising this here to keep the compiler happy, as it's concerned that the variable might be used without having been initialised. The variable should be initialised later, before it's used try { ReadMandatoryInfoL(resourceReader); err = ReadNonLocalisableInfoL(resourceReader, localisableResourceId); if (!err) { err = ReadNonLocalisableOptionalInfoL(resourceReader, registrationFile); } } catch(const CResourceFileException& aObject) { delete registrationFile; cout<< aObject.GetMsg()<< endl; return EFalse; // might have read something, but failed to setup enough info to make it worthwhile trying to read any more } TBool useDefaultIcons = ETrue; if(iLocalisableResourceFileName) { std::string localizeFileName = Ptr16ToString(iLocalisableResourceFileName); std::vector<FileDescription*>::const_iterator filedesIter; //std::wstring iFile; std::wstring iLocalizeFile; //std::string aFileName; std::string iLocalFilePath; std::string iLocalFileExt(".r"); for(filedesIter = aFileDescription.begin() ; filedesIter != aFileDescription.end(); ++filedesIter) { iLocalizeFile = (*filedesIter)->GetLocalFile(); iLocalFilePath = wstring2string(iLocalizeFile); if((iLocalFilePath.find(localizeFileName,0) == std::wstring::npos) || (iLocalFilePath.find(iLocalFileExt,0) == std::wstring::npos)) continue; size_t found; std::string Locale; int iLocale = 0; found=iLocalFilePath.find_last_of("."); if(found) Locale = iLocalFilePath.substr(found+2); iLocale = atoi(Locale.c_str()); if(!iLocale) iLocale = KNonLocalized; CResourceFile* tlocalisableFile = NULL; if(aInRom) { std::string LocalFile = FullNameWithoutDrive(iLocalFilePath); iLocalFilePath = aRomPath + LocalFile; } try { // open the localisable resource file tlocalisableFile = new CResourceFile(iLocalFilePath, 0, 0); if(NULL==tlocalisableFile) { std::string errMsg= "Failed : Error in Reading File. Memory Allocation Failed"; throw CResourceFileException(errMsg); } if (!err) { if (tlocalisableFile && (localisableResourceId & KResourceOffsetMask)) tlocalisableFile->ConfirmSignatureL(); err = ReadLocalisableInfoLoopL(*tlocalisableFile, localisableResourceId, useDefaultIcons, iLocale); } delete tlocalisableFile; } catch(const CResourceFileException& aObject) { LocalizeError = 1; aObject.Display(); delete tlocalisableFile; } } } // if anything went wrong, we tell the caller that the read was unsuccessful. Some // of the members of this class may contain data which is not complete, but this doesn't matter // because the caller shouldn't try to access the data if the read was unsuccessful TBool readSuccessful = 0; if(!LocalizeError) readSuccessful = (err == KErrNone); delete registrationFile; return readSuccessful; }