testapps/rschandler/Common/src/ResourceHandler_Dialogs.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:30:50 +0100
branchRCL_3
changeset 11 493058e57c8c
parent 0 9736f095102e
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201035 Kit: 201035

// 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 "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 <e32svr.h>
#include "ResourceHandler.h"

//
// Thread Dialog
//

CThreadNumberDialog::CThreadNumberDialog()
	{
	}

void CThreadNumberDialog::PreLayoutDynInitL()
	{	
	// to start use the thread ID of this thread
	iThreadID = RThread().Id();
	UpdateDialogData();
	}

void CThreadNumberDialog::PostLayoutDynInitL()
	{	

	}

void CThreadNumberDialog::UpdateDialogData()
	{
	if (iThreadID > 0) UpdateDialogDataReal(); // Real thread
	else UpdateDialogDataAll(); // 0 for all unprotected threads 
	}

void CThreadNumberDialog::UpdateDialogDataAll()
//update dialog - set for all threads
	{
	// match controls and set values
	CXIKNUMBEREDITOR *thisNumberEditor;
	thisNumberEditor = STATIC_CAST(CXIKNUMBEREDITOR*, Control(EThreadNumberCtl));
	thisNumberEditor->SETNUMBERVALUEL(0);

	CEikCheckBox *sysCheckBox, *protCheckBox;
	sysCheckBox = STATIC_CAST(CEikCheckBox*,Control(EThreadSystemCtl));
	protCheckBox = STATIC_CAST(CEikCheckBox*,Control(EThreadProtectedCtl));

	CEikCommandButton *killBut, *okBut, *setBut;
	killBut = STATIC_CAST(CEikCommandButton*, ButtonGroupContainer().CommandButtonOrNull(EThreadKillButtonCtl));
	okBut = STATIC_CAST(CEikCommandButton*, ButtonGroupContainer().CommandButtonOrNull(EEikBidOk));
	setBut = STATIC_CAST(CEikCommandButton*, ButtonGroupContainer().CommandButtonOrNull(EThreadSetButtonCtl));
	CEikLabel *priorityDialogPrompt, *priorityNumberLabel;
	priorityNumberLabel = STATIC_CAST(CEikLabel*, Control(EThreadPriorityText));
	priorityDialogPrompt = STATIC_CAST(CEikLabel*, Control(EThreadPriorityPrompt));
	
	priorityDialogPrompt->SetTextL(_L("Cannot set priority for all threads."));
	
#ifdef UIQ
	CEikLabel *theThreadLabel, *theProcessLabel;
	theThreadLabel = STATIC_CAST(CEikLabel*, Control(EThreadLabelThreadName));
	theProcessLabel = STATIC_CAST(CEikLabel*, Control(EThreadLabelProcessName));
	theProcessLabel->SetTextL(_L("Various"));
	theThreadLabel->SetTextL(_L("All unprotected"));
#endif
#ifdef TV
	CEikLabel *threadAndProcessLabel;
	threadAndProcessLabel = STATIC_CAST(CEikLabel*, Control(EThreadLabelThreadAndProcessName));
	threadAndProcessLabel->SetTextL(_L("All threads/processes"));
#endif
	CEikChoiceList *prioritySelector;
	prioritySelector = STATIC_CAST(CEikChoiceList*, Control(EThreadPriorityButtonCtl));


	// Change the dimming on the component controls as appropriate for all threads
	protCheckBox->SetDimmed(ETrue);
	sysCheckBox->SetDimmed(EFalse);

	prioritySelector->MakeVisible(EFalse);

	priorityNumberLabel->MakeVisible(EFalse);

	killBut->SetDimmed(ETrue);
	okBut->SetDimmed(EFalse);
	setBut->SetDimmed(EFalse);
	DrawNow();

	}

