diff -r 000000000000 -r 05e9090e2422 skins/AknSkins/srvsrc/AknsSrvSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/skins/AknSkins/srvsrc/AknsSrvSession.cpp Thu Dec 17 09:14:12 2009 +0200 @@ -0,0 +1,594 @@ +/* +* Copyright (c) 2002-2008 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: Session object for skin server. +* +*/ + + +// INCLUDE FILES + +#include "AknsSrvSession.h" +#include "AknsSrv.h" +#include + +#include "AknsDebug.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::CAknsSrvSession +// C++ constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CAknsSrvSession::CAknsSrvSession() : CSession2() + { + } + +// ----------------------------------------------------------------------------- +// Destructor. +// ----------------------------------------------------------------------------- +// +CAknsSrvSession::~CAknsSrvSession() + { + EnableNotify(); + iHandler = NULL; // Not owned + + // Ensure that server does not continue waiting ack after exit + + for (TInt count = 0; count < iPendingAcks; count++) + { + Server()->AcknowledgeNotification( EAknsSCHNContentChanged ); + } + + iPendingAcks = 0; + iCountNotifications = EFalse; + iNotifyList.Reset(); + } + +// ----------------------------------------------------------------------------- +// CAknSkinSrvSession::DispatchMessageL() +// ----------------------------------------------------------------------------- +// +TInt CAknsSrvSession::DispatchMessageL( const RMessage2& aMessage ) + { + TInt err( KErrNone ); + + switch ( aMessage.Function() ) + { + case EAknSkinSrvEnableNotifySkinChange: + aMessage.HasCapabilityL(ECapabilitySwEvent); + EnableNotify(); + break; + case EAknSkinSrvDisableNotifySkinChange: + aMessage.HasCapabilityL(ECapabilitySwEvent); + DisableNotify(); + break; + case EAknSkinSrvSetAllItemDefSets: + aMessage.HasCapabilityL(ECapabilityWriteDeviceData); + err = SetAllItemDefSets( aMessage ); + break; + case EAknSkinSrvSetItemDefSet: + // this is deprecated as of 3.0 + break; + case EAknSkinSrvClientError: + ClientError( aMessage ); + break; + case EAknSkinSrvSetNotifyHandler: + SetNotifyHandler( aMessage ); + break; + case EAknSkinSrvNextEvent: + NextEvent(aMessage); + break; + case EAknSkinSrvCancel: + Cancel(); + break; + case EAknSkinSrvSetIdleWallPaper: + aMessage.HasCapabilityL(ECapabilityWriteDeviceData); + SetIdleWallPaperL( aMessage ); + break; + /*case EAknSkinSrvSetPinboardWallPaper: + break;*/ + case EAknSkinSrvStoreScalableGfx: + StoreScalableGraphicsL( aMessage ); + break; + case EAknSkinSrvClearScalableGfx: + ClearScalableGraphics( aMessage ); + break; + case EAknSkinSrvAckNotification: + AcknowledgeNotification( aMessage ); + break; + case EAknSkinSrvOpenBitmapFile: + OpenBitmapFileL( aMessage ); + break; + /*case EAknSkinSrvDeleteSkin: + break; + case EAknSkinSrvCopySkin: + break;*/ + case EAknSkinSrvOpenIniFile: + aMessage.HasCapabilityL(ECapabilityWriteDeviceData); + OpenIniFileL( aMessage ); + break; + case EAknSkinSrvCopySoundFile: + aMessage.HasCapabilityL(ECapabilityWriteDeviceData); + CopySoundFileL( aMessage ); + break; + case EAknSkinSrvEnumeratePackages: + EnumeratePackages( aMessage ); + break; + case EAknSkinSrvReceivePackages: + ReceivePackages( aMessage ); + break; + case EAknSkinSrvStoreMorphingScalableGfx: + StoreScalableGraphicsL( aMessage, ETrue ); + break; + case EAknSkinSrvDecodeWallpaperImage: + DecodeWallpaperImageL( aMessage ); + break; + case EAknSkinSrvFreeDecodedWallpaper: + FreeDecodedWallpaper( aMessage ); + break; + case EAknSkinSrvCacheWallpaperImage: + CacheWallpaperImageL( aMessage ); + break; + case EAknSkinSrvOpenImageInifile: + aMessage.HasCapabilityL(ECapabilityWriteDeviceData); + OpenImageInifileL( aMessage ); + break; + case EAknSkinSrvSetSlideSetWP: + aMessage.HasCapabilityL(ECapabilityWriteDeviceData); + Server()->SetSlidesetWallpaperL(); + break; + case EAknSkinSrvStopSSIniFileObserver: + Server()->StopSlidesetIniFileObserver(); + break; + case EAknSkinSrvFreeLayoutBitmaps: + Server()->FreeLayoutBitmaps( aMessage ); + break; + case EAknSkinSrvCheckIconConfiguration: + err = CheckIconConfiguration( aMessage ); + break; + default: + AKNS_TRACE_ERROR("CAknsSrvSession::DispatchMessageL BAD REQUEST!"); + err = KErrGeneral; + PanicClient( aMessage, EAknsSrvBadRequest ); + break; + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CAknSkinSrvSession::ServiceL() +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::ServiceL(const RMessage2& aMessage) + { + TInt ret( KErrNone ); + + AKNS_TRACE_INFO1("CAknsSrvSession::ServiceL dispatch %i", aMessage.Function() ); + TRAPD( err, {ret = DispatchMessageL( aMessage );} ); + AKNS_TRACE_INFO1("CAknsSrvSession::ServiceL result %i", err ); + + // don't complete the functions which open a filehandle as if they succeeded + // the message should already be completed and double completion would result in a PANIC + // If an error(Leave) occurred, complete even these two few lines below + if (!err && ( (aMessage.Function() == EAknSkinSrvOpenBitmapFile) || + (aMessage.Function() == EAknSkinSrvOpenIniFile) || + (aMessage.Function() == EAknSkinSrvOpenImageInifile))) + { + return; + } + if ( ret != KErrNone ) + { + // Server calls that return value are handled differently. + if ( aMessage.Function() == EAknSkinSrvSetAllItemDefSets || + aMessage.Function() == EAknSkinSrvCheckIconConfiguration ) + { + aMessage.Complete( err != KErrNone ? err : ret ); + } + // Client has already been panicked and thus message completed. + return; + } + + // If the service routine leaved, return the leave reason. + // Otherwise, return its return code. + if (aMessage.Function() != EAknSkinSrvNextEvent) + { + __ASSERT_ALWAYS( !aMessage.IsNull(), + User::Panic( KAknSkinSrvPanicCategory, EAknsSrvInvalidMessageHandle ) ); + aMessage.Complete( err != KErrNone ? err : ret ); + } + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::PanicClient() +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::PanicClient( const RMessage2& aMessage, TAknSkinSrvPanic aPanic ) const + { + AKNS_TRACE_ERROR("CAknsSrvSession::PanicClient PANIC!"); + aMessage.Panic( KAknSkinSrvPanicCategory, aPanic ); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::EnableNotify() +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::EnableNotify() + { + Server()->EnableSkinChangeNotify(); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::DisableNotify() +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::DisableNotify() + { + Server()->DisableSkinChangeNotify(); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::SetNotifyHandler() +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::SetNotifyHandler( const RMessage2& aMessage ) + { + iHandler = (CAknsSkinChangeHandler*)( aMessage.Ptr0() ); //lint !e1924 Cast + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::Server() +// ----------------------------------------------------------------------------- +// +CAknsSrv* CAknsSrvSession::Server() + { + return (CAknsSrv*)(CSession2::Server()); //lint !e1924 Cast + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::Cancel() +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::Cancel() + { + if (iHandler && (iPendingNotifications == 0)) + { + __ASSERT_DEBUG( !iNotifyRequest.IsNull(), + User::Panic( KAknSkinSrvPanicCategory, EAknsSrvInvalidMessageHandle ) ); + if (!iNotifyRequest.IsNull()) + { + iNotifyRequest.Complete(KErrCancel); + } + } + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::SetAllItemDefSets() +// ----------------------------------------------------------------------------- +// +TInt CAknsSrvSession::SetAllItemDefSets( const RMessage2& aMessage ) + { + TInt error = KErrNone; + TInt number = static_cast (aMessage.Int0()); + TInt timestamp = static_cast (aMessage.Int1()); + TAknsPkgID pid; + pid.Set( timestamp, number ); + + Server()->SetActiveSkinContent(pid); + error = Server()->MergeAndBroadcast(); + return error; + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::SetIdleWallPaperL +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::SetIdleWallPaperL( const RMessage2& aMessage ) + { + // Message parameters + // 0. filename + // 1. filename length; + HBufC* buffer = HBufC::NewLC( aMessage.Int1() ); + TPtr filename = buffer->Des(); + aMessage.ReadL( 0, filename ); + Server()->SetWallpaperL(*buffer, KAknsIIDWallpaper ); + Server()->BroadcastUpdate(); + CleanupStack::PopAndDestroy( buffer ); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::StoreScalableGraphicsL +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::StoreScalableGraphicsL( + const RMessage2& aMessage, TBool aMorphing ) + { + // Message parameters + // 0. ItemID + // 1. LayoutType & size + // 2. bitmap handle + // 3. mask handle + TAknsItemID iid = { 0, 0 }; + TPckg iidPack( iid ); + TAknsSrvLayoutInfo layoutInfo; + TPckg layoutInfoPack( layoutInfo ); + // Leaves only if non-valid descriptor in client side. + aMessage.ReadL( 0, iidPack ); + aMessage.ReadL( 1, layoutInfoPack ); + TInt bmphandle = aMessage.Int2(); + TInt mskhandle = aMessage.Int3(); + + Server()->StoreScalableGraphicsL( + iid, + layoutInfo.iLayoutType, + layoutInfo.iLayoutSize, + bmphandle, + mskhandle, + aMorphing ); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::ClearScalableGraphics +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::ClearScalableGraphics( const RMessage2& /*aMessage*/ ) + { + // Message parameters + // (none) + Server()->ClearScalableGraphics(); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::AcknowledgeNotification +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::AcknowledgeNotification( const RMessage2& aMessage ) + { + // Message parameters + // 0. Reserved (zero) + Server()->AcknowledgeNotification( aMessage.Int0() ); + if (iPendingAcks && aMessage.Int0() == EAknsSCHNContentChanged) + { + iPendingAcks--; + } + if (!iPendingAcks) + { + iCountNotifications = EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::ClientError() +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::ClientError( const RMessage2& aMessage ) + { + TInt err = (TInt) (aMessage.Int0()); + Server()->HandleClientError(err); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::EnqueueNotification +// ----------------------------------------------------------------------------- +// +TBool CAknsSrvSession::EnqueueNotification( + const TAknsSkinChangeHandlerNotification aType, TBool aCountNotifications ) + { + if( !iHandler ) + { + return EFalse; + } + + if( iPendingNotifications == 0 ) + { + __ASSERT_DEBUG( !iNotifyRequest.IsNull(), + User::Panic( KAknSkinSrvPanicCategory, EAknsSrvInvalidMessageHandle ) ); + if (!iNotifyRequest.IsNull()) + { + iNotifyRequest.Complete(aType); + } + } + else + { + if (aType == EAknsSCHNContentChanged && aCountNotifications) + { + TBool found = EFalse; + for (TInt count = 0; count < iNotifyList.Count(); count++) + { + TAknsSkinChangeHandlerNotification type = iNotifyList[count]; + if (type == EAknsSCHNContentChanged) + { + found = ETrue; + } + } + if (!found) + { + // Append to queue + iNotifyList.Append( aType ); + iPendingAcks++; + } + else + { + return EFalse; + } + } + else + { + iNotifyList.Append( aType ); + } + } + + iPendingNotifications++; + iCountNotifications = aCountNotifications; + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::NextEvent() +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::NextEvent(const RMessage2 aMessage) + { + if( iCanceled ) + { + iNotifyList.Reset(); + + if (!iNotifyRequest.IsNull()) + { + iNotifyRequest.Complete( KErrCancel ); + } + __ASSERT_DEBUG( !aMessage.IsNull(), + User::Panic( KAknSkinSrvPanicCategory, EAknsSrvInvalidMessageHandle ) ); + if (!aMessage.IsNull()) + { + aMessage.Complete (KErrCancel); + } + return; + } + + if( iPendingNotifications>0 ) + { + iPendingNotifications--; + } + + __ASSERT_DEBUG( iPendingNotifications>=iNotifyList.Count(), + User::Panic( KAknSkinSrvPanicCategory, EAknsSrvNotifyListImbalance ) ); + + if( iNotifyList.Count() > 0 ) + { + // Take the first entry (FIFO) + TAknsSkinChangeHandlerNotification type = iNotifyList[0]; + iNotifyList.Remove(0); + __ASSERT_DEBUG( !aMessage.IsNull(), + User::Panic( KAknSkinSrvPanicCategory, EAknsSrvInvalidMessageHandle ) ); + if (!aMessage.IsNull()) + { + aMessage.Complete( type ); + } + } + else + { + // No notifications pending, store the message we want + // to complete in the future... + iNotifyRequest = aMessage; + } + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::OpenBitmapFileL +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::OpenBitmapFileL( const RMessage2 aMessage ) + { + // message parameters + // 0. filename + // 1. filehandle + Server()->OpenBitmapFileL(aMessage); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::OpenIniFileL +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::OpenIniFileL( const RMessage2 aMessage ) + { + // Message parameters + // 0. package id + // 1. location + // 2. filehandle + Server()->OpenIniFileL(aMessage); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::CopySoundFileL +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::CopySoundFileL( const RMessage2 aMessage) + { + Server()->CopySoundFileL( aMessage ); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::EnumeratePackages +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::EnumeratePackages( const RMessage2 aMessage ) + { + // Message parameters + // 0. package count (return value) + // 1. location + Server()->EnumeratePackages(aMessage); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::ReceivePackages +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::ReceivePackages(const RMessage2 aMessage) + { + // Message parameters + // 0. package count + // 1. pointer to store enumerated packages + Server()->ReceivePackages(aMessage); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::DecodeWallpaperImageL +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::DecodeWallpaperImageL(const RMessage2 aMessage) + { + Server()->DecodeWallpaperImageL( aMessage ); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::CacheWallpaperImageL +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::CacheWallpaperImageL(const RMessage2 aMessage) + { + Server()->CacheWallpaperImageL(aMessage); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::FreeDecodedWallpaper +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::FreeDecodedWallpaper( const RMessage2 aMessage) + { + Server()->FreeDecodedWallpaper( aMessage ); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::OpenImageInifileL +// ----------------------------------------------------------------------------- +// +void CAknsSrvSession::OpenImageInifileL( const RMessage2 aMessage) + { + Server()->OpenImageInifileL(aMessage); + } + +// ----------------------------------------------------------------------------- +// CAknsSrvSession::CheckIconConfiguration +// ----------------------------------------------------------------------------- +// +TInt CAknsSrvSession::CheckIconConfiguration( const RMessage2 aMessage ) + { + TInt iconConfigured = KErrNotFound; + iconConfigured = Server()->CheckIconConfiguration( aMessage ); + return iconConfigured; + } + +// End of File