photosgallery/commonui/src/glxbackservicewrapper.cpp
changeset 0 4e91876724a2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/commonui/src/glxbackservicewrapper.cpp	Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,269 @@
+/*
+* Copyright (c) 2008-2009 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:    wrapper for Back Stepping Service
+*
+*/
+
+
+
+
+// from AIW and LIW
+#include <liwcommon.h>
+#include <liwservicehandler.h>
+
+#include <glxtracer.h>
+#include <glxlog.h>
+
+// parameter names used by BS Service
+#include "glxbsserviceconstants.h"
+
+// for CleanupResetAndDestroyPushL
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+
+
+#include "glxbackservicewrapper.h"
+
+using namespace LIW;
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CGlxBackServiceWrapper::CGlxBackServiceWrapper()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CGlxBackServiceWrapper::ConstructL( const TUid aUid )
+    {
+    TRACER( "CGlxBackServiceWrapper::ConstructL" );
+    // create Service Handler and keep as long as access to BS Service needed
+    iServiceHandler = CLiwServiceHandler::NewL();
+    // for convinience keep pointers to Service Handler param lists
+	iInParamList = &iServiceHandler->InParamListL();
+	iOutParamList = &iServiceHandler->OutParamListL();
+
+    RCriteriaArray criteriaArray;
+	CleanupResetAndDestroyPushL( criteriaArray );
+	
+	// create Liw criteria
+	CLiwCriteriaItem* criterion = 
+	                CLiwCriteriaItem::NewLC( KLiwCmdAsStr, KBSInterface, KBSServiceID );
+	criterion->SetServiceClass( TUid::Uid( KLiwClassBase ) );
+
+	criteriaArray.AppendL( criterion );
+	CleanupStack::Pop( criterion );
+
+    // attach Liw criteria
+	iServiceHandler->AttachL( criteriaArray );
+	// get BS Service interface
+	iServiceHandler->ExecuteServiceCmdL( *criterion, 
+	                                        *iInParamList, 
+	                                        *iOutParamList );
+
+	CleanupStack::PopAndDestroy( &criteriaArray );
+	
+	// extract BS interface from output params
+	TInt pos( 0 );
+	iOutParamList->FindFirst( pos, KBSInterface );
+	if( pos != KErrNotFound )
+		{
+		iBSInterface = (*iOutParamList)[pos].Value().AsInterface();	
+		}
+    
+    if ( !iBSInterface )
+        {
+        // handle no BS Service
+        User::Leave( KErrNotFound );
+        }
+
+    InitializeL( aUid );
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CGlxBackServiceWrapper* CGlxBackServiceWrapper::NewL( 
+                                                            const TUid aUid )
+    {
+    TRACER( "CGlxBackServiceWrapper::NewL" );
+    CGlxBackServiceWrapper* self = 
+                        CGlxBackServiceWrapper::NewLC( aUid );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CGlxBackServiceWrapper* CGlxBackServiceWrapper::NewLC( 
+                                                            const TUid aUid )
+    {
+    TRACER( "CGlxBackServiceWrapper::NewLC" );
+    CGlxBackServiceWrapper* self = new( ELeave ) CGlxBackServiceWrapper;
+    CleanupStack::PushL( self );
+    self->ConstructL( aUid );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CGlxBackServiceWrapper::~CGlxBackServiceWrapper()
+    {
+    TRACER( "CGlxBackServiceWrapper::~CGlxBackServiceWrapper" );
+    if ( iBSInterface )
+        {
+        iBSInterface->Close();
+        }
+
+    delete iServiceHandler;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CGlxBackServiceWrapper::ForwardActivationEventL( const TDesC8& aState, 
+                                                        const TBool aEnter )
+    {
+    TRACER( "CGlxBackServiceWrapper::ForwardActivationEventL" );
+    iInParamList->Reset();
+	iOutParamList->Reset();
+
+	TLiwGenericParam state( KBSInParamState, TLiwVariant( aState ) );
+	iInParamList->AppendL( state );
+	TLiwGenericParam enter( KBSInParamEnter, TLiwVariant( aEnter ) );
+	iInParamList->AppendL( enter );
+	
+	iBSInterface->ExecuteCmdL( KBSCmdForwardActivationEvent, 
+	                            *iInParamList, 
+	                            *iOutParamList );
+	
+    TInt result = HandleResultL();
+	
+	iInParamList->Reset();
+	iOutParamList->Reset();
+	
+	return result;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CGlxBackServiceWrapper::HandleBackCommandL( const TDesC8& aState, 
+                                                   const TBool aCheckOnly)
+    {
+    TRACER( "CGlxBackServiceWrapper::HandleBackCommandL" );
+    iInParamList->Reset();
+	iOutParamList->Reset();
+
+	TLiwGenericParam state( KBSInParamState, TLiwVariant( aState ) );
+	iInParamList->AppendL( state );
+	TLiwGenericParam checkOnly( KBSInParamCheckOnly, TLiwVariant( aCheckOnly ) );
+	iInParamList->AppendL( checkOnly );
+	
+	iBSInterface->ExecuteCmdL( KBSCmdHandleBackCommand, 
+	                            *iInParamList, 
+	                            *iOutParamList );
+	
+	TInt result = HandleResultL();
+	
+	iInParamList->Reset();
+	iOutParamList->Reset();
+	
+	return result;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CGlxBackServiceWrapper::InitializeL( const TUid aUid )
+    {
+    TRACER( "CGlxBackServiceWrapper::InitializeL" );
+    iInParamList->Reset();
+	iOutParamList->Reset();
+
+	TLiwGenericParam appUid( KBSInParamAppUid, TLiwVariant( aUid.iUid ) );
+	iInParamList->AppendL( appUid );
+	
+	iBSInterface->ExecuteCmdL( KBSCmdInitialize, 
+	                            *iInParamList, 
+	                            *iOutParamList );
+
+    if ( HandleResultL() != 1 )
+        {
+        // Initialize command was not consumed - handle failiure
+        User::Leave( KErrArgument );
+        }
+	
+	iInParamList->Reset();
+	iOutParamList->Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CGlxBackServiceWrapper::HandleResultL()
+    {
+    TRACER( "CGlxBackServiceWrapper::HandleResultL" );
+    TInt statusInfo( KErrNotFound );
+    
+    TInt posErr( 0 );
+	iOutParamList->FindFirst( posErr, EGenericParamError );
+	if( posErr != KErrNotFound )
+		{
+		// error code found - extract and handle
+		TInt errorCode( KErrNone );
+		(*iOutParamList)[posErr].Value().Get( errorCode );
+		
+		User::LeaveIfError( errorCode );
+		}
+
+    // if no error returned, carry on
+    TInt posStat( 0 );
+    iOutParamList->FindFirst( posStat, KBSOutParamStatusInfo );
+    if( posStat != KErrNotFound )
+		{
+		// status info present - extract and return
+		(*iOutParamList)[posStat].Value().Get( statusInfo );
+		}
+	else
+	    {
+	    // no return value
+	    // this should not happen
+	    User::Leave( KErrNotFound );
+	    }
+
+    return statusInfo;
+    }