--- /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 <ecom/ecom.h>
+
+
+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 (whenToCancelInc<aMinWhenToCancelInc)
+ {
+ whenToCancelInc=aMinWhenToCancelInc;
+ }
+ whenToCancel=aWhenToCancelLow;
+
+ // Uninstall
+ err=TryUninstall( aUid );
+ err=0;
+ }
+ else
+ {
+ MY_INFO_PRINTF1(_L("Completed: "));
+ whenToCancel+= whenToCancelInc;
+
+ if (CancelTimer->FinishedInstallation())
+ {
+ 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 <ecom/ecom.h>
+ REComSession::FinalClose();
+ //
+
+ return err;
+ }
+
+
+// End of file