appfw/apparchitecture/tef/t_drivenotification.cpp
author William Roberts <williamr@symbian.org>
Fri, 23 Apr 2010 14:37:17 +0100
branchRCL_3
changeset 22 c82a39b81a38
parent 0 2e3d3ce01487
child 29 6a787171e1de
permissions -rw-r--r--
Rework addition of Symbian splash screen to reduce the source impact (uses SVG from Bug 2414) Notes: by using the OPTION SOURCEDIR parameter in the mifconv extension instructions, I can arrange to use the same source file name in sfimage, without having to export over the original Nokia file. This means that the name inside splashscreen.mbg is the same, which removes the need for the conditional compilation in SplashScreen.cpp, and gets rid of sf_splashscreen.mmp.

// Copyright (c) 2007-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:
// Only in Armv5 platform,
// C: Drive is set to be monitored using KApaDrivesToMonitor. The value of 
// KApaDrivesToMonitor is set to 4. It is computed in the following way.
// ZY XWVU TSRQ PONM LKJI HGFE DCBA
// 00 0000 0000 0000 0000 0000 0100. 
// If the value is Set then the corresponding drive has to be monitored.
// 
//

/**
 @file
 @test
 @internalComponent - Internal Symbian test code
*/

#include <e32test.h>
#include "appfwk_test_utils.h"
#include "t_drivenotification.h"

_LIT(KResourceFileSourceZ, "z:\\system\\data\\tnotifydrivesapp_reg.rsc");

void CDriveTestObserver::HandleAppListEvent(TInt /*aEvent*/)
	{
	iNotified++;
	if (iNotifier)
		iNotifier->Cancel();
	CActiveScheduler::Stop();
	}

CT_DriveNotificationStep::~CT_DriveNotificationStep()
	{	
	}

CT_DriveNotificationStep::CT_DriveNotificationStep()
	{
	// Call base class method to set up the human readable name for logging
	SetTestStepName(KT_DriveNotificationStep);
	}
	
