cellularsrvapitest/telephonydevsoundhaitest/devsound/src/T_CTelephonyAudioRoutingData.cpp
author ivan.fildichev@opencode.com
Thu, 18 Nov 2010 15:42:16 +0200
branchopencode
changeset 88 5e27cc612ac7
parent 24 6638e7f4bd8f
permissions -rw-r--r--
Latest bug-fixes with added tests.

/*
* Copyright (c) 2005-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:
*
*/


#include "T_CTelephonyAudioRoutingData.h"

const TUid EEarPiece		 				= TUid::Uid(0x02);
const TUid EHeadSet			 				= TUid::Uid(0x04);
/*@{*/
//Command literals 
_LIT(KCmdNewL, 								"NewL");
_LIT(KCmdDestructor, 							"~");
_LIT(KCmdAvailableOutputs, 					"AvailableOutputs");
_LIT(KCmdOutput, 								"Output");
_LIT(KCmdPreviousOutput, 						"PreviousOutput");
_LIT(KCmdSetShowNote, 							"SetShowNote");
_LIT(KCmdGetShowNote,							"GetShowNote");
_LIT(KCmdSetOutputL, 							"SetOutputL");
/*@}*/

/*@{*/
//INI Section name literals 
_LIT(KMode, 								"Mode");
/*@}*/

/*@{*/
//Enumeration Literals 
_LIT(KENotActive, 							"ENotActive");
_LIT(KENone, 								"ENone");
_LIT(KEHandset, 							"EHandSet");
_LIT(KELoudSpeaker, 						"ELoudSpeaker");
_LIT(KEWiredAudioAccessory, 				"EWiredAudioAccessory");
_LIT(KEBTAudioAccessory, 					"EBTAudioAccessory");
_LIT(KETTY, 								"ETTY");
_LIT(KEEarPiece,							"EEarPiece");
_LIT(KEHeadSet,								"EHeadSet");
/*@}*/

const CDataWrapperBase::TEnumEntryTable CT_CTelephonyAudioRoutingData::iEnumOutput[] = 
	{ 
	{ KENotActive,	CTelephonyAudioRouting::ENotActive},
	{ KENone, CTelephonyAudioRouting::ENone},
	{ KEHandset, CTelephonyAudioRouting::EHandset},
	{ KEEarPiece, EEarPiece.iUid},
	{ KELoudSpeaker, CTelephonyAudioRouting::ELoudspeaker},
	{ KEWiredAudioAccessory, CTelephonyAudioRouting::EWiredAudioAccessory},
	{ KEHeadSet,	EHeadSet.iUid},
	{ KEBTAudioAccessory, CTelephonyAudioRouting::EBTAudioAccessory},
	{ KETTY, CTelephonyAudioRouting::ETTY}
	};

/**
 * Public destructor
 */
CT_CTelephonyAudioRoutingData::~CT_CTelephonyAudioRoutingData()
	{
	DestroyData();
	}

/**
 * Two phase constructor
 * @leave	system wide error
 */

CT_CTelephonyAudioRoutingData* CT_CTelephonyAudioRoutingData::NewL()
	{
	CT_CTelephonyAudioRoutingData* ret = new (ELeave) CT_CTelephonyAudioRoutingData();
	return ret;
	}

/**
 * Private constructor. First phase construction
 */

CT_CTelephonyAudioRoutingData::CT_CTelephonyAudioRoutingData()
	:
	iTelephonyAudioRouting (NULL)
	{
	}


void CT_CTelephonyAudioRoutingData::DestroyData()
{
if(iTelephonyAudioRouting)
	{
	delete iTelephonyAudioRouting;
	iTelephonyAudioRouting = NULL;
	}
}


/**
 * Return a pointer to the object that the data wraps
 * @return	pointer to the object that the data wraps
 */
TAny* CT_CTelephonyAudioRoutingData::GetObject()
	{
	return iTelephonyAudioRouting;
	}


/**
 * Process a command read from the Ini file
 * @param aCommand 			The command to process
 * @param aSection			The section get from the *.ini file of the project T_Wlan
 * @param aAsyncErrorIndex	Command index dor async calls to returns errors to
 * @return TBool			ETrue if the command is process
 * @leave					system wide error
 */