//updates dialog depending on iThreadID
void CThreadNumberDialog::UpdateDialogDataReal()
	{
	// match controls
	CXIKNUMBEREDITOR *thisNumberEditor;
	thisNumberEditor = STATIC_CAST(CXIKNUMBEREDITOR*, Control(EThreadNumberCtl));
	thisNumberEditor->SETNUMBERVALUEL(0);

	CEikCheckBox *sysCheckBox, *protCheckBox;
	sysCheckBox = STATIC_CAST(CEikCheckBox*,Control(EThreadSystemCtl));
	protCheckBox = STATIC_CAST(CEikCheckBox*,Control(EThreadProtectedCtl));

	CEikCommandButton *killBut, *okBut, *setBut;
	okBut = STATIC_CAST(CEikCommandButton*, ButtonGroupContainer().CommandButtonOrNull(EEikBidOk));
	setBut = STATIC_CAST(CEikCommandButton*, ButtonGroupContainer().CommandButtonOrNull(EThreadSetButtonCtl));
	killBut = STATIC_CAST(CEikCommandButton*, ButtonGroupContainer().CommandButtonOrNull(EThreadKillButtonCtl));
		
#ifdef UIQ
	CEikLabel *theThreadLabel, *theProcessLabel;
	theThreadLabel = STATIC_CAST(CEikLabel*, Control(EThreadLabelThreadName));
	theProcessLabel = STATIC_CAST(CEikLabel*, Control(EThreadLabelProcessName));
#endif
#ifdef TV
	CEikLabel *threadAndProcessLabel;
	threadAndProcessLabel = STATIC_CAST(CEikLabel*, Control(EThreadLabelThreadAndProcessName));
#endif	

	CEikChoiceList *priorityOpButs;
	priorityOpButs = STATIC_CAST(CEikChoiceList*, Control(EThreadPriorityButtonCtl));

	//
	//Update dialog info with thread details
	//

	RThread thread;
	TInt err = KErrNone;
	
	err = thread.Open(iThreadID);
		
	if (err!=KErrNone)
		{ 
		thread.Close();
		TBuf<70> errorMessage(_L("Cannot get thread number "));
		errorMessage.AppendNum(iThreadID);
		errorMessage.Append(_L(". Thread::Open()"));
		DisplayError(errorMessage, err);
		thread.Open(RThread().Id()); // Get this thread
		}

	thisNumberEditor->SETNUMBERVALUEL(thread.Id());

#ifdef UIQ
	theThreadLabel->SetTextL(thread.Name()); 
#endif
#ifdef TV
	TBuf<150> lProcessAndThread(thread.Name());
#endif

	RProcess process;
	thread.Process(process);
#ifdef UIQ
	theProcessLabel->SetTextL(process.Name());
#endif
#ifdef TV
	lProcessAndThread.Append(_L("/"));
	lProcessAndThread.Append(process.Name());
	threadAndProcessLabel->SetTextL(lProcessAndThread); 
#endif
	process.Close();
	
	CEikLabel *priorityDialogPrompt, *priorityNumberLabel;
	
	priorityDialogPrompt = STATIC_CAST(CEikLabel*, Control(EThreadPriorityPrompt));	
	if ( iThreadID == RThread().Id()) priorityDialogPrompt->SetTextL(_L("The priority of the current thread cannot be reset from within this application."));
	else priorityDialogPrompt->SetTextL(_L("Set the priority."));
	
	priorityNumberLabel = STATIC_CAST(CEikLabel*, Control(EThreadPriorityText));
	TBuf<30> priorityText(_L("Priority Value:  "));
	TBuf<4> priorityNumber;
	
	priorityNumber.Format(KFormatDec,thread.Priority());
	priorityText.Append(priorityNumber);
	priorityNumberLabel->SetTextL(priorityText);

	TThreadPriority lThreadPriority = thread.Priority();
	TInt lThreadPrioritySetting;
	switch (lThreadPriority)
	{
		case(EPriorityAbsoluteHigh): lThreadPrioritySetting = EThreadP500_AbsoluteHigh; break;
		case(EPriorityAbsoluteForeground): lThreadPrioritySetting = EThreadP400_AbsoluteForeground; break;
		case(EPriorityAbsoluteBackground): lThreadPrioritySetting = EThreadP300_AbsoluteBackground; break;
		case(EPriorityAbsoluteLow): lThreadPrioritySetting = EThreadP200_AbsoluteLow; break;
		case(EPriorityAbsoluteVeryLow): lThreadPrioritySetting = EThreadP100_AbsoluteVeryLow; break;
		case(EPriorityRealTime): lThreadPrioritySetting = EThreadP30_RealTime; break;
		case(EPriorityMuchMore): lThreadPrioritySetting = EThreadP20_MuchMore; break;
		case(EPriorityMore): lThreadPrioritySetting = EThreadP10_More; break;
		case(EPriorityNormal): lThreadPrioritySetting = EThreadP0_Normal; break;
		case(EPriorityLess): lThreadPrioritySetting = EThreadPm10_Less; break;
		case(EPriorityMuchLess): lThreadPrioritySetting = EThreadPm20_MuchLess; break;
		case(EPriorityNull): lThreadPrioritySetting = EThreadPm30_Null; break;
		default: lThreadPrioritySetting = EThreadP_NotStandard; break;
	}

	priorityOpButs->SetCurrentItem(lThreadPrioritySetting);

	sysCheckBox->SetState(CEikButtonBase::EIndeterminate);
	protCheckBox->SetState(CEikButtonBase::EIndeterminate);

	// Change the dimming on the component controls depending on the thread
	sysCheckBox->SetDimmed(EFalse);

	if ( iThreadID == RThread().Id()) priorityOpButs->SetDimmed(ETrue);
	else priorityOpButs->SetDimmed(EFalse);

	killBut->SetDimmed(EFalse);
	okBut->SetDimmed(EFalse);
	setBut->SetDimmed(EFalse);
	
	if (iThreadID == RThread().Id())
		{
		// can change the protection on this thread
		protCheckBox->SetDimmed(EFalse);
		}
	else
		{
		// cannot change protection
		protCheckBox->SetDimmed(ETrue);
		if (true)	// If we are in secure then we ensure that the
					// user can not change anything.
			{
			// cannot change anything
			sysCheckBox->SetDimmed(ETrue);
			priorityOpButs->SetDimmed(ETrue);
			killBut->SetDimmed(ETrue);
			okBut->SetDimmed(ETrue);
			setBut->SetDimmed(ETrue);
			}

		}

	thread.Close();
	DrawNow();

	}

void CThreadNumberDialog::UpdatePriorityText()
//updates the priority number value to correspond to the priority option selected
	{	

	}

void CThreadNumberDialog::HandleControlStateChangeL(TInt aControlId)
	{
	if (aControlId == EThreadGetButtonCtl)
		{
		CXIKNUMBEREDITOR *thisNumberEditor; 
		thisNumberEditor = STATIC_CAST(CXIKNUMBEREDITOR*, Control(EThreadNumberCtl));
		iThreadID = (TThreadId)thisNumberEditor->NUMBERVALUE();
		// re-evaluate everything
		UpdateDialogData(); 

		// re-draw
		PageChangedL(EThreadPageGeneral); 
		PageChangedL(EThreadPagePriority);
		PageChangedL(EThreadPageOther);
		DrawNow();
		}
	}

