diff -r b3cee849fa46 -r fad26422216a filebrowser/engine/FBFileUtils.cpp --- a/filebrowser/engine/FBFileUtils.cpp Tue Aug 31 15:15:20 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4761 +0,0 @@ -/* -* 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 FILES -#include "FBFileUtils.h" -#include "FBFileOps.h" -#include "engine.h" -#include "FB.hrh" -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#if (!defined __SERIES60_30__ && !defined __SERIES60_31__) -#include -#endif // !defined __SERIES60_30__ && !defined __SERIES60_31__ - -#ifndef __SERIES60_30__ -// #include -#endif - -//_LIT(KGZipExt, ".gz"); -_LIT8(KFileNewLine, "\r\n"); -const TInt KForcedFormatTimeout = 1000000; - -// copied from coreapplicationuisdomainpskeys.h -const TUid KPSUidCoreApplicationUIs = { 0x101F8767 }; -const TUint32 KCoreAppUIsMmcRemovedWithoutEject = 0x00000109; -enum TCoreAppUIsMmcRemovedWithoutEject - { - ECoreAppUIsEjectCommandUsedUninitialized = 0, - ECoreAppUIsEjectCommandNotUsed, - ECoreAppUIsEjectCommandUsed, - ECoreAppUIsEjectCommandUsedToDrive // Low 16-bits contain this value and high 16-bits TDriveNumber to eject - }; -const TInt KDriveLetterStringLength = 3; // e.g. C:\ - -// ================= MEMBER FUNCTIONS ======================= - -CFileBrowserFileUtils* CFileBrowserFileUtils::NewL(CEngine* aEngine) - { - CFileBrowserFileUtils* self = new(ELeave) CFileBrowserFileUtils(aEngine); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } - -// -------------------------------------------------------------------------------------------- - -CFileBrowserFileUtils::CFileBrowserFileUtils(CEngine* aEngine) : CActive(EPriorityStandard), iEngine(aEngine) - { - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ConstructL() - { - User::LeaveIfError(iTimer.CreateLocal()); - User::LeaveIfError(iFs.Connect()); - User::LeaveIfError(iTz.Connect()); - - iState = EIdle; - iListingMode = ENormalEntries; - - iSortMode = EFileBrowserCmdViewSortByName; - iOrderMode = EFileBrowserCmdViewOrderAscending; - iCurrentPath = KNullDesC; - - iFileOps = CFileBrowserFileOps::NewL(iEngine); - - iDriveEntryList = new(ELeave) CDriveEntryList(8); - iFileEntryList = new(ELeave) CFileEntryList(64); - iFindFileEntryList = new(ELeave) CFileEntryList(64); - iAppIconList = new(ELeave) CAppIconList(16); - iClipBoardList = new(ELeave) CFileEntryList(64); - iCurrentSelectionList = new(ELeave) CFileEntryList(64); - - iDocHandler = CDocumentHandler::NewL(); -// iDocHandler->SetExitObserver(this); - - // set defaults to the search settings - iSearchAttributes.iSearchDir = KNullDesC; - iSearchAttributes.iWildCards = _L("*.jpg"); - iSearchAttributes.iTextInFile = KNullDesC; - iSearchAttributes.iMinSize = 0; - iSearchAttributes.iMaxSize = 999999999; - iSearchAttributes.iMinDate = TDateTime(1980, EJanuary, 0,0,0,0,0); - iSearchAttributes.iMaxDate = TDateTime(2060, EDecember, 30,0,0,0,0); - iSearchAttributes.iRecurse = ETrue; - - // init the command array - iCommandArray = new(ELeave) CCommandArray(64); - - // get current path from settings - if (iEngine->Settings().iRememberLastPath) - { - TFileName settingPath = iEngine->Settings().iLastPath; - if (BaflUtils::PathExists(iFs, settingPath)) - iCurrentPath = settingPath; - - if (iCurrentPath != KNullDesC) - GetDriveListL(); - } - - CActiveScheduler::Add(this); - } - -// -------------------------------------------------------------------------------------------- - -CFileBrowserFileUtils::~CFileBrowserFileUtils() - { - Cancel(); - - // save current path from settings - if (iEngine->Settings().iRememberLastPath) - { - iEngine->Settings().iLastPath = iCurrentPath; - TRAP_IGNORE(iEngine->SaveSettingsL(EFalse)); - } - -// if (iWaitDialog) -// TRAP_IGNORE(iWaitDialog->ProcessFinishedL()); -// -// if (iProgressDialog) -// TRAP_IGNORE(iProgressDialog->ProcessFinishedL()); - - delete iFileOps; - - delete iDocHandler; - -// if (iOpenFileService) -// delete iOpenFileService; - - delete iCurrentSelectionList; - delete iClipBoardList; - delete iAppIconList; - delete iFindFileEntryList; - delete iFileEntryList; - delete iDriveEntryList; - - delete iFileMan; - - if (iCommandArray) - { - ResetCommandArray(); - delete iCommandArray; - } - - iTz.Close(); - iFs.Close(); - iTimer.Close(); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::DoCancel() - { - iTimer.Cancel(); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::StartExecutingCommandsL(const TDesC& aLabel) - { - if (iCommandArray->Count() >= 2) - { - // init progress bar -// iProgressDialog = new(ELeave) CAknProgressDialog((reinterpret_cast(&iProgressDialog)), ETrue); -// iProgressDialog->SetCallback(this); -// iProgressDialog->PrepareLC(R_GENERAL_PROGRESS_NOTE); -// iProgressDialog->SetCurrentLabelL( EAknCtNote, aLabel ); -// iProgressInfo = iProgressDialog->GetProgressInfoL(); -// iProgressInfo->SetFinalValue( CommandArrayCount() ); -// iProgressDialog->RunLD(); -// iProgressDialog->MakeVisible( ETrue ); - iEngine->FileBrowserUI()->ShowProgressDialog(aLabel, 0, CommandArrayCount()); - isProgressDialog = ETrue; - } - else if (iCommandArray->Count() >= 1) - { - // init wait dialog -// iWaitDialog = new(ELeave) CAknWaitDialog((reinterpret_cast(&iWaitDialog)), ETrue); -// iWaitDialog->SetCallback(this); -// iWaitDialog->PrepareLC(R_GENERAL_WAIT_NOTE); -// iWaitDialog->SetTextL( aLabel ); -// iWaitDialog->RunLD(); - iEngine->FileBrowserUI()->ShowWaitDialog(aLabel); - isWaitDialog = ETrue; - } - else - { - // no commands, just do nothing - return; - } - - - // start with the first operation - iCurrentEntry = 0; - iSucceededOperations = 0; - iFailedOperations = 0; - - // starts executing commands - ExecuteCommand(); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ExecuteCommand() - { - // make sure the engine isn't active, should never happen - __ASSERT_ALWAYS(!IsActive(), User::Panic(_L("FileUtils:IsActive"), 333)); - - // execute a command after a very short delay (25ms) - if (isWaitDialog) - { - iEngine->FileBrowserUI()->ProcessEvents(); - } - if (isProgressDialog) - { - TInt newValue = iCurrentEntry; - iEngine->FileBrowserUI()->SetProgressValue(newValue); - } - iTimer.After(iStatus, 25); - SetActive(); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::RunL() - { - TInt err(KErrNone); - TInt currentCommand = iCommandArray->At(iCurrentEntry).iCommandId; - - // execute a command from the queue - switch(currentCommand) - { - case EFileBrowserFileOpCommandAttribs: - { - CCommandParamsAttribs* params = static_cast(iCommandArray->At(iCurrentEntry).iParameters); - err = iFileOps->Attribs(params->iSourceEntry, params->iSetMask, params->iClearMask, params->iTime, params->iSwitch); - } - break; - - case EFileBrowserFileOpCommandCopy: - { - CCommandParamsCopyOrMove* params = static_cast(iCommandArray->At(iCurrentEntry).iParameters); - err = iFileOps->Copy(params->iSourceEntry, params->iTargetPath, params->iSwitch); - } - break; - - case EFileBrowserFileOpCommandMove: - { - CCommandParamsCopyOrMove* params = static_cast(iCommandArray->At(iCurrentEntry).iParameters); - err = iFileOps->Copy(params->iSourceEntry, params->iTargetPath, params->iSwitch, ETrue); - } - break; - - case EFileBrowserFileOpCommandRename: - { - CCommandParamsRename* params = static_cast(iCommandArray->At(iCurrentEntry).iParameters); - err = iFileOps->Rename(params->iSourceEntry, params->iTargetPath, params->iSwitch); - } - break; - - case EFileBrowserFileOpCommandDelete: - { - CCommandParamsDelete* params = static_cast(iCommandArray->At(iCurrentEntry).iParameters); - err = iFileOps->Delete(params->iSourceEntry, params->iSwitch); - } - break; - - case EFileBrowserFileOpCommandDriveSnapShot: - { - CCommandParamsDriveSnapShot* params = static_cast(iCommandArray->At(iCurrentEntry).iParameters); - err = iFileOps->DriveSnapShot(params->iSourceDriveLetter, params->iTargetDriveLetter); - } - break; - - default: - User::Panic (_L("Unknown command"), 400); - break; - } - - - if (err == KErrNone) - { - iSucceededOperations++; - } - else if ( err != KErrCancel ) - { - iFailedOperations++; - } - - iLastError = err; - - // check for more commands in queue - TRAP_IGNORE( CheckForMoreCommandsL() ); - } - -// --------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::RunError(TInt aError) - { - _LIT(KMessage, "Command error %d"); - TBuf<128> noteMsg; - noteMsg.Format(KMessage, aError); - - iEngine->EikonEnv()->InfoMsg(noteMsg); - - TRAP_IGNORE( CheckForMoreCommandsL() ); - - return KErrNone; - } - -// --------------------------------------------------------------------------- - -void CFileBrowserFileUtils::CheckForMoreCommandsL() - { - //LOGSTRING("Creator: CCreatorEngine::CheckForMoreCommandsL"); - - // update the progress bar - if (iProgressInfo) - 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 - ResetCommandArray(); - - // deactive secure backup if it was activated by a file command - iFileOps->DeActivateSecureBackUpViaFileOp(); - - // dismiss any wait/progress dialogs - if (isWaitDialog) - { - iEngine->FileBrowserUI()->CancelWaitDialog(); - isWaitDialog = EFalse; - } - if (isProgressDialog) - { - iEngine->FileBrowserUI()->CancelProgressDialog(); - isProgressDialog = EFalse; - } -// if (iWaitDialog) -// { -// TRAP_IGNORE(iWaitDialog->ProcessFinishedL()); -// iWaitDialog = NULL; -// } -// if (iProgressDialog) -// { -// TRAP_IGNORE(iProgressDialog->ProcessFinishedL()); -// iProgressDialog = NULL; -// } - - - // show result note - if ( iSucceededOperations == 0 && iFailedOperations == 0 ) - { - // single operation cancelled -> show nothing - } - else if (iSucceededOperations == 1 && iFailedOperations == 0) - { -// _LIT(KMessage, "Operation succeeded"); -// iEngine->FileBrowserUI()->ShowConfirmationNote(KMessage); - } - else if (iSucceededOperations > 0 && iFailedOperations == 0) - { -// _LIT(KMessage, "%d operations succeeded"); -// TBuf<128> noteMsg; -// noteMsg.Format(KMessage, iSucceededOperations); -// iEngine->FileBrowserUI()->ShowConfirmationNote(noteMsg); - } - else if (iSucceededOperations == 0 && iFailedOperations > 1) - { - _LIT(KMessage, "%d operations failed"); - TBuf<128> noteMsg; - noteMsg.Format(KMessage, iFailedOperations); - - iEngine->FileBrowserUI()->ShowErrorNote(noteMsg); - } - else if (iSucceededOperations > 0 && iFailedOperations > 0) - { - _LIT(KMessage, "%d operations succeeded, %d failed"); - TBuf<128> noteMsg; - noteMsg.Format(KMessage, iSucceededOperations, iFailedOperations); - - iEngine->FileBrowserUI()->ShowInformationNote(noteMsg, _L("")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(iLastError, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - - } - 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 CFileBrowserFileUtils::DialogDismissedL(/*TInt aButtonId*/) - { -// iProgressDialog = NULL; -// iProgressInfo = NULL; -// iWaitDialog = NULL; - - // check if cancel button was pressed -// if (aButtonId == EAknSoftkeyCancel) -// { - // cancel the active object, command executer - Cancel(); - - iFileOps->CancelOp(); - - ResetCommandArray(); - - isProgressDialog = EFalse; - - iEngine->FileBrowserUI()->ShowInformationNote(_L("Cancelled"), _L("")); -// } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::AppendToCommandArrayL(TInt aCommand, CCommandParamsBase* aParameters) - { - if (iCommandArray) - iCommandArray->AppendL( TCommand(aCommand, aParameters) ); - else - User::Leave(KErrNotReady); - } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::CommandArrayCount() const - { - TInt count(0); - - if (iCommandArray) - count = iCommandArray->Count(); - - return count; - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ResetCommandArray() - { - // delete params first - for (TInt i=0; iAt(i).iParameters ) - { - delete iCommandArray->At(i).iParameters; - iCommandArray->At(i).iParameters = NULL; - } - } - - // reset the entries - iCommandArray->Reset(); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::HandleSettingsChangeL() - { - // TODO - -// if (iEngine->FileListContainer()) -// { -// iEngine->FileListContainer()->SetScreenLayoutL(iEngine->Settings().iDisplayMode); -// iEngine->FileListContainer()->CreateListBoxL(iEngine->Settings().iFileViewMode); - //iEngine->FileListContainer()->SetNaviPaneTextL(iCurrentPath); - RefreshViewL(); -// } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SetSortModeL(TInt aSortMode) - { - iSortMode = aSortMode; - RefreshViewL(); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SetOrderModeL(TInt aOrderMode) - { - iOrderMode = aOrderMode; - RefreshViewL(); - } - -// -------------------------------------------------------------------------------------------- - -TKeyResponse CFileBrowserFileUtils::HandleOfferKeyEventL(const TKeyEvent& /*aKeyEvent*/, TEventCode /*aType*/) - { - // TODO - /* - if(aType != EEventKey) - return EKeyWasNotConsumed; - - TBool shiftKeyPressed = (aKeyEvent.iModifiers & EModifierShift) || - (aKeyEvent.iModifiers & EModifierLeftShift) || - (aKeyEvent.iModifiers & EModifierRightShift); - TBool controlKeyPressed = (aKeyEvent.iModifiers & EModifierCtrl) || - (aKeyEvent.iModifiers & EModifierRightCtrl); - - // handle left arrow key press - if (aKeyEvent.iCode == EKeyLeftArrow) - { - MoveUpOneLevelL(); - return EKeyWasConsumed; - } - - // handle right arrow key press - else if (aKeyEvent.iCode == EKeyRightArrow) - { - if (IsDriveListViewActive() && iDriveEntryList->Count() > 0) - { - MoveDownToDirectoryL(); - return EKeyWasConsumed; - } - else if (iFileEntryList->Count() > 0) - { - MoveDownToDirectoryL(); - return EKeyWasConsumed; - } - } - - // skip OK/Enter keys when shift or ctrl is pressed because those are needed by the listbox - else if ((aKeyEvent.iCode == EKeyOK || aKeyEvent.iCode == EKeyEnter) && (shiftKeyPressed || controlKeyPressed)) - { - return EKeyWasNotConsumed; - } - - // handle OK/Enter keys - else if (aKeyEvent.iCode == EKeyOK || aKeyEvent.iCode == EKeyEnter) - { - if (IsDriveListViewActive() && iDriveEntryList->Count() > 0) - { - MoveDownToDirectoryL(); - return EKeyWasConsumed; - } - else if (iFileEntryList->Count() > 0) - { - TFileEntry fileEntry = iFileEntryList->At(iEngine->FileListContainer()->CurrentListBoxItemIndex()); - - if (fileEntry.iEntry.IsDir()) - MoveDownToDirectoryL(); - else - OpenCommonFileActionQueryL(); - - return EKeyWasConsumed; - } - } - - // handle Delete/Backspace keys - else if (!iEngine->FileListContainer()->SearchField() && (aKeyEvent.iCode == EKeyBackspace || aKeyEvent.iCode == EKeyDelete) && - !iEngine->FileUtils()->IsCurrentDriveReadOnly() && !iEngine->FileUtils()->IsDriveListViewActive()) - { - DeleteL(); - return EKeyWasConsumed; - } - */ - return EKeyWasNotConsumed; - } -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::RefreshViewL() - { - // TODO - -// if (iEngine->FileListContainer()) -// { -// // create a list box if it doesn't already exist -// if (!iEngine->FileListContainer()->ListBox()) -// iEngine->FileListContainer()->CreateListBoxL(iEngine->Settings().iFileViewMode); -// -// // clear selections if any -// iEngine->FileListContainer()->ListBox()->ClearSelection(); -// -// // make sure that the search field is disabled -// iEngine->FileListContainer()->DisableSearchFieldL(); - - // read directory listing - GenerateDirectoryDataL(); - -// // set an icon array -// iEngine->FileListContainer()->SetListBoxIconArrayL(GenerateIconArrayL()); -// -// // set text items -// iEngine->FileListContainer()->SetListBoxTextArrayL(GenerateItemTextArrayL()); - -// // make sure that the current item index is not out of array -// if (iEngine->FileListContainer()->CurrentListBoxItemIndex() == -1 && // -1 is a hardcoded value meaning that no current item index -// iEngine->FileListContainer()->ListBox()->Model()->NumberOfItems() > 0) -// iEngine->FileListContainer()->ListBox()->SetCurrentItemIndex( iEngine->FileListContainer()->ListBox()->Model()->NumberOfItems() - 1 ); -// -// } - -// iEngine->FileListContainer()->UpdateToolbar(); - - } - -// -------------------------------------------------------------------------------------------- - -//CAknIconArray* CFileBrowserFileUtils::GenerateIconArrayL(TBool aGenerateNewBasicIconArray) -// { -// // TODO -// -// CAknIconArray* iconArray = NULL; -// -// if (aGenerateNewBasicIconArray) -// { -// iconArray = new(ELeave) CAknIconArray(16); -// } -// else -// { -// if (iEngine->FileListContainer()) -// iconArray = iEngine->FileListContainer()->ListBoxIconArrayL(); -// -// if (!iconArray) -// iconArray = new(ELeave) CAknIconArray(16); -// } -// -// -// CleanupStack::PushL(iconArray); -// -// // generate basic items if not already existing -// if (iconArray->Count() < EFixedIconListLength) -// { -// // reset arrays -// iconArray->Reset(); -// iAppIconList->Reset(); -// -// // get default control color -// TRgb defaultColor; -// defaultColor = iEngine->EikonEnv()->Color(EColorControlText); -// -// // create a color icon of the marking indicator -// CFbsBitmap* markBitmap = NULL; -// CFbsBitmap* markBitmapMask = NULL; -// -// AknsUtils::CreateColorIconL(AknsUtils::SkinInstance(), -// KAknsIIDQgnIndiMarkedAdd, -// KAknsIIDQsnIconColors, -// EAknsCIQsnIconColorsCG13, -// markBitmap, -// markBitmapMask, -// AknIconUtils::AvkonIconFileName(), -// EMbmAvkonQgn_indi_marked_add, -// EMbmAvkonQgn_indi_marked_add_mask, -// defaultColor -// ); -// -// // 0 marking indicator -// CGulIcon* markIcon = CGulIcon::NewL(markBitmap, markBitmapMask); -// iconArray->AppendL(markIcon); -// -// // 1 empty -// AppendGulIconToIconArrayL(iconArray, AknIconUtils::AvkonIconFileName(), -// EMbmAvkonQgn_prop_empty, EMbmAvkonQgn_prop_empty_mask, KAknsIIDQgnPropEmpty); -// // 2 phone memory -// AppendGulIconToIconArrayL(iconArray, AknIconUtils::AvkonIconFileName(), -// EMbmAvkonQgn_prop_phone_memc, EMbmAvkonQgn_prop_phone_memc_mask, KAknsIIDQgnPropPhoneMemc); -// // 3 memory card -// AppendGulIconToIconArrayL(iconArray, KMemoryCardUiBitmapFile, -// EMbmAknmemorycarduiQgn_prop_mmc_memc, EMbmAknmemorycarduiQgn_prop_mmc_memc_mask, KAknsIIDQgnPropMmcMemc); -// // 4 memory card disabled -// AppendGulIconToIconArrayL(iconArray, KMemoryCardUiBitmapFile, -// EMbmAknmemorycarduiQgn_prop_mmc_non, EMbmAknmemorycarduiQgn_prop_mmc_non_mask, KAknsIIDQgnPropMmcNon); -// // 5 folder -// AppendGulIconToIconArrayL(iconArray, AknIconUtils::AvkonIconFileName(), -// EMbmAvkonQgn_prop_folder_small, EMbmAvkonQgn_prop_folder_small_mask, KAknsIIDQgnPropFolderSmall); -// // 6 folder with subfolders -// AppendGulIconToIconArrayL(iconArray, AknIconUtils::AvkonIconFileName(), -// EMbmAvkonQgn_prop_folder_sub_small, EMbmAvkonQgn_prop_folder_sub_small_mask, KAknsIIDQgnPropFolderSubSmall); -// // 7 current folder -// AppendGulIconToIconArrayL(iconArray, AknIconUtils::AvkonIconFileName(), -// EMbmAvkonQgn_prop_folder_current, EMbmAvkonQgn_prop_folder_current_mask, KAknsIIDQgnPropFolderCurrent); -// } -// -// // append custom icons if not in drive list view and setting is enabled -// if (!aGenerateNewBasicIconArray && !IsDriveListViewActive() && iEngine->Settings().iShowAssociatedIcons) -// { -// // init id counter -// TInt idCounter(EFixedIconListLength + iAppIconList->Count()); -// -// // loop all items in the file list -// for (TInt i=0; iCount(); i++) -// { -// TFileEntry& fileEntry = iFileEntryList->At(i); -// -// // just check for normal files -// if (!fileEntry.iEntry.IsDir()) -// { -// TUid appUid = GetAppUid(fileEntry); -// TInt iconId = AppIconIdForUid(appUid); -// -// if (appUid != KNullUid && iconId == KErrNotFound) -// { -// // icon not found from the icon array, generate it -// CFbsBitmap* bitmap = NULL; -// CFbsBitmap* mask = NULL; -// CGulIcon* appIcon = NULL; -// -// TRAPD(err, -// AknsUtils::CreateAppIconLC(AknsUtils::SkinInstance(), appUid, EAknsAppIconTypeList, bitmap, mask); -// appIcon = CGulIcon::NewL(bitmap, mask); -// CleanupStack::Pop(2); //bitmap, mask -// ); -// -// if (err == KErrNone) -// { -// TAppIcon appIconEntry; -// appIconEntry.iId = idCounter; -// appIconEntry.iUid = appUid; -// -// appIcon->SetBitmapsOwnedExternally(EFalse); -// iconArray->AppendL(appIcon); -// iAppIconList->AppendL(appIconEntry); -// -// fileEntry.iIconId = idCounter; -// -// idCounter++; -// } -// else -// { -// delete bitmap; -// delete mask; -// -// TAppIcon appIconEntry; -// appIconEntry.iId = EFixedIconEmpty; -// appIconEntry.iUid = appUid; -// -// iAppIconList->AppendL(appIconEntry); -// } -// } -// -// else if (appUid != KNullUid && iconId >= 0) -// { -// // we already have already generated an icon for this uid, use it -// fileEntry.iIconId = iconId; -// } -// } -// } -// } -// -// CleanupStack::Pop(); //iconArray -// return iconArray; -// -// } -// -// -------------------------------------------------------------------------------------------- - -//void CFileBrowserFileUtils::AppendGulIconToIconArrayL(CAknIconArray* aIconArray, const TDesC& aIconFile, TInt aIconId, TInt aMaskId, const TAknsItemID aAknsItemId) -// { -// CGulIcon* icon = AknsUtils::CreateGulIconL( -// AknsUtils::SkinInstance(), -// aAknsItemId, -// aIconFile, -// aIconId, -// aMaskId); -// CleanupStack::PushL(icon); -// -// icon->SetBitmapsOwnedExternally(EFalse); -// aIconArray->AppendL(icon); -// -// CleanupStack::Pop(); //icon -// } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::AppIconIdForUid(TUid aUid) - { - TInt result(KErrNotFound); - - for (TInt i=0; iCount(); i++) - { - if (iAppIconList->At(i).iUid == aUid) - { - result = iAppIconList->At(i).iId; - break; - } - } - - return result; - } - -// -------------------------------------------------------------------------------------------- - -TUid CFileBrowserFileUtils::GetAppUid(TFileEntry aFileEntry) - { - TFileName fullPath; - fullPath.Copy(aFileEntry.iPath); - fullPath.Append(aFileEntry.iEntry.iName); - - TParse parsedName; - parsedName.Set(fullPath, NULL, NULL); - - // this will boost performance in \sys\bin folder - if (parsedName.Ext().CompareF(_L(".dll")) == 0 || parsedName.Ext().CompareF(_L(".rsc")) == 0) - return KNullUid; - - TInt err1(KErrNone), err2(KErrNone); - TUid appUid; - TDataType dataType; - TBool isProgram; - - err1 = iEngine->LsSession().AppForDocument(fullPath, appUid, dataType); - err2 = iEngine->LsSession().IsProgram(fullPath, isProgram); - - if (err1 == KErrNone && err2 == KErrNone) - { - if (isProgram) - { - // get the real app Uid from the app list - TApaAppInfo appInfo; - iEngine->LsSession().GetAllApps(); - - while (iEngine->LsSession().GetNextApp(appInfo) == KErrNone) - { - if (fullPath.CompareF(appInfo.iFullName) == 0) - return appInfo.iUid; - } - } - else - { - // return the app Uid associated for it - return appUid; - } - } - - return KNullUid; - } - - -CFileEntryList* CFileBrowserFileUtils::FileEntries() const -{ - return iFileEntryList; -} -CDriveEntryList* CFileBrowserFileUtils::DriveEntries() const -{ - return iDriveEntryList; -} - -//// -------------------------------------------------------------------------------------------- -// -//CDesCArray* CFileBrowserFileUtils::GenerateItemTextArrayL() -// { -// iTextArray = new(ELeave) CDesCArrayFlat(64); -//// CleanupStack::PushL(textArray); -// -// if (IsDriveListViewActive()) -// { -// _LIT(KSimpleDriveEntry, "%d\t%c: <%S>\t\t"); -// _LIT(KExtendedDriveEntry, "%d\t%c: <%S>\t%LD / %LD kB\t"); -// -// for (TInt i=0; iCount(); i++) -// { -// TFileName textEntry; -// TDriveEntry driveEntry = iDriveEntryList->At(i); -// -// if (iEngine->Settings().iFileViewMode == EFileViewModeSimple) -// { -// textEntry.Format(KSimpleDriveEntry, driveEntry.iIconId, TUint(driveEntry.iLetter), &driveEntry.iMediaTypeDesc); -// } -// else if (iEngine->Settings().iFileViewMode == EFileViewModeExtended) -// { -// textEntry.Format(KExtendedDriveEntry, driveEntry.iIconId, TUint(driveEntry.iLetter), &driveEntry.iMediaTypeDesc, driveEntry.iVolumeInfo.iFree/1024, driveEntry.iVolumeInfo.iSize/1024); -// } -// -// iTextArray->AppendL(textEntry); -// } -// } -// -// else -// { -// _LIT(KSimpleFileEntry, "%d\t%S\t\t"); -// _LIT(KExtendedFileEntry, "%d\t%S\t%S\t"); -// -// for (TInt i=0; iCount(); i++) -// { -// TFileName textEntry; -// TFileEntry fileEntry = iFileEntryList->At(i); -// -// // format text line entries -// if (iEngine->Settings().iFileViewMode == EFileViewModeSimple) -// { -// textEntry.Format(KSimpleFileEntry, fileEntry.iIconId, &fileEntry.iEntry.iName); -// } -// else if (iEngine->Settings().iFileViewMode == EFileViewModeExtended) -// { -// TBuf<128> extraData; -// -// // append entry date -// TTime entryModified = fileEntry.iEntry.iModified; -// if ( iTz.ConvertToLocalTime( entryModified ) == KErrNone ) -// { -// entryModified = fileEntry.iEntry.iModified; -// } -// -// _LIT(KCurrentDate,"%D%M%*Y%/0%1%/1%2%/2%3%/3 %-B%:0%J%:1%T%:2%S%:3%+B"); -// entryModified.FormatL(extraData, KCurrentDate); -// -// // for a directory append number of entries and for a file the file size -// if (fileEntry.iEntry.IsDir() && fileEntry.iDirEntries >= 0) -// { -// extraData.Append(_L(" - ")); -// extraData.AppendNum(fileEntry.iDirEntries); -// -// if (fileEntry.iDirEntries == 1) -// extraData.Append(_L(" entry")); -// else -// extraData.Append(_L(" entries")); -// } -// -// // normal file entry -// else if (!fileEntry.iEntry.IsDir()) -// { -// extraData.Append(_L(" - ")); -// -// if (fileEntry.iEntry.iSize < 1024) -// { -// extraData.AppendNum(fileEntry.iEntry.iSize); -// extraData.Append(_L(" B")); -// } -// else if (fileEntry.iEntry.iSize < 1024*1024) -// { -// TReal sizeKB = (TReal)fileEntry.iEntry.iSize / 1024; -// extraData.AppendNum(sizeKB, TRealFormat(KDefaultRealWidth, 1)); -// extraData.Append(_L(" kB")); -// } -// else -// { -// TReal sizeMB = (TReal)fileEntry.iEntry.iSize / (1024*1024); -// extraData.AppendNum(sizeMB, TRealFormat(KDefaultRealWidth, 1)); -// extraData.Append(_L(" MB")); -// } -// } -// -// // append attribute flags if any -// TBuf<4> atts; -// if (fileEntry.iEntry.IsArchive()) -// atts.Append(_L("A")); -// if (fileEntry.iEntry.IsHidden()) -// atts.Append(_L("H")); -// if (fileEntry.iEntry.IsReadOnly()) -// atts.Append(_L("R")); -// if (fileEntry.iEntry.IsSystem()) -// atts.Append(_L("S")); -// -// if (atts.Length() > 0) -// { -// extraData.Append(_L(" - [")); -// extraData.Append(atts); -// extraData.Append(_L("]")); -// } -// -// // format -// textEntry.Format(KExtendedFileEntry, fileEntry.iIconId, &fileEntry.iEntry.iName, &extraData); -// } -// -// iTextArray->AppendL(textEntry); -// } -// } -// -//// CleanupStack::Pop(); //textArray -// return iTextArray; -// } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::GenerateDirectoryDataL() - { - if (iListingMode == ENormalEntries) - { - if (IsDriveListViewActive()) - GetDriveListL(); - else - GetDirectoryListingL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::GetDriveListL() - { - TDriveList driveList; - - // get drive listing depending of the support for network drives - if (iEngine->Settings().iSupportNetworkDrives) - { - #ifndef __SERIES60_30__ - #ifndef __SERIES60_31__ - User::LeaveIfError(iFs.DriveList(driveList, KDriveAttAll)); - #endif - #else - User::LeaveIfError(iFs.DriveList(driveList)); - #endif - } - else - { - User::LeaveIfError(iFs.DriveList(driveList)); - } - - iDriveEntryList->Reset(); - - for (TInt i=0; iCount(); - } - - iDriveEntryList->AppendL(driveEntry); - } - } - - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::GetDirectoryListingL() - { - iFileEntryList->Reset(); - - TInt sortMode(ESortByName); - if (iSortMode == EFileBrowserCmdViewSortByExtension) - sortMode = ESortByExt; - else if (iSortMode == EFileBrowserCmdViewSortBySize) - sortMode = ESortBySize; - else if (iSortMode == EFileBrowserCmdViewSortByDate) - sortMode = ESortByDate; - - TInt orderMode(EAscending); - if (iOrderMode == EFileBrowserCmdViewOrderDescending) - orderMode = EDescending; - - CDir* dir = NULL; - if (iFs.GetDir(iCurrentPath, KEntryAttMatchMask, sortMode | orderMode | EDirsFirst, dir) == KErrNone) - { - CleanupStack::PushL(dir); - - for (TInt i=0; iCount(); i++) - { - TFileEntry fileEntry; - fileEntry.iPath = iCurrentPath; - fileEntry.iEntry = (*dir)[i]; - fileEntry.iDirEntries = KErrNotFound; - fileEntry.iIconId = EFixedIconEmpty; - - if ( iPrevFolderName != KNullDesC && iPrevFolderName == fileEntry.iEntry.iName ) - { - iPrevFolderIndex = i; - } - - // check for directory entries - if (fileEntry.iEntry.IsDir()) - { - fileEntry.iIconId = EFixedIconFolder; - - TFileName subPath = fileEntry.iPath; - subPath.Append(fileEntry.iEntry.iName); - subPath.Append(_L("\\")); - - // get number of entries in this directory if extended info about sub directories enabled - if (iEngine->Settings().iShowSubDirectoryInfo && iEngine->Settings().iFileViewMode == EFileViewModeExtended) - { - CDir* subDir = NULL; - if (iFs.GetDir(subPath, KEntryAttMatchMask, ESortNone | EDirsFirst, subDir) == KErrNone) - { - fileEntry.iDirEntries = subDir->Count(); - delete subDir; - } - } - - // apply subfolder icon for known directories (speed improvement) - if (subPath[0]=='Z' && (subPath.CompareF(_L("Z:\\data\\"))==0 || subPath.CompareF(_L("Z:\\Nokia\\"))==0 - || subPath.Compare(_L("Z:\\private\\"))==0 || subPath.Compare(_L("Z:\\resource\\"))==0 - || subPath.Compare(_L("Z:\\sys\\"))==0 || subPath.Compare(_L("Z:\\system\\"))==0)) - { - fileEntry.iIconId = EFixedIconFolderSub; - } - else if (subPath[0]=='Z' && (subPath.CompareF(_L("Z:\\sys\\bin\\"))==0)) - { - // normal folder icon for these ones - fileEntry.iIconId = EFixedIconFolder; - } - else - { - // check if this folder has subdirectories - CDir* subDir = NULL; - if (iFs.GetDir(subPath, KEntryAttDir|KEntryAttMatchMask, ESortNone | EDirsFirst, subDir) == KErrNone) - { - for (TInt j=0; jCount(); j++) - { - TEntry entry = (*subDir)[j]; - - if (entry.IsDir()) - { - fileEntry.iIconId = EFixedIconFolderSub; - break; - } - } - - delete subDir; - } - } - } - - iFileEntryList->AppendL(fileEntry); - } - - CleanupStack::PopAndDestroy(); //dir - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::MoveUpOneLevelL() - { - iPrevFolderIndex = KErrNotFound; - iPrevFolderName.Zero(); - - // change back to normal mode or move up - if (iListingMode != ENormalEntries) - { - iListingMode = ENormalEntries; - } - else - { - // do nothing if displaying drive list view - if (IsDriveListViewActive()) - return; - - if (iCurrentPath.Length() <= KDriveLetterStringLength) - { - if ( iCurrentPath.Length() > 0 ) - { - iPrevFolderName.Append( iCurrentPath[0] ); - } - // move to drive list view if the current path is already short enough - iCurrentPath = KNullDesC; - } - else - { - // move one directory up - TInt marker(iCurrentPath.Length()); - - // find second last dir marker - for (TInt i=iCurrentPath.Length()-2; i>=0; i--) - { - if (iCurrentPath[i] == '\\') - { - marker = i; - break; - } - - } - - // update iPrevDir with the directory name that we just left - iPrevFolderName.Copy( iCurrentPath.RightTPtr( iCurrentPath.Length() - marker - 1 ) ); - iPrevFolderName.Delete( iPrevFolderName.Length() -1, 2 ); // remove extra '\\' - - iCurrentPath = iCurrentPath.LeftTPtr(marker+1); - } - } - -// if (iEngine->FileListContainer()) -// { - //iEngine->FileListContainer()->DisableSearchFieldL(); - //iEngine->FileListContainer()->ListBox()->ClearSelection(); - //iEngine->FileListContainer()->ListBox()->SetCurrentItemIndex(0); - //iEngine->FileListContainer()->SetNaviPaneTextL(iCurrentPath); -// } - - // update view - RefreshViewL(); - - if (iEngine->Settings().iRememberFolderSelection - //&& iEngine->FileListContainer() - && iPrevFolderIndex > KErrNotFound ) - { - -// TInt visibleItems = iEngine->FileListContainer()->ListBox()->Rect().Height() / -// iEngine->FileListContainer()->ListBox()->ItemHeight() -// - 1; // for the title row -// -// // By default, the selected item would be the last visible item on the listbox. -// // We want the selected item be displayed at the middle of the listbox, so we -// // select one of the successor items first to scroll down a bit -// iEngine->FileListContainer()->ListBox()->SetCurrentItemIndex( -// Min( iEngine->FileListContainer()->ListBox()->Model()->ItemTextArray()->MdcaCount() -1, -// iPrevFolderIndex + visibleItems / 2 ) ); -// -// // ...and after that we select the the correct item. -// iEngine->FileListContainer()->ListBox()->SetCurrentItemIndex( iPrevFolderIndex ); - - // update view - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::MoveDownToDirectoryL(TInt aIndex) - { - - // change back to normal mode - if (iListingMode != ENormalEntries) - { - iListingMode = ENormalEntries; - } - - if (aIndex >= 0) - { - TBool needsRefresh(EFalse); - - if (IsDriveListViewActive()) - { - // currently in a drive list view, move to root of selected drive - if (iDriveEntryList->Count() > aIndex) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - iCurrentPath.Append(driveEntry.iLetter); - iCurrentPath.Append(_L(":\\")); - - needsRefresh = ETrue; - } - } - else - { - // otherwise just append the new directory - if (iFileEntryList->Count() > aIndex) - { - TFileEntry fileEntry = iFileEntryList->At(aIndex); - - if (fileEntry.iEntry.IsDir()) - { - iCurrentPath.Copy(fileEntry.iPath); - iCurrentPath.Append(fileEntry.iEntry.iName); - iCurrentPath.Append(_L("\\")); - - needsRefresh = ETrue; - } - } - } - - if (needsRefresh /*&& iEngine->FileListContainer()*/) - { - //iEngine->FileListContainer()->DisableSearchFieldL(); - //iEngine->FileListContainer()->ListBox()->ClearSelection(); - //iEngine->FileListContainer()->ListBox()->SetCurrentItemIndex(0); - //iEngine->FileListContainer()->SetNaviPaneTextL(iCurrentPath); - - // update view - RefreshViewL(); - } - } - } - -// -------------------------------------------------------------------------------------------- - -TBool CFileBrowserFileUtils::IsCurrentDriveReadOnly() - { - if (iListingMode !=ENormalEntries || iCurrentPath.Length() < 2) - return EFalse; - else - { - for (TInt i=0; iCount(); i++) - { - TDriveEntry driveEntry = iDriveEntryList->At(i); - - if (driveEntry.iLetter == iCurrentPath[0]) - { - if (driveEntry.iVolumeInfo.iDrive.iMediaAtt == KMediaAttWriteProtected || driveEntry.iVolumeInfo.iDrive.iMediaAtt == KMediaAttLocked || driveEntry.iVolumeInfo.iDrive.iDriveAtt == KDriveAbsent) - return ETrue; - else - return EFalse; - } - } - } - - return EFalse; - } - -// -------------------------------------------------------------------------------------------- - -TBool CFileBrowserFileUtils::IsItemDirectory(TInt aCurrentItemIndex) - { - if (aCurrentItemIndex < 0) - { - return EFalse; - } - else - { - if (iFileEntryList->Count() > aCurrentItemIndex) - { - TFileEntry fileEntry = iFileEntryList->At(aCurrentItemIndex) ; - return fileEntry.iEntry.IsDir(); - } - else - { - return EFalse; - } - } - } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::SetSelectedItemsOrCurrentItemL(const CArrayFix* selectionIndexes, - CFileEntryList* aFileEntryList) - { - aFileEntryList->Reset(); - - // by default use selected items - if (selectionIndexes && selectionIndexes->Count() > 0) - { - TInt ref(0); - TKeyArrayFix key(0, ECmpTUint16); - TInt index(0); - - for (TInt i=0; iCount(); i++) - { - ref = i; - - if (selectionIndexes->Find(ref, key, index) == 0) - { - aFileEntryList->AppendL(iFileEntryList->At(i)); - } - } - } - return aFileEntryList->Count(); - } - -// -------------------------------------------------------------------------------------------- -//TInt CFileBrowserFileUtils::GetSelectedItemsOrCurrentItemL(CFileEntryList* aFileEntryList) -// { -// aFileEntryList->Reset(); -// -// const CArrayFix* selectionIndexes = iEngine->GetSelectedIndices(); -// // by default use selected items -// if (selectionIndexes && selectionIndexes->Count() > 0) -// { -// TInt ref(0); -// TKeyArrayFix key(0, ECmpTUint16); -// TInt index(0); -// -// for (TInt i=0; iCount(); i++) -// { -// ref = i; -// -// if (selectionIndexes->Find(ref, key, index) == 0) -// { -// aFileEntryList->AppendL(iFileEntryList->At(i)); -// } -// } -// } -// -// // or if none selected, use the current item index -// else -// { -//// TInt currentItemIndex = iEngine->FileListContainer()->CurrentListBoxItemIndex(); -// TInt currentItemIndex = iEngine->QueryCurrentItemIndex(); -// if (iFileEntryList->Count() > currentItemIndex && currentItemIndex >= 0) -// { -// aFileEntryList->AppendL(iFileEntryList->At(currentItemIndex)); -// } -// } -// -// return aFileEntryList->Count(); -// } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::ClipboardCutL(const CArrayFix* aSelectionIndices) - { - - iClipBoardMode = EClipBoardModeCut; - //TInt operations = GetSelectedItemsOrCurrentItemL(iClipBoardList); - TInt operations = SetSelectedItemsOrCurrentItemL(aSelectionIndices, iClipBoardList); - return operations; - } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::ClipboardCopyL(const CArrayFix* aSelectionIndices) - { - iClipBoardMode = EClipBoardModeCopy; - //TInt operations = GetSelectedItemsOrCurrentItemL(iClipBoardList); - TInt operations = SetSelectedItemsOrCurrentItemL(aSelectionIndices, iClipBoardList); - return operations; - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ClipboardPasteL(const TOverwriteOptions &aOverwriteOptions) - { - if (iClipBoardMode == EClipBoardModeCut) - { - DoCopyToFolderL(iClipBoardList, iCurrentPath, aOverwriteOptions, ETrue ); - iClipBoardList->Reset(); - } - else if (iClipBoardMode == EClipBoardModeCopy) - { - DoCopyToFolderL(iClipBoardList, iCurrentPath, aOverwriteOptions, EFalse); - } - } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::SetCurrentSelection(const CArrayFix* aSelectionIndices) - { - TInt operations = SetSelectedItemsOrCurrentItemL(aSelectionIndices, iCurrentSelectionList); - return operations; - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::CopyToFolderL(TFileName aTargetDir, - const TOverwriteOptions &aOverwriteOptions, - TBool aMove) - { - - // TFileName destinationFolder; - - // generate an icon array - // CAknIconArray* iconArray = GenerateIconArrayL(ETrue); - // CleanupStack::PushL(iconArray); - - // run folder selection dialog - // CFileBrowserDestinationFolderSelectionDlg* dlg = CFileBrowserDestinationFolderSelectionDlg::NewL(destinationFolder, iDriveEntryList, iconArray); - - // get entry list - //CFileEntryList* entryList = new(ELeave) CFileEntryList(32); - //GetSelectedItemsOrCurrentItemL(entryList); - //CleanupStack::PushL(entryList); - - // do the file operations - //DoCopyToFolderL(entryList, aTargetDir, aOverwriteOptions, aMove); - DoCopyToFolderL(iCurrentSelectionList, aTargetDir, aOverwriteOptions, aMove); - - //CleanupStack::PopAndDestroy(); // entryList - - // CleanupStack::Pop(); //iconArray - } - -// -------------------------------------------------------------------------------------------- - -TBool CFileBrowserFileUtils::IsDestinationEntriesExists(const TDesC& aTargetDir) - { - TBool someEntryExists(EFalse); - if (iCurrentSelectionList && iCurrentSelectionList->Count() > 0) - { - // check if some destination entries also exists - for (TInt i=0; iCount(); i++) - { - TFileEntry fileEntry = iCurrentSelectionList->At(i); - - TFileName targetEntry = aTargetDir; - targetEntry.Append(fileEntry.iEntry.iName); - - if (fileEntry.iEntry.IsDir()) - { - targetEntry.Append(_L("\\")); - - if (BaflUtils::PathExists(iFs, targetEntry)) - { - someEntryExists = ETrue; - break; - } - } - else - { - if (BaflUtils::FileExists(iFs, targetEntry)) - { - someEntryExists = ETrue; - break; - } - } - } - } - return someEntryExists; - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::DoCopyToFolderL(CFileEntryList* aEntryList, - const TDesC& aTargetDir, - const TOverwriteOptions &aOverwriteOptions, - TBool aDeleteSource) - { - if (aEntryList && aEntryList->Count() > 0) - { - if (aOverwriteOptions.iDoFileOperations) - { - // set correct command id depending if we are copying or moving - TInt commandId(EFileBrowserFileOpCommandCopy); - if (aDeleteSource) - commandId = EFileBrowserFileOpCommandMove; - - // do the file operations for each entry - for (TInt i=0; iCount(); i++) - { - TFileEntry fileEntry = aEntryList->At(i); - - TFileName targetEntry = aTargetDir; - targetEntry.Append(fileEntry.iEntry.iName); - - if (aOverwriteOptions.iQueryIndex == EFileActionGenerateUniqueFilenames) - { - CApaApplication::GenerateFileName(iFs, targetEntry); - } - else if (aOverwriteOptions.iQueryIndex == EFileActionQueryPostFix) - { - targetEntry.Append(aOverwriteOptions.iPostFix); - } - - - // append the new command to the command array - if (fileEntry.iEntry.IsDir()) - { - AppendToCommandArrayL(commandId, - new(ELeave)CCommandParamsCopyOrMove(fileEntry, targetEntry, aOverwriteOptions.iOverWriteFlags|CFileMan::ERecurse) - ); - } - else - { - AppendToCommandArrayL(commandId, - new(ELeave)CCommandParamsCopyOrMove(fileEntry, targetEntry, aOverwriteOptions.iOverWriteFlags) - ); - } - - } - - // execute all operations - if (aDeleteSource) - StartExecutingCommandsL(_L("Moving")); - else - StartExecutingCommandsL(_L("Copying")); - } - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::DeleteL() - { - // do the file operations for each entry - for (TInt i=0; iCount(); i++) - { - TFileEntry fileEntry = iCurrentSelectionList->At(i); - - // append the new command to the command array - if (fileEntry.iEntry.IsDir()) - { - AppendToCommandArrayL(EFileBrowserFileOpCommandDelete, - new(ELeave)CCommandParamsDelete(fileEntry, CFileMan::ERecurse) - ); - } - else - { - AppendToCommandArrayL(EFileBrowserFileOpCommandDelete, - new(ELeave)CCommandParamsDelete(fileEntry, 0) - ); - } - - } - - // execute all operations - StartExecutingCommandsL(_L("Deleting")); - } - - -// -------------------------------------------------------------------------------------------- - -TBool CFileBrowserFileUtils::SelectionHasDirs() -{ - TBool isDir(EFalse); - - // check if any directories and ask recursion - for (TInt i=0; iCount(); i++) - { - TFileEntry fileEntry = iCurrentSelectionList->At(i); - - if (fileEntry.iEntry.IsDir()) - { - isDir = ETrue; - break; - } - } - return isDir; -} - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::TouchL(TBool aRecurse) - { - // now go through all entries - for (TInt i=0; iCount(); i++) - { - TFileEntry fileEntry = iCurrentSelectionList->At(i); - - // touch to current time - TTime now; - now.UniversalTime(); - - - // append the new command to the command array - if (fileEntry.iEntry.IsDir() && aRecurse) - { - AppendToCommandArrayL(EFileBrowserFileOpCommandAttribs, - new(ELeave)CCommandParamsAttribs(fileEntry, NULL, NULL, now, CFileMan::ERecurse) - ); - } - else - { - AppendToCommandArrayL(EFileBrowserFileOpCommandAttribs, - new(ELeave)CCommandParamsAttribs(fileEntry, NULL, NULL, now, 0) - ); - } - } - - // execute all operations - StartExecutingCommandsL(_L("Touching")); - } - -TBool CFileBrowserFileUtils::TargetExists(const TInt aIndex, const TFileName &newName) - { - TBool alreadyExists(EFalse); - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - - TFileEntry fileEntry = iFileEntryList->At(aIndex); - TFileName targetEntry = fileEntry.iPath; - targetEntry.Append(newName); - if (fileEntry.iEntry.IsDir()) - { - //targetEntry.Append(_L("\\")); - alreadyExists = BaflUtils::PathExists(iFs, targetEntry); - } - else - { - alreadyExists = BaflUtils::FileExists(iFs, targetEntry); - } - } - return alreadyExists; - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::RenameL(const TInt aIndex, const TFileName &newName) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TFileEntry fileEntry = iFileEntryList->At(aIndex); - - TFileName targetEntry = fileEntry.iPath; - targetEntry.Append(newName); - - // append the new command to the command array - AppendToCommandArrayL(EFileBrowserFileOpCommandRename, - new(ELeave)CCommandParamsRename(fileEntry, targetEntry, CFileMan::EOverWrite) - ); - } - // execute all operations done from caller - // StartExecutingCommandsL(_L("Renaming")); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SetAttributesL() - { -// CFileEntryList* entries = new(ELeave) CFileEntryList(16); -// GetSelectedItemsOrCurrentItemL(entries); -// CleanupStack::PushL(entries); -// -// if (entries->Count() > 0) -// { -// TFileName naviText = _L("Multiple entries"); -// -// TUint setAttMask(0); -// TUint clearAttMask(0); -// //TBool recurse(EFalse); -// -// // set default masks if only one file selected -// if (entries->Count() == 1) -// { -// TFileEntry fileEntry = entries->At(0); -// -// naviText.Copy(fileEntry.iEntry.iName); -// -// if (fileEntry.iEntry.IsArchive()) -// setAttMask |= KEntryAttArchive; -// else -// clearAttMask |= KEntryAttArchive; -// -// if (fileEntry.iEntry.IsHidden()) -// setAttMask |= KEntryAttHidden; -// else -// clearAttMask |= KEntryAttHidden; -// -// if (fileEntry.iEntry.IsReadOnly()) -// setAttMask |= KEntryAttReadOnly; -// else -// clearAttMask |= KEntryAttReadOnly; -// -// if (fileEntry.iEntry.IsSystem()) -// setAttMask |= KEntryAttSystem; -// else -// clearAttMask |= KEntryAttSystem; -// } -// - //iEngine->FileListContainer()->SetScreenLayoutL(EDisplayModeNormal); - //iEngine->FileListContainer()->SetNaviPaneTextL(naviText); - - //CFileBrowserAttributeEditorDlg* dlg = CFileBrowserAttributeEditorDlg::NewL(setAttMask, clearAttMask, recurse); - //TBool dlgResult = dlg->RunEditorLD(); - - //iEngine->FileListContainer()->SetScreenLayoutL(iEngine->Settings().iDisplayMode); - //iEngine->FileListContainer()->SetNaviPaneTextL(iCurrentPath); -// -// if (dlgResult && (setAttMask > 0 || clearAttMask > 0)) -// { -// for (TInt i=0; iCount(); i++) -// { -// TFileEntry fileEntry = entries->At(i); -// -// // append the new command to the command array -// if (fileEntry.iEntry.IsDir() && recurse) -// { -// AppendToCommandArrayL(EFileBrowserFileOpCommandAttribs, -// new(ELeave)CCommandParamsAttribs(fileEntry, setAttMask, clearAttMask, fileEntry.iEntry.iModified, CFileMan::ERecurse) -// ); -// } -// else -// { -// AppendToCommandArrayL(EFileBrowserFileOpCommandAttribs, -// new(ELeave)CCommandParamsAttribs(fileEntry, setAttMask, clearAttMask, fileEntry.iEntry.iModified, 0) -// ); -// } -// } -// -// // execute all operations -// StartExecutingCommandsL(_L("Changing attributes")); -// } -// -// } -// -// CleanupStack::PopAndDestroy(); //entries - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SearchL() - { -// iEngine->FileListContainer()->SetScreenLayoutL(EDisplayModeNormal); -// iEngine->FileListContainer()->SetNaviPaneTextL(KNullDesC); -// -// iSearchAttributes.iSearchDir = iCurrentPath; -// -// CFileBrowserSearchQueryDlg* dlg = CFileBrowserSearchQueryDlg::NewL(iSearchAttributes); -// TBool dlgResult = dlg->RunQueryLD(); -// -// iEngine->FileListContainer()->SetScreenLayoutL(iEngine->Settings().iDisplayMode); -// iEngine->FileListContainer()->SetNaviPaneTextL(iCurrentPath); -// -// if (dlgResult) -// { -// iEngine->EikonEnv()->BusyMsgL(_L("** Searching **"), TGulAlignment(EHCenterVTop)); - - - iEngine->FileBrowserUI()->ShowWaitDialog(_L("Searching")); - iFileEntryList->Reset(); - - // if search dir is empty, find from all drives - if (iSearchAttributes.iSearchDir == KNullDesC) - { - for (TInt i=0; iCount(); i++) - { - TDriveEntry driveEntry = iDriveEntryList->At(i); - - TBuf<10> driveRoot; - driveRoot.Append(driveEntry.iLetter); - driveRoot.Append(_L(":\\")); - - DoSearchFiles(iSearchAttributes.iWildCards, driveRoot); - - if (iSearchAttributes.iRecurse) - DoSearchFilesRecursiveL(iSearchAttributes.iWildCards, driveRoot); - } - - } - - // otherwise just search from the selected directory - else - { - DoSearchFiles(iSearchAttributes.iWildCards, iSearchAttributes.iSearchDir); - - if (iSearchAttributes.iRecurse) - DoSearchFilesRecursiveL(iSearchAttributes.iWildCards, iSearchAttributes.iSearchDir); - } - -// iEngine->EikonEnv()->BusyMsgCancel(); - iEngine->FileBrowserUI()->CancelWaitDialog(); - -// TInt operations = iFileEntryList->Count(); - - iListingMode = ESearchResults; - // TODO iEngine->FileListContainer()->ListBox()->SetCurrentItemIndex(0); - RefreshViewL(); - -// _LIT(KMessage, "%d entries found"); -// TFileName noteMsg; -// noteMsg.Format(KMessage, operations); -// -// iEngine->FileBrowserUI()->ShowInformationNote(noteMsg, _L("")); -// } - } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::DoSearchFiles(const TDesC& aFileName, const TDesC& aPath) - { - TFindFile fileFinder(iFs); - CDir* dir; - TInt err = fileFinder.FindWildByPath(aFileName, &aPath, dir); - - while (err == KErrNone && iAllowProcessing) - { - iEngine->FileBrowserUI()->ProcessEvents(); - for (TInt i=0; iCount(); i++) - { - TEntry entry = (*dir)[i]; - - TTime entryModified = entry.iModified; - // convert from universal time - if ( iTz.ConvertToLocalTime( entryModified ) == KErrNone ) - { - entryModified = entry.iModified; - } - if ((entry.IsDir() && entryModified >= iSearchAttributes.iMinDate && entryModified <= iSearchAttributes.iMaxDate) || - (!entry.IsDir() &&entry.iSize >= iSearchAttributes.iMinSize && entry.iSize <= iSearchAttributes.iMaxSize && - entryModified >= iSearchAttributes.iMinDate && entryModified <= iSearchAttributes.iMaxDate)) - { - TParse parsedName; - parsedName.Set(entry.iName, &fileFinder.File(), NULL); - - if (parsedName.Drive().Length() && aPath.Length() && parsedName.Drive()[0] == aPath[0]) - { - TFileEntry fileEntry; - fileEntry.iPath = parsedName.DriveAndPath(); - fileEntry.iEntry = entry; - fileEntry.iDirEntries = KErrNotFound; - - TBool appendToArray(EFalse); - - // append directories always - if (entry.IsDir() && !iSearchAttributes.iTextInFile.Length()) - { - fileEntry.iIconId = EFixedIconFolder; - appendToArray = ETrue; - } - - // normal file - else - { - fileEntry.iIconId = EFixedIconEmpty; - - // check if a string needs to be found inside the file - if (iSearchAttributes.iTextInFile.Length()) - { - // currently only 8-bit searching, so convert from 16-bit - TBuf8<256> searchText; - searchText.Copy(iSearchAttributes.iTextInFile); - - // specify buffer size and create a buffer - const TInt KReadBufSize = 1024*1024; - HBufC8* buffer = HBufC8::NewLC(KReadBufSize); - TPtr8 bufferPtr = buffer->Des(); - - // open the file for reading - RFile file; - if (file.Open(iFs, parsedName.FullName(), EFileRead) == KErrNone) - { - TInt currentPos(0); - - for (;;) - { - // read from the file - file.Read(currentPos, bufferPtr, KReadBufSize); - - // stop looping if the read buffer isn't long enough - if (bufferPtr.Length() < searchText.Length()) - { - break; - } - - // try to find the text - if (bufferPtr.FindF(searchText) >= 0) - { - // match found! - appendToArray = ETrue; - break; - } - - // calculate the next position - currentPos += KReadBufSize - searchText.Length(); - } - - file.Close(); - } - - CleanupStack::PopAndDestroy(); //buffer - } - else - { - appendToArray = ETrue; - } - } - - if (appendToArray) - TRAP(err, iFileEntryList->AppendL(fileEntry)); - } - } - } - - delete dir; - err = fileFinder.FindWild(dir); - } - - return err; - } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::DoSearchFilesRecursiveL(const TDesC& aFileName, const TDesC& aPath) - { - TInt err(KErrNone); - CDirScan* scan = CDirScan::NewLC(iFs); - scan->SetScanDataL(aPath, KEntryAttDir|KEntryAttMatchMask, ESortByName | EAscending | EDirsFirst); - CDir* dir = NULL; - - for(;;) - { - TRAP(err, scan->NextL(dir)); - if (!dir || (err != KErrNone)) - break; - - for (TInt i=0; iCount(); i++) - { - TEntry entry = (*dir)[i]; - - if (entry.IsDir()) - { - TFileName path(scan->FullPath()); - - if (path.Length()) - { - path.Append(entry.iName); - path.Append(_L("\\")); - DoSearchFiles(aFileName, path); - } - } - } - delete(dir); - } - - CleanupStack::PopAndDestroy(scan); - return err; - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::NewFileL(const TFileName &aNewFileName) - { - TFileName fullPath = iCurrentPath; - fullPath.Append(aNewFileName); - - TParse nameParser; - TInt err = nameParser.SetNoWild(fullPath, NULL, NULL); - - if (err == KErrNone) - { - // do not try to recreate the file if it already exists - if (BaflUtils::PathExists(iFs, nameParser.DriveAndPath())) - { - err = iFileOps->CreateEmptyFile(fullPath); - } - else - err = KErrAlreadyExists; - } - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("New file created")); - } - - else if (err == KErrAlreadyExists) - { - iEngine->FileBrowserUI()->ShowInformationNote(_L("File already exists"), _L("")); - } - - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::NewDirectoryL(const TFileName &aNewDirectoryName) - { - TFileName fullPath = iCurrentPath; - fullPath.Append(aNewDirectoryName); - fullPath.Append(_L("\\")); - - TInt err = iFileOps->MkDirAll(fullPath, 0, ETrue); - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("New directory created")); - } - - else if (err == KErrAlreadyExists) - { - iEngine->FileBrowserUI()->ShowInformationNote(_L("Directory already exists"), _L("")); - } - - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SendToL() - { -// CFileEntryList* entries = new(ELeave) CFileEntryList(32); -// GetSelectedItemsOrCurrentItemL(entries); -// CleanupStack::PushL(entries); -// -// TInt operations(0); -// -// CSendUi* sendUi = CSendUi::NewL(); -// CleanupStack::PushL(sendUi); -// CMessageData* messageData = CMessageData::NewL(); -// CleanupStack::PushL(messageData); -// -// for (TInt i=0; iCount(); i++) -// { -// TFileEntry fileEntry = entries->At(i); -// -// // only supported for normal file entries -// if (!fileEntry.iEntry.IsDir()) -// { -// TFileName fullPath = fileEntry.iPath; -// fullPath.Append(fileEntry.iEntry.iName); -// -// messageData->AppendAttachmentL(fullPath); -// operations++; -// -// } -// } -// -// if (operations > 0) -// { -// sendUi->ShowQueryAndSendL(messageData, TSendingCapabilities(0, 0, TSendingCapabilities::ESupportsAttachments)); -// -// // I guess this note is not needed.. -//// _LIT(KMessage, "%d entries sent"); -//// TFileName noteMsg; -//// noteMsg.Format(KMessage, operations); -//// -//// iEngine->FileBrowserUI()->ShowConfirmationNote(noteMsg); -// } -// else -// { -// _LIT(KMessage, "Nothing to send"); -// iEngine->FileBrowserUI()->ShowInformationNote(KMessage, _L("")); -// } -// -// CleanupStack::PopAndDestroy(3); // entries, sendUi, messageData - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::CompressL() - { -// CFileEntryList* entries = new(ELeave) CFileEntryList(16); -// GetSelectedItemsOrCurrentItemL(entries); -// CleanupStack::PushL(entries); -// -// for (TInt i=0; iCount(); i++) -// { -// TFileEntry fileEntry = entries->At(i); -// -// TFileName sourceEntry = fileEntry.iPath; -// sourceEntry.Append(fileEntry.iEntry.iName); -// -// TFileName targetEntry = sourceEntry; -// targetEntry.Append(KGZipExt); -// -// TFileName targetEntryShort; -// targetEntryShort.Copy(fileEntry.iEntry.iName); -// targetEntryShort.Append(KGZipExt); -// -// if (BaflUtils::FileExists(iFs, targetEntry)) -// { -// _LIT(KMessage, "%S already exists"); -// TFileName noteMsg; -// noteMsg.Format(KMessage, &targetEntryShort); -// -// iEngine->FileBrowserUI()->ShowInformationNote(noteMsg, _L("")); -// } -// else -// { -// TRAPD(err, -// RFile inputFile; -// User::LeaveIfError(inputFile.Open(iFs, sourceEntry, EFileStream | EFileRead | EFileShareAny)); -// CleanupClosePushL(inputFile); -// -// CEZFileToGZip* gZip = CEZFileToGZip::NewLC(iFs, targetEntry, inputFile); -// -// while (gZip->DeflateL()) -// ; -// -// CleanupStack::PopAndDestroy(2); //inputFile, gZip -// ); -// -// if (err == KErrNone) -// { -// _LIT(KMessage, "%S created succesfully"); -// TFileName noteMsg; -// noteMsg.Format(KMessage, &targetEntryShort); -// -// iEngine->FileBrowserUI()->ShowConfirmationNote(noteMsg); -// } -// else -// { -// _LIT(KMessage, "Unable to create %S"); -// TFileName noteMsg; -// noteMsg.Format(KMessage, &targetEntryShort); -// -// iEngine->FileBrowserUI()->ShowErrorNote(noteMsg); -// } -// -// RefreshViewL(); -// } -// } -// -// CleanupStack::PopAndDestroy(); //entries - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::DecompressL() - { -// CFileEntryList* entries = new(ELeave) CFileEntryList(16); -// GetSelectedItemsOrCurrentItemL(entries); -// CleanupStack::PushL(entries); -// -// for (TInt i=0; iCount(); i++) -// { -// TFileEntry fileEntry = entries->At(i); -// -// TFileName sourceEntry = fileEntry.iPath; -// sourceEntry.Append(fileEntry.iEntry.iName); -// -// TFileName targetEntry; -// TFileName targetEntryShort; -// -// TInt sourceNameLen = fileEntry.iEntry.iName.Length(); -// TInt gZipExtLen = KGZipExt().Length(); -// -// if (sourceNameLen > gZipExtLen && sourceEntry.Right(gZipExtLen).CompareF(KGZipExt) == 0) -// { -// targetEntry = sourceEntry.Left(sourceEntry.Length() - gZipExtLen); -// targetEntryShort = fileEntry.iEntry.iName.Left(sourceNameLen - gZipExtLen); -// -// if (BaflUtils::FileExists(iFs, targetEntry)) -// { -// _LIT(KMessage, "%S already exists"); -// TFileName noteMsg; -// noteMsg.Format(KMessage, &targetEntryShort); -// -// iEngine->FileBrowserUI()->ShowInformationNote(noteMsg, _L("")); -// } -// else -// { -// TRAPD(err, -// RFile outputFile; -// User::LeaveIfError(outputFile.Create(iFs, targetEntry, EFileStream | EFileWrite | EFileShareExclusive)); -// CleanupClosePushL(outputFile); -// -// CEZGZipToFile* gZip = CEZGZipToFile::NewLC(iFs, sourceEntry, outputFile); -// -// while (gZip->InflateL()) -// ; -// -// CleanupStack::PopAndDestroy(2); //outputFile, gZip -// ); -// -// if (err == KErrNone) -// { -// _LIT(KMessage, "%S decompressed succesfully"); -// TFileName noteMsg; -// noteMsg.Format(KMessage, &fileEntry.iEntry.iName); -// -// iEngine->FileBrowserUI()->ShowConfirmationNote(noteMsg); -// } -// else -// { -// _LIT(KMessage, "Unable to decompress %S"); -// TFileName noteMsg; -// noteMsg.Format(KMessage, &fileEntry.iEntry.iName); -// -// iEngine->FileBrowserUI()->ShowErrorNote(noteMsg); -// } -// -// RefreshViewL(); -// } -// } -// else -// { -// _LIT(KMessage, "%S does not have %S extension"); -// TFileName noteMsg; -// noteMsg.Format(KMessage, &fileEntry.iEntry.iName, &KGZipExt); -// -// iEngine->FileBrowserUI()->ShowInformationNote(noteMsg, _L("")); -// } -// } -// -// CleanupStack::PopAndDestroy(); //entries - } - -// -------------------------------------------------------------------------------------------- - -bool CFileBrowserFileUtils::PropertiesL(TInt aCurrentItemIndex, CDesCArray* entryLines, TFileName &titleText) - { - - TBool showDialog(EFalse); - - _LIT(KPropertiesEntryStr, "%S\t%S"); - _LIT(KPropertiesEntryInt, "%S\t%d"); - _LIT(KPropertiesEntryUintHex, "%S\t0x%x"); - - _LIT(KDateFormat, "%D%M%Y%/0%1%/1%2%/2%3%/3"); - _LIT(KTimeFormat, "%-B%:0%J%:1%T%:2%S%:3%+B"); - - _LIT(KMediaType, "Media"); - _LIT(KAttributes, "Atts"); - _LIT(KVolumeName, "Name"); - _LIT(KUniqueID, "ID"); - _LIT(KNumberOfEntries, "Entries"); - _LIT(KNumberOfFiles, "Files"); - _LIT(KUsed, "Used (B)"); - _LIT(KFree, "Free (B)"); - _LIT(KSize, "Size (B)"); - _LIT(KPath, "Path"); - _LIT(KDate, "Date"); - _LIT(KTime, "Time"); - _LIT(KMimeType, "Mime"); - _LIT(KOpensWith, "Opens"); - - - // create an array for the items -// CDesCArray* entryLines = new(ELeave) CDesCArrayFlat(16); -// CleanupStack::PushL(entryLines); -// TFileName titleText; - - // just get current item -// TInt currentItemIndex = iEngine->QueryCurrentItemIndex(); - - if (IsDriveListViewActive() && iDriveEntryList->Count() > aCurrentItemIndex && aCurrentItemIndex >= 0) - { - // it is a drive entry - TDriveEntry driveEntry = iDriveEntryList->At(aCurrentItemIndex); - TFileName textEntry; - - // set title - titleText.Append(driveEntry.iLetter); - titleText.Append(_L(":")); - - // media type - textEntry.Format(KPropertiesEntryStr, &KMediaType, &driveEntry.iMediaTypeDesc); - entryLines->AppendL(textEntry); - - // attributes - textEntry.Format(KPropertiesEntryStr, &KAttributes, &driveEntry.iAttributesDesc); - entryLines->AppendL(textEntry); - - // volume name - if (driveEntry.iVolumeInfo.iName.Length()) - { - textEntry.Format(KPropertiesEntryStr, &KVolumeName, &driveEntry.iVolumeInfo.iName); - entryLines->AppendL(textEntry); - } - - // unique id - textEntry.Format(KPropertiesEntryUintHex, &KUniqueID, driveEntry.iVolumeInfo.iUniqueID); - entryLines->AppendL(textEntry); - - // number of files - if (iEngine->Settings().iShowSubDirectoryInfo) - { - iFindFileEntryList->Reset(); - - TBuf<10> driveRoot; - driveRoot.Append(driveEntry.iLetter); - driveRoot.Append(_L(":\\")); - - DoFindFiles(_L("*"), driveRoot); - DoFindFilesRecursiveL(_L("*"), driveRoot); - - textEntry.Format(KPropertiesEntryInt, &KNumberOfFiles, iFindFileEntryList->Count()); - entryLines->AppendL(textEntry); - - iFindFileEntryList->Reset(); - } - - // used - TBuf<32> usedBuf; - usedBuf.AppendNum(driveEntry.iVolumeInfo.iSize-driveEntry.iVolumeInfo.iFree, TRealFormat(KDefaultRealWidth, 0)); - textEntry.Format(KPropertiesEntryStr, &KUsed, &usedBuf); - entryLines->AppendL(textEntry); - - // free - TBuf<32> freeBuf; - freeBuf.AppendNum(driveEntry.iVolumeInfo.iFree, TRealFormat(KDefaultRealWidth, 0)); - textEntry.Format(KPropertiesEntryStr, &KFree, &freeBuf); - entryLines->AppendL(textEntry); - - // size - TBuf<32> sizeBuf; - sizeBuf.AppendNum(driveEntry.iVolumeInfo.iSize, TRealFormat(KDefaultRealWidth, 0)); - textEntry.Format(KPropertiesEntryStr, &KSize, &sizeBuf); - entryLines->AppendL(textEntry); - - showDialog = ETrue; - } - - else if (iFileEntryList->Count() > aCurrentItemIndex && aCurrentItemIndex >= 0) - { - // it is a file or a directory entry - TFileEntry fileEntry = iFileEntryList->At(aCurrentItemIndex); - TFileName textEntry; - - // set title - titleText.Append(fileEntry.iEntry.iName); - - // path - textEntry.Format(KPropertiesEntryStr, &KPath, &fileEntry.iPath); - entryLines->AppendL(textEntry); - - // date - TTime entryModified = fileEntry.iEntry.iModified; - - // convert from universal time - if ( iTz.ConvertToLocalTime( entryModified ) == KErrNone ) - { - entryModified = fileEntry.iEntry.iModified; // use universal time - } - - TBuf<32> dateBuf; - entryModified.FormatL(dateBuf, KDateFormat); - textEntry.Format(KPropertiesEntryStr, &KDate, &dateBuf); - entryLines->AppendL(textEntry); - - // time - TBuf<32> timeBuf; - entryModified.FormatL(timeBuf, KTimeFormat); - textEntry.Format(KPropertiesEntryStr, &KTime, &timeBuf); - entryLines->AppendL(textEntry); - - if (!fileEntry.iEntry.IsDir()) - { - // size - TBuf<32> sizeBuf; - sizeBuf.AppendNum(fileEntry.iEntry.iSize, TRealFormat(KDefaultRealWidth, 0)); - textEntry.Format(KPropertiesEntryStr, &KSize, &sizeBuf); - entryLines->AppendL(textEntry); - } - else if (fileEntry.iEntry.IsDir() && iEngine->Settings().iShowSubDirectoryInfo) - { - iFindFileEntryList->Reset(); - - TFileName fullPath; - fullPath.Append(fileEntry.iPath); - fullPath.Append(fileEntry.iEntry.iName); - fullPath.Append(_L("\\")); - - // number of entries - CDir* subDir = NULL; - if (iFs.GetDir(fullPath, KEntryAttMatchMask, ESortNone | EDirsFirst, subDir) == KErrNone) - { - CleanupStack::PushL(subDir); - textEntry.Format(KPropertiesEntryInt, &KNumberOfEntries, subDir->Count()); - entryLines->AppendL(textEntry); - CleanupStack::PopAndDestroy(); //subDir - } - - // number of files - DoFindFiles(_L("*"), fullPath); - DoFindFilesRecursiveL(_L("*"), fullPath); - textEntry.Format(KPropertiesEntryInt, &KNumberOfFiles, iFindFileEntryList->Count()); - entryLines->AppendL(textEntry); - - // size - TInt64 size(0); - for (TInt i=0; iCount(); i++) - { - TFileEntry fileEntry = iFindFileEntryList->At(i); - size += fileEntry.iEntry.iSize; - } - - TBuf<32> sizeBuf; - sizeBuf.AppendNum(size, TRealFormat(KDefaultRealWidth, 0)); - textEntry.Format(KPropertiesEntryStr, &KSize, &sizeBuf); - entryLines->AppendL(textEntry); - - iFindFileEntryList->Reset(); - } - - // attributes - TBuf<32> attBuf; - if (fileEntry.iEntry.IsArchive()) - attBuf.Append(_L("Arc ")); - if (fileEntry.iEntry.IsHidden()) - attBuf.Append(_L("Hid ")); - if (fileEntry.iEntry.IsReadOnly()) - attBuf.Append(_L("R/O ")); - if (fileEntry.iEntry.IsSystem()) - attBuf.Append(_L("Sys")); - textEntry.Format(KPropertiesEntryStr, &KAttributes, &attBuf); - entryLines->AppendL(textEntry); - - if (!fileEntry.iEntry.IsDir()) - { - // mime type - TFileName fullPath = fileEntry.iPath; - fullPath.Append(fileEntry.iEntry.iName); - TDataType dataType; - TUid appUid; - if (iEngine->LsSession().AppForDocument(fullPath, appUid, dataType) == KErrNone) - { - TBuf<128> mimeTypeBuf; - mimeTypeBuf.Copy(dataType.Des8()); - if (mimeTypeBuf == KNullDesC) - mimeTypeBuf.Copy(_L("N/A")); - textEntry.Format(KPropertiesEntryStr, &KMimeType, &mimeTypeBuf); - entryLines->AppendL(textEntry); - } - - // opens with - TApaAppInfo appInfo; - if (iEngine->LsSession().GetAppInfo(appInfo, appUid) == KErrNone) - { - TFileName opensWithBuf; - _LIT(KOpensWithFormat, "%S (0x%08X)"); - opensWithBuf.Format(KOpensWithFormat, &appInfo.iCaption, appInfo.iUid); - textEntry.Format(KPropertiesEntryStr, &KOpensWith, &opensWithBuf); - entryLines->AppendL(textEntry); - } - } - - showDialog = ETrue; - } - return showDialog; - -// if (showDialog) -// { -// CAknSingleHeadingPopupMenuStyleListBox* listBox = new(ELeave) CAknSingleHeadingPopupMenuStyleListBox; -// CleanupStack::PushL(listBox); -// -// CAknPopupList* popupList = CAknPopupList::NewL(listBox, R_AVKON_SOFTKEYS_OK_EMPTY, AknPopupLayouts::EMenuDoubleWindow); -// CleanupStack::PushL(popupList); -// -// listBox->ConstructL(popupList, CEikListBox::ELeftDownInViewRect); -// listBox->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue); -// listBox->CreateScrollBarFrameL(ETrue); -// listBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); -// listBox->Model()->SetItemTextArray(entryLines); -// listBox->Model()->SetOwnershipType(ELbmDoesNotOwnItemArray); -// listBox->HandleItemAdditionL(); -// -// popupList->SetTitleL(titleText); -// popupList->ExecuteLD(); -// -// CleanupStack::Pop(); // popupList -// CleanupStack::PopAndDestroy(); // listBox -// } -// -// CleanupStack::PopAndDestroy(); //entryLines - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::OpenWithApparcL(TFileName aFileName) - { - - TFileName fullPath = aFileName; - TInt err1(KErrNone), err2(KErrNone); - TUid appUid; - TDataType dataType; - TBool isProgram; - - - err1 = iEngine->LsSession().AppForDocument(fullPath, appUid, dataType); - err2 = iEngine->LsSession().IsProgram(fullPath, isProgram); - - if (err1 == KErrNone && err2 == KErrNone) - { - if (appUid != KNullUid) - { - // found an app, run using it - TApaTaskList taskList(CEikonEnv::Static()->WsSession()); - TApaTask task = (taskList.FindApp(appUid)); - if (task.Exists()) - { - User::LeaveIfError(task.SwitchOpenFile(fullPath)); - task.BringToForeground(); - } - else - { - TThreadId id; - iEngine->LsSession().StartDocument(fullPath, appUid, id, RApaLsSession::ESwitchFiles); - } - } - else if (isProgram) - { - LaunchProgramL(fullPath); - } - } - //} - } - -// -------------------------------------------------------------------------------------------- - -//void CFileBrowserFileUtils::HandleServerAppExit(TInt aReason) -// { -// if (iOpenFileService) -// { -// delete iOpenFileService; -// iOpenFileService = NULL; -// } -// MAknServerAppExitObserver::HandleServerAppExit(aReason); -// } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::OpenWithDocHandlerL(TFileName aFileName, TBool aEmbed) - { - TFileName fullPath = aFileName; - RFile sharableFile; - iDocHandler->OpenTempFileL(fullPath, sharableFile); - CleanupClosePushL(sharableFile); - TDataType dataType; - if (aEmbed) - { - iDocHandler->OpenFileEmbeddedL(sharableFile, dataType); - } - else - { - iDocHandler->OpenFileL(sharableFile, dataType); - } - CleanupStack::PopAndDestroy(); //sharableFile - // } - } - - // -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::OpenWithFileServiceL(TInt aCurrentItemIndex) - { - if (iFileEntryList->Count() > aCurrentItemIndex && aCurrentItemIndex >= 0) - { - TFileEntry fileEntry = iFileEntryList->At(aCurrentItemIndex); - - TFileName fullPath = fileEntry.iPath; - fullPath.Append(fileEntry.iEntry.iName); - - TBool itemSelected(EFalse); - RFile sharableFile; -// TUid appUidExtracted; - - TRAPD(err, - - // use doc handler to get a sharable file handle - iDocHandler->OpenTempFileL(fullPath, sharableFile); - CleanupClosePushL(sharableFile); - - // find the data type - TDataRecognitionResult dataType; - User::LeaveIfError(iEngine->LsSession().RecognizeData(sharableFile, dataType)); - - // get all apps that support OpenFileService for this datatype - CApaAppServiceInfoArray* apps = iEngine->LsSession().GetServiceImplementationsLC(KOpenServiceUid, dataType.iDataType); - TArray appServiceInfos = apps->Array(); - - if (appServiceInfos.Count() > 0) - { - // build an array of the app names - CDesCArray* names = new (ELeave) CDesCArrayFlat(16); - CleanupStack::PushL(names); - for (TInt ii=0; iiLsSession().GetAppInfo(appInfo, appUid) == KErrNone) - { - names->AppendL(appInfo.iCaption); - } - else - { - TBuf<10> buf; - buf.Format(_L("0x%08x"), appUid); - names->AppendL(buf); - } - } - - // use a list query to select the app -// TInt index(0); -// CAknListQueryDialog* dlg = new(ELeave) CAknListQueryDialog(&index); -// dlg->PrepareLC(R_APP_SELECTION_QUERY); -// dlg->SetItemTextArray(names); -// dlg->SetOwnershipType(ELbmDoesNotOwnItemArray); -// -// if(dlg->RunLD()) -// { -// // extract the chosen UID -// appUidExtracted = appServiceInfos[index].Uid(); -// itemSelected = ETrue; -// } - - CleanupStack::PopAndDestroy(); // names - } - - if (itemSelected) - { - // start OpenFileService for the selected app - CAiwGenericParamList& paramList = iDocHandler->InParamListL(); - -// if (iOpenFileService) -// { -// delete iOpenFileService; -// iOpenFileService = NULL; -// } - -// iOpenFileService = CAknOpenFileService::NewL(appUidExtracted, sharableFile, this, ¶mList); - } - - CleanupStack::PopAndDestroy(2); // sharableFile, apps - - ); // TRAPD - - if (err != KErrNone) - { - _LIT(KMessage, "No file service available for %S"); - TFileName noteMsg; - noteMsg.Format(KMessage, &fileEntry.iEntry.iName); - - iEngine->FileBrowserUI()->ShowInformationNote(noteMsg, _L("")); - } - } - } - -// -------------------------------------------------------------------------------------------- - -TBool CFileBrowserFileUtils::FileExists(const TDesC& aPath) - { - return BaflUtils::FileExists(iFs, aPath); - } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::LaunchProgramL(const TDesC& aPath) - { - CApaCommandLine* commandLine = CApaCommandLine::NewLC(); - commandLine->SetExecutableNameL(aPath); - commandLine->SetCommandL(EApaCommandRun); - TInt err = iEngine->LsSession().StartApp(*commandLine); - CleanupStack::PopAndDestroy(); //commandLine - return err; - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::MemoryInfoPopupL() - { - _LIT(KUsedBytesEntry, "Used: %S bytes\n"); - _LIT(KFreeBytesEntry, "Free: %S bytes\n"); - _LIT(KSizeBytesEntry, "Size: %S bytes\n"); - - HBufC* messageBuf = HBufC::NewLC(2048); - TPtr messagePtr = messageBuf->Des(); - TBuf<128> entryLine; - - // RAM - TMemoryInfoV1Buf ramMemory; - UserHal::MemoryInfo(ramMemory); - messagePtr.Append(_L("RAM\n")); - - // used - TBuf<32> usedBuf; - usedBuf.AppendNum(ramMemory().iMaxFreeRamInBytes-ramMemory().iFreeRamInBytes, TRealFormat(KDefaultRealWidth, 0)); - entryLine.Format(KUsedBytesEntry, &usedBuf); - messagePtr.Append(entryLine); - - // free - TBuf<32> freeBuf; - freeBuf.AppendNum(ramMemory().iFreeRamInBytes, TRealFormat(KDefaultRealWidth, 0)); - entryLine.Format(KFreeBytesEntry, &freeBuf); - messagePtr.Append(entryLine); - - // size - TBuf<32> sizeBuf; - sizeBuf.AppendNum(ramMemory().iMaxFreeRamInBytes, TRealFormat(KDefaultRealWidth, 0)); - entryLine.Format(KSizeBytesEntry, &sizeBuf); - messagePtr.Append(entryLine); - - // All drives - for (TInt i=0; iCount(); i++) - { - TDriveEntry driveEntry = iDriveEntryList->At(i); - - messagePtr.Append(_L("\n")); - messagePtr.Append(driveEntry.iLetter); - messagePtr.Append(_L(":\n")); - - // used - TBuf<32> usedBuf; - usedBuf.AppendNum(driveEntry.iVolumeInfo.iSize-driveEntry.iVolumeInfo.iFree, TRealFormat(KDefaultRealWidth, 0)); - entryLine.Format(KUsedBytesEntry, &usedBuf); - messagePtr.Append(entryLine); - - // free - TBuf<32> freeBuf; - freeBuf.AppendNum(driveEntry.iVolumeInfo.iFree, TRealFormat(KDefaultRealWidth, 0)); - entryLine.Format(KFreeBytesEntry, &freeBuf); - messagePtr.Append(entryLine); - - // size - TBuf<32> sizeBuf; - sizeBuf.AppendNum(driveEntry.iVolumeInfo.iSize, TRealFormat(KDefaultRealWidth, 0)); - entryLine.Format(KSizeBytesEntry, &sizeBuf); - messagePtr.Append(entryLine); - } - -// CAknMessageQueryDialog* dialog = new(ELeave) CAknMessageQueryDialog; -// dialog->PrepareLC(R_MEMORYINFO_DIALOG); -// dialog->SetMessageTextL(messagePtr); -// dialog->RunLD(); - - CleanupStack::PopAndDestroy(); //messageBuf - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ShowFileCheckSumsL(TInt aCurrentItemIndex, TInt aType) - { - if (iFileEntryList->Count() > aCurrentItemIndex && aCurrentItemIndex >= 0) - { - TFileEntry fileEntry = iFileEntryList->At(aCurrentItemIndex); - TFileName fullPath = fileEntry.iPath; - fullPath.Append(fileEntry.iEntry.iName); - - // try to open the file for reading - RFile fileP; - TInt err = fileP.Open(iEngine->EikonEnv()->FsSession(), fullPath, EFileRead|EFileShareReadersOnly); - - if (err == KErrNone) - { - CleanupClosePushL(fileP); - - TBuf<128> checkSum; - HBufC* messageBuf = HBufC::NewLC(2048); - TPtr messagePtr = messageBuf->Des(); - - // get MD5 checksum - if (aType == EFileChecksumsMD5) - { - CMD5* md5 = CMD5::NewL(); - CleanupStack::PushL(md5); - HBufC8* md5Buf = MessageDigestInHexLC(md5, fileP); - checkSum.Copy(*md5Buf); - messagePtr.Append(_L("MD5\n")); - messagePtr.Append(checkSum); - CleanupStack::PopAndDestroy(2); // md5, md5Buf - } - - // get MD2 checksum - else if (aType == EFileChecksumsMD2) - { - CMD2* md2 = CMD2::NewL(); - CleanupStack::PushL(md2); - HBufC8* md2Buf = MessageDigestInHexLC(md2, fileP); - checkSum.Copy(*md2Buf); - messagePtr.Append(_L("MD2\n")); - messagePtr.Append(checkSum); - CleanupStack::PopAndDestroy(2); // md2, md2Buf - } - - // get SHA-1 checksum - else if (aType == EFileChecksumsSHA1) - { - CSHA1* sha1 = CSHA1::NewL(); - CleanupStack::PushL(sha1); - HBufC8* sha1Buf = MessageDigestInHexLC(sha1, fileP); - checkSum.Copy(*sha1Buf); - messagePtr.Append(_L("SHA-1\n")); - messagePtr.Append(checkSum); - CleanupStack::PopAndDestroy(2); // sha1, sha1Buf - } - - else - { - User::Panic(_L("Inv.CS.Type"), 723); - } - - // show dialog - iEngine->FileBrowserUI()->ShowInformationNote(messagePtr, fileEntry.iEntry.iName); - - CleanupStack::PopAndDestroy(2); // messageBuf, fileP - } - else - { - // open failed, show an error note - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - } - } - -// -------------------------------------------------------------------------------------------- - -HBufC8* CFileBrowserFileUtils::MessageDigestInHexLC(CMessageDigest* aMD, RFile& aFile) - { - // seek to file start - TInt startPos(0); - aFile.Seek(ESeekStart, startPos); - - // create result buffer - HBufC8* result = HBufC8::NewLC(128); - - const TInt KBufSize(1024); - TInt fileSize(0); - TInt fileOffset(0); - - // get file size - aFile.Size(fileSize); - - HBufC8* buf = HBufC8::NewMaxLC(KBufSize); - TPtr8 bufPtr(buf->Des()); - - // read to buffer - while (fileOffset < fileSize - KBufSize) - { - aFile.Read(bufPtr, KBufSize); - aMD->Hash(bufPtr); - fileOffset += bufPtr.Length(); - } - - aFile.Read(bufPtr, fileSize - fileOffset); - bufPtr.SetLength(fileSize - fileOffset); - - // get final message digest - TPtrC8 hashedSig(aMD->Final(bufPtr)); - - // change size of the result buffer - result->ReAllocL(hashedSig.Length() * 2); - TPtr8 resultPtr = result->Des(); - - // convert to hex format - for (TInt i=0; iSettings().iBypassPlatformSecurity) - { - TInt err(KErrNone); - - if (aEnable) - { - // make sure that the directory exists - iFileOps->MkDirAll(KErrRdPath); - - // create the file - err = iFileOps->CreateEmptyFile(KErrRdPath); - } - else - { - // get TEntry of ErrRd - TEntry entry; - err = iFs.Entry(KErrRdPath, entry); - - if (err == KErrNone) - { - TFileEntry fileEntry; - fileEntry.iPath = KErrRdDir; - fileEntry.iEntry = entry; - - err = iFileOps->Delete(fileEntry); - } - } - - // update view - RefreshViewL(); - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("State changed")); - } - else - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Cannot change the state")); - } - } - else - { - iEngine->FileBrowserUI()->ShowInformationNote(_L("Enable \"bypass platform security\" from the settings first"), _L("")); - } - #else - aEnable = aEnable; - iEngine->FileBrowserUI()->ShowInformationNote(_L("Not supported in lite version"), _L("")); - #endif - } - -// -------------------------------------------------------------------------------------------- - -//void CFileBrowserFileUtils::EnableAvkonIconCacheL(TBool aEnable) -// { -//#ifndef __SERIES60_30__ -// if (AknIconConfig::EnableAknIconSrvCache(aEnable) == KErrNone) -// { -// iEngine->FileBrowserUI()->ShowConfirmationNote(_L("State changed")); -// } -// else -// { -// iEngine->FileBrowserUI()->ShowErrorNote(_L("Unknown error occured")); -// } -// #else -// aEnable = aEnable; -// iEngine->FileBrowserUI()->ShowInformationNote(_L("Not supported in S60 3.0"), _L("")); -// #endif -// -// } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SimulateLeaveL(TInt aLeaveCode) - { - User::Leave(aLeaveCode); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SimulatePanicL(const TDesC& aPanicCategory, TInt aPanicCode) - { - User::Panic(aPanicCategory, aPanicCode); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SimulateExceptionL(TInt aExceptionCode) - { - User::RaiseException((TExcType)aExceptionCode); - } - -// -------------------------------------------------------------------------------------------- - -TUint32 CFileBrowserFileUtils::GetDebugMask() - { - return UserSvr::DebugMask(); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SetDebugMaskL(TUint32 aDbgMask) - { - User::SetDebugMask(aDbgMask); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::WriteAllAppsL() - { - _LIT(KAllAppsFileName, "AllApps.txt"); - TFileName allAppsPath = PathInfo::PhoneMemoryRootPath(); - allAppsPath.Append(KAllAppsFileName); - - RFile file; - if (file.Replace(iFs, allAppsPath, EFileWrite) == KErrNone) - { - CleanupClosePushL(file); - - CDesC8Array* appsArray = new(ELeave) CDesC8ArrayFlat(192); - CleanupStack::PushL(appsArray); - - TBuf8 fileEntry; - TBuf8 appFullPath; - _LIT8(KAppEntryFormat, "%S (0x%08X)%S"); - TApaAppInfo appInfo; - - iEngine->LsSession().GetAllApps(); - - while (iEngine->LsSession().GetNextApp(appInfo) == KErrNone) - { - appFullPath.Copy(appInfo.iFullName); - fileEntry.Format(KAppEntryFormat, &appFullPath, appInfo.iUid, &KFileNewLine); - appsArray->AppendL(fileEntry); - } - - appsArray->Sort(); - - for (TInt i=0; iCount(); i++) - { - file.Write(appsArray->MdcaPoint(i)); - } - - CleanupStack::PopAndDestroy(2); //appsArray, file - - _LIT(KMessage, "App list written to %S"); - TFileName noteMsg; - noteMsg.Format(KMessage, &allAppsPath); - - iEngine->FileBrowserUI()->ShowConfirmationNote(noteMsg, ETrue); // NoTimeout - } - else - { - _LIT(KMessage, "Failed writing to %S"); - TFileName noteMsg; - noteMsg.Format(KMessage, &allAppsPath); - - iEngine->FileBrowserUI()->ShowErrorNote(noteMsg, ETrue); // NoTimeout - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::WriteAllFilesL() - { - _LIT(KAllFilesFileName, "AllFiles.txt"); - TFileName allFilesPath = PathInfo::PhoneMemoryRootPath(); - allFilesPath.Append(KAllFilesFileName); - - RFile file; - if (file.Replace(iFs, allFilesPath, EFileWrite) == KErrNone) - { - CleanupClosePushL(file); - iFindFileEntryList->Reset(); - - iEngine->FileBrowserUI()->ShowWaitDialog(_L("Generating")); - - for (TInt i=0; iCount(); i++) - { - TDriveEntry driveEntry = iDriveEntryList->At(i); - - TBuf<10> driveRoot; - driveRoot.Append(driveEntry.iLetter); - driveRoot.Append(_L(":\\")); - - // current dir - DoFindFiles(_L("*"), driveRoot); - - // recurse into sub directories - DoFindFilesRecursiveL(_L("*"), driveRoot); - } - - // write entries - TBuf8 writeBuf; - for (TInt i=0; iCount(); i++) - { - TFileEntry fileEntry = iFindFileEntryList->At(i); - - writeBuf.Copy(fileEntry.iPath); - writeBuf.Append(fileEntry.iEntry.iName); - writeBuf.Append(_L(",")); - writeBuf.AppendNum(fileEntry.iEntry.iSize); - writeBuf.Append(_L(" B")); - -// // date -// TTime entryModified = fileEntry.iEntry.iModified; -// // convert from universal time -// if ( iTz.ConvertToLocalTime( entryModified ) == KErrNone ) -// { -// entryModified = fileEntry.iEntry.iModified; // use universal time -// } -// -// _LIT(KDateFormat, "%D%M%Y%/0%1%/1%2%/2%3%/3"); -// TBuf<32> dateBuf; -// entryModified.FormatL(dateBuf, KDateFormat); -// writeBuf.Append(dateBuf); -// -// writeBuf.Append(_L(" ")); -// // time -// _LIT(KTimeFormat, "%-B%:0%J%:1%T%:2%S%:3%+B"); -// TBuf<32> timeBuf; -// entryModified.FormatL(timeBuf, KTimeFormat); -// writeBuf.Append(timeBuf); -// - writeBuf.Append(KFileNewLine); - file.Write(writeBuf); - } - - iEngine->FileBrowserUI()->CancelWaitDialog(); - - CleanupStack::PopAndDestroy(); //file - iFindFileEntryList->Reset(); - - _LIT(KMessage, "File list written to %S"); - TFileName noteMsg; - noteMsg.Format(KMessage, &allFilesPath); - - iEngine->FileBrowserUI()->ShowConfirmationNote(noteMsg, EFalse); // NoTimeout - } - else - { - _LIT(KMessage, "Failed writing to %S"); - TFileName noteMsg; - noteMsg.Format(KMessage, &allFilesPath); - - iEngine->FileBrowserUI()->ShowErrorNote(noteMsg, ETrue); // NoTimeout - } - } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::DoFindFiles(const TDesC& aFileName, const TDesC& aPath) - { - TFindFile fileFinder(iFs); - CDir* dir; - TInt err = fileFinder.FindWildByPath(aFileName, &aPath, dir); - - while (err == KErrNone && iAllowProcessing) - { - iEngine->FileBrowserUI()->ProcessEvents(); - for (TInt i=0; iCount(); i++) - { - TEntry entry = (*dir)[i]; - - // ignore any directory entries - if (!entry.IsDir() && entry.iName.Length() && aPath.Length()) - { - TParse parsedName; - parsedName.Set(entry.iName, &fileFinder.File(), NULL); - - if (parsedName.Drive().Length() && aPath.Length() && parsedName.Drive()[0] == aPath[0]) - { - TFileEntry fileEntry; - fileEntry.iPath = parsedName.DriveAndPath(); - fileEntry.iEntry = entry; - fileEntry.iDirEntries = KErrNotFound; - fileEntry.iIconId = EFixedIconEmpty; - - TRAP(err, iFindFileEntryList->AppendL(fileEntry)); - } - } - } - - delete dir; - dir = NULL; - err = fileFinder.FindWild(dir); - } - - return err; - } - -// -------------------------------------------------------------------------------------------- - -TInt CFileBrowserFileUtils::DoFindFilesRecursiveL(const TDesC& aFileName, const TDesC& aPath) - { - TInt err(KErrNone); - CDirScan* scan = CDirScan::NewLC(iFs); - scan->SetScanDataL(aPath, KEntryAttDir|KEntryAttMatchMask, ESortByName | EAscending | EDirsFirst); - CDir* dir = NULL; - - for(;;) - { - TRAP(err, scan->NextL(dir)); - if (!dir || (err != KErrNone)) - break; - - for (TInt i=0; iCount(); i++) - { - TEntry entry = (*dir)[i]; - - if (entry.IsDir()) - { - TFileName path(scan->FullPath()); - - if (path.Length()) - { - path.Append(entry.iName); - path.Append(_L("\\")); - DoFindFiles(aFileName, path); - } - } - } - delete(dir); - } - - CleanupStack::PopAndDestroy(scan); - return err; - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ListOpenFilesL() - { - iFileEntryList->Reset(); - - CFileList* dir = NULL; - TOpenFileScan fileScan(iFs); - fileScan.NextL(dir); - - while (dir) - { - for (TInt i=0; iCount(); i++) - { - TEntry entry = (*dir)[i]; - TFileName fullPath; - - // TOpenFileScan does not return drive letters for the entries, so try to guess it - if (entry.iName.Length() > 2 && entry.iName[1] != ':') - { - for (TInt i=0; iCount(); i++) - { - TDriveEntry driveEntry = iDriveEntryList->At(i); - - TFileName guessPath; - guessPath.Append(driveEntry.iLetter); - guessPath.Append(_L(":")); - guessPath.Append(entry.iName); - - // check if the file exists - if (BaflUtils::FileExists(iFs, guessPath)) - { - // if it's on read only drive, then take it or check if it's really in use - TBool readOnlyDrive(ETrue); - BaflUtils::DiskIsReadOnly(iFs, guessPath, readOnlyDrive); - - if (readOnlyDrive || iFs.SetEntry(guessPath, entry.iModified, NULL, NULL) == KErrInUse) - { - fullPath = guessPath; - break; - } - } - } - } - else - { - fullPath = entry.iName; - } - - TParse nameParser; - if (fullPath.Length() && nameParser.SetNoWild(fullPath, NULL, NULL) == KErrNone) - { - entry.iName = nameParser.NameAndExt(); - - TFileEntry fileEntry; - fileEntry.iPath = nameParser.DriveAndPath(); - fileEntry.iEntry = entry; - fileEntry.iDirEntries = KErrNotFound; - fileEntry.iIconId = EFixedIconEmpty; - - iFileEntryList->AppendL(fileEntry); - } - } - - delete dir; - dir = NULL; - fileScan.NextL(dir); - } - - TInt operations = iFileEntryList->Count(); - - iListingMode = EOpenFiles; - // TODO - //iEngine->FileListContainer()->ListBox()->SetCurrentItemIndex(0); - RefreshViewL(); - - _LIT(KMessage, "%d open files found"); - TFileName noteMsg; - noteMsg.Format(KMessage, operations); - - iEngine->FileBrowserUI()->ShowInformationNote(noteMsg, _L("")); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ListMessageAttachmentsL(TInt aType) - { - iFileEntryList->Reset(); - - CMsvSession* session = CMsvSession::OpenSyncL(*this); - CleanupStack::PushL(session); - - CMsvEntry* context = NULL; - - if (aType == EFileBrowserCmdToolsMsgAttachmentsInbox) - context = session->GetEntryL(KMsvGlobalInBoxIndexEntryId); - else if (aType == EFileBrowserCmdToolsMsgAttachmentsDrafts) - context = session->GetEntryL(KMsvDraftEntryId); - else if (aType == EFileBrowserCmdToolsMsgAttachmentsSentItems) - context = session->GetEntryL(KMsvSentEntryId); - else if (aType == EFileBrowserCmdToolsMsgAttachmentsOutbox) - context = session->GetEntryL(KMsvGlobalOutBoxIndexEntryId); - else - User::Panic(_L("MsgAtt.Mode"), 100); - - CleanupStack::PushL(context); - - CDesCArray* attPaths = new(ELeave) CDesCArrayFlat(128); - CleanupStack::PushL(attPaths); - - // read attachment paths - ReadAttachmentPathsRecursiveL(session, context, attPaths); - - // create file entries of the paths - for (TInt i=0; iMdcaCount(); i++) - { - TFileEntry fileEntry; - TEntry entry; - TParse nameParser; - - if (attPaths->MdcaPoint(i).Length() && - nameParser.SetNoWild(attPaths->MdcaPoint(i), NULL, NULL) == KErrNone && - iFs.Entry(attPaths->MdcaPoint(i), entry) == KErrNone) - { - TFileEntry fileEntry; - fileEntry.iPath = nameParser.DriveAndPath(); - fileEntry.iEntry = entry; - fileEntry.iDirEntries = KErrNotFound; - fileEntry.iIconId = EFixedIconEmpty; - - iFileEntryList->AppendL(fileEntry); - } - } - - CleanupStack::PopAndDestroy(3); //session, context, attPaths - - TInt operations = iFileEntryList->Count(); - - if (aType == EFileBrowserCmdToolsMsgAttachmentsInbox) - iListingMode = EMsgAttachmentsInbox; - else if (aType == EFileBrowserCmdToolsMsgAttachmentsDrafts) - iListingMode = EMsgAttachmentsDrafts; - else if (aType == EFileBrowserCmdToolsMsgAttachmentsSentItems) - iListingMode = EMsgAttachmentsSentItems; - else if (aType == EFileBrowserCmdToolsMsgAttachmentsOutbox) - iListingMode = EMsgAttachmentsOutbox; - - // TODO - //iEngine->FileListContainer()->ListBox()->SetCurrentItemIndex(0); - RefreshViewL(); - - _LIT(KMessage, "%d files found"); - TFileName noteMsg; - noteMsg.Format(KMessage, operations); - - iEngine->FileBrowserUI()->ShowInformationNote(noteMsg, _L("")); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ReadAttachmentPathsRecursiveL(CMsvSession* aSession, CMsvEntry* aContext, CDesCArray* aAttPaths) - { - CMsvEntrySelection* entrySelection = aContext->ChildrenL(); - CleanupStack::PushL(entrySelection); - - for (TInt i=0; iCount(); i++) - { - CMsvEntry* entry = aSession->GetEntryL((*entrySelection)[i]); - CleanupStack::PushL(entry); - - CMsvStore* store = NULL; - TRAPD(err, store = entry->ReadStoreL()); - - if (err == KErrNone) - { - CleanupStack::PushL(store); - - for (TInt j=0; jAttachmentManagerL().AttachmentCount(); j++) - { - CMsvAttachment* attachment = store->AttachmentManagerL().GetAttachmentInfoL(j); - CleanupStack::PushL(attachment); - - aAttPaths->AppendL(attachment->FilePath()); - - CleanupStack::PopAndDestroy(); //attachment - } - CleanupStack::PopAndDestroy(); // store - } - - // recurse into children - if (entry->Count() > 0) - { - ReadAttachmentPathsRecursiveL(aSession, entry, aAttPaths); - } - - CleanupStack::PopAndDestroy(); // entry - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::WriteMsgStoreWalkL() - { - _LIT(KAllAppsFileName, "MsgStoreWalk.txt"); - TFileName allAppsPath = PathInfo::PhoneMemoryRootPath(); - allAppsPath.Append(KAllAppsFileName); - - if (iMsgStoreWalkFile.Replace(iFs, allAppsPath, EFileWrite) == KErrNone) - { - CMsvSession* session = CMsvSession::OpenSyncL(*this); - CleanupStack::PushL(session); - - CMsvEntry* context = session->GetEntryL(KMsvRootIndexEntryId); - CleanupStack::PushL(context); - - iMsgStoreWalkFile.Write(_L8("id service_id related_id type mtm date size error biotype mtmdata1 mtmdata2 mtmdata3 description details\r\n\r\n")); - - // write details about the root entry - DoWriteMessageEntryInfoL(context, iMsgStoreWalkFile, 0); - - // get and write info recursively - TInt level(1); - WriteMessageEntryInfoRecursiveL(session, context, iMsgStoreWalkFile, level); - - CleanupStack::PopAndDestroy(2); //session, context - - iMsgStoreWalkFile.Flush(); - iMsgStoreWalkFile.Close(); - - _LIT(KMessage, "Msg. store walk written to %S"); - TFileName noteMsg; - noteMsg.Format(KMessage, &allAppsPath); - - iEngine->FileBrowserUI()->ShowConfirmationNote(noteMsg, ETrue); // NoTimeout - } - else - { - _LIT(KMessage, "Failed writing to %S"); - TFileName noteMsg; - noteMsg.Format(KMessage, &allAppsPath); - - iEngine->FileBrowserUI()->ShowErrorNote(noteMsg, ETrue); // NoTimeout - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::WriteMessageEntryInfoRecursiveL(CMsvSession* aSession, CMsvEntry* aContext, RFile& aFile, TInt& aLevel) - { - CMsvEntrySelection* entrySelection = aContext->ChildrenL(); - CleanupStack::PushL(entrySelection); - - for (TInt i=0; iCount(); i++) - { - CMsvEntry* entry = aSession->GetEntryL((*entrySelection)[i]); - CleanupStack::PushL(entry); - - DoWriteMessageEntryInfoL(entry, aFile, aLevel); - - // recurse into children - if (entry->Count() > 0) - { - aLevel++; - WriteMessageEntryInfoRecursiveL(aSession, entry, aFile, aLevel); - aLevel--; - } - - CleanupStack::PopAndDestroy(); // entry - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::DoWriteMessageEntryInfoL(CMsvEntry* aContext, RFile& aFile, TInt aLevel) - { - TMsvEntry messageEntry = aContext->Entry(); - - for (TInt j=0; j desc; - desc.Copy(messageEntry.iDescription); - - TBuf8<256> details; - details.Copy(messageEntry.iDetails); - - _LIT8(KLine, "-> %d %d %d %d %d %Ld %d %d %d %d %d %d %S %S\r\n"); - TBuf8<1024> buf; - buf.Format(KLine, messageEntry.Id(), messageEntry.iServiceId, messageEntry.iRelatedId, messageEntry.iType.iUid, - messageEntry.iMtm.iUid, messageEntry.iDate.Int64(), messageEntry.iSize, messageEntry.iError, messageEntry.iBioType, - messageEntry.iMtmData1, messageEntry.iMtmData2, messageEntry.iMtmData3, &desc, &details); - - aFile.Write(buf); - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::HandleSessionEventL(TMsvSessionEvent /*aEvent*/, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/) - { - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::FileEditorL(TInt aCurrentItemIndex, TInt /*aType*/) - { - // TODO - // just get current item - //TInt currentItemIndex = iEngine->QueryCurrentItemIndex(); - - if (iFileEntryList->Count() > aCurrentItemIndex && aCurrentItemIndex >= 0) - { - TFileEntry fileEntry = iFileEntryList->At(aCurrentItemIndex); - - // only valid for files - if (!fileEntry.iEntry.IsDir()) - { - TFileName fullPath = fileEntry.iPath; - fullPath.Append(fileEntry.iEntry.iName); - -// iEngine->FileListContainer()->SetNaviPaneTextL(fileEntry.iEntry.iName); -// -// TInt editorMode(0); -// -// if (aType == EFileBrowserCmdFileViewText) -// editorMode = EFileEditorViewAsText; -// else if (aType == EFileBrowserCmdFileViewHex) -// editorMode = EFileEditorViewAsHex; -// else if (aType == EFileBrowserCmdFileEditText) -// editorMode = EFileEditorEditAsText; -// else if (aType == EFileBrowserCmdFileEditHex) -// editorMode = EFileEditorEditAsHex; -// else -// User::Panic(_L("Inv.Ed.Mode"), 843); -// -// // launch dialog -// CFileBrowserFileEditorDlg* dlg = CFileBrowserFileEditorDlg::NewL(fullPath, editorMode); -// dlg->RunDlgLD(); -// -// iEngine->FileListContainer()->SetNaviPaneTextL(iCurrentPath); -// -// if (aType == EFileBrowserCmdFileEditText || aType == EFileBrowserCmdFileEditHex) -// { -// RefreshViewL(); -// } - } - } - } - -// -------------------------------------------------------------------------------------------- - -TBool CFileBrowserFileUtils::DriveSnapShotPossible() - { -// // TODO -// // check that E-drive is available -// TBool EDriveIsOK(EFalse); -// -// for (TInt i=0; iCount(); i++) -// { -// TDriveEntry driveEntry = iDriveEntryList->At(i); -// -// if (driveEntry.iNumber == EDriveE) -// { -// if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttLocked || driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAbsent) -// EDriveIsOK = EFalse; -// else -// EDriveIsOK = ETrue; -// } -// } -// -// if (!EDriveIsOK) -// return EFalse; -// -// // get current item -// TInt currentItemIndex = iEngine->QueryCurrentItemIndex(); -// -// if (iDriveEntryList->Count() > currentItemIndex && currentItemIndex >= 0) -// { -// TDriveEntry driveEntry = iDriveEntryList->At(currentItemIndex); -// -// // drive snapshot not possible when E-drive is highlighted, since that's where we are copying -// if (driveEntry.iNumber == EDriveE) -// return EFalse; -// else -// return ETrue; -// } - return EFalse; - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::DriveSnapShotL() - { -// if (iEngine->Settings().iBypassPlatformSecurity) -// { -// // get current item -// TInt currentItemIndex = iEngine->QueryCurrentItemIndex(); -// -// if (iDriveEntryList->Count() > currentItemIndex && currentItemIndex >= 0) -// { -// TDriveEntry driveEntry = iDriveEntryList->At(currentItemIndex); -// -// TChar sourceDriveLetter = driveEntry.iLetter; -// TChar targetDriveLetter = 'E'; // hardcoded drive letter, could be better if would be queried from the user -// -// // append to the command array -// AppendToCommandArrayL(EFileBrowserFileOpCommandDriveSnapShot, -// new(ELeave)CCommandParamsDriveSnapShot(sourceDriveLetter, targetDriveLetter) -// ); -// -// // execute the operation -// StartExecutingCommandsL(_L("Copying")); -// } -// } -// else -// { -// iEngine->FileBrowserUI()->ShowInformationNote(_L("Enable \"bypass platform security\" from the settings first"), _L("")); -// } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SetDrivePasswordL(TInt aIndex, - const TFileName &aOldPassword, - const TFileName &aNewPassword) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TMediaPassword oldPassword; - TMediaPassword newPassword; - - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - ConvertCharsToPwd(aOldPassword, oldPassword); - ConvertCharsToPwd(aNewPassword, newPassword); - - // set the password, does not actually lock the drive - TInt err = iFs.LockDrive(driveEntry.iNumber, oldPassword, newPassword, ETrue); - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Password set")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::UnlockDriveL(TInt aIndex, const TFileName &aOldPassword) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - TMediaPassword oldPassword; - ConvertCharsToPwd(aOldPassword, oldPassword); - - // unlock the drive - TInt err = iFs.UnlockDrive(driveEntry.iNumber, oldPassword, ETrue) == KErrNone; - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Drive unlocked")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ClearDrivePasswordL(TInt aIndex, const TFileName &aOldPassword) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - TMediaPassword oldPassword; - - ConvertCharsToPwd(aOldPassword, oldPassword); - - // clear the password from the drive - TInt err = iFs.ClearPassword(driveEntry.iNumber, oldPassword); - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Password cleared")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::EraseDrivePasswordL(TInt aIndex) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - // erase the password from the drive - TInt err(KErrNone); - err = iFs.ErasePassword(driveEntry.iNumber); - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Password erased")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Cannot erase, you may have to format the drive first")); - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::FormatDriveL(TInt aIndex, TBool aQuickFormat) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - TInt err(KErrNone); - TInt formatCount(0); - - TBuf<10> driveRoot; - driveRoot.Append(driveEntry.iLetter); - driveRoot.Append(_L(":")); - - TUint formatMode(0); - if (aQuickFormat) - formatMode = ESpecialFormat|EQuickFormat; - else - formatMode = ESpecialFormat|EFullFormat; - - // set as system application to prevent getting shut down events - iEngine->EikonEnv()->SetSystem(ETrue); - - // first close any open applications - CBaBackupSessionWrapper* BSWrapper = CBaBackupSessionWrapper::NewL(); - CleanupStack::PushL(BSWrapper); - - TBackupOperationAttributes atts(MBackupObserver::EReleaseLockNoAccess, MBackupOperationObserver::EStart); - BSWrapper->NotifyBackupOperationL(atts); - - CAsyncWaiter* waiter = CAsyncWaiter::NewLC(); - BSWrapper->CloseAll( MBackupObserver::EReleaseLockNoAccess, waiter->iStatus ); - waiter->StartAndWait(); - CleanupStack::PopAndDestroy(); //waiter - - // some delay to make sure all applications have been closed - User::After(1000000); - - // format the drive - RFormat format; - err = format.Open(iFs, driveRoot, formatMode, formatCount); - - // Forced format for locked card - if ( err == KErrLocked ) - { - // Erase password and try again - err = iFs.ErasePassword( driveEntry.iNumber ); - if ( !err ) - { - err = format.Open(iFs, driveRoot, formatMode, formatCount); - } - } - - if( err != KErrNone && err != KErrLocked ) - { -// CAknQueryDialog* lockQuery = CAknQueryDialog::NewL(); -// if ( lockQuery->ExecuteLD(R_GENERAL_CONFIRMATION_QUERY, _L("Memory card in use by other application. Proceed anyway?"))) - // TODO Dialog should be opened in UI part - if (iEngine->FileBrowserUI()->ShowConfirmationQuery(_L("Memory card in use by other application. Proceed anyway?"))) - { - // If format could not be started, someone is still keeping - // files open on media. Let's try to dismount file system, then - // remount with own extension embedded and try again. - - TFullName fsName; - err = iFs.FileSystemName( fsName, driveEntry.iNumber ); - - if ( err == KErrNone && fsName.Length() > 0 ) - { - // Prevent SysAp shutting down applications - RProperty::Set( - KPSUidCoreApplicationUIs, - KCoreAppUIsMmcRemovedWithoutEject, - ECoreAppUIsEjectCommandUsed ); - - TRequestStatus stat; - iFs.NotifyDismount( driveEntry.iNumber, stat, EFsDismountForceDismount ); - User::WaitForRequest( stat ); - - // Unfortunately, at the moment we have to wait until clients have received - // notification about card dismount. Otherwise at least causes problems with - // theme selected from card. In future clients should use new notify-API. - User::After( KForcedFormatTimeout ); - - // Let's set priority higher than normally. This is done to decrease the chance - // that someone reopens files on memory card after mandatory file system - // remounting hence preventing formatting again. - TThreadPriority priority( RThread().Priority() ); - RThread().SetPriority( EPriorityAbsoluteHigh ); - - // Mount file system back... - err = iFs.MountFileSystem( fsName, driveEntry.iNumber ); - err = format.Open(iFs, driveRoot, formatMode, formatCount); - RThread().SetPriority( priority ); - } - } - } - - - if (err == KErrNone) - { - // needs to be implemented with active objects - // CAknProgressDialog* dlg = new(ELeave) CAknProgressDialog(formatCount, 1, 1, NULL); - // dlg->SetTone(CAknNoteDialog::ENoTone); - // dlg->ExecuteLD(R_FORMAT_PROGRESS_NOTE); - - while (formatCount && err == KErrNone) - { - err = format.Next(formatCount); - } - } - - format.Close(); - - // restart closed applications - TBackupOperationAttributes atts2(MBackupObserver::ETakeLock, MBackupOperationObserver::EEnd); - BSWrapper->NotifyBackupOperationL(atts2); - BSWrapper->RestartAll(); - CleanupStack::PopAndDestroy(); //BSWrapper - - // system status not needed anymore - iEngine->EikonEnv()->SetSystem(EFalse); - - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Format succeeded")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::EraseMBRL(TInt aIndex) - { - // TODO - #ifndef FILEBROWSER_LITE - if (iEngine->Settings().iBypassPlatformSecurity) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - TInt err(KErrNone); - - iEngine->FileBrowserUI()->ShowInformationNote(_L("Please wait, this may take 30 seconds"), _L("")); - - // set as system application to prevent getting shut down events - iEngine->EikonEnv()->SetSystem(ETrue); - - // first close any open applications - CBaBackupSessionWrapper* BSWrapper = CBaBackupSessionWrapper::NewL(); - CleanupStack::PushL(BSWrapper); - - TBackupOperationAttributes atts(MBackupObserver::EReleaseLockNoAccess, MBackupOperationObserver::EStart); - BSWrapper->NotifyBackupOperationL(atts); - - CAsyncWaiter* waiter = CAsyncWaiter::NewLC(); - BSWrapper->CloseAll( MBackupObserver::EReleaseLockNoAccess, waiter->iStatus ); - waiter->StartAndWait(); - CleanupStack::PopAndDestroy(); //waiter - - // some delay to make sure all applications have been closed - User::After(1000000); - - - // do the erase MBR operation - err = iFileOps->EraseMBR(driveEntry.iNumber); - - - // restart closed applications - TBackupOperationAttributes atts2(MBackupObserver::ETakeLock, MBackupOperationObserver::EEnd); - BSWrapper->NotifyBackupOperationL(atts2); - BSWrapper->RestartAll(); - CleanupStack::PopAndDestroy(); //BSWrapper - - // system status not needed anymore - iEngine->EikonEnv()->SetSystem(EFalse); - - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Erase MBR succeeded")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - else - { - iEngine->FileBrowserUI()->ShowInformationNote(_L("Enable \"bypass platform security\" from the settings first"), _L("")); - } - #else - iEngine->FileBrowserUI()->ShowInformationNote(_L("Not supported in lite version"), _L("")); - #endif - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::PartitionDriveL(TInt aIndex, TBool aEraseMBR, TInt aAmountOfPartitions) - { - // TODO - #ifndef FILEBROWSER_LITE - if (iEngine->Settings().iBypassPlatformSecurity) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - TInt err(KErrNone); - - iEngine->FileBrowserUI()->ShowInformationNote(_L("Please wait, this may take 30 seconds"), _L("")); - - // set as system application to prevent getting shut down events - iEngine->EikonEnv()->SetSystem(ETrue); - - // first close any open applications - CBaBackupSessionWrapper* BSWrapper = CBaBackupSessionWrapper::NewL(); - CleanupStack::PushL(BSWrapper); - - TBackupOperationAttributes atts(MBackupObserver::EReleaseLockNoAccess, MBackupOperationObserver::EStart); - BSWrapper->NotifyBackupOperationL(atts); - - CAsyncWaiter* waiter = CAsyncWaiter::NewLC(); - BSWrapper->CloseAll( MBackupObserver::EReleaseLockNoAccess, waiter->iStatus ); - waiter->StartAndWait(); - CleanupStack::PopAndDestroy(); //waiter - - // some delay to make sure all applications have been closed - User::After(1000000); - - // do the erase operation - if (aEraseMBR) - { - err = iFileOps->EraseMBR(driveEntry.iNumber); - - if (err != KErrNone) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Erase MBR failed")); - } - - User::After(500000); - } - - - // do the partition operation - err = iFileOps->PartitionDrive(driveEntry.iNumber, aAmountOfPartitions); - - - // restart closed applications - TBackupOperationAttributes atts2(MBackupObserver::ETakeLock, MBackupOperationObserver::EEnd); - BSWrapper->NotifyBackupOperationL(atts2); - BSWrapper->RestartAll(); - CleanupStack::PopAndDestroy(); //BSWrapper - - // system status not needed anymore - iEngine->EikonEnv()->SetSystem(EFalse); - - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Partition succeeded")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - else - { - iEngine->FileBrowserUI()->ShowInformationNote(_L("Enable \"bypass platform security\" from the settings first"), _L("")); - } - #else - iEngine->FileBrowserUI()->ShowInformationNote(_L("Not supported in lite version"), _L("")); - #endif - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::CheckDiskL(TInt aIndex) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - TBuf<10> driveRoot; - driveRoot.Append(driveEntry.iLetter); - driveRoot.Append(_L(":")); - - // check disk - TInt err = iFs.CheckDisk(driveRoot); - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Integrity of the disk is ok")); - } - else if (err == KErrNotReady) - { - iEngine->FileBrowserUI()->ShowInformationNote(_L("Disk is empty"), _L("")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Disk is corrupted")); - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ScanDriveL(TInt aIndex) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - TBuf<10> driveRoot; - driveRoot.Append(driveEntry.iLetter); - driveRoot.Append(_L(":")); - - // scan disk - TInt err = iFs.ScanDrive(driveRoot); - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Run succesfully")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::GetDriveName(TInt aIndex, TFileName &aDriveName) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - // get existing drive name - iFs.GetDriveName(driveEntry.iNumber, aDriveName); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SetDriveNameL(TInt aIndex, const TFileName &aDriveName) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - // set drive name - TInt err = iFs.SetDriveName(driveEntry.iNumber, aDriveName); - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Name changed")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::GetDriveVolumeLabel(TInt aIndex, TFileName &aVolumeLabel) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - // get existing volume label - aVolumeLabel.Copy(driveEntry.iVolumeInfo.iName); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SetDriveVolumeLabelL(TInt aIndex, const TFileName &aVolumeLabel) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - // set volume label - TInt err = iFs.SetVolumeLabel(aVolumeLabel, driveEntry.iNumber); - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Volume label changed")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::EjectDriveL(TInt aIndex) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - TInt err(KErrNone); - - // get current filesystem name - TFileName fileSystemName; - err = iFs.FileSystemName(fileSystemName, driveEntry.iNumber); - - if (err == KErrNone) - { - // Prevent SysAp shutting down applications - RProperty::Set( - KPSUidCoreApplicationUIs, - KCoreAppUIsMmcRemovedWithoutEject, - ECoreAppUIsEjectCommandUsed ); - - // dismount the file system - err = iFs.DismountFileSystem(fileSystemName, driveEntry.iNumber); - - if (err == KErrNone) - { - // remount the file system - err = iFs.MountFileSystem(fileSystemName, driveEntry.iNumber); - - if (err == KErrInUse) - { - // try to remount after a while if locked - User::After(1000000); - err = iFs.MountFileSystem(fileSystemName, driveEntry.iNumber); - } - } - } - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Ejected succesfully")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::DismountFileSystemL(TInt aIndex) - { - if (iDriveEntryList->Count() > aIndex && aIndex >= 0) - { - TDriveEntry driveEntry = iDriveEntryList->At(aIndex); - - TInt err(KErrNone); - - // get current filesystem name - TFileName fileSystemName; - err = iFs.FileSystemName(fileSystemName, driveEntry.iNumber); - - if (err == KErrNone) - { - // Prevent SysAp shutting down applications - RProperty::Set( - KPSUidCoreApplicationUIs, - KCoreAppUIsMmcRemovedWithoutEject, - ECoreAppUIsEjectCommandUsed ); - - // dismount the file system - err = iFs.DismountFileSystem(fileSystemName, driveEntry.iNumber); - } - - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Dismounted succesfully")); - } - else if (err == KErrNotSupported) - { - iEngine->FileBrowserUI()->ShowErrorNote(_L("Not supported for this drive")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - - RefreshViewL(); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::ConvertCharsToPwd(const TDesC& aWord, TDes8& aConverted) const - { - aConverted.FillZ(aConverted.MaxLength()); - aConverted.Zero(); - - if (aWord.Length()) - { - aConverted.Copy( (TUint8*)(&aWord[0]), aWord.Size() ); - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::EditDataTypesL() - { - // TODO - /* - iEngine->FileListContainer()->SetScreenLayoutL(EDisplayModeNormal); - iEngine->FileListContainer()->SetNaviPaneTextL(KNullDesC); - - CFileBrowserDataTypesDlg* dlg = CFileBrowserDataTypesDlg::NewL(); - dlg->RunQueryLD(); - - iEngine->FileListContainer()->SetScreenLayoutL(iEngine->Settings().iDisplayMode); - iEngine->FileListContainer()->SetNaviPaneTextL(iCurrentPath); - */ - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::SecureBackupL(TInt aType) - { - TInt err(KErrNone); - TInt showStatus(EFalse); - - if (aType == EFileBrowserCmdToolsSecureBackupStartBackup || aType == EFileBrowserCmdToolsSecureBackupStartRestore) - { -// TInt queryIndexState(0); -// TInt queryIndexType(0); - -// CAknListQueryDialog* listQueryDlgState = new(ELeave) CAknListQueryDialog(&queryIndexState); -// if (listQueryDlgState->ExecuteLD(R_SECUREBACKUP_STATE_QUERY)) -// { -// -// CAknListQueryDialog* listQueryDlgType = new(ELeave) CAknListQueryDialog(&queryIndexType); -// if (listQueryDlgType->ExecuteLD(R_SECUREBACKUP_TYPE_QUERY)) -// { -// conn::TBURPartType partType = conn::EBURNormal; -// conn::TBackupIncType backupIncType = conn::ENoBackup; -// -// if (aType == EFileBrowserCmdToolsSecureBackupStartBackup) -// { -// if (queryIndexState == ESecureBackupStateFull) -// partType = conn::EBURBackupFull; -// else if (queryIndexState == ESecureBackupStatePartial) -// partType = conn::EBURBackupPartial; -// } -// else if (aType == EFileBrowserCmdToolsSecureBackupStartRestore) -// { -// if (queryIndexState == ESecureBackupStateFull) -// partType = conn::EBURRestoreFull; -// else if (queryIndexState == ESecureBackupStatePartial) -// partType = conn::EBURRestorePartial; -// } -// -// if (queryIndexType == ESecureBackupTypeBase) -// backupIncType = conn::EBackupBase; -// else if (queryIndexType == ESecureBackupTypeIncremental) -// backupIncType = conn::EBackupIncrement; -// -// // start secure backup -// err = iFileOps->ActivateSecureBackUp(partType, backupIncType); -// showStatus = ETrue; -// } -// } - } - - else if (aType == EFileBrowserCmdToolsSecureBackupStop) - { - err = iFileOps->DeActivateSecureBackUp(); - showStatus = ETrue; - } - - else - User::Panic(_L("Sec.br.mode"), 101); - - - if (showStatus) - { - if (err == KErrNone) - { - iEngine->FileBrowserUI()->ShowConfirmationNote(_L("Succeeded")); - } - else - { - CTextResolver* textResolver = CTextResolver::NewLC(*iEngine->EikonEnv()); - - iEngine->FileBrowserUI()->ShowErrorNote( - textResolver->ResolveErrorString(err, CTextResolver::ECtxNoCtxNoSeparator) ); - - CleanupStack::PopAndDestroy(); //textResolver - } - } - } - -// -------------------------------------------------------------------------------------------- - -void CFileBrowserFileUtils::OpenCommonFileActionQueryL(TInt aCurrentItemIndex) - { - // TODO - // just get current item -// TInt currentItemIndex = iEngine->QueryCurrentItemIndex(); - - if (iFileEntryList->Count() > aCurrentItemIndex && aCurrentItemIndex >= 0) - { -// TInt queryIndex(0); -// -// CAknListQueryDialog* listQueryDlg = new(ELeave) CAknListQueryDialog(&queryIndex); -// -// if (listQueryDlg->ExecuteLD(R_COMMON_FILE_ACTION_QUERY)) -// { -// if (queryIndex == ECommonFileActionViewAsTextHex) -// { -// TFileEntry fileEntry = iFileEntryList->At(aCurrentItemIndex); -// -// TFileName fullPath = fileEntry.iPath; -// fullPath.Append(fileEntry.iEntry.iName); -// -// TInt viewerType(EFileBrowserCmdFileViewHex); -// -// // check from mime type if it's text -// TDataType dataType; -// TUid appUid; -// if (iEngine->LsSession().AppForDocument(fullPath, appUid, dataType) == KErrNone) -// { -// TBuf<128> mimeTypeBuf; -// mimeTypeBuf.Copy(dataType.Des8()); -// if (mimeTypeBuf == KNullDesC) -// mimeTypeBuf.Copy(_L("N/A")); -// -// if (mimeTypeBuf.CompareF(_L("text/plain")) == 0) -// viewerType = EFileBrowserCmdFileViewText; -// } -// -// FileEditorL(viewerType); -// } -// -// else if (queryIndex == ECommonFileActionOpenWithApparc) -// { -// // TODO -// //OpenWithApparcL(); -// } -// -// else if (queryIndex == ECommonFileActionOpenWithDocHandlerEmbed) -// { -// // TODO -// //OpenWithDocHandlerL(ETrue); -// } -// -// else -// User::Panic(_L("Unk.Com.Act"), 221); -// } - } - } - -// -------------------------------------------------------------------------------------------- - -// End of File