kernel/eka/euser/cbase/ub_cons.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 1995-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:
// e32\euser\cbase\ub_cons.cpp
// 
//

#include "ub_std.h"
#include <e32uid.h>
#include <e32wins.h>



/**
Default constructor.
*/
EXPORT_C CConsoleBase::CConsoleBase()
	{
	}



/**
Destructor.
*/
EXPORT_C CConsoleBase::~CConsoleBase()
	{
	}




/**
Gets a character from the console.

@return the key code from the console.
*/
EXPORT_C TKeyCode CConsoleBase::Getch()
	{

	TRequestStatus s;
	Read(s);
	User::WaitForRequest(s);
	__ASSERT_ALWAYS(s==KErrNone,Panic(EConsGetchFailed));
	return(KeyCode());
	}




/**
Prints characters to the console window.

@param aFmt             The  non-modifiable descriptor containing the
                        format string. The TRefByValue class provides a
                        constructor which takes a TDesC type. 

@param ...              A variable number of arguments to be converted to text
                        as dictated by the format string. 
*/
EXPORT_C void CConsoleBase::Printf(TRefByValue<const TDesC> aFmt,...)
	{

	TestOverflowTruncate overflow;
	// coverity[var_decl]
	VA_LIST list;
	VA_START(list,aFmt);
	TBuf<0x100> aBuf;
	// coverity[uninit_use_in_call]
	TRAP_IGNORE(aBuf.AppendFormatList(aFmt,list,&overflow)); // ignore leave in TTimeOverflowLeave::Overflow()
	Write(aBuf);
	}



/**
Sets the cursor's x-position.

@param aX The x-position.
*/
EXPORT_C void CConsoleBase::SetPos(TInt aX)
	{

	SetCursorPosAbs(TPoint(aX,WhereY()));
	}




/**
Sets the cursor's x-position and y-position.

@param aX The x-position.
@param aY The y-position.
*/
EXPORT_C void CConsoleBase::SetPos(TInt aX,TInt aY)
	{

	SetCursorPosAbs(TPoint(aX,aY));
	}




/**
Gets the cursor's x-position.

@return The cursor's x-position.
*/
EXPORT_C TInt CConsoleBase::WhereX() const
	{

	return(CursorPos().iX);
	}



/**
Gets the cursor's y-position.

@return The cursor's y-position.
*/
EXPORT_C TInt CConsoleBase::WhereY() const
	{

	return(CursorPos().iY);
	}


/**
Extension function


*/
EXPORT_C TInt CConsoleBase::Extension_(TUint aExtensionId, TAny*& a0, TAny* a1)
	{
	return CBase::Extension_(aExtensionId, a0, a1);
	}


void CColorConsoleBase::SetTextAttribute(TTextAttribute /*anAttribute*/)
//
//
//
	{
	}


/**
Extension function


*/
EXPORT_C TInt CColorConsoleBase::Extension_(TUint aExtensionId, TAny*& a0, TAny* a1)
	{
	return CConsoleBase::Extension_(aExtensionId, a0, a1);
	}


NONSHARABLE_CLASS(CProxyConsole) : public CColorConsoleBase
	{
public:
	~CProxyConsole();
	TInt Construct(const TDesC& aImplDll);
public:
// implement for CConsoleBase
	TInt Create(const TDesC &aTitle,TSize aSize);
	void Read(TRequestStatus &aStatus);
	void ReadCancel();
	void Write(const TDesC &aDes);
	TPoint CursorPos() const;
	void SetCursorPosAbs(const TPoint &aPoint);
	void SetCursorPosRel(const TPoint &aPoint);
	void SetCursorHeight(TInt aPercentage);
	void SetTitle(const TDesC &aTitle);
	void ClearScreen();
	void ClearToEndOfLine();
	TSize ScreenSize() const;
	TKeyCode KeyCode() const;
	TUint KeyModifiers() const;
// implement for CColorConsoleBase
	void SetTextAttribute(TTextAttribute anAttribute); 
	virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
private:
	RLibrary iLib;
	CColorConsoleBase* iConsole;
	};

