diff -r 48060abbbeaf -r b3cee849fa46 creator/src/engine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/creator/src/engine.cpp Tue Aug 31 15:15:20 2010 +0300 @@ -0,0 +1,2617 @@ +/* +* Copyright (c) 2010 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 +#include +#include + +#include + +#include + +#include "mainview.h" +#include "engine.h" +#include "enginewrapper.h" + + +#include //For Math + +#include "creator_scriptentry.h" +#include "creator_modulebase.h" +//#include "creator_browser.h" +#include "creator_calendar.h" +#include "creator_phonebookbase.h" +#include "creator_note.h" +#include "creator_log.h" +//#include "creator_connectionmethodbase.h" +#include "creator_mailbox.h" +//#include "creator_imps.h" +#include "creator_message.h" +#include "creator_landmark.h" + + +#include "creator_traces.h" +#include "creator_factory.h" +#include "creator_scriptparser.h" +#include "creator_file.h" +#include "creator_cmdscriptrun.h" +#include "creator_contactsetcache.h" + +#include +#include +#include +#include + +_LIT(KEDriveError, "Not available"); +_LIT(KTempPathDrive, "d"); +_LIT(KTempPath, ":\\Creator\\"); +const TInt KRegisterDrive = EDriveC; +_LIT(KRegisterFileName, "creator_created_items.dat"); +_LIT(KResourceFileName, "z:\\Resource\\apps\\datacreator.RSC"); + + +// --------------------------------------------------------------------------- + +CCreatorEngine* CCreatorEngine::NewL(EngineWrapper *aEngineWrapper) + { + CCreatorEngine* self = CCreatorEngine::NewLC(aEngineWrapper); + CleanupStack::Pop(); // self; + return self; + } + +// --------------------------------------------------------------------------- + +CCreatorEngine* CCreatorEngine::NewLC(EngineWrapper *aEngineWrapper) + { + CCreatorEngine* self = new (ELeave) CCreatorEngine(); + CleanupStack::PushL(self); + self->ConstructL(aEngineWrapper); + return self; + } + +// --------------------------------------------------------------------------- + +CCreatorEngine::CCreatorEngine() +: +CActive(0) +{} + +// --------------------------------------------------------------------------- + +void CCreatorEngine::ConstructL(EngineWrapper *aEngineWrapper) + { + LOGSTRING("Creator: CCreatorEngine::ConstructL"); + + iEngineWrapper = aEngineWrapper; + iMemoryDetails.iENotAvailable = EFalse; + RequestMemoryDetails(); + iEnv = CEikonEnv::Static(); + // add second resource file to use for creator random data generation: + iResourceFileId = iEnv->AddResourceFileL(KResourceFileName); + User::LeaveIfError(iTimer.CreateLocal()); + + // 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); + + iCmdScriptRun = CCreatorCmdScriptRun::NewL(this); + + 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(); + + + iEnv->DeleteResourceFile(iResourceFileId); + + iMemoryDetailsList.Reset(); + delete iPictureFileArray; + delete iSoundFileArray; + delete iTempPath; + delete iFrameImageData; + delete iEncoder; + delete iScaler; + delete iDecoder; + delete iScaledBitmap; + delete iBitmap; + delete iBitmapData; + + delete iCmdScriptRun; + iCmdScriptRun = NULL; + + delete iCommandParser; + } + +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::RequestMemoryDetails() + { + + TDriveList dl; + // variables for memory and disk handling + TVolumeInfo vinfo; + + //************************************************************************* + + //************************************************************************* + // get an access to file server + RFs& fsSession = CEikonEnv::Static()->FsSession(); + + fsSession.DriveList(dl); + + for(TInt driveNum = EDriveC; driveNum <= EDriveZ ; driveNum ++ ) + { + if( dl[driveNum] ) + { + TMemoryDetails *memDet = new TMemoryDetails; + if(fsSession.Volume(vinfo, driveNum) == KErrNone) + { + memDet->iFree.Num(TInt64(vinfo.iFree/1024)); + memDet->iSize.Num(TInt64(vinfo.iSize/1024)); + } + else + { + memDet->iFree.Num( 0 ); + memDet->iSize.Num( 0 ); + } + User::LeaveIfError(fsSession.DriveToChar(driveNum,memDet->iDriveLetter)); + iMemoryDetailsList.AppendL( memDet ); + } + } + + // available work memory + TMemoryInfoV1Buf memory; + UserHal::MemoryInfo(memory); + TInt64 freeMemBytes=(TInt64)(memory().iFreeRamInBytes); + TInt64 sizeMemBytes=(TInt64)(memory().iTotalRamInBytes); + TInt64 sizeWorkMemBytes = sizeMemBytes; + TInt64 sizeRomBytes = (TInt64)(memory().iTotalRomInBytes); + iMemoryDetails.iRamFree.Num(TInt64(freeMemBytes/1024)); + iMemoryDetails.iRamSize.Num(TInt64(sizeWorkMemBytes/1024)); + iMemoryDetails.iRomSize.Num(TInt64(sizeRomBytes/1024)); + } + +// --------------------------------------------------------------------------- + +TBool CCreatorEngine::MMC_OK() const + { + TBool MMCstatus = EFalse; + + TDriveNumber eDrive=EDriveE; + TVolumeInfo vinfo; + TInt err = CEikonEnv::Static()->FsSession().Volume(vinfo, eDrive); + // check if we can access the E-drive: + if ( err == KErrNone) + { + MMCstatus = ETrue; + } + else + { + MMCstatus = EFalse; + } + + // returns ETrue if MMC working properly + return MMCstatus; + } + +// --------------------------------------------------------------------------- + +void CCreatorEngine::ExecuteFirstCommandL(const TDesC& aText) + { + LOGSTRING("Creator: CCreatorEngine::ExecuteFirstCommand"); + + if( !iCommandArray->Count()) + { + ShutDownEnginesL(); + return; + } + + // show a progress dialog + iEngineWrapper->ShowProgressBar(aText, CommandArrayCount()); + + 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(iCommandArray->At(iCurrentEntry).iParameters)); } break; + case ECmdCreateBrowserBookmarkFolderEntries: { iBrowser->CreateBookmarkFolderEntryL(reinterpret_cast(iCommandArray->At(iCurrentEntry).iParameters)); } break; + case ECmdCreateBrowserSavedPageEntries: { iBrowser->CreateSavedDeckEntryL(reinterpret_cast(iCommandArray->At(iCurrentEntry).iParameters)); } break; + case ECmdCreateBrowserSavedPageFolderEntries: { iBrowser->CreateSavedDeckFolderEntryL(reinterpret_cast(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(iCommandArray->At(iCurrentEntry).iParameters)); } break; + + case ECmdCreateLogEntryMissedCalls: { iLogs->CreateMissedCallEntryL(reinterpret_cast(iCommandArray->At(iCurrentEntry).iParameters)); } break; + case ECmdCreateLogEntryReceivedCalls: { iLogs->CreateReceivedCallEntryL(reinterpret_cast(iCommandArray->At(iCurrentEntry).iParameters)); } break; + case ECmdCreateLogEntryDialledNumbers: { iLogs->CreateDialledNumberEntryL(reinterpret_cast(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(iCommandArray->At(iCurrentEntry).iParameters)); } break; + + case ECmdCreateMessagingEntryMailboxes: { iMailboxes->CreateMailboxEntryL(reinterpret_cast(iCommandArray->At(iCurrentEntry).iParameters)); } break; +/* + #ifdef __PRESENCE + case ECmdCreateMiscEntryIMPSServers: { iIMPS->CreateIMPSServerEntryL(reinterpret_cast(iCommandArray->At(iCurrentEntry).iParameters)); } break; + #endif +*/ + case ECmdCreateMessagingEntryMessages: { iMessages->CreateMessageEntryL(reinterpret_cast(iCommandArray->At(iCurrentEntry).iParameters), ETrue); } break; + case ECmdCreateMessagingEntryMessagesViaScript: { iMessages->CreateMessageEntryL(reinterpret_cast(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(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); + iEngineWrapper->ShowNote(noteMsg); + TRAP_IGNORE( CheckForMoreCommandsL() ); + + return KErrNone; + } + +// --------------------------------------------------------------------------- + +void CCreatorEngine::CheckForMoreCommandsL() + { + LOGSTRING("Creator: CCreatorEngine::CheckForMoreCommandsL"); + if ( iUserCancelled ) + { + return; + } + // update the progress bar + //iProgressInfo->IncrementAndDraw(1); + iEngineWrapper->IncrementProgressbarValue(); + + // 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(); + + // remove the progress dialog from the screen + iEngineWrapper->CloseProgressbar(); + //ProgressDialogCancelledL(); + + if (iFailedCommands == 0) + { + iEngineWrapper->ShowNote(_L("Done")); + } + else + { + _LIT(KMessage, "Done, %d commands failed"); + TBuf<128> noteMsg; + noteMsg.Format(KMessage, iFailedCommands); + iEngineWrapper->ShowNote(noteMsg); + } + + iCmdScriptRun->RunScriptDone(); + + } + else + { + // maintain requests + iCurrentEntry++; + + LOGSTRING2("Creator: CCreatorEngine::CheckForMoreCommandsL iCurrentEntry=%d", iCurrentEntry); + + ExecuteCommand(); + } + } + +// --------------------------------------------------------------------------- +void CCreatorEngine::SortCommands() + { + TKeyArrayFix iBufKey(_FOFF(TCommand, iCommandId),ECmpTInt); + iCommandArray->Sort(iBufKey); + } +// --------------------------------------------------------------------------- + +// This callback function is called when cancel button of the progress bar was pressed + +void CCreatorEngine::ProgressDialogCancelledL() + { + LOGSTRING("Creator: CCreatorEngine::ProgressDialogCancelledL"); + + 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; iAt(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 + } + 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(); + iEngineWrapper->ShowNote(_L("Cancelled")); + } + + } + +// --------------------------------------------------------------------------- + +void CCreatorEngine::StartEnginesL() + { + LOGSTRING("Creator: CCreatorEngine::StartEnginesL"); + + // reset user cancel flag + iUserCancelled = EFalse; + + // start from the beginning + iCurrentEntry = 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)); + ContactLinkCache::InitializeL(); +/* + #ifdef __PRESENCE + TRAP(err, iIMPS = CCreatorIMPS::NewL(this)); + #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; + + ContactLinkCache::DestroyL(); + // now delete the command array + delete iCommandArray; + iCommandArray = NULL; + + // delete parameter array + iParameterArray.ResetAndDestroy(); + iParameterArray.Close(); + + if(iCommandParser) + { + delete iCommandParser; + iCommandParser = NULL; + } + + + // clear temp drive + CFileMan* fileMan = CFileMan::NewL( iEnv->FsSession() ); + CleanupStack::PushL( fileMan ); + fileMan->RmDir( iTempPath->Des() ); + CleanupStack::PopAndDestroy(); //fileMan + } + +// --------------------------------------------------------------------------- + +void CCreatorEngine::DoCancel() + { + LOGSTRING("Creator: CCreatorEngine::DoCancel"); + + iTimer.Cancel(); + } + +void CCreatorEngine::ScriptChosenL( TBool aSuccess, const TDesC& aFileName ) + { + if( aSuccess ) + { + // open the file for reading + RFile scriptFile; + User::LeaveIfError( scriptFile.Open( iEnv->FsSession(), aFileName, EFileRead ) ); + CleanupClosePushL(scriptFile); + + + // wait dialog + /* TODO + CAknGlobalNote* waitDialog = CAknGlobalNote::NewLC(); + waitDialog->SetSoftkeys( R_AVKON_SOFTKEYS_CANCEL ); + TInt dialogId = waitDialog->ShowNoteL( EAknGlobalWaitNote, _L("Parsing") ); + */ + TInt parseErr( KErrNone ); + CCreatorScriptParser* scriptParser = CCreatorScriptParser::NewLC(this); + scriptParser->ParseL(scriptFile); + parseErr = scriptParser->GetError(); + CleanupStack::PopAndDestroy( scriptParser ); + + CleanupStack::PopAndDestroy( &scriptFile ); + + //waitDialog->CancelNoteL( dialogId ); + //CleanupStack::PopAndDestroy( waitDialog ); + + if(parseErr != KErrNone) + { + // show error note + _LIT(KErrMsg, "Parser error: %d"); + TBuf<32> msgBuf; + msgBuf.Format(KErrMsg, parseErr); + iEngineWrapper->ShowErrorMessage(msgBuf); + ShutDownEnginesL(); + return; + } + } + + // 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 + delete iCommandParser; + iCommandParser = NULL; + iCommandParser = CCommandParser::NewL(this); + TBool ret = EFalse; + TRAPD(err, ret = iCommandParser->OpenScriptL( this ) ); + if( err != KErrNone || ret == EFalse) + { + ShutDownEnginesL(); + User::LeaveIfError(err); + } + } + +// --------------------------------------------------------------------------- + +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::QueryDialogClosedL( TBool aPositiveAction, TInt aUserData ) + { + LOGSTRING("Creator: CCreatorEngine::QueryDialogClosedL"); + + if( aPositiveAction == EFalse ) + { + ShutDownEnginesL(); + return; + } + + switch(aUserData) + { + case ECreatorEngineDeleteAllEntries: + 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 ); + break; + case ECreatorEngineDeleteAllCreatorEntries: + 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 ); + break; + default: + //some error + ShutDownEnginesL(); + break; + } + } + +// --------------------------------------------------------------------------- + +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 ( !iEngineWrapper->YesNoQueryDialog( _L("Delete all entries?"), this, ECreatorEngineDeleteAllEntries) ) + { + // cancelled, free resources + ShutDownEnginesL(); + } + } + else if ( aCommand == ECmdDeleteAllCreatorEntries ) + { + if ( !iEngineWrapper->YesNoQueryDialog( _L("Delete all entries created with Creator?"), this, ECreatorEngineDeleteAllCreatorEntries ) ) + { + // cancelled, free resources + ShutDownEnginesL(); + } + } + else if ( !iUsedOptionsMenuModule->AskDataFromUserL( aCommand ) ) + { + // cancelled or error, free resources + ShutDownEnginesL(); + } + } + + // ask user data, if query accepted start processing... + else if (!iUsedOptionsMenuModule->AskDataFromUserL(aCommand)) + { + // cancelled or error, 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; + } + } + + } +// --------------------------------------------------------------------------- +void CCreatorEngine::RandomDataFileChosenL( TBool aSuccess, const TDesC& aFileName ) + { + if( aSuccess ) + { + GetRandomDataFromFileL( aFileName ); + } + } + +// --------------------------------------------------------------------------- + +TBool CCreatorEngine::GetRandomDataL() + { + delete iCommandParser; + iCommandParser = NULL; + iCommandParser = CCommandParser::NewL( this ); + return iCommandParser->GetRandomDataFilenameL( this ); + } + +// --------------------------------------------------------------------------- + +TBool CCreatorEngine::GetRandomDataFromFileL(const TDesC& aFilename) + { + // wait dialog + // TODO + //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) + { + iEngineWrapper->ShowNote(_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; iAppendL( 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"); + + static 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); + + // remove the progress dialog from the screen + iEngineWrapper->CloseProgressbar(); + + + // show error note + iEngineWrapper->ShowNote(_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 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 ); + return 0; + } + +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)]); +} + +void CCreatorEngine::RandomPictureFileL(TDes& aPath) +{ + TInt numOfFiles = sizeof(PictureFiles) / sizeof(TTestDataPath); + aPath = 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(iEngineWrapper->ShowNote(_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 ); + iWait.AsyncStop(); + } + +void CAsyncWaiter::DoCancel() + { + LOGSTRING("Creator: CAsyncWaiter::DoCancel"); + + iError = KErrCancel; + if( iStatus == KRequestPending ) + { + TRequestStatus* s=&iStatus; + User::RequestComplete( s, KErrCancel ); + } + iWait.AsyncStop(); + //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& 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& 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 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& 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& 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 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 ); + } + +//----------------------------------------------------------------------------