diff -r e8c1ea2c6496 -r 8758140453c0 localisation/apparchitecture/apfile/aprfndr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localisation/apparchitecture/apfile/aprfndr.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,458 @@ +// Copyright (c) 2004-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 "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "aprfndr.h" +#include "APFDEF.H" +#include "APFSTD.H" +#include "../apgrfx/APGAIR.H" +#include +#include "../apgrfx/apprivate.h" +#include + +///////////////////////////// +// CApaAppRegFinder +///////////////////////////// + +EXPORT_C CApaAppRegFinder* CApaAppRegFinder::NewL(const RFs& aFs) + { + CApaAppRegFinder* self=NewLC(aFs); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CApaAppRegFinder* CApaAppRegFinder::NewLC(const RFs& aFs) + { + CApaAppRegFinder* self=new (ELeave) CApaAppRegFinder(aFs); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CApaAppRegFinder::CApaAppRegFinder(const RFs& aFs) + : iFs(aFs), + iListOfFolders(2), + iSidCheckerMap(CApaAppListServer::Self()?CApaAppListServer::Self()->RescanCallBack():TCallBack(NULL,NULL)) +#ifdef SYMBIAN_APPARC_APPINFO_CACHE + ,iRemovableMediaDriveScan(EFalse) +#endif // SYMBIAN_APPARC_APPINFO_CACHE + + { + } + +#ifdef SYMBIAN_APPARC_APPINFO_CACHE +CApaAppRegFinder::~CApaAppRegFinder() + { + iListOfFolders.ResetAndDestroy(); + iListOfFolders.Close(); + iListOfDrives.Close(); + iSidCheckerMap.Close(); + delete iFileList; // should already be deleted and NULL at this point + } +#else +CApaAppRegFinder::~CApaAppRegFinder() + { + iListOfFolders.ResetAndDestroy(); + iListOfFolders.Close(); + if (iListOfDrives) + { + iListOfDrives->Close(); + delete iListOfDrives; + } + iSidCheckerMap.Close(); + + delete iFileList; // should already be deleted and NULL at this point + } +#endif // SYMBIAN_APPARC_APPINFO_CACHE + +void CApaAppRegFinder::ConstructL() + { +#ifdef SYMBIAN_APPARC_APPINFO_CACHE + BuildDriveListL(); +#else + GetDriveListL(); +#endif // SYMBIAN_APPARC_APPINFO_CACHE + GetFolderListL(); + } + +#ifndef SYMBIAN_APPARC_APPINFO_CACHE +void CApaAppRegFinder::GetDriveListL() + { + TDriveList driveList; + User::LeaveIfError(iFs.DriveList(driveList)); + iListOfDrives = new(ELeave) RArray(4); + BuildDriveListL(iFs, driveList, *iListOfDrives); + } +#endif // SYMBIAN_APPARC_APPINFO_CACHE + +_LIT(KAppRegRscSearchPath,"\\private\\10003a3f\\apps\\"); +_LIT(KAppRegRscImportSearchPath,"\\private\\10003a3f\\import\\apps\\"); +_LIT(KAppRegRscImportNonNativeSearchPath,"\\private\\10003a3f\\import\\apps\\NonNative\\Resource\\"); + +void CApaAppRegFinder::GetFolderListL() + { + TPtrC ptr(KAppRegRscSearchPath); + HBufC* searchPath = ptr.AllocLC(); + User::LeaveIfError(iListOfFolders.Append(searchPath)); + CleanupStack::Pop(searchPath); + searchPath = NULL; + + ptr.Set(KAppRegRscImportSearchPath); + searchPath = ptr.AllocLC(); + User::LeaveIfError(iListOfFolders.Append(searchPath)); + CleanupStack::Pop(searchPath); + + ptr.Set(KAppRegRscImportNonNativeSearchPath); + searchPath = ptr.AllocLC(); + User::LeaveIfError(iListOfFolders.Append(searchPath)); + CleanupStack::Pop(searchPath); + } + +#ifndef SYMBIAN_APPARC_APPINFO_CACHE +void CApaAppRegFinder::BuildDriveListL(const RFs& aFs, const TDriveList& aSourceDriveList, RArray& aDestDriveList) + { // static + TInt drive(EDriveY); + TDriveUnitInfo driveUnitInfo; + while(drive >= EDriveA) + { + if (aSourceDriveList[drive]!=KDriveAbsent) + { + TDriveInfo driveInfo; + TInt ret = aFs.Drive(driveInfo,drive); + if (ret==KErrNone) + { + if (driveInfo.iType!=EMediaNotPresent && driveInfo.iType!=EMediaRemote) + { + driveUnitInfo.iDriveUnit=drive; + driveUnitInfo.iDriveAtt=driveInfo.iDriveAtt; + User::LeaveIfError(aDestDriveList.Append(driveUnitInfo)); + } + } + } + --drive; + } + driveUnitInfo.iDriveUnit=EDriveZ; + driveUnitInfo.iDriveAtt=KDriveAttRom; + User::LeaveIfError(aDestDriveList.Append(driveUnitInfo)); + } + +EXPORT_C void CApaAppRegFinder::FindAllAppsL() + { + delete iFileList; + iFileList = NULL; + if(iListOfDrives) + { + iListOfDrives->Close(); + delete iListOfDrives; + iListOfDrives = NULL; + } + GetDriveListL(); + iCurrentIndexInDriveList=-1; + iCurrentIndexInFolderList=0; + iScanStage=EScanStageNonImportROM; + iLastChkedApp = KNullUid; + } + +#else +void CApaAppRegFinder::BuildDriveListL() + { + TDriveList driveList; + User::LeaveIfError(iFs.DriveList(driveList)); + + TInt drive(EDriveY); + TDriveUnitInfo driveUnitInfo; + while(drive >= EDriveA) + { + if (driveList[drive]!=KDriveAbsent) + { + TDriveInfo driveInfo; + TInt ret = iFs.Drive(driveInfo,drive); + if (ret==KErrNone) + { + if (iRemovableMediaDriveScan) + {// iListOfDrives should have list of all the removable drives irrespective of presence of the media + if ((driveInfo.iType != EMediaRemote) && (driveInfo.iDriveAtt & KDriveAttRemovable)) + { + driveUnitInfo.iDriveUnit=drive; + driveUnitInfo.iDriveAtt=driveInfo.iDriveAtt; + User::LeaveIfError(iListOfDrives.Append(driveUnitInfo)); + } + } + else + { + if (driveInfo.iType!=EMediaNotPresent && driveInfo.iType!=EMediaRemote) + { + driveUnitInfo.iDriveUnit=drive; + driveUnitInfo.iDriveAtt=driveInfo.iDriveAtt; + User::LeaveIfError(iListOfDrives.Append(driveUnitInfo)); + } + } + } + } + --drive; + } + if (!iRemovableMediaDriveScan) + { + driveUnitInfo.iDriveUnit=EDriveZ; + driveUnitInfo.iDriveAtt=KDriveAttRom; + User::LeaveIfError(iListOfDrives.Append(driveUnitInfo)); + } + } + +EXPORT_C void CApaAppRegFinder::FindAllRemovableMediaAppsL() + { + iRemovableMediaDriveScan = ETrue; + FindAllAppsL(); + } + +EXPORT_C const RArray& CApaAppRegFinder::DriveList() const + { + return (iListOfDrives); + } + +EXPORT_C void CApaAppRegFinder::FindAllAppsL() + { + delete iFileList; + iFileList = NULL; + iListOfDrives.Reset(); + BuildDriveListL(); + iCurrentIndexInDriveList=-1; + iCurrentIndexInFolderList=0; + iScanStage = EScanStageNonImportROM; + iRemovableMediaDriveScan = EFalse; + iLastChkedApp = KNullUid; + } +#endif // SYMBIAN_APPARC_APPINFO_CACHE + +/** Scans the applications in following order: +1. non-import y-a,z but only on ROM drives +2. import on all non-ROM drives in the order y-a,z +3. import on all ROM drives in the order y-a,z + +Upgrades of apparc server (via Software Install) are currently disallowed. +This means it is not possible to install registration files to \private\10003a3f\apps +(on any drive), so there is no need to scan \private\10003a3f\apps on non ROM based drives. +*/ +EXPORT_C TBool CApaAppRegFinder::NextL(TApaAppEntry& aAppRegistrationEntry, const RPointerArray& aForcedRegistrations) + { + TBool entryFound = EFalse; + while (DoNextL(aAppRegistrationEntry, aForcedRegistrations, entryFound)) + { + //do nothing. the point is to keep calling DoNextL + } + return entryFound; + } + +TBool CApaAppRegFinder::DoNextL(TApaAppEntry& aAppRegistrationEntry, const RPointerArray& aForcedRegistrations, TBool& aEntryFound) + { +#ifdef SYMBIAN_APPARC_APPINFO_CACHE + __ASSERT_ALWAYS(iListOfDrives.Count(),Panic(EPanicFindAllAppsNotCalled)); +#else + __ASSERT_ALWAYS(iListOfDrives,Panic(EPanicFindAllAppsNotCalled)); +#endif // SYMBIAN_APPARC_APPINFO_CACHE + + if (!iFileList) + {// scan the next drive/dir + iFileIndex = 0; + while (GetNextDriveAndFolder()) + { +#ifdef SYMBIAN_APPARC_APPINFO_CACHE + if (GetFileListL((iListOfDrives[iCurrentIndexInDriveList]).iDriveUnit, *iListOfFolders[iCurrentIndexInFolderList])==KErrNone) +#else + if (GetFileListL(((*iListOfDrives)[iCurrentIndexInDriveList]).iDriveUnit, *iListOfFolders[iCurrentIndexInFolderList])==KErrNone) +#endif // SYMBIAN_APPARC_APPINFO_CACHE + { + break; + } + } + if (!iFileList) + { + aEntryFound = EFalse; + return EFalse; // no more drives to scan + } + } + // scan the file list + while (iFileIndexCount()) + { + const TEntry& entry=(*iFileList)[iFileIndex++]; + if (!ApaUtils::HandleAsRegistrationFile(entry.iType)) + { + continue; // only interested in app registration resource files + } + + TParse parse; +#ifdef SYMBIAN_APPARC_APPINFO_CACHE + const TDriveName driveName = (iListOfDrives[iCurrentIndexInDriveList]).iDriveUnit.Name(); +#else + const TDriveName driveName = ((*iListOfDrives)[iCurrentIndexInDriveList]).iDriveUnit.Name(); +#endif // SYMBIAN_APPARC_APPINFO_CACHE + parse.Set(entry.iName, iListOfFolders[iCurrentIndexInFolderList], &driveName); + +#ifdef SYMBIAN_APPARC_APPINFO_CACHE + if (iListOfDrives[iCurrentIndexInDriveList].iDriveAtt&KDriveAttRemovable) +#else + if ((*iListOfDrives)[iCurrentIndexInDriveList].iDriveAtt&KDriveAttRemovable) +#endif // SYMBIAN_APPARC_APPINFO_CACHE + { + if (entry[2] != iLastChkedApp) //Check for validity only if it has not yet been checked + { + TUid appTypeUid; + if(entry[0].iUid == KUidPrefixedNonNativeRegistrationResourceFile) + { + appTypeUid = entry[1]; + } + else + { + appTypeUid = KNullUid; + } + + // Get the CAppSidChecker for this type of executable + TBool validRegistration = ETrue; + #ifdef SYMBIAN_APPARC_APPINFO_CACHE + TRAPD(err, validRegistration = iSidCheckerMap.FindSidCheckerL(appTypeUid).AppRegisteredAt(entry[2], (iListOfDrives)[iCurrentIndexInDriveList].iDriveUnit)); + #else + TRAPD(err, validRegistration = iSidCheckerMap.FindSidCheckerL(appTypeUid).AppRegisteredAt(entry[2], (*iListOfDrives)[iCurrentIndexInDriveList].iDriveUnit)); + #endif // SYMBIAN_APPARC_APPINFO_CACHE + iLastChkedApp = entry[2]; + if(err == KErrNone) + { + if(!validRegistration) + { + // Check if this registration file should be included + // despite not being officially reported as a valid registration + HBufC* fullName = parse.FullName().AllocLC(); + TInt pos = aForcedRegistrations.FindInOrder(fullName, TLinearOrder(CApaAppList::CompareStrings)); + CleanupStack::PopAndDestroy(fullName); + if (pos == KErrNotFound) + { + continue; + } + } + } + else if(err != KErrNotFound) + { + User::Leave(err); + } + } + else + { + continue; + } + } + aAppRegistrationEntry.iUidType = entry.iType; + aAppRegistrationEntry.iFullName = parse.FullName(); + aEntryFound = ETrue; // we found one + return EFalse; + } + // current Drive has been exhausted + delete iFileList; + iFileList = NULL; + return ETrue; // scan the next drive + } + +TBool CApaAppRegFinder::GetNextDriveAndFolder() + { + TBool found=ETrue; + TBool checkNextFolder=ETrue; + TDriveUnitInfo driveUnitInfo; + while (checkNextFolder) + { + // move to next folder +#ifdef SYMBIAN_APPARC_APPINFO_CACHE + if (++iCurrentIndexInDriveList>=iListOfDrives.Count()) +#else + if (++iCurrentIndexInDriveList>=iListOfDrives->Count()) +#endif // SYMBIAN_APPARC_APPINFO_CACHE + { + iCurrentIndexInDriveList=0; + ++iScanStage; + } + + //Get drive info +#ifdef SYMBIAN_APPARC_APPINFO_CACHE + driveUnitInfo=iListOfDrives[iCurrentIndexInDriveList]; +#else + driveUnitInfo=(*iListOfDrives)[iCurrentIndexInDriveList]; +#endif // SYMBIAN_APPARC_APPINFO_CACHE + //check folder + switch (iScanStage) + { + case EScanStageNonImportROM: + if (driveUnitInfo.iDriveAtt==KDriveAttRom) + { + iCurrentIndexInFolderList=0; + checkNextFolder=EFalse; + } + break; + case EScanStageImportNonROM: + if (driveUnitInfo.iDriveAtt!=KDriveAttRom) + { + iCurrentIndexInFolderList=1; + checkNextFolder=EFalse; + } + break; + case EScanStageImportNonNativeResourceNonROM: + if (driveUnitInfo.iDriveAtt!=KDriveAttRom) + { + iCurrentIndexInFolderList=2; + checkNextFolder=EFalse; + } + break; + case EScanStageImportROM: + if (driveUnitInfo.iDriveAtt==KDriveAttRom) + { + iCurrentIndexInFolderList=1; + checkNextFolder=EFalse; + } + break; + case EScanStageImportNonNativeResourceROM: + if (driveUnitInfo.iDriveAtt==KDriveAttRom) + { + iCurrentIndexInFolderList=2; + checkNextFolder=EFalse; + } + break; + case EScanStageComplete: + checkNextFolder=EFalse; + found=EFalse; + break; + default: + break; + } + } + return found; + } + +_LIT(KAppRegRscSearchAnyFile,"*"); + +TInt CApaAppRegFinder::GetFileListL(TDriveUnit aDriveUnit, const TDesC& aPathName) + { + const TDriveName driveName=aDriveUnit.Name(); + TParse parse; + TInt error = parse.Set(KAppRegRscSearchAnyFile,&aPathName,&driveName); + User::LeaveIfError(error); + TInt ret = iFs.GetDir(parse.FullName(), KEntryAttAllowUid, ESortNone, iFileList); + CheckErrorL(ret); + return ret; + } + +void CApaAppRegFinder::CheckErrorL(TInt aError) +// static + { + if (aError!=KErrNone && aError!=KErrNotFound && aError!=KErrPathNotFound && aError!=KErrNotReady + && aError!=KErrDisMounted && aError!=KErrCorrupt && aError!=KErrNotSupported && aError!=KErrBadName && aError!=KErrLocked) + { + User::Leave(aError); + } + }