--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/localconnectivityservice/dun/plugins/src/ir/DunIrPlugin.cpp Fri Jun 11 14:27:06 2010 +0300
@@ -0,0 +1,340 @@
+/*
+* Copyright (c) 2006-2008 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: DUN Infrared plugin
+*
+*/
+
+
+#include "DunIrPlugin.h"
+#include "DunUtils.h"
+#include "DunDebug.h"
+
+_LIT( KIrdaCsy, "IRCOMM" );
+_LIT( KIrdaCsy0, "IRCOMM::0" );
+_LIT( KIrChannelName, "DUNIR::0" );
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CDunIrPlugin::CDunIrPlugin
+// ---------------------------------------------------------------------------
+//
+CDunIrPlugin::CDunIrPlugin() :
+ iServer( NULL ),
+ iTransporter( NULL )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CDunIrPlugin::~CDunIrPlugin()
+ {
+ FTRACE(FPrint( _L( "CDunIrPlugin::~CDunIrPlugin()" ) ));
+ Uninitialize();
+ FTRACE(FPrint( _L( "CDunIrPlugin::~CDunIrPlugin() complete" ) ));
+ }
+
+// ---------------------------------------------------------------------------
+// Gets state of this plugin
+// ---------------------------------------------------------------------------
+//
+TDunPluginState CDunIrPlugin::PluginState()
+ {
+ return iServer->GetPluginStateByUid( KDunIrPluginUid );
+ }
+
+// ---------------------------------------------------------------------------
+// Constructs a listener object for this plugin
+// ---------------------------------------------------------------------------
+//
+TInt CDunIrPlugin::ConstructListener()
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::ConstructListenerL()")));
+ if ( PluginState() != EDunStateLoaded )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::ConstructListenerL() (not ready) complete")));
+ return KErrNotReady;
+ }
+ ReportStateChangeUp( EDunStateTryListen );
+ TInt retTemp = InitPort();
+ if ( retTemp != KErrNone )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::ConstructListenerL() (ERROR) complete")));
+ return retTemp;
+ }
+ ReportStateChangeUp( EDunStateListening );
+ ReportStateChangeUp( EDunStateTryChannel );
+ TRAPD( retTrap, AllocateChannelL() );
+ if ( retTrap != KErrNone )
+ {
+ iTransporter->FreeChannel( &iIrPort );
+ FTRACE(FPrint(_L("CDunIrPlugin::ConstructListenerL() (trapped!) complete")));
+ return retTrap;
+ }
+ ReportStateChangeUp( EDunStateChanneled );
+ FTRACE(FPrint(_L("CDunIrPlugin::ConstructListenerL() complete")));
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets new state
+// New state must be one more than the old state
+// ---------------------------------------------------------------------------
+//
+TInt CDunIrPlugin::ReportStateChangeUp( TDunPluginState aPluginState )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::ReportStateChangeUp()")));
+ TInt retTemp = iServer->NotifyPluginStateChangeUp( aPluginState,
+ KDunIrPluginUid );
+ if ( retTemp != KErrNone )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::ReportStateChangeUp() (ERROR) complete")));
+ return retTemp;
+ }
+ FTRACE(FPrint(_L("CDunIrPlugin::ReportStateChangeUp() complete")));
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets new state
+// New state must be one less than the old state
+// ---------------------------------------------------------------------------
+//
+TInt CDunIrPlugin::ReportStateChangeDown( TDunPluginState aPluginState )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::ReportStateChangeDown()")));
+ TInt retTemp = iServer->NotifyPluginStateChangeDown( aPluginState,
+ KDunIrPluginUid );
+ if ( retTemp != KErrNone )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::ReportStateChangeDown() (ERROR) complete")));
+ return retTemp;
+ }
+ FTRACE(FPrint(_L("CDunIrPlugin::ReportStateChangeDown() complete")));
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// Initializes one infrared port with role DCE
+// ---------------------------------------------------------------------------
+//
+TInt CDunIrPlugin::InitPort()
+ {
+ FTRACE(FPrint( _L( "CDunIrPlugin::InitPort()" ) ));
+ TInt retTemp;
+ retTemp = CDunUtils::ConnectCommsServer( iCommServer );
+ if ( retTemp != KErrNone )
+ {
+ FTRACE(FPrint( _L( "CDunIrPlugin::InitPort() (ERROR) complete" ) ));
+ return retTemp;
+ }
+ retTemp = iCommServer.LoadCommModule( KIrdaCsy );
+ if ( retTemp != KErrNone )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::InitPort() (load module) failed!") ));
+ return retTemp;
+ }
+ if ( iIrPort.SubSessionHandle() )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::InitPort (already exists!) complete") ));
+ return KErrAlreadyExists;
+ }
+ retTemp = iIrPort.Open( iCommServer,
+ KIrdaCsy0,
+ ECommExclusive,
+ ECommRoleDCE );
+ if ( retTemp != KErrNone )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::InitPort() (open) failed!") ));
+ return retTemp;
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// Allocates a channel
+// ---------------------------------------------------------------------------
+//
+void CDunIrPlugin::AllocateChannelL()
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::AllocateChannelL()")));
+ HBufC8* channelName = HBufC8::NewMaxLC( KIrChannelName().Length() );
+ TPtr8 channelNamePtr = channelName->Des();
+ channelNamePtr.Copy( KIrChannelName );
+ iTransporter->AllocateChannelL( &iIrPort,
+ KDunIrPluginUid,
+ channelNamePtr,
+ ETrue );
+ iTransporter->AddConnMonCallbackL( &iIrPort,
+ this,
+ EDunReaderUpstream,
+ EFalse );
+ iTransporter->AddConnMonCallbackL( &iIrPort,
+ this,
+ EDunWriterUpstream,
+ EFalse );
+ iTransporter->AddConnMonCallbackL( &iIrPort,
+ this,
+ EDunReaderDownstream,
+ EFalse );
+ iTransporter->AddConnMonCallbackL( &iIrPort,
+ this,
+ EDunWriterDownstream,
+ EFalse );
+ iTransporter->IssueTransferRequestsL( &iIrPort );
+ CleanupStack::PopAndDestroy( channelName );
+ FTRACE(FPrint(_L("CDunIrPlugin::AllocateChannelL() complete")));
+ }
+
+// ---------------------------------------------------------------------------
+// Uninitializes this plugin
+// ---------------------------------------------------------------------------
+//
+TInt CDunIrPlugin::Uninitialize()
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::Uninitialize()" )));
+ ReportStateChangeDown( EDunStateTryUninitialize );
+ if ( iIrPort.SubSessionHandle() )
+ {
+ iTransporter->FreeChannel( &iIrPort );
+ iIrPort.SetSignals( 0, KSignalDCEOutputs );
+ iIrPort.Close();
+ }
+ if ( iCommServer.Handle() )
+ {
+ iCommServer.UnloadCommModule( KIrdaCsy );
+ iCommServer.Close();
+ }
+ ReportStateChangeUp( EDunStateUninitialized );
+ ReportStateChangeUp( EDunStateTryLoad );
+ ReportStateChangeUp( EDunStateLoaded );
+ FTRACE(FPrint(_L("CDunIrPlugin::Uninitialize() complete" )));
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// From class MDunLocalMediaPlugin.
+// CDunIrPlugin::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CDunIrPlugin::ConstructL( MDunServerCallback* aServer,
+ CDunTransporter* aTransporter )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::ConstructL()")));
+ if ( !aServer || !aTransporter )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::ConstructL() not initialized!")));
+ User::Leave( KErrGeneral );
+ }
+ iServer = aServer;
+ iTransporter = aTransporter;
+ FTRACE(FPrint(_L("CDunIrPlugin::ConstructL() complete")));
+ }
+
+// ---------------------------------------------------------------------------
+// From class MDunLocalMediaPlugin.
+// Gets called when server changes a plugin's state
+// ---------------------------------------------------------------------------
+//
+TInt CDunIrPlugin::NotifyServerStateChange( TDunPluginState aPluginState )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::NotifyServerStateChange()")));
+ TInt retTemp;
+ switch ( aPluginState )
+ {
+ case EDunStateTryListen:
+ if ( PluginState() != EDunStateLoaded )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::NotifyServerStateChange() (not ready) complete")));
+ return KErrNotReady;
+ }
+ // Change to listening mode
+ retTemp = ConstructListener();
+ if ( retTemp != KErrNone )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::NotifyServerStateChange() (ERROR) complete (%d)"), retTemp));
+ return retTemp;
+ }
+ break;
+ case EDunStateTryUninitialize:
+ if ( PluginState() == EDunStateUninitialized )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::NotifyServerStateChange() (not ready) complete")));
+ return KErrNotReady;
+ }
+ // Uninitialize
+ retTemp = Uninitialize();
+ if ( retTemp != KErrNone )
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::NotifyServerStateChange() (ERROR) complete (%d)"), retTemp));
+ return retTemp;
+ }
+ break;
+ default:
+ FTRACE(FPrint(_L("CDunIrPlugin::NotifyServerStateChange() (unknown state) complete")));
+ return KErrNotSupported;
+ }
+ FTRACE(FPrint(_L("CDunIrPlugin::NotifyServerStateChange() complete")));
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// From class MDunLocalMediaPlugin.
+// Gets called when server needs to know the active connection
+// ---------------------------------------------------------------------------
+//
+TConnId CDunIrPlugin::ActiveConnection()
+ {
+ FTRACE(FPrint(_L("CDunIrPlugin::ActiveConnection()")));
+ FTRACE(FPrint(_L("CDunIrPlugin::ActiveConnection() (not found) complete")));
+ return NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// From class MDunConnMon.
+// Gets called when line status changes or when any type of error is detected
+// ---------------------------------------------------------------------------
+//
+void CDunIrPlugin::NotifyProgressChangeL(
+ TConnId aConnId,
+ TDunConnectionReason /*aConnReason*/ )
+ {
+ FTRACE(FPrint( _L( "CDunIrPlugin::NotifyProgressChangeL()" ) ));
+ RComm* irConn = static_cast<RComm*>( aConnId );
+ if ( &iIrPort != irConn )
+ {
+ FTRACE(FPrint( _L( "CDunIrPlugin::NotifyProgressChangeL() (not found) complete")) );
+ User::Leave( KErrNotFound );
+ }
+ // Now indications are down indications from local media side
+ FTRACE(FPrint( _L( "CDunIrPlugin::NotifyProgressChangeL() restart plugin" ) ));
+ iServer->NotifyPluginRestart( KDunIrPluginUid );
+ FTRACE(FPrint( _L( "CDunIrPlugin::NotifyProgressChangeL() complete")) );
+ }
+
+// ======== GLOBAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// NewLocalPluginL implements factory construction for
+// the class CDunIrPlugin.
+// The function is exported at ordinal 1.
+// Returns: Pointer: The new instance of CDunIrPlugin
+// ---------------------------------------------------------------------------
+//
+EXPORT_C MDunLocalMediaPlugin* NewLocalPluginL()
+ {
+ return new (ELeave) CDunIrPlugin;
+ }