diff -r 000000000000 -r 8e480a14352b messagingfw/msgtest/targetautomation/TechviewStart/AppStarter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgtest/targetautomation/TechviewStart/AppStarter.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,216 @@ +// Copyright (c) 2001-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 "AppStarter.h" +#include "Starter.h" +#include "ThreadWatch.h" +#include "Start.hrh" + +#if defined(__WINS__) +_LIT(KExtension, ".dll"); +#else +_LIT(KExtension, ".exe"); +#endif + +_LIT(KGlobalSemaphore, "SPLASH"); + +const TInt KRetryWait = 10*1000; +const TInt KMaxRetries = (10*1000*100)/KRetryWait; + +void CAppStarter::NewLD(TInt aAppType, TUint32 aAppUid, TDesC& aExeFileName, TDesC& aDllFileName, TDesC* aCmdLineArgs, TUint32 aStackSize, + TUint32 aMinHeapSize, TUint32 aMaxHeapSize, TBool aMonitoring, TBool aViewless, TBool aSemaphore, + TSglQue* aQue, RApaLsSession& aSession, CStarter* aStarter) + { + CAppStarter* self = new(ELeave)CAppStarter(aSession); + self->iAppType = aAppType; + self->iAppUid = aAppUid; + self->iExeFileName = aExeFileName; + self->iDllFileName = aDllFileName; + self->iCmdLineArgs = aCmdLineArgs; + self->iStackSize = aStackSize; + self->iMinHeapSize = aMinHeapSize; + self->iMaxHeapSize = aMaxHeapSize; + self->iMonitoring = aMonitoring; + self->iViewless = aViewless; + self->iSemaphore = aSemaphore; + self->iQue = aQue; + self->iStarter = aStarter; + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + CActiveScheduler::Add(self); + self->RunL(); + } + +void CAppStarter::RunL() + { + if(iRetries++ > KMaxRetries) + { + iState = EAppFailed; + } + + switch(iState) + { + case EStartApp: + StartL(); + break; + case EAppStarted: + Done(ETrue); + break; + default: + case EAppFailed: + Done(EFalse); + break; + } + } + +CAppStarter::CAppStarter(RApaLsSession& aSession) : CTimer(EPriorityStandard), iState(EStartApp), iSession(aSession), iRetries(0) + { + + } + +CAppStarter::~CAppStarter() + { + + } + +TInt CAppStarter::RunError(TInt /*aError*/) + { + return KErrNone; + } + +void CAppStarter::StartL() + { + TFileName newname = iExeFileName; + + TThreadId threadId = 0; + + switch(iAppType) + { + case EApplicationType: + { + TApaAppInfo info; + if(iSession.GetAppInfo(info,TUid::Uid(iAppUid)) != KErrNone) + { + After(KRetryWait); + return; + } + + if(iViewless) + { + TRAPD(err, TryStartViewlessAppL(info, threadId)); + if (err != KErrNone) + { + After(KRetryWait); + return; //ignore error + } + } + else if (info.iUid!=KNullUid) + { + if(iSession.StartDocument(newname, TUid::Uid(iAppUid), threadId) != KErrNone) + { + After(KRetryWait); + return; + } + } + else + { + iState = EAppFailed; + Next(); + } + } + break; + case EExecutableType: + { + newname.Append(KExtension); + if(iSession.StartDocument(newname, TUid::Uid(0), threadId) != KErrNone) + { + After(KRetryWait); + return; + } + } + break; + case ECmdLnArgExecutableType: + { + ASSERT( !iMonitoring); // Not imlpemented yet +#if defined(__WINS__) || defined(__WINSCW__) + TName libName = iDllFileName; + libName.Append(KExtension); + RLibrary lib; + TInt error = lib.Load(libName); + if (error!=KErrNone) + { + After(KRetryWait); + return; + } + TThreadFunction serverFunc=reinterpret_cast(lib.Lookup(1)); + RThread server; + error=server.Create(libName,serverFunc, iStackSize, iCmdLineArgs, &lib,NULL, + iMinHeapSize,iMaxHeapSize,EOwnerProcess); + lib.Close(); // if successful, server thread has handle to library now +#else + RProcess server; + TInt error = server.Create(newname, *iCmdLineArgs); +#endif + if( error != KErrNone) + { + After(KRetryWait); + return; + } + server.Resume(); + server.Close(); + } + break; + default: + iState = EAppFailed; + Next(); + } + + if (iMonitoring) + { + CThreadWatcher *threadWatcher=NULL; + TRAPD(err, threadWatcher = CThreadWatcher::NewL(iAppType, threadId, newname, iStarter, iAppUid, iViewless)); + if (err == KErrNone) //ignore errors + iQue->AddLast(*threadWatcher); + } + iState = EAppStarted; + Next(); + } + +void CAppStarter::Done(TBool aSuccess) + { + if(iSemaphore) + { + iStarter->Done(aSuccess); + } + delete this; + } + +void CAppStarter::Next() + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + } + +void CAppStarter::TryStartViewlessAppL(TApaAppInfo aInfo, TThreadId aThreadId) + { + CApaCommandLine* cmdLine=CApaCommandLine::NewLC(); + cmdLine->SetLibraryNameL(aInfo.iFullName); + cmdLine->SetCommandL(EApaCommandRunWithoutViews); + User::LeaveIfError(iSession.StartApp(*cmdLine, aThreadId)); + CleanupStack::PopAndDestroy(); // cmdLine + }