diff -r 491b3ed49290 -r 65326cf895ed filemanager/GFLM/src/CGflmNavigatorModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/GFLM/src/CGflmNavigatorModel.cpp Wed Sep 01 12:31:07 2010 +0100 @@ -0,0 +1,298 @@ +/* +* Copyright (c) 2002-2007 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: Navigable file list model +* +*/ + + + +// INCLUDE FILES +#include +#include "CGflmNavigatorModel.h" +#include "CGflmItemGroupImpl.h" +#include "CGflmItemLocalizer.h" +#include "CGflmDriveResolver.h" +#include "GFLM.hrh" +#include "GflmUtils.h" +#include "GFLMConsts.h" + + +// CONSTANTS + +// Granularity of iBackstepStack array +const TInt KBackstepStackGranularity = 3; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::CGflmNavigatorModel +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CGflmNavigatorModel::CGflmNavigatorModel( RFs& aFs ) : + CGflmFileListModel( aFs ) + { + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CGflmNavigatorModel::ConstructL() + { + CGflmFileListModel::ConstructL(); + iBackstepStack = new( ELeave ) CDesCArraySeg( KBackstepStackGranularity ); + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CGflmNavigatorModel* CGflmNavigatorModel::NewL( RFs& aFs ) + { + CGflmNavigatorModel* self = new( ELeave ) CGflmNavigatorModel( aFs ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::~CGflmNavigatorModel() +// ----------------------------------------------------------------------------- +// +CGflmNavigatorModel::~CGflmNavigatorModel() + { + delete iBackstepStack; + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::GoToDirectoryL() +// ----------------------------------------------------------------------------- +// +EXPORT_C void CGflmNavigatorModel::GoToDirectoryL( + const TDesC& aPath, TBool aBackstepping ) + { + if ( !aPath.CompareF( CurrentDirectory() ) ) + { + return; // Already in the directory + } + SetBaseDirectoryL( aPath ); + + // Update the backstepping stack after calling SetBaseDirectoryL() + // because it might leave + if ( !aBackstepping ) + { + iBackstepStack->Reset(); + } + iBackstepStack->AppendL( aPath ); + + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::BackstepL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CGflmNavigatorModel::BackstepL() + { + if ( iBackstepStack->MdcaCount() ) + { + iBackstepStack->Delete( iBackstepStack->MdcaCount() - 1 ); + if ( iBackstepStack->MdcaCount() ) + { + TPtrC dir( iBackstepStack->MdcaPoint( + iBackstepStack->MdcaCount() - 1 ) ); + SetSourceL( dir ); + if ( !IsValidSource( dir ) ) + { + User::Leave( KErrPathNotFound ); + } + } + else + { + SetSourceL( KNullDesC ); + } + } + else + { + User::Leave( KErrUnderflow ); + } + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::GoToDirectoryL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CGflmNavigatorModel::GoToDirectoryL( const TDesC& aBasePath, + const TDesC& aTopPath ) + { + // Use copies because descriptors may come from backstep stack itself + HBufC* basePathBuffer = aBasePath.AllocLC(); + TPtrC basePath( basePathBuffer->Des() ); + HBufC* topPathBuffer = aTopPath.AllocLC(); + TPtrC topPath( topPathBuffer->Des() ); + const TInt KNthMatch = 2; + + // Clear the backstepping stack + iBackstepStack->Reset(); + + // Construct the backstepping stack + + while ( basePath.CompareF( topPath ) ) + { + iBackstepStack->InsertL( 0, topPath ); + + // Find the second backslash starting from the end + TInt cutPoint( GflmUtils::LocateReverseNth( + topPath, KGFLMBackslash()[ 0 ], KNthMatch ) ); + User::LeaveIfError( cutPoint ); + topPath.Set( topPath.Left( cutPoint + 1 ) ); + } + + // Add basepath too + iBackstepStack->InsertL( 0, topPath ); + + SetBaseDirectoryL( *topPathBuffer ); + + CleanupStack::PopAndDestroy( topPathBuffer ); + CleanupStack::PopAndDestroy( basePathBuffer ); + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::CurrentDirectory() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CGflmNavigatorModel::CurrentDirectory() const + { + TInt stackSize( iBackstepStack->MdcaCount() ); + if ( stackSize <= 0 ) + { + return KNullDesC(); + } + return iBackstepStack->MdcaPoint( stackSize - 1 ); + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::LocalizedNameOfCurrentDirectory() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CGflmNavigatorModel::LocalizedNameOfCurrentDirectory() const + { + TInt stackSize( iBackstepStack->MdcaCount() ); + if ( stackSize <= 0 ) + { + return TPtrC( KNullDesC ); + } + TPtrC directory( iBackstepStack->MdcaPoint( stackSize - 1 ) ); + TPtrC localizedName( iItemLocalizer->Localize( directory ) ); + if ( localizedName.Length() ) + { + // Return the localized name + return localizedName; + } + // Directory has no localized name => return the name of the directory + TPtrC ptr( GflmUtils::StripFinalBackslash( directory ) ); + TInt lastBs( ptr.LocateReverse( KGFLMBackslash()[ 0 ] ) ); + if ( lastBs != KErrNotFound ) + { + return ptr.Mid( lastBs + 1 ); + } + return TPtrC( KNullDesC ); + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::SetBaseDirectoryL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CGflmNavigatorModel::SetBaseDirectoryL( const TDesC& aDirectory ) + { + if ( IsValidSource( aDirectory ) ) + { + SetSourceL( aDirectory ); + } + else + { + User::Leave( KErrPathNotFound ); + } + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::NavigationLevel() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CGflmNavigatorModel::NavigationLevel() const + { + return iBackstepStack->Count() - 1; + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::CurrentDrive() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CGflmDriveItem* CGflmNavigatorModel::CurrentDrive() const + { + return DriveFromPath( CurrentDirectory() ); + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::SetSourceL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CGflmNavigatorModel::SetSourceL( const TDesC& aSource ) + { + TBool empty( !aSource.Length() ); + TInt groupCount( iGroups->Count() ); + for ( TInt i( 0 ); i < groupCount; i++ ) + { + MGflmItemGroup* group = iGroups->At( i ); + group->ResetSources(); + if ( !empty ) + { + group->AddSourceL( aSource ); + } + } + } + +// ----------------------------------------------------------------------------- +// CGflmNavigatorModel::IsValidSource() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CGflmNavigatorModel::IsValidSource( const TDesC& aSource ) const + { + if ( aSource.Length() && + !iDriveResolver->IsRemoteDrive( aSource ) && + !BaflUtils::PathExists( iFs, aSource ) && + !iDriveResolver->IsRootPath( aSource ) ) + { + return EFalse; + } + return ETrue; + } + +// End of File