diff -r 000000000000 -r 5a93021fdf25 connectionmonitoring/connmonext/src/ConnMonExt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectionmonitoring/connmonext/src/ConnMonExt.cpp Thu Dec 17 08:55:21 2009 +0200 @@ -0,0 +1,532 @@ +/* +* Copyright (c) 2004 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: Connection Monitor Extension. +* +*/ + +#include "ConnMonExt.h" +#include "log.h" + +// ============================ LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Panic +// Panics the client in case of programming error. +// ----------------------------------------------------------------------------- +// +void Panic( TInt aPanic ) + { + _LIT( KPanicCategory, "ConnectionMonitor Extension API" ); + User::Panic( KPanicCategory, aPanic ); + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CConnectionMonitorPlugin::CConnectionMonitorPlugin +// ----------------------------------------------------------------------------- +// +EXPORT_C CConnectionMonitorPlugin::CConnectionMonitorPlugin() + { + iPluginAO = 0; + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +EXPORT_C CConnectionMonitorPlugin::~CConnectionMonitorPlugin() + { + delete iPluginAO; + } + +// ----------------------------------------------------------------------------- +// CConnectionMonitorPlugin::RegisterPlugin +// Starts plugin session and registers the plug-in. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CConnectionMonitorPlugin::RegisterPluginL( const TUint aConnectionId ) + { + if ( iPluginAO == 0 ) + { + // Create the receiver (active object) + iPluginAO = new ( ELeave ) CPluginAO( iSession, *this ); + iPluginAO->ConstructL(); + + // Connect to the Connection Monitor server + iConnMonServer.ConnectL(); + + // Open plug-in subsession to the Connection Monitor server + TInt ret = iSession.Open( iConnMonServer, aConnectionId ); + + if ( ret != KErrNone ) + { + User::Leave( ret ); + } + } + + iPluginAO->ReceiveQuery(); + + LOG( Log::Printf( _L("Plugin [%d]: registered: Id:<%d>\n"), &iSession, aConnectionId ) ); + } + +// ----------------------------------------------------------------------------- +// CConnectionMonitorPlugin::CancelRegisterPlugin +// Cancels the plug-in's registration. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CConnectionMonitorPlugin::CancelRegisterPlugin() + { + if ( iPluginAO != 0 ) + { + // Delete receiver + delete iPluginAO; + iPluginAO = 0; + + // Close plug-in subsession + iSession.Close(); + + // Disconnect from Connection Monitor server + iConnMonServer.Close(); + + LOG( Log::Printf( _L("Plugin [%d]: Cancelled registration.\n"), &iSession ) ); + } + } + +// ----------------------------------------------------------------------------- +// CConnectionMonitorPlugin::RegisterAttribute +// Registers a new attribute to the Connection Monitor server. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CConnectionMonitorPlugin::RegisterAttribute( const TUint aAttribute ) const + { + LOG( Log::Printf( _L("Plugin [%d]: register attribute: Id:<%d>\n"), &iSession, aAttribute ) ); + + return ( iSession.RegisterAttribute( aAttribute ) ); + } + +// ----------------------------------------------------------------------------- +// CConnectionMonitorPlugin::CancelRegisterAttribute +// Cancels the attribute registration from the Connection Monitor server. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CConnectionMonitorPlugin::CancelRegisterAttribute( const TUint aAttribute ) const + { + LOG( Log::Printf( _L("Plugin [%d]: Cancel attribute registration: Id:<%d>\n"), &iSession, aAttribute ) ); + + iSession.CancelRegisterAttribute( aAttribute ); + } + +// ----------------------------------------------------------------------------- +// CConnectionMonitorPlugin::Event +// Sends an event to Connnection Monitor server. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CConnectionMonitorPlugin::Event( const TUint aEventId, + const TAny* aData, + const TUint aSize ) const + { + LOG( Log::Printf( _L("Plugin [%d]: Send event: EventId:<%d>\n"), &iSession, aEventId ) ); + + return ( iSession.SendEvent( aEventId, aData, aSize ) ); + } + +// ----------------------------------------------------------------------------- +// CConnectionMonitorPlugin::Version +// Returns the client side version number. +// ----------------------------------------------------------------------------- +// +EXPORT_C TVersion CConnectionMonitorPlugin::Version() const + { + LOG( Log::Printf( _L("Plugin [%d]: Get version.\n"), &iSession ) ); + + return ( iSession.Version() ); + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// RConnMonPlugin::Open +// Creates a new subsession with the Connection Monitor server. +// ----------------------------------------------------------------------------- +// +TInt RConnMonPlugin::Open( RConnectionMonitor &aSession, const TUint aConnectionId ) + { + //p[0]= ( TAny* )aConnectionId ; + + TIpcArgs args( aConnectionId ); + + return CreateSubSession( aSession, EReqPluginCreateSubSession, args ); + } + +// ----------------------------------------------------------------------------- +// RConnMonPlugin::Close +// Closes the subsession. +// ----------------------------------------------------------------------------- +// +void RConnMonPlugin::Close() + { + RSubSessionBase::CloseSubSession( EReqPluginCloseSubSession ); + } + +// ----------------------------------------------------------------------------- +// RConnMonPlugin::Version +// Returns the client side version number. +// ----------------------------------------------------------------------------- +// +TVersion RConnMonPlugin::Version() const + { + return( TVersion( KPluginMajorVersionNumber, + KPluginMinorVersionNumber, + KPluginBuildVersionNumber ) ); + } + +// ----------------------------------------------------------------------------- +// RConnMonPlugin::SendEvent +// Sends an event to the Connection Monitor server. +// ----------------------------------------------------------------------------- +// +TInt RConnMonPlugin::SendEvent( const TUint aEventId, + const TAny* aData, + const TUint aSize ) const + { + if ( aSize > KConnMonMaxPluginDataSize ) + { + return KErrTooBig; + } + + TPtrC8 n( reinterpret_cast< const TUint8* >( aData ), aSize ); + + //p[0]= ( TAny* )aEventId; + //p[1]= ( TAny* )&n; + + TIpcArgs args( aEventId, &n ); + + return SendReceive( EReqPluginEvent, args ); + } + +// ----------------------------------------------------------------------------- +// RConnMonPlugin::RegisterAttribute +// Registers an attribute to the Connection Monitor server. +// ----------------------------------------------------------------------------- +// +TInt RConnMonPlugin::RegisterAttribute( const TUint aAttribute ) const + { + //p[0]= ( TAny* )aAttribute; + + TIpcArgs args( aAttribute ); + + return SendReceive( EReqPluginRegisterAttribute, args ); + } + +// ----------------------------------------------------------------------------- +// RConnMonPlugin::CancelRegisterAttribute +// Cancels the attribute registration from the Connection Monitor server. +// ----------------------------------------------------------------------------- +// +TInt RConnMonPlugin::CancelRegisterAttribute( const TUint aAttribute ) const + { + //p[0]= ( TAny* )aAttribute; + + TIpcArgs args( aAttribute ); + + return SendReceive( EReqPluginCancelRegisterAttribute, args ); + } + +// ----------------------------------------------------------------------------- +// RConnMonPlugin::GetQuery +// Gets the next attribute request from the Connection Monitor server. +// ----------------------------------------------------------------------------- +// +void RConnMonPlugin::GetQuery( TDes8& aBuffer, TRequestStatus& aStatus ) const + { + //p[ 0 ]= ( TAny* )&aBuffer; + + TIpcArgs args( &aBuffer ); + + SendReceive( EReqPluginGetQuery, args, aStatus ); + } + +// ----------------------------------------------------------------------------- +// RConnMonPlugin::CancelGetQueyry +// ----------------------------------------------------------------------------- +// +void RConnMonPlugin::CancelGetQuery() const + { + //SendReceive( EReqPluginCancelGetQuery, 0 ); + SendReceive( EReqPluginCancelGetQuery, TIpcArgs( TIpcArgs::ENothing ) ); + } + +// ----------------------------------------------------------------------------- +// RConnMonPlugin::SendAttribute +// Sends an attribute to the Connection Monitor server. +// ----------------------------------------------------------------------------- +// +TInt RConnMonPlugin::SendAttribute( const TInt aType, + const TUint aAttribute, + const TInt aRet, + const TAny* aValue, + const TUint aSize ) const + { + if ( aSize > KConnMonMaxPluginDataSize ) + { + return KErrTooBig; + } + + //p[0]= ( TAny* )aAttribute; + //p[1]= ( TAny* )aRet; + + if ( ( aType == EReqGetIntAttribute ) || ( aType == EReqGetUintAttribute ) || + ( aType == EReqGetBoolAttribute ) ) + { + TPtrC8 n( reinterpret_cast< const TUint8* >( aValue ), aSize ); + + //p[2]= ( TAny* )&n; + + TIpcArgs args( aAttribute, aRet, &n ); + + return SendReceive( EReqPluginAttribute, args ); + } + else + { + //p[2]= const_cast< TAny* >( aValue ); + + TIpcArgs args( aAttribute, aRet, aValue ); + + return SendReceive( EReqPluginAttribute, args ); + } + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPluginAO::CPluginAO +// ----------------------------------------------------------------------------- +// +CPluginAO::CPluginAO( RConnMonPlugin& aSession, CConnectionMonitorPlugin& aPlugin ) + : + CActive( EPriorityStandard ), + iSession( aSession ), + iPlugin( aPlugin ), + iBuf( NULL, 0, 0 ) + { + } + +// ----------------------------------------------------------------------------- +// CPluginAO::ConstructL +// ----------------------------------------------------------------------------- +// +void CPluginAO::ConstructL() + { + // Plug-in engine must have an active scheduler + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CPluginAO::~CPluginAO() + { + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CPluginAO::ReceiveQuery +// Requests a new query from Connection Monitor server. +// ----------------------------------------------------------------------------- +// +void CPluginAO::ReceiveQuery() + { + if ( IsActive() ) + { + return; + } + else + { + // Must be passed as a descriptor + iReqInfo.Reset(); + + iBuf.Set( reinterpret_cast< TUint8* >( &iReqInfo ), sizeof( TReqInfo ), sizeof( TReqInfo ) ); + + iSession.GetQuery( iBuf, iStatus ); + + SetActive(); + } + } + +// ----------------------------------------------------------------------------- +// CPluginAO::RunL +// Receives the a request from the Connection Monitor server and passes it to the +// plug-in module. Sends the result back to the server. +// ----------------------------------------------------------------------------- +// +void CPluginAO::RunL() + { + if ( iStatus.Int() == KErrServerBusy ) + { + // Message slot was reserved + // Try again + ReceiveQuery(); + } + else if ( iStatus.Int() == KErrNone ) + { + // A new request has arrived + + switch ( iReqInfo.iType ) + { + case EReqGetIntAttribute: + { + TInt value( 0 ); + TInt ret = iPlugin.GetIntAttribute( iReqInfo.iAttribute, value ); + + iSession.SendAttribute( EReqGetIntAttribute, + iReqInfo.iAttribute, + ret, + &value, + sizeof( TInt ) ); + + break; + } + + case EReqGetUintAttribute: + { + TUint value( 0 ); + TInt ret = iPlugin.GetUintAttribute( iReqInfo.iAttribute, value ); + + iSession.SendAttribute( EReqGetUintAttribute, + iReqInfo.iAttribute, + ret, + &value, + sizeof( TUint ) ); + + break; + } + + case EReqGetBoolAttribute: + { + TBool value( EFalse ); + TInt ret = iPlugin.GetBoolAttribute( iReqInfo.iAttribute, value ); + + iSession.SendAttribute( EReqGetBoolAttribute, + iReqInfo.iAttribute, + ret, + &value, + sizeof( TBool ) ); + + break; + } + + case EReqGetStringAttribute: + { + HBufC16* value = HBufC16::NewL( KConnMonMaxStringAttributeLength ); + + TPtr16 auxPtr( const_cast< TUint16* >( value->Des().Ptr() ), KConnMonMaxStringAttributeLength ); + auxPtr.FillZ(); + + TInt ret = iPlugin.GetStringAttribute( iReqInfo.iAttribute, auxPtr ); + + iSession.SendAttribute( EReqGetStringAttribute, + iReqInfo.iAttribute, + ret, + &auxPtr, + auxPtr.MaxSize() ); + delete value; + + break; + } + + case EReqGetPckgAttribute: + { + HBufC8* buf = HBufC8::New( KConnMonMaxPluginDataSize ); + TPtr8 initptr = buf->Des(); + + TInt ret = iPlugin.GetPckgAttribute( iReqInfo.iAttribute, initptr ); + + iSession.SendAttribute( EReqGetPckgAttribute, + iReqInfo.iAttribute, + ret, + &initptr, + KConnMonMaxPluginDataSize ); + + delete buf; + + break; + } + + case EReqSetIntAttribute: + { + iPlugin.SetIntAttribute( iReqInfo.iAttribute, iReqInfo.iData ); + + break; + } + + case EReqSetUintAttribute: + { + iPlugin.SetUintAttribute( iReqInfo.iAttribute, static_cast< TUint >( iReqInfo.iData ) ); + + break; + } + + case EReqSetBoolAttribute: + { + iPlugin.SetBoolAttribute( iReqInfo.iAttribute, static_cast< TBool >( iReqInfo.iData ) ); + + break; + } + + case EReqSetStringAttribute: + { + // Not supported + break; + } + + case EReqSetPckgAttribute: + { + // Not supported + break; + } + + default: + break; + } + + LOG( Log::Printf( _L("Plugin [%d]: served attribute query: Type:<%d>, Attribute:<%d> \n"), + &iSession, + iReqInfo.iType, + iReqInfo.iAttribute ) ); + + // initiate the next receive + ReceiveQuery(); + } + else + { + // Log error + LOG( Log::Printf( _L("Error in CPluginAO::RunL(): [%d].\n"), iStatus.Int() ) ); + } + } + +// ----------------------------------------------------------------------------- +// CPluginAO::DoCancel +// Cancels the request from Connection Monitor server. +// ----------------------------------------------------------------------------- +// +void CPluginAO::DoCancel() + { + if ( IsActive() ) + { + iSession.CancelGetQuery(); + } + } +