tools/createsrc-templates/AsConsole/src/SkeletonTemplate.cpp
author Tom Sutcliffe <thomas.sutcliffe@accenture.com>
Sun, 17 Oct 2010 18:43:12 +0100
changeset 69 849a0b46c767
parent 0 7f656887cf89
permissions -rw-r--r--
Fixed lots of issues with installing a low-caps version of fshell from SIS file. * Fixed issue in CCommandFactory whereby some APIs like GetCommandInfoL could trigger allocations on the wrong heap or signals to the wrong thread. The symptoms were often seen as a crash in the which_00 thread when running ciftest. * Lots of build fixes for when FSHELL_PROTECTED_UIDS isn't defined and when all capabilities aren't available. * Added new platform.mmh macro FSHELL_OPEN_SIGNED. * Open signing of fshell SIS files is now supported for production S60 handsets. Build fshell with the FSHELL_OPEN_SIGNED macro defined (and without defining FSHELL_CAP_ALL or FSHELL_PROTECTED_UIDS) in your platform.mmh and submit \epoc32\fshell\fshell.unsigned.sis to https://www.symbiansigned.com/app/page/public/openSignedOnline.do . The following commands are not available when using Open Signing due to Platform Security restrictions: fdb; kerninfo; chunkinfo; svrinfo; objinfo; sudo; fsck; localdrive; ramdefrag; readmem; reboot; setcritical; setpriority. Others such as chkdeps, e32header, ps, and fshell itself will run but in a restricted capacity (for example, fshell will no longer allow you to modify files in the \sys\bin directory). * Removed commands objinfo, svrinfo, chunkinfo, readmem, fsck completely when memory access isn't present - previously they would still appear in the help but would give an error if you tried to run them.

// SkeletonTemplate.cpp
//
// [[COPYRIGHT]]
//

#include <e32base.h>
#include <e32cons.h>
#include "SkeletonTemplate.h"

void MainL()
	{
	CConsoleBase* cons = Console::NewL(_L(" SkeletonTemplate "), TSize(KConsFullScreen, KConsFullScreen));
	CleanupStack::PushL(cons);
	
	CActiveScheduler* as = new(ELeave)CActiveScheduler();
	CleanupStack::PushL(as);
	CActiveScheduler::Install(as);
	
	CSkeletonTemplate* echo = CSkeletonTemplate::NewLC(*cons);
	
	cons->Printf(_L("Hello World!\n"));
	cons->Printf(_L("Press escape to exit\n"));
	
	echo->Start();
	
	CActiveScheduler::Start();
	
	
	CleanupStack::PopAndDestroy(3); // cons, as, echo
	}

TInt E32Main()
	{
	__UHEAP_MARK;
	CTrapCleanup* cleanup = CTrapCleanup::New(); // get clean-up stack
	TInt err = KErrNone;
	
	if (cleanup)
		{
		TRAP(err, MainL() );
		delete cleanup; // destroy clean-up stack
		}
	else
		{
		err = KErrNoMemory;
		}
	
	__UHEAP_MARKEND;
	return err;
	}
	
//______________________________________________________________________________
//						CSkeletonTemplate
CSkeletonTemplate* CSkeletonTemplate::NewLC(CConsoleBase& aConsole)
	{
	CSkeletonTemplate* self = new(ELeave)CSkeletonTemplate(aConsole);
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;
	}

CSkeletonTemplate* CSkeletonTemplate::NewL(CConsoleBase& aConsole)
	{
	CSkeletonTemplate* self = NewLC(aConsole);
	CleanupStack::Pop(self);
	return self;
	}

CSkeletonTemplate::~CSkeletonTemplate()
	{
	Cancel();
	}
	
void CSkeletonTemplate::Start()
	{
	if (!IsActive())
		{
		iConsole.Read(iStatus);
		SetActive();
		}
	}

void CSkeletonTemplate::RunL()
	{
	TKeyCode key = iConsole.KeyCode();
	if (key == EKeyEscape)
		{
		CActiveScheduler::Stop();
		return;
		}
	else if (key == EKeyEnter)
		{
		iConsole.Printf(_L("\n"));
		}
	else
		{
		TBuf<1> buf;
		buf.Append(key);
		iConsole.Write(buf);
		}
	// reissue read request
	Start();
	}

void CSkeletonTemplate::DoCancel()
	{
	iConsole.ReadCancel();
	}

CSkeletonTemplate::CSkeletonTemplate(CConsoleBase& aConsole)
	: CActive(CActive::EPriorityStandard), iConsole(aConsole)
	{
	}

void CSkeletonTemplate::ConstructL()
	{
	CActiveScheduler::Add(this);
	}