void CThreadNumberDialog::SetThread()
	{
	//change thread parameters
		if (iThreadID > 0)
			{
			// only get here if thread is not protected		


			RThread thread;
			TInt err = thread.Open(iThreadID);

			if (err == KErrNone)
				{
				// This is the current thread
				if ( iThreadID == RThread().Id())
					{
					}
				
					

				CEikChoiceList *opButs;
				opButs = STATIC_CAST(CEikChoiceList*, Control(EThreadPriorityButtonCtl));

				TThreadPriority threadPrioritySet = EPriorityNull;
				TInt currentItem = opButs->CurrentItem();
				
				switch (currentItem) 
					{
					case (EThreadP500_AbsoluteHigh): threadPrioritySet=EPriorityAbsoluteHigh; break;
					case (EThreadP400_AbsoluteForeground): threadPrioritySet=EPriorityAbsoluteForeground; break;
					case (EThreadP300_AbsoluteBackground): threadPrioritySet=EPriorityAbsoluteBackground; break;
					case (EThreadP200_AbsoluteLow): threadPrioritySet=EPriorityAbsoluteLow; break;
					case (EThreadP100_AbsoluteVeryLow): threadPrioritySet=EPriorityAbsoluteVeryLow; break;
					case (EThreadP30_RealTime): threadPrioritySet=EPriorityRealTime; break;
					case (EThreadP20_MuchMore): threadPrioritySet=EPriorityMuchMore; break;
					case (EThreadP10_More): threadPrioritySet=EPriorityMore; break;
					case (EThreadP0_Normal): threadPrioritySet=EPriorityNormal; break;
					case (EThreadPm10_Less): threadPrioritySet=EPriorityLess; break;
					case (EThreadPm20_MuchLess): threadPrioritySet=EPriorityMuchLess; break;
					case (EThreadPm30_Null): threadPrioritySet=EPriorityNull; 
					iEikonEnv->InfoWinL(_L("Error"), _L("Cannot change thread priority to Null"));
					break;
					default: iEikonEnv->InfoWinL(_L("Error"), _L("Invalid priority: cannot change thread priority to Not Standard"));	
						
					};

				if (threadPrioritySet != EPriorityNull) 
				{
					thread.SetPriority(threadPrioritySet);
						
					TThreadPriority threadPriorityGot = thread.Priority();
					if (threadPrioritySet!=threadPriorityGot)
						{		
						iEikonEnv->InfoWinL(_L("Error"), _L("Thread priority not set: RThread::SetPriority() unsuccessful!"));	
						}
					thread.Close();
					}
				}
			}
		else //all threads selected - only changes system setting
			{

			TName prefix(KAsterisk);
			TFindThread findHb;
			findHb.Find(prefix);
			TFullName name; // this is a TBuf
			RThread thread;

			while (findHb.Next(name)==KErrNone)
				{
				TInt err = thread.Open(name);
				if (err != KErrNone)
					{	
					TBuf<70> errorMessage(_L("Cannot get thread "));
					errorMessage.Append(name);
					errorMessage.Append(_L(". RThread::Open()"));
					DisplayError(errorMessage, err);
					}	
					
				if (err == KErrNone)
					{


					thread.Close();
					}
				}
			}	
	}

TBool CThreadNumberDialog::OkToExitL(TInt aButtonId)
	{
	if (aButtonId == EEikBidCancel) 
		{
		return ETrue;
		}
	else if (aButtonId == EThreadSetButtonCtl)
		{
		SetThread();
		UpdateDialogData();
		iEikonEnv->InfoMsg(_L("Attribute(s) set as displayed"));
		return EFalse;
		}
	else if (aButtonId == EEikBidOk)
		{
		SetThread();
		return ETrue;
	}
	else if (aButtonId == EThreadKillButtonCtl)
		{
		RThread thread;
		TInt err = thread.Open(iThreadID);
		if (err == KErrNone)
			{
			thread.Kill(KErrNone);
			iEikonEnv->InfoMsg(_L("Thread Killed"));
			}
		else iEikonEnv->InfoWinL(_L("Error"), _L("Attempt to open thread for modification unsuccessful."));
		thread.Close();
		return EFalse;
		}
	return ETrue;
	}

//
//
// Process Dialog
//
//

CProcessNumberDialog::CProcessNumberDialog()
	{
	}

void CProcessNumberDialog::PreLayoutDynInitL()
	{	
	// to start use the thread ID of this Process
	iProcessID = RProcess().Id();
	UpdateDialogData();
	}

void CProcessNumberDialog::PostLayoutDynInitL()
	{	
	}

