diff -r aa99f2208aad -r b8d18c84f71c localisation/apparchitecture/apfile/aprfndr.cpp --- a/localisation/apparchitecture/apfile/aprfndr.cpp Wed Jul 28 16:03:37 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,458 +0,0 @@ -// 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 "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 "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); - } - }