/**
   @SYMTestCaseID	APPFWK-APPARC-0083
  
   @SYMCR 			CR1035
  
   @SYMTestCaseDesc Test for the drive's notification.
   
   @SYMTestPriority High 
  
   @SYMTestStatus 	Implemented
   
   @SYMTestActions 	In armv5 platform, the patchable constant KApaDrivesToMonitor is set to monitor C: drive. 
   Hence the notifications from other drives are ignored. The test copies the tnotifydrivesapp_reg.rsc to either 
   D: or E: drive and also to C:. There will be no notification from D: or E: drives and the applist wont be 
   updated whereas from C: notifications will be issued and applist will be updated.
   In Winscw platform, all the drives will be monitored by default and notifications will be issued when the test
   copies tnotifydrivesapp_reg.rsc to C: drive and W: drive and the applist will be updated.
   
   @SYMTestExpectedResults The app is not added to the applist when no notification is issued and applist is 
   updated when notifications are issued.
*/    
void CT_DriveNotificationStep::TestDrivesNotificationL()
	{
	INFO_PRINTF1(_L("Start TestDriveNotification()"));
	
	TApaAppInfo appInfo;
	TUid appUid = {0xA0003376};
	RApaLsSession theLs;
	User::LeaveIfError(theLs.Connect());
	CleanupClosePushL(theLs);
	
	// Wait for applist to be updated.... 
	RPointerArray<TDesC> dummy;
	User::LeaveIfError(theLs.ForceRegistration(dummy));
	
	//Check whether app is not present in the applist
	TInt ret = theLs.GetAppInfo(appInfo,appUid);
	INFO_PRINTF3(_L(" Expected value is %d, Call to GetAppInfo returned : %d  "), KErrNotFound, ret);
	TEST(ret==KErrNotFound);
	
	//Copy the registration file to C: drive.
	CopyRegFileL(EDriveC);
	
	CDriveTestObserver* obs = new(ELeave) CDriveTestObserver();
	CleanupStack::PushL(obs);
	CApaAppListNotifier* notif = CApaAppListNotifier::NewL(obs, CActive::EPriorityHigh);
	CleanupStack::PushL(notif);
	
	obs->iNotifier = notif;
		
	CActiveScheduler::Start();
	//Since c:\\private\\10003a3f\\Import\\apps\\ path is Monitored, a notification is issued and applist is updated.
	TEST(obs->iNotified > 0);	
	INFO_PRINTF2(_L("Received %d notifications"),obs->iNotified);
	
	//Check whether applist is updated and app is present in the applist.
	ret = theLs.GetAppInfo(appInfo,appUid);
	INFO_PRINTF3(_L(" Expected value is %d, Call to GetAppInfo returned : %d  "), KErrNone, ret);
	TEST(ret==KErrNone);
	
	//Deleting the rsc file that is present in c:\\private\\10003a3f\\Import\\apps\\ path.
	DeleteRegFileL(EDriveC);
	
	// Wait for applist to be updated.... 
	User::LeaveIfError(theLs.ForceRegistration(dummy));
	
	//Check whether applist is updated and app is absent in the applist.
	ret = theLs.GetAppInfo(appInfo,appUid);
	INFO_PRINTF3(_L(" Expected value is %d, Call to GetAppInfo returned : %d  "), KErrNotFound, ret);
	TEST(ret==KErrNotFound);
		
	//Armv5 platform, GetMMCDriveL() returns either the D: (in case of NAND rom) or E: (in case of Normal rom).
	//Winscw platform, GetMMCDriveL() returns W:.
	TDriveNumber drive = GetMMCDriveL();
	
	//Copy the registration file to drive specified.
	CopyRegFileL(drive);
	
	// Wait for applist to be updated.... 
	User::LeaveIfError(theLs.ForceRegistration(dummy));
	
	//Check whether applist is updated and app is present in the applist.
#ifdef __EABI__
	ret = theLs.GetAppInfo(appInfo,appUid);
	TEST (ret == KErrNotFound);
	INFO_PRINTF3(_L(" Expected value is %d, Call to GetAppInfo returned : %d  "), KErrNotFound, ret);
	//Deleting the rsc file.
	DeleteRegFileL(drive);
#else	
	ret = theLs.GetAppInfo(appInfo,appUid);
	TEST(ret==KErrNone);
	INFO_PRINTF3(_L(" Expected value is %d, Call to GetAppInfo returned : %d  "),KErrNone, ret);
	//Deleting the rsc file.
	DeleteRegFileL(drive);
#endif
	CleanupStack::PopAndDestroy(3, &theLs);
	
	INFO_PRINTF1(_L("End TestDrivesNotificationL()"));
	}
/*
Copy the tnotifydrivesapp_reg.rsc file from source to destination. 
In Winscw platform, the registration file is copied to C: and W: drive.
In Armv5 platform, the registration file is copied to C: and D: or E: drive. 
*/

void CT_DriveNotificationStep::CopyRegFileL(TDriveNumber aDriveNumber)
	{
	_LIT(KResourceFileTarget, ":\\private\\10003a3f\\Import\\apps\\tnotifydrivesapp_reg.rsc");	
	_LIT(KResourceAppFolder, ":\\private\\10003a3f\\Import\\apps\\");
	RBuf tempPathToBeCopied, tempFolderToBeCreated;
	RFs fs;
	TChar driveLetter;
	CleanupClosePushL(fs);
	User::LeaveIfError(fs.Connect());
	TInt maxSizeofFileName = KResourceFileTarget().Length() + 1;
	TInt maxSizeofFolderName = KResourceAppFolder().Length() + 1;
	tempPathToBeCopied.CreateL(maxSizeofFileName);
	CleanupClosePushL(tempPathToBeCopied);
	tempFolderToBeCreated.CreateL(maxSizeofFolderName);
	CleanupClosePushL(tempFolderToBeCreated);
	fs.DriveToChar(aDriveNumber,driveLetter);
	tempPathToBeCopied.Append(driveLetter);
	tempPathToBeCopied.Append(KResourceFileTarget);
	tempFolderToBeCreated.Append(driveLetter);
	tempFolderToBeCreated.Append(KResourceAppFolder);
	RSmlTestUtils smlServer;
	CleanupClosePushL(smlServer);
	TInt ret = smlServer.Connect();
	TEST(ret == KErrNone);
	ret = smlServer.CreateDirectoryL(tempFolderToBeCreated);
	if (ret != KErrNone && ret != KErrAlreadyExists)
		{
		User::LeaveIfError(ret);
		}
	ret = smlServer.CopyFileL(KResourceFileSourceZ, tempPathToBeCopied);
	TEST(ret == KErrNone);
	INFO_PRINTF2(_L("Copied Registration file. Finished with the value : %d "), ret);
	CleanupStack::PopAndDestroy(4, &fs);
	}