void CProcessNumberDialog::UpdateDialogData()
//Updates GUI data
	{
	// match the controls
	CXIKNUMBEREDITOR *thisNumberEditor;
	thisNumberEditor = STATIC_CAST(CXIKNUMBEREDITOR*, Control(EProcessNumberCtl));
	CEikLabel *priorityTextLabel;
	priorityTextLabel = STATIC_CAST(CEikLabel*, Control(EProcessPriorityText));

	CEikCheckBox *sysCheckBox, *protCheckBox;
	sysCheckBox = STATIC_CAST(CEikCheckBox*,Control(EProcessSystemCtl));
	protCheckBox = STATIC_CAST(CEikCheckBox*,Control(EProcessProtectedCtl));

	CEikCommandButton *killBut, *okBut, *setBut;
	killBut = STATIC_CAST(CEikCommandButton*, ButtonGroupContainer().CommandButtonOrNull(EProcessKillButtonCtl));
	okBut = STATIC_CAST(CEikCommandButton*, ButtonGroupContainer().CommandButtonOrNull(EEikBidOk));
	setBut = STATIC_CAST(CEikCommandButton*, ButtonGroupContainer().CommandButtonOrNull(EProcessSetButtonCtl));

	CEikLabel *theProcessLabel;
	theProcessLabel = STATIC_CAST(CEikLabel*, Control(EProcessLabelProcessName));

	CEikChoiceList *opButs;
	opButs = STATIC_CAST(CEikChoiceList*, Control(EProcessPriorityButtonCtl));

	//open a process and update GUI data
	RProcess process;
	TInt err = KErrNone;
	
	err = process.Open(iProcessID); // Opens a handle to a process
	
	if (err!=KErrNone)
		{ 
		TBuf<70> errorMessage(_L("Cannot get process number "));
		errorMessage.AppendNum(iProcessID);
		errorMessage.Append(_L(". System error number "));
		errorMessage.AppendNum(err);

		iEikonEnv->InfoWinL(_L("Error"), errorMessage);
		iProcessID = RProcess().Id();
		process.Open(iProcessID); // Opens a handle to this Process
		}

	thisNumberEditor->SETNUMBERVALUEL(process.Id());
	theProcessLabel->SetTextL(process.Name());
	
	TBuf<30> priorityText(_L("Priority Value:  "));
	TBuf<10> priorityNumber;
	priorityNumber.Format(KFormatDec,process.Priority());
	priorityText.Append(priorityNumber);
	priorityTextLabel->SetTextL(priorityText);
	if (process.Priority()==EPriorityLow) opButs->SetCurrentItem(EProcessP150_PriorityLow);
	else if (process.Priority()==EPriorityBackground) opButs->SetCurrentItem(EProcessP250_PriorityBackground);
	else if (process.Priority()==EPriorityForeground) opButs->SetCurrentItem(EProcessP350_PriorityForeground);
	else if (process.Priority()==EPriorityHigh) opButs->SetCurrentItem(EProcessP450_PriorityHigh);
	else if (process.Priority()==EPriorityWindowServer) opButs->SetCurrentItem(EProcessP650_PriorityWindowServer);
	else if (process.Priority()==EPriorityFileServer) opButs->SetCurrentItem(EProcessP750_PriorityFileServer);
	else if (process.Priority()==EPriorityRealTimeServer) opButs->SetCurrentItem(EProcessP850_PriorityRealTimeServer);
	else if (process.Priority()==EPrioritySupervisor) opButs->SetCurrentItem(EProcessP950_PrioritySupervisor);
	else (opButs->SetCurrentItem(EProcessPriorityNotStandard));
	

	sysCheckBox->SetState(CEikButtonBase::EIndeterminate);
	protCheckBox->SetState(CEikButtonBase::EIndeterminate);
 

	// Change the dimming on the component controls depending on the Process
	sysCheckBox->SetDimmed(EFalse);
	opButs->SetDimmed(EFalse);
	#ifdef WINS
	opButs->SetDimmed(ETrue);
	#endif

	killBut->SetDimmed(EFalse);
	okBut->SetDimmed(EFalse);
	setBut->SetDimmed(EFalse);
	if (iProcessID == RProcess().Id())
		{
		// can change the protection on this Process
		protCheckBox->SetDimmed(EFalse);
		}
	else
		{
		// cannot change protection
		protCheckBox->SetDimmed(ETrue);
		if (true)	// If we are in secure then we ensure that the
					// user can not change anything.
			{
			// cannot change anything
			sysCheckBox->SetDimmed(ETrue);
			opButs->SetDimmed(ETrue);
			killBut->SetDimmed(ETrue);
			okBut->SetDimmed(ETrue);
			setBut->SetDimmed(ETrue);
			}
		}
	process.Close(); // Closes the handle
	DrawNow();

	}

void CProcessNumberDialog::SetProcess()
{
		// only get here if Process is not protected		


		RProcess process;
		TInt err = process.Open(iProcessID);

		if (err == KErrNone)
			{
			// This is the current Process
			if ( iProcessID == RProcess().Id())
				{
				}
			
				
			
			CEikChoiceList *opButs;
			TProcessPriority processPrioritySelected = EPriorityLow;

			opButs = STATIC_CAST(CEikChoiceList*, Control(EProcessPriorityButtonCtl));

			TInt currentItem = opButs->CurrentItem();
			TBool validPrioritySelected = ETrue;
				
			switch (currentItem) 
				{
				case (EProcessP150_PriorityLow): processPrioritySelected=EPriorityLow; break;
				case (EProcessP250_PriorityBackground): processPrioritySelected=EPriorityBackground; break;
				case (EProcessP350_PriorityForeground): processPrioritySelected=EPriorityForeground; break;
				case (EProcessP450_PriorityHigh): processPrioritySelected=EPriorityHigh; break;
				case (EProcessP650_PriorityWindowServer): 
				case (EProcessP750_PriorityFileServer): 
				case (EProcessP850_PriorityRealTimeServer): 
				case (EProcessP950_PrioritySupervisor): 
				default: iEikonEnv->InfoWinL(_L("Error"), _L("This is an internal priority and cannot be explicitly set"));
						 validPrioritySelected = EFalse;
						 break;
				}
			if (validPrioritySelected == 1) process.SetPriority(processPrioritySelected);
		
		}
		process.Close();
	}

void CProcessNumberDialog::HandleControlStateChangeL(TInt aControlId)
	{
	if (aControlId == EProcessGetButtonCtl)
		{
		CXIKNUMBEREDITOR *thisNumberEditor; 
		thisNumberEditor = STATIC_CAST(CXIKNUMBEREDITOR*, Control(EProcessNumberCtl));
		iProcessID = (TProcessId)thisNumberEditor->NUMBERVALUE();
		// re-evaluate everything
		UpdateDialogData(); 

		// re-draw
		PageChangedL(EProcessPageGeneral); 
		PageChangedL(EProcessPagePriority);
		PageChangedL(EProcessPageOther);
		DrawNow();
		}
	}

TBool CProcessNumberDialog::OkToExitL(TInt aButtonId)
	{
	if (aButtonId == EEikBidCancel) // do nothing
		{
		return ETrue;
		}
	else if (aButtonId == EProcessSetButtonCtl)
		{
		SetProcess();
		UpdateDialogData();
		iEikonEnv->InfoMsg(_L("Attribute(s) set as displayed"));
		return EFalse;
		}
	else if (aButtonId == EProcessKillButtonCtl) 
		{
		RProcess Process;
		TInt err = Process.Open(iProcessID);
		if (err == KErrNone)
			{
			iEikonEnv->InfoMsg(_L("Killing Process"));
			Process.Kill(KErrNone);
			}
		Process.Close();
		iEikonEnv->InfoMsg(_L("Process killed"));
		return EFalse;
		}

	else if (aButtonId == EEikBidOk)
		{
		SetProcess();
		return ETrue;
		}
	else return ETrue;
	}


//
//
// Debug Dialog
//
//