TInt CProxyConsole::Construct(const TDesC& aImplDll)
	{
	const TUidType type(KNullUid, KSharedLibraryUid, KConsoleDllUid);
	TInt r=iLib.Load(aImplDll,type);
	if (r==KErrNone)
		{
		iConsole=(CColorConsoleBase*)(iLib.Lookup(1)());
		if (!iConsole)
			r=KErrNoMemory;
		}
	return r;
	}

CProxyConsole::~CProxyConsole()
	{
	delete iConsole;
	iLib.Close();
	}

TInt CProxyConsole::Create(const TDesC &aTitle,TSize aSize)
	{
	return iConsole->Create(aTitle,aSize);
	}
	
void CProxyConsole::Read(TRequestStatus &aStatus)
	{
	iConsole->Read(aStatus);
	}
	
void CProxyConsole::ReadCancel()
	{
	iConsole->ReadCancel();
	}
	
void CProxyConsole::Write(const TDesC &aDes)
	{
	iConsole->Write(aDes);
	}
	
TPoint CProxyConsole::CursorPos() const
	{
	return iConsole->CursorPos();
	}
	
void CProxyConsole::SetCursorPosAbs(const TPoint &aPoint)
	{
	iConsole->SetCursorPosAbs(aPoint);
	}
	
void CProxyConsole::SetCursorPosRel(const TPoint &aPoint)
	{
	iConsole->SetCursorPosRel(aPoint);
	}
	
void CProxyConsole::SetCursorHeight(TInt aPercentage)
	{
	iConsole->SetCursorHeight(aPercentage);
	}
	
void CProxyConsole::SetTitle(const TDesC &aTitle)
	{
	iConsole->SetTitle(aTitle);
	}
	
void CProxyConsole::ClearScreen()
	{
	iConsole->ClearScreen();
	}
	
void CProxyConsole::ClearToEndOfLine()
	{
	iConsole->ClearToEndOfLine();
	}
	
TSize CProxyConsole::ScreenSize() const
	{
	return iConsole->ScreenSize();
	}
	
TKeyCode CProxyConsole::KeyCode() const
	{
	return iConsole->KeyCode();
	}
	
TUint CProxyConsole::KeyModifiers() const
	{
	return iConsole->KeyModifiers();
	}
	
void CProxyConsole::SetTextAttribute(TTextAttribute anAttribute)
	{
	iConsole->SetTextAttribute(anAttribute);
	}

TInt CProxyConsole::Extension_(TUint aExtensionId, TAny*& a0, TAny* a1)
	{
	return iConsole->Extension_(aExtensionId, a0, a1);
	}


_LIT(KConsImpl,"econs");
#ifdef __WINS__
_LIT(KConsGuiImpl,"econseik");
_LIT(KConsNoGuiImpl,"econsnogui");
_LIT(KConsWservImpl, "econswserv");
#endif



/**
Creates a new console object.

@param aTitle The title text for the console.
              This should not be longer than 256 characters.
@param aSize  The size of the console window.

@return A pointer to the new console object.

@see CConsoleBase::Create() 
*/
EXPORT_C CConsoleBase *Console::NewL(const TDesC &aTitle,TSize aSize)
	{
	CProxyConsole *pC=new(ELeave) CProxyConsole;
	TInt r=pC->Construct(KConsImpl);
	if (r==KErrNone)
		r=pC->Create(aTitle,aSize);
#ifdef __WINS__
	if (r!=KErrNone)
		{
		delete pC;
		pC=new(ELeave) CProxyConsole;
		if (EmulatorNoGui())
			{
			// try and create a dummy console via ECONSNOGUI
			r=pC->Construct(KConsNoGuiImpl);
			}
		else if (EmulatorMiniGui())
			{
			// try and create Wserv console via ECONSWSERV
			r=pC->Construct(KConsWservImpl);
			}
		else
			{
			// try and create a GUI console via ECONSEIK instead
			r=pC->Construct(KConsGuiImpl);
			}
		if (r==KErrNone)
			r=pC->Create(aTitle,aSize);
		}
#endif
	if (r!=KErrNone)
		{
		delete pC;
		User::Leave(r);
		}
	return(pC);
	}