diff -r 08008ce8a6df -r bde600d88860 messagingfw/msgtest/tools/autorun/src/AUTORUN.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgtest/tools/autorun/src/AUTORUN.CPP Fri Jun 04 10:32:16 2010 +0100 @@ -0,0 +1,148 @@ +// Copyright (c) 2000-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 +#include + +#include + +_LIT(KMsvServerPattern, "!MsvServer*"); +RTest test(_L("AutoRun")); + +// + + +LOCAL_C void WaitForServerClose() + { + // Wait 10 seconds for server to exit + TInt count = 10; + while(count--) + { + TFullName name; + TFindProcess find(KMsvServerPattern); + if (find.Next(name) != KErrNone) + return; + else if (count <= 0) + { + RProcess process; + process.Open(find); + process.Terminate(KErrGeneral); + process.Close(); + } + User::After(1000000); + } + } + +LOCAL_C void LaunchAndWaitL(const TDesC& file) + { + RProcess p; + test(p.Create(file, KNullDesC) == KErrNone); + + TRequestStatus status = KRequestPending; + p.Logon(status); + p.Resume(); + User::WaitForRequest(status); + p.Close(); + + WaitForServerClose(); + } + +LOCAL_C void ScanDirL(RFs& aFs, const TDesC& aDir) + { + User::After(1000000); + + TParse parse; + parse.Set(_L("t_*.exe"), &aDir, NULL); + TPtrC spec(parse.FullName()); + + test.Start(parse.DriveAndPath()); + TFindFile find(aFs); + CDir* dir; + + if (!find.FindWildByPath(parse.FullName(), NULL, dir)) + { + CleanupStack::PushL(dir); + + for(int i = 0; i < dir->Count(); i++) + { + parse.Set((*dir)[i].iName, &spec, NULL); + + if (i == 0) + test.Start(parse.FullName()); + else + test.Next(parse.FullName()); + + LaunchAndWaitL(parse.FullName()); + } + + CleanupStack::PopAndDestroy(); // dir + } + test.End(); + } + +LOCAL_C void ScanStartL(RFs aFs, const TDesC& aPath) + { + // Scan the top-level directory for test executables + ScanDirL(aFs, aPath); + + // Setup directory scan + CDirScan* scan = CDirScan::NewLC(aFs); + scan->SetScanDataL(aPath, KEntryAttDir|KEntryAttMatchExclusive, ESortNone, CDirScan::EScanUpTree); + + // Iterate through all the directories + FOREVER + { + // Get next directory list + CDir* dir = NULL; + TRAPD(error, scan->NextL(dir)); + if (error || !dir) + break; + + delete dir; + ScanDirL(aFs, scan->FullPath()); + }; + CleanupStack::PopAndDestroy(); // scan + } + +LOCAL_C void doMainL() + { + CActiveScheduler::Install(new(ELeave)CActiveScheduler); + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + ScanStartL(fs, RProcess().FileName()); + CleanupStack::PopAndDestroy(); // fs + + delete CActiveScheduler::Current(); + } + + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + __ASSERT_ALWAYS(cleanup, User::Invariant()); + TRAPD(ret,doMainL()); + test(ret == KErrNone); + test.Close(); + delete cleanup; + __UHEAP_MARKEND; + return(KErrNone); + } + + +