diff -r 000000000000 -r f72a12da539e menufw/menufwui/mmextensions/mmfolderuiextension/src/mmfoldercommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/menufw/menufwui/mmextensions/mmfolderuiextension/src/mmfoldercommand.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,682 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Interface of the folder command + * +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "mmfoldercommand.h" +#include "mmfoldercommandadd.h" +#include "mmfoldercommandrename.h" +#include "mmfoldercommanddelete.h" +#include "mmmovetofoldercommand.h" +#include "mmdialogmanager.h" +#include "hnliwutils.h" +#include "menudebug.h" +#include "hnutils.h" + +#include "hnmdbasekey.h" +#include "hnmdkeyfactory.h" +#include "menudebug.h" +#include "hnconvutils.h" +#include "hnservicehandler.h" +#include "mmfolderuiextpluginconstants.h" +#include "mmpluginsharedresources.h" + +#include +#include +#include + + +const TInt KCountNotAllowedChars = 9; +// Unicode character of sign obtained by press '0' key three times. Enter key. +const TUint16 KIllegalCharEnter = 0x21b2; +// Unicode line separator character obtained by pressing Shift + Enter keys +const TUint16 KIllegalCharLineSeparator = 0x2028; +// Space unicode character. +// Characters which ascii value is smaller than 32 are not allowed. +const TUint16 KSpace = ' '; //32; + +// ============================ MEMBER FUNCTIONS ============================= +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CMmFolderCommand::~CMmFolderCommand() + { + iSerializedInputList.Close(); + iSerializedOutputList.Close(); + delete iGetListOutParam; + delete iGetListInParam; + iMcs.Close(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::BaseConstructL() + { + // Init MCS session + TBuf16 buf; + buf.Copy(KMatrixMenuData); + iMcs.OpenL(buf); + iGetListInParam = CLiwGenericParamList::NewL(); + iGetListOutParam = CLiwGenericParamList::NewL(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::MCSQueryExecutionL( + const TDesC8& aQueryName, + const CHnMdBaseKey* aInputData, + const CHnMdBaseKey* aFilter, + MLiwNotifyCallback* aCallback ) + { + RPointerArray< CHnMdBaseKey > data; + CleanupClosePushL( data ); + data.AppendL( aInputData ); + if ( aFilter ) + { + data.AppendL( aFilter ); + } + + CHnMdBaseKey* serviceData = HnMdKeyFactory::CreateL( + KServiceContentName, KKeyTypeString, KMatrixMenuData ); + CleanupStack::PushL( serviceData ); + + RPointerArray< CHnMdBaseKey> constructor; + CleanupClosePushL( constructor ); + constructor.AppendL( serviceData ); + CLiwGenericParamList* constructorLiw = CLiwGenericParamList::NewLC(); + CLiwGenericParamList* commandLiw = CLiwGenericParamList::NewLC(); + HnLiwUtils::SetGenericParamListL( constructor, *constructorLiw ); + HnLiwUtils::SetGenericParamListL( data, *commandLiw ); + + TBuf8< KMaxLength > interface( KMCSDataSourceInterface8 ); + if ( !aQueryName.Compare( KCmdOrganize8 ) || + !aQueryName.Compare( KCmdExecuteAction8 ) ) + { + interface.Copy( KMCSMenuContentInterface8 ); + } + + delete iServiceHandler; + iServiceHandler = NULL; + iServiceHandler = CHnServiceHandler::NewL( + KMCSService8, interface, aQueryName, + EServiceModeAsynchronous, constructorLiw, commandLiw ); + + CleanupStack::Pop( commandLiw ); + CleanupStack::Pop( constructorLiw ); + + iServiceHandler->ExecuteL( aCallback , 0 ); + + CleanupStack::PopAndDestroy( &constructor ); + CleanupStack::PopAndDestroy( serviceData ); + CleanupStack::PopAndDestroy( &data ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CMmFolderCommand* CMmFolderCommand::FactoryL( const TDesC& aCommand ) + { + CMmFolderCommand* ret = NULL; + if( !aCommand.Compare( KAddFolderCmd ) ) + { + ret = CMmFolderCommandAdd::NewL(); + } + else if ( !aCommand.Compare( KRenameFolderCmd ) ) + { + ret = CMmFolderCommandRename::NewL(); + } + else if ( !aCommand.Compare( KDeleteFolderCmd ) ) + { + ret = CMmFolderCommandDelete::NewL(); + } + else if ( !aCommand.Compare( KDeleteAppCmd ) ) + { + ret = CMmFolderDeleteApp::NewL(); + } + else if ( !aCommand.Compare( KDeleteSuiteCmd ) ) + { + ret = CMmFolderDeleteSuite::NewL(); + } + else if ( !aCommand.Compare( KMoveToFolderCmd ) ) + { + ret = CMmMoveToFolderCommand::NewL(); + } + return ret; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CMmFolderCommand::DoChangeNameL( RBuf& aFolderName, + TInt aDefaultNameLength, RBuf& aNumberInBracket, + CLiwGenericParamList& aFoldersNames, TLiwVariant& aVar, + TInt aNumberToAppend ) + { + TBool nameChanged( EFalse ); + TInt position( KErrNone ); + TInt count = aFoldersNames.FindFirst( position, KReturnValue8() ) + ->Value().AsList()->Count(); + aNumberInBracket.Delete( KOpenBracket().Length(), + aNumberInBracket.Length() - KOpenBracket().Length() ); + + if ( aNumberToAppend < KMaxDigitNumber ) + { + aNumberInBracket.AppendNum( 0 ); + } + + for ( TInt i = 0; i < count; i++ ) + { + HnLiwUtils::GetVariantL( aFoldersNames, KLongNamePath8, i, aVar ); + TPtrC longName; + aVar.Get( longName ); + if ( !aFolderName.Compare( longName ) ) + { + aNumberInBracket.AppendNum( aNumberToAppend ); + aNumberInBracket.Append( KCloseBracket ); + aFolderName.Delete( aDefaultNameLength, + aFolderName.Length() - aDefaultNameLength ); + aFolderName.Append( aNumberInBracket ); + nameChanged = ETrue; + break; + } + } + return nameChanged; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::ChangeNameIfAlreadyExistsL( RBuf& aFolderName, + CLiwGenericParamList* aFoldersNames, TInt aNumberToAppend ) + { + if ( !aFoldersNames ) + { + return; + } + TLiwVariant var; + var.PushL(); + RBuf numberInBracket; + CleanupClosePushL(numberInBracket); + numberInBracket.CreateL( KMaxLength ); + numberInBracket.Append( KOpenBracket ); + numberInBracket.AppendNum( aNumberToAppend ); + numberInBracket.Append( KCloseBracket ); + TInt defaultNameLength = aFolderName.Length(); + + while( DoChangeNameL( aFolderName, defaultNameLength, numberInBracket, + *aFoldersNames, var, ++aNumberToAppend ) ) + ; + + CleanupStack::PopAndDestroy(&numberInBracket); + CleanupStack::PopAndDestroy( &var ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CMmFolderCommand::GetFolderNameL( RBuf& aFolderName, + CLiwGenericParamList* aFoldersNames ) + { + TBool res( EFalse ); + if( aFolderName.Length() == 0 ) + { + aFolderName.Append( iSharedResources->GetDefaultFolderName() ); + ChangeNameIfAlreadyExistsL( aFolderName, aFoldersNames ); + } + + CAknTextQueryDialog* dialog = + CAknTextQueryDialog::NewL( aFolderName, CAknQueryDialog::ENoTone ); + + dialog->PrepareLC( R_MENU_FILENAME_QUERY ); + dialog->SetPromptL( iSharedResources->GetEditFolderName() ); + + SetDialogL( dialog ); + res = dialog->RunLD(); + SetDialogL( NULL ); + + return res; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::GetFolderListL( TInt aItemId ) + { + // Prepare data for GetList + iGetListInParam->Reset(); + PrepareGetListInputL( aItemId ); + PrepareGetListFolderFilterL(); + ExternalizeInputListL(); + + // Get folders list from MCS + iMcs.GetListL( iSerializedInputList, iSerializedOutputList ); + InternalizeOutputListL(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::GetListL( TInt aItemId ) + { + // Prepare data for GetList + iGetListInParam->Reset(); + PrepareGetListInputL( aItemId ); + PrepareGetListFilterL(); + ExternalizeInputListL(); + + // Get folders list from MCS + iMcs.GetListL( iSerializedInputList, iSerializedOutputList ); + InternalizeOutputListL(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::DisplayErrorInfoL( const TDesC& aFolderName ) + { + CAknNoteDialog* dialog = new (ELeave) CAknNoteDialog( + CAknNoteDialog::EConfirmationTone, + CAknNoteDialog::ELongTimeout ); + HBufC* msg = StringLoader::LoadLC( + R_FLDR_CANNOT_DELETE_ITEM, aFolderName ); + dialog->SetTextL( msg->Des() ); + dialog->ExecuteDlgLD( R_MENU_EDIT_INTERRUPTION_INFO ); + + CleanupStack::PopAndDestroy( msg ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::SetRequestInterface( MMmActionRequest* aActionRequest ) + { + iActionRequest = aActionRequest; + } + +void CMmFolderCommand::SetSharedResources( CMmPluginSharedResources* aResources ) + { + iSharedResources = aResources; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::SetDialogL( CAknQueryDialog* aDialog ) + { + iDialog = aDialog; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::RemoveDialogL() + { + iLockDialog = ETrue; + if( iDialog ) + { + iDialog->HandleQueryEditorStateEventL( NULL, + MAknQueryControlObserver::EEmergencyCallAttempted, + MAknQueryControlObserver::EEditorEmpty ); + iDialog = NULL; + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::AddSubKeyL( CHnMdBaseKey* aInDataKey, + const TDesC8& aKeyName, + const TDesC8& aKeyType, + const TDesC8& aKeyValue ) + { + CHnMdBaseKey* key = HnMdKeyFactory::CreateL( + aKeyName, aKeyType, aKeyValue ); + CleanupStack::PushL( key ); + aInDataKey->AddSubKeyL( key ); + CleanupStack::Pop( key ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::AddSubKeyL( CHnMdBaseKey* aInDataKey, + const TDesC8& aKeyName, + const TDesC8& aKeyType, + const TDesC& aKeyValue ) + { + CHnMdBaseKey* key = HnMdKeyFactory::CreateL( + aKeyName, aKeyType, aKeyValue ); + CleanupStack::PushL( key ); + aInDataKey->AddSubKeyL( key ); + CleanupStack::Pop( key ); + } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CMmFolderCommand::FolderNameValidationL(RBuf& aFolderName, + CLiwGenericParamList* aFoldersNames) + { + TValidation allowed(EValidationOk); + + allowed = (TValidation) IllegalCharacterRemoveL(aFolderName, aFoldersNames); + if (allowed != EValidationOk) + { + return allowed; + } + allowed = (TValidation) CheckValidFileNameL(aFolderName); + if (allowed != EValidationOk) + { + // §qtn_fldr_bad_file_name§ + // data entry (for example data query New name: §qtn_fldr_item_name_prmpt§ ) is opened + DisplayNameErrorInfoL(iSharedResources->GetMsgBadFileName()); + return allowed; + } + allowed = (TValidation) CheckAllowedCharsL(aFolderName); + if (allowed != EValidationOk) + { + // information note "Name cannot contain + // the characters < > \\ /"" |:*?" §qtn_fldr_illegal_characters§ is displayed. + DisplayNameErrorInfoL(iSharedResources->GetMsgIllegalCharacters()); + } + return allowed; + } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CMmFolderCommand::IllegalCharacterRemoveL(RBuf& aFolderName, + CLiwGenericParamList* aFoldersNames) + { + TValidation allowed( EValidationOk ); + // illegal characters are removed + TInt pos( 0 ); + while ( pos < aFolderName.Length() ) + { + if ( aFolderName[pos] == KIllegalCharEnter || + aFolderName[pos] == KIllegalCharLineSeparator ) + { + aFolderName.Delete( pos, 1 ); + } + else + { + ++pos; + } + } + if (aFolderName.Length() == 0) + { + aFolderName.Append(iSharedResources->GetDefaultFolderName()); + ChangeNameIfAlreadyExistsL(aFolderName, aFoldersNames); + return allowed; + } + // only space character is not allowed + RBuf trimBuf; + CleanupClosePushL(trimBuf); + trimBuf.CreateL(aFolderName.Length()); + trimBuf.Copy(aFolderName); + trimBuf.Trim(); + if (!trimBuf.Length()) + { + allowed = EValidationInvalid; + } + CleanupStack::PopAndDestroy(&trimBuf); + + return allowed; + } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CMmFolderCommand::CheckValidFileNameL( const TDes& aFolderName ) + { + TValidation allowed(EValidationOk); + _LIT( KSingleDot, "."); + _LIT( KDoubleDot, ".."); + + if (!aFolderName.Compare( KSingleDot) || + !aFolderName.Compare( KDoubleDot ) || + aFolderName.Length() > KMaxFileName) + { + allowed = EValidationInvalid; + } + else + { + // characters with ascii value less than 32 + for (TInt index(0); index < aFolderName.Length(); index++) + { + if (aFolderName[index] < KSpace) + { + allowed = EValidationInvalid; + } + } + } + return allowed; + } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CMmFolderCommand::CheckAllowedCharsL( const TDes& aFolderName ) + { + TValidation allowed(EValidationOk); + + for (TInt index(0); index < aFolderName.Length(); index++) + { + for (TInt c(0); c < KCountNotAllowedChars; c++) + { + if (TChar( KNotAllowedChars[c] ) == aFolderName[index]) + { + allowed = EValidationNotAllowed; + } + } + } + + return allowed; + } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::DisplayNameErrorInfoL( const TDesC& aMsg ) + { + CAknNoteDialog* dialog = new (ELeave) CAknNoteDialog( + CAknNoteDialog::EConfirmationTone, + CAknNoteDialog::ELongTimeout ); + dialog->SetTextL( aMsg ); + dialog->ExecuteDlgLD( R_MENU_EDIT_MOVING_ABORT_NOTIFICATION ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::PrepareGetListInputL(TInt aItemId) + { + CLiwDefaultMap* inputMap = CLiwDefaultMap::NewLC(); + + // Specify GetList input data + inputMap->InsertL( KIdAttrName8, TLiwVariant( TInt32( aItemId ) ) ); // Item id + inputMap->InsertL( KRecursiveSearch8, TLiwVariant( TBool ( EFalse ) ) ); // Recursive Search + inputMap->InsertL( KFlatResult8, TLiwVariant ( TBool ( ETrue ) ) ); // Flat GetList + inputMap->InsertL( KParentOnly8, TLiwVariant ( TBool ( EFalse ) ) ); // Get children + + // Fill GetList input param list + InsertToLiwListL(iGetListInParam, KInData8, inputMap); + + CleanupStack::PopAndDestroy(inputMap); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::PrepareGetListFolderFilterL() + { + // Specify GetList filter + CLiwDefaultMap* folderFilter = CLiwDefaultMap::NewLC(); + folderFilter->InsertL( KTypeAttrName8, TLiwVariant( KMenuFolder ) ); // Folders + + folderFilter->InsertL( KHidden8, TLiwVariant( TBool(EFalse) ) ); // Not Hidden + folderFilter->InsertL( KDeleteLocked8, TLiwVariant( TBool(EFalse) ) ); // Not locked + + // Fill GetList input param list + InsertToLiwListL(iGetListInParam, KFilter8, folderFilter); + + CleanupStack::PopAndDestroy(folderFilter); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::PrepareGetListFilterL() + { + // Specify GetList filter + CLiwDefaultMap* folderFilter = CLiwDefaultMap::NewLC(); + + folderFilter->InsertL( KHidden8, TLiwVariant( TBool(EFalse) ) ); // Not Hidden + folderFilter->InsertL( KMissing8, TLiwVariant( TBool(EFalse) ) ); // Not Missing + + // Fill GetList input param list + InsertToLiwListL(iGetListInParam, KFilter8, folderFilter); + + CleanupStack::PopAndDestroy(folderFilter); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::InsertToLiwListL(CLiwGenericParamList* aList, + const TDesC8& aKey, const CLiwDefaultMap* aMap) + { + TLiwVariant liwVar; + liwVar.Set( aMap ); + liwVar.PushL(); + TLiwGenericParam livGenParam( aKey, liwVar ); + livGenParam.PushL(); + aList->AppendL ( livGenParam ); + CleanupStack::PopAndDestroy( &livGenParam ); + CleanupStack::PopAndDestroy( &liwVar ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::ExternalizeInputListL() + { + iSerializedInputList.Close(); + iSerializedOutputList.Close(); + iSerializedInputList.CreateL( iGetListInParam->Size() ); + RDesWriteStream datastrm( iSerializedInputList ); + CleanupClosePushL(datastrm); + iGetListInParam->ExternalizeL(datastrm); + datastrm.CommitL(); + CleanupStack::PopAndDestroy(&datastrm); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmFolderCommand::InternalizeOutputListL() + { + iGetListOutParam->Reset(); + if (iSerializedOutputList.Size()) + { + RDesReadStream stream( iSerializedOutputList ); + CleanupClosePushL( stream ); + iGetListOutParam->InternalizeL( stream ) ; + CleanupStack::PopAndDestroy(&stream); + } + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CMmFolderCommand::GetIntL( + const CLiwGenericParamList& aParam, const TDesC8& aPath ) + { + TInt pos( 0 ); + const TLiwGenericParam* param = aParam.FindFirst( pos, aPath ); + if( pos != KErrNotFound && param ) + { + return param->Value().AsTInt32(); + } + return KErrNotFound; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TPtrC CMmFolderCommand::GetStringL( + const CLiwGenericParamList& aParam, const TDesC8& aPath ) + { + TInt pos( 0 ); + const TLiwGenericParam* param = aParam.FindFirst( pos, aPath ); + if( pos != KErrNotFound && param ) + { + return param->Value().AsDes(); + } + TPtrC ret( KNullDesC16 ); + return ret; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CMmFolderCommand::GetBoolL( + const CLiwGenericParamList& aParam, const TDesC8& aPath ) + { + TInt pos( 0 ); + const TLiwGenericParam* param = aParam.FindFirst( pos, aPath ); + if( pos != KErrNotFound && param ) + { + return param->Value().AsTBool(); + } + return EFalse; + } + +// end of file