testexecfw/useremul/src/UserEmulatorScriptsView.cpp
changeset 0 3e07fef1e154
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecfw/useremul/src/UserEmulatorScriptsView.cpp	Mon Mar 08 15:03:44 2010 +0800
@@ -0,0 +1,1060 @@
+/*------------------------------------------------------------------
+ -
+ * Software Name : UserEmulator
+ * Version       : v4.2.1309
+ * 
+ * Copyright (c) 2009 France Telecom. All rights reserved.
+ * This software is distributed under the License 
+ * "Eclipse Public License - v 1.0" the text of which is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * France Telecom 
+ *
+ * Contributors:
+ *------------------------------------------------------------------
+ -
+ * File Name: UserEmulatorScriptsView.cpp
+ * 
+ * Created: 13/08/2009
+ * Author(s): Marcell Kiss, Reshma Sandeep Das
+ *   
+ * Description:
+ * Application View class
+ *------------------------------------------------------------------
+ -
+ *
+ */
+
+// System Includes
+#include <coemain.h>
+#include <eikedwin.h>
+#include <akniconarray.h> 
+#include <gulicon.h> 
+#include <eikclbd.h> 
+#include <bautils.h>
+#include <aknnotewrappers.h>
+#include <hal.h>
+#include <aknmessagequerydialog.h> 
+#include <icons.mbg>
+// User Includes
+#include <UserEmulator_0x2001C3AF.rsg>
+#include "UserEmulatorScriptsView.h"
+#include "UserEmulatorAppUi.h"
+#include "UserEmulatorApplication.h"
+#include "XmlHandler.h"
+#include "UserEmulator.hrh"
+#include "ScanFolders.h"
+#include "Utils.h"
+// Constant
+// Listbox icon file name
+_LIT(KIconFileName, "\\system\\apps\\useremulator\\Icons.mbm");
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CUserEmulatorScriptsView::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CUserEmulatorScriptsView* CUserEmulatorScriptsView::NewL(const TRect& aRect, CSettings* aSettings, CEikonEnv* aEikonEnv)
+	{
+	CUserEmulatorScriptsView* self = CUserEmulatorScriptsView::NewLC( aRect, aSettings, aEikonEnv);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CUserEmulatorScriptsView::NewLC()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CUserEmulatorScriptsView* CUserEmulatorScriptsView::NewLC(const TRect& aRect, CSettings* aSettings, CEikonEnv* aEikonEnv)
+	{
+	CUserEmulatorScriptsView* self = new ( ELeave ) CUserEmulatorScriptsView(aSettings, aEikonEnv);
+	CleanupStack::PushL(self);
+	self->ConstructL(aRect);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CUserEmulatorScriptsView::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::ConstructL(const TRect& aRect)
+{
+     _LIT8(KXml,"*.xml");
+	 // Create a window for this application view
+	 CreateWindowL();
+
+	 iScanFolder = CScanFolders::NewL();
+ 	 iScanFolder->AddListenerL(this);
+ 	 iScanFolder->SetFilter( KXml );
+	 	
+	 // Create a single numbered style listbox
+	 iListBox = new (ELeave) CAknSingleGraphicStyleListBox(); // markable
+	 // Construct listbox   
+	 iListBox->ConstructL( this, EAknListBoxMarkableList | EAknListBoxLoopScrolling );    
+	 // Set scrollbars
+	 iListBox->CreateScrollBarFrameL( ETrue );
+	 iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOn, CEikScrollBarFrame::EAuto );
+	 
+	 iListBox->UpdateScrollBarsL();
+     iListBox->SetRect( Rect() );
+        
+	 iFilesArray = new (ELeave) CDesCArrayFlat(1);
+	 iSelectedFilesArray = new (ELeave) CDesCArrayFlat(1);
+	 	 
+	 iListBox->Model()->SetItemTextArray( iFilesArray );
+	 // Listbox deletes the item array
+	 iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray );
+	 
+	 // Add icons to listbox
+ 	 SetupListIconsL();
+ 	 // Activate Listbox    
+     iListBox->ActivateL();
+ 	 
+  	 iNotifyFileChange = CNotifyFileChange::NewL(*this, iSettings->iScriptsPath);
+  	 iIMEIReader = CImeiReader::NewL(*this);
+  	 
+ 	 ShowScriptsL();
+ 	
+ 	 // Set the windows size
+	 SetRect(aRect);
+
+	 // Activate the window, which makes it ready to be drawn
+	 ActivateL();
+}
+// ---------------------------------------------------
+// Gets the reference to CNotifyFileChange object
+// ---------------------------------------------------
+//
+CNotifyFileChange* CUserEmulatorScriptsView::GetNotifyFileChange()
+	{
+	return iNotifyFileChange;
+	}
+// ---------------------------------------------------
+// Creates a list from files in script folder
+// ---------------------------------------------------
+//
+void CUserEmulatorScriptsView::ShowScriptsL()
+{
+	iFileName.Copy(iSettings->iScriptsPath);
+	TParsePtrC parser(iFileName);
+	BaflUtils::EnsurePathExistsL(iEEnv->FsSession(), parser.DriveAndPath());
+	iScanFolder->ScanFolderL(iFileName);
+}
+// -----------------------------------------------------------------------------
+// CUserEmulatorScriptsView::CUserEmulatorScriptsView()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CUserEmulatorScriptsView::CUserEmulatorScriptsView(CSettings* aSettings, CEikonEnv* aEikonEnv) 
+                          : iSettings(aSettings), iEEnv(aEikonEnv)//,iStartLog(EFalse),iSystemInfo(ETrue)
+{
+	// No implementation required
+}
+
+// -----------------------------------------------------------------------------
+// CUserEmulatorScriptsView::~CUserEmulatorScriptsView()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CUserEmulatorScriptsView::~CUserEmulatorScriptsView()
+{
+	delete iListBox;
+	
+	if(iScanFolder)
+	{
+	iScanFolder->RemoveListener(this);
+	delete iScanFolder;
+	iScanFolder = NULL;
+	}
+	
+	delete iSelectedFilesArray;
+	
+	delete iNotifyFileChange;
+	delete iIMEIReader;
+	
+}
+
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppView::Draw()
+// Draws the display.
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::Draw(const TRect& /*aRect*/) const
+{
+	// Get the standard graphics context
+	CWindowGc& gc = SystemGc();
+
+	// Gets the control's extent
+	TRect drawRect(Rect());
+
+	// Clears the screen
+	gc.Clear(drawRect);
+}
+// -----------------------------------------------------------------------------
+// CUserEmulatorScriptsView::SizeChanged()
+// Called by framework when the view size is changed.
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::SizeChanged()
+{
+	if(iListBox)
+	{
+		iListBox->SetRect(Rect());	
+		TRAP_IGNORE(iListBox->UpdateScrollBarsL());
+	}
+	DrawNow();
+}
+// -----------------------------------------------------------------------------
+// CUserEmulatorScriptsView::PositionChanged()
+// Called by framework when the view position is changed.
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::PositionChanged()
+{
+	if(iListBox)
+	{
+		iListBox->SetRect(Rect());	
+		TRAP_IGNORE(iListBox->UpdateScrollBarsL());
+	}	
+	DrawNow();
+}
+// ---------------------------------------------------
+// Returns number of components in View
+// ---------------------------------------------------
+//
+TInt CUserEmulatorScriptsView::CountComponentControls() const
+{
+	return 1;
+}
+// ----------------------------------------------------------------------------------
+// Constructs a TVwsViewId object with User Emulator's UID and EScriptsView ID
+// ----------------------------------------------------------------------------------
+//
+TVwsViewId CUserEmulatorScriptsView::ViewId() const
+{
+    const TUid viewId = { EScriptsView };
+    return TVwsViewId(KUidUserEmulatorApp, viewId);
+}
+// ----------------------------------------------------------------
+// Stores device's IMEI details
+// ----------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::GotIMEI(const TDesC& aIMEI,TInt /*aError*/)
+{
+	iImeiNo.Copy(aIMEI);
+}
+// --------------------------------------------------------------------------
+// Sends the CCoeControl interface of the control which has the given index
+// --------------------------------------------------------------------------
+//
+CCoeControl* CUserEmulatorScriptsView::ComponentControl(TInt aIndex) const
+{
+    switch ( aIndex )
+    {
+        case 0:
+			return iListBox;
+        default:
+            return NULL;
+    }
+}
+// --------------------------------------------------------------------------
+// Initialises icons of the script list
+// --------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::SetupListIconsL()
+{
+	CFbsBitmap* markBitmap = NULL;
+    CFbsBitmap* markBitmapMask = NULL;
+    
+    TFileName iconFileName;
+	TBuf<KDriveSize> appDrive; 
+	appDrive.Copy(iEEnv->EikAppUi()->Application()->AppFullName().Left(2)); 
+	// Insert drive letter into path
+	iconFileName.Insert(0, appDrive);
+	iconFileName.Append(KIconFileName());
+
+    //CListItemDrawer is using this logical color as default for its marked icons
+    TRgb defaultColor;
+    defaultColor = iEEnv->Color(EColorControlText);
+    	
+    CAknIconArray* iconArray = new(ELeave) CAknIconArray(4);
+    CleanupStack::PushL(iconArray);
+    
+    //Mark Icon
+    AknsUtils::CreateColorIconLC(AknsUtils::SkinInstance(),
+    			KAknsIIDQgnIndiMarkedAdd,
+    			KAknsIIDQsnIconColors,
+    			EAknsCIQsnIconColorsCG13,
+    			markBitmap,
+    			markBitmapMask,
+    			KAvkonBitmapFile,
+    			EMbmAvkonQgn_indi_marked_add,
+    			EMbmAvkonQgn_indi_marked_add_mask,
+    			defaultColor
+    			);
+    
+    CGulIcon* markIcon = CGulIcon::NewL( markBitmap,markBitmapMask );
+    CleanupStack::Pop( 2 ); // markBitmap, markBitmapMask
+    CleanupStack::PushL( markIcon );      
+    iconArray->AppendL( markIcon );
+    
+    iconArray->AppendL(iEikonEnv->CreateIconL(iconFileName, EMbmIconsPass, EMbmIconsPass));
+    iconArray->AppendL(iEikonEnv->CreateIconL(iconFileName, EMbmIconsFail, EMbmIconsFail_mask));
+    iconArray->AppendL(iEikonEnv->CreateIconL(iconFileName, EMbmIconsCancel, EMbmIconsCancel_mask));
+    	
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray(iconArray);
+    
+    CleanupStack::Pop( 2 );// markIcon, iconArray
+}
+// --------------------------------------------------------------------------
+// Changes icon of a script in list
+// --------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::ChangeIconL(TInt aScriptStatus, TInt aIndex)
+{
+	TBuf<KBuffer256> listItem;
+	_LIT(KListItemUnMark, "\t%S\t\t");
+	_LIT(KListItemWithPassIcon, "1\t%S\t\t");
+	_LIT(KListItemWithFailIcon, "2\t%S\t\t");
+	_LIT(KListItemWithCancelIcon, "3\t%S\t\t");
+				
+	CTextListBoxModel* model = iListBox->Model();  // not taking ownership
+	const CArrayFix<TInt> *SelectedIndexes = iListBox->SelectionIndexes();
+		
+	if(aIndex < 0 || aIndex > SelectedIndexes->Count())
+			return;
+
+	// Get the index of the selected item
+    TInt selectedItemIndex = (*SelectedIndexes)[aIndex];
+    if(iFilesArray->Count()>0 && selectedItemIndex <= iFilesArray->Count())
+    {
+    	TPtrC filePtr = model->ItemText(selectedItemIndex);
+    	TPtrC buff = filePtr.Mid(filePtr.LocateF('\t')+1);
+		TPtrC fileNamePtr = buff.Mid(0,buff.LocateF('\t'));
+		
+    	HBufC* fileName = HBufC::NewLC(fileNamePtr.Length());
+    	fileName->Des().Copy(fileNamePtr);
+    	
+    	//delete old item
+    	CDesCArray* itemArray = STATIC_CAST(CDesCArray*, model->ItemTextArray());
+    	
+    	itemArray->Delete(selectedItemIndex);
+    	// Script statuses
+    	switch(aScriptStatus)
+		{
+    		case EScriptPassed:
+      			listItem.AppendFormat(KListItemWithPassIcon(), fileName);	// Format new item
+  			break;
+    		case EScriptFailed:
+    			listItem.AppendFormat(KListItemWithFailIcon(), fileName);	// Format new item
+			break;
+    		case EScriptCancelled:
+    			listItem.AppendFormat(KListItemWithCancelIcon(), fileName);	// Format new item
+			break;
+    		case EScriptUnMark:
+    			listItem.AppendFormat(KListItemUnMark(), fileName);	// Format new item
+    		break;
+			
+    		default:
+    			break;
+		}
+		
+    	itemArray->InsertL(selectedItemIndex, listItem);	// Insert new item - changes icon to green
+		SelectedIndexes->Count();
+		
+    	CleanupStack::PopAndDestroy(fileName);
+    }
+}
+// --------------------------------------------------------------------------
+// Script view's activation function
+// --------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::DoViewActivatedL(const TVwsViewId& /*aPrevViewId*/, 
+		           TUid /*aCustomMessageId*/, const TDesC8& /*aCustomMessage*/)
+{
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+    		CEikScrollBarFrame::EOn, CEikScrollBarFrame::EOn);
+    
+    UpdateSystemCba(EFalse);
+}
+// --------------------------------------------------------------------------
+// Updates command button(s)
+// --------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::UpdateSystemCba(TBool aConnStatus)
+{
+    TInt res = 0;
+    res = GetScriptsCount();
+    
+    if( res > 0 && !aConnStatus)
+        res = R_SOFTKEYS_SCRIPTS;
+    else
+        res = R_SOFTKEYS_NOSCRIPTS;
+
+    CEikButtonGroupContainer* cba = iEikonEnv->AppUiFactory()->Cba();
+    TRAPD(err,cba->SetCommandSetL(res));
+    cba->DrawDeferred();
+}
+// --------------------------------------------------------------------------
+// Script view's deactivation function
+// --------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::DoViewDeactivated()
+{
+}
+// --------------------------------------------------------------------------
+// Gets script name by index
+// --------------------------------------------------------------------------
+//
+HBufC* CUserEmulatorScriptsView::GetScriptNameLC(TInt aIndex)
+{
+	HBufC* text = HBufC::NewLC(KBuffer512);
+    TPtr textPtr(text->Des());
+	
+    // Get the selected item indexes an array
+	iSelectedIndexes = iListBox->SelectionIndexes();			
+	CTextListBoxModel* model = iListBox->Model();  // not taking ownership
+	
+	if(aIndex < 0 || aIndex > iSelectedIndexes->Count())
+		return NULL;
+	
+	if ( iSelectedIndexes && iSelectedIndexes->Count() != 0 && aIndex<=iSelectedIndexes->Count() )
+	{
+		// Get the index of the selected item
+		TInt selectedItemIndex = (*iSelectedIndexes)[aIndex];
+		
+		TPtrC filePtr = model->ItemText(selectedItemIndex);
+		TInt pos=filePtr.LocateF('\t');
+		TPtrC buff;
+		if(pos!=KErrNotFound && pos+1<=filePtr.Length())
+			buff.Set(filePtr.Mid(pos+1));
+		
+		pos=buff.LocateF('\t');
+		TPtrC fileNamePtr;
+		if(pos!=KErrNotFound)
+			fileNamePtr.Set(buff.Mid(0,pos));
+    	textPtr.Copy(fileNamePtr);
+	}
+	return text;
+}
+// --------------------------------------------------------------------------
+// Gets sum of scripts selected
+// --------------------------------------------------------------------------
+//
+TInt CUserEmulatorScriptsView::GetSelectedScriptsCount()
+{
+	return iSelectedIndexes->Count();
+}
+// --------------------------------------------------------------------------
+// Gets sum of all scripts in script's folder
+// --------------------------------------------------------------------------
+//
+TInt CUserEmulatorScriptsView::GetScriptsCount()
+{
+	CTextListBoxModel* model = iListBox->Model();  // not taking ownership
+	return model->NumberOfItems();
+}
+// ------------------------------------------------------------
+// Run selected scripts
+// ------------------------------------------------------------
+//
+TInt CUserEmulatorScriptsView::RunScriptsL(TInt& aErrcode)
+{
+	TInt err=KErrNone;
+	aErrcode=KErrNone;
+	
+	// Get the selected item indexes an array
+	iSelectedIndexes = iListBox->SelectionIndexes();			
+
+	iSelectedFilesArray->Reset();
+	
+	CTextListBoxModel* model = iListBox->Model();  // not taking ownership
+	
+	// Make sure the array is not null (no items)
+	if ( iSelectedIndexes && iSelectedIndexes->Count() > 0) 
+	{
+	    // Loop through the selected item indexes
+	    for ( TInt index=0; index < iSelectedIndexes->Count(); index++ )
+        {
+	        // Get the index of the selected item
+	        TInt selectedItemIndex = (*iSelectedIndexes)[index];
+	        if(iFilesArray->Count()>0 && selectedItemIndex <= iFilesArray->Count())
+	        {
+	        	TPtrC filePtr = model->ItemText(selectedItemIndex);
+	        	// Disallow too long file names
+	        	TInt pos=filePtr.LocateF('\t');
+	        	TPtrC buff;
+	        	if(pos!=KErrNotFound && pos+1<=filePtr.Length())
+					buff.Set(filePtr.Mid(pos+1));
+	        	TPtrC fileNamePtr;
+	        	pos=buff.LocateF('\t');
+	        	if(pos!=KErrNotFound)
+					fileNamePtr.Set(buff.Mid(0,pos));
+	        	
+	        	iSelectedFilesArray->AppendL(fileNamePtr);
+	        	//Append the selected file names to an array
+	        	if(!iFileName.Length())
+	        		iFileName.Copy(iSettings->iScriptsPath);
+	        	iFileName.Append(fileNamePtr);
+	        	
+	        	//check if the iFilaName is valid
+                err = iSettings->CheckDrive(iFileName);
+                if(err == KErrNone)
+	        	  // Parse the XML file
+	        	  TRAPD(err,aErrcode=static_cast<CUserEmulatorAppUi*>(iCoeEnv->AppUi())->StartParsingL(iFileName));
+	        	  
+	        	iFileName.Zero();
+	        }			        
+        }
+	}
+	else
+	{
+		//If no scripts selected
+		_LIT(KSELECTSCRIPT, "Select scripts to run..");
+		CUtils::MessageBoxL(KSELECTSCRIPT);
+	}
+	
+	return err;
+}
+
+// ------------------------------------------------------------------------------
+// Handles incoming pointer events (if pointer events are enabled on the device)
+// ------------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+	{
+	if(AknLayoutUtils::PenEnabled())
+		{
+		if (iListBox)
+			{
+			iListBox->HandlePointerEventL(aPointerEvent);
+			}
+		// Call base class HandlePointerEventL()
+		CCoeControl::HandlePointerEventL(aPointerEvent);
+		}
+	}
+// --------------------------------------------------------------------------
+// Helper function
+// --------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::HandleMarkCommandL(TInt aCommand)
+{
+	if (iListBox)
+	{
+		AknSelectionService::HandleMarkableListProcessCommandL (aCommand, iListBox);
+	}
+}
+// -------------------------------------------------------------------------------
+// Checks how many items are selected and the current one is selected or not
+// This function is needed to display correct Mark, Unmark, Mark all, etc. menus
+// -------------------------------------------------------------------------------
+//
+TInt CUserEmulatorScriptsView::CheckListBoxSelection()
+	{
+	TInt res=0;
+	// Gets all entries
+	TInt allEntries = GetScriptsCount();
+	if(allEntries>0)
+		{
+		const CArrayFix<TInt> *SelectedIndexes = iListBox->SelectionIndexes();
+		// Checks if current item is selected
+		TInt n=iListBox->CurrentItemIndex();
+		TBool IsSelected = iListBox->View()->ItemIsSelected(n);
+		if(SelectedIndexes)
+			{                
+			TInt selEntries = SelectedIndexes->Count();
+			// There is only one item in list box and it's selected
+			if(allEntries==1 && IsSelected)
+				res=EOneItemSel;
+		    // There is only one item and it is not selected
+			else if(allEntries==1 && !IsSelected)
+				res=EOneItem;
+			// There are more items and current one is selected and there's only one selected item
+			else if(allEntries>1 && IsSelected && selEntries==1)
+				res=EMoreItemsSel;
+			// There are more items and current one is not selected and there's no selected item
+			else if(allEntries>1 && !IsSelected && selEntries==0)
+				res=EMoreItems;
+			// There are more items and current one is selected and all items are selected in the list
+			else if(allEntries>1 && IsSelected && selEntries==allEntries)
+				res=EMoreItemsAll;
+			// There are more items and current one is not selected and all items are selected in 
+			// the list (except the current one)
+			else if(allEntries>1 && !IsSelected && selEntries==allEntries-1)
+				res=EMoreItemsAllExc;
+		    // There are more items and current one is selected and there are more than one selected items
+		    // but not all
+			else if(allEntries>1 && IsSelected && selEntries>1 && allEntries>selEntries)
+				res=EMoreItemsNotAll;
+			// There are more items and at least one item is selected which is not the current one
+			// but not all items are selected
+			else if(allEntries>1 && !IsSelected && selEntries>0 && allEntries>selEntries)
+				res=EMoreItemsNotAllNotCurrent;
+			}
+		}
+	return res;
+	}
+// -------------------------------------------------------------------------------
+// Unmark an item or unmark all items (according to aCommand param)
+// -------------------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::UnMarkL(TInt aCommand)
+{
+	const CArrayFix<TInt> *SelectedIndexes = iListBox->SelectionIndexes();
+	TInt currentItem = 0;
+	
+	// Make sure the array is not null (no items)
+	if ( SelectedIndexes && SelectedIndexes->Count() != 0) 
+	{
+		if(aCommand == EAknCmdUnmark)
+			currentItem = iListBox->CurrentItemIndex(); 
+		
+	    // Loop through the selected item indexes
+	    for ( TInt index=0; index < SelectedIndexes->Count(); index++ )
+	    {
+	    	if(currentItem == (*SelectedIndexes)[index] && aCommand == EAknCmdUnmark)
+	    	{
+	    		ChangeIconL(EScriptUnMark,index);
+	    		break;
+	    	}
+	    	else if(aCommand == EAknUnmarkAll)
+	    		ChangeIconL(EScriptUnMark,index);
+	    }
+        HandleMarkCommandL(aCommand);
+	}	
+}
+// -----------------------------------------
+// Handles key events
+// -----------------------------------------
+//
+TKeyResponse CUserEmulatorScriptsView::OfferKeyEventL(const TKeyEvent& aKeyEvent,
+		     										  TEventCode aType)
+{	
+    // Only key events	
+	if (aType == EEventKey)
+    {
+        switch (aKeyEvent.iCode)
+        {
+            case EKeyUpArrow:
+            case EKeyDownArrow:
+                return iListBox->OfferKeyEventL(aKeyEvent, aType);
+
+            case EKeyBackspace:
+                // Don't handle key if shift is pressed
+                if ((aKeyEvent.iModifiers & EModifierShift) == 0)
+                {
+                    return EKeyWasConsumed;
+                }
+                break;
+            default:
+            	break;
+        }
+    }
+    return EKeyWasNotConsumed;
+}
+// -----------------------------------------
+// Handles resource change
+// -----------------------------------------
+//
+void CUserEmulatorScriptsView::HandleResourceChange(TInt aType)
+{
+	TRect rect;
+ 
+    if ( aType==KEikDynamicLayoutVariantSwitch )
+    {    
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, rect);
+        
+        SetRect(rect);
+        static_cast<CUserEmulatorAppUi*>(iCoeEnv->AppUi())->SetApplicationRectInSettings();
+    }
+ 
+	CCoeControl::HandleResourceChange(aType);
+}
+// -----------------------------------------
+// Gets system info details
+// -----------------------------------------
+//
+void CUserEmulatorScriptsView::CmdGetSystemInfoL(TBool aValue)
+{
+    // Operating system version
+    TVersionName versionName = User::Version().Name();
+
+    class THal {
+    public:
+        const TPtrC Machine(TInt aUid) {
+            static const struct SMachine {
+                TInt Uid;
+                const TText* iName;
+            } machine[] = {
+                { 0x101f4fc3, _S("Nokia 7650") },
+                { 0x101f466a, _S("Nokia 3650/3660") },
+                { 0x101f8c19, _S("Nokia N-Gage") },
+                { 0x101fb2b1, _S("Nokia N-Gage QD") },
+                { 0x101fb3f4, _S("Nokia 6260") },
+                { 0x101fb3dd, _S("Nokia 6600") },
+                { 0x101f3ee3, _S("Nokia 6620") },
+                { 0x101fb3f3, _S("Nokia 6670/7610") },
+                { 0x101fbb55, _S("Nokia 6630") },
+                { 0x10200f99, _S("Nokia 6680") },
+                { 0x10200f97, _S("Nokia 3230") },
+                { 0x10200f9b, _S("Nokia 6682") },
+                { 0x10200f9c, _S("Nokia 6681") },
+                { 0x10200f98, _S("N90") },
+                { 0x10200f9a, _S("N70") },
+                { 0x101fa031, _S("Sendo X") },
+                { 0x101f9071, _S("Siemens SX") },
+          
+                { HAL::EMachineUid_Win32Emulator, _S("Win32 emulator") },
+                { 0x00000000, 0 }       // End of array
+              };
+
+            for (TInt i = 0; machine[i].Uid; ++i)
+                if (aUid == machine[i].Uid)
+                    return TPtrC(machine[i].iName);
+
+            return TPtrC(_S("N/A"));
+        }
+
+        const TPtrC Family(TUint aIndex) {
+            const TText* family[] = {
+                            _S("Crystal"),
+                            _S("Pearl"),
+                            _S("Quartz"),
+            };
+
+            if (aIndex < sizeof family / sizeof *family)
+                return TPtrC(family[aIndex]);
+            else
+                return TPtrC(_S("N/A"));
+        }
+
+        const TPtrC Cpu(TUint aIndex) {
+            const TText* cpu[] = {
+                            _S("ARM"),
+                            _S("MCore"),
+                            _S("x86"),
+            };
+
+            if (aIndex < sizeof cpu / sizeof *cpu)
+                return TPtrC(cpu[aIndex]);
+            else
+                return TPtrC(_S("N/A"));
+        }
+
+        const TPtrC StartupReason(TUint aIndex) {
+            const TText* startup[] = {
+                            _S("Cold"),
+                            _S("Warm"),
+                            _S("Fault"),
+            };
+
+            if (aIndex < sizeof startup / sizeof *startup)
+                return TPtrC(startup[aIndex]);
+            else
+                return TPtrC(_S("N/A"));
+        }
+
+    } hal;
+
+    //Get UI Version
+	TVersion UIversion = iEikonEnv->Version();
+	TVersionName UIVersion( UIversion.Name() );
+
+	// Get Machine Id
+    TInt machineUid;
+    TBuf<KBuffer20> machUid;
+    HAL::Get(HAL::EMachineUid, machineUid);
+    machUid.Format(K0x, machineUid);
+
+    // Get Family
+    TInt family;
+    HAL::Get(HAL::EDeviceFamily, family);
+    const TPtrC& familyName = hal.Family(family);
+
+    // Get Family revision
+    TInt familyRev;
+    HAL::Get(HAL::EDeviceFamilyRev, familyRev);
+
+    // Get CPU
+    TInt cpu;
+    HAL::Get(HAL::ECPU, cpu);
+    const TPtrC& cpuName = hal.Cpu(cpu);
+
+    // Get CPU speed
+    TInt cpuSpeed;
+    HAL::Get(HAL::ECPUSpeed, cpuSpeed);
+
+    // Get Startup reason
+    TInt startupReason;
+    HAL::Get(HAL::ESystemStartupReason, startupReason);
+    const TPtrC& startupReasonName = hal.StartupReason(startupReason);
+
+    // Get total RAM
+    TInt ram;
+    HAL::Get(HAL::EMemoryRAM, ram);
+
+    // Get Free RAM
+    TInt ramFree;
+    HAL::Get(HAL::EMemoryRAMFree, ramFree);
+
+    // Get available ROM
+    TInt rom;
+    HAL::Get(HAL::EMemoryROM, rom);
+    
+   
+    //Log system information
+    if(aValue)
+    {
+		_LIT(KSystemHeader, "#Date, Time,OS-Version,UI-Version,Machine ID,IMEI No,Family,CPU,CPUSpeed,Startup reason,RAM,FreeRAM,ROM\n");
+		static_cast<CUserEmulatorAppUi*>(iCoeEnv->AppUi())->Logger().WriteLogL(KSystemHeader, ETrue);
+    }
+    
+    HBufC* title = iCoeEnv->AllocReadResourceLC(R_TEXT_SYSTEM_DETAILS);
+    HBufC* textFormat = iCoeEnv->AllocReadResourceLC(R_FORMAT_SYSTEM_DETAILS);
+    HBufC* text = HBufC::NewLC(KBuffer1024);
+
+    text->Des().Format(*textFormat, &versionName, &UIVersion, &machUid,&iImeiNo, &familyName, familyRev, &cpuName, cpuSpeed / 1000, 
+        &startupReasonName, ram, ram >> 20, ramFree, static_cast<TReal32>(ramFree) / 0x100000, rom, rom >> 20);
+  
+    //Log system information
+    if(aValue)
+    {
+		HBufC* textFormat1 = iCoeEnv->AllocReadResourceLC(R_FORMAT_SYSTEM_DETAILS_FILE);
+		HBufC* text1 = HBufC::NewLC(KBuffer1024);
+		   
+		text1->Des().Format(*textFormat1, &versionName, &UIVersion, &machUid, &iImeiNo, &familyName, familyRev, &cpuName, cpuSpeed / 1000, 
+				&startupReasonName, ram, ram >> 20, ramFree, static_cast<TReal32>(ramFree) / 0x100000, rom, rom >> 20);
+		   
+		static_cast<CUserEmulatorAppUi*>(iCoeEnv->AppUi())->Logger().WriteLogL(text1->Des(), EFalse, ETrue);
+		
+		//Log drive information
+		TVolumeInfo volumeInfo;
+		TInt driveNumber=EDriveA; 
+		TBuf<KBuffer200> buffer;
+		TChar driveLetter;    
+		_LIT(KDriveFormat,"Volume name: %c,Size: %Ld (%Ld MB),Free space: %Ld (%Ld MB)\n");
+		
+		for (driveNumber=EDriveA; driveNumber<EDriveZ; driveNumber++)
+		{
+			TInt err=iEEnv->FsSession().Volume(volumeInfo,driveNumber);
+			if (err!=KErrNotReady) 
+				// Volume() returns KErrNotReady if no volume present.
+				// In this case, check next drive number
+			{
+				User::LeaveIfError(iEEnv->FsSession().DriveToChar(driveNumber,driveLetter));
+				buffer.Zero();			
+				buffer.AppendFormat(KDriveFormat,TUint(driveLetter),volumeInfo.iSize,volumeInfo.iSize >> 20, volumeInfo.iFree, volumeInfo.iFree >> 20);
+				static_cast<CUserEmulatorAppUi*>(iCoeEnv->AppUi())->Logger().WriteLogL(buffer, EFalse, ETrue);
+			}
+		}
+		CleanupStack::PopAndDestroy(2);
+    }
+    // Don't log but display error info details
+    if(!aValue)
+    {
+		CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL(*text);
+		dlg->SetHeaderText(*title);
+		dlg->PrepareLC(R_DIALOG_INFO);
+		dlg->RunLD();
+    }   
+
+    CleanupStack::PopAndDestroy(3);
+}
+
+
+// ----------------------------------------------------------------
+// This function gets called before a new folder is being scanned
+// ----------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::FolderStarting( const TDesC & /*aFullPath*/,
+		                                       TBool /*aIsDriveListFlag*/ )
+{
+	 iFilesArray->Reset();
+}
+// ----------------------------------------------------------------
+// This function gets called with every entry of the currently 
+// scanned folder that is a folder. Not used
+// ----------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::NewFolder( const TDesC & /*aEntry*/ )
+{
+}
+// ----------------------------------------------------------------
+// This function gets called with every entry of the currently 
+// scanned folder that is a plain file.
+// ----------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::NewFile( const TDesC & aEntry )
+{
+	TBuf<KBuffer256> nameBuf;
+	_LIT(KFormatString, "\t%S\t\t");
+	nameBuf.AppendFormat(KFormatString, &aEntry);
+
+	TRAPD(err,iFilesArray->AppendL(nameBuf));	
+	if(err != KErrNone)
+	{
+		//Display error message
+	}
+}
+// ----------------------------------------------------------------
+// This is called after all entries of the currently scanned folder
+// have been delivered. This is NOT called when a scan operation is
+// aborted by starting a new scan before this got called!
+// ----------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::FolderCompleteL()
+{
+	TRAPD(err,ShowFileListL());
+	if(err != KErrNone)
+	{
+		//Display error message
+	}
+	UpdateSystemCba(EFalse);
+	
+	// Notifies the AppUi that listbox is initialised with script name list
+	static_cast<CUserEmulatorAppUi*>(iCoeEnv->AppUi())->FolderScanCompletedL();
+}
+// ------------------------------------------------------------------
+// Called when an unexpected error occures during scanning. Not used
+// ------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::ErrorOccured( TInt /*aReasonCode*/ )
+{
+}
+// ------------------------------------------------------------------
+// Make list box to redraw its items
+// ------------------------------------------------------------------
+//
+void CUserEmulatorScriptsView::ShowFileListL()
+{		
+    iListBox->HandleItemAdditionL( );
+	iListBox->SetFocus(ETrue, EDrawNow);	
+	iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);	
+}
+// ------------------------------------------------------------------------
+// Calls ShowScriptL function because a change occured in the given folder
+// ------------------------------------------------------------------------
+//
+void  CUserEmulatorScriptsView::FileChangeEventL()
+{
+	ShowScriptsL();
+}
+// ------------------------------------------------------------------------
+//  Gets the index of a given script and mark it
+// ------------------------------------------------------------------------
+//
+TInt CUserEmulatorScriptsView::GetScriptIndexAndMarkL(const TDesC8& aScriptName)
+{   
+	TInt ret = -1;
+	TFileName scriptName;
+	scriptName.Copy(aScriptName);
+	// Steps through the file array
+	for(TInt i=0; i < iFilesArray->Count();i++)
+	{   
+	    // Gets i. file name
+		TPtrC fileName = iFilesArray->operator [](i);
+		TFileName script;
+		
+		TInt pos=fileName.LocateF('\t');
+		TPtrC buff;
+		if(pos!=KErrNotFound && pos+1<=fileName.Length())
+			buff.Set(fileName.Mid(pos+1));
+		pos=buff.LocateF('\t');
+		TPtrC fileNamePtr;
+		if(pos!=KErrNotFound)
+			fileNamePtr.Set(buff.Mid(0,pos));
+		script.Copy(fileNamePtr);
+		
+    	// If that's the script we are looking for then
+		if(scriptName.Compare(script) == 0)
+		{
+		    // the result will be it's index
+			ret = i;
+			break;
+		}			
+	}
+	if(ret < GetScriptsCount() && ret!=-1)
+	{
+		iListBox->SetCurrentItemIndex(ret);
+		HandleMarkCommandL(EAknCmdMark);
+	}
+	return ret;
+}
+
+//-------------------CImeiReader---------------------------------------------
+
+// ----------------------------------
+// CImeiReader::NewL
+// ----------------------------------
+//
+CImeiReader* CImeiReader::NewL(MImeiObserver& aObserver)
+    {
+    CImeiReader* self = NewLC(aObserver);
+    CleanupStack::Pop(self);
+    return self;
+    }
+// ----------------------------------
+// CImeiReader::NewL
+// ----------------------------------
+//  
+CImeiReader* CImeiReader::NewLC(MImeiObserver& aObserver)
+    {
+    CImeiReader* self = new (ELeave) CImeiReader(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+    
+// ----------------------------------
+// CImeiReader::CImeiReader
+// ----------------------------------
+//  
+CImeiReader::CImeiReader(MImeiObserver& aObserver)
+:CActive(0),iObserver(aObserver),iIdV1Pkg(iIdV1)
+{
+}
+// ----------------------------------
+// CImeiReader::~CImeiReader
+// ----------------------------------
+// 
+CImeiReader::~CImeiReader()
+{
+	Cancel();
+	delete iTelephony;	
+} 
+// ----------------------------------
+// CImeiReader::ConstructL
+// ----------------------------------
+//
+void CImeiReader::ConstructL()
+{	
+	CActiveScheduler::Add(this);
+	// Create telephony object
+	iTelephony = CTelephony::NewL();
+	iTelephony->GetPhoneId(iStatus,iIdV1Pkg);
+	SetActive();	
+}
+// ----------------------------------
+// CActive class's cancel function
+// ----------------------------------
+//
+void CImeiReader::DoCancel()
+{
+	iTelephony->CancelAsync(CTelephony::EGetPhoneIdCancel);
+}
+// ----------------------------------
+// CActive class's RunL function
+// ----------------------------------
+// 
+void CImeiReader::RunL()
+{
+    // Calls GotIMEI and stores serial number 
+	iObserver.GotIMEI(iIdV1.iSerialNumber,iStatus.Int());
+}
+
+// End of File