fbs/fontandbitmapserver/sfbs/SERVER.H
changeset 0 5d03bc08d59c
child 36 01a6848ebfd7
child 163 bbf46f59e123
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/SERVER.H	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,360 @@
+// Copyright (c) 1995-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:
+//
+
+#ifndef __FBSERV_H__
+#define __FBSERV_H__
+
+#include <e32base.h>
+#include <f32file.h>
+#include <fbs.h>
+#include "UTILS.H"
+#include "FBSMBMC.H"
+#include "fbsmessage.h"
+
+class CFbTop;
+class CFbsBackgroundCompression;
+class CFbsBackgroundCompressionQueueElement;
+class TOpenFontGlyphData;
+
+NONSHARABLE_CLASS(CFontObject): public CObject
+/**
+@internalComponent
+*/
+	{
+public:
+	CFontObject(CFontStore* aFontStore);
+	~CFontObject();
+public:
+	CBitmapFont* iAddressPointer;
+	CFontStore* iFontStore;
+	TInt iHeightInTwips;
+	};
+
+NONSHARABLE_CLASS(CBitmapObject): public CObject
+/**
+Provides reference counting facilities for bitmaps managed by CFbTop.
+@internalComponent
+*/
+	{
+	friend class CFbsBackgroundCompression;
+	friend class CFbsBackgroundCompressionQueueElement;
+protected:
+	CBitmapObject(CFbTop& aFbTop, CBitwiseBitmap* aBmp);
+	void ConstructL(TBool aReplacement);
+public:
+	static CBitmapObject* NewL(CFbTop& aFbTop, CBitwiseBitmap* aBmp, TBool aReplacement);
+	~CBitmapObject();
+	inline CBitwiseBitmap* Address() const;
+	inline TInt Handle() const;
+	inline CBitmapObject* CleanBitmap() const;
+	inline TBool IsInCompressionQueue() const;
+	void SetCleanBitmap(CBitmapObject* aNewBmpObj);
+	virtual void Close();
+	static TInt Compare(const CBitmapObject& aBmpObj1, const CBitmapObject& aBmpObj2);
+	static TInt Compare(const TInt* aHandle, const CBitmapObject& aBmpObj);
+protected:
+	CFbTop* iFbTop;
+private:
+	CBitwiseBitmap* iAddressPointer;
+	TInt iHandle;
+	CBitmapObject* iCleanBitmap;
+	CFbsBackgroundCompressionQueueElement* iCompressionQueueElement;
+	};
+
+NONSHARABLE_CLASS(CSharedBitmapObject): public CBitmapObject
+/**
+Provides reference counting facilities for shared bitmaps managed by CFbTop.
+Shared bitmaps are only loaded once.  They are uniquely identified by the
+combination of the filename, bitmap ID and last modified time of the file.
+@internalComponent
+*/
+	{
+friend class CHashMap;
+private:
+	CSharedBitmapObject(CFbTop& aFbTop, CBitwiseBitmap* aBmp, TDesC* aKey);
+	void ConstructL(TUint aHash);
+public:
+	static CSharedBitmapObject* NewL(CFbTop& aFbTop, CBitwiseBitmap* aBmp, TDesC* aKey, TUint aHash);
+	~CSharedBitmapObject();
+	static HBufC* KeyLC(const TDesC& aFileName, TInt aId, const TTime& aModTime);
+private:
+	TDesC* iKey;
+	mutable CSharedBitmapObject* iNext;    // Next object in a linked list
+	};
+
+NONSHARABLE_CLASS(CFontBitmapServer): public CPolicyServer
+/**
+@internalComponent
+*/
+	{
+public:
+	CFontBitmapServer();
+	~CFontBitmapServer();
+	static CFontBitmapServer* NewL();
+	CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;
+	TInt Init();
+#ifdef _DEBUG
+	void ProcMessage(const RMessage2& aMessage, TInt aSession, TInt& aRet);
+#else	
+	void ProcMessage(const RMessage2& aMessage, TInt aSession);
+#endif	
+	CFbTop* TopLevelStore();
+
+private:
+	void GetHeapSizesL(const RMessage2& aMessage);
+	TInt HandleMesgTypefaceSupport(const RMessage2& aMessage, TBool& aClientPanicRequired);
+	TInt HandleMesgFontHeight(const RMessage2& aMessage, TBool aInTwips);
+
+protected:
+	TUint iConnectionId;
+	CFbTop* iTopLevelStore;
+	};
+
+class TFontFileIndex
+/**
+@internalComponent
+*/
+	{
+public:
+	TUid iUid;
+	TInt iAccessCount;
+	};
+
+
+class CFbClient;
+
+NONSHARABLE_CLASS(TFbClientHelper): public TDblQueLink
+/**
+@internalComponent
+*/
+	{
+public:
+	inline TFbClientHelper(CFbClient& aClient);
+
+public:
+	CFbClient& iClient;
+	RMessagePtr2 iMessage;
+	TBool iDirty;
+	};
+
+NONSHARABLE_CLASS(CFbClient): public CSession2
+/**
+@internalComponent
+*/
+	{
+public:
+	static CFbClient* NewL(RHeap* aHeap);
+	~CFbClient();
+	void Init(TUint aConnectionHandle);
+	void CreateL();
+	CFontBitmapServer* FontBitmapServer();
+	CFbTop* TopLevelStore();
+	void CopyFontInfo(CFontObject* aFontObjPtr,TInt aHandle,TFontInfo& aFontInfo);
+	void ServiceL(const RMessage2& aMessage);
+	void ProcFontMessage(const RMessage2& aMessage);
+	void ProcBitmapMessage(const RMessage2& aMessage);
+	void NotifyDirtyBitmap(CBitmapObject& aBmpObj);
+	void AddFontFileIndexL(TUid aId);
+	void RemoveFontFileIndex(TUid aId);
+	void Disconnect(const RMessage2 &aMessage);
+#ifdef _DEBUG
+	void ProcMemMessage (const RMessage2& aMessage);
+#endif	
+private:
+	CFbClient(RHeap* aHeap);
+	TInt HandleMesgFontDuplicate(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt HandleMesgGetNearestFont(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt HandleMesgGetFontById(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt CopyFontInfoIntoReturnMessage(const RMessage2& aMessage, TBool& aPanicRequired, CFontObject* aFontObj, TInt iWritePosition);
+	TInt HandleMesgAddOrInstallFontFile(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt HandleMesgRemoveFontFile(const RMessage2& aMessage);
+	TInt HandleMesgRasterize(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt HandleMesgFaceAttrib(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt HandleMesgHasCharacter(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt HandleMesgShapeText(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt HandleMesgShapeDelete(const RMessage2& aMessage, TBool& aPanicRequired);
+
+protected:
+	TUint iConnectionHandle;
+	CObjectIx* iIx;
+	TInt iResourceCount;
+	CArrayFixFlat<TFontFileIndex>* iFontFileIndex;
+	RHeap* iHeap;							// the heap containing iOpenFontGlyphData
+	TOpenFontGlyphData* iOpenFontGlyphData;	// the metrics and bitmap, in shared memory, of the last character rasterized
+	TInt iSessionHandle;					// used to identify client-specific glyph caches for the new font system
+	TFbClientHelper* iHelper;				// used to notify client of any bitmap becoming dirty
+
+private:
+	RBuf16 iTextToShape;						// buffer used to hold incoming text that needs shaping
+#ifdef _DEBUG	
+	TBool iOwnHeapCheck; //for the process heap - current state
+	TBool iHeapCheck;	//for iHeap - current state
+	TBool iOwnHeapCheckFlip; //for the process heap - to switch the current state
+	TBool iHeapCheckFlip;	//for iHeap - used to switch the current state
+	TInt iOwnHeapFailNumber; //the number for the memory fail to be set to. -1: don't set.
+	TInt iSharedHeapFailNumber; //the number for the memory fail to be set to. -1 don't set
+	TInt iRet;
+	TInt iFontDuplicateToFail; //when this is set calls to HandleMesgFontDuplicate() fail for the class.
+#endif	
+	};
+
+NONSHARABLE_CLASS(CFbActiveScheduler): public CActiveScheduler
+/**
+@internalComponent
+*/
+	{
+public:
+	CFbActiveScheduler();
+	virtual void Error(TInt anError) const;
+	};
+
+class CFontStore;
+
+NONSHARABLE_CLASS(CHashMap): public CBase
+/**
+A HashMap data structure for storing pointers to CSharedBitmapObjects.
+Provides fast insert/lookup/removal based on a key.
+@internalComponent
+*/
+	{
+public:
+	CHashMap();
+	~CHashMap();
+
+	void Insert(CSharedBitmapObject& aBmpObj, TUint aHash);
+	CSharedBitmapObject* Lookup(const TDesC& aKey, TUint aHash) const;
+	TInt Remove(const CSharedBitmapObject& aBmpObj);
+	static TUint Hash(const TDesC16& aKey);
+
+private:
+	CSharedBitmapObject* iHashTable[1<<KFBSERVSharedBitmapHashTableSizeInBits]; // Array of pointers to singularly linked lists.  Linked list elements are CSharedBitmapObjects.
+	TInt iTableSize;
+	TInt iMask;
+	};
+
+
+IMPORT_C extern const TInt KFbServSharedHeapMaxSize;
+
+
+NONSHARABLE_CLASS(CFbTop): public CBase
+/**
+@internalComponent
+*/
+	{
+	friend class CFontBitmapServer;
+	friend class CBitmapObject;
+	friend class CSharedBitmapObject;
+public:
+	~CFbTop();
+	static CFbTop* NewL();
+	TInt GetNearestFont(CFontObject*& aFontObjPtr, TFbsMessage aMessage, const TFontSpec& aFontSpec, TInt aMaxHeight = 0);
+	TInt GetFontById(CFontObject*& aFontObjPtr,TUid aUid,const TAlgStyle& aAlgStyle);
+	CBitmapObject* CreateBitmapL(const TSize& aSize, TDisplayMode aDispMode, TUid aUid, TBool aReplacement, TInt aDataSize = 0);
+	CBitmapObject* LoadBitmapL(const TDesC& aFilename, TInt32 aId, TUint aFileOffset,RFile* aFile, TInt aSessionHandle);
+	CSharedBitmapObject* ShareBitmapL(TDes& aFilename, TInt32 aId, TUint aFileOffset,RFile* aFile, TInt aSessionHandle);
+	TInt GetCleanBitmap(CBitmapObject*& aBmpObjPtr);
+	CBitmapObject* FindBitmap(TInt aHandle);
+	TBool ValidFontHandle(TInt aHandle);
+	TBool ValidBitmapFont(TInt aHandle);
+	CFontStore* FontStore() const;
+	RHeap* Heap() const;
+	CChunkPile* Pile() const;
+	TInt HeapBase() const;
+	void SetFontNameAliasL(const RMessage2& aMessage);
+	void SetDefaultLanguageForMetrics(const RMessage2& aMessage);
+	inline CFbsBackgroundCompression* BackgroundCompression() const;
+	void CloseFileStores(TInt aSessionHandle);
+	void SetSystemDefaultTypefaceName(const TDesC& aFontTypefaceName);
+	TInt GetAllBitmapHandles(const RMessage2& aMessage) const;
+	inline RFs& FileSession();
+	void AddClientHelper(TFbClientHelper& aHelper);
+	void NotifyDirtyBitmap(CBitmapObject& aBmpObj, CFbClient* aClient);
+	TInt BitmapConUniqueID() const;
+	TInt FontConUniqueID() const;
+private:
+	CFbTop();
+	void ConstructL();
+	CBitwiseBitmap* DoLoadBitmapLC(const TDesC& aFilename, TInt32 aId, TUint aFileOffset, RFile* aFile, TInt aSessionHandle);
+	void LoadOpenFontLibraries();
+	void SafeInstallOfRasterizerL(TUid aInterfaceImplUid);
+	TInt FindFontNameAlias(const TDesC& aAlias);
+	void LoadShaperFactories();
+	void SafeInstallOfShaperFactoryL(TUid aInterfaceImplUid);
+	TInt CreateFontObjectFromFont(CFontObject*& aFontObjPtr, CFont* aFont);
+	TInt GetNearestNonAliasedFont(CFont*& aFont, TFbsMessage aMessage, const TFontSpec&	aFontSpec, TInt	aMaxHeight);
+private:
+	RFs iFilesys;
+	CFontStore* iFontStore;
+	CObjectCon* iBitmapCon;
+	CObjectCon* iFontCon;
+	CObjectConIx* iConIx;
+	RHeap* iHeap;
+	RChunk iChunk;
+	RChunk iLargeBitmapChunk;
+	RMutex iDebugMutex; // used only in builds with SYMBIAN_DEBUG_FBS_LOCKHEAP defined
+	CChunkPile* iPile;
+	RPointerArray<HBufC> iFontNameAlias;
+	RPointerArray<CBitmapObject> iBitmapObjectIndex;
+	CHashMap iSharedBitmapObjectHashMap;
+	CFbTopStreamIdCache* iMBMCache;
+	TLanguage iDefaultLanguageForMetrics;
+	CFbsBackgroundCompression* iBackgroundCompression;
+	TBuf<KMaxTypefaceNameLength> iSystemDefaultFontTypefaceName;
+	TDblQue<TFbClientHelper> iClientHelpers;
+	TInt64 iNextAvailableSerialNumber;
+	};
+
+inline CBitwiseBitmap* CBitmapObject::Address() const
+	{
+	return iAddressPointer;
+	}
+
+inline TInt CBitmapObject::Handle() const
+	{
+	return iHandle;
+	}
+
+inline CBitmapObject* CBitmapObject::CleanBitmap() const
+	{
+	return iCleanBitmap;
+	}
+
+inline TBool CBitmapObject::IsInCompressionQueue() const
+	{
+	return iCompressionQueueElement != NULL;
+	}
+
+inline TFbClientHelper::TFbClientHelper(CFbClient& aClient)
+	: iClient(aClient), iDirty(EFalse)
+	{}
+
+inline CFbsBackgroundCompression* CFbTop::BackgroundCompression() const
+	{
+	__ASSERT_DEBUG(iBackgroundCompression != NULL, User::Invariant());
+	return iBackgroundCompression;
+	}
+
+/**
+It returns the file session handle.
+
+@internalComponent
+*/
+inline RFs& CFbTop::FileSession()
+	{
+	return iFilesys;
+	}
+
+#endif
+