diff -r 000000000000 -r 2f259fa3e83a psln/PslnFramework/src/PslnFWAppThemeHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/psln/PslnFramework/src/PslnFWAppThemeHandler.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,293 @@ +/* +* Copyright (c) 2005-2007 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: Handles interface towards XUIKON, sets and gets theme information. +* +*/ + + + +// INCLUDE FILES + +// Psln Framework +#include +#include +#include "PslnXNClientLoader.h" + +// Constants +#include "PslnConst.h" +#include "PslnDebug.h" + +// Xuikon +#include + +#include + +// CONTANTS +// Path to wrapper dll for XnClient. +_LIT( KPslnXuikonClientLoaderName, + "\\system\\libs\\PslnXNClientLoader.dll"); + +// TYPE DEFINITIONS +// Xuikon client loader. +typedef TAny* (*NewXuikonClientL)(); + +// ----------------------------------------------------------------------------- +// C++ constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CPslnFWAppThemeHandler::CPslnFWAppThemeHandler( + MPslnFWAppThemeObserver& aObserver, + CArrayPtrFlat& aApplicationSkinList ) : + iObserver( aObserver ), iAppThemeList( &aApplicationSkinList ) + { + } + +// ----------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPslnFWAppThemeHandler::ConstructL() + { + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler::ConstructL BEGIN"); + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler::ConstructL END"); + } + +// ----------------------------------------------------------------------------- +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPslnFWAppThemeHandler* CPslnFWAppThemeHandler::NewL + ( MPslnFWAppThemeObserver& aObserver, + CArrayPtrFlat& aApplicationSkinList ) + { + CPslnFWAppThemeHandler* self = + new( ELeave ) CPslnFWAppThemeHandler( aObserver, aApplicationSkinList ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + + +// Destructor +CPslnFWAppThemeHandler::~CPslnFWAppThemeHandler() + { + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler destructor BEGIN"); + // deleting iXnClientLoader automatically cancels all existing fetches. + delete iXnClientLoader; + if( iXnClientDllLoaded ) + { + iXnClientDll.Close(); + } + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler destructor END"); + // do not destroy iAppThemeList - it is owned by application. + } + +// ----------------------------------------------------------------------------- +// Collect application specific themes from server. +// ----------------------------------------------------------------------------- +// +EXPORT_C TXnServiceCompletedMessage CPslnFWAppThemeHandler::GetApplicationSkinsL( + TUid aUid ) + { + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler::GetApplicationSkinsL BEGIN"); + if ( !iXnClientLoader ) + { + CreateXnClientL(); + } + // Remember to cancel first. CPslnFWAppThemeHandler only supports one + // active request per application. + if ( iFetchOngoing ) + { + return EXnServiceRequestError; + } + + // Clear previous fetch first. + iFetchOngoing = ETrue; + if ( iAppThemeList ) + { + iAppThemeList->ResetAndDestroy(); + } + + // Start looking for application skins. + CXnODT* odt = CreateODTFromAppUidLC( aUid ); + TXnServiceCompletedMessage ret = + iXnClientLoader->GetListHeaders( *odt, *iAppThemeList ); + + if ( ret == EXnGetListHeadersSuccess ) + { + // There are existing application specific skins. + // Let's start looking for these. + iXnClientLoader->GetNextHeader(); + } + else if ( ret == EXnGetListHeadersEmpty ) + { + // There are no application specific skins now, but + // let's start to wait if some would appear later. + iXnClientLoader->GetNextHeader(); + } + else if ( ret == EXnGetListHeadersFailed || ret == EXnServiceRequestError ) + { + // Error. + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler::GetApplicationSkinsL Error"); + } + else + { + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler::GetApplicationSkinsL Empty else"); + } + + CleanupStack::PopAndDestroy( odt ); + return ret; + } + +// ----------------------------------------------------------------------------- +// Sets application specific theme. +// ----------------------------------------------------------------------------- +// +EXPORT_C TXnServiceCompletedMessage CPslnFWAppThemeHandler::SetApplicationSkinL( + CXnODT& aThemeODT ) + { + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler::SetApplicationSkinL BEGIN"); + if ( !iXnClientLoader ) + { + CreateXnClientL(); + } + + CXnODT* odt = CXnODT::NewL(); + CleanupStack::PushL( odt ); + + TXnServiceCompletedMessage ret = + iXnClientLoader->SetActiveTheme( aThemeODT, *odt ); + + CleanupStack::PopAndDestroy( odt ); + return ret; + } + +// ----------------------------------------------------------------------------- +// CPslnFWAppThemeHandler::CancelGetApplicationSkins +// +// ----------------------------------------------------------------------------- +// +EXPORT_C void CPslnFWAppThemeHandler::CancelGetApplicationSkins() + { + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler::CancelGetApplicationSkins BEGIN"); + iFetchOngoing = EFalse; + if ( iXnClientLoader ) + { + iXnClientLoader->CancelGetListHeaders(); + } + } + +EXPORT_C TXnServiceCompletedMessage CPslnFWAppThemeHandler::SetApplicationSkinAndExitL( + CXnODT& aThemeODT ) + { + TXnServiceCompletedMessage ret = SetApplicationSkinL( aThemeODT ); + if ( ret == EXnSetActiveThemeSuccess ) + { + CAknEnv::RunAppShutter(); + } + return ret; + } + +// ----------------------------------------------------------------------------- +// Xuikon theme manager callback. +// ----------------------------------------------------------------------------- +// +void CPslnFWAppThemeHandler::HandleXnClientMessage( + TXnServiceCompletedMessage aMessage ) + { + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler::HandleXnClientMessage BEGIN"); + switch ( aMessage ) + { + case EXnGetListHeadersEmpty: + // notify client that there are no themes available. + // Destroy possible previously available skins + iObserver.HandleMessage( aMessage ); + if ( iAppThemeList ) + { + iAppThemeList->ResetAndDestroy(); + } + break; + case EXnGetListHeadersFailed: + // notify client that observation has been stopped + iObserver.HandleMessage( aMessage ); + CancelGetApplicationSkins(); + break; + case EXnServiceRequestCanceled: + case EXnServiceRequestError: + // notify client about possible error cause. + iObserver.HandleMessage( aMessage ); + break; + case EXnGetListHeadersUpdate: + // give the client the new list. + // Fall through + case EXnGetListHeadersRestart: + // notify client that old list is now not valid, and the new list needs to + // be used. + // Fall through + default: + iObserver.HandleMessage( aMessage, *iAppThemeList ); + break; + } + } + +// ----------------------------------------------------------------------------- +// Creates ODT based on application UID. +// +// ----------------------------------------------------------------------------- +// +CXnODT* CPslnFWAppThemeHandler::CreateODTFromAppUidLC( TUid aUid ) + { + PSLN_TRACE_DEBUG("CPslnFWAppThemeHandler::CreateODTFromAppUidLC BEGIN"); + CXnODT* odt = CXnODT::NewL(); + CleanupStack::PushL( odt ); + odt->SetAppUid( aUid.iUid ); // the UID of the application + odt->SetProviderUid( Nokia_VID ); // all provided by Nokia + return odt; + } + +// ----------------------------------------------------------------------------- +// Creates XUIKON Client interface. +// +// ----------------------------------------------------------------------------- +// +void CPslnFWAppThemeHandler::CreateXnClientL() + { + // Xuikon Client dll loading. + if( !iXnClientDllLoaded ) + { + if( iXnClientDll.Load( KPslnXuikonClientLoaderName ) == KErrNone ) + { + iXnClientDllLoaded = ETrue; + // Request the entry function + NewXuikonClientL xuikonClient = + (NewXuikonClientL) iXnClientDll.Lookup( KPslnDllEntryPoint ); + if( xuikonClient ) + { + // Create the class + iXnClientLoader = + (CPslnXNClientLoader*) (*xuikonClient)(); + } + } + } + // The wrapper failed to load. + if ( !iXnClientLoader ) + { + User::Leave( KErrNotFound ); + } + iXnClientLoader->CreateClientL( *this ); + } +// End of File