--- /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 <PslnFWAppThemeHandler.h>
+#include <MPslnFWAppThemeObserver.h>
+#include "PslnXNClientLoader.h"
+
+// Constants
+#include "PslnConst.h"
+#include "PslnDebug.h"
+
+// Xuikon
+#include <XnODT.h>
+
+#include <AknEnv.h>
+
+// 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<CXnODT>& 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<CXnODT>& 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