CDebugDialog::CDebugDialog()
	{
	}

void CDebugDialog::PreLayoutDynInitL()
	{
	GetPortNumber();
	GetKernelOptions();
	}

void CDebugDialog::GetPortNumber()
	{
	//map the control
	CXIKNUMBEREDITOR *thisNumberEditor;
	thisNumberEditor = static_cast<CXIKNUMBEREDITOR*>(Control(EDebugPortCtl));
	//set control value
	TInt debugPort, err;
	err = HAL::Get(HAL::EDebugPort, debugPort);
	if (err == KErrNone)
			{
			thisNumberEditor->SETNUMBERVALUEL(debugPort);
			iCurrentDebugPort = debugPort;
			}
		else
			{
			thisNumberEditor->SETNUMBERVALUEL(-1);
			iCurrentDebugPort = -1;
			}

	}

void CDebugDialog::GetKernelOptions()
	{
	// Kernel debug mask

	TUint32 debugMask = UserSvr::DebugMask();
	//map the controls (check boxes) and set the control values
	
	CEikCheckBox *aCheckBox;
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKHARDWARE));
	aCheckBox->SetState(debugMask & KHARDWARE ? CEikButtonBase::ESet : CEikButtonBase::EClear);

	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKBOOT));
	aCheckBox->SetState(debugMask & KBOOT ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKSERVER));
	aCheckBox->SetState(debugMask & KSERVER ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKMMU));
	aCheckBox->SetState(debugMask & KMMU ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKSEMAPHORE));
	aCheckBox->SetState(debugMask & KSEMAPHORE ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKSCHED));
	aCheckBox->SetState(debugMask & KSCHED ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPROC));
	aCheckBox->SetState(debugMask & KPROC ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKEXEC));
	aCheckBox->SetState(debugMask & KEXEC ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKEXECFAST));
	aCheckBox->SetState(debugMask & KEXECFAST ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKTHREAD));
	aCheckBox->SetState(debugMask & KTHREAD ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKDLL));
	aCheckBox->SetState(debugMask & KDLL ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKLOGON));
	aCheckBox->SetState(debugMask & KLOGON ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPBUS1));
	aCheckBox->SetState(debugMask & KPBUS1 ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPBUS2));
	aCheckBox->SetState(debugMask & KPBUS2 ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPBUSDRV));
	aCheckBox->SetState(debugMask & KPBUSDRV ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPOWER));
	aCheckBox->SetState(debugMask & KPOWER ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKTIMING));
	aCheckBox->SetState(debugMask & KTIMING ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKEVENT));
	aCheckBox->SetState(debugMask & KEVENT ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKMEMTRACE));
	aCheckBox->SetState(debugMask & KMEMTRACE ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKIPC));
	aCheckBox->SetState(debugMask & KIPC ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKDEBUGGER));
	aCheckBox->SetState(debugMask & KDEBUGGER ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKVIDEO));
	aCheckBox->SetState(debugMask & KVIDEO ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKUSB));
	aCheckBox->SetState(debugMask & KUSB ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	
	aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPANIC));
	aCheckBox->SetState(debugMask & KPANIC ? CEikButtonBase::ESet : CEikButtonBase::EClear);
	}

void CDebugDialog::SetDebugOptions()
	{	
		TBuf<800> errorMssg; //to show where updates unsuccessful
		//set new debug port
		CXIKNUMBEREDITOR *thisNumberEditor;
		thisNumberEditor = static_cast<CXIKNUMBEREDITOR*>(Control(EDebugPortCtl));
		TInt newDebugPort = thisNumberEditor->NUMBERVALUE();

		TInt err;
		if (newDebugPort!=-1)
			{
				err = HAL::Set(HAL::EDebugPort, newDebugPort);
				if (err==KErrNone) iCurrentDebugPort = newDebugPort;
				else
					{
					TBuf<3> errorCode;
					errorCode.Format(KFormatDec,err);
					errorMssg.Append(_L("Cannot set port: System error "));
					errorMssg.Append(errorCode);
					errorMssg.Append('\n');
					thisNumberEditor->SETNUMBERVALUEL(iCurrentDebugPort);
					}
			}
		//set new Kernel debug values
		CEikCheckBox *aCheckBox;
		TUint32 debugMask = 0;	
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKHARDWARE));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KHARDWARE;

		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKBOOT));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KBOOT;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKSERVER));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KSERVER;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKMMU));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KMMU;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKSEMAPHORE));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KSEMAPHORE;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKSCHED));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KSCHED;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPROC));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KPROC;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKEXEC));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KEXEC;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKEXECFAST));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KEXECFAST;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKTHREAD));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KTHREAD;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKDLL));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KDLL;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKLOGON));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KLOGON;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPBUS1));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KPBUS1;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPBUS2));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KPBUS2;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPBUSDRV));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KPBUSDRV;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPOWER));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KPOWER;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKTIMING));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KTIMING;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKEVENT));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KEVENT;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKMEMTRACE));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KMEMTRACE;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKIPC));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KIPC;
		
		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKDEBUGGER));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KDEBUGGER;

		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKVIDEO));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KVIDEO;

		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKUSB));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KUSB;

		aCheckBox = static_cast<CEikCheckBox*>(Control(EDebugKernelKPANIC));
		if (aCheckBox->State()==CEikButtonBase::ESet) debugMask|=KPANIC;

		User::SetDebugMask(debugMask);
		TUint32 updatedDebugMask = UserSvr::DebugMask();
		if (debugMask != updatedDebugMask)
			{
			errorMssg.Append(_L("Unable to set kernel options selected. Note that KPanic must be selected if any other options are selected. View the \nupdated dialog to see which Kernel options are set"));
			GetKernelOptions();
			}


		CEikCheckBox *thisCheckBox, *thisCheckBox2, *thisCheckBox3;
		thisCheckBox = static_cast<CEikCheckBox*>(Control(EDebugFileServerCtl));
		thisCheckBox2 = static_cast<CEikCheckBox*>(Control(EDebugFATCtl));
		thisCheckBox3 = static_cast<CEikCheckBox*>(Control(EDebugLoaderCtl));

		TInt fsDebugMask = 0;
		if (thisCheckBox->State()==CEikButtonBase::ESet) fsDebugMask|=KFSERV;
		if (thisCheckBox2->State()==CEikButtonBase::ESet) fsDebugMask|=KFSYS;
		if (thisCheckBox3->State()==CEikButtonBase::ESet) fsDebugMask|=KFLDR;

		RFs aRFs;
		err = aRFs.Connect();
		if (err == KErrNone)
			{
			err = aRFs.SetDebugRegister(fsDebugMask);
			if (err != KErrNone)
				errorMssg.Append(_L("Unable to set FS options: RFs::SetDebugRegister() fails with  System error number "));
			TBuf<3> errorCode;
			errorCode.Format(KFormatDec, err);
			errorMssg.Append(errorCode);
			}
		else
			{
			errorMssg.Append(_L("\nRFs::Connect() fails with System error number "));
			TBuf<3> errorCode;
			errorCode.Format(KFormatDec, err);
			errorMssg.Append(errorCode);
			thisCheckBox->SetState(CEikButtonBase::EClear);
			thisCheckBox2->SetState(CEikButtonBase::EClear);
			thisCheckBox3->SetState(CEikButtonBase::EClear);
			}
		aRFs.Close();

		if (errorMssg.Length() != 0)
			{
			_LIT(KDialogTitle, "Error");
			iEikonEnv->InfoWinL(KDialogTitle, errorMssg);
			}
	}

