internetradio2.0/uisrc/irbacksteppingservicewrapper.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 19 Apr 2010 14:01:53 +0300
changeset 0 09774dfdd46b
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* Copyright (c) 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:  Wrapper for Back Stepping Service.
*
*/


#include <liwcommon.h>
#include <liwservicehandler.h>
#include <mmf/common/mmfcontrollerpluginresolver.h>

#include "irbsserviceconstants.h" 
#include "irbacksteppingservicewrapper.h"

_LIT8( KIRBackSteppingPrefix, "IRBS" );

// ======== MEMBER FUNCTIONS =================================================

// ---------------------------------------------------------------------------
// CIRBackSteppingServiceWrapper::NewL
// ---------------------------------------------------------------------------
//
CIRBackSteppingServiceWrapper* CIRBackSteppingServiceWrapper::NewL( TUid aUid )
    {
    CIRBackSteppingServiceWrapper* self = new( ELeave ) CIRBackSteppingServiceWrapper;
    CleanupStack::PushL( self );
    self->ConstructL( aUid );
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// CIRBackSteppingServiceWrapper::~CIRBackSteppingServiceWrapper
// ---------------------------------------------------------------------------
//
CIRBackSteppingServiceWrapper::~CIRBackSteppingServiceWrapper()
    {
    if ( iBsInterface )
        {
        iBsInterface->Close();
        }
    if ( iServiceHandler )
        {
        delete iServiceHandler;
        }
    }

// ---------------------------------------------------------------------------
// CIRBackSteppingServiceWrapper::HandleViewActivationEventL
// ---------------------------------------------------------------------------
//
void CIRBackSteppingServiceWrapper::HandleViewActivationEventL( const TVwsViewId aViewId,
                                                                TBool aEnter )
    {
    // Make Service Handler param lists.
    iInParamList->Reset();
	iOutParamList->Reset();
	
    RBuf8 buffer;
    CleanupClosePushL( buffer );
    buffer.CreateL( KIRBackSteppingPrefix().Length() + KDefaultRealWidth );
    buffer.Copy( KIRBackSteppingPrefix );
    // Convert 32-bit signed integer (TInt32) view uid to TInt.
    TInt64 viewUid = static_cast< TInt64 >( aViewId.iViewUid.iUid );
    buffer.AppendNum( viewUid );
        
	TLiwGenericParam state( KIRBSInParamState, TLiwVariant( buffer ) );
	iInParamList->AppendL( state );
	TLiwGenericParam enter( KIRBSInParamEnter, TLiwVariant( aEnter ) );
	iInParamList->AppendL( enter );

    // Execute view activation event.
	iBsInterface->ExecuteCmdL( KIRBSCmdForwardActivationEvent, *iInParamList, *iOutParamList );
    CleanupStack::PopAndDestroy(&buffer);

    // Check if BS Service consumed the event.
    HandleResultL();

	iInParamList->Reset();
	iOutParamList->Reset();
    }


// ---------------------------------------------------------------------------
// CIRBackSteppingServiceWrapper::HandleBackCommandL
// ---------------------------------------------------------------------------
//
TBool CIRBackSteppingServiceWrapper::HandleBackCommandL( const TVwsViewId aViewId )
    {
    // Make Service Handler param lists.
    iInParamList->Reset();
	iOutParamList->Reset();
	
    // Create message for back stepping wrapper to handle back command event.
    RBuf8 buffer;
    CleanupClosePushL( buffer );
    buffer.CreateL( KIRBackSteppingPrefix().Length() + KDefaultRealWidth );
    buffer.Copy( KIRBackSteppingPrefix );
    // Convert 32-bit signed integer (TInt32) view uid to TInt64.
    TInt64 viewUid = static_cast< TInt64 >( aViewId.iViewUid.iUid );
    buffer.AppendNum( viewUid );
    
	TLiwGenericParam state( KIRBSInParamState, TLiwVariant( buffer ) );
	iInParamList->AppendL( state );

    // Execute back event.
	iBsInterface->ExecuteCmdL( KIRBSCmdHandleBackCommand, *iInParamList, *iOutParamList );
    CleanupStack::PopAndDestroy(&buffer);

    // Check if BS Service consumes the event.
    TBool retVal = HandleResultL();

	iInParamList->Reset();
	iOutParamList->Reset();

	return retVal;
    }

// ---------------------------------------------------------------------------
// CIRBackSteppingServiceWrapper::CIRBackSteppingServiceWrapper
// ---------------------------------------------------------------------------
//
CIRBackSteppingServiceWrapper::CIRBackSteppingServiceWrapper()
    {
    // No implementation required.
    }

// ---------------------------------------------------------------------------
// CIRBackSteppingServiceWrapper::ConstructL
// ---------------------------------------------------------------------------
//
void CIRBackSteppingServiceWrapper::ConstructL( TUid aUid )
    {
    // Create Service Handler and keep as long as access to BS Service needed.
    iServiceHandler = CLiwServiceHandler::NewL();
    // For convenience keep pointers to Service Handler param lists.
	iInParamList = &iServiceHandler->InParamListL();
	iOutParamList = &iServiceHandler->OutParamListL();

    // Create AIW criteria.
    RCriteriaArray criteriaArray;
	CleanupResetAndDestroyPushL( criteriaArray );
	CLiwCriteriaItem* criterion = CLiwCriteriaItem::NewLC(
	    KLiwCmdAsStr,
	    KIRBSInterface,
	    KIRBSServiceID );
	criterion->SetServiceClass( TUid::Uid( KLiwClassBase ) );
	criteriaArray.AppendL( criterion );
	CleanupStack::Pop( criterion );

    // Attach AIW criteria.
	iServiceHandler->AttachL( criteriaArray );
	// Get BS Service interface.
	iServiceHandler->ExecuteServiceCmdL( *criterion, *iInParamList, *iOutParamList );
	CleanupStack::PopAndDestroy( &criteriaArray );

	// Check if BS interface can be found from output params.
	TInt pos( 0 );
	iOutParamList->FindFirst( pos, KIRBSInterface );
	if( KErrNotFound != pos )
		{
		// Extract BS interface from output params.
		ASSERT( pos >= 0 && pos < iOutParamList->Count() );
		iBsInterface = ( *iOutParamList )[pos].Value().AsInterface();	
		}
    
    if ( !iBsInterface )
        {
        // No BS Service available.
        User::Leave( KErrNotSupported );
        }

    // Initialize BS Service.
    InitializeL( aUid );
    }

// ---------------------------------------------------------------------------
// CIRBackSteppingServiceWrapper::InitializeL
// ---------------------------------------------------------------------------
//
void CIRBackSteppingServiceWrapper::InitializeL( const TUid aUid )
    {
    // Initialize BS Service.
    iInParamList->Reset();
	iOutParamList->Reset();

	TLiwGenericParam appUid( KIRBSInParamAppUid, TLiwVariant( aUid.iUid ) );
	iInParamList->AppendL( appUid );
	
	iBsInterface->ExecuteCmdL( KIRBSCmdInitialize, *iInParamList, *iOutParamList );

    if ( !HandleResultL() )
        {
        // Initialize command was not consumed.
        User::Leave( KErrArgument );
        }

	iInParamList->Reset();
	iOutParamList->Reset();
    }

// ---------------------------------------------------------------------------
// CIRBackSteppingServiceWrapper::HandleResultL
// ---------------------------------------------------------------------------
//
TInt CIRBackSteppingServiceWrapper::HandleResultL()
    {
    TBool retVal( EFalse );
    // Check if error can be found from outparams.
    TInt posErr( 0 );
	iOutParamList->FindFirst( posErr, LIW::EGenericParamError );
	if( KErrNotFound != posErr )
		{
		// Error code found - extract and handle
		ASSERT( posErr >= 0 && posErr < iOutParamList->Count() );
		TInt errorCode( KErrNone );
		( *iOutParamList )[posErr].Value().Get( errorCode );
		User::LeaveIfError( errorCode );
		}
    // No errors found. Check if status info can be found from outparams.
    TInt posStat( 0 );
    iOutParamList->FindFirst( posStat, KIRBSOutParamStatusInfo );
    if( KErrNotFound != posStat )
		{
		// Status info present - extract.
		ASSERT( posStat >= 0 && posStat < iOutParamList->Count() );
		( *iOutParamList )[posStat].Value().Get( retVal );
		}
	else
	    {
	    // No status info found.
	    User::Leave( KErrNotFound );
	    }
    return retVal;
    }