userlibandfileserver/fileserver/sfile/sf_cache.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 2001-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:
// f32\sfile\sf_cache.h
// 
//

#if !defined(__SF_CACHE_H__)
#define __SF_CACHE_H__
#include "sf_image.h"

// Cached information for each file
class TRomImageHeader;
class TDirectoryCacheHeader;
class TFileCacheRecord : public TImageInfo
	{
public:
	inline const TText8* NameText() const
		{ return (const TText8*)(this + 1); }
	inline TPtrC8 Name() const
		{ return TPtrC8(NameText(), iNameLength); }
	inline const TUint8* ExportDescription() const
		{ return NameText() + iNameLength; }
	inline TBool ExtrasValid() const
		{ return iUid[0]; }
	inline const TRomImageHeader* RomImageHeader() const
		{ return (const TRomImageHeader*)iUid[0]; }
	inline void SetXIP(const TRomImageHeader* aR)
		{ iUid[0] = (TUint32)aR; }
	inline TBool IsXIP() const
		{ return !(iUid[0]&3); }
	static TInt Order(const TFileCacheRecord& aL, const TFileCacheRecord& aR);
	void Dump(const char* aTitle);
public:
	TInt GetImageInfo(RImageInfo& aInfo, const TDesC8& aPathName, TDirectoryCacheHeader* aDirHead, TInt aIndex);
public:
	// UID1 must be EXE or DLL, 0 means extra information not valid
	// UID1 nonzero and multiple of 4 means XIP in which case it points to the ROM image header
	// iExportDirCount = number of bytes available for export description if iUid[0]=0
	// 8-bit name follows (store base+ext only, not version)
	// export description follows name
	};

class TFileCacheRecordSearch : public TFileCacheRecord
	{
public:
	TFileCacheRecordSearch(const TDesC8& aSearchName);
public:
	TUint8 iSearchName[KMaxKernelName];
	};

// Record of a cached path.
class TPathListRecord
	{
public:
	static TPathListRecord* FindPathNameInList(const TDesC8& aPath);
	inline const TDesC8* PathName() const
		{ return (const TDesC8*)(this + 1); }
	static TInt Init();
private:
	void MoveToHead();
	static TPathListRecord* New(const TDesC8& aPath, TBool aKeep);
	static TPathListRecord* DoFindPathNameInList(const TDesC8& aPath);
	static TPathListRecord* AddToPathList(const TDesC8& aPath, TBool aKeep);
public:
	TPathListRecord* iNext;
	TBool iKeep;
	// place a TBufC8 immediately after
public:
	static TPathListRecord* First;
	static TPathListRecord* LastStatic;
	};

class TCacheHeapList
	{
public:
	TCacheHeapList(TInt aSize);
	TAny* Allocate(TInt aBytes);
public:
	TCacheHeapList* iNext;
private:
	TInt iAllocated;
	TInt iSize;
	};

class TDirectoryCacheHeader;
NONSHARABLE_CLASS(CCacheNotifyDirChange) : public CActive
	{
public:
	CCacheNotifyDirChange(TDriveNumber aDrive, TDirectoryCacheHeader& aDirHead);
	~CCacheNotifyDirChange();
	TInt RegisterNotification(TPathListRecord* aPathRec, TNotifyType aType);
	void DoCancel();
	void RunL();
private:
    TDriveNumber iDrive;
	TDirectoryCacheHeader* iDirHead;
	};

class TEntry;
class TDirectoryCacheHeader
	{
public:
	TDirectoryCacheHeader(TPathListRecord* aPath);
	~TDirectoryCacheHeader();
	TAny* Allocate(const TInt aBytes);
	TFileCacheRecord* NewRecord(const TDesC8& aName, TUint32 aAttr, TUint32 aVer, const TEntry& aEntry);
	TFileCacheRecord* NewRecord(const TFileCacheRecord& aRecord, TInt aEDS);
	TInt PopulateFromDrive(const TDesC8& aPathName);
public:
	TDirectoryCacheHeader* iNext;		// list of directories per drive
	TCacheHeapList* iFirstHeapBlock;	// heap blocks to hold TFileCacheRecord entries
	TPathListRecord* iPath;
	TInt iRecordCount;					// number of TFileCacheRecord entries
	TFileCacheRecord** iCache;			// array of pointers to TFileCacheRecord entries
	TBool iNotPresent;
	CCacheNotifyDirChange* iNotify;
private:
	TInt GetMoreHeap();
	};

class TDriveCacheHeader
	{
public:
	TDriveCacheHeader();
	~TDriveCacheHeader();
	TDirectoryCacheHeader* FindDirCache(TPathListRecord* aPath);
	TInt GetDirCache(TDirectoryCacheHeader*& aCache, TPathListRecord* aPath, const TDesC8& aDriveAndPath);
public:
	TDirectoryCacheHeader* iDirectoryList; // List of Directories
	TUint iDriveAtt;
	TInt iDriveNumber;
	};


void InitializeFileNameCache();
TInt CheckLoaderCacheInit();

#endif