diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/wins_switching/wservswitch.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/wins_switching/wservswitch.cpp Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,95 @@ +// 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 +#include + + +_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; + } +