diff -r 14979e23cb5e -r 3de6c4cf6b67 mpxmusicplayer/commonui/src/mpxfilenamequerydlg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpxmusicplayer/commonui/src/mpxfilenamequerydlg.cpp Wed Sep 01 12:32:02 2010 +0100 @@ -0,0 +1,360 @@ +/* +* Copyright (c) 2006 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: rename dialog for Common UI +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mpxcommonuihelper.h" +#include "mpxfilenamequerydlg.h" + +// CONSTANTS +const TInt KMPXMaxPlaylistPathLen ( 200 ); + +_LIT( KBackslash, "\\" ); +_LIT( KDirectionalChars, "\x202A\x202B\x202C\x202D\x200E\x200F" ); + +const TUint16 KIllegalChars[] = { + '<', '>', '"', '/', '\\', '|', ':', '*', '?', + 0xFF02, // Full width quote + 0xFF0A, // Full width asterisk + 0xFF0F, // Full width slash + 0xFF1A, // Full width colon + 0xFF1C, // Full width left arrow + 0xFF1E, // Full width right arrow + 0xFF1F, // Full width question mark + 0xFF3C, // Full width back slash + 0xFF5C, // Full width pipe + 0x201C, // Left quote + 0x201D, // Right quote + 0x201F, // Reversed quote + 0, // Array terminator +}; + + +// ============================ MEMBER FUNCTIONS =============================== + + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CMPXFileNameQueryDlg* CMPXFileNameQueryDlg::NewL( + const TDesC& aOldName, + TDes& aNewName, + const TDesC& aPath, + TMPXGeneralCategory aCategory, + CMPXCommonUiHelper* aParent ) + { + MPX_FUNC( "CMPXFileNameQueryDlg::NewL" ); + CMPXFileNameQueryDlg* self = + new( ELeave ) CMPXFileNameQueryDlg( aNewName, aCategory, aParent ); + + CleanupStack::PushL( self ); + self->ConstructL( aOldName, aPath ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CMPXFileNameQueryDlg::CMPXFileNameQueryDlg( + TDes& aNewName, + TMPXGeneralCategory aCategory, + CMPXCommonUiHelper* aParent ) : + CAknTextQueryDialog( aNewName ), + iParent( aParent ), + iCategory( aCategory ) + { + } + +// --------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CMPXFileNameQueryDlg::ConstructL( + const TDesC& aOldName, const TDesC& aPath ) + { + MPX_FUNC( "CMPXFileNameQueryDlg::ConstructL" ); + TParsePtrC name( aOldName ); + iOldName = aOldName.AllocL(); + iPath = aPath.AllocL(); + // Strip any directionality markers to get pure name + TPtr ptr( iOldName->Des() ); + AknTextUtils::StripCharacters( ptr, KDirectionalChars ); + TInt extLength( 0 ); + if ( iCategory == EMPXPlaylist ) + { + Text().Copy( name.NameAndExt() ); + } + else + { + Text().Copy( name.Name() ); + if ( name.ExtPresent() ) + { + extLength = name.Ext().Length(); + } + } + TInt maxLength( KMPXMaxPlaylistPathLen - aPath.Length() - extLength ); + MPX_DEBUG2( "CMPXFileNameQueryDlg::ConstructL setting max length = %d", maxLength ); + SetMaxLength( maxLength ); + iCollectionUiHelper = CMPXCollectionHelperFactory::NewCollectionUiHelperL(); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CMPXFileNameQueryDlg::~CMPXFileNameQueryDlg() + { + if ( iCollectionUiHelper ) + { + iCollectionUiHelper->Close(); + } + delete iOldName; + delete iPath; + } + +// --------------------------------------------------------------------------- +// CFileManagerFileNameQueryDlg::OkToExitL +// --------------------------------------------------------------------------- +// +TBool CMPXFileNameQueryDlg::OkToExitL( TInt aButtonId ) + { + MPX_FUNC( "CMPXFileNameQueryDlg::OkToExitL" ); + TBool result( CAknTextQueryDialog::OkToExitL( aButtonId ) ); + + HBufC* userText = Text().AllocLC(); + TPtr ptrUserText( userText->Des() ); + + // Strip any directionality markers to get pure name + AknTextUtils::StripCharacters( ptrUserText, KDirectionalChars ); + + TParsePtrC currentPath( *iPath ); + // Check file name + TBool isValidName = IsValidName( currentPath.DriveAndPath(), *userText, EFalse ); + if( !isValidName ) + { + if( IllegalChars( *userText ) ) + { + iParent->DisplayInfoNoteL( + R_MPX_QTN_FLDR_ILLEGAL_CHARACTERS ); + } + else + { + iParent->DisplayInfoNoteL( + R_MPX_QTN_FLDR_BAD_FILE_NAME ); + } + CAknQueryControl* queryControl = QueryControl(); + if ( queryControl ) + { + CEikEdwin* edwin = static_cast< CEikEdwin* >( + queryControl->ControlByLayoutOrNull( EDataLayout ) ); + if (edwin) + { + edwin->SetSelectionL( edwin->TextLength(), 0 ); + } + } + CleanupStack::PopAndDestroy( userText ); + return EFalse; + } + + // if some other entry found with same name + // not ok except if name same as original + if ( iCategory != EMPXPlaylist ) + { + if ( iCollectionUiHelper->TitleExistsL( iCategory, *userText ) ) + { + TBool overWrite( EFalse ); + HBufC* text = StringLoader::LoadLC( R_MPX_QTN_FLDR_OVERWRITE_QUERY, Text() ); + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + overWrite = dlg->ExecuteLD( R_MPX_CONFIRM_QUERY_WITH_YES_NO, *text ); + CleanupStack::PopAndDestroy( text ); + if( !overWrite ) + { + CAknQueryControl* queryControl = QueryControl(); + if (queryControl) + { + CEikEdwin* edwin = static_cast< CEikEdwin* >( + queryControl->ControlByLayoutOrNull( EDataLayout ) ); + + HBufC* newTitle = iParent->GenerateTitleL( iCategory, *userText ); + CleanupStack::PushL(newTitle); + + if ( edwin ) + { + edwin->SetTextL( newTitle ); + edwin->SetSelectionL( edwin->TextLength(), 0 ); + } + CleanupStack::PopAndDestroy(newTitle); + } + result = EFalse; + } + } + } + CleanupStack::PopAndDestroy( userText ); + if ( result && iCategory != EMPXPlaylist ) + { + // playlist has no extension, don't need to do this + TParsePtrC oldName( *iOldName ); + iDataText.Append( oldName.Ext() ); + } + return result; + } + +// ----------------------------------------------------------------------------- +// CMPXFileNameQueryDlg::OfferKeyEventL +// +// ----------------------------------------------------------------------------- +// +TKeyResponse CMPXFileNameQueryDlg::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ) + { + TKeyResponse response = EKeyWasNotConsumed; + // consume 'enter' so it won't acknowledge the dialog + + TBool vkbOpen = EFalse; + CAknQueryControl* queryControl = QueryControl(); + if ( queryControl ) + { + CEikEdwin* edwin = static_cast< CEikEdwin* >( + queryControl->ControlByLayoutOrNull( EDataLayout ) ); + if ( edwin ) + { + if ( edwin->AknEdwinFlags() & EAknEditorFlagTouchInputModeOpened ) + { + // virtual keyboard is active. + vkbOpen = ETrue; + } + } + } + + if ( vkbOpen && aType == EEventKey && aKeyEvent.iCode == EKeyEnter ) + { + response = EKeyWasConsumed; + } + else + { + response = CAknTextQueryDialog::OfferKeyEventL(aKeyEvent, aType); + } + return response; + } + +// ----------------------------------------------------------------------------- +// CMPXFileNameQueryDlg::IsValidName +// ----------------------------------------------------------------------------- +// +TBool CMPXFileNameQueryDlg::IsValidName( + const TDesC& aDriveAndPath, const TDesC& aName, TBool aIsFolder ) const + { + MPX_FUNC( "CMPXFileNameQueryDlg::IsValidName" ); + // Check name for bad chars + const TUint16 KMinAllowedChar = 0x0020; + const TUint16 KParagraphSeparator = 0x2029; + const TUint16 KDot = '.'; + TInt nameLen( aName.Length() ); + if ( !nameLen ) + { + return EFalse; + } + for ( TInt i( 0 ); i < nameLen; i++ ) + { + TUint16 ch( aName[ i ] ); + if ( ch < KMinAllowedChar || ch == KParagraphSeparator ) + { + return EFalse; + } + } + // File system ignores totally dot in the end of name, so + // we set here as not valid name, so that user gets correctly informed + if ( aName[ nameLen - 1 ] == KDot || IllegalChars( aName ) ) + { + return EFalse; + } + // Get full path length + TPtrC pathPtr( aDriveAndPath ); + TInt pathLen( pathPtr.Length() ); + if ( !pathLen ) + { + return EFalse; + } + TInt fullPathLen( pathLen ); + if ( pathPtr[ pathLen - 1 ] != KBackslash()[ 0 ] ) + { + ++fullPathLen; // Add backslash before name + } + fullPathLen += nameLen; + if ( aIsFolder ) + { + ++fullPathLen; // Add folder final backslash + } + + TBool ret( EFalse ); + if ( fullPathLen <= KMaxFileName ) + { + // Check full path + HBufC* fullPath = HBufC::New( KMaxFileName ); + if ( fullPath ) + { + TPtr ptr( fullPath->Des() ); + ptr.Copy( pathPtr ); + if ( pathPtr[ pathLen - 1 ] != KBackslash()[ 0 ] ) + { + ptr.Append( KBackslash ); // Add backslash before name + } + ptr.Append( aName ); + RFs fs; + TInt connectError = fs.Connect(); + if ( connectError == KErrNone ) + { + ret = fs.IsValidName( ptr ); + fs.Close(); + } + delete fullPath; + } + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CMPXFileNameQueryDlg::IllegalChars +// ----------------------------------------------------------------------------- +// +TBool CMPXFileNameQueryDlg::IllegalChars( const TDesC& aName ) const + { + MPX_FUNC( "CMPXFileNameQueryDlg::IllegalChars" ); + for ( TInt i( 0 ); KIllegalChars[ i ]; i++ ) + { + if ( aName.Locate( KIllegalChars[ i ] ) != KErrNotFound ) + { + return ETrue; + } + } + return EFalse; + } + +// End of File