diff -r 000000000000 -r ba25891c3a9e installationservices/swi/test/tasynccancel/asyncc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/swi/test/tasynccancel/asyncc.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,265 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#include "asyncc.h" +#include "asynccancelstep.h" + + + +// REComSession::FinalClose() needs to be run in order for a memory leak +// not to occur if using logo in the sis file to be installed. +// This shouldn't be the case since the test is never using ECom +// explicitly, meaning that it should be dealt with within the +// installation source itself. The behaviour isn't related to cancellation +// since it occurs when installation isn't cancelled at all +#include + + +extern CConsoleBase* gConsole; // write all your messages to this + + +// Try uninstalling a program with the given UID +// If the program is detected to be installed than cancellation failed => return error +TInt TryUninstall(TUid aUid) + { + CUIScriptAdaptor* ui = CUIScriptAdaptor::NewLC(); + CInstallPrefs* prefs = CInstallPrefs::NewLC(); + + TInt err = Swi::Launcher::Uninstall(*ui, aUid); + + CleanupStack::PopAndDestroy(prefs); + CleanupStack::PopAndDestroy(ui); + + // program not installed => cancelled correctly + if (err==KErrNotFound) + { + err=0; + } + else + { + err=1; + } + + return err; + } + + + + +TInt CAsyncCancelStep::DoTestL(TInt aWhenToCancelLow, TInt aWhenToCancelHigh, TInt aHowManyCancelations, TInt aMinWhenToCancelInc, + const TPtrC& aSisToInstall, TUid aUid, + CInstallPrefs* aPrefs) + { + gConsole=Console::NewL(KTxtExampleCode,TSize(KConsFullScreen,KConsFullScreen)); + CleanupStack::PushL(gConsole); + + + + MY_INFO_PRINTF1( _L("Installing sis file: ") ); + MY_INFO_PRINTF1( aSisToInstall ); + MY_INFO_PRINTF1( _L("\n") ); + + + CActiveScheduler* scheduler=new(ELeave) CActiveScheduler; + CActiveScheduler::Install(scheduler); + + + CCancelTimer* CancelTimer = CCancelTimer::NewL(aPrefs); + + TInt err=0; + + // Run the installation for the first time (without cancelling) + // to see how long it takes + TInt firstRun=1; + TInt whenToCancel=100000000; + + // This initialisation doesn't make any difference since the variable + // is initialised later. But it removes compiler warnings + TInt whenToCancelInc=1; + + + + if (aWhenToCancelLow==0) + { + aWhenToCancelLow=1; // impossible to cancel at 0 + } + + + // Uninstall if already installed + err=TryUninstall( aUid ); + err=0; // ignore the error + + + do + { + CleanupStack::PushL(CancelTimer); + // Set up installation + CancelTimer->StartL(aSisToInstall,whenToCancel,firstRun); + CleanupStack::Pop(CancelTimer); + + // it is useful to run the complete installation twice + // since when OCSP checking is enabled the first installation + // takes a lot more time to execute than the later ones + if (firstRun==1) + { + MY_INFO_PRINTF1(_L("Running a complete installation (first time) : ")); + } + else if (firstRun==2) + { + MY_INFO_PRINTF1(_L("Running a complete installation (second time): ")); + } + else + { + MY_INFO_PRINTF2(_L("Running installation, cancelling at %d microseconds: "),whenToCancel); + } + + // Start installation process + scheduler->Start(); + // Test ended => Deque the cancel timer + CancelTimer->Deque(); + + + MY_INFO_PRINTF2(_L("\tiStatus: %d\t"),CancelTimer->InstallerStatus()); + + + if (firstRun>0) + { + MY_INFO_PRINTF2(_L("%d microseconds\n"),CancelTimer->Time()); + + if (CancelTimer->CancelationSuccess()!=1) + { + MY_ERR_PRINTF2(_L("<<< FAILED >>> with %d error code\n"),CancelTimer->CancelationSuccess()); + break; + } + + // Determine at what intervals the cancellation should be performed + // in order to achieve the wanted number of cancellations + if (aWhenToCancelHigh>CancelTimer->Time()) + { + aWhenToCancelHigh=CancelTimer->Time(); + } + whenToCancelInc= (aWhenToCancelHigh-aWhenToCancelLow)/aHowManyCancelations; + if (whenToCancelIncFinishedInstallation()) + { + err=TryUninstall( aUid ); + } + + if (CancelTimer->CancelationSuccess()) + { + MY_INFO_PRINTF1(_L("OK\n")); + } + else + { + MY_ERR_PRINTF1(_L("\t<<< FAILED >>>\n")); + } + + if ( + CancelTimer->CancelationSuccess()!=1 || + CancelTimer->FinishedInstallation() || + whenToCancel>aWhenToCancelHigh + ) + { + break; + } + + } + + + if (firstRun==1) + { + firstRun=2; + } + else + { + firstRun=0; + } + + } while (1); + + + + err=0; + if (CancelTimer->CancelationSuccess()!=1) + { + err=1; + } + else + { + err=0; + } + + + + + // if a delay is needed, edit this code + { + CDelayTimer* DelayTimer=new(ELeave) CDelayTimer; + DelayTimer->ConstructL(); + CActiveScheduler::Add(DelayTimer); + DelayTimer->After(TTimeIntervalMicroSeconds32(1)); + CActiveScheduler::Start(); + delete DelayTimer; + } + + + + // clean-up + delete scheduler; + delete CancelTimer; + + if (err) + { + MY_ERR_PRINTF1(_L("\n\n\tAt least one test <<< FAILED >>>\n")); + } + else + { + MY_INFO_PRINTF1(_L("\n\n\tAll tests PASSED\n")); + } + + MY_INFO_PRINTF1(_L("\tCancelTest compleated execution\n")) ; +#ifdef WAITFORINPUTATEND + MY_INFO_PRINTF1(KTxtPressAnyKey); + gConsole->Getch(); // get and ignore character +#endif + CleanupStack::PopAndDestroy(gConsole); // close gConsole + + + // for explanation see the top of this file, at #include + REComSession::FinalClose(); + // + + return err; + } + + +// End of file