TBool CDebugDialog::OkToExitL(TInt aButtonId)
	{
	if (aButtonId == EDebugSetButtonCtl)
		{
		SetDebugOptions();
		DrawNow();
		return EFalse;
		}
	if (aButtonId == EEikBidOk)
		{
		SetDebugOptions();
		}
	else if (aButtonId == EEikBidCancel)
		{
		// Do Nothing
		}
	return ETrue;
	}

//
//
// Ram Dialog
//
//

CRamDialog::CRamDialog()
	{
	noChunks = 0;
	}

void CRamDialog::PreLayoutDynInitL()
	{
	UpdateDialogData();
	}

void CRamDialog::UpdateDialogData()
	{
	CEikLabel *theTotalLabel, *theFreeLabel;
	theTotalLabel = STATIC_CAST(CEikLabel*, Control(ERamTotal));
	theFreeLabel = STATIC_CAST(CEikLabel*, Control(ERamFree));

	TMemoryInfoV1Buf memorybuf;
	UserHal::MemoryInfo(memorybuf);
	TInt total=memorybuf().iTotalRamInBytes;
	TInt free=memorybuf().iFreeRamInBytes;

	TBuf<40> totalTxt;
	totalTxt.Format(_L("Total RAM (bytes) %d"),total);
	TBuf<40> freeTxt;
	freeTxt.Format(_L("Free RAM (bytes) %d"),free);

	theTotalLabel->SetTextL(totalTxt);
	theFreeLabel->SetTextL(freeTxt);

	CXIKOPTIONBUTTONLIST *fillSpaceOpButs;
	fillSpaceOpButs = STATIC_CAST(CXIKOPTIONBUTTONLIST*, Control(ERamToLeaveButtonCtl));

	// All buttons invisible
	fillSpaceOpButs->ComponentControl(0)->MakeVisible(ETrue);
	fillSpaceOpButs->ComponentControl(1)->MakeVisible(ETrue);
	fillSpaceOpButs->ComponentControl(2)->MakeVisible(ETrue);
	fillSpaceOpButs->ComponentControl(3)->MakeVisible(ETrue);
	fillSpaceOpButs->ComponentControl(4)->MakeVisible(ETrue);

	if (free<K4k) 
		{
		// All buttons visible
		fillSpaceOpButs->ComponentControl(0)->MakeVisible(EFalse);
		fillSpaceOpButs->ComponentControl(1)->MakeVisible(EFalse);
		fillSpaceOpButs->ComponentControl(2)->MakeVisible(EFalse);
		fillSpaceOpButs->ComponentControl(3)->MakeVisible(EFalse);
		fillSpaceOpButs->ComponentControl(4)->MakeVisible(EFalse);
		}
	else if (free>=K4k && free<K8k) 
		{
		fillSpaceOpButs->ComponentControl(1)->MakeVisible(EFalse);
		fillSpaceOpButs->ComponentControl(2)->MakeVisible(EFalse);
		fillSpaceOpButs->ComponentControl(3)->MakeVisible(EFalse);
		fillSpaceOpButs->ComponentControl(4)->MakeVisible(EFalse);
		fillSpaceOpButs->SetButtonById(ERamLeave4K);
		}
	else if (free>=K8k && free<K16k) 
		{
		fillSpaceOpButs->ComponentControl(2)->MakeVisible(EFalse);
		fillSpaceOpButs->ComponentControl(3)->MakeVisible(EFalse);
		fillSpaceOpButs->ComponentControl(4)->MakeVisible(EFalse);
		fillSpaceOpButs->SetButtonById(ERamLeave8K);
		}
	else if (free>=K16k && free<K64k)
		{
		fillSpaceOpButs->ComponentControl(3)->MakeVisible(EFalse);
		fillSpaceOpButs->ComponentControl(4)->MakeVisible(EFalse);
		fillSpaceOpButs->SetButtonById(ERamLeave16K);
		}
	else if (free>= K64k && free<K256k)
		{
		fillSpaceOpButs->ComponentControl(4)->MakeVisible(EFalse);
		fillSpaceOpButs->SetButtonById(ERamLeave64K);
		}
	else 
		{
		fillSpaceOpButs->SetButtonById(ERamLeave256K);
		}
	}

