--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappcomponents/harvester/server/src/mpxconnectioneventhandler.cpp Thu May 27 13:19:19 2010 +0300
@@ -0,0 +1,315 @@
+/*
+* Copyright (c) 2006 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: Monitors for USB events
+*
+*/
+
+
+#include <e32base.h>
+#include <f32file.h>
+#include <e32property.h>
+#ifdef RD_MULTIPLE_DRIVE
+#include <driveinfo.h>
+#endif //RD_MULTIPLE_DRIVE
+#include <mpxpskeywatcher.h>
+#include <coreapplicationuisdomainpskeys.h>
+#include <UsbWatcherInternalPSKeys.h>
+#include <usbpersonalityids.h>
+#include <mtpprivatepskeys.h>
+#include <mpxlog.h>
+#include "mpxconnectioneventhandler.h"
+
+// CONSTANTS
+const TUint KUsbAllStates = 0xFFFFFFFF;
+
+// ---------------------------------------------------------------------------
+// Default Constructor
+// ---------------------------------------------------------------------------
+//
+CMPXConnectionEventHandler::CMPXConnectionEventHandler( MMPXSystemEventObserver& aObserver ) :
+ CActive( EPriorityStandard ),
+ iObserver( aObserver ),
+ iState ( EMPXConnectionNone ),
+ iUsbManConnected( EFalse )
+
+
+ {
+ CActiveScheduler::Add( this );
+ }
+
+
+// ---------------------------------------------------------------------------
+// 2nd Phase Constructor
+// ---------------------------------------------------------------------------
+//
+void CMPXConnectionEventHandler::ConstructL()
+ {
+ MPX_DEBUG1(_L("CMPXConnectionEventHandler::ConstructL <---"));
+ iUSBKeyWatcher = CMPXPSKeyWatcher::NewL( KPSUidUsbWatcher,
+ KUsbWatcherSelectedPersonality,
+ this );
+
+ //for checking MTP status key whether a client has started
+ iMTPKeyWatcher = CMPXPSKeyWatcher::NewL( KMtpPSUid,
+ KMtpPSStatus,
+ this );
+
+ // Connect to usbman
+ ConnectUsbMan();
+ MPX_DEBUG1(_L("CMPXConnectionEventHandler::ConstructL --->"));
+ }
+
+
+// ---------------------------------------------------------------------------
+// Two Phased Constructor
+// ---------------------------------------------------------------------------
+//
+CMPXConnectionEventHandler* CMPXConnectionEventHandler::NewL
+ ( MMPXSystemEventObserver& aObserver )
+ {
+ CMPXConnectionEventHandler* self = CMPXConnectionEventHandler::NewLC( aObserver );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Two Phased Constructor
+// ---------------------------------------------------------------------------
+//
+CMPXConnectionEventHandler* CMPXConnectionEventHandler::NewLC
+ ( MMPXSystemEventObserver& aObserver )
+
+ {
+ CMPXConnectionEventHandler* self = new( ELeave ) CMPXConnectionEventHandler( aObserver);
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMPXConnectionEventHandler::~CMPXConnectionEventHandler()
+ {
+ Cancel();
+ if ( iUsbManConnected )
+ {
+ iUsbMan.Close();
+ }
+ delete iUSBKeyWatcher;
+ delete iMTPKeyWatcher;
+ }
+
+// ---------------------------------------------------------------------------
+// Poll for any ongoing USB / MTP event
+// ---------------------------------------------------------------------------
+//
+void CMPXConnectionEventHandler::PollStatus()
+ {
+ // only call back on connection state != EMPXConnectionNone
+ if (iState == EMPXConnectionMassStorage)
+ {
+ TRAP_IGNORE( DoMSStartEventL() );
+ }
+ else if (iState == EMPXConnectionMTPActive)
+ {
+ TRAP_IGNORE( DoMTPStartEventL() );
+ }
+ else if (iState == EMPXConnectionMTPIdle)
+ {
+ TRAP_IGNORE( DoMTPNotActiveEventL() );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Handle the PS key event
+// ---------------------------------------------------------------------------
+//
+void CMPXConnectionEventHandler::HandlePSEvent( TUid aUid, TInt aKey )
+ {
+ TRAP_IGNORE( DoHandlePSEventL(aUid,aKey) );
+ }
+
+// ---------------------------------------------------------------------------
+// Handle the PS key event
+// ---------------------------------------------------------------------------
+//
+void CMPXConnectionEventHandler::DoHandlePSEventL( TUid /*aUid*/, TInt /*aKey*/ )
+ {
+ MPX_FUNC("CMPXConnectionEventHandler::DoHandlePSEvent()");
+ if ( !iUsbManConnected )
+ {
+ ConnectUsbMan();
+ }
+
+ // Handle the Key event
+ TInt usbStatus;
+ iUSBKeyWatcher->GetValue( usbStatus );
+
+ TInt mtpStatus;
+ iMTPKeyWatcher->GetValue(mtpStatus);
+
+ MPX_DEBUG3("CMPXConnectionEventHandler::DoHandlePSEventL, usbStatus = %d, mtpStatus = %d", usbStatus, mtpStatus);
+ MPX_DEBUG2("CMPXConnectionEventHandler::DoHandlePSEventL, iState = %d", iState);
+ MPX_DEBUG4("CMPXConnectionEventHandler::DoHandlePSEventL, iDeviceState = %d, EUsbDeviceStateAddress(%d), EUsbDeviceStateConfigured(%d)", iDeviceState, EUsbDeviceStateAddress, EUsbDeviceStateConfigured);
+
+ RDebug::Print(_L("tpoon: CMPXConnectionEventHandler::DoHandlePSEventL, usbStatus = %d, mtpStatus = %d"), usbStatus, mtpStatus);
+ RDebug::Print(_L("tpoon: CMPXConnectionEventHandler::DoHandlePSEventL, iState = %d"), iState);
+ RDebug::Print(_L("tpoon: CMPXConnectionEventHandler::DoHandlePSEventL, iDeviceState = %d, EUsbDeviceStateAddress(%d), EUsbDeviceStateConfigured(%d)"), iDeviceState, EUsbDeviceStateAddress, EUsbDeviceStateConfigured);
+
+ // events from lower level is not causing multiple callback on the same type
+ // usb is really only connected if went through Address or Configured state
+ if( (usbStatus == KUsbPersonalityIdMS) && (iDeviceState == EUsbDeviceStateAddress || iDeviceState == EUsbDeviceStateConfigured))
+ {
+ if ((iState == EMPXConnectionMTPIdle) || (iState == EMPXConnectionMTPActive))
+ {
+ MPX_DEBUG1("CMPXConnectionEventHandler::DoHandlePSEvent - MTP End");
+ RDebug::Print(_L("tpoon: MTP End"));
+ iObserver.HandleSystemEventL( EUSBMTPEndEvent, -1 );
+ iState = EMPXConnectionNone;
+ }
+
+ if (iState != EMPXConnectionMassStorage)
+ {
+ DoMSStartEventL();
+ }
+ }
+ else if (iState == EMPXConnectionMassStorage)
+ {
+ if (usbStatus != KUsbPersonalityIdMS)
+ {
+ MPX_DEBUG1("CMPXConnectionEventHandler::DoHandlePSEvent - USB MassStorage End");
+ RDebug::Print(_L("tpoon: MS End"));
+ iObserver.HandleSystemEventL( EUSBMassStorageEndEvent, -1 );
+ iState = EMPXConnectionNone;
+ }
+ }
+
+ // after MassStorage End, it is possible that MTP is still connected
+ if (iState != EMPXConnectionMassStorage)
+ {
+ if ((mtpStatus == EMtpPSStatusUninitialized) && (iState != EMPXConnectionNone))
+ {
+ MPX_DEBUG1("CMPXConnectionEventHandler::DoHandlePSEvent - MTP End");
+ RDebug::Print(_L("tpoon: MTP End"));
+ iObserver.HandleSystemEventL( EUSBMTPEndEvent, -1 );
+ iState = EMPXConnectionNone;
+ }
+ else if ((mtpStatus == EMtpPSStatusActive) && (iState != EMPXConnectionMTPActive)
+ && ((usbStatus == KUsbPersonalityIdMTP) || (usbStatus == KUsbPersonalityIdPCSuiteMTP))) // only trigger MusicPlayer fully block and RAM Drive if USB MTP/PCSuiteMTP is connected
+ {
+ DoMTPStartEventL();
+ }
+ else if ((mtpStatus == EMtpPSStatusReadyToSync) && (iState != EMPXConnectionMTPIdle) && (iState != EMPXConnectionMTPActive))
+ {
+ DoMTPNotActiveEventL();
+ }
+ }
+ }
+
+void CMPXConnectionEventHandler::DoMSStartEventL()
+ {
+ MPX_DEBUG1("CMPXConnectionEventHandler::DoMSStartEventL - USB MassStorage Start");
+ RDebug::Print(_L("tpoon: MS Start"));
+ iObserver.HandleSystemEventL( EUSBMassStorageStartEvent, -1 );
+ iState = EMPXConnectionMassStorage;
+ }
+
+void CMPXConnectionEventHandler::DoMTPStartEventL()
+ {
+ MPX_DEBUG1("CMPXConnectionEventHandler::DoMTPStartEventL - MTP Start");
+ RDebug::Print(_L("tpoon: MTP Start"));
+ iObserver.HandleSystemEventL( EUSBMTPStartEvent, -1 );
+ iState = EMPXConnectionMTPActive;
+ }
+
+void CMPXConnectionEventHandler::DoMTPNotActiveEventL()
+ {
+ MPX_DEBUG1("CMPXConnectionEventHandler::DoMTPNotActiveEventL - MTP Not Active");
+ RDebug::Print(_L("tpoon: MTP Not Active"));
+ iObserver.HandleSystemEventL( EUSBMTPNotActiveEvent, -1 );
+ iState = EMPXConnectionMTPIdle;
+ }
+
+// ---------------------------------------------------------------------------
+// CMPXConnectionEventHandler::RunL
+// ---------------------------------------------------------------------------
+//
+void CMPXConnectionEventHandler::RunL()
+ {
+ MPX_FUNC("CMPXConnectionEventHandler::RunL()");
+ TInt status( iStatus.Int() );
+
+ MPX_DEBUG2("CMPXConnectionEventHandler::RunL status=%d", status );
+ if ( status != KErrCancel && status != KErrServerTerminated )
+ {
+ iUsbMan.DeviceStateNotification( KUsbAllStates, iDeviceState, iStatus );
+ SetActive();
+ }
+
+ if ( status == KErrNone )
+ {
+ MPX_DEBUG2("CMPXConnectionEventHandler::RunL - DeviceState = %d", iDeviceState);
+ HandlePSEvent( TUid::Uid(0), 0 );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMPXConnectionEventHandler::DoCancel
+// ---------------------------------------------------------------------------
+//
+void CMPXConnectionEventHandler::DoCancel()
+ {
+ MPX_FUNC("CMPXConnectionEventHandler::DoCancel()");
+ if ( iUsbManConnected )
+ {
+ iUsbMan.DeviceStateNotificationCancel();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMPXConnectionEventHandler::ConnectUsbMan
+// If error, default iDeviceState to EUsbDeviceStateConfigured so this would not
+// block usb event mode change.
+// ---------------------------------------------------------------------------
+void CMPXConnectionEventHandler::ConnectUsbMan()
+ {
+ MPX_FUNC("CMPXConnectionEventHandler::ConnectUsbMan()");
+ if ( iUsbMan.Connect() == KErrNone )
+ {
+ iUsbManConnected = ETrue;
+ // get device state
+ TInt err = iUsbMan.GetDeviceState( iDeviceState );
+ if ( err )
+ {
+ iDeviceState = EUsbDeviceStateUndefined;
+ }
+
+ // start active object
+ if ( !IsActive() )
+ {
+ iUsbMan.DeviceStateNotification( KUsbAllStates, iDeviceState, iStatus );
+ SetActive();
+ }
+ }
+ else
+ {
+ iDeviceState = EUsbDeviceStateConfigured;
+ }
+ }
+// END OF FILE
+