usbmgmt/usbmgrtest/usbcontrolapp/testusbawareapp/testusbawareapp.cpp
changeset 0 c9bc50fca66e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgrtest/usbcontrolapp/testusbawareapp/testusbawareapp.cpp	Tue Feb 02 02:02:59 2010 +0200
@@ -0,0 +1,300 @@
+/*
+* Copyright (c) 2008-2009 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:
+*
+*/
+
+#include "testusbawareapp.h"
+
+#include <e32cons.h>
+#include <e32debug.h>
+#include "e32svr.h"
+#include <e32keys.h>
+
+#include "usbcontrolappshared.h"
+#include "e32property.h" 
+
+#define LOG(A,B) RDebug::Print(_L("UsbAwareApp: " L##A),B)
+#define PNT(A)	 RDebug::Print(_L("UsbAwareApp: " L##A))
+#define PANIC Panic(__LINE__)
+
+void Panic(TInt aLine)
+	{
+	RDebug::Printf("UsbAwareApp: PANIC line=%d", aLine);
+	User::Panic(_L("USBAWAREAPP"), aLine);
+	}
+
+void RunAppL()
+	{
+	CUsbAwareAppConsole* awareapp = CUsbAwareAppConsole::NewLC();
+	awareapp->Start();
+	CleanupStack::PopAndDestroy(awareapp);
+	}
+
+TInt E32Main()
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+	CActiveScheduler* activeScheduler = new CActiveScheduler;
+	TInt err = KErrNoMemory;
+	if(cleanup && activeScheduler)
+		{
+		CActiveScheduler::Install(activeScheduler);
+		PNT("*** UsbAwareApp E32Main ***\n");
+		TRAP(err, RunAppL());
+		}
+	delete activeScheduler;
+	delete cleanup;
+	__UHEAP_MARKEND;
+	return err;
+	}
+
+
+
+CUsbAwareAppConsole* CUsbAwareAppConsole::NewLC()
+	{
+	CUsbAwareAppConsole* self = new(ELeave) CUsbAwareAppConsole;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	PNT("\nConstructed Aware App\n");
+	return self;
+	}
+	
+CUsbAwareAppConsole::~CUsbAwareAppConsole()
+	{
+	PNT("\nClosing Aware App\n");
+	delete iKeys;
+	delete iShutdownMonitor;
+	delete iConsole;
+	}
+
+CUsbAwareAppConsole::CUsbAwareAppConsole()
+	{
+	}
+
+void CUsbAwareAppConsole::ConstructL()
+	{
+	iConsole = Console::NewL(KUsbAwareAppTitle, TSize(KViewerNumCharactersOnLine, KNumLinesInWindow));
+	Move(-3, 9);
+	iShutdownMonitor = CShutdownMonitor::NewL(*this);
+	// After everything else, enable interactivity.
+	iKeys = CUsbAwareAppKeys::NewL(*this);
+	Draw();
+	}
+
+void CUsbAwareAppConsole::Move(TInt aX, TInt aY)
+	{
+	TRawEvent event;
+
+	event.Set(TRawEvent::EKeyDown, EStdKeyLeftShift);
+	UserSvr::AddEvent(event);
+
+	if (aX)
+		{
+		if ( aX > 0 )
+			{
+			// Move to the right...
+			for(TInt i=aX; i; i--)
+				{
+				event.Set(TRawEvent::EKeyDown, EStdKeyRightArrow);
+				UserSvr::AddEvent(event);
+				event.Set(TRawEvent::EKeyUp, EStdKeyRightArrow);
+				UserSvr::AddEvent(event);
+				}
+			}
+		else
+			{
+			// Move to the Left...
+			for(TInt i=aX; i; i++)
+				{
+				event.Set(TRawEvent::EKeyDown, EStdKeyLeftArrow);
+				UserSvr::AddEvent(event);
+				event.Set(TRawEvent::EKeyUp, EStdKeyLeftArrow);
+				UserSvr::AddEvent(event);
+				}
+			}
+		}
+	
+	if (aY)
+		{
+		if ( aY > 0 )
+			{
+			// Move downwards...
+			for(TInt i=aY; i; i--)
+				{
+				event.Set(TRawEvent::EKeyDown, EStdKeyDownArrow);
+				UserSvr::AddEvent(event);
+				event.Set(TRawEvent::EKeyUp, EStdKeyDownArrow);
+				UserSvr::AddEvent(event);
+				}
+			}
+		else
+			{
+			// Move upwards...
+			for(TInt i=aY; i; i++)
+				{
+				event.Set(TRawEvent::EKeyDown, EStdKeyUpArrow);
+				UserSvr::AddEvent(event);
+				event.Set(TRawEvent::EKeyUp, EStdKeyUpArrow);
+				UserSvr::AddEvent(event);
+				}
+			}
+		}
+
+	event.Set(TRawEvent::EKeyUp, EStdKeyLeftShift);
+	UserSvr::AddEvent(event);
+	}
+
+void CUsbAwareAppConsole::Start()
+	{
+	// Get everything running
+	CActiveScheduler::Start();
+	}
+	
+void CUsbAwareAppConsole::Stop() const
+	{
+	CActiveScheduler::Stop();
+	}
+
+void CUsbAwareAppConsole::Draw()
+	{
+	iConsole->ClearScreen();
+	
+	iConsole->Printf(_L(
+//          1         2         3         4         5 \r\n
+// 12345678901234567890123456789012345678901234567890123
+  "Test USB Aware App:           \r\n"
+ L"\r\n"
+ L"Press 'R' to RequestSession   \r\n"
+	)
+	);
+
+	}
+
+
+
+CUsbAwareAppKeys* CUsbAwareAppKeys::NewL(CUsbAwareAppConsole& aUsbAwareAppConsole)
+	{
+	CUsbAwareAppKeys* self = new(ELeave) CUsbAwareAppKeys(aUsbAwareAppConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CUsbAwareAppKeys::~CUsbAwareAppKeys()
+	{
+	iUsb.Close();
+	Cancel();
+	}
+
+CUsbAwareAppKeys::CUsbAwareAppKeys(CUsbAwareAppConsole& aUsbAwareAppConsole)
+	: CActive(EPriorityStandard)
+	, iUsbAwareAppConsole(aUsbAwareAppConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CUsbAwareAppKeys::ConstructL()
+	{
+	// Connect USB session
+	TInt err = iUsb.Connect();
+	LOG("CUsbAwareAppKeys::ConstructL()   iUsb.Connect()   err=%d", err);
+	User::LeaveIfError(err);
+	// Allow keyboard input
+	iUsbAwareAppConsole.iConsole->Read(iStatus);
+	SetActive();
+	}
+
+void CUsbAwareAppKeys::RunL()
+	{
+	if (!IsActive())
+		{
+		User::LeaveIfError(iStatus.Int());
+		
+		switch(iUsbAwareAppConsole.iConsole->KeyCode())
+			{
+		case 'r': case 'R':
+			{
+			TInt err = iUsb.RequestSession();
+			LOG("CUsbAwareAppKeys::RunL()   RequestSession()	err=%d", err);
+			}
+			break;
+			} // switch
+		iUsbAwareAppConsole.iConsole->Read(iStatus);
+		SetActive();
+		}
+	}
+
+void CUsbAwareAppKeys::DoCancel()
+	{
+	iUsbAwareAppConsole.iConsole->ReadCancel();
+	}
+
+
+
+
+CShutdownMonitor* CShutdownMonitor::NewL(MShutdownInterface& aUsbAwareAppConsole)
+	{
+	CShutdownMonitor* self = new(ELeave) CShutdownMonitor(aUsbAwareAppConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CShutdownMonitor::CShutdownMonitor(MShutdownInterface& aUsbAwareAppConsole)
+	: CActive(EPriorityLow) // Low so all notifications that want to be serviced will be done first
+	, iUsbAwareAppConsole(aUsbAwareAppConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CShutdownMonitor::ConstructL()
+	{
+	// Monitor the KUsbControlAppShutdownKey property to tell us when to shut down
+	TInt err = iShutdownProp.Attach(KUidUsbControlAppCategory, KUsbControlAppShutdownKey);
+	LOG("CShutdownMonitor::ConstructL	 iShutdownProp.Attach() => %d", err);
+	User::LeaveIfError(err);
+	iShutdownProp.Subscribe(iStatus);
+	SetActive();
+	TInt val;
+	// Make sure the cuurent value is 0 - shut down when this changes to 1
+	err = iShutdownProp.Get(val);
+	LOG("CShutdownMonitor::ConstructL()	 iShutdownProp.Get(val)		val => %d", val);
+	LOG("CShutdownMonitor::ConstructL()	 iShutdownProp.Get(val)		err => %d", err);
+	User::LeaveIfError(err);
+	__ASSERT_ALWAYS(val==0, PANIC);
+	}
+
+CShutdownMonitor::~CShutdownMonitor()
+	{
+	iShutdownProp.Close();
+	}
+
+void CShutdownMonitor::RunL()
+	{
+	// Request to shut everything down made in USB Aware App
+	TInt val;
+	TInt err = iShutdownProp.Get(val);
+	LOG("CShutdownMonitor::RunL	 iShutdownProp.Get(val) err => %d", err);
+	LOG("CShutdownMonitor::RunL	 iShutdownProp.Get(val) val => %d", val);
+	Cancel(); // Not interested in any more notifications
+	iUsbAwareAppConsole.Stop(); // Stopping Active Scheduler will results in the destructor getting called
+	}
+
+void CShutdownMonitor::DoCancel()
+	{
+	iShutdownProp.Cancel();
+	}