diff -r 57c618273d5c -r bbf46f59e123 fbs/fontandbitmapserver/sfbs/SERVER.CPP --- a/fbs/fontandbitmapserver/sfbs/SERVER.CPP Thu Aug 19 11:11:18 2010 +0300 +++ b/fbs/fontandbitmapserver/sfbs/SERVER.CPP Tue Aug 31 16:31:06 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 1995-2010 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" @@ -22,7 +22,7 @@ #include "BitwiseBitmap.inl" const TInt KFbsPriority = 0; - +const TInt KFbsGoomMonitorSid = 0x10207218; // Setup security policies const TInt KRanges[] = { @@ -36,7 +36,11 @@ EFbsMessRegisterLinkedTypeface, EFbsMessFetchLinkedTypeface, EFbsMessUpdateLinkedTypeface, + EFbsMessGetFontTable, + EFbsMessOogmNotification, + EFbsMessGetGlyphCacheMetrics, }; + const TUint KRangeCount = sizeof(KRanges)/sizeof(TInt); const TUint8 KElementsIndex[KRangeCount] = { @@ -50,14 +54,20 @@ 1, // ECapabilityWriteDeviceData for EFbsMessRegisterLinkedTypeface 2, // ECapabilityReadDeviceData for EFbsMessFetchLinkedTypeface 1, // ECapabilityWriteDeviceData for EFbsMessUpdateLinkedTypeface + 0, // ECapability_None for EFbsMessGetFontTable and beyond + 4, // SID for EFbsMessOogmNotification. + 0, // For EFbsMessGetGlyphCacheMetrics and on. }; + const CPolicyServer::TPolicyElement KElements[] = { {_INIT_SECURITY_POLICY_C1(ECapability_None), CPolicyServer::EFailClient}, {_INIT_SECURITY_POLICY_C1(ECapabilityWriteDeviceData), CPolicyServer::EFailClient}, {_INIT_SECURITY_POLICY_C1(ECapabilityReadDeviceData), CPolicyServer::EFailClient}, - {_INIT_SECURITY_POLICY_C1(ECapabilityPowerMgmt), CPolicyServer::EFailClient}, + {_INIT_SECURITY_POLICY_C1(ECapabilityPowerMgmt), CPolicyServer::EFailClient}, + {_INIT_SECURITY_POLICY_S0(KFbsGoomMonitorSid), CPolicyServer::EFailClient} }; + const CPolicyServer::TPolicy KFbsPolicy = { CPolicyServer::EAlwaysPass, //specifies all connect attempts should pass @@ -68,9 +78,7 @@ }; CFontBitmapServer::CFontBitmapServer(): - CPolicyServer(KFbsPriority, KFbsPolicy), - iConnectionId(0), - iTopLevelStore(NULL) + CPolicyServer(KFbsPriority, KFbsPolicy) { } @@ -83,25 +91,33 @@ CFontBitmapServer* CFontBitmapServer::NewL() { - CFontBitmapServer* fbs=new(ELeave) CFontBitmapServer; - CleanupStack::PushL(fbs); - fbs->iTopLevelStore=CFbTop::NewL(); + CFontBitmapServer* self = new(ELeave) CFontBitmapServer; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + +/** +Two-phase constructor. +*/ +void CFontBitmapServer::ConstructL() + { + iTopLevelStore=CFbTop::NewL(); // If fbserv data paging is configured as unpaged, automatically pin client descriptors if(!RProcess().DefaultDataPaged()) { - fbs->SetPinClientDescriptors(ETrue); + SetPinClientDescriptors(ETrue); } - - fbs->StartL(KFBSERVGlobalThreadName); - CleanupStack::Pop(); - return(fbs); + StartL(KFBSERVGlobalThreadName); } CFbTop* CFontBitmapServer::TopLevelStore() { return(iTopLevelStore); } + CSession2* CFontBitmapServer::NewSessionL(const TVersion& aVersion,const RMessage2& /*aMessage*/ ) const { TVersion v(KFbsMajorVersionNumber,KFbsMinorVersionNumber,KFbsBuildVersionNumber); @@ -125,7 +141,7 @@ TPckgBuf pixelSize; TInt index=aMessage.Int0(); TInt limit=iTopLevelStore->FontStore()->NumTypefaces(); - if(index<0 || index>limit) + if(index < 0 || index > limit) { return KErrArgument; } @@ -193,7 +209,7 @@ void CFontBitmapServer::ProcMessage(const RMessage2& aMessage, TInt aSession) #endif { - TInt ret=KErrNone; + TInt ret=KErrNone; TBool clientPanicRequired = EFalse; #ifdef _DEBUG TInt num=0; @@ -344,6 +360,7 @@ #ifdef _DEBUG aRet=ret; #endif + } /** @@ -361,9 +378,9 @@ void CFontBitmapServer::GetHeapSizesL(const RMessage2& aMessage) { TPckgBuf data; - TInt defaultHeapSize; - TInt smallBmpHeapSize; - TInt bigBmpHeapSize; + TInt defaultHeapSize = 0; + TInt smallBmpHeapSize = 0; + TInt bigBmpHeapSize = 0; User::Heap().AllocSize(defaultHeapSize); bigBmpHeapSize = iTopLevelStore->iLargeBitmapChunk.Size(); @@ -383,18 +400,24 @@ #endif -CFontObject::CFontObject(CFontStore* aFontStore): +CFontObject::CFontObject(CFontStore* aFontStore, CGlyphAtlas* aGlyphAtlas): CObject(), - iAddressPointer(NULL), - iFontStore(aFontStore) + iFontStore(aFontStore), + iGlyphAtlas(aGlyphAtlas) { } CFontObject::~CFontObject() { if (AccessCount()==1) + { Dec(); + } iFontStore->ReleaseFont(iAddressPointer); + if (iGlyphAtlas) + { + iGlyphAtlas->FontReleased(*iAddressPointer); + } } // CBitmapObject constructor - takes ownership of aBmp @@ -424,7 +447,9 @@ { iHandle = reinterpret_cast(this); while (iFbTop->iBitmapObjectIndex.FindInOrder(this, Compare) != KErrNotFound) + { ++iHandle; + } User::LeaveIfError(iFbTop->iBitmapObjectIndex.InsertInOrder(this, Compare)); } } @@ -469,9 +494,13 @@ if (index != KErrNotFound) { if (iCleanBitmap) + { iFbTop->iBitmapObjectIndex[index] = iCleanBitmap; + } else + { iFbTop->iBitmapObjectIndex.Remove(index); + } } } if (iCleanBitmap != NULL) @@ -500,7 +529,7 @@ void CBitmapObject::Close() { - if (iCleanBitmap != NULL && Owner() != NULL && AccessCount() == 2) + if ((iCleanBitmap != NULL) && (Owner() != NULL) && (AccessCount() == 2)) { static_cast(Owner())->iCleanBitmap = iCleanBitmap; iCleanBitmap->SetOwner(Owner()); @@ -523,8 +552,7 @@ // CSharedBitmapObject constructor - takes ownership of aBmp and aKey CSharedBitmapObject::CSharedBitmapObject(CFbTop& aFbTop, CBitwiseBitmap* aBmp, TDesC* aKey): CBitmapObject(aFbTop, aBmp), - iKey(aKey), - iNext(NULL) + iKey(aKey) { __ASSERT_DEBUG(iKey, User::Invariant()); }