--- /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 <flogger.h>
+
+#ifdef PRECACHELOG
+#include <flogger.h>
+#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<CAknIconSrvTlsData*>( 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<CAknIconSrvTlsData*>( 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<CAknIconSrvTlsData*>( 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<TAknIconParams> 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<TAknIconSrvReturnData> 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<TAknIconParams> 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<TAknIconParams> paramPack( info );
+ TPckg<TAknContentDimensions> 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<TAknIconParams> 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<TAknIconParams> paramPack( info );
+
+ SendReceive( EDestroyIconData, TIpcArgs(¶mPack) );
+ }
+
+// -----------------------------------------------------------------------------
+// RAknIconSrvClient::GetInitData()
+// -----------------------------------------------------------------------------
+//
+void RAknIconSrvClient::GetInitData(
+ TAknIconInitData& aData ) const
+ {
+ TPckg<TAknIconInitData> 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