/*
* Copyright (c) 2009-2010 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:
* Client side IPC handling for Connection Method Manager server.
*
*/
#include <cmmanagerdef.h>
#include "cmmserverdefs.h"
#include "cmmanagerapi.h"
#include "cmdestinationwrapper.h"
#include "cmconnectionmethodwrapper.h"
#include "cmmclistatic.h"
#include "OstTraceDefinitions.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "cmmanagerapiTraces.h"
#endif
RCmManagerApi::RCmManagerApi() : RSessionBase()
{
OstTraceFunctionEntry0( RCMMANAGERAPI_RCMMANAGERAPI_ENTRY );
iConnected = EFalse;
iSmallBufsForDestinations = ETrue;
iSmallBufsForConnMethods = ETrue;
OstTraceFunctionExit0( RCMMANAGERAPI_RCMMANAGERAPI_EXIT );
}
//-----------------------------------------------------------------------------
// RCmManagerApi::Connect()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::Connect()
{
OstTraceFunctionEntry0( RCMMANAGERAPI_CONNECT_ENTRY );
if ( !iConnected )
{
TInt retry = 2;
for (;;)
{
TInt err = CreateSession( KCmmServer, TVersion( 0, 0, 0 ), KCmmDefaultMessageSlots );
if ( err != KErrNotFound && err != KErrServerTerminated )
{
if ( !err )
{
iConnected = ETrue;
}
OstTraceFunctionExit0( RCMMANAGERAPI_CONNECT_EXIT );
return err;
}
// KErrNotFound and KErrServerTerminated will go through.
if ( --retry <= 0 )
{
OstTraceFunctionExit0( DUP1_RCMMANAGERAPI_CONNECT_EXIT );
return err;
}
err = TCmManagerLauncher::LaunchServer(
KCmmServerFile,
KCmmUid3 );
if ( err != KErrNone && err != KErrAlreadyExists )
{
// Failed to launch server, and it wasn't already running.
OstTraceFunctionExit0( DUP2_RCMMANAGERAPI_CONNECT_EXIT );
return err;
}
}
}
OstTraceFunctionExit0( DUP3_RCMMANAGERAPI_CONNECT_EXIT );
return KErrNone;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::Close()
//-----------------------------------------------------------------------------
//
void RCmManagerApi::Close()
{
OstTraceFunctionEntry0( RCMMANAGERAPI_CLOSE_ENTRY );
if ( iConnected )
{
// Close all subsessions first.
//
// Don't call subsession destructors (wrappers), since they will try to
// remove themselves from these pointer arrays. Here we can just close
// the arrays at the end.
for ( TInt i = 0; i < iConnMethods.Count(); i++ )
{
iConnMethods[i]->CloseSession();
}
iConnMethods.Close();
for ( TInt i = 0; i < iDestinations.Count(); i++ )
{
iDestinations[i]->CloseSession();
}
iDestinations.Close();
RSessionBase::Close();
iConnected = EFalse;
}
OstTraceFunctionExit0( RCMMANAGERAPI_CLOSE_EXIT );
}
//-----------------------------------------------------------------------------
// RCmManagerApi::StoreDestinationWrapper()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::StoreDestinationWrapper(
CCmDestinationWrapper* aDestinationWrapper )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_STOREDESTINATIONWRAPPER_ENTRY );
TInt err = iDestinations.InsertInAddressOrder( aDestinationWrapper );
OstTraceFunctionExit0( RCMMANAGERAPI_STOREDESTINATIONWRAPPER_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::RemoveDestinationWrapper()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::RemoveDestinationWrapper(
CCmDestinationWrapper* aDestinationWrapper )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_REMOVEDESTINATIONPOINTER_ENTRY );
TInt index = iDestinations.FindInAddressOrder( aDestinationWrapper );
if ( index >= 0 )
{
iDestinations.Remove( index );
index = KErrNone;
}
OstTraceFunctionExit0( RCMMANAGERAPI_REMOVEDESTINATIONPOINTER_EXIT );
return index;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetDestinationWrapperL()
//-----------------------------------------------------------------------------
//
CCmDestinationWrapper* RCmManagerApi::GetDestinationWrapperL( const TInt aHandle )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETDESTINATIONWRAPPER_ENTRY );
CCmDestinationWrapper* result( NULL );
if ( aHandle )
{
for ( TInt i = 0; i < iDestinations.Count(); i++ )
{
if ( iDestinations[i]->GetHandle() == aHandle )
{
result = iDestinations[i];
break;
}
}
}
if ( !result )
{
User::Leave( KErrCorrupt );
}
OstTraceFunctionExit0( RCMMANAGERAPI_GETDESTINATIONWRAPPER_EXIT );
return result;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::StoreConnMethodWrapper()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::StoreConnMethodWrapper(
CCmConnectionMethodWrapper* aConnMethodWrapper )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_STORECONNMETHODWRAPPER_ENTRY );
TInt err = iConnMethods.InsertInAddressOrder( aConnMethodWrapper );
OstTraceFunctionExit0( RCMMANAGERAPI_STORECONNMETHODWRAPPER_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::RemoveConnMethodWrapper()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::RemoveConnMethodWrapper(
CCmConnectionMethodWrapper* aConnMethodWrapper )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_REMOVECONNMETHODPOINTER_ENTRY );
TInt index = iConnMethods.FindInAddressOrder( aConnMethodWrapper );
if ( index >= 0 )
{
iConnMethods.Remove( index );
index = KErrNone;
}
OstTraceFunctionExit0( RCMMANAGERAPI_REMOVECONNMETHODPOINTER_EXIT );
return index;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetConnMethodWrapperL()
//-----------------------------------------------------------------------------
//
CCmConnectionMethodWrapper* RCmManagerApi::GetConnMethodWrapperL( const TInt aHandle )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETCONNMETHODWRAPPER_ENTRY );
CCmConnectionMethodWrapper* result( NULL );
if ( aHandle )
{
for ( TInt i = 0; i < iConnMethods.Count(); i++ )
{
if ( iConnMethods[i]->GetHandle() == aHandle )
{
result = iConnMethods[i];
break;
}
}
}
if ( !result )
{
User::Leave( KErrCorrupt );
}
OstTraceFunctionExit0( RCMMANAGERAPI_GETCONNMETHODWRAPPER_EXIT );
return result;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetBearerInfoInt()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::GetBearerInfoInt(
const TUint32 aBearerType,
const TUint32 aAttribute,
TUint32& aValue )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETBEARERINFOINT_ENTRY );
TPckg<TUint32> pckg( aValue );
TIpcArgs args( aBearerType, aAttribute, &pckg );
TInt err = SendReceive( ECmmGetBearerInfoInt, args );
OstTraceFunctionExit0( RCMMANAGERAPI_GETBEARERINFOINT_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetBearerInfoBool()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::GetBearerInfoBool(
const TUint32 aBearerType,
const TUint32 aAttribute,
TBool& aValue )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETBEARERINFOBOOL_ENTRY );
TPckg<TBool> pckg( aValue );
TIpcArgs args( aBearerType, aAttribute, &pckg );
TInt err = SendReceive( ECmmGetBearerInfoBool, args );
OstTraceFunctionExit0( RCMMANAGERAPI_GETBEARERINFOBOOL_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetBearerInfoString()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::GetBearerInfoString(
const TUint32 aBearerType,
const TUint32 aAttribute,
HBufC* aBuffer )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETBEARERINFOSTRING_ENTRY );
TPtr descriptor( aBuffer->Des() );
TIpcArgs args( aBearerType, aAttribute, &descriptor );
TInt err = SendReceive( ECmmGetBearerInfoString, args );
OstTraceFunctionExit0( RCMMANAGERAPI_GETBEARERINFOSTRING_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetBearerInfoString8()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::GetBearerInfoString8(
const TUint32 aBearerType,
const TUint32 aAttribute,
HBufC8* aBuffer8 )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETBEARERINFOSTRING8_ENTRY );
TPtr8 descriptor( aBuffer8->Des() );
TIpcArgs args( aBearerType, aAttribute, &descriptor );
TInt err = SendReceive( ECmmGetBearerInfoString8, args );
OstTraceFunctionExit0( RCMMANAGERAPI_GETBEARERINFOSTRING8_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetConnectionMethodInfoInt()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::GetConnectionMethodInfoInt(
const TUint32 aIapId,
const TUint32 aAttribute,
TUint32& aValue )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETCONNECTIONMETHODINFOINT_ENTRY );
TPckg<TUint32> pckg( aValue );
TIpcArgs args( aIapId, aAttribute, &pckg );
TInt err = SendReceive( ECmmGetConnMethodInfoInt, args );
OstTraceFunctionExit0( RCMMANAGERAPI_GETCONNECTIONMETHODINFOINT_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetConnectionMethodInfoBool()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::GetConnectionMethodInfoBool(
const TUint32 aIapId,
const TUint32 aAttribute,
TBool& aValue )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETCONNECTIONMETHODINFOBOOL_ENTRY );
TPckg<TUint32> pckg( aValue );
TIpcArgs args( aIapId, aAttribute, &pckg );
TInt err = SendReceive( ECmmGetConnMethodInfoBool, args );
OstTraceFunctionExit0( RCMMANAGERAPI_GETCONNECTIONMETHODINFOBOOL_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetConnectionMethodInfoString()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::GetConnectionMethodInfoString(
const TUint32 aIapId,
const TUint32 aAttribute,
HBufC* aBuffer )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETCONNECTIONMETHODINFOSTRING_ENTRY );
TPtr descriptor( aBuffer->Des() );
TIpcArgs args( aIapId, aAttribute, &descriptor );
TInt err = SendReceive( ECmmGetConnMethodInfoString, args );
OstTraceFunctionExit0( RCMMANAGERAPI_GETCONNECTIONMETHODINFOSTRING_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetConnectionMethodInfoString8()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::GetConnectionMethodInfoString8(
const TUint32 aIapId,
const TUint32 aAttribute,
HBufC8* aBuffer8 )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETCONNECTIONMETHODINFOSTRING8_ENTRY );
TPtr8 descriptor( aBuffer8->Des() );
TIpcArgs args( aIapId, aAttribute, &descriptor );
TInt err = SendReceive( ECmmGetConnMethodInfoString8, args );
OstTraceFunctionExit0( RCMMANAGERAPI_GETCONNECTIONMETHODINFOSTRING8_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetConnMethodsL(
//-----------------------------------------------------------------------------
//
void RCmManagerApi::GetConnMethodsL(
const TCmmIpcStructGetConnMethods& aParameters,
RArray<TUint32>& aCmArray )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETCONNMETHODSL_ENTRY );
TInt err( KErrNone );
TInt count( KMaxTInt );
TPckg<TInt> countPckg( count );
TPckgBuf<TCmmIpcStructGetConnMethods> parametersPckg( aParameters );
HBufC8* smallBuf( NULL );
HBufC8* bigBuf( NULL );
if ( iSmallBufsForConnMethods )
{
smallBuf = HBufC8::NewLC( KCmmConnMethodAmountNormal );
TPtr8 smallBufPtr( smallBuf->Des() );
TIpcArgs args( ¶metersPckg, &countPckg, &smallBufPtr );
err = SendReceive( ECmmGetConnMethodArray, args );
User::LeaveIfError( err );
}
if ( countPckg() <= KCmmConnMethodAmountNormal )
{
aCmArray.Reset();
aCmArray.ReserveL( countPckg() );
for ( TInt i = 0; i < countPckg(); i++ )
{
aCmArray.AppendL( (TUint32)(*smallBuf)[i] );
}
}
else if ( countPckg() == KMaxTInt )
{
// All connection methods didn't fit into small array, ask again with big array.
iSmallBufsForConnMethods = EFalse; // Switch small buffer mode off.
if ( smallBuf )
{
CleanupStack::PopAndDestroy( smallBuf );
smallBuf = NULL;
}
bigBuf = HBufC8::NewLC( KCmmConnMethodAmountMax );
TPtr8 bigBufPtr( bigBuf->Des() );
TIpcArgs args( ¶metersPckg, &countPckg, &bigBufPtr );
err = SendReceive( ECmmGetConnMethodArray, args );
User::LeaveIfError( err );
if ( countPckg() <= KCmmConnMethodAmountMax )
{
// Don't switch back to small buffer mode if client was only asking
// for legacy connection methods (likely a small list).
if ( countPckg() < KCmmConnMethodAmountNormal && aParameters.iLegacyOnly == EFalse )
{
iSmallBufsForConnMethods = ETrue; // Switch small buffer mode back on.
}
aCmArray.Reset();
aCmArray.ReserveL( countPckg() );
for ( TInt i = 0; i < countPckg(); i++ )
{
aCmArray.AppendL( (TUint32)(*smallBuf)[i] );
}
}
else
{
User::Leave( KErrUnknown );
}
CleanupStack::PopAndDestroy( bigBuf );
}
else
{
User::Leave( KErrUnknown );
}
if ( smallBuf )
{
CleanupStack::PopAndDestroy( smallBuf );
}
OstTraceFunctionExit0( RCMMANAGERAPI_GETCONNMETHODSL_EXIT );
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetAllDestinationsL()
//-----------------------------------------------------------------------------
//
void RCmManagerApi::GetAllDestinationsL( RArray<TUint32>& aDestArray )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETALLDESTINATIONSL_ENTRY );
TInt err( KErrNone );
TInt count( KMaxTInt );
TPckg<TInt> countPckg( count );
HBufC16* smallBuf( NULL );
HBufC16* bigBuf( NULL );
if ( iSmallBufsForDestinations )
{
smallBuf = HBufC16::NewLC( KCmmDestAmountNormal );
TPtr16 smallBufPtr( smallBuf->Des() );
TIpcArgs args( &countPckg, &smallBufPtr );
err = SendReceive( ECmmGetAllDestinations, args );
User::LeaveIfError( err );
}
if ( countPckg() <= KCmmDestAmountNormal )
{
aDestArray.Reset();
aDestArray.ReserveL( countPckg() );
for ( TInt i = 0; i < countPckg(); i++ )
{
aDestArray.AppendL( (TUint32)(*smallBuf)[i] );
}
}
else if ( countPckg() == KMaxTInt )
{
// All destinations didn't fit into small array, ask again with big array.
iSmallBufsForDestinations = EFalse; // Switch small buffer mode off.
if ( smallBuf )
{
CleanupStack::PopAndDestroy( smallBuf );
smallBuf = NULL;
}
bigBuf = HBufC16::NewLC( KCmmDestAmountMax );
TPtr16 bigBufPtr( bigBuf->Des() );
TIpcArgs args( &countPckg, &bigBufPtr );
err = SendReceive( ECmmGetAllDestinations, args );
User::LeaveIfError( err );
if ( countPckg() <= KCmmDestAmountMax )
{
if ( countPckg() < KCmmDestAmountNormal )
{
iSmallBufsForDestinations = ETrue; // Switch small buffer mode back on.
}
aDestArray.Reset();
aDestArray.ReserveL( countPckg() );
for ( TInt i = 0; i < countPckg(); i++ )
{
aDestArray.AppendL( (TUint32)(*smallBuf)[i] );
}
}
else
{
User::Leave( KErrUnknown );
}
CleanupStack::PopAndDestroy( bigBuf );
}
else
{
User::Leave( KErrUnknown );
}
if ( smallBuf )
{
CleanupStack::PopAndDestroy( smallBuf );
}
OstTraceFunctionExit0( RCMMANAGERAPI_GETALLDESTINATIONSL_EXIT );
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetBearerPriorityArrayL()
//-----------------------------------------------------------------------------
//
void RCmManagerApi::GetBearerPriorityArrayL( RArray<TBearerPriority>& aArray )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETBEARERPRIORITYARRAYL_ENTRY );
HBufC* buffer = HBufC::NewLC( KCmmDefaultBearerPriorityArraySize );
TPtr bufferPtr( buffer->Des() );
TIpcArgs args( &bufferPtr );
TInt err = SendReceive( ECmmGetBearerPriorityArray, args );
User::LeaveIfError( err );
// bufferPtr[1] should now contain the needed buffer length.
if ( bufferPtr[1] > bufferPtr.Length() )
{
// First buffer wasn't big enough. Try again with correct size buffer.
CleanupStack::PopAndDestroy( buffer );
buffer = HBufC::NewLC( bufferPtr[1] );
bufferPtr.Set( buffer->Des() );
TIpcArgs args2( &bufferPtr );
err = SendReceive( ECmmGetBearerPriorityArray, args2 );
User::LeaveIfError( err );
if ( bufferPtr[1] > bufferPtr.Length() )
{
User::Leave( KErrAbort );
}
}
const TInt bearerCount = bufferPtr[0];
// Cleanup old array. There's a pointer in that T-class...
for ( TInt i = 0; i < aArray.Count(); i++ )
{
if ( aArray[i].iServiceType )
{
delete aArray[i].iServiceType;
aArray[i].iServiceType = NULL;
}
}
aArray.Reset();
aArray.ReserveL( bearerCount );
TInt position( 2 ); // Start of first priority item
for ( TInt i = 0; i < bearerCount; i++ )
{
TBearerPriority bearerPriority;
bearerPriority.iPriority = bufferPtr[position++] << KBitsInTwoBytes;
bearerPriority.iPriority += bufferPtr[position++];
bearerPriority.iUIPriority = bufferPtr[position++] << KBitsInTwoBytes;
bearerPriority.iUIPriority += bufferPtr[position++];
bearerPriority.iServiceType = NULL;
const TInt stringLength = bufferPtr[position++];
if ( stringLength )
{
HBufC* serviceName = HBufC::NewL( stringLength );
serviceName->Des().Append( &(bufferPtr[position]), stringLength );
position += stringLength;
bearerPriority.iServiceType = serviceName;
// Ownership moved into array.
}
aArray.AppendL( bearerPriority );
}
CleanupStack::PopAndDestroy( buffer );
OstTraceFunctionExit0( RCMMANAGERAPI_GETBEARERPRIORITYARRAYL_EXIT );
}
//-----------------------------------------------------------------------------
// RCmManagerApi::SetBearerPriorityArrayL()
//-----------------------------------------------------------------------------
//
void RCmManagerApi::SetBearerPriorityArrayL( const RArray<TBearerPriority>& aArray )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_SETBEARERPRIORITYARRAYL_ENTRY );
// iPriority: 2 16-bit values,
// iUIPriority: 2 16-bit values,
// iServiceType length: 1 16-bit value.
const TInt KCmmBearerPriorityHeaderLength = 5;
// Buffer starts with legth of 2, to contain both the total amount of
// TBearerPriority objects, and the size of the buffer (number of 16-bit
// values) needed to contain the whole structure including all headers.
TInt bufferLength( 2 );
const TInt bearerCount = aArray.Count();
for ( TInt i = 0; i < bearerCount; i++ )
{
bufferLength += KCmmBearerPriorityHeaderLength;
const TBearerPriority& bearerPriority = aArray[i];
if ( !bearerPriority.iServiceType )
{
User::Leave( KErrArgument );
}
// Get length of service type name and add it to needed buffer length.
bufferLength += bearerPriority.iServiceType->Length();
}
HBufC* buffer = HBufC::NewLC( bufferLength );
TPtr bufferPtr( buffer->Des() );
bufferPtr.Append( bearerCount );
bufferPtr.Append( bufferLength );
TInt position = bufferPtr.Length();
for ( TInt i = 0; i < bearerCount; i++ )
{
const TBearerPriority& bearerPriority = aArray[i];
bufferPtr.Append( ( bearerPriority.iPriority & 0xFFFF0000 ) >> KBitsInTwoBytes );
bufferPtr.Append( ( bearerPriority.iPriority & 0x0000FFFF ) );
bufferPtr.Append( ( bearerPriority.iUIPriority & 0xFFFF0000 ) >> KBitsInTwoBytes );
bufferPtr.Append( ( bearerPriority.iUIPriority & 0x0000FFFF ) );
position += KCmmBearerPriorityHeaderLength;
if ( !bearerPriority.iServiceType )
{
User::Leave( KErrArgument );
}
const TInt stringLength = bearerPriority.iServiceType->Length();
bufferPtr.Append( stringLength );
bufferPtr.Insert( position, *(bearerPriority.iServiceType) );
position += stringLength;
}
TIpcArgs args( &bufferPtr );
TInt err = SendReceive( ECmmUpdateBearerPriorityArray, args );
User::LeaveIfError( err );
CleanupStack::PopAndDestroy( buffer );
OstTraceFunctionExit0( RCMMANAGERAPI_SETBEARERPRIORITYARRAYL_EXIT );
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetSupportedBearersL()
//-----------------------------------------------------------------------------
//
void RCmManagerApi::GetSupportedBearersL( RArray<TUint32>& aArray )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETSUPPORTEDBEARERSL_ENTRY );
TInt err( KErrNone );
TInt count( KMaxTInt );
TPckg<TInt> countPckg( count );
HBufC8* smallBuf( NULL );
HBufC8* bigBuf( NULL );
smallBuf = HBufC8::NewLC( KCmmBearerAmountNormal * sizeof( TUint32 ) );
TPtr8 smallBufPtr( smallBuf->Des() );
TIpcArgs args( &countPckg, &smallBufPtr );
err = SendReceive( ECmmGetSupportedBearers, args );
User::LeaveIfError( err );
if ( countPckg() <= KCmmBearerAmountNormal )
{
aArray.Reset();
aArray.ReserveL( countPckg() );
TUint32 a( 0 );
TPtr8 ptr = smallBuf->Des();
for ( TInt i = 0; i < countPckg(); i++ )
{
a = 0;
a += (TUint32)ptr[0 + ( i * sizeof( TUint32 ) )];
a += (TUint32)ptr[1 + ( i * sizeof( TUint32 ) )] << KBitsInOneByte;
a += (TUint32)ptr[2 + ( i * sizeof( TUint32 ) )] << KBitsInTwoBytes;
a += (TUint32)ptr[3 + ( i * sizeof( TUint32 ) )] << KBitsInThreeBytes;
aArray.AppendL( a );
}
}
else
{
TInt storedCount = countPckg();
bigBuf = HBufC8::NewLC( countPckg() * sizeof( TUint32 ) );
TPtr8 bigBufPtr( bigBuf->Des() );
TIpcArgs args( &countPckg, &bigBufPtr );
err = SendReceive( ECmmGetSupportedBearers, args );
User::LeaveIfError( err );
if ( countPckg() <= storedCount )
{
aArray.Reset();
aArray.ReserveL( countPckg() );
TUint32 a( 0 );
TPtr8 ptr = bigBuf->Des();
for ( TInt i = 0; i < countPckg(); i++ )
{
a = 0;
a += (TUint32)ptr[0 + ( i * sizeof( TUint32 ) )];
a += (TUint32)ptr[1 + ( i * sizeof( TUint32 ) )] << KBitsInOneByte;
a += (TUint32)ptr[2 + ( i * sizeof( TUint32 ) )] << KBitsInTwoBytes;
a += (TUint32)ptr[3 + ( i * sizeof( TUint32 ) )] << KBitsInThreeBytes;
aArray.AppendL( a );
}
}
else
{
User::Leave( KErrUnknown );
}
CleanupStack::PopAndDestroy( bigBuf );
}
CleanupStack::PopAndDestroy( smallBuf );
OstTraceFunctionExit0( RCMMANAGERAPI_GETSUPPORTEDBEARERSL_EXIT );
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetEasyWlanId()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::GetEasyWlanId( TUint32& aValue )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETEASYWLANID_ENTRY );
TPckg<TUint32> pckg( aValue );
TIpcArgs args( &pckg );
TInt err = SendReceive( ECmmGetEasyWlanId, args );
OstTraceFunctionExit0( RCMMANAGERAPI_GETEASYWLANID_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::ReadDefaultConnection()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::ReadDefaultConnection(
TCmDefConnValue& aDefConnSetting )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_READDEFAULTCONNECTION_ENTRY );
TPckgBuf<TCmDefConnValue> pkg( aDefConnSetting );
TIpcArgs args( &pkg );
TInt err = SendReceive( ECmmReadDefaultConnection, args );
aDefConnSetting = pkg();
OstTraceFunctionExit0( RCMMANAGERAPI_READDEFAULTCONNECTION_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::WriteDefaultConnection()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::WriteDefaultConnection(
const TCmDefConnValue& aDefConnSetting )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_WRITEDEFAULTCONNECTION_ENTRY );
TPckgBuf<TCmDefConnValue> pkg( aDefConnSetting );
TIpcArgs args( &pkg );
TInt err = SendReceive( ECmmWriteDefaultConnection, args );
OstTraceFunctionExit0( RCMMANAGERAPI_WRITEDEFAULTCONNECTION_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::ReadGeneralConnectionSettings()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::ReadGeneralConnectionSettings(
TCmGenConnSettings& aGenConnSettings )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_READGENERALCONNECTIONSETTINGS_ENTRY );
TPckgBuf<TCmGenConnSettings> pkg( aGenConnSettings );
TIpcArgs args( &pkg );
TInt err = SendReceive( ECmmReadGeneralConnectionSettings, args );
aGenConnSettings = pkg();
OstTraceFunctionExit0( RCMMANAGERAPI_READGENERALCONNECTIONSETTINGS_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::WriteGeneralConnectionSettings()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::WriteGeneralConnectionSettings(
const TCmGenConnSettings& aGenConnSettings )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_WRITEGENERALCONNECTIONSETTINGS_ENTRY );
TPckgBuf<TCmGenConnSettings> pkg( aGenConnSettings );
TIpcArgs args( &pkg );
TInt err = SendReceive( ECmmWriteGeneralConnectionSettings, args );
OstTraceFunctionExit0( RCMMANAGERAPI_WRITEGENERALCONNECTIONSETTINGS_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::CopyConnectionMethod()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::CopyConnectionMethod(
const TInt aTargetDestHandle,
const TInt aConnMethodHandle,
TInt& aIndex )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_COPYCONNECTIONMETHOD_ENTRY );
TPckg<TInt> pkg( aIndex );
TIpcArgs args( aTargetDestHandle, aConnMethodHandle, &pkg );
TInt err = SendReceive( ECmmCopyConnMethod, args );
OstTraceFunctionExit0( RCMMANAGERAPI_COPYCONNECTIONMETHOD_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::MoveConnectionMethod()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::MoveConnectionMethod(
TCmmIpcStructMoveConnMethod& aPkgData )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_MOVECONNECTIONMETHOD_ENTRY );
TPckgBuf<TCmmIpcStructMoveConnMethod> pkg( aPkgData );
TIpcArgs args( &pkg );
TInt err = SendReceive( ECmmMoveConnMethod, args );
aPkgData = pkg();
OstTraceFunctionExit0( RCMMANAGERAPI_MOVECONNECTIONMETHOD_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::RemoveConnectionMethod()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::RemoveConnectionMethod(
const TInt aTargetDestHandle,
const TInt aConnMethodHandle )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_REMOVECONNECTIONMETHOD_ENTRY );
TIpcArgs args( aTargetDestHandle, aConnMethodHandle );
TInt err = SendReceive( ECmmRemoveConnMethod, args );
OstTraceFunctionExit0( RCMMANAGERAPI_REMOVECONNECTIONMETHOD_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::RemoveAllReferences()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::RemoveAllReferences(
const TInt aConnMethodHandle )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_REMOVEALLREFERENCES_ENTRY );
TIpcArgs args( aConnMethodHandle );
TInt err = SendReceive( ECmmRemoveAllReferences, args );
OstTraceFunctionExit0( RCMMANAGERAPI_REMOVEALLREFERENCES_EXIT );
return err;
}
//-----------------------------------------------------------------------------
// RCmManagerApi::GetUncategorizedIcon()
//-----------------------------------------------------------------------------
//
TInt RCmManagerApi::GetUncategorizedIcon( HBufC* aBuffer )
{
OstTraceFunctionEntry0( RCMMANAGERAPI_GETUNCATEGORIZEDICON_ENTRY );
TPtr descriptor( aBuffer->Des() );
TIpcArgs args( &descriptor );
TInt err = SendReceive( ECmmGetUncategorizedIcon, args );
OstTraceFunctionExit0( RCMMANAGERAPI_GETUNCATEGORIZEDICON_EXIT );
return err;
}
// End of file