localisation/apparchitecture/apfile/aprfndr.cpp
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /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 <apsserv.h>
+#include "../apgrfx/apprivate.h"
+#include <apsidchecker.h>
+
+/////////////////////////////
+// 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<TDriveUnitInfo>(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<TDriveUnitInfo>& 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<TDriveUnitInfo>& 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<HBufC>& 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<HBufC>& 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 (iFileIndex<iFileList->Count())
+		{
+		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<HBufC>(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);
+		}
+	}