void CRamDialog::UndoFillRam()
	{	
	if (noChunks == 0) iEikonEnv->InfoMsg(_L("Undo fill invalid"));
	else
	{
		while (noChunks>0)
			{
			chunks[--noChunks].Close();
			}
	}
}
void CRamDialog::FillRam()
	{
		iEikonEnv->BusyMsgL(_L("Filling RAM"));

		CXIKOPTIONBUTTONLIST *opButs;
		opButs = STATIC_CAST(CXIKOPTIONBUTTONLIST*, Control(ERamToLeaveButtonCtl));

		TUint ramToLeave=K4k;
		if (opButs->LabeledButtonId()==ERamLeave4K) ramToLeave=K4k;
		else if (opButs->LabeledButtonId()==ERamLeave8K) ramToLeave=K8k;
		else if (opButs->LabeledButtonId()==ERamLeave16K) ramToLeave=K16k;
		else if (opButs->LabeledButtonId()==ERamLeave64K) ramToLeave=K64k;
		else if (opButs->LabeledButtonId()==ERamLeave256K) ramToLeave=K256k; 


		TUint chunkSize;
		TInt err = KErrNone;
		TBuf<20> aName;
		TTime time;

		TMemoryInfoV1Buf memorybuf;
		UserHal::MemoryInfo(memorybuf);

		// Fill the RAM up with various chunks
		for (chunkSize = K8M; chunkSize>=ramToLeave; chunkSize>>=1) 
			{
			TUint KMaxChunks = 10000;
			for (err=KErrNone; err==KErrNone && noChunks<KMaxChunks;)	
				{
				// create a unique chunk name
				time.UniversalTime();
				aName.Format(_L("%S%02d-%08x"),&KFillName, noChunks,*(reinterpret_cast<const TInt32*>(&(time.Int64()))));

				err = chunks[noChunks].CreateGlobal(aName, chunkSize, chunkSize);
				// ensure RAM is committed by filling it
				if (err==KErrNone)
					{
					Mem::Fill(chunks[noChunks++].Base(),chunkSize,'A');
					}
				User::CompressAllHeaps();
				} ;
			}
		iEikonEnv->BusyMsgCancel();
		if (err == KErrNone) iEikonEnv->InfoMsg(_L("Fill Complete"));
	}

TBool CRamDialog::OkToExitL(TInt aButtonId)
	{
	if (aButtonId == EEikBidCancel)
		{
		return ETrue;
		}
	else if (aButtonId == ERamSetButtonCtl)
		{
		FillRam();
		UpdateDialogData();
		DrawNow();
		return EFalse;
		}
	else if (aButtonId == ERamUndoFillButtonCtl)
		{
		UndoFillRam();
		UpdateDialogData();
		DrawNow();
		return EFalse;
		}
	return ETrue;
	}

//
//
// Drive Dialog
//
//

CDriveDialog::CDriveDialog() : iDriveName(NULL), iDriveLetter(NULL)
	{
	}

CDriveDialog::~CDriveDialog()
	{
		delete iDriveLetter;
		delete iDriveName;
	}

void CDriveDialog::PreLayoutDynInitL()
	{
	iDriveName = new (ELeave) CDesCArrayFlat(KMaxLocalDrives);
	iDriveLetter = new  CArrayFixFlat<TInt>(KMaxLocalDrives);

	TBuf<40> string; // displayed in choice box
	RFs rfs;	
	User::LeaveIfError(rfs.Connect());
	TDriveInfo driveInfo;
	TVolumeInfo volumeInfo;
	TDriveUnit driveUnit(EDriveA);
	TInt err1,err2,drive=0,number=0;

	do {
	
		driveUnit = drive;
		err1 = rfs.Volume(volumeInfo,driveUnit);
		err2 = rfs.Drive(driveInfo, driveUnit);
		if (err1==KErrNone && err2==KErrNone)
			{

			// Only interested if not ROM and local

			if (volumeInfo.iDrive.iType != EMediaRom &&
				(volumeInfo.iDrive.iDriveAtt | KDriveAttLocal))
				{
				number++;

				string.Delete(0,string.MaxLength());

				string=driveUnit.Name();

				string.Append(_L(" "));
				string.Append(volumeInfo.iName);

				iDriveName->AppendL(string);
				iDriveLetter->AppendL(drive);
				}
			}

		drive++;

		} while (drive <= EDriveZ && number < KMaxLocalDrives);

	rfs.Close();

	CEikChoiceList *driveChoice;
	driveChoice = STATIC_CAST(CEikChoiceList*, Control(EDriveChoiceList));
	driveChoice->SetArrayL(iDriveName);
	driveChoice->SetArrayExternalOwnership(ETrue);

	
	CXIKOPTIONBUTTONLIST *fillSpaceOpButs;
	fillSpaceOpButs = STATIC_CAST(CXIKOPTIONBUTTONLIST*, Control(EDriveToLeaveButtonCtl));
	fillSpaceOpButs->SetButtonById(EDriveLeave256K);
	}


void UpdateDialogLeaveSpace()
	{	
	}