void CT_DriveNotificationStep::DeleteRegFileL(TDriveNumber aDriveNumber)
	{
	_LIT(KResourceFileTarget, ":\\private\\10003a3f\\Import\\apps\\tnotifydrivesapp_reg.rsc");	
	RBuf tempPathToBeDeleted;
	RFs fs;
	TChar driveLetter;
	CleanupClosePushL(fs);
	User::LeaveIfError(fs.Connect());
	TInt maxSizeofFileName = KResourceFileTarget().Length() + 1;
	tempPathToBeDeleted.CreateL(maxSizeofFileName);
	CleanupClosePushL(tempPathToBeDeleted);
	fs.DriveToChar(aDriveNumber,driveLetter);
	tempPathToBeDeleted.Append(driveLetter);
	tempPathToBeDeleted.Append(KResourceFileTarget);
	RSmlTestUtils smlServer;
	CleanupClosePushL(smlServer);
	TInt ret = smlServer.Connect();
	TEST(ret == KErrNone);
	ret = smlServer.SetReadOnly(tempPathToBeDeleted, 0)	;
	TEST(ret == KErrNone);
	//delete the file
	ret = smlServer.DeleteFileL(tempPathToBeDeleted);	
	TEST(ret == KErrNone);
	INFO_PRINTF2(_L("Deleted Registration file. Finished with value : %d"), ret);	
	CleanupStack::PopAndDestroy(3,&fs);
	}
	

TDriveNumber CT_DriveNotificationStep::GetMMCDriveL()
	{
	TDriveNumber drive = EDriveW;	
#ifdef __EABI__
	RFs	fs;
 	User::LeaveIfError(fs.Connect());
	// The removable media is expected at D: on NAND ROM and at E: on normal ROMs.
	//The following code works on techview but not guaranteed to work on all platforms. 
	TDriveInfo driveInfo;
	TInt err = fs.Drive(driveInfo, EDriveD);
	if(err == KErrNone && ((driveInfo.iDriveAtt & KDriveAttRemovable) != 0))
		{
	 	 // Use drive D
	 	drive = EDriveD;
	 	}
	 else
	 	{
		err = fs.Drive(driveInfo, EDriveE);
		if(err == KErrNone && ((driveInfo.iDriveAtt & KDriveAttRemovable) != 0))
			{
		 	// Use drive E
		 	drive = EDriveE;
		 	}
		}
	fs.Close();
#else
	drive = EDriveW;
#endif	
	return drive;
	}


TVerdict CT_DriveNotificationStep::doTestStepL()
	{
	INFO_PRINTF1(_L("Testing the Notifications ... T_DriveNotification"));
	
	// start an active scheduler
	iScheduler=new(ELeave) CActiveScheduler();
	CActiveScheduler::Install(iScheduler);
	
	// run the testcode (inside an alloc heaven harness)
 	__UHEAP_MARK;
 	 	
 	TRAPD(ret,TestDrivesNotificationL());
	TEST(ret==KErrNone);
	INFO_PRINTF2(_L("TestDrivesNotificationL finished with code '%d'\n"), ret);
 	
  	__UHEAP_MARKEND;

	INFO_PRINTF1(_L("T_DriveNotification Completed."));
	return TestStepResult();
	}