installationservices/swi/test/tasynccancel/asyncc.cpp
changeset 0 ba25891c3a9e
--- /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