creator/src/creator_model.cpp
branchRCL_3
changeset 22 fad26422216a
parent 0 d6fe6244b863
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creator/src/creator_model.cpp	Wed Sep 01 12:30:35 2010 +0100
@@ -0,0 +1,2554 @@
+/*
+* Copyright (c) 2008 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 <cntdb.h>//For Math
+
+#include "creator_model.h"
+#include "creator_traces.h"
+#include "creator_factory.h"
+#include "creator_scriptparser.h"
+#include "creator_appui.h"
+#include "creator_app.h" // KUidCreatorApp
+#include "creator_file.h"
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__)
+  #include "creator_contactsetcache.h"
+#endif
+
+#include <apparc.h>
+#include <eikappui.h>
+#include <eikapp.h>
+#include <bitmaptransforms.h>
+
+_LIT(KTempPathDrive, "d");
+_LIT(KTempPath, ":\\Creator\\");
+_LIT(KSavingText, "Saving");
+_LIT(KDeletingText, "Deleting");
+const TInt KRegisterDrive = EDriveC;
+_LIT(KRegisterFileName, "creator_created_items.dat");
+
+
+// ---------------------------------------------------------------------------
+
+CCreatorEngine* CCreatorEngine::NewL(CCreatorAppUi* aAppUi)
+    {
+    LOGSTRING("Creator: CCreatorEngine::NewL");
+    CCreatorEngine* self = new(ELeave) CCreatorEngine;
+    CleanupStack::PushL(self);
+    self->ConstructL(aAppUi);
+    CleanupStack::Pop();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+
+CCreatorEngine::CCreatorEngine() 
+: 
+CActive(0)
+{}
+
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::ConstructL(CCreatorAppUi* aAppUi)
+    {
+    LOGSTRING("Creator: CCreatorEngine::ConstructL");
+
+    iEnv = CEikonEnv::Static();
+    User::LeaveIfError(iTimer.CreateLocal());
+
+    iAppUi = aAppUi;
+
+    // these are needed by the random data generator
+    TTime now;
+    now.HomeTime();
+    iSeed=now.Int64();
+    
+    iTempPath = HBufC::NewL(KTempPathDrive().Length() + KTempPath().Length());
+    iTempPath->Des().Copy(KTempPathDrive);
+    iTempPath->Des().Append(KTempPath);
+
+    GetRandomDataFromFileL(KNullDesC);
+        
+    CActiveScheduler::Add(this);
+
+    }
+
+// ---------------------------------------------------------------------------
+
+CCreatorEngine::~CCreatorEngine()
+    {
+    LOGSTRING("Creator: CCreatorEngine::~CCreatorEngine");
+
+    Cancel();
+    
+    for( TInt i = 0; i < iStringArrays.Count(); ++i )
+        {
+        delete iStringArrays[i].iArrayPtr;
+        }
+    iStringArrays.Close();
+    iAllocatedFilePaths.ResetAndDestroy();
+    iAllocatedFilePaths.Close();
+    iTimer.Close();
+    
+    delete iPictureFileArray;
+    delete iSoundFileArray;
+    delete iTempPath;
+    delete iFrameImageData;
+    delete iEncoder;
+    delete iScaler;
+    delete iDecoder;
+    delete iScaledBitmap;
+    delete iBitmap;
+    delete iBitmapData;
+    }
+
+void CCreatorEngine::CopyFileL(const TFileName& aSourceFile, const TFileName& aTargetFile, TBool aOverwrite )
+	{
+	if( !aOverwrite && ConeUtils::FileExists(aTargetFile))
+		{
+		// File already exists
+		return;
+		}
+	
+	// Make sure that the path exists. Creates the directory if it does not exist already:
+	ConeUtils::EnsurePathExistsL(aTargetFile);	
+	User::LeaveIfError(BaflUtils::CopyFile(CEikonEnv::Static()->FsSession(), aSourceFile, aTargetFile));
+	}
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::ExecuteFirstCommandL(const TDesC& aText)
+    {
+    LOGSTRING("Creator: CCreatorEngine::ExecuteFirstCommand");
+
+    // init the progress bar
+    iProgressDialog = new(ELeave)CAknProgressDialog((reinterpret_cast<CEikDialog**>(&iProgressDialog)), ETrue);
+    iProgressDialog->SetCallback(this);
+    iProgressDialog->PrepareLC(R_PROGRESS_NOTE);
+    iProgressDialog->SetCurrentLabelL( EAknCtNote, aText );
+    iProgressInfo = iProgressDialog->GetProgressInfoL();
+    iProgressInfo->SetFinalValue( CommandArrayCount() );
+    iProgressDialog->RunLD();
+    iProgressDialog->MakeVisible( ETrue );
+    
+    iFailedCommands = 0;
+
+    // starts executing commands
+    ExecuteCommand();
+    }
+
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::ExecuteCommand()
+    {
+    LOGSTRING("Creator: CCreatorEngine::ExecuteCommand");
+
+    // make sure the engine isn't active, should never happen
+    __ASSERT_ALWAYS(!IsActive(), User::Panic(_L("IsActive"), 500));
+
+    // execute a command after a very short delay (75ms)
+    iTimer.After(iStatus, 75);
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::RunL()
+    {
+    LOGSTRING("Creator: CCreatorEngine::RunL");
+    LOGSTRING2("Creator: CCreatorEngine::RunL iCommandId=%d", iCommandArray->At(iCurrentEntry).iCommandId);
+    
+    if ( iUserCancelled ) return;
+    
+    if (!iCommandArray->At(iCurrentEntry).iParameters)
+        {
+        LOGSTRING("Creator: CCreatorEngine::RunL - iParameters==NULL !");
+        }
+
+    // launch a command
+
+    TCreatorIds cmd = (TCreatorIds)iCommandArray->At(iCurrentEntry).iCommandId; 
+    switch( cmd )
+        {
+	    case ECmdCreateBrowserBookmarkEntries: { iBrowser->CreateBookmarkEntryL(reinterpret_cast<CBrowserParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+	    case ECmdCreateBrowserBookmarkFolderEntries: { iBrowser->CreateBookmarkFolderEntryL(reinterpret_cast<CBrowserParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+	    case ECmdCreateBrowserSavedPageEntries: { iBrowser->CreateSavedDeckEntryL(reinterpret_cast<CBrowserParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+	    case ECmdCreateBrowserSavedPageFolderEntries: { iBrowser->CreateSavedDeckFolderEntryL(reinterpret_cast<CBrowserParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+	    
+        case ECmdCreateCalendarEntryAppointments: { iCalendar->CreateAppointmentEntryL(iCommandArray->At(iCurrentEntry).iParameters); } break;
+	    case ECmdCreateCalendarEntryEvents: { iCalendar->CreateEventEntryL(iCommandArray->At(iCurrentEntry).iParameters); } break;
+	    case ECmdCreateCalendarEntryAnniversaries: { iCalendar->CreateAnniversaryEntryL(iCommandArray->At(iCurrentEntry).iParameters); } break;
+	    case ECmdCreateCalendarEntryToDos: { iCalendar->CreateTodoEntryL(iCommandArray->At(iCurrentEntry).iParameters); } break;
+        case ECmdCreateCalendarEntryReminders: { iCalendar->CreateReminderEntryL(iCommandArray->At(iCurrentEntry).iParameters); } break;
+
+	    
+	    case ECmdCreatePhoneBookEntryContacts: { iPhonebook->CreateContactEntryL(iCommandArray->At(iCurrentEntry).iParameters); } break;
+	    case ECmdCreatePhoneBookEntryGroups: { iPhonebook->CreateGroupEntryL(iCommandArray->At(iCurrentEntry).iParameters); } break;
+	    case ECmdCreatePhoneBookEntrySubscribedContacts: { iPhonebook->CreateSubscribedContactEntryL(iCommandArray->At(iCurrentEntry).iParameters); } break;
+
+	    case ECmdCreateMiscEntryNotes: { iNotepad->CreateNoteEntryL(reinterpret_cast<CNotepadParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+
+	    case ECmdCreateLogEntryMissedCalls: { iLogs->CreateMissedCallEntryL(reinterpret_cast<CLogsParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+	    case ECmdCreateLogEntryReceivedCalls: { iLogs->CreateReceivedCallEntryL(reinterpret_cast<CLogsParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+	    case ECmdCreateLogEntryDialledNumbers: { iLogs->CreateDialledNumberEntryL(reinterpret_cast<CLogsParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+
+        case ECmdCreateMiscEntryAccessPoints: { iAccessPoints->CreateConnectionSettingsEntryL(iCommandArray->At(iCurrentEntry).iParameters); } break;
+        case ECmdDeleteIAPs: { iAccessPoints->DeleteAllL(); } break;
+        case ECmdDeleteCreatorIAPs: { iAccessPoints->DeleteAllCreatedByCreatorL(); } break;
+
+        case ECmdCreateMiscEntryLandmarks: { iLandmarks->CreateLandmarkEntryL(reinterpret_cast<CLandmarkParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+        
+	    case ECmdCreateMessagingEntryMailboxes: { iMailboxes->CreateMailboxEntryL(reinterpret_cast<CMailboxesParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+
+        #ifdef __PRESENCE
+  	     case ECmdCreateMiscEntryIMPSServers: { iIMPS->CreateIMPSServerEntryL(reinterpret_cast<CIMPSParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+        #endif
+
+	    case ECmdCreateMessagingEntryMessages:  { iMessages->CreateMessageEntryL(reinterpret_cast<CMessagesParameters*>(iCommandArray->At(iCurrentEntry).iParameters), ETrue); } break;
+	    case ECmdCreateMessagingEntryMessagesViaScript:  { iMessages->CreateMessageEntryL(reinterpret_cast<CMessagesParameters*>(iCommandArray->At(iCurrentEntry).iParameters)); } break;
+
+	    case ECmdCreateRandomEntrySMSInbox:
+	    case ECmdCreateRandomEntrySMSDrafts:
+	    case ECmdCreateRandomEntrySMSOutbox:
+	    case ECmdCreateRandomEntrySMSSent:
+	    case ECmdCreateRandomEntryMMSInbox:
+	    case ECmdCreateRandomEntryMMSDrafts:
+	    case ECmdCreateRandomEntryMMSOutbox:
+	    case ECmdCreateRandomEntryMMSSent:
+	    case ECmdCreateRandomEntryAMSInbox:
+	    case ECmdCreateRandomEntryAMSDrafts:
+	    case ECmdCreateRandomEntryAMSOutbox:
+	    case ECmdCreateRandomEntryAMSSent:
+	    case ECmdCreateRandomEntryEmailInbox:
+	    case ECmdCreateRandomEntryEmailDrafts:
+	    case ECmdCreateRandomEntryEmailOutbox:
+	    case ECmdCreateRandomEntryEmailSent:
+	    case ECmdCreateRandomEntryBIOInbox:
+	    case ECmdCreateRandomEntryBIODrafts:
+	    case ECmdCreateRandomEntryBIOOutbox:
+	    case ECmdCreateRandomEntryBIOSent:
+	    case ECmdCreateRandomEntryIRInbox:
+	    case ECmdCreateRandomEntryIRDrafts:
+	    case ECmdCreateRandomEntryIROutbox:
+	    case ECmdCreateRandomEntryIRSent:
+	    case ECmdCreateRandomEntryBTInbox:
+	    case ECmdCreateRandomEntryBTDrafts:
+	    case ECmdCreateRandomEntryBTOutbox:
+	    case ECmdCreateRandomEntryBTSent:
+	            { iMessages->CreateRandomMessageEntryL(iCommandArray->At(iCurrentEntry).iCommandId); } break;
+
+        case ECmdCreateFileEntryEmptyFolder:
+        case ECmdCreateFileEntry3GPP_70kB:
+        case ECmdCreateFileEntryAAC_100kB:
+        case ECmdCreateFileEntryAMR_20kB:
+        case ECmdCreateFileEntryBMP_25kB:
+        case ECmdCreateFileEntryDeck_1kB:
+        case ECmdCreateFileEntryDOC_20kB:
+        case ECmdCreateFileEntryGIF_2kB:
+        case ECmdCreateFileEntryHTML_20kB:
+        case ECmdCreateFileEntryJAD_1kB:
+        case ECmdCreateFileEntryJAR_10kB:
+        case ECmdCreateFileEntryJP2_65kB:
+        case ECmdCreateFileEntryJPEG_200kB:
+        case ECmdCreateFileEntryJPEG_25kB:
+        case ECmdCreateFileEntryJPEG_500kB:
+        case ECmdCreateFileEntryMIDI_10kB:
+        case ECmdCreateFileEntryMP3_250kB:
+        case ECmdCreateFileEntryMP4_200kB:
+        case ECmdCreateFileEntryMXMF_40kB:
+        case ECmdCreateFileEntryPNG_15kB:
+        case ECmdCreateFileEntryPPT_40kB:
+        case ECmdCreateFileEntryRAM_1kB:
+        case ECmdCreateFileEntryRM_95kB:
+        case ECmdCreateFileEntryRNG_1kB:
+        case ECmdCreateFileEntrySVG_15kB:
+        case ECmdCreateFileEntrySWF_15kB:
+        case ECmdCreateFileEntryTIF_25kB:
+        case ECmdCreateFileEntryTXT_10kB:
+        case ECmdCreateFileEntryTXT_70kB:
+        case ECmdCreateFileEntryVCF_1kB:
+        case ECmdCreateFileEntryVCS_1kB:
+        case ECmdCreateFileEntryWAV_20kB:
+        case ECmdCreateFileEntryXLS_15kB:
+        case ECmdCreateFileEntrySISX_10kB:
+        case ECmdCreateFileEntryWMA_50kB:
+        case ECmdCreateFileEntryWMV_200kB:
+	            { iFiles->CreateFileEntryL( reinterpret_cast<CFilesParameters*>(iCommandArray->At(iCurrentEntry).iParameters), iCommandArray->At(iCurrentEntry).iCommandId ); } break;
+        case ECmdDeleteContacts:
+            {
+            iPhonebook->DeleteAllL();
+            break;
+            }
+        case ECmdDeleteContactGroups:
+            {
+            iPhonebook->DeleteAllGroupsL();
+            break;            
+            }
+        case ECmdDeleteCreatorContacts:
+            {
+            iPhonebook->DeleteAllCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteCreatorContactGroups:
+            {
+            iPhonebook->DeleteAllGroupsCreatedByCreatorL();
+            break;            
+            }
+        case ECmdDeleteCalendarEntries:
+            {
+            iCalendar->DeleteAllL();
+            break;
+            }
+        case ECmdDeleteCreatorCalendarEntries:
+            {
+            iCalendar->DeleteAllCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteLogs:
+            {
+            iLogs->DeleteAllL();
+            break;
+            }
+        case ECmdDeleteCreatorLogs:
+            {
+            iLogs->DeleteAllCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteMessages:
+            {
+            iMessages->DeleteAllL();
+            break;
+            }
+        case ECmdDeleteCreatorMessages:
+            {
+            iMessages->DeleteAllCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteLandmarks:
+            {
+            iLandmarks->DeleteAllL();
+            break;
+            }
+        case ECmdDeleteCreatorLandmarks:
+            {
+            iLandmarks->DeleteAllCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteMailboxes:
+            {
+            iMailboxes->DeleteAllL();
+            break;
+            }
+        case ECmdDeleteCreatorMailboxes:
+            {
+            iMailboxes->DeleteAllCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteNotes:
+            {
+            iNotepad->DeleteAllL();
+            break;
+            }
+        case ECmdDeleteIMPSs:
+            {
+            iIMPS->DeleteAllL();
+            break;
+            }
+        case ECmdDeleteCreatorIMPSs:
+            {
+            iIMPS->DeleteAllCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteBrowserBookmarks:
+            {
+            iBrowser->DeleteAllBookmarksL();
+            break;
+            }
+        case ECmdDeleteCreatorBrowserBookmarks:
+            {
+            iBrowser->DeleteAllBookmarksCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteBrowserBookmarkFolders:
+            {
+            iBrowser->DeleteAllBookmarkFoldersL();
+            break;
+            }
+        case ECmdDeleteCreatorBrowserBookmarkFolders:
+            {
+            iBrowser->DeleteAllBookmarkFoldersCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteBrowserSavedPages:
+            {
+            iBrowser->DeleteAllSavedPagesL();
+            break;
+            }
+        case ECmdDeleteCreatorBrowserSavedPages:
+            {
+            iBrowser->DeleteAllSavedPagesCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteBrowserSavedPageFolders:
+            {
+            iBrowser->DeleteAllSavedPageFoldersL();
+            break;
+            }
+        case ECmdDeleteCreatorBrowserSavedPageFolders:
+            {
+            iBrowser->DeleteAllSavedPageFoldersCreatedByCreatorL();
+            break;
+            }
+        case ECmdDeleteCreatorFiles:
+            {
+            iFiles->DeleteAllCreatedByCreatorL();
+            break;
+            }
+        default:
+            User::Panic (_L("ExecuteOptionsMenuCommandL"), 205);
+            break;
+        }
+
+    TRAP_IGNORE( CheckForMoreCommandsL() );
+
+    }
+    
+CDesCArrayFlat* CCreatorEngine::PictureFilesL()
+    {
+    if( iPictureFileArray == 0 )
+        {
+        _LIT(KImageFile, "JPEG*.jpg");
+        _LIT(KImageFileDir, "C:\\Data\\");
+        _LIT(KImageFileDir2, "Z:\\Data\\");
+        iPictureFileArray = new (ELeave) CDesCArrayFlat(8);        
+        TInt err = CreatorFileUtils::FindFilesRecursiveL(iPictureFileArray, KImageFile, KImageFileDir);
+        if( iPictureFileArray->Count() == 0 )
+            {
+            err = CreatorFileUtils::FindFilesRecursiveL(iPictureFileArray, KImageFile, KImageFileDir2);
+            }
+        }
+    return iPictureFileArray;
+    }
+
+CDesCArrayFlat* CCreatorEngine::SoundFilesL()
+    {
+    if( iSoundFileArray == 0 )
+        {
+        _LIT(KSoundFile, "*.aac");
+        _LIT(KSoundFileDir, "Z:\\data\\Sounds\\");
+        iSoundFileArray = new (ELeave) CDesCArrayFlat(8);                  
+        TInt err = CreatorFileUtils::FindFilesRecursiveL(iSoundFileArray, KSoundFile, KSoundFileDir);
+        }
+    return iSoundFileArray;
+    }
+// ---------------------------------------------------------------------------
+
+TInt CCreatorEngine::RunError(TInt aError)
+    {
+    LOGSTRING2("Creator: CCreatorEngine::RunError %d", aError);
+    
+    iFailedCommands++;
+    
+    _LIT(KMessage, "Command error %d");
+    TBuf<128> noteMsg;
+    noteMsg.Format(KMessage, aError);
+    iEnv->InfoMsg(noteMsg);
+    
+    TRAP_IGNORE( CheckForMoreCommandsL() );
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::CheckForMoreCommandsL()
+    {
+    LOGSTRING("Creator: CCreatorEngine::CheckForMoreCommandsL");
+    if ( iUserCancelled ) return;
+    // update the progress bar
+    iProgressInfo->IncrementAndDraw(1);
+
+	// check if we have more commands to be executed
+	if (iCurrentEntry >= CommandArrayCount() - 1)
+		{
+        LOGSTRING("Creator: CCreatorEngine::CheckForMoreCommandsL all done");
+
+        // all done, free resources and show a note
+        ShutDownEnginesL();
+
+		iProgressDialog->ProcessFinishedL();
+		
+		if (iFailedCommands == 0)
+		    {
+		    _LIT(KMessage, "Done");
+
+    		CAknConfirmationNote* note = new(ELeave) CAknConfirmationNote;
+    		note->ExecuteLD(KMessage);
+		    }
+		else
+		    {
+		    _LIT(KMessage, "Done, %d commands failed");
+            TBuf<128> noteMsg;
+            noteMsg.Format(KMessage, iFailedCommands);
+            
+    		CAknConfirmationNote* note = new(ELeave) CAknConfirmationNote;
+    		note->ExecuteLD(noteMsg);
+		    }
+		
+	    iAppUi->RunScriptDone();
+
+		}
+	else
+		{
+		// maintain requests
+		iCurrentEntry++;
+
+        LOGSTRING2("Creator: CCreatorEngine::CheckForMoreCommandsL iCurrentEntry=%d", iCurrentEntry);
+
+        ExecuteCommand();
+		}
+    }
+
+// ---------------------------------------------------------------------------
+
+// This callback function is called when cancel button of the progress bar was pressed
+void CCreatorEngine::DialogDismissedL(TInt aButtonId)
+    {
+    LOGSTRING("Creator: CCreatorEngine::DialogDismissedL");
+
+    // check if cancel button was pressed
+    if (aButtonId == EAknSoftkeyCancel)
+        {
+        iUserCancelled = ETrue;
+        // cancel the active object, command executer 
+        Cancel();
+
+        // delete parameters from the command array, otherwise there might be memory leaks
+        for (TInt i=iCurrentEntry; i<CommandArrayCount(); i++)
+            {
+            if ( iCommandArray->At(i).iParameters )
+                delete iCommandArray->At(i).iParameters;
+                iCommandArray->At(i).iParameters = NULL;
+            }
+        
+        if ( iPhonebook && iPhonebook->IsActive() )
+            {
+            // virtual phonebook is known to require asynchronous
+            // cancelling of operation
+            iPhonebook->CancelOperation();
+            }
+        else if ( iDecoder  )
+            {
+            iDecoder->Cancel();
+            // CancelComplete() will be called from GenerateSourceImageFileL
+            }
+        else if ( iScaler )
+            {
+            iScaler->Cancel();
+            // CancelComplete() will be called from GenerateSourceImageFileL
+            }
+        else if ( iEncoder  )
+            {
+            iEncoder->Cancel();
+            // CancelComplete() will be called from GenerateSourceImageFileL
+            }
+        else
+            {
+            // free resources and show a note
+            ShutDownEnginesL();
+
+            CAknInformationNote* note = new (ELeave) CAknInformationNote;
+            note->ExecuteLD(_L("Cancelled"));
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::StartEnginesL()
+    {
+    LOGSTRING("Creator: CCreatorEngine::StartEnginesL");
+    
+    // reset user cancel flag
+    iUserCancelled = EFalse;
+    
+    // start from the beginning
+    iCurrentEntry = 0;
+
+    // we'll retrieve a correct number for this later
+    iEntriesToBeCreated = 0;
+
+    // init the command array
+    __ASSERT_ALWAYS(!iCommandArray, User::Panic(_L("iCommandArray"), 701));
+    iCommandArray = new(ELeave) CCommandArray(10000);
+
+    // init all modules here
+    TInt err(KErrNone);
+    TRAP(err, iBrowser = CCreatorBrowser::NewL(this));
+    TRAP(err, iCalendar = CCreatorInterimCalendar::NewL(this));
+    TRAP(err, iPhonebook = (CCreatorPhonebookBase*)TCreatorFactory::CreatePhoneBookL(this));
+    TRAP(err, iNotepad = CCreatorNotepad::NewL(this));
+    TRAP(err, iLogs = CCreatorLogs::NewL(this));
+    TRAP(err, iAccessPoints = (CCreatorConnectionSettingsBase*)TCreatorFactory::CreateConnectionSettingsL(this));
+    TRAP(err, iMailboxes = CCreatorMailboxes::NewL(this));
+    TRAP(err, iFiles = CCreatorFiles::NewL(this));
+    TRAP(err, iMessages = CCreatorMessages::NewL(this));
+    TRAP(err, iLandmarks = CCreatorLandmarks::NewL(this));
+
+    #ifdef __PRESENCE
+      TRAP(err, iIMPS = CCreatorIMPS::NewL(this));
+    #endif 
+    
+      
+      
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__)     
+    // Initialize contact-set cache:
+   ContactLinkCache::InitializeL();
+#endif
+    // ...
+    // ...
+    // ...
+
+    }
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::ShutDownEnginesL()
+    {
+    LOGSTRING("Creator: CCreatorEngine::ShutDownEnginesL");
+
+        
+    // delete all modules here and free resources which aren't anymore needed
+
+
+    #ifdef __PRESENCE
+     delete iIMPS;
+     iIMPS = NULL;
+    #endif
+
+    delete iMessages;
+    iMessages = NULL;
+    delete iFiles;
+    iFiles = NULL;
+    delete iMailboxes;
+    iMailboxes = NULL;
+    delete iAccessPoints;
+    iAccessPoints = NULL;
+    delete iLogs;
+    iLogs = NULL;
+    delete iNotepad;
+    iNotepad = NULL;
+    delete iPhonebook;
+    iPhonebook = NULL;
+    delete iCalendar;
+    iCalendar = NULL;
+    delete iBrowser;
+    iBrowser = NULL;
+    delete iLandmarks;
+    iLandmarks = NULL;
+    
+    // ...
+    // ...
+    // ...
+
+
+    // now delete the command array
+    delete iCommandArray;
+    iCommandArray = NULL;
+    
+    
+    iParameterArray.ResetAndDestroy();
+    iParameterArray.Close();
+    
+    
+	// clear temp drive
+	CFileMan* fileMan = CFileMan::NewL( iEnv->FsSession() );
+	CleanupStack::PushL( fileMan );
+	fileMan->RmDir( iTempPath->Des() );
+	CleanupStack::PopAndDestroy(); //fileMan
+	
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__)	
+	// Cleanup the contact-set cache:
+	ContactLinkCache::DestroyL();
+#endif    
+	
+    }
+
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::DoCancel()
+    {
+    LOGSTRING("Creator: CCreatorEngine::DoCancel");
+
+    iTimer.Cancel();
+    }
+
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::RunScriptL()
+    {
+    LOGSTRING("Creator: CCreatorEngine::RunScriptL");
+
+    // startup modules (also inits the command array):
+    StartEnginesL();
+
+    // use the command parser module to init the command array from a script file
+    CCommandParser* commandParser = CCommandParser::NewLC(this);
+    RFile scriptFile;
+    TBool ret = commandParser->OpenScriptL(scriptFile);
+    CleanupClosePushL(scriptFile);
+    if( ret )
+        {
+        // wait dialog
+        CAknGlobalNote* waitDialog = CAknGlobalNote::NewLC();
+        waitDialog->SetSoftkeys( R_AVKON_SOFTKEYS_CANCEL );
+        TInt dialogId = waitDialog->ShowNoteL( EAknGlobalWaitNote, _L("Parsing") );
+        
+        TInt parseErr( KErrNone );
+        TRAPD( parserErr,
+               CCreatorScriptParser* scriptParser = CCreatorScriptParser::NewLC(this);
+               scriptParser->ParseL(scriptFile);
+               parseErr = scriptParser->GetError();
+               CleanupStack::PopAndDestroy( scriptParser );
+             );
+        waitDialog->CancelNoteL( dialogId );
+        CleanupStack::PopAndDestroy( waitDialog );
+        User::LeaveIfError( parserErr );
+        
+        if(parseErr != KErrNone)
+            {
+            // show error note
+            CAknErrorNote* note = new (ELeave) CAknErrorNote;
+            _LIT(KErrMsg, "Parser error: %d");
+            TBuf<32> msgBuf;
+            msgBuf.Format(KErrMsg, parseErr);
+            note->ExecuteLD(msgBuf);
+            CleanupStack::PopAndDestroy(); //commandParser   
+            ShutDownEnginesL();
+            return;
+            }         
+        }
+    CleanupStack::PopAndDestroy( &scriptFile );
+    CleanupStack::PopAndDestroy( commandParser );   
+
+    // start executing commands if commands in the command array
+    if (CommandArrayCount() > 0)
+        {
+        ExecuteFirstCommandL( KSavingText );
+        }
+    else
+        {
+        ShutDownEnginesL();
+        }
+
+    }
+/*
+void CCreatorEngine::RunScriptL()
+    {
+    LOGSTRING("Creator: CCreatorEngine::RunScriptL");
+
+    // startup modules (also inits the command array):
+    StartEnginesL();
+
+    // use the command parser module to init the command array from a script file
+    CCommandParser* commandParser = CCommandParser::NewLC(this);
+    commandParser->OpenScriptL();
+
+    CleanupStack::PopAndDestroy(); //commandExecuter
+
+    // start executing commands if commands in the command array
+    if (CommandArrayCount() > 0)
+        {
+        ExecuteFirstCommandL(KSavingText);
+        }
+    else
+        {
+        ShutDownEnginesL();
+        }
+
+    }
+
+*/
+
+// ---------------------------------------------------------------------------
+
+TInt CCreatorEngine::RunScriptL(const TDesC& aScriptFile)
+    {
+    LOGSTRING("Creator: CCreatorEngine::RunScriptL");
+
+    // startup modules (also inits the command array):
+    StartEnginesL();
+
+    RFile scriptFile;
+    if (scriptFile.Open(CEikonEnv::Static()->FsSession(), aScriptFile, EFileRead) != KErrNone)
+    	{
+    	ShutDownEnginesL();
+    	return KErrNotFound; // file error
+    	}
+    
+    CleanupClosePushL(scriptFile);
+    CCreatorScriptParser* scriptParser = CCreatorScriptParser::NewLC(this);
+    scriptParser->ParseL(scriptFile);
+    TInt err = scriptParser->GetError();
+    CleanupStack::PopAndDestroy(); //scriptParser
+    CleanupStack::Pop(); // scriptFile
+    scriptFile.Close();
+        
+    if (err != KErrNone)
+        {
+        ShutDownEnginesL();
+        return KErrCorrupt; // parser error
+        }         
+
+    // start executing commands if commands in the command array
+    if (CommandArrayCount() > 0)
+        {
+        ExecuteFirstCommandL( KSavingText );
+        return KErrNone; // executing commands is started
+        }
+    else
+        {
+        ShutDownEnginesL();
+        return KErrCompletion; // nothing to do
+        }
+    }
+
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::ExecuteOptionsMenuCommandL(TInt aCommand)
+    {
+    LOGSTRING("Creator: CCreatorEngine::ExecuteOptionsMenuCommandL");
+
+    // startup modules (also inits the command array):
+    StartEnginesL();
+
+    // set the home module
+    switch(aCommand)
+        {
+	    case ECmdCreateBrowserBookmarkEntries:
+	    case ECmdCreateBrowserBookmarkFolderEntries:
+	    case ECmdCreateBrowserSavedPageEntries:
+	    case ECmdCreateBrowserSavedPageFolderEntries:
+	    case ECmdDeleteBrowserBookmarks:
+	    case ECmdDeleteBrowserBookmarkFolders:
+	    case ECmdDeleteBrowserSavedPages:
+	    case ECmdDeleteBrowserSavedPageFolders:
+        case ECmdDeleteCreatorBrowserBookmarks:
+        case ECmdDeleteCreatorBrowserBookmarkFolders:
+        case ECmdDeleteCreatorBrowserSavedPages:
+        case ECmdDeleteCreatorBrowserSavedPageFolders:
+            {
+            iUsedOptionsMenuModule = iBrowser;
+            }
+            break;
+	    
+        case ECmdCreateCalendarEntryAppointments:
+	    case ECmdCreateCalendarEntryEvents:
+	    case ECmdCreateCalendarEntryAnniversaries:
+	    case ECmdCreateCalendarEntryToDos:
+	    case ECmdCreateCalendarEntryReminders:
+	    case ECmdDeleteCalendarEntries:
+	    case ECmdDeleteCreatorCalendarEntries:
+            {
+            iUsedOptionsMenuModule = iCalendar;
+            }
+            break;
+
+	    case ECmdCreatePhoneBookEntryContacts:
+	    case ECmdCreatePhoneBookEntryGroups:
+	    case ECmdCreatePhoneBookEntrySubscribedContacts:
+	    case ECmdDeleteContacts:
+	    case ECmdDeleteCreatorContacts:
+        case ECmdDeleteContactGroups:
+        case ECmdDeleteCreatorContactGroups:
+            {
+            iUsedOptionsMenuModule = iPhonebook;
+            }
+            break;
+
+	    case ECmdCreateMiscEntryNotes:
+	    case ECmdDeleteNotes:
+            {
+            iUsedOptionsMenuModule = iNotepad;
+            }
+            break;
+
+	    case ECmdCreateLogEntryMissedCalls:
+	    case ECmdCreateLogEntryReceivedCalls:
+	    case ECmdCreateLogEntryDialledNumbers:
+	    case ECmdDeleteLogs:
+	    case ECmdDeleteCreatorLogs:
+            {
+            iUsedOptionsMenuModule = iLogs;
+            }
+            break;
+
+	    case ECmdCreateMiscEntryAccessPoints:
+	    case ECmdDeleteIAPs:
+	    case ECmdDeleteCreatorIAPs:
+            {
+            iUsedOptionsMenuModule = iAccessPoints;
+            }
+            break;
+
+	    case ECmdCreateMessagingEntryMailboxes:
+	    case ECmdDeleteMailboxes:
+	    case ECmdDeleteCreatorMailboxes:
+            {
+            iUsedOptionsMenuModule = iMailboxes;
+            }
+            break;
+
+        #ifdef __PRESENCE
+	      case ECmdCreateMiscEntryIMPSServers:
+	      case ECmdDeleteIMPSs:
+	      case ECmdDeleteCreatorIMPSs:
+            {
+            iUsedOptionsMenuModule = iIMPS;
+            }
+            break;
+        #endif
+
+	      case ECmdCreateFileEntryEmptyFolder:
+	      case ECmdCreateFileEntry3GPP_70kB:
+	      case ECmdCreateFileEntryAAC_100kB:
+	      case ECmdCreateFileEntryAMR_20kB:
+	      case ECmdCreateFileEntryBMP_25kB:
+	      case ECmdCreateFileEntryDeck_1kB:
+	      case ECmdCreateFileEntryDOC_20kB:
+	      case ECmdCreateFileEntryGIF_2kB:
+	      case ECmdCreateFileEntryHTML_20kB:
+	      case ECmdCreateFileEntryJAD_1kB:
+	      case ECmdCreateFileEntryJAR_10kB:
+	      case ECmdCreateFileEntryJP2_65kB:
+	      case ECmdCreateFileEntryJPEG_200kB:
+	      case ECmdCreateFileEntryJPEG_25kB:
+	      case ECmdCreateFileEntryJPEG_500kB:
+	      case ECmdCreateFileEntryMIDI_10kB:
+	      case ECmdCreateFileEntryMP3_250kB:
+	      case ECmdCreateFileEntryMP4_200kB:
+	      case ECmdCreateFileEntryMXMF_40kB:
+	      case ECmdCreateFileEntryPNG_15kB:
+	      case ECmdCreateFileEntryPPT_40kB:
+	      case ECmdCreateFileEntryRAM_1kB:
+	      case ECmdCreateFileEntryRM_95kB:
+	      case ECmdCreateFileEntryRNG_1kB:
+	      case ECmdCreateFileEntrySVG_15kB:
+	      case ECmdCreateFileEntrySWF_15kB:
+	      case ECmdCreateFileEntryTIF_25kB:
+	      case ECmdCreateFileEntryTXT_10kB:
+	      case ECmdCreateFileEntryTXT_70kB:
+	      case ECmdCreateFileEntryVCF_1kB:
+	      case ECmdCreateFileEntryVCS_1kB:
+	      case ECmdCreateFileEntryWAV_20kB:
+	      case ECmdCreateFileEntryXLS_15kB:
+	      case ECmdCreateFileEntrySISX_10kB:
+	      case ECmdCreateFileEntryWMA_50kB:
+	      case ECmdCreateFileEntryWMV_200kB:
+	      case ECmdDeleteCreatorFiles:
+
+            {
+            iUsedOptionsMenuModule = iFiles;
+            }
+            break;
+
+
+        case ECmdCreateMessagingEntryMessages:
+        case ECmdDeleteMessages:
+        case ECmdDeleteCreatorMessages:
+            {
+            iUsedOptionsMenuModule = iMessages;
+            }
+            break;
+            
+        case ECmdCreateMiscEntryLandmarks:
+        case ECmdDeleteLandmarks:
+        case ECmdDeleteCreatorLandmarks:
+            {
+            iUsedOptionsMenuModule = iLandmarks;
+            }
+            break;
+        case ECmdDeleteAllEntries:
+        case ECmdDeleteAllCreatorEntries:
+            {
+            break;
+            }
+        default:
+            User::Panic (_L("ExecuteOptionsMenuCommandL"), 201);
+            break;
+        }
+
+
+    //If it's a delete command, asking do you really want to delete
+    if( IsDeleteCommand( aCommand ) )
+        {
+        if ( aCommand == ECmdDeleteAllEntries )
+            {
+            if ( YesNoQueryDialogL( _L("Delete all entries?") ) )
+                {
+                AppendToCommandArrayL( ECmdDeleteContacts, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteContactGroups, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCalendarEntries, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteBrowserBookmarks, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteBrowserBookmarkFolders, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteBrowserSavedPages, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteBrowserSavedPageFolders, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteLogs, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteMessages, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteIAPs, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteIMPSs, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteNotes, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteLandmarks, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorFiles, NULL, 1 );
+                
+                // started exucuting delete commands
+                ExecuteFirstCommandL( KDeletingText );
+                }
+            else
+                {
+                // cancelled, free resources
+                ShutDownEnginesL();
+                }
+            }
+        else if ( aCommand == ECmdDeleteAllCreatorEntries )
+            {
+            if ( YesNoQueryDialogL( _L("Delete all entries created with Creator?") ) )
+                {
+                AppendToCommandArrayL( ECmdDeleteCreatorContacts, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorContactGroups, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorCalendarEntries, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorBrowserBookmarks, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorBrowserBookmarkFolders, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorBrowserSavedPages, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorBrowserSavedPageFolders, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorFiles, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorLogs, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorMessages, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorIAPs, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorIMPSs, NULL, 1 );
+                AppendToCommandArrayL( ECmdDeleteCreatorLandmarks, NULL, 1 );
+                
+                // started exucuting delete commands
+                ExecuteFirstCommandL( KDeletingText );
+                }
+            else
+                {
+                // cancelled, free resources
+                ShutDownEnginesL();
+                }
+            }
+        else if ( iUsedOptionsMenuModule->AskDataFromUserL( aCommand, iEntriesToBeCreated )  )
+            {
+            // add this command to command array
+            AppendToCommandArrayL( aCommand, NULL, 1 );
+    
+            // started exucuting commands
+            ExecuteFirstCommandL( KDeletingText );        
+            }
+        else
+            {
+            // cancelled, free resources
+            ShutDownEnginesL();
+            }
+        }
+
+    // ask user data, if query accepted start processing...
+    else if (iUsedOptionsMenuModule->AskDataFromUserL(aCommand, iEntriesToBeCreated))
+        {
+        // add this command to command array
+        AppendToCommandArrayL(aCommand, NULL, iEntriesToBeCreated);
+
+        // started exucuting commands
+        ExecuteFirstCommandL( KSavingText );
+        }
+     else
+        {
+        // cancelled, free resources
+        ShutDownEnginesL();
+        }
+    }
+
+
+
+TBool CCreatorEngine::IsDeleteCommand(TInt aCommand)
+    {
+    LOGSTRING("Creator: CCreatorEngine::IsDeleteCommand");
+
+    switch(aCommand)
+        {
+        //Add supported delete command here        
+        case ECmdDeleteAllEntries:
+        case ECmdDeleteAllCreatorEntries:
+        case ECmdDeleteEntries:
+        case ECmdDeleteContacts:
+        case ECmdDeleteCreatorContacts:
+        case ECmdDeleteContactGroups:
+        case ECmdDeleteCreatorContactGroups:
+        case ECmdDeleteCalendarEntries:
+        case ECmdDeleteCreatorCalendarEntries:
+        case ECmdDeleteBrowserBookmarks:
+        case ECmdDeleteCreatorBrowserBookmarks:
+        case ECmdDeleteBrowserBookmarkFolders:
+        case ECmdDeleteCreatorBrowserBookmarkFolders:
+        case ECmdDeleteBrowserSavedPages:
+        case ECmdDeleteCreatorBrowserSavedPages:
+        case ECmdDeleteBrowserSavedPageFolders:
+        case ECmdDeleteCreatorBrowserSavedPageFolders:
+        case ECmdDeleteCreatorFiles:
+        case ECmdDeleteLogs:
+        case ECmdDeleteCreatorLogs:
+        case ECmdDeleteMessages:
+        case ECmdDeleteCreatorMessages:
+        case ECmdDeleteMailboxes:
+        case ECmdDeleteCreatorMailboxes:
+        case ECmdDeleteIAPs:
+        case ECmdDeleteCreatorIAPs:
+        case ECmdDeleteIMPSs:
+        case ECmdDeleteCreatorIMPSs:
+        case ECmdDeleteNotes:
+        case ECmdDeleteLandmarks:
+        case ECmdDeleteCreatorLandmarks:
+            {
+            return ETrue;
+            }
+        default:
+            {
+            return EFalse;
+            }
+        }
+     
+    }
+
+// ---------------------------------------------------------------------------
+
+TBool CCreatorEngine::GetRandomDataFilenameL(TDes& aFilename)
+	{
+    CCommandParser* commandParser = CCommandParser::NewLC(this);
+	TBool ret = commandParser->GetRandomDataFilenameL(aFilename);
+    CleanupStack::PopAndDestroy(commandParser);
+    return ret;
+	}
+
+// ---------------------------------------------------------------------------
+
+TBool CCreatorEngine::GetRandomDataFromFileL(const TDesC& aFilename)
+	{
+    // wait dialog
+    CAknGlobalNote* waitDialog = CAknGlobalNote::NewLC();
+    waitDialog->SetSoftkeys(R_AVKON_SOFTKEYS_CANCEL);
+    TInt dialogId = waitDialog->ShowNoteL(EAknGlobalWaitNote, _L("Reading random data"));
+
+    for (TInt i = 0; i < iStringArrays.Count(); ++i)
+        {
+        delete iStringArrays[i].iArrayPtr;
+        }
+    iStringArrays.Reset();
+
+    TBool errorDetected = EFalse;
+
+    // NOTE: These must be exactly in same order as in enumeration:
+    
+    if (ReadRandomDataL(EFirstName, R_DATA_FIRSTNAMES, aFilename, CCreatorRandomDataParser::EFirstName) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(ESurname, R_DATA_SURNAMES, aFilename, CCreatorRandomDataParser::ESurname) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(ECompany, R_DATA_COMPANIES, aFilename, CCreatorRandomDataParser::ECompany) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EAddress, R_DATA_ADDRESSES, aFilename, CCreatorRandomDataParser::EAddress) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EJobTitle, R_DATA_JOBTITLES, aFilename, CCreatorRandomDataParser::EJobTitle) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EPhoneNumber, R_DATA_PHONENUMBERS, aFilename, CCreatorRandomDataParser::EPhoneNumber) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EGroupName, R_DATA_GROUPNAMES, aFilename, CCreatorRandomDataParser::EGroupName) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EMeetingReason, R_DATA_MEETINGREASONS, aFilename, CCreatorRandomDataParser::EMeetingReason) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EMeetingPlace, R_DATA_MEETINGPLACES, aFilename, CCreatorRandomDataParser::EMeetingPlace) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EMemoText, R_DATA_MEMOS, aFilename, CCreatorRandomDataParser::EMemoText) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EAnniversaryReason, R_DATA_ANNIVERSARIES, aFilename, CCreatorRandomDataParser::EAnniversaryReason) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EToDoText, R_DATA_TODOS, aFilename, CCreatorRandomDataParser::EToDoText) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EReminderText, R_DATA_REMINDERS, aFilename, CCreatorRandomDataParser::EReminderText) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EMessageSubject, R_DATA_MESSAGESUBJECTS, aFilename, CCreatorRandomDataParser::EMessageSubject) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EMessageText, R_DATA_MESSAGETEXTS, aFilename, CCreatorRandomDataParser::EMessageText) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(ECity, R_DATA_CITIES, aFilename, CCreatorRandomDataParser::ECity) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(ECountry, R_DATA_COUNTRIES, aFilename, CCreatorRandomDataParser::ECountry) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EPostcode, R_DATA_POSTCODES, aFilename, CCreatorRandomDataParser::EPostcode) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EState, R_DATA_STATES, aFilename, CCreatorRandomDataParser::EState) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EPobox, R_DATA_POBOXES, aFilename, CCreatorRandomDataParser::EPobox) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(EPrefix, R_DATA_PREFIXES, aFilename, CCreatorRandomDataParser::EPrefix) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(ESuffix, R_DATA_SUFFIXES, aFilename, CCreatorRandomDataParser::ESuffix) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(ELandmarkName, R_DATA_LANDMARK_NAMES, aFilename, CCreatorRandomDataParser::ELandmarkName) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    if (ReadRandomDataL(ELandmarkDescription, R_DATA_LANDMARK_DESCRIPTIONS, aFilename, CCreatorRandomDataParser::ELandmarkDescription) != KErrNone)
+    	{
+    	errorDetected = ETrue;
+    	}
+    
+    // remove the wait dialog
+    waitDialog->CancelNoteL(dialogId);
+    CleanupStack::PopAndDestroy(waitDialog);
+    
+    if (errorDetected)
+    	{
+		CAknConfirmationNote* note = new(ELeave) CAknConfirmationNote;
+		note->ExecuteLD(_L("Error in reading random data."));
+   	}
+    
+    return !errorDetected;
+	}
+
+// ---------------------------------------------------------------------------
+
+TInt CCreatorEngine::ReadRandomDataL(const TRandomStringType aRandomStringType,
+		                             const TInt aResourceId,
+		                             const TDesC& aFilename,
+		                             const CCreatorRandomDataParser::TRandomDataType aRandomDataType)
+	{
+	TInt error = KErrNone;
+	if (aFilename == KNullDesC)
+		{
+        iStringArrays.AppendL(TStringArrayPtr(aRandomStringType, iEnv->ReadDesCArrayResourceL(aResourceId)));
+		}
+	else
+		{
+	    CCreatorRandomDataParser* dataParser = CCreatorRandomDataParser::NewLC();
+		CDesCArrayFlat* array = NULL;
+	
+		TRAP(error, array = dataParser->ParseL(aFilename, aRandomDataType));
+		if (error == KErrNone)
+			{
+			error = dataParser->GetError();
+			}
+	    if ((error == KErrNone) && (array->MdcaCount() > 0))
+	    	{
+	    	iStringArrays.AppendL(TStringArrayPtr(aRandomStringType, array));
+	    	}
+	    else
+	    	{
+	    	if (array)
+	    		{
+	    		array->Reset();
+	    		delete array;
+	    		}
+	        iStringArrays.AppendL(TStringArrayPtr(aRandomStringType, iEnv->ReadDesCArrayResourceL(aResourceId)));
+	    	}
+		CleanupStack::PopAndDestroy(dataParser);
+		}
+	return error;
+	}
+
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::AppendToCommandArrayL(TInt aCommand, CCreatorModuleBaseParameters* aParameters, TInt aNumberOfEntries)
+    {
+    LOGSTRING("Creator: CCreatorEngine::AppendToCommandArrayL");
+    iParameterArray.AppendL(aParameters);
+
+    for (TInt i=0; i<aNumberOfEntries; i++)
+        iCommandArray->AppendL( TCommand(aCommand, aParameters) );
+    }
+
+// ---------------------------------------------------------------------------
+
+TInt CCreatorEngine::CommandArrayCount()
+    {
+    TInt count(0);
+    
+    if (iCommandArray)
+        count = iCommandArray->Count();
+    
+    LOGSTRING2("Creator: CCreatorEngine::CommandArrayCount returns %d", count);
+    
+    return count;
+    }
+
+// ---------------------------------------------------------------------------
+
+//returs fileid by its name, eg. 1 in 
+TInt CCreatorEngine::GetAttachmentIdL( const TDesC& aAttachmentIdStr ) const
+    {
+    TInt mapCount = sizeof(FileMap) / sizeof(FileMapping);
+    
+    for( TInt i = 0; i < mapCount; ++i )
+        {
+        if( FileMap[i].FileName() == aAttachmentIdStr )
+            return FileMap[i].FileId();
+        }
+    LOGSTRING2("CCreatorEngine::GetAttachmentIdL: Unknown attachment file id: %s", &aAttachmentIdStr);
+    User::Leave(KErrGeneral);
+    return KErrNotFound; // Not reached, but disables a compiler warning
+    }
+
+// ---------------------------------------------------------------------------
+
+// returns a random string from the resource files
+TPtrC CCreatorEngine::TestDataPathL (enum TTestDataPath aTestDataPath )
+    {
+    LOGSTRING("Creator: CCreatorEngine::TestDataPathL");
+
+    TFileName filePath;
+
+    switch (aTestDataPath )
+        {
+        case ESavedDeck_1kB:
+            {
+            filePath.Copy (_L("Deck-1kB.saveddeck") );
+            }
+            break;
+    
+        case EJPEG_25kB:
+            {
+            filePath.Copy (_L("JPEG-25kB.jpg") );
+            }
+            break;
+    
+        case EJPEG_200kB:
+            {
+            filePath.Copy (_L("JPEG-200kB.jpg") );
+            }
+            break;
+    
+        case EJPEG_500kB:
+            {
+            filePath.Copy (_L("JPEG-500kB.jpg") );
+            }
+            break;
+    
+        case EPNG_15kB:
+            {
+            filePath.Copy (_L("PNG-15kB.png") );
+            }
+            break;
+    
+        case EGIF_2kB:
+            {
+            filePath.Copy (_L("GIF-2kB.gif") );
+            }
+            break;
+    
+        case ERNG_1kB:
+            {
+            filePath.Copy (_L("RNG-1kB.rng") );
+            }
+            break;
+    
+        case EMIDI_10kB:
+            {
+            filePath.Copy (_L("MIDI-10kB.mid") );
+            }
+            break;
+    
+        case EWAVE_20kB:
+            {
+            filePath.Copy (_L("WAV-20kB.wav") );
+            }
+            break;
+    
+        case EAMR_20kB:
+            {
+            filePath.Copy (_L("AMR-20kB.amr") );
+            }
+            break;
+    
+        case EExcel_15kB:
+            {
+            filePath.Copy (_L("XLS-15kB.xls") );
+            }
+            break;
+    
+        case EWord_20kB:
+            {
+            filePath.Copy (_L("DOC-20kB.doc") );
+            }
+            break;
+    
+        case EPowerPoint_40kB:
+            {
+            filePath.Copy (_L("PPT-40kB.ppt") );
+            }
+            break;
+    
+        case EText_10kB:
+            {
+            filePath.Copy (_L("TXT-10kB.txt") );
+            }
+            break;
+    
+        case EText_70kB:
+            {
+            filePath.Copy (_L("TXT-70kB.txt") );
+            }
+            break;
+    
+        case E3GPP_70kB:
+            {
+            filePath.Copy (_L("3GPP-70kB.3gpp") );
+            }
+            break;
+    
+        case EMP3_250kB:
+            {
+            filePath.Copy (_L("MP3-250kB.mp3") );
+            }
+            break;
+    
+        case EAAC_100kB:
+            {
+            filePath.Copy (_L("AAC-100kB.aac") );
+            }
+            break;
+    
+        case ERM_95kB:
+            {
+            filePath.Copy (_L("RM-95kB.rm") );
+            }
+            break;
+    
+        case EBMP_25kB:
+            {
+            filePath.Copy (_L("BMP-25kB.bmp") );
+            }
+            break;
+        case EHTML_20kB:
+            {
+            filePath.Copy (_L("HTML-20kB.html") );
+            }
+            break;
+        case EJAD_1kB:
+            {
+            filePath.Copy (_L("JAD-1kB.jad") );
+            }
+            break;
+        case EJAR_10kB:
+            {
+            filePath.Copy (_L("JAR-10kB.jar") );
+            }
+            break;
+        case EJP2_65kB:
+            {
+            filePath.Copy (_L("JP2-65kB.jp2") );
+            }
+            break;
+        case EMP4_200kB:
+            {
+            filePath.Copy (_L("MP4-200kB.mp4") );
+            }
+            break;
+        case EMXMF_40kB:
+            {
+            filePath.Copy (_L("MXMF-40kB.mxmf") );
+            }
+            break;
+        case ERAM_1kB:
+            {
+            filePath.Copy (_L("RAM-1kB.ram") );
+            }
+            break;
+        case ESVG_15kB:
+            {
+            filePath.Copy (_L("SVG-15kB.svg") );
+            }
+            break;
+        case ESWF_15kB:
+            {
+            filePath.Copy (_L("SWF-15kB.swf") );
+            }
+            break;
+        case ETIF_25kB:
+            {
+            filePath.Copy (_L("TIF-25kB.tif") );
+            }
+            break;
+        case EVCF_1kB:
+            {
+            filePath.Copy (_L("VCF-1kB.vcf") );
+            }
+            break;
+        case EVCS_1kB:
+            {
+            filePath.Copy (_L("VCS-1kB.vcs") );
+            }
+            break;
+        case ESISX_10kB:
+            {
+            filePath.Copy (_L("SISX-10kB.sisx") );
+            }
+            break;
+        case EWMA_50kB:
+            {
+            filePath.Copy (_L("WMA-50kB.wma") );
+            }
+            break;
+        case EWMV_200kB:
+            {
+            filePath.Copy (_L("WMV-200kB.wmv") );
+            }
+            break;
+
+        default:
+            User::Panic (_L("Test data"), 401 );
+            break;
+        }
+
+    TFileName fullTargetPath;
+    fullTargetPath.Copy( iTempPath->Des() );
+    fullTargetPath.Append( filePath );
+    if (ConeUtils::FileExists(fullTargetPath))
+        {        
+        // No need to copy, if the file already exists.
+        LOGSTRING2("Creator: CCreatorEngine::TestDataPathL %S already exists", &fullTargetPath);
+        return fullTargetPath;
+        }
+
+    // Define the path where the testdata can be retrieved
+	// get the data from the private directory in secure platform
+    TFileName fullAppPath = iEnv->EikAppUi()->Application()->AppFullName();
+	TChar driveLetter = fullAppPath[0];
+	TInt driveNumber;
+	
+	iEnv->FsSession().CharToDrive(driveLetter, driveNumber);
+	iEnv->FsSession().SetSessionToPrivate( driveNumber );   // "\\private\\20011383\\"
+ 
+
+    // check the file exists
+    if (!ConeUtils::FileExists(filePath))
+        {
+        LOGSTRING2("Creator: CCreatorEngine::TestDataPathL %S not found", &filePath);
+
+        TInt generatingError( KErrNone );
+        
+        // The file could be on C drive
+        iEnv->FsSession().SetSessionToPrivate( KRegisterDrive );
+        
+        if ( !ConeUtils::FileExists( filePath ) )
+            {
+            // The file is not on C drive, see if we can generate it
+            
+            // Make sure that the private path of this app in c-drive exists
+            iEnv->FsSession().CreatePrivatePath( KRegisterDrive );
+            
+            TFileName privatePath;
+            iEnv->FsSession().PrivatePath( privatePath );
+            privatePath.Append( filePath );
+            TChar privateDriveChar;
+            iEnv->FsSession().DriveToChar( KRegisterDrive, privateDriveChar );
+            TFileName fullPrivatePath; // full path of a file to be generated
+            fullPrivatePath.Append( privateDriveChar );
+            fullPrivatePath.Append( ':' );
+            fullPrivatePath.Append( privatePath );
+
+            switch ( aTestDataPath )
+                {
+                case EJPEG_25kB:
+                case EJPEG_200kB:
+                case EJPEG_500kB:
+                case EBMP_25kB:
+                case EGIF_2kB:
+                    {
+                    TRAP( generatingError, GenerateSourceImageFileL( aTestDataPath, fullPrivatePath ) );
+                    // GenerateSourceImageFileL calls TestDataPathL -> private session points to z
+                    // change it back to KRegisterDrive, because generated source file is there
+                    // and we need to copy it at the end of this function.
+                    iEnv->FsSession().SetSessionToPrivate( KRegisterDrive );
+                    break;
+                    }
+                case EText_10kB:
+                    {
+                    TRAP( generatingError, GenereteSourceTextFileL( fullPrivatePath, 10000 ) );
+                    // GenerateSourceImageFileL calls TestDataPathL -> private session points to z
+                    // change it back to KRegisterDrive, because generated source file is there
+                    // and we need to copy it at the end of this function.
+                    iEnv->FsSession().SetSessionToPrivate( KRegisterDrive );
+                    break;
+                    }
+                case EText_70kB:
+                    {
+                    TRAP( generatingError, GenereteSourceTextFileL( fullPrivatePath, 70000 ) );
+                    break;
+                    }
+                default:
+                    {
+                    generatingError = KErrNotSupported;
+                    break;
+                    }
+                }
+            }
+        
+        if ( iUserCancelled )
+            {
+            LOGSTRING("Creator: CCreatorEngine::TestDataPathL iUserCancelled" );
+            User::Leave( KErrCancel );
+            }
+        
+        if ( generatingError )
+            {
+            // Generating the file failed
+            
+            // cancel the dialog
+            iProgressDialog->ProcessFinishedL();
+            DialogDismissedL(EAknSoftkeyBack);
+
+            // show error note
+            CAknErrorNote* note = new (ELeave) CAknErrorNote;
+            note->ExecuteLD(_L("Test data missing"));
+
+            User::Leave(KErrPathNotFound);
+            }
+        }
+
+	// now copy the data to D-drive to make the file public
+	iEnv->FsSession().MkDirAll( iTempPath->Des() );
+	TInt copyErr = BaflUtils::CopyFile(iEnv->FsSession(), filePath, fullTargetPath);
+	LOGSTRING4("Creator: CCreatorEngine::TestDataPathL copy %S to %S returns=%d", &filePath, &fullTargetPath, copyErr);
+	
+	// make sure that the file won't have a read only attribute
+	TEntry fileEntry;
+	iEnv->FsSession().Entry(fullTargetPath, fileEntry);
+	iEnv->FsSession().SetEntry(fullTargetPath, fileEntry.iModified, NULL, KEntryAttReadOnly);
+	
+	filePath = fullTargetPath;  // change the reference to the temp path
+    return filePath;
+    }
+
+// ---------------------------------------------------------------------------
+
+// a generic query which can be used by the modules
+TBool CCreatorEngine::EntriesQueryDialogL(TInt& aNumberOfEntries, const TDesC& aPrompt, TBool aAcceptsZero)
+    {
+    LOGSTRING("Creator: CCreatorEngine::EntriesQueryDialogL");
+
+    CAknNumberQueryDialog* dialog = CAknNumberQueryDialog::NewL(aNumberOfEntries, CAknQueryDialog::ENoTone);
+    dialog->SetMinimumAndMaximum (1, 99999);
+
+    if(dialog->ExecuteLD(R_ENTRY_QUERY, aPrompt))
+        {
+        if (aAcceptsZero)
+            {
+            if (aNumberOfEntries>=0)
+                return ETrue;
+            else
+                return EFalse;
+            }
+        else
+            {
+            if (aNumberOfEntries>0)
+                return ETrue;
+            else
+                return EFalse;
+            }
+        }
+    else
+        return EFalse; // cancelled
+
+
+    }
+
+// ---------------------------------------------------------------------------
+
+// a generic query which can be used by the modules
+TBool CCreatorEngine::TimeQueryDialogL(TTime& aTime, TInt aResourceId)
+    {
+    LOGSTRING("Creator: CCreatorEngine::TimeQueryDialogL");
+
+    CAknTimeQueryDialog* dialog = CAknTimeQueryDialog::NewL(aTime, CAknQueryDialog::ENoTone);
+    return dialog->ExecuteLD(aResourceId);
+    }
+
+// ---------------------------------------------------------------------------
+
+// a generic YES NO query which can be used by the modules
+TBool CCreatorEngine::YesNoQueryDialogL(const TDesC& aPrompt)
+    {
+    LOGSTRING("Creator: CCreatorEngine::YesNoQueryDialogL");
+
+    CAknQueryDialog* dialog = CAknQueryDialog::NewL( );
+    
+    TInt yes = dialog->ExecuteLD(R_YES_NO_DIALOG, aPrompt);    
+
+    return  (TBool)yes;
+
+    }
+
+// ---------------------------------------------------------------------------
+
+
+
+// a method to return a default Internet Access Point
+TUint32 CCreatorEngine::GetDefaultIAPL()
+	{
+    LOGSTRING("Creator: CCreatorEngine::GetDefaultIAPL");
+
+	TUint32 lIAPid = 1; // Default value
+
+	CCommsDatabase* cDatabase = CCommsDatabase::NewL();
+	CleanupStack::PushL(cDatabase);
+
+	CCommsDbTableView* tableView = cDatabase->OpenTableLC(TPtrC(IAP));
+
+	TInt errorCode = tableView->GotoFirstRecord();
+		
+	if ( errorCode == KErrNone ) 
+		{
+		TUint32	iValue;
+		tableView->ReadUintL(TPtrC(COMMDB_ID),iValue);
+		lIAPid = iValue;
+		}
+
+	CleanupStack::PopAndDestroy(2); // cDatabase,tableView
+
+	return lIAPid;
+	}
+
+// ---------------------------------------------------------------------------
+
+TUint32 CCreatorEngine::AccessPointNameToIdL(const TDesC& aAPName, TBool aAnyIfNotFound )
+    {
+    LOGSTRING("Creator: CCreatorEngine::AccessPointNameToIdL");
+    // Accespoint impl moved from engine to accespoint implementations for supporting 3.0-3.1 and 3.2->
+    return iAccessPoints->AccessPointNameToIdL(aAPName, aAnyIfNotFound );
+    }
+
+static CCreatorEngine::TTestDataPath SoundFiles[] = {
+        CCreatorEngine::EMIDI_10kB,
+        CCreatorEngine::EWAVE_20kB,  
+        CCreatorEngine::EMP3_250kB,
+        CCreatorEngine::EAAC_100kB
+        };
+
+static CCreatorEngine::TTestDataPath PictureFiles[] = 
+    {
+    CCreatorEngine::EJPEG_25kB,
+    CCreatorEngine::EJPEG_200kB,
+    CCreatorEngine::EJPEG_500kB,
+    CCreatorEngine::EPNG_15kB,
+    CCreatorEngine::EGIF_2kB
+    };
+
+TPtrC CCreatorEngine::CreateSoundFileL(TTestDataPath aId)
+{
+	TPtrC tempPath(TestDataPathL(aId));
+	// Copy file to permanent location:
+    TParse parser;
+    parser.Set(tempPath, NULL, NULL);
+    TPtrC fileName(parser.NameAndExt());
+    HBufC* fullTargetPath = HBufC::NewLC( KMaxFileName );
+    fullTargetPath->Des().Copy( PathInfo::PhoneMemoryRootPath() );
+    fullTargetPath->Des().Append( PathInfo::DigitalSoundsPath() );
+    
+    fullTargetPath->Des().Append(fileName);
+    CopyFileL(tempPath, *fullTargetPath);
+    iAllocatedFilePaths.AppendL(fullTargetPath);
+    CleanupStack::Pop(); // fullTargetPath
+    return fullTargetPath->Des(); 
+}
+TPtrC CCreatorEngine::CreateRandomSoundFileL()
+{
+    TInt numOfFiles = sizeof(SoundFiles) / sizeof(TTestDataPath);
+    return CreateSoundFileL(SoundFiles[RandomNumber(0, numOfFiles-1)]);
+}
+TPtrC CCreatorEngine::RandomSoundFileL()
+{
+    TInt numOfFiles = sizeof(SoundFiles) / sizeof(TTestDataPath);
+    return TestDataPathL(SoundFiles[RandomNumber(0, numOfFiles-1)]);
+}
+    
+TPtrC CCreatorEngine::RandomPictureFileL()
+{
+    TInt numOfFiles = sizeof(PictureFiles) / sizeof(TTestDataPath);
+    return TestDataPathL(PictureFiles[RandomNumber(0, numOfFiles-1)]);
+}
+// ---------------------------------------------------------------------------
+
+// returns a random string from the resource files
+TPtrC CCreatorEngine::RandomString(enum TRandomStringType aRandomStringType)
+    {
+    LOGSTRING("Creator: CCreatorEngine::RandomString");
+    
+    // Let's see if the array is OK and the string arrays are in correct order:
+    if( ((TInt) aRandomStringType) < iStringArrays.Count() && 
+        iStringArrays[aRandomStringType].iStringType == aRandomStringType)
+        {        
+        TInt rand = (TInt) (iStringArrays[aRandomStringType].iArrayPtr->Count() * Math::FRand(iSeed));
+        return (*iStringArrays[aRandomStringType].iArrayPtr)[rand];
+        }
+    
+    // Now let's loop the arrays and try to find one with the type:
+    for( TInt i = 0; i < iStringArrays.Count(); ++i )
+        {
+        if( iStringArrays[i].iStringType == aRandomStringType )
+            {
+            TInt rand = (TInt) (iStringArrays[i].iArrayPtr->Count() * Math::FRand(iSeed));
+            return (*iStringArrays[i].iArrayPtr)[rand];
+            }
+        }
+
+    User::Panic (_L("Random string"), 402);    
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+
+// returns a random number
+TInt CCreatorEngine::RandomNumber(TInt aRange)
+    {
+    LOGSTRING2("Creator: CCreatorEngine::RandomNumber aRange=%d", aRange);
+
+    return (TInt) (aRange*Math::FRand(iSeed));
+    }
+
+// ---------------------------------------------------------------------------
+
+// returns a random number
+TInt CCreatorEngine::RandomNumber(TInt aMin, TInt aMax)
+    {
+    LOGSTRING3("Creator: CCreatorEngine::RandomNumber aMin=%d aMax=%d", aMin, aMax);
+
+    TInt range = (aMax > aMin ? aMax - aMin : aMin - aMax) + 1;
+    TInt random = (TInt) (range*Math::FRand(iSeed));
+    
+    random = (random % range) + aMin;
+
+    if (random > aMax)
+        random = aMax;
+    else if (random < aMin)
+        random = aMin;
+    
+    return random;
+    }
+
+TTime CCreatorEngine::RandomTime(TTime baseTime, TRandomDateType type, TInt aMinHours, TInt aMaxHours, TInt aMinMinutes, TInt aMaxMinutes )
+    {
+    TInt randomHours = RandomNumber(aMinHours, aMaxHours);
+    TInt randomMinutes = RandomNumber(aMinMinutes, aMaxMinutes);
+    
+    switch( type )
+    {
+    case EDatePast:
+        return (baseTime - TTimeIntervalHours(randomHours)) - TTimeIntervalMinutes(randomMinutes);
+    case EDateFuture:
+        return (baseTime + TTimeIntervalHours(randomHours)) + TTimeIntervalMinutes(randomMinutes);
+    default:
+        break;
+    }
+    return baseTime;
+    }
+
+TTime CCreatorEngine::RandomDate(TTime baseTime, TRandomDateType type, TInt aMinDays, TInt aMaxDays)
+    {
+    TInt random = RandomNumber(aMinDays, aMaxDays);
+    
+    switch( type )
+    {
+    case EDatePast:
+        return baseTime - TTimeIntervalDays(random);
+    case EDateFuture:
+        return baseTime + TTimeIntervalDays(random);
+    default:
+        break;
+    }
+        
+    return baseTime;
+    }
+
+TTime CCreatorEngine::RandomDate(TRandomDateType type, TInt aMinDays, TInt aMaxDays)
+    {    
+    TTime time;
+    // Set to current time:
+    time.HomeTime();
+    return RandomDate(time, type, aMinDays, aMaxDays);
+    }
+
+HBufC* CCreatorEngine::CreateEmailAddressLC()
+    {
+    _LIT(KCountry, "com");    
+    return CreateEmailAddressLC(RandomString(EFirstName), RandomString(ESurname), RandomString(ECompany), KCountry);
+    }
+
+HBufC* CCreatorEngine::CreateHTTPUrlLC()
+    {
+    _LIT(KProtocol, "http://");
+    _LIT(KPrefix, "www");
+    _LIT(KCountry, "com");
+    return CreateUrlLC(KProtocol, KPrefix, RandomString(ECompany), KCountry);
+    }
+
+HBufC* CCreatorEngine::CreateRandomStringLC(TInt aStrLen)
+    {
+    TInt minAscii = 65;
+    TInt maxAscii = 90;
+    HBufC* str = HBufC::NewL(aStrLen);
+    CleanupStack::PushL(str);
+    for( TInt i = 0; i < aStrLen; ++i )
+        {
+        TInt random = RandomNumber(minAscii, maxAscii);
+        TChar randomChar = TChar((TUint) random);
+        str->Des().Append(randomChar);
+        }    
+    return str;
+    }
+
+HBufC* CCreatorEngine::CreateEmailAddressLC(
+        const TDesC& firstname,
+        const TDesC& lastname,
+        const TDesC& domain,
+        const TDesC& country ) const
+        {
+        HBufC* email = HBufC::New(firstname.Length() + lastname.Length() + domain.Length() + country.Length() + 3);
+        CleanupStack::PushL(email);        
+        _LIT(KEmailAddr, "%S.%S@%S.%S");
+        email->Des().Format(KEmailAddr, &firstname, &lastname, &domain, &country);
+        return email;
+        }
+        
+HBufC* CCreatorEngine::CreateUrlLC(
+        const TDesC& protocol,
+        const TDesC& prefix,
+        const TDesC& domain,
+        const TDesC& country) const
+    {
+    HBufC* url = HBufC::New(protocol.Size() + prefix.Size() + domain.Size() + country.Size() + 2);
+    CleanupStack::PushL(url);
+    _LIT(KUrl, "%S%S.%S.%S");
+    url->Des().Format(KUrl, &protocol, &prefix, &domain, &country);    
+    return url;
+    }
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::SetDefaultPathForFileCommandL(TInt aCommand, TFileName& aPath)
+	{
+	aPath.Copy( PathInfo::PhoneMemoryRootPath() );
+	switch (aCommand)
+	{
+	case ECmdCreateFileEntryJPEG_25kB:
+	case ECmdCreateFileEntryJPEG_200kB:
+	case ECmdCreateFileEntryJPEG_500kB:
+	case ECmdCreateFileEntryPNG_15kB:
+	case ECmdCreateFileEntryGIF_2kB:
+	case ECmdCreateFileEntryBMP_25kB:
+	case ECmdCreateFileEntrySVG_15kB:
+	case ECmdCreateFileEntryTIF_25kB:
+	case ECmdCreateFileEntryJP2_65kB:
+
+		{  aPath.Append( PathInfo::ImagesPath() );  break;  }
+
+	case ECmdCreateFileEntryRNG_1kB:
+		{  aPath.Append( PathInfo::SimpleSoundsPath() );  break;  }
+
+	case ECmdCreateFileEntryMIDI_10kB:
+	case ECmdCreateFileEntryWAV_20kB:
+	case ECmdCreateFileEntryAMR_20kB:
+	case ECmdCreateFileEntryMP3_250kB:
+	case ECmdCreateFileEntryAAC_100kB:
+	case ECmdCreateFileEntryWMA_50kB:
+		{  aPath.Append( PathInfo::DigitalSoundsPath() );  break;  }
+
+	case ECmdCreateFileEntry3GPP_70kB:
+	case ECmdCreateFileEntryRM_95kB:
+	case ECmdCreateFileEntryMP4_200kB:
+	case ECmdCreateFileEntryWMV_200kB:
+
+		{  aPath.Append( PathInfo::VideosPath() );  break;  }
+
+	case ECmdCreateFileEntryEmptyFolder:
+		{  aPath.Append( _L("MyFolder\\") );  break;  }
+
+	default:
+		{  aPath.Append( PathInfo::OthersPath() );  break;  }
+
+	}
+	}
+
+
+// ---------------------------------------------------------------------------
+
+void CCreatorEngine::CancelComplete()
+    {
+    LOGSTRING("Creator: CCreatorEngine::CancelComplete");
+    // free resources and show a note
+    TRAP_IGNORE( ShutDownEnginesL() );
+
+    TRAP_IGNORE(
+        CAknInformationNote* note = new (ELeave) CAknInformationNote;
+        note->ExecuteLD(_L("Cancelled"));
+        );
+    }
+
+// ---------------------------------------------------------------------------
+
+TCommand::TCommand(TInt aCommandId, CCreatorModuleBaseParameters* aParameters)
+    {
+    iCommandId = aCommandId;
+    iParameters = aParameters;
+    }
+
+// ---------------------------------------------------------------------------
+
+TCommand::~TCommand()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+
+CAsyncWaiter* CAsyncWaiter::NewL(TInt aPriority)
+	{
+	CAsyncWaiter* self = new(ELeave) CAsyncWaiter(aPriority);
+	return self;
+	}
+
+CAsyncWaiter* CAsyncWaiter::NewLC(TInt aPriority)
+	{
+	CAsyncWaiter* self = new(ELeave) CAsyncWaiter(aPriority);
+	CleanupStack::PushL(self);
+	return self;
+	}
+	
+CAsyncWaiter::CAsyncWaiter(TInt aPriority) : CActive(aPriority)
+	{
+	CActiveScheduler::Add(this);
+	}	
+
+CAsyncWaiter::~CAsyncWaiter()
+	{
+	Cancel();
+	}
+	
+void CAsyncWaiter::StartAndWait()
+	{
+    LOGSTRING("Creator: CAsyncWaiter::StartAndWait");
+
+    iStatus = KRequestPending;
+    SetActive();
+    iWait.Start();
+	}
+	
+TInt CAsyncWaiter::Result() const
+	{
+	return iError;
+	}
+	
+void CAsyncWaiter::RunL()
+	{
+    LOGSTRING("Creator: CAsyncWaiter::RunL");
+
+	iError = iStatus.Int();
+	CAknEnv::StopSchedulerWaitWithBusyMessage( iWait );
+	}
+	
+void CAsyncWaiter::DoCancel()
+	{
+    LOGSTRING("Creator: CAsyncWaiter::DoCancel");
+
+	iError = KErrCancel;
+    if( iStatus == KRequestPending )
+        {
+        TRequestStatus* s=&iStatus;
+        User::RequestComplete( s, KErrCancel );
+        }
+
+    CAknEnv::StopSchedulerWaitWithBusyMessage( iWait );
+	}
+	
+FileMapping::FileMapping( const TDesC& aAttName, TInt aAttId, TInt aCommandId )
+    :
+    iFileName(aAttName),
+    iFileId(aAttId),
+    iCommandId(aCommandId)
+    {}
+
+    const TDesC& FileMapping::FileName() const
+    {
+        return iFileName;
+    }
+
+    TInt FileMapping::FileId() const
+    {
+        return iFileId;
+    }   
+
+    TInt FileMapping::CommandId() const
+    {
+        return iCommandId;
+    }
+    
+// ---------------------------------------------------------------------------  
+CDictionaryFileStore* CCreatorEngine::FileStoreLC()
+    {
+    LOGSTRING("Creator: CCreatorEngine::FileStoreLC");
+    CDictionaryFileStore* store;
+    
+    // make sure that the private path of this app in c-drive exists
+    CEikonEnv::Static()->FsSession().CreatePrivatePath( KRegisterDrive ); // c:\\private\\20011383\\
+
+    // handle register always in the private directory 
+    User::LeaveIfError( CEikonEnv::Static()->FsSession().SetSessionToPrivate( KRegisterDrive ) );
+    store = CDictionaryFileStore::OpenLC( CEikonEnv::Static()->FsSession(), KRegisterFileName, KUidCreatorApp );
+    return store;
+    }
+    
+// ---------------------------------------------------------------------------
+void CCreatorEngine::ReadEntryIdsFromStoreL( RArray<TInt>& aEntryIds, const TUid aModuleUid )
+    {
+    LOGSTRING("Creator: CCreatorEngine::ReadEntryIdsFromStoreL");
+    CDictionaryFileStore* store = FileStoreLC();
+    User::LeaveIfNull( store );
+    if ( store->IsPresentL( aModuleUid ) )
+        {
+        RDictionaryReadStream in;
+        in.OpenLC( *store, aModuleUid );
+        TFileName fullPath;
+        TInt err( KErrNone );
+        TInt id( KErrNotFound );
+        while ( !err )
+            {
+            TRAP( err, id = in.ReadInt32L() );  // will leave with KErrEof
+            if ( !err )
+                {
+                aEntryIds.Append( id );
+                }
+            }
+        CleanupStack::PopAndDestroy( &in );
+        }
+    CleanupStack::PopAndDestroy( store );
+    }
+
+// ---------------------------------------------------------------------------
+void CCreatorEngine::WriteEntryIdsToStoreL( RArray<TInt>& aEntryIds, const TUid aModuleUid )
+    {
+    LOGSTRING("Creator: CCreatorEngine::WriteEntryIdsToStoreL");
+    CDictionaryFileStore* store = FileStoreLC();
+    User::LeaveIfNull( store );
+    
+    // backup previous ids from store
+    // otherwise they would be overwritten when calling out.WriteL
+    RArray<TInt> previousIds;
+    CleanupClosePushL( previousIds );
+    
+    if ( store->IsPresentL( aModuleUid ) )
+        {
+        RDictionaryReadStream in;
+        in.OpenLC( *store, aModuleUid );        
+        TInt err( KErrNone );
+        TInt id( KErrNotFound );
+        while ( !err ) 
+            {
+            TRAP( err, id = in.ReadInt32L() ); // will leave with KErrEof
+            if ( !err )
+                {
+                previousIds.Append( id );
+                }
+            }
+        CleanupStack::PopAndDestroy( &in );
+        }
+    
+    RDictionaryWriteStream out;       
+    out.AssignLC( *store, aModuleUid );
+    
+    // restore previous ids to store
+    for ( TInt i = 0; i < previousIds.Count(); i++ )
+        {
+        out.WriteInt32L( previousIds[i] );            
+        }
+
+    // write new ids to store
+    for ( TInt i = 0; i < aEntryIds.Count(); i++ )
+        {
+        out.WriteInt32L( aEntryIds[i] );        
+        }
+    
+    out.CommitL();
+    CleanupStack::PopAndDestroy( &out );
+    
+    store->CommitL();
+    CleanupStack::PopAndDestroy( &previousIds );
+    CleanupStack::PopAndDestroy( store );
+    }
+
+// ---------------------------------------------------------------------------
+void CCreatorEngine::ReadEntryIdsFromStoreL( RArray<TUint32>& aEntryIds, const TUid aModuleUid )
+    {
+    LOGSTRING("Creator: CCreatorEngine::ReadEntryIdsFromStoreL");
+    CDictionaryFileStore* store = FileStoreLC();
+    User::LeaveIfNull( store );
+    if ( store->IsPresentL( aModuleUid ) )
+        {
+        RDictionaryReadStream in;
+        in.OpenLC( *store, aModuleUid );
+        TFileName fullPath;
+        TInt err( KErrNone );
+        TUint32 id( KErrNone ); 
+        while ( !err )
+            {
+            TRAP( err, id = in.ReadUint32L() );  // will leave with KErrEof
+            if ( !err )
+                {
+                aEntryIds.Append( id );
+                }
+            }
+        CleanupStack::PopAndDestroy( &in );
+        }
+    CleanupStack::PopAndDestroy( store );
+    }
+
+// ---------------------------------------------------------------------------
+void CCreatorEngine::WriteEntryIdsToStoreL( RArray<TUint32>& aEntryIds, const TUid aModuleUid )
+    {
+    LOGSTRING("Creator: CCreatorEngine::WriteEntryIdsToStoreL");
+    CDictionaryFileStore* store = FileStoreLC();
+    User::LeaveIfNull( store );
+    
+    // backup previous ids from store
+    // otherwise they would be overwritten when calling out.WriteL
+    RArray<TUint32> previousIds;
+    CleanupClosePushL( previousIds );
+    
+    if ( store->IsPresentL( aModuleUid ) )
+        {
+        RDictionaryReadStream in;
+        in.OpenLC( *store, aModuleUid );
+        TInt err( KErrNone );
+        TUint32 id( KErrNone );
+        while ( !err ) 
+            {
+            TRAP( err, id = in.ReadUint32L() ); // will leave with KErrEof
+            if ( !err )
+                {
+                previousIds.Append( id );
+                }
+            }
+        CleanupStack::PopAndDestroy( &in );
+        }
+    
+    RDictionaryWriteStream out;       
+    out.AssignLC( *store, aModuleUid );
+    
+    // restore previous ids to store
+    for ( TInt i = 0; i < previousIds.Count(); i++ )
+        {
+        out.WriteUint32L( previousIds[i] );            
+        }
+
+    // write new ids to store
+    for ( TInt i = 0; i < aEntryIds.Count(); i++ )
+        {
+        out.WriteUint32L( aEntryIds[i] );        
+        }
+    
+    out.CommitL();
+    CleanupStack::PopAndDestroy( &out );
+    
+    store->CommitL();
+    CleanupStack::PopAndDestroy( &previousIds );
+    CleanupStack::PopAndDestroy( store );
+    }
+
+// ---------------------------------------------------------------------------
+void CCreatorEngine::RemoveStoreL( const TUid aModuleUid )
+    {
+    LOGSTRING("Creator: CCreatorEngine::RemoveStoreL");
+    CDictionaryFileStore* store = FileStoreLC();
+    User::LeaveIfNull( store );
+    if ( store->IsPresentL( aModuleUid ) )
+        {        
+        // entries of this module should be deleted by now,
+        // remove the Creator internal registry for this module
+        store->Remove( aModuleUid );
+        store->CommitL();
+        }
+    CleanupStack::PopAndDestroy( store );
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorEngine::GenerateSourceImageFileL(
+    const CCreatorEngine::TTestDataPath aFileType,
+    const TDesC& aFileName )
+    {
+    LOGSTRING("Creator: CCreatorEngine::GenerateSourceImageFileL");
+    
+    // Peek file size
+    RFile file;
+    TInt fileSize( 0 );
+    // Using png file as the source file
+    TFileName fileName = TestDataPathL( CCreatorEngine::EPNG_15kB );
+    User::LeaveIfError( file.Open( iEnv->FsSession(),
+                                   fileName,
+                                   EFileRead | EFileShareAny ) );
+    CleanupClosePushL( file );
+    User::LeaveIfError( file.Size( fileSize ) );
+    CleanupStack::PopAndDestroy( &file );
+    
+    // Using heap variables, because bitmaps 
+    // may reserve large amount of memory.
+    
+    // Read data from the file
+    RFileReadStream ws;    
+    User::LeaveIfError( ws.Open( iEnv->FsSession(),
+                                 fileName,
+                                 EFileStream | EFileRead | EFileShareAny ) );
+    CleanupClosePushL( ws );
+    delete iBitmapData;
+    iBitmapData = NULL;
+    iBitmapData = HBufC8::NewL( fileSize );
+    TPtr8 dataPtr = iBitmapData->Des();
+    ws.ReadL( dataPtr, fileSize );
+    CleanupStack::PopAndDestroy( &ws );
+       
+    // Create decoder for the data
+    delete iDecoder;
+    iDecoder = NULL;
+    iDecoder = CImageDecoder::DataNewL( iEnv->FsSession(), dataPtr );
+    iFrameinfo = iDecoder->FrameInfo();
+    
+    // Create bitmap handle for the source image
+    iBitmap = new (ELeave) CFbsBitmap();
+    User::LeaveIfError( iBitmap->Create( iFrameinfo.iFrameCoordsInPixels.Size(), EColor16M ) );
+    
+    // Convert the data from the file into bitmap format (inmemory)  
+    CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
+    iDecoder->Convert( &waiter->iStatus, *iBitmap );
+    waiter->StartAndWait();
+    delete iDecoder;
+    iDecoder = NULL;
+    delete iBitmapData;
+    iBitmapData = NULL;
+    if ( iUserCancelled )
+        {
+        CancelComplete();
+        User::Leave( KErrCancel );
+        }
+    User::LeaveIfError( waiter->Result() );
+    
+    // Define the target dimensions and image quality
+    // so that the generated file size will match required size.
+    // Quality and scaling factors are defined experimentally.
+    delete iScaler;
+    iScaler = NULL;
+    iScaler = CBitmapScaler::NewL();
+    iScaledBitmap = new (ELeave) CFbsBitmap();
+    // use original size as base
+    TSize scaledSize( iFrameinfo.iFrameCoordsInPixels.Size() );
+    delete iFrameImageData;
+    iFrameImageData = NULL;
+    iFrameImageData = CFrameImageData::NewL();
+    TBuf8<64> mimeType;
+    TJpegImageData* jpegImageData( NULL );
+    TBmpImageData* bmpImageData( NULL );
+    switch ( aFileType )
+        {
+        case CCreatorEngine::EJPEG_25kB:
+            // QualityFactor = 93 and size factor = 2 -> 25kB jpeg file
+            mimeType.Copy( _L8("image/jpeg") );
+            jpegImageData = new (ELeave) TJpegImageData;
+            // Set some format specific data
+            jpegImageData->iSampleScheme = TJpegImageData::EColor444;
+            jpegImageData->iQualityFactor = 93; // 0..100
+            // ownership passed to iFrameImageData after AppendImageData
+            User::LeaveIfError( iFrameImageData->AppendImageData( jpegImageData ) );
+            scaledSize.iHeight *= 2;
+            scaledSize.iWidth *= 2;
+            break;
+        case CCreatorEngine::EJPEG_200kB:
+            {
+            mimeType.Copy( _L8("image/jpeg") );
+            jpegImageData = new (ELeave) TJpegImageData;
+            // Set some format specific data
+            jpegImageData->iSampleScheme = TJpegImageData::EColor444;
+#ifdef __WINS__
+            // QualityFactor = 95 and size factor = 7 -> 196kB jpeg file
+            jpegImageData->iQualityFactor = 95; // 0..100
+            scaledSize.iHeight *= 7;
+            scaledSize.iWidth *= 7;
+#else
+            // In hw the image compression seems to work
+            // more efficiently. Need to set greater values.
+            jpegImageData->iQualityFactor = 100; // 0..100
+            scaledSize.iHeight *= 7;
+            scaledSize.iWidth *= 7;
+            // 100, 7, 7 -> 213kB
+#endif
+            // ownership passed to iFrameImageData after AppendImageData
+            User::LeaveIfError( iFrameImageData->AppendImageData( jpegImageData ) );
+            break;
+            }
+        case CCreatorEngine::EJPEG_500kB:
+            {
+            mimeType.Copy( _L8("image/jpeg") );
+            jpegImageData = new (ELeave) TJpegImageData;
+            // Set some format specific data
+            jpegImageData->iSampleScheme = TJpegImageData::EColor444;
+#ifdef __WINS__
+            // QualityFactor = 99 and size factor = 8 -> 514kB jpeg file
+            jpegImageData->iQualityFactor = 99; // 0..100
+            scaledSize.iHeight *= 8;
+            scaledSize.iWidth *= 8;
+#else
+            // In hw the image compression seems to work
+            // more efficiently. Need to set greater values. 
+            jpegImageData->iQualityFactor = 100; // 0..100
+            scaledSize.iHeight *= 13;
+            scaledSize.iWidth *= 13;
+            // 100, 13, 13 -> 535kB
+#endif
+            // ownership passed to iFrameImageData after AppendImageData
+            User::LeaveIfError( iFrameImageData->AppendImageData( jpegImageData ) );
+            break;
+            }
+        case CCreatorEngine::EBMP_25kB:
+            {
+            // bit depyh 8 and 11/10 size factor -> 25kB bmp
+            mimeType.Copy( _L8("image/bmp") );
+            bmpImageData = new (ELeave) TBmpImageData;
+            bmpImageData->iBitsPerPixel = 8;
+            // ownership passed to iFrameImageData after AppendImageData
+            User::LeaveIfError( iFrameImageData->AppendImageData( bmpImageData ) );
+            scaledSize.iHeight *= 11;
+            scaledSize.iWidth *= 11;
+            scaledSize.iHeight /= 10;
+            scaledSize.iWidth /= 10;
+            break;
+            }
+        case CCreatorEngine::EGIF_2kB:
+            {
+            // size factor 1/2 -> 2560B gif
+            mimeType.Copy( _L8("image/gif") );
+            // GIF encoder is not configurable, only the size matters here
+            scaledSize.iHeight /= 2;
+            scaledSize.iWidth /= 2;
+            break;
+            }
+        default: break;
+        }
+
+    // Scale to reach target size
+    User::LeaveIfError( iScaledBitmap->Create( scaledSize, EColor16M ) );
+    iScaler->Scale( &waiter->iStatus, *iBitmap, *iScaledBitmap );
+    waiter->StartAndWait();
+    delete iBitmap;
+    iBitmap = NULL;
+    delete iScaler;
+    iScaler = NULL;
+    if ( iUserCancelled )
+        {
+        CancelComplete();
+        User::Leave( KErrCancel );
+        }
+    User::LeaveIfError( waiter->Result() );
+    
+    // Encode to target format
+    delete iEncoder;
+    iEncoder = NULL;
+    // Creating CImageEncoder opens the target file
+    iEncoder = CImageEncoder::FileNewL( iEnv->FsSession(), aFileName, mimeType );
+
+    // Do the conversion to target format, this will write to the file
+    iEncoder->Convert( &waiter->iStatus, *iScaledBitmap, iFrameImageData );
+    waiter->StartAndWait();
+    delete iEncoder;
+    iEncoder = NULL;
+    delete iFrameImageData;
+    iFrameImageData = NULL;
+    delete iScaledBitmap;
+    iScaledBitmap = NULL;
+    if ( iUserCancelled )
+        {
+        CancelComplete();
+        User::Leave( KErrCancel );
+        }
+    User::LeaveIfError( waiter->Result() );
+    CleanupStack::PopAndDestroy( waiter );
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorEngine::GenereteSourceTextFileL( const TDesC& aFileName, TInt aSize )
+    {
+    LOGSTRING("Creator: CCreatorEngine::GenereteSourceTextFileL");
+    RFile txtFile;
+    _LIT8( KTestContent, "Testing... ");
+    _LIT8( KTestContentCRLF, "\r\n");
+    txtFile.Create( iEnv->FsSession(),
+                    aFileName,
+                    EFileStreamText | EFileWrite | EFileShareAny );
+    CleanupClosePushL( txtFile );
+    for ( TInt i = 1; i*KTestContent().Length() < aSize; i++ )
+        {
+        User::LeaveIfError( txtFile.Write( KTestContent ) );
+        if ( !( i % 10 ) ) // linefeed for every 10th
+            {
+            User::LeaveIfError( txtFile.Write( KTestContentCRLF ) );
+            }
+        }
+    CleanupStack::PopAndDestroy( &txtFile );
+    }