diff -r 000000000000 -r 05e9090e2422 uigraphics/AknIcon/srvsrc/AknIconSrvClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uigraphics/AknIcon/srvsrc/AknIconSrvClient.cpp Thu Dec 17 09:14:12 2009 +0200 @@ -0,0 +1,509 @@ +/* +* Copyright (c) 2002 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: Client to AknIconServer. +* +*/ + + +// INCLUDE FILES + +#include "AknIconSrv.h" +#include "AknIconSrvClient.h" +#include "AknIconSrvTlsData.h" +#include "AknBitmap.h" +#include "AknIconSrvDef.h" +#include "AknIconPanic.h" +#include "AknIconManager.h" +#include "AknIconTraces.h" +#include + +#ifdef PRECACHELOG +#include +#endif + +// CONSTANTS +const TInt KAsyncMessageSlots = 0; +const TInt KConnectionTries = 2; + +// ================= MEMBER FUNCTIONS ========================================== + +RAknIconSrvClient::RAknIconSrvClient() : iConnections( 1 ) + { + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::Connect() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RAknIconSrvClient::Connect() + { + TInt ret = KErrNone; + + CAknIconSrvTlsData* data = static_cast( Dll::Tls() ); + + if ( data ) + { + data->iIconSession.iConnections++; + return KErrNone; + } + else + { + TRAP( ret, CAknIconSrvTlsData::CreateSingletonL() ); + } + + return ret; + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::Disconnect() +// ----------------------------------------------------------------------------- +// +EXPORT_C void RAknIconSrvClient::Disconnect() + { + CAknIconSrvTlsData* data = static_cast( Dll::Tls() ); + + if ( !data ) return; + + if ( data->iIconSession.iConnections > 0 ) + { + data->iIconSession.iConnections--; + } + + if ( !data->iIconSession.iConnections ) + { + delete data; // also frees TLS + } + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::GetSession() +// ----------------------------------------------------------------------------- +// +RAknIconSrvClient* RAknIconSrvClient::GetSession() + { + CAknIconSrvTlsData* data = static_cast( Dll::Tls() ); + + __ASSERT_ALWAYS( data, + User::Panic( KAknIconPanicCategory, EClientSessionNotConnected ) ); + + return &data->iIconSession; + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::InitializeIconL() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::InitializeIconL( + CAknBitmap& aBitmap, + CAknBitmap& aMask, + TAknContentDimensions& aContentDimensions, + const TAknIconParams& aInfo ) const + { + TPckgC paramPack( aInfo ); + TAknIconSrvReturnData retData; + + CAknIconManager* manager = aBitmap.Manager(); + TBool mbmIcon = manager->IsMbmIcon(); + + if ( mbmIcon ) + { + // Existing bitmap handles are passed to the server side if they point + // to the bitmaps already retrieved with CFbsBitmap::Load, which the + // server it supposed to stretch into another bitmaps of given size. + retData.iBitmapHandle = aBitmap.Handle(); + if ( aInfo.iMaskId >= 0 ) + { + retData.iMaskHandle = aMask.Handle(); + } +#ifdef PRECACHELOG + HBufC* buf = HBufC::New( 1024 ); + if ( buf ) + { + + TPtr ptr = buf->Des(); + ptr.Append( _L("AKNICON load, ") ); + + TFileName fileName; + manager->GetFullFileName( fileName ); + + ptr.Append(fileName); + + ptr.Append( _L(", ") ); + ptr.AppendNum( aInfo.iBitmapId ); + ptr.Append( _L(", ") ); + ptr.AppendNum( aInfo.iMaskId ); + ptr.Append( _L(", ") ); + ptr.AppendNum( aInfo.iSize.iWidth ); + ptr.Append( _L(", ") ); + ptr.AppendNum( aInfo.iSize.iHeight ); + ptr.Append( _L(", ") ); + ptr.AppendNum( aInfo.iMode ); + ptr.Append( _L(", ") ); + ptr.AppendNum( aInfo.iRotationAngle ); + ptr.Append( _L(", ") ); + ptr.AppendNum( aInfo.iColor.Internal() ); + ptr.Append( _L(", ") ); + ptr.AppendNum( aInfo.IsCompressionDisabled() ); + ptr.Append( _L(", ") ); + + + _LIT( KFileLoggingDir, "AknIconPreCacher" ); + _LIT( KFileLog, "Traces.txt" ); + + RFileLogger::Write(KFileLoggingDir, KFileLog, EFileLoggingModeAppend, ptr); + + + + delete buf; + } + +#endif +//PrecacheCache tool + } + + TPckg retPack( retData ); + TIpcArgs args( ¶mPack, &retPack, 0, 0 ); + + if ( aInfo.iFile.SubSessionHandle() ) + { + User::LeaveIfError( aInfo.iFile.TransferToServer( args, 2, 3 ) ); + } + + // Scalable icon are generated and shared by server. + // Bitmap icons are stretched and shared by server. + User::LeaveIfError( SendReceive( ERetrieveOrCreateSharedIcon, args ) ); + + // Now reset the bitmaps, which frees their old contents. + // Then duplicate them with the handles retrieved from the server. + aBitmap.Reset(); + if ( aInfo.iMaskId >= 0 ) + { + aMask.Reset(); + } + + // This code enables proper cleanup in AknIconSrv side in CAknBitmap::Reset + // and must be done before any leaving code. + // --------------------------------------------------------------------- + manager->SetInitializedParams( aInfo ); + manager->SetAppIcon(aInfo.iAppIcon); + aBitmap.SetSharedByIconSrv(); + + if ( aInfo.iMaskId >= 0 ) + { + aMask.SetSharedByIconSrv(); + } + // --------------------------------------------------------------------- + + // Duplicate the returned bitmap (and mask). + User::LeaveIfError( aBitmap.Duplicate( retData.iBitmapHandle ) ); + + if ( aInfo.iMaskId >= 0 ) + { + User::LeaveIfError( aMask.Duplicate( retData.iMaskHandle ) ); + } + + aContentDimensions = retData.iContentDimensions; + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::FreeBitmap() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::FreeBitmap( CAknBitmap& aBitmap ) const + { + TAknIconParams info; + + CAknIconManager* manager = aBitmap.Manager(); + manager->GetFileName( info.iFileName ); + info.iBitmapId = manager->IconIdToIndex( manager->BitmapId() ); + info.iMaskId = manager->IconIdToIndex( manager->MaskId() ); + info.iAppIcon = manager->GetAppIcon(); + manager->GetInitializedParams( info ); + + TPckgC paramPack( info ); + + SendReceive( EFreeBitmap, TIpcArgs( ¶mPack ) ); + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::GetContentDimensions() +// ----------------------------------------------------------------------------- +// +TInt RAknIconSrvClient::GetContentDimensions( + CAknBitmap& aBitmap, TAknContentDimensions& aContentDimensions ) const + { + CAknIconManager* manager = aBitmap.Manager(); + + RFile* file = NULL; + + TRAPD( err, + { + file = manager->FileHandleL(); + } ); + + if ( err != KErrNone ) + { + return err; + } + + TAknIconParams info; + manager->GetFileName( info.iFileName ); + info.iBitmapId = manager->IconIdToIndex( manager->BitmapId() ); + info.iAppIcon = manager->GetAppIcon(); + if (manager->IsDefaultIconDirUsed()) + { + info.SetDefaultIconDirUsed(); + } + + if ( file ) + { + info.iFile = *file; + } + + // Other members of TAknIconParams omitted. + + TPckgC paramPack( info ); + TPckg returnPack( aContentDimensions ); + + TIpcArgs args( ¶mPack, &returnPack, 0, 0 ); + + if ( info.iFile.SubSessionHandle() ) + { + err = info.iFile.TransferToServer( args, 2, 3 ); + } + + if ( err == KErrNone ) + { + err = SendReceive( EGetContentDimensions, args ); + } + + return err; + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::PreserveIconData() +// ----------------------------------------------------------------------------- +// +TInt RAknIconSrvClient::PreserveIconData( CAknIconManager& aManager ) const + { + RFile* file = NULL; + + TRAPD( err, + { + file = aManager.FileHandleL(); + } ); + + if ( err != KErrNone ) + { + return err; + } + + TAknIconParams info; + aManager.GetFileName( info.iFileName ); + info.iBitmapId = aManager.IconIdToIndex( aManager.BitmapId() ); + info.iAppIcon = aManager.GetAppIcon(); + if (aManager.IsDefaultIconDirUsed()) + { + info.SetDefaultIconDirUsed(); + } + + if ( file ) + { + info.iFile = *file; + } + + // Other members of TAknIconParams omitted. + + TPckgC paramPack( info ); + TIpcArgs args( ¶mPack, 0, 0, 0 ); + + if ( info.iFile.SubSessionHandle() ) + { + err = info.iFile.TransferToServer( args, 2, 3 ); + } + + if ( err == KErrNone ) + { + err = SendReceive( EPreserveIconData, args ); + } + + return err; + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::DestroyIconData() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::DestroyIconData( CAknIconManager& aManager ) const + { + TAknIconParams info; + aManager.GetFileName( info.iFileName ); + info.iBitmapId = aManager.IconIdToIndex( aManager.BitmapId() ); + // Other members of TAknIconParams omitted. + info.iAppIcon = aManager.GetAppIcon(); + TPckgC paramPack( info ); + + SendReceive( EDestroyIconData, TIpcArgs(¶mPack) ); + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::GetInitData() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::GetInitData( + TAknIconInitData& aData ) const + { + TPckg returnPack( aData ); + SendReceive( EGetInitData, TIpcArgs( &returnPack ) ); + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::__SERVER_HEAP_MARK() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::__SERVER_HEAP_MARK() const + { +#if defined(_DEBUG) && defined(__WINS__) + SendReceive( EServerHeapMark, TIpcArgs() ); +#endif + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::__SERVER_HEAP_MARKEND() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::__SERVER_HEAP_MARKEND() const + { +#if defined(_DEBUG) && defined(__WINS__) + SendReceive( EServerHeapMarkEnd, TIpcArgs() ); +#endif + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::__SERVER_HEAP_FAILNEXT() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::__SERVER_HEAP_FAILNEXT( TInt aCount ) const + { +#if defined(_DEBUG) && defined(__WINS__) + SendReceive( EServerHeapFailNext, TIpcArgs(aCount) ); +#endif + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::__SERVER_HEAP_FAILNEXT_INCREASING() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::__SERVER_HEAP_FAILNEXT_INCREASING( TInt aCount ) const + { +#if defined(_DEBUG) && defined(__WINS__) + SendReceive( EServerHeapFailNextIncreasing, TIpcArgs(aCount) ); +#endif + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::__SERVER_HEAP_RESET() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::__SERVER_HEAP_RESET() const + { +#if defined(_DEBUG) && defined(__WINS__) + SendReceive( EServerHeapReset, TIpcArgs() ); +#endif + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::__SERVER_RESET_DYNAMICALLY_CHANGING_ALLOCATIONS() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::__SERVER_RESET_DYNAMICALLY_CHANGING_ALLOCATIONS() const + { +#if defined(_DEBUG) + SendReceive( EServerResetDynamicallyChangingAllocations, TIpcArgs() ); +#endif + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::__SERVER_HEAP_USED() +// ----------------------------------------------------------------------------- +// +TInt RAknIconSrvClient::__SERVER_HEAP_USED() const + { + TInt ret = 0; +#if defined(_DEBUG) + ret = SendReceive( EServerHeapUsed, TIpcArgs() ); +#endif + return ret; + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::__SERVER_HEAP_USED() +// ----------------------------------------------------------------------------- +// +void RAknIconSrvClient::__SERVER_SET_PREFERRED_ICON_DISPLAY_MODE( + TDisplayMode aMode ) const + { +#if defined(_DEBUG) + SendReceive( EServerSetPreferredIconDisplayMode, TIpcArgs( aMode ) ); +#endif + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::ConnectToServer() +// ----------------------------------------------------------------------------- +// +TInt RAknIconSrvClient::ConnectToServer() + { + // Connect to server and make sure this can't cause 2 servers launch + // if 2 clients are trying to connect simultaneously. + + TInt err = KErrNone; + + for ( TInt tries = 0; tries < KConnectionTries ; tries++ ) + { + err = CreateSession( KAknIconSrvName, TVersion(), KAsyncMessageSlots ); + + // Break if connected to existing server or if the problem is + // other than missing server. + + if ( err == KErrNone || + ( err != KErrNotFound && err != KErrServerTerminated ) ) + { + break; + } + + err = StartServer(); // try start a new server + + // If server launched ok or someone else got to launch it first, + // try connect again. + + if ( err != KErrNone && err != KErrAlreadyExists) + { + break; // server not launched: don't cycle round again + } + } + + return err; + } + +// ----------------------------------------------------------------------------- +// RAknIconSrvClient::EnableCache() +// ----------------------------------------------------------------------------- +// +TInt RAknIconSrvClient::EnableCache(TBool aEnable) + { + return SendReceive( EAknIconServRequestEnableCache, TIpcArgs(aEnable) ); + } + +// End of File