kerneltest/f32test/shostmassstorage/msman/src/cusbotg.cpp
changeset 0 a41df078684a
child 297 b2826f67641f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/shostmassstorage/msman/src/cusbotg.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,270 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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 <e32cmn.h>
+#include <e32base.h>
+#include <d32otgdi.h>
+#include <e32property.h>
+
+#include "cusbotg.h"
+#include "cusbotgwatcher.h"
+#include "rusbmspublisher.h"
+
+
+#include "tmslog.h"
+#include "debug.h"
+
+_LIT(KOtgdiLddFileName, "otgdi");
+
+
+ROtgStateChangeNotifier::ROtgStateChangeNotifier()
+:   iRegistered(EFalse)
+    {
+    __MSFNSLOG
+    }
+
+
+ROtgStateChangeNotifier::~ROtgStateChangeNotifier()
+    {
+    __MSFNSLOG
+    if (iRegistered)
+        iMessage.Complete(KErrDisconnected);
+    }
+
+/**
+Initialise notifier to enable media change notfications.
+
+@param aMessage The message to commplete the notification
+*/
+void ROtgStateChangeNotifier::Register(const RMessage2& aMessage)
+    {
+    __MSFNLOG
+	iRegistered = ETrue;
+	iMessage = aMessage;
+    }
+
+
+void ROtgStateChangeNotifier::DoNotifyL()
+    {
+	__MSFNLOG
+	CompleteNotifierL(KErrNone);
+    }
+
+
+void ROtgStateChangeNotifier::DoCancelL()
+    {
+	__MSFNLOG
+	CompleteNotifierL(KErrCancel);
+    }
+
+
+void ROtgStateChangeNotifier::CompleteNotifierL(TInt aReason)
+	{
+    __MSFNLOG
+	if (iRegistered)
+        {
+		TBool changed = ETrue;
+        TPckgBuf<TBool> p(changed);
+		iMessage.WriteL(0, p);
+		iMessage.Complete(aReason);
+		iRegistered = EFalse;
+        }
+	}
+
+
+CUsbOtg* CUsbOtg::NewL()
+	{
+    __MSFNSLOG
+	CUsbOtg* self = new (ELeave) CUsbOtg();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+
+void CUsbOtg::ConstructL()
+	{
+    __MSFNLOG
+
+    TInt r = User::LoadLogicalDevice(KOtgdiLddFileName);
+
+    if (r != KErrNone && r != KErrAlreadyExists)
+        {
+        __USBOTGPRINT1(_L("   LoadLogicalDevice(KOtgdiLddFileName) error = %d"), r);
+        User::Leave(r);
+        }
+
+    r = iUsbOtgDriver.Open();
+    if (r != KErrNone && r != KErrAlreadyExists)
+        {
+        __USBOTGPRINT1(_L("   otg.Open fails %d"), r);
+        User::FreeLogicalDevice(RUsbOtgDriver::Name());
+        User::Leave(r);
+        }
+
+    StartL();
+
+    r = iUsbOtgDriver.StartStacks();
+    if (r != KErrNone)
+        {
+        __USBOTGPRINT1(_L("   otg.StartStacks fails %d"), r);
+        User::FreeLogicalDevice(RUsbOtgDriver::Name());
+        User::Leave(r);
+        }
+
+    __USBOTGPRINT(_L("   otg stacks successfully started"));
+	}
+
+
+CUsbOtg::CUsbOtg()
+:   iOtgState(KOtgStateStart)
+    {
+    __MSFNLOG
+    }
+
+
+CUsbOtg::~CUsbOtg()
+	{
+    __MSFNLOG
+    Stop();
+
+    TInt r = iUsbOtgDriver.BusDrop();
+
+    // Unload OTGDI components if it was ever started
+
+    if (iUsbOtgDriver.Handle())
+        {
+        iUsbOtgDriver.StopStacks();
+        iUsbOtgDriver.Close();
+
+        }
+
+    TInt err = User::FreeLogicalDevice(RUsbOtgDriver::Name());
+	}
+
+
+void CUsbOtg::StartL()
+    {
+    __MSFNLOG
+	// Request Otg notifications
+    iOtgEventWatcher = CUsbOtgEventWatcher::NewL(iUsbOtgDriver, *this);
+	iOtgEventWatcher->Start();
+
+    iRequestSessionWatcher = CRequestSessionWatcher::NewL(*this);
+    }
+
+
+void CUsbOtg::Stop()
+/**
+ * Stop the USB OTG events watcher
+ */
+    {
+    __MSFNLOG
+
+    if (iOtgEventWatcher)
+        {
+        iOtgEventWatcher->Cancel();
+        delete iOtgEventWatcher;
+        iOtgEventWatcher = NULL;
+        }
+
+    if (iRequestSessionWatcher)
+        {
+        delete iRequestSessionWatcher;
+        iRequestSessionWatcher = NULL;
+        }
+    }
+
+
+void CUsbOtg::BusRequestL()
+    {
+    __MSFNLOG
+    if (iOtgState == KOtgStateAPlugInserted)
+        {
+        TInt err = iUsbOtgDriver.BusRequest();
+        if (err)
+            {
+            __USBOTGPRINT1(_L("OTG::BusRequest[%d] failed !"), err);
+            }
+        User::LeaveIfError(err);
+        iOtgState = KOtgStateSessionOpen;
+        }
+
+    }
+
+
+void CUsbOtg::HandleUsbOtgEvent(RUsbOtgDriver::TOtgEvent aEvent)
+    {
+    __MSFNLOG
+
+    switch (aEvent)
+        {
+        case RUsbOtgDriver::EEventAPlugInserted:
+            {
+            __USBOTGPRINT(_L(">> UsbOtgEvent[EEventAPlugInserted]"));
+            /*
+            RUsbOtgEventPublisher eventPublisher;
+            eventPublisher.PublishEvent(aEvent);
+            */
+            iNotifier.DoNotifyL();
+            iOtgState = KOtgStateAPlugInserted;
+            }
+            break;
+
+        case RUsbOtgDriver::EEventBusConnectionBusy:
+            {
+            RUsbManConnectionStatePublisher publisher;
+            publisher.PublishEvent(ETrue);
+            }
+            break;
+        case RUsbOtgDriver::EEventBusConnectionIdle:
+            {
+            RUsbManConnectionStatePublisher publisher;
+            publisher.PublishEvent(EFalse);
+            }
+            break;
+        default:
+            __USBOTGPRINT1(_L(">> UsbOtgEvent[%x]"), aEvent);
+            break;
+        }
+    }
+
+
+TBool CUsbOtg::DeviceInserted()
+    {
+    __MSFNLOG
+    return iOtgState == KOtgStateAPlugInserted ? ETrue : EFalse;
+    }
+
+void CUsbOtg::NotifyChange(const RMessage2& aMessage)
+    {
+    __MSFNLOG
+    iNotifier.Register(aMessage);
+    }
+
+
+void CUsbOtg::NotifyChangeCancel()
+    {
+    __MSFNLOG
+    iNotifier.DoCancelL();
+    }
+
+
+TInt CUsbOtg::BusDrop()
+    {
+    __MSFNLOG
+    return iUsbOtgDriver.BusDrop();
+    }