resourceinterfaces/fmtransmittercontrol/src/HWRMFmTxImpl.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/resourceinterfaces/fmtransmittercontrol/src/HWRMFmTxImpl.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,888 @@
+// Copyright (c) 2006-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 FILES
+#include <e32svr.h>
+#include <centralrepository.h>
+#include <hwrm/hwrmfmtx.h>
+#include "HWRMFmTxImpl.h"
+#include "HWRMFmTxClientServer.h"
+#include "HWRMtrace.h"
+#include "HWRMFmTxStatusObserver.h"
+#include "HWRMFmTxFrequencyObserver.h"
+#include "HWRMFmTxInternalPSKeys.h"
+#include "hwrmuipluginhandler.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::CHWRMFmTxImpl
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CHWRMFmTxImpl::CHWRMFmTxImpl() :
+    iClearFrequencyPckg(NULL, 0, 0),
+    iClearFrequencyCountPckg(NULL, 0, 0)
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::CHWRMFmTxImpl()" ) );
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::CHWRMFmTxImpl - return" ));
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::ConstructL(MHWRMFmTxObserver* aCallback)
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ConstructL()" ) );
+    
+    // NULL is acceptable value for aCallback, just means that 
+    // client is not interested in callbacks.
+    iCallback = aCallback;
+
+    // Connect the session and order notifications
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ConstructL()" ));
+
+    User::LeaveIfError(iClient.Connect(HWRMResourceTypeFmTx));
+
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ConstructL - Ordering notifications" ) );
+    
+    iStatusObserver    = CHWRMFmTxStatusObserver::NewL(iCallback);
+    iFrequencyObserver = CHWRMFmTxFrequencyObserver::NewL(iCallback);
+    
+    TInt err(KErrNone);    
+	TRAP(err, iUiPluginHandler = CHwrmUiPluginHandler::NewL( ));
+	if ( err != KErrNone )
+    	{    	
+    	COMPONENT_TRACE2(_L( "HWRM FM Tx Client - CHWRMFmTxImpl::ConstructL() - No Cone Plugin Handler" ), err );
+    	iUiPluginHandler = NULL;
+    	}
+	if(iUiPluginHandler)
+		{
+			iUiPluginHandler->AddForegroundObserverL(this);    	
+		}
+
+	COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ConstructL - return" ) );    
+    }
+
+
+// ---------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------
+//
+CHWRMFmTxImpl::~CHWRMFmTxImpl()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::~CHWRMFmTxImpl()" ) );
+
+    // close HWRM client, also deletes status observers
+    Close();
+
+    delete iUiPluginHandler;
+    
+    // iCallback is not owned so it is not cleaned, just set to NULL 
+    iCallback = NULL;
+    
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::~CHWRMFmTxImpl - return" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::Close
+// Closes session.
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::Close()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::Close()" ));
+        
+    // Inform session that we are cleaning up now.
+    // Ignore errors, just trace them
+    TInt err(KErrNone);
+    if (iClient.Handle())
+        {
+        err =iClient.ExecuteOperation(EHWRMFmTxCleanup, TIpcArgs());
+        }
+    
+    if ( err != KErrNone )
+        {
+        COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::Close - Error in cleanup: %d" ), err );
+        }
+    
+    // Abort status/frequency notifications
+    if ( iStatusObserver )
+        {
+        COMPONENT_TRACE1( _L( "HWRM FM Tx - CHWRMFmTxImpl::Close - canceling FM Tx Status notifications" ) );
+        iStatusObserver->Cancel();
+        delete iStatusObserver;
+        iStatusObserver = NULL;
+        }
+
+    delete iFrequencyObserver;
+    iFrequencyObserver = NULL;
+
+    iClient.Close();
+    
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::Close - return" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::ReserveL
+// Handles client request to reserve FM Tx
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::ReserveL(TBool aForceNoCCoeEnv)
+    {
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ReserveL(0x%x)" ), aForceNoCCoeEnv);
+    
+    if ( !aForceNoCCoeEnv )
+        {        
+        if ( iUiPluginHandler )
+            {
+            // Check that we are on foreground (i.e. we have keyboard focus.)
+            // Note: There can be windows on top of our application that have explicitly disabled keyboard focus,
+            // but then again the foreground/background observer will not kick in in those cases either.
+            // -> We can use focus to determine foreground status here.
+            if ( iUiPluginHandler->InForeground() == EFalse )        
+                {
+                COMPONENT_TRACE1( ( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ReserveL - Application does not have focus, Reserve denied." ) ) );
+                User::Leave(KErrNotReady);
+                }
+            }
+        else
+            {
+            COMPONENT_TRACE1(_L( "HWRM VibraClient - CHWRMFmTxImpl::::ReserveL - No iUiPluginHandler available" ) );
+            User::Leave(KErrBadHandle);
+            }
+        }
+    
+    // Do the actual reservation
+    DoReserveL(aForceNoCCoeEnv);
+    
+    COMPONENT_TRACE1(_L( "HWRM FM Tx Client - CHWRMFmTxImpl::ReserveL - return" ) );          
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::Release
+// Handles client request to release FM Tx
+// -----------------------------------------------------------------------------
+//  
+void CHWRMFmTxImpl::Release()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::Release()" ) );
+
+    TInt err = DoRelease();
+
+    if ( err != KErrNone )
+        {
+        COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::Release - execution failed: %d" ), err );
+        }
+    
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::Release - return" ) );  
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::Status
+// Returns current FM Tx state
+// -----------------------------------------------------------------------------
+//
+TFmTxState CHWRMFmTxImpl::Status() const
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::Status" ) );
+    
+    TFmTxState state = EFmTxStateUnknown;
+
+    if ( iStatusObserver )
+        {
+        state = iStatusObserver->Status();
+        }
+
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::Status - return 0x%x" ), state );    
+    
+    return state;
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::EnableL
+// Handles client request to switch FM Tx ON
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::EnableL(TInt aFrequency)
+    {
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::EnableL(%d)"), aFrequency );
+
+    // Defaults to last used frequency
+    if ( !aFrequency )
+        {
+        aFrequency = iFrequencyObserver->Frequency();
+        COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::EnableL default freq = %d"), aFrequency );
+        }
+
+    // Range check on aFrequency
+    if ( !FrequencyRangeCheck(aFrequency) )
+        {
+        COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::EnableL Out of range error") );
+        User::Leave(KErrArgument);
+        }
+        
+	// round up to the closest frequency
+    aFrequency = RoundFreqToNearestStep(aFrequency);
+    
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxOn, TIpcArgs(aFrequency)));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::EnableL - return" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::DisableL
+// Handles client request to switch FM Tx OFF
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::DisableL()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::DisableL" ) );
+        
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxOff, TIpcArgs()));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::DisableL - return" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::Frequency
+// Returns current Tx frequency
+// -----------------------------------------------------------------------------
+//
+TInt CHWRMFmTxImpl::Frequency() const
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::Frequency" ) );
+    
+    TInt frequency = 0;
+
+    if ( iFrequencyObserver )
+        {
+        frequency = iFrequencyObserver->Frequency();
+        }
+               
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::Frequency - return %d" ), frequency );
+    
+    return frequency;
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::GetFrequencyRangeL
+// Handles client query of FM Tx frequency range, and channel spacing (step size)
+// This may already be cached, otherwise it's queried from the server-side
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::GetFrequencyRangeL(TFmTxFrequencyRange& aFrequencyRange) const
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetFrequencyRange" ) );
+
+    if ( iFrequencyObserver )
+        {
+        if ( iFrequencyObserver->FrequencyRangeUpdated() )
+            {
+            // Return frequency range from CenRep
+            aFrequencyRange.iMinFrequency = iFrequencyObserver->MinFrequency();
+            aFrequencyRange.iMaxFrequency = iFrequencyObserver->MaxFrequency();
+            aFrequencyRange.iStepSize     = iFrequencyObserver->StepSize();             
+            }
+        else
+            {
+            // Request frequency range update from server 
+            TPckg<TFmTxFrequencyRange> freqRangePckg(aFrequencyRange);
+            User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxGetFreqRange, TIpcArgs(&freqRangePckg)));
+            }
+        }
+
+    COMPONENT_TRACE4( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetFrequencyRange - return %d-%d, %d" ), aFrequencyRange.iMinFrequency, aFrequencyRange.iMaxFrequency, aFrequencyRange.iStepSize );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetFrequencyL
+// Handles client request to set the Tx frequency
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetFrequencyL(TInt aFrequency)
+    {
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetFrequencyL(%d)"), aFrequency );
+
+    // Range check on aFrequency
+    if ( !FrequencyRangeCheck(aFrequency) )
+        {
+        COMPONENT_TRACE1( ( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetFrequencyL Out of range error") ) );
+        User::Leave(KErrArgument);
+        }       
+
+    // round up to the closest frequency
+	aFrequency = RoundFreqToNearestStep(aFrequency);
+        
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxSetFreq, TIpcArgs(aFrequency)));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetFrequencyL - return" ) );     
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::GetNextClearFrequency
+// Handles client request, to scan for available clear frequencies
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::GetNextClearFrequencyL(TInt& aClearFrequency)
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetNextClearFrequencyL") );
+
+    // Call server 
+    TPckg<TInt> clearFreqPckg(aClearFrequency);    
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxGetNextClearFreq, TIpcArgs(&clearFreqPckg)));
+    
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetNextClearFrequency - return %d" ), aClearFrequency );   
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::GetNextClearFrequency
+// Handles client request, to scan for available clear frequencies
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::GetNextClearFrequencyL(TClearFrequencyArray& aClearFrequencyArray, TUint& aCount)
+    {
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetNextClearFrequencyL, aCount %d"), aCount );
+
+    // Range check on aCount
+    if ( aCount == 0 ||
+         aCount > KClearFrequencyArrayMax )
+        {
+        COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetNextClearFrequencyL Out of range error") );
+        User::Leave(KErrArgument);
+        }
+
+    // Call server     
+    TPckg<TClearFrequencyArray> clearFreqArrayPckg(aClearFrequencyArray);    
+    TPckg<TUint> countPckg(aCount);
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxGetNextClearFreqArray, TIpcArgs(&clearFreqArrayPckg, &countPckg)));
+        
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetNextClearFrequency - return" ) );   
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::GetNextClearFrequency
+// Handles client request, to scan for available clear frequencies
+// Asynchronous version
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::GetNextClearFrequency(TRequestStatus& aStatus, TInt& aClearFrequency)
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetNextClearFrequency async") );
+
+    // Call server
+    iClearFrequencyPckg.Set( TPckg<TInt>(aClearFrequency) );
+    iClient.ExecuteAsyncOperation(EHWRMFmTxGetNextClearFreq, TIpcArgs(&iClearFrequencyPckg), aStatus);
+ 
+    COMPONENT_TRACE3( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetNextClearFrequency - return %d, %d" ), aStatus.Int(), aClearFrequency );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::GetNextClearFrequencyL
+// Handles client request, to scan for available clear frequencies
+// Asynchronous version
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::GetNextClearFrequencyL(TRequestStatus& aStatus, TClearFrequencyArray& aClearFrequencyArray, TUint& aCount)
+    {
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetNextClearFrequencyL async, aCount %d"), aCount );
+
+    // Range check on aCount
+    if ( aCount == 0 ||
+         aCount > KClearFrequencyArrayMax )
+        {
+        COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetNextClearFrequency Out of range error") );
+        User::Leave(KErrArgument);
+        }
+
+    // Call server
+	iClearFrequencyPckg.Set( TPckg<TClearFrequencyArray>(aClearFrequencyArray) );
+	iClearFrequencyCountPckg.Set( TPckg<TUint>(aCount) );
+    iClient.ExecuteAsyncOperation(EHWRMFmTxGetNextClearFreqArray, TIpcArgs(&iClearFrequencyPckg, &iClearFrequencyCountPckg), aStatus);
+    
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetNextClearFrequency - return" ) );     
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::CancelGetNextClearFrequency
+// Cancels previous GetNextClearFrequency request
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::CancelGetNextClearFrequency()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::CancelGetNextClearFrequency" ) );
+
+    TInt error = iClient.ExecuteOperation(EHWRMFmTxCancelGetNextClearFreq, TIpcArgs());
+    
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::CancelGetNextClearFrequency - return %d" ), error );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetNextClearFrequency
+// Handles client request, to set the Tx frequency to a new available channel
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetNextClearFrequencyL(TInt& aClearFrequency)
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetNextClearFrequencyL") );
+
+    // Call server 
+    TPckg<TInt> clearFreqPckg(aClearFrequency);     
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxSetNextClearFreq, TIpcArgs(&clearFreqPckg)));
+
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetNextClearFrequencyL - return %d" ), aClearFrequency );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetNextClearFrequency
+// Handles client request, to set the Tx frequency to a new available channel
+// Asynchronous version
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetNextClearFrequency(TRequestStatus& aStatus, TInt& aClearFrequency)
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetNextClearFrequency async") );
+
+    // Call server     
+    iClearFrequencyPckg.Set( TPckg<TInt>(aClearFrequency) );
+    iClient.ExecuteAsyncOperation(EHWRMFmTxSetNextClearFreq, TIpcArgs(&iClearFrequencyPckg), aStatus);
+    
+    COMPONENT_TRACE3( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetNextClearFrequency - return %d, %d" ), aStatus.Int(), aClearFrequency );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::CancelSetNextClearFrequency
+// Cancels previous SetNextClearFrequency request
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::CancelSetNextClearFrequency()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::CancelSetNextClearFrequency" ) );
+
+    TInt error = iClient.ExecuteOperation(EHWRMFmTxCancelSetNextClearFreq, TIpcArgs());
+    
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::CancelSetNextClearFrequency - return &d" ), error );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::IsAutoFrequencyEnabled
+// Returns whether the automatic frequency mode is ON
+// -----------------------------------------------------------------------------
+//
+TBool CHWRMFmTxImpl::IsAutoFrequencyEnabled()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::IsAutoFrequencyEnabled" ) );
+
+    // Not supported yet
+    TBool autoFreqOn = EFalse;
+
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::IsAutoFrequencyEnabled - return %d" ), autoFreqOn );
+
+    return autoFreqOn;
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::EnableAutoFrequency
+// Handles client request to turn automatic frequency mode ON
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::EnableAutoFrequencyL()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::EnableAutoFrequencyL") );
+
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxAutoFreqOn, TIpcArgs()));
+
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::EnableAutoFrequencyL - return" ) );      
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::DisableAutoFrequency
+// Handles client request to turn automatic frequency mode OFF
+// -----------------------------------------------------------------------------
+//
+void  CHWRMFmTxImpl::DisableAutoFrequencyL()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::DisableAutoFrequencyL") );
+
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxAutoFreqOff, TIpcArgs()));
+
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::DisableAutoFrequencyL - return" ) );         
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::GetRdsData
+// Returns current RDS data
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::GetRdsData(TFmTxRdsData& aData)
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetRdsData") );
+
+    // RDS properties are only defined after 1st SetRds request 
+    if ( RProperty::Get(KPSUidHWRMFmTx, KHWRMFmTxRdsPty, aData.iPty) != KErrNone )
+        {
+        COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetRdsData - PTY Get error" ) );
+        aData.iPty = KRdsPtyNone; // This is ok, use default value
+        }
+        
+    if ( RProperty::Get(KPSUidHWRMFmTx, KHWRMFmTxRdsPtyn, aData.iPtyn) != KErrNone )
+        {
+        COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetRdsData - PTYN Get error" ) );                        
+        aData.iPtyn.Zero(); // This is ok, use default value
+        }       
+
+    if ( RProperty::Get(KPSUidHWRMFmTx, KHWRMFmTxRdsMs, aData.iMs) != KErrNone )
+        {
+        COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetRdsData - MS Get error" ) );                      
+        aData.iMs = ETrue; // default is Music
+        }  
+
+    if ( RProperty::Get(KPSUidHWRMFmTx, KHWRMFmTxRdsLangId, aData.iLanguageId) != KErrNone )
+        {
+        COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetRdsData - Language ID Get error" ) );                     
+        aData.iLanguageId = KRdsLanguageUnknown; // This is ok, use default value
+        }
+
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::GetRdsData - return" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetRdsPTY
+// Handles client request to set the Programme TYpe
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetRdsPtyL(TRdsProgrammeType aPty)
+    {
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRdsPtyL(%d)"), aPty );
+
+    if( aPty < KRdsPtyNone || aPty > KRdsPtyAlarm )
+        {
+        User::Leave(KErrArgument);
+        }
+
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxSetRdsPty, TIpcArgs(aPty)));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRdsPtyL - return" ) );        
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetRdsPTYN
+// Handles client request to set the Programme TYpe Name
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetRdsPtynL(TRdsProgrammeTypeName& aPtyn)
+    {
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRdsPtynL(%S)"), &aPtyn );
+
+    if( aPtyn.Length() > KMaxRdsPtynLength )
+        {
+        User::Leave(KErrArgument);
+        }
+
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxSetRdsPtyn, TIpcArgs(&aPtyn)));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRdsPtynL - return" ) );           
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetRdsMS
+// Handles client request to set the Music/Speech flag
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetRdsMsL(TBool aMusic)
+    {
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRdsMsL(%d)"), aMusic );
+
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxSetRdsMs, TIpcArgs(aMusic)));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRdsMsL - return" ) );         
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetRdsLanguageId
+// Handles client request to set the language ID
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetRdsLanguageIdL(TRdsLanguageIdType aLanguageId)
+    {
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRdsLanguageIdL(0x%x)"), aLanguageId );
+
+    if( aLanguageId < KRdsLanguageUnknown || aLanguageId > KRdsLanguageAmharic )
+        {
+        User::Leave(KErrArgument);
+        }
+
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxSetRdsLanguageId, TIpcArgs(aLanguageId)));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRdsLanguageIdL - return" ) );         
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetRadiotext
+// Handles client request to set the RT data
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetRadiotextL(TDes& aText)
+    {
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRadiotextL(%S)"), &aText );
+
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxSetRadiotext, TIpcArgs(&aText)));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRadiotextL - return" ) );                 
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetRadiotextPlusL
+// Handles client request to set the RT+ data
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetRadiotextPlusL(TDes& aText, TRtPlusContentType aContentType)
+    {
+    COMPONENT_TRACE3( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRadiotextPlusL(%S, ct %d)"), &aText, aContentType );
+
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxSetRadiotextPlus1, TIpcArgs(&aText, aContentType)));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRadiotextPlusL - return" ) );         
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetRadiotextPlusL
+// Handles client request to set the RT+ data
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetRadiotextPlusL(TDes& aText, TRtPlusTag aTag)
+    {
+    COMPONENT_TRACE3( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRadiotextPlusL(%S, tag %d)"), &aText, aTag.iContentType );
+
+    THWRMRtPlusTagCmdPackage pckg(aTag);
+
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxSetRadiotextPlus2, TIpcArgs(&aText, &pckg)));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRadiotextPlusL - return" ) ); 
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::SetRadiotextPlusL
+// Handles client request to set the RT+ data
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::SetRadiotextPlusL(TDes& aText, TRtPlusTag aTag1, TRtPlusTag aTag2)
+    {
+    COMPONENT_TRACE4( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRadiotextPlusL(%S, tag %d, tag2 %d)"), &aText, aTag1.iContentType, aTag2.iContentType );
+
+    THWRMRtPlusTagCmdPackage pckg(aTag1);
+    THWRMRtPlusTagCmdPackage pckg2(aTag2);
+
+    // Call server 
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxSetRadiotextPlus3, TIpcArgs(&aText, &pckg, &pckg2)));
+            
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::SetRadiotextPlusL - return" ) );         
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::ClearRdsData
+// Clears any previously set RDS data
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::ClearRdsData()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ClearRdsData") );
+
+    // Call server 
+    TInt err = iClient.ExecuteOperation(EHWRMFmTxClearRdsData, TIpcArgs());
+    
+    if ( err != KErrNone )
+        {
+        COMPONENT_TRACE2(  _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ClearRdsData - execution failed: %d" ), err );
+        }
+
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ClearRdsData - return" ) );                  
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::ClearRadiotextData
+// Clears any previously set RT data
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::ClearRadiotextData()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ClearRadiotextData") );
+
+    // Call server 
+    TInt err = iClient.ExecuteOperation(EHWRMFmTxClearRtData, TIpcArgs());
+    
+    if ( err != KErrNone )
+        {
+        COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ClearRadiotextData - execution failed: %d" ), err );
+        }
+
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::ClearRadiotextData - return" ) );                    
+    }
+
+//------------------------------------------------------------------------------
+// CHWRMFmTxImpl::HandleGainingForeground     
+// Inherited From MCoeForegroundObserver - called when app comes to foreground
+//------------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::HandleGainingForeground()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::HandleGainingForeground()" ) );
+
+    TRAPD(err, DoReserveL(EFalse));
+        
+    if ( err != KErrNone )
+        {
+        COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::HandleGainingForeground - Error reserving: %d " ), err );
+        }
+
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::HandleGainingForeground - return " ) );
+    }
+
+//------------------------------------------------------------------------------
+// CHWRMFmTxImpl::HandleLosingForeground     
+// Inherited From MCoeForegroundObserver - called when app goes to background 
+//------------------------------------------------------------------------------
+void CHWRMFmTxImpl::HandleLosingForeground()
+    {
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::HandleLosingForeground()" ) );
+
+    TInt err = DoRelease();
+
+    if ( err != KErrNone )
+        {
+        COMPONENT_TRACE2( _L( "HWRM FmTxClient - CHWRMFmTxImpl::HandleLosingForeground - Error releasing: %d " ), err );
+        }
+
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::HandleLosingForeground - return " ) );
+    }
+    
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::FrequencyRangeCheck
+// Helper function for enabling or setting Tx frequency
+// -----------------------------------------------------------------------------
+//
+TBool CHWRMFmTxImpl::FrequencyRangeCheck(TInt aFrequency)   
+    {
+    
+    COMPONENT_TRACE1( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::FrequencyRangeCheck()" ) );
+    
+    TBool retVal = ETrue;
+    
+    if ( iFrequencyObserver->FrequencyRangeUpdated() )
+        {
+        // Check against frequency range in CenRep
+        if ( aFrequency < iFrequencyObserver->MinFrequency() || 
+             aFrequency > iFrequencyObserver->MaxFrequency() )
+            {
+            retVal = EFalse;
+            }
+        }
+    else
+        {
+        // Query frequency range from server    
+        TPckgBuf<TFmTxFrequencyRange> freqRangePckg;
+        TInt err = iClient.ExecuteOperation(EHWRMFmTxGetFreqRange, TIpcArgs(&freqRangePckg));
+        TFmTxFrequencyRange freqRange = freqRangePckg();    
+        COMPONENT_TRACE4( _L("HWRM FM Tx Client - CHWRMFmTxImpl::FrequencyRangeCheck() got from server %d-%d, %d"), freqRange.iMinFrequency, freqRange.iMaxFrequency, freqRange.iStepSize );
+
+        // Check against frequency range from server        
+        if ( err != KErrNone ||
+             aFrequency < freqRange.iMinFrequency || 
+             aFrequency > freqRange.iMaxFrequency )
+            {
+            retVal = EFalse;        
+            }
+        }
+
+    COMPONENT_TRACE2( _L( "HWRM FM Tx Client - CHWRMFmTxImpl::FrequencyRangeCheck() return %d" ), retVal );
+    
+    return retVal;
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::DoReserveL
+// Helper function for reserving FM Tx resource
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxImpl::DoReserveL(TBool aForceNoCCoeEnv)
+    {
+    User::LeaveIfError(iClient.ExecuteOperation(EHWRMFmTxReserve, TIpcArgs(aForceNoCCoeEnv)));
+    }   
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::DoRelease
+// Helper function for releasing FM Tx resource
+// -----------------------------------------------------------------------------
+//
+TInt CHWRMFmTxImpl::DoRelease()
+    {
+    return iClient.ExecuteOperation(EHWRMFmTxRelease, TIpcArgs());
+    }   
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxImpl::RoundFreqToNearestStep
+// Round up the frequency to the nearest valid frequency based on the 
+// frequency range and the step size
+// -----------------------------------------------------------------------------
+//
+TInt CHWRMFmTxImpl::RoundFreqToNearestStep(TInt aFrequency)
+    {
+    TInt stepSize = iFrequencyObserver->StepSize();
+    TInt frequency;
+    
+    frequency = aFrequency - iFrequencyObserver->MinFrequency();
+    
+	TInt remainder(0);
+    if ( stepSize )
+	  {
+	  remainder = frequency % stepSize;
+	  }
+    
+    if ( remainder == 0)
+    	{
+    	frequency = aFrequency;
+    	}
+    else
+    	{
+    	if (remainder < stepSize / 2)
+    		{
+    		frequency = aFrequency - remainder;
+    		}
+    	else
+    		{
+    		frequency = aFrequency - remainder + stepSize;
+    		}
+    	}
+    return frequency;
+    }   
+
+
+//  End of File