// Copyright (c) 2007-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:
// For the Winscw Emulator only, selects between NGA and Non-NGA version of wsgraphicdrawer.
// The default is the non-GCE based version.
// To select the NGA version do one of:
// 1. Add a line to the epoc.ini file in \epoc32\data like this:
// symbian_graphics_use_gce ON
// or
// 2. Start epoc.exe with these parameters, (the "--" IS necessary):
// -Dsymbian_graphics_use_gce=ON --
// or
// 3. epoc.exe can be told to switch to a different initialisation file than epoc.ini, with the -M parameter.
// Progress chaining to the real Wserv is logged in epocwind.out.
// 
//

#include <e32svr.h>
#include <u32hal.h>


_LIT(KProcessName, "WservSwitch");


TInt ChainWservSwitch()
	{
	_LIT(KWservSwitchNga,"z:\\sys\\bin\\wserv_nga.exe");
	_LIT(KWservSwitchNonNga,"z:\\sys\\bin\\wserv_nonnga.exe");
	// need to forward the command parameters to the chained version of Wserv
	TInt argLen = User::CommandLineLength();
	HBufC* arg = HBufC::New(argLen);
	if (arg == NULL)
		{
		return KErrNoMemory;
		}
	TPtr argPtr = arg->Des();
	User::CommandLine(argPtr);

	// NGA or Non-NGA WServ version?
	TBool nga = EFalse;
	UserSvr::HalFunction(EHalGroupEmulator, EEmulatorHalBoolProperty,  (TAny*)"symbian_graphics_use_gce",  &nga);

	// try to launch it
	const TPtrC exeName = nga ?  KWservSwitchNga() : KWservSwitchNonNga();
	RDebug::Print(_L("%S: Starting \"%S\" \"%S\""), &KProcessName, &exeName, &argPtr);
	RProcess server;
	TInt err = server.Create(exeName, argPtr, EOwnerThread);
	delete arg;
	arg = NULL;
	if (err)
		{
		return err;
		}

	// wait for server to start
	RDebug::Print(_L("%S: waiting on process ..."), &KProcessName);
	TRequestStatus stat;
	server.Rendezvous(stat);

	if (stat!=KRequestPending)
		{ // abort startup
		server.Kill(0);
		}
	else
		{ // logon OK - start the server
		server.Resume();
		}

	User::WaitForRequest(stat);
	return (server.ExitType() == EExitPanic) ? KErrGeneral : stat.Int();
	}


TInt E32Main()
	{
	TInt error = ChainWservSwitch();
	// propagate error to SysStart
	if (error)
		{
		RDebug::Print(_L("%S: Failed with error %i"), &KProcessName, error);
		}
	RProcess::Rendezvous(error);
	return error;
	}