TBool CT_CTelephonyAudioRoutingData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt /*aAsyncErrorIndex*/)
	{
	TBool ret = ETrue;
	
	if (aCommand == KCmdNewL)
		{
		DoCmdNewL();
		}
	else if (aCommand == KCmdDestructor)
		{
		DoCmdDestructor();
		}
	else if (aCommand == KCmdAvailableOutputs)
		{
		DoCmdAvailableOutputs();
		}
	else if (aCommand == KCmdOutput)
		{
		DoCmdOutput();
		}
	else if (aCommand == KCmdPreviousOutput)
		{
		DoCmdPreviousOutput();
		}
	else if (aCommand == KCmdSetShowNote)
		{
		DoCmdSetShowNote(aSection);
		}
	else if (aCommand == KCmdGetShowNote)
		{
		DoCmdGetShowNote();
		}
	else if (aCommand == KCmdSetOutputL)
		{
		DoCmdSetOutputL(aSection);
		}
	else
		{
		ERR_PRINTF1(_L("Unknown command"));
		ret=EFalse;
		}
	
	return ret;	
	}

/**
 * Signals that available audio outputs have changed. 
 * @param CTelephonyAudioRouting& aTelephonyAudioRouting reference.
 * @return void
 */
void CT_CTelephonyAudioRoutingData::AvailableOutputsChanged( CTelephonyAudioRouting& /*aTelephonyAudioRouting*/)
	{
	INFO_PRINTF1(_L("CT_CTelephonyAudioRoutingData::AvailableOutputsChanged"));
	}

/**
 * Signals that current output has changed. 
 * @param CTelephonyAudioRouting& aTelephonyAudioRouting reference.
 * @return void
 */
void CT_CTelephonyAudioRoutingData::OutputChanged( CTelephonyAudioRouting& /*aTelephonyAudioRouting*/)
	{
	INFO_PRINTF1(_L("CT_CTelephonyAudioRoutingData::OutputChanged"));
	}

/**
 * Signals that CTelephonyAudioRouting::SetOutputL request issued by this
 * application (on CTelephonyAudioRouting instance) was serviced by the
 * Adaptation.
 * Only when the observer receives this callback, the application should consider
 * CTelephonyAudioRouting::SetOutputL message to be completed.
 *
 * @param CTelephonyAudioRouting& aTelephonyAudioRouting reference.
 * @param aError KErrNone if output requested by application is set, else
 *        system-wide error code.
 * @return void
 */
void CT_CTelephonyAudioRoutingData::SetOutputComplete( CTelephonyAudioRouting& /*aTelephonyAudioRouting*/, TInt aError)
	{
	DecOutstanding();
	if(aError != KErrNone)
		{
		ERR_PRINTF2(_L("Could not set output complete: %d"), aError);
		}
	else
		{
		INFO_PRINTF1(_L("CT_CTelephonyAudioRoutingData::SetOutputComplete"));
		}
	}

/**
 * Create an instance of CTelephonyAudioRouting
 * @param 
 * @return
 */
void CT_CTelephonyAudioRoutingData::DoCmdNewL()
	{
	INFO_PRINTF1(_L("*START*CT_CTelephonyAudioRoutingData::DoCmdNewL"));
	DestroyData();
	TRAPD(error,iTelephonyAudioRouting = CTelephonyAudioRouting::NewL(*this));
	if(error!=KErrNone)
		{
		ERR_PRINTF2(_L("> Could not create CTelephonyAudioRouting: %d"), error);
		SetError(error);
		}
	else
		{
		INFO_PRINTF1(_L("CTelephonyAudioRouting created successfully."));
		INFO_PRINTF1(_L("*END*CT_CTelephonyAudioRoutingData::DoCmdNewL"));
		}	
	}

/**
 * Delete the instance of CTelephonyAudioRouting
 * @param
 * @return
 */
void CT_CTelephonyAudioRoutingData::DoCmdDestructor()
	{
	INFO_PRINTF1(_L("*START*CT_CTelephonyAudioRoutingData::DoCmdDestructor"));
	DestroyData();
	INFO_PRINTF1(_L("*END*CTelephonyAudioRouting destroyed successfully."));
	}


/**
* Shows the array of currently available outputs.
* The array contains list of following outputs depending on whether the
* output is available or not at the time of query:
*  - EHandset
*  - ELoudspeaker
*  - EWiredAudioAccessory,
*  - EWiredAccessory,
*  - EBTAudioAccessory
*  - ETTY
* Audio can be routed to any of the available outputs in the list.
* @param 
* @return 
*/

