diff -r 000000000000 -r 2e3d3ce01487 appfw/apparchitecture/apserv/APSRECCACHE.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/appfw/apparchitecture/apserv/APSRECCACHE.h Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,158 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// + +#if !defined(__APSRECCACHE_H__) +#define __APSRECCACHE_H__ + +#include +#include +#include "APSRECUTIL.H" + +const TUint KFileHashMapEntries = 40; + +/** +An entry for a recognized file in the recognition cache. +The entries is organized as single-linked list. +The recognition result itself is reference-counted. +@internalComponent +*/ +class CRecognitionResultHashMapEntry : public CBase + { +public: + static CRecognitionResultHashMapEntry* NewL(const TDesC& aFileName, TTime aLastModified, const TDataRecognitionResult& aResult, CRecognitionResultHashMapEntry* aNext); + ~CRecognitionResultHashMapEntry(); + + inline const CRecognitionResultHashMapEntry* Next() const { return iNext; } + inline CRecognitionResultHashMapEntry* Next() { return iNext; } + inline TTime LastModified() const { return iLastModified; } + inline const TDesC& FileName() const { return iResult->FileName(); } + inline CRecognitionResult* Result() const { iResult->Open(); return iResult; } + + void UpdateL(TTime aLastModified, const TDataRecognitionResult& aResult); +private: + CRecognitionResultHashMapEntry(TTime aLastModified, CRecognitionResult* aResult, CRecognitionResultHashMapEntry* aNext); +private: + TTime iLastModified; + CRecognitionResult* iResult; + CRecognitionResultHashMapEntry* iNext; + }; + +/** +A hash map for finding and adding recognition results. + +@internalComponent +*/ +class CRecognitionResultHashMap : public CBase + { +public: + CRecognitionResultHashMap(); + ~CRecognitionResultHashMap(); + CRecognitionResult* Get(const TDesC& aKey, TTime& aLastModified) const; + TBool AddL(const TDesC& aKey, TTime aLastModified, const TDataRecognitionResult& aResult); + inline TUint NumberOfEntries() const { return iNumberOfEntries; } +protected: + TUint GetIndex(const TDesC& aKey) const; +private: + inline CRecognitionResultHashMapEntry* Entry(TUint aIndex); + inline const CRecognitionResultHashMapEntry* Entry(TUint aIndex) const; + inline void SetEntry(TUint aIndex, CRecognitionResultHashMapEntry* aEntry); +private: + TUint iNumberOfEntries; + CRecognitionResultHashMapEntry* iEntries[KFileHashMapEntries]; + }; + +/** +A directory entry in the cache. +Such an entry doesn't necessarily hold all files of a directory, but +only the ones that have been recognized so far. +@internalComponent +*/ +class CCacheDirectoryEntry : public CBase + { +public: + static CCacheDirectoryEntry* NewL(const TDesC& aDirectory); + ~CCacheDirectoryEntry(); + inline const TDesC& Directory() const { return *iDirectory; } + inline CRecognitionResultHashMap& Files() { return iFiles; } //lint !e1536 Suppress exposing low access member + inline TUint NumberOfEntries() const { return iFiles.NumberOfEntries(); } +private: + CCacheDirectoryEntry(); +public: + static const TInt iOffset; +private: + HBufC* iDirectory; // own copy! + CRecognitionResultHashMap iFiles; + TDblQueLink iDlink; + friend class CApsRecognitionCache; + }; + +/** +A recognition result cache. +The cache holds a list of directories (stored as an RPointerArray). Recently +used directories are stored on top of the list, rarely used directories are +stored at the bottom. + +This strategy improves performance: +search for files is started at the top (principle of locality) +and cleanup is done from the bottom. + +The files themselves are stored in a hash map (within directories). +@internalComponent +*/ +class CApsRecognitionCache : public CBase + { +public: + CApsRecognitionCache(RFs& aFs); + ~CApsRecognitionCache(); + void AddL(const TDesC& aDirectory, const TDesC& aFileName, const TDataRecognitionResult& aRecognitionResult); + void AddL(const RFile& aFile, const TDesC& aDirectory, const TDesC& aFileName, const TDataRecognitionResult& aRecognitionResult); + TBool Get(const TDesC& aDirectory, const TDesC& aFileName, TDataRecognitionResult& aRecognitionResult); + CRecognitionResult* Get(const RFile& aFile, const TDesC& aDirectory, const TDesC& aFileName); + void Flush(); +private: + void DoAddL(const TDesC& aDirectory, const TDesC& aFileName, const TTime& aLastModified, const TDataRecognitionResult& aRecognitionResult); + CRecognitionResult* DoGet(const TDesC& aDirectory, const TDesC& aFileName, const TTime& aLastModified); + TBool CompareDirectories(const TDesC& aDir1, const TDesC& aDir2) const; + void Cleanup(); +private: // data + RFs& iFs; + TDblQue iDirectoryHeader; + TDblQueIter iIter; + TUint iNumberOfEntries; + }; + + +//inlines + +inline CRecognitionResultHashMapEntry* CRecognitionResultHashMap::Entry(TUint aIndex) + { + ASSERT(aIndex < KFileHashMapEntries); + return iEntries[aIndex]; + } //lint !e1762 Suppress member function could be made const + +inline const CRecognitionResultHashMapEntry* CRecognitionResultHashMap::Entry(TUint aIndex) const + { + ASSERT(aIndex < KFileHashMapEntries); + return iEntries[aIndex]; + } + +inline void CRecognitionResultHashMap::SetEntry(TUint aIndex, CRecognitionResultHashMapEntry* aEntry) + { + ASSERT(Entry(aIndex) == aEntry->Next()); + iEntries[aIndex] = aEntry; + } + +#endif // __APSRECCACHE_H__ +