fmradio/fmradioactionhandler/src/fmradioactionhandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 00:17:10 +0200
changeset 0 f3d95d9c00ab
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 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: Implementation for the FM Radio Action Handler Plugin.
*
*/

#include <e32cmn.h>
#include <e32property.h>
#include <e32std.h>
#include <w32std.h>
#include <ecom/implementationproxy.h>
#include <liwvariant.h>
#include <apgtask.h>
#include <apgcli.h>
#include <apacmdln.h>
#include <fmradiocommandlineparams.h>
#include <fmradiointernalpskeys.h>
#include <fmradiouids.h>

#include "fmradioactionhandler.h"
#include "fmradioactionhandler.hrh"
#include "fmradioactionhandlerdefs.h"

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

// ---------------------------------------------------------
// CFMRadioActionHandler::~CFMRadioActionHandler
// ---------------------------------------------------------
//
CFMRadioActionHandler::~CFMRadioActionHandler()
    {
    }

// ---------------------------------------------------------
// CFMRadioActionHandler::CFMRadioActionHandler
// ---------------------------------------------------------
//
CFMRadioActionHandler::CFMRadioActionHandler()
    {
    }
    
// ---------------------------------------------------------
// CFMRadioActionHandler::ConstructL
// ---------------------------------------------------------
//
void CFMRadioActionHandler::ConstructL()
    {
    }

// ---------------------------------------------------------
// CFMRadioActionHandler::ExecuteActionL
// ---------------------------------------------------------
//
TInt CFMRadioActionHandler::ExecuteActionL( const CLiwMap* aMap )
    {
    TInt retValue( KErrNone );
    RBuf command;
    CleanupClosePushL( command );
    
    retValue = ExtractStringL( aMap, command, KFMRadioCommand);
    if ( retValue == KErrNone )
        {
        if ( !command.CompareF( KFMRadioCommandValueStepPrevious ) )
            {
            StepPrevious();
            }
        else if ( !command.CompareF( KFMRadioCommandValueStepNext ) )
            {
            StepNext();
            }
        else if ( !command.CompareF( KFMRadioCommandValueMute) )
            {
            Mute();
            }
        else if ( !command.CompareF( KFMRadioCommandValueUnmute ) )
            {
            Unmute();
            }
        else if ( !command.CompareF( KFMRadioCommandValueSeekUp ) )
            {
            SeekUp();
            }
        else if ( !command.CompareF( KFMRadioCommandValueSeekDown ) )
            {
            SeekDown();
            }
        else if ( !command.CompareF( KFMRadioCommandValueStartNowPlaying ) )
            {
            StartToNowPlayingL();
            }
        else
            {
            retValue = KErrNotSupported;
            }
        }
    CleanupStack::PopAndDestroy( &command );
    return retValue;
    }

// ---------------------------------------------------------
// CFMRadioActionHandler::StepPrevious
// ---------------------------------------------------------
//
void CFMRadioActionHandler::StepPrevious()
    {
    RProperty::Set( KFMRadioPSUid, KFMRadioPSControlStepToChannel, EFMRadioPSStepToChannelDown );
    }

// ---------------------------------------------------------
// CFMRadioActionHandler::StepNext
// ---------------------------------------------------------
//
void CFMRadioActionHandler::StepNext()
    {
    RProperty::Set( KFMRadioPSUid, KFMRadioPSControlStepToChannel, EFMRadioPSStepToChannelUp );
    }

// ---------------------------------------------------------
// CFMRadioActionHandler::Mute
// ---------------------------------------------------------
//
void CFMRadioActionHandler::Mute()
    {
    RProperty::Set( KFMRadioPSUid, KFMRadioPSControlSetRadioMuteState, EFMRadioPSMuteStateOn );
    }

// ---------------------------------------------------------
// CFMRadioActionHandler::Unmute
// ---------------------------------------------------------
//
void CFMRadioActionHandler::Unmute()
    {
    RProperty::Set( KFMRadioPSUid, KFMRadioPSControlSetRadioMuteState, EFMRadioPSMuteStateOff );    
    }

// ---------------------------------------------------------
// CFMRadioActionHandler::SeekUp
// ---------------------------------------------------------
//
void CFMRadioActionHandler::SeekUp()
    {
    //RProperty::Set( KFMRadioPSUid, KFMRadioPSControlSeek, EFMRadioPSSeekUp );
    }

// ---------------------------------------------------------
// CFMRadioActionHandler::SeekDown
// ---------------------------------------------------------
//
void CFMRadioActionHandler::SeekDown()
    {
    //RProperty::Set( KFMRadioPSUid, KFMRadioPSControlSeek, EFMRadioPSSeekDown );
    }

// ---------------------------------------------------------
// CFMRadioActionHandler::StartToNowPlayingL
// ---------------------------------------------------------
//
void CFMRadioActionHandler::StartToNowPlayingL()
    {
    RWsSession wsSession;
                
    User::LeaveIfError(wsSession.Connect() );
    CleanupClosePushL( wsSession );
    
    TApaTaskList taskList( wsSession );
    TUid appUid = TUid::Uid( KUidFMRadioApplication );
    TApaTask fmRadioTask = taskList.FindApp( appUid );
    
    const TInt KFMRadioViewIdLength = 3;
    RBuf8 params;
    params.CreateL( KFMRadioCommandActivateView().Length() + KFMRadioViewIdLength );
    params.Copy( KFMRadioCommandActivateView );
    params.Append( _L(" ") );
    params.AppendNum( KFMRadioMainViewId.iUid );
    params.CleanupClosePushL();
    
    if ( !fmRadioTask.Exists() )
        {
        RApaLsSession apaSession;
        CleanupClosePushL( apaSession );
                
        User::LeaveIfError( apaSession.Connect() );
        User::LeaveIfError( apaSession.GetAllApps() );
                
        TApaAppInfo appInfo;
        User::LeaveIfError( apaSession.GetAppInfo( appInfo, appUid ) );
                
        CApaCommandLine* startParams = CApaCommandLine::NewLC();
        startParams->SetExecutableNameL( appInfo.iFullName );
        startParams->SetCommandL( EApaCommandRun ); 
        startParams->SetTailEndL( params );
        User::LeaveIfError( apaSession.StartApp( *startParams ) );
        CleanupStack::PopAndDestroy( 2, &apaSession );
        }
    else
        {
        User::LeaveIfError( fmRadioTask.SendMessage( appUid, params ) );
        }
    CleanupStack::PopAndDestroy( 2 );
    }

// ---------------------------------------------------------
// CFMRadioActionHandler::ExtractStringLC
// ---------------------------------------------------------
//
TInt CFMRadioActionHandler::ExtractStringL( const CLiwMap* aMap, RBuf& aString, const TDesC8& aMapName )
    {
    TInt err( KErrNotFound );
    TLiwVariant variant;
    variant.PushL();
    TPtrC tempString( KNullDesC );    
    if ( aMap->FindL( aMapName, variant ) )
        {
        variant.Get( tempString );
        aString.Close();
        aString.CreateL( tempString );
        err = KErrNone;
        }
    CleanupStack::PopAndDestroy( &variant );    
    return err;
    }

/** Provides a key-value pair table, that is used to identify the correct construction function for the requested interface. */
const TImplementationProxy KFMRadioActionHandlerImplementationTable[] =
    {
    IMPLEMENTATION_PROXY_ENTRY( KFMRadioActionHandlerImplementationUid, CFMRadioActionHandler::NewL )
    };

const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount );

// ---------------------------------------------------------------------------
// Returns the implementations provided by this ECOM plugin DLL.
// ---------------------------------------------------------------------------
//
EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
    {
    aTableCount = sizeof( KFMRadioActionHandlerImplementationTable ) / sizeof( TImplementationProxy );
    return KFMRadioActionHandlerImplementationTable;
    }