TBool CDriveDialog::OkToExitL(TInt aButtonId)
	{
	if (aButtonId == EEikBidCancel) 
		{
		delete iDriveName;
		delete iDriveLetter;
		return ETrue;
		}
	else
		{
		CEikChoiceList *driveChoice;
		driveChoice = STATIC_CAST(CEikChoiceList*, Control(EDriveChoiceList));
		TInt choice = driveChoice->CurrentItem();
		TDriveUnit driveUnit;
		driveUnit = (*iDriveLetter)[choice];

		RFs aRfs;
		User::LeaveIfError(aRfs.Connect());

		CXIKOPTIONBUTTONLIST *fillSpaceOpButs;
		fillSpaceOpButs = STATIC_CAST(CXIKOPTIONBUTTONLIST*, Control(EDriveToLeaveButtonCtl));

		if (aButtonId==EDriveFillButtonCtl)
			{ 
			iEikonEnv->BusyMsgL(_L("Filling Drive"));
			// need a unique file name
			TInt i=0,err = KErrNone;
			TFileName fileName;
			TTime time;

			TInt fileSize;

			CXIKOPTIONBUTTONLIST *fillSpaceOpButs;
			fillSpaceOpButs = STATIC_CAST(CXIKOPTIONBUTTONLIST*, Control(EDriveToLeaveButtonCtl));

			TInt spaceToLeave=K4k;
			if (fillSpaceOpButs->LabeledButtonId()==EDriveLeave4K) spaceToLeave=K4k;
			else if (fillSpaceOpButs->LabeledButtonId()==EDriveLeave8K) spaceToLeave=K8k;
			else if (fillSpaceOpButs->LabeledButtonId()==EDriveLeave16K) spaceToLeave=K16k;
			else if (fillSpaceOpButs->LabeledButtonId()==EDriveLeave64K) spaceToLeave=K64k;
			else if (fillSpaceOpButs->LabeledButtonId()==EDriveLeave256K) spaceToLeave=K256k;

			for (fileSize = K1M; fileSize>=spaceToLeave; fileSize>>=1)
				{

				do { 
					time.UniversalTime();
					TDriveName driveName = driveUnit.Name();
					fileName.Format(_L("%S\\%S%06d-%08x"),&driveName,&KFillName,++i,*(reinterpret_cast<const TInt32*>(&(time.Int64()))));

					// create a file of this file size
					RFile file;
					err=file.Create(aRfs, fileName, EFileRead|EFileWrite);
					if (err!=KErrNone)
						{	
						TBuf<70> errorMessage(_L("Cannot complete fill. RFile::Create() failed with error no. "));
						errorMessage.AppendNum(err);
						iEikonEnv->InfoWinL(_L("Error"), errorMessage);
						}
							
						// fill file up to fileSize
					if (err==KErrNone)
						{
						const TInt MaxBufSize=512;
						TBuf8<MaxBufSize> buf;
						buf.SetLength(MaxBufSize);
						Mem::Fill((void*)buf.Ptr(),MaxBufSize,0xef);
						TInt rem=fileSize;
						while(rem)
							{
							TInt s=Min(MaxBufSize,rem);
							err=file.Write(buf,s);
							if (err!=KErrNone) break;
							rem-=s;
							}	
						}

					file.Close();
					if(err!=KErrNone) aRfs.Delete(fileName);
					} while (err==KErrNone && i<100);
				} 
				iEikonEnv->BusyMsgCancel();
				iEikonEnv->InfoMsg(_L("Drive filled"));
			}
		else if (aButtonId==EDriveUndoFillButtonCtl)
			{
			iEikonEnv->BusyMsgL(_L("Undo Drive Fill"));
			TFindFile fileFinder(aRfs);
			CDir* fileList;

			TBuf<10> name;
			name=KFillName;
			name.Append(KAsterisk);

			TBuf<3> driveName;
			driveName=driveUnit.Name();
			driveName.Append(_L("\\"));

			TInt findErr = fileFinder.FindWildByPath(name,&driveName,fileList);
			TInt deleteErr = KErrNone;

			if (findErr == KErrNone)
				{
				for (TInt i=0;i<fileList->Count();++i)
					{
					TBuf<100> filePath(driveName);
					filePath.Append((*fileList)[i].iName);

					deleteErr = aRfs.Delete(filePath);
					}
				}
			iEikonEnv->BusyMsgCancel();

			if (deleteErr !=KErrNone)
				{
				TBufC<15> function(_L("RFs::Delete()"));
				DisplayError(function, deleteErr);
				}
			if (findErr == KErrNone && deleteErr == KErrNone)
			{
				fillSpaceOpButs->ComponentControl(0)->MakeVisible(ETrue);
				fillSpaceOpButs->ComponentControl(1)->MakeVisible(ETrue);
				fillSpaceOpButs->ComponentControl(2)->MakeVisible(ETrue);
				fillSpaceOpButs->ComponentControl(3)->MakeVisible(ETrue);
				fillSpaceOpButs->ComponentControl(4)->MakeVisible(ETrue);
				iEikonEnv->InfoMsg(_L("Undo Fill Complete"));
			}

			else iEikonEnv->InfoMsg(_L("Undo Fill Invalid"));
			delete fileList;
			}
		else if (aButtonId==EDriveFormatButtonCtl)
			{
			TInt count;
			RFormat format;
			TInt err=format.Open(aRfs,driveUnit.Name(),EHighDensity,count);
			if (err==KErrNone)
				{
				iEikonEnv->BusyMsgL(_L("Formatting Drive"));
				while (count && err==KErrNone)
					{
					err = format.Next(count);
					if (err != KErrNone)
						{
						TBufC<15> function(_L("RFormat::Next()"));
						DisplayError(function, err);
						}
					}
				iEikonEnv->BusyMsgCancel();
				}
			else
				{						
				TBuf<70> errorMessage(_L("RFormat::Open() failed with system error no."));
				errorMessage.AppendNum(err);
				iEikonEnv->InfoWinL(_L("Error"), errorMessage);
				}
			format.Close();
			}

		aRfs.Close();
		}
	return EFalse;
	}

CDialogBase::CDialogBase()
	{
	}

void CDialogBase::DisplayError(TDesC& aMessage, TInt aErrorNumber)
	{
	//could check doesn't go out of bounds
	TBuf<250> errorMssge(aMessage);
	errorMssge.Append(_L(" fails with system error no. "));
	TBuf<3> errorNum;
	_LIT(KFormatDec, "%d");
	errorNum.Format(KFormatDec, aErrorNumber);
	errorMssge.Append(errorNum);
	iEikonEnv->InfoWinL(_L("Error"), errorMssge);	
	}

void CDialogBase::DisplayError(TDesC& aMessage)
	{
	//could check don't go out of bounds
	TBuf<250> errorMssge(aMessage);
	iEikonEnv->InfoWinL(_L("Error"), errorMssge);	
	}