void CT_CTelephonyAudioRoutingData::DoCmdAvailableOutputs()
	{
	INFO_PRINTF1(_L("*START*CT_CTelephonyAudioRoutingData::DoCmdAvailableOutputs"));	
	TInt availableOutput;
	const TArray<CTelephonyAudioRouting::TAudioOutput>& availableOutputsArray(iTelephonyAudioRouting->AvailableOutputs());
	
	if (availableOutputsArray.Count()==0)
		{
		INFO_PRINTF1(_L("None available output"));
		}
	else
		{
		TBuf<80> msg;
		for (TInt i=0;i<availableOutputsArray.Count();i++)
			{
			availableOutput = availableOutputsArray[i];
			switch (availableOutput)
				{
				case CTelephonyAudioRouting::ENotActive:
					msg.Append(_L("not active"));
				break;
				case CTelephonyAudioRouting::ENone:
					msg.Append(_L("none"));
				break;
				case CTelephonyAudioRouting::EHandset:
					msg.Append(_L("handset"));
				break;
				case CTelephonyAudioRouting::ELoudspeaker:
					msg.Append(_L("loudspeaker"));
				break;
				case CTelephonyAudioRouting::EWiredAudioAccessory:
					msg.Append(_L("wired acc"));
				break;
				case CTelephonyAudioRouting::EBTAudioAccessory:
					msg.Append(_L("BT audio acc"));
				break;
				case CTelephonyAudioRouting::ETTY:
					msg.Append(_L("ETTY"));
				break;
				default:
					msg.AppendFormat(_L("0x%x"), availableOutput);
				}
			if(i+1<availableOutputsArray.Count())
				{
				msg.Append(_L(","));
				}
			}
			INFO_PRINTF2(_L("Available Outputs: %S"), &msg);
		}
	INFO_PRINTF1(_L("*END*CT_CTelephonyAudioRoutingData::DoCmdAvailableOutputs"));
	}


/**
 * Shows the current output configured by the client application to play
 * telephony audio.
 * @param none.
 * @return void.
 */

void CT_CTelephonyAudioRoutingData::DoCmdOutput()
	{
	INFO_PRINTF1(_L("*START*CT_CTelephonyAudioRoutingData::DoCmdOutput"));
	iOutput = iTelephonyAudioRouting->Output();
    INFO_PRINTF2(_L("Output: 0x%x"),iOutput);
    switch(iOutput)
        {
        case CTelephonyAudioRouting::ENotActive :
        	INFO_PRINTF1(_L("Not active"));
        break;
        case CTelephonyAudioRouting::ENone :
        	INFO_PRINTF1(_L("None"));
        break;
        case CTelephonyAudioRouting::EHandset :
        	INFO_PRINTF1(_L("Handset"));
        break;
        case CTelephonyAudioRouting::ELoudspeaker :
        	INFO_PRINTF1(_L("Loudspeaker"));
        break;
        case CTelephonyAudioRouting::EWiredAudioAccessory :
        	INFO_PRINTF1(_L("Wired acc"));
        break;
        case CTelephonyAudioRouting::EBTAudioAccessory :
        	INFO_PRINTF1(_L("BT audio acc"));
        break;
        case CTelephonyAudioRouting::ETTY :
        	INFO_PRINTF1(_L("ETTY"));
        break;
        default:
        	INFO_PRINTF2(_L("0x%x"), iOutput);
        }
    INFO_PRINTF1(_L("*END*CT_CTelephonyAudioRoutingData::DoCmdOutput"));
	}


/**
 * Show the second last output that was successfully configured to
 * play telephony audio.
 * @param none.
 * @return void
 */

void CT_CTelephonyAudioRoutingData::DoCmdPreviousOutput()
	{
	INFO_PRINTF1(_L("*START*CT_CTelephonyAudioRoutingData::DoCmdPreviousOutput"));	
    CTelephonyAudioRouting::TAudioOutput previousOutput;
	previousOutput = iTelephonyAudioRouting->PreviousOutput();
	INFO_PRINTF2(_L("Previous audio output: 0x%x"), previousOutput);
    switch (previousOutput)
        {
        case CTelephonyAudioRouting::ENotActive:
        	INFO_PRINTF1(_L("Not active"));
        break;
        case CTelephonyAudioRouting::ENone:
        	INFO_PRINTF1(_L("None"));
        break;
        case CTelephonyAudioRouting::EHandset:
        	INFO_PRINTF1(_L("Handset"));
        break;
        case CTelephonyAudioRouting::ELoudspeaker:
        	INFO_PRINTF1(_L("Loudspeaker"));
        break;
        case CTelephonyAudioRouting::EWiredAudioAccessory:
        	INFO_PRINTF1(_L("Wired acc"));
        break;
        case CTelephonyAudioRouting::EBTAudioAccessory:
        	INFO_PRINTF1(_L("BT audio acc"));
        break;
        case CTelephonyAudioRouting::ETTY:
        	INFO_PRINTF1(_L("ETTY"));
        break;
        default:
        	INFO_PRINTF2(_L("0x%x"), previousOutput);
        }
    INFO_PRINTF1(_L("*END*CT_CTelephonyAudioRoutingData::DoCmdPreviousOutput"));	
	}


/*
 * Sends the Show Note mode to server along with the next SetOutputL()
 * request.
 * After SetOutputL() request from the Application is succesfully
 * processed by the server and application receives SetOutputComplete()
 * callback with KErrNone, it can query Show Note mode sent to server by
 * calling GetShowNote().
 * Other observers wanting to query Show Note mode can call GetShowNote()
 * after receiving OutputChanged() callback.
 *
 * @param aSection the Section to read from the ini file.
 * @return 
 */

void CT_CTelephonyAudioRoutingData::DoCmdSetShowNote(const TTEFSectionName& aSection)
	{
	INFO_PRINTF1(_L("*START*CT_CTelephonyAudioRoutingData::DoCmdSetShowNote"));
	TBool mode;
	if(!GetBoolFromConfig(aSection, KMode, mode))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KMode);
    	SetBlockResult(EFail);
		}
	else
		{
		TInt error = iTelephonyAudioRouting->SetShowNote(mode);
	    if (error != KErrNone)
	        {
	    	ERR_PRINTF2(_L("Could not set show note. Error: %d"), error);
	    	SetError(error);
	        }
	    else
	    	{
	    	INFO_PRINTF2(_L("Mode set to: %d"), mode);
			INFO_PRINTF1(_L("*END*CT_CTelephonyAudioRoutingData::DoCmdSetShowNote"));
	    	}		
		}    
	}


/**
 * Shows the  Show Note mode for the last succesfully completed
 * SetOutputL() request.
 * @param 
 * @return 
 */


void CT_CTelephonyAudioRoutingData::DoCmdGetShowNote()
	{
	INFO_PRINTF1(_L("*START*CT_CTelephonyAudioRoutingData::DoCmdGetShowNote"));
	TBool mode;
	TInt error = iTelephonyAudioRouting->GetShowNote(mode);
    if(error != KErrNone) 
        {
    	ERR_PRINTF2(_L("Could not get show note. Error: %d"), error);
    	SetError(error);
        }
    else
    	{
    	INFO_PRINTF2(_L("Mode: %d"), mode);
        INFO_PRINTF1(_L("*END*CT_CTelephonyAudioRoutingData::DoCmdGetShowNote"));
    	}    
	}

/**
 * Sends an asynchronous request to Adaptation to set the output
 * where telephony audio will be routed. This request is completed only
 * when the application receives
 * MTelephonyAudioRoutingObserver::SetOutputComplete callback.
 * @param aSection - The section to read from the ini file
 * @return none.
 */

void CT_CTelephonyAudioRoutingData::DoCmdSetOutputL(const TTEFSectionName& aSection)
	{
	INFO_PRINTF1(_L("*START*CT_CTelephonyAudioRoutingData::DoCmdSetOutputL"));
	TInt output;
	if (!GetEnumFromConfig(aSection, KCmdOutput, iEnumOutput, output))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KCmdOutput);
    	SetBlockResult(EFail);
    	}
	else
		{
		if(iOutput!=output)
			{
			TRAPD(error, iTelephonyAudioRouting->SetOutputL((CTelephonyAudioRouting::TAudioOutput)output));
		    IncOutstanding();
		    if (error != KErrNone)
		    	{
		    	ERR_PRINTF2(_L("Could not set output. Error: %d"), error);
		    	SetError(error);
		        }
		    else
		    	{
		    	INFO_PRINTF1(_L("Output set to: "));
			    switch (output)
				    {
				    case CTelephonyAudioRouting::ENotActive:
				    	INFO_PRINTF1(_L("Not active"));
				    break;
				    case CTelephonyAudioRouting::ENone:
				    	INFO_PRINTF1(_L("None"));
				    break;
				    case CTelephonyAudioRouting::EHandset:
				    	INFO_PRINTF1(_L("Handset"));
				    break;
				    case CTelephonyAudioRouting::ELoudspeaker:
				    	INFO_PRINTF1(_L("Loudspeaker"));
				    break;
				    case CTelephonyAudioRouting::EWiredAudioAccessory:
				    	INFO_PRINTF1(_L("Wired acc"));
				    break;
				    case CTelephonyAudioRouting::EBTAudioAccessory:
				    	INFO_PRINTF1(_L("BT audio acc"));
				    break;
				    case CTelephonyAudioRouting::ETTY:
				    	INFO_PRINTF1(_L("ETTY"));
			        break;
				    default:
				    	INFO_PRINTF2(_L("%d"), output);
				    }
		    	}
	    	}
		}
	INFO_PRINTF1(_L("*END*CT_CTelephonyAudioRoutingData::DoCmdSetOutputL"));
	}