diff -r 000000000000 -r 094583676ce7 wvuing/wvuiave/AppSrc/CCAContactEditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiave/AppSrc/CCAContactEditor.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,1954 @@ +/* +* 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: Contact editor / viewer +* Interface : Private +* +*/ + + +// INCLUDE FILES + +#include "chatngclient.hrh" // application resources +#include "CCAContactEditor.h" // header for this .cpp... +#include "CCAStatusPaneHandler.h" // For title pane changes +#include "ChatDebugPrint.h" +#include "CAExternalInterface.h" +#include "IMNoteMapper.h" +#include "IMDialogUtils.h" +#include "chatdefinitions.h" +#include "CCAAppUi.h" +#include "CCAEngine.h" +#include "CCAUISessionManager.h" +#include "ImpsCSPAllErrors.h" +#include "CCAUINGUtils.h" +#include "CAUtils.h" +#include "ccasyncchecker.h" +#include "ccafetchwaiter.h" +#include "MCAError.h" +#include "MCASettingsPC.h" +#include "TEnumsPC.h" +#include "IMUtils.h" +#include "CCAPCUtils.h" + + +#include // CEikCaptionedControl +#include // CEikButtonGroupContainer +#include // Edwin +#include // menu pane handling +#include // application resources +#include +#include // AVKON's query dialog +#include // StringLoader +#include +#include +#include +#include +#include + +#include + +#include "CCACommandManagerFactory.h" +#include "CCACommandManager.h" +#include "CCAContactEditCmd.h" +#include "MCAContactEditPC.h" +#include "MCAProcessManager.h" +#include "MCABlockingPC.h" + +#include "imnginternalcrkeys.h" +#include "IMPrivateCRKeys.h" +#include "IMVariant.hrh" + +// The Settings have been moved to Cenrep (also retained in the Resource file), +// so the enums for keys and central repository header is added here +#include "VariantKeys.h" + +// CONSTANTS +const TInt KAlphaCodeA = 0x61; +const TInt KAlphaCodeZ = 0x7A; +const TInt KNumCode0 = 0x2F; +const TInt KNumCode9 = 0x39; + + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CCAContactEditor::CCAContactEditor( + TBool& aSaved, + const TBool aContactPCInitialise ) + : + iAllFieldsEmpty( ETrue ), + iContactWasSaved( aSaved ), + iOwnStatus( EFalse ), + iInitialFocus( EChatEditWV ), + iContactEditPCInitialised( aContactPCInitialise )/*, + iNewContactID(aNewContactID), + iNewListID(aNewContactID)*/ + { + iContactWasSaved = EFalse; + } + + +// Destructor +CCAContactEditor::~CCAContactEditor() + { + // reset the iContact and iOwnData + //only release resources if this has been initialised within contact editor + if ( iContactEditPCInitialised && iCCAContactEditPC ) + { + iCCAContactEditPC->ReleaseResources(); + } + + + delete iUserId; + delete iOrigId; + delete iAlias; + delete iNick; + delete iListId; + delete iIdentification; + delete iCCAContactEditCmd; + delete iNewUserId; + + } + + +// --------------------------------------------------------- +// CCAContactEditor::NewL +// (other items were commented in a header). +// --------------------------------------------------------- +// +CCAContactEditor* CCAContactEditor::NewL( + TInt aIndex, + TBool& aSaved, + const TBool aContactPCInitialise /*= ETrue*/ ) + { + CCAContactEditor* temp = CCAContactEditor::NewLC( aIndex, aSaved, aContactPCInitialise ); + CleanupStack::Pop( temp ); + return temp; + } + + + + +// --------------------------------------------------------- +// CCAContactEditor::NewLC +// (other items were commented in a header). +// --------------------------------------------------------- +// +CCAContactEditor* CCAContactEditor::NewLC( + TInt aIndex, + TBool& aSaved, + const TBool aContactPCInitialise /*= ETrue*/ ) + { + + CCAContactEditor* temp = new( ELeave )CCAContactEditor( aSaved, aContactPCInitialise ); + CleanupStack::PushL( temp ); + temp->ConstructL( aIndex ); + + return temp; + } + +// --------------------------------------------------------- +// CCAContactEditor::ConstructL +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::ConstructL( TInt aIndex ) + { + CAknForm::ConstructL( R_CHAT_CEDITOR_MENUBAR ); // superclass + + // finalize construction + iAliasEnabled = IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_HAVE_ALIAS ); + iNicknameEnabled = IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_HAVE_NICKNAME ); + iTextualInputMode = IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_USERID_TEXTUAL_INPUTMODE ); + iUserIDNotEditable = IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_UNEDITABLE_USERID ); + + iAppUI = static_cast ( CCoeEnv::Static()->AppUi() ); + + + iCCAContactEditPC = iAppUI->GetProcessManager().GetContactEditInterface(); + + //only initialise if iContactEditPCInitialised = ETrue + //also initialise only if we have a valid index + if ( ( -1 != aIndex ) && ( iContactEditPCInitialised ) ) + { + iCCAContactEditPC->InitialiseL( + *iAppUI->GetProcessManager().GetArrayInterface(), + aIndex, iOwnStatus ); + } + + if ( !iContactEditPCInitialised ) + { + iOwnStatus = iCCAContactEditPC->IsOwnData(); + } + + MCACommandFactory* commandManager = CCACommandManagerFactory::InstanceL()->GetCommandManager(); + + + iCCAContactEditCmd = static_cast< CCAContactEditCmd* > ( commandManager->NewCommandL( EChatClientDetailsEdit, iAppUI->GetProcessManager(), *this ) ); + + + } + +// --------------------------------------------------------- +// CCAContactEditor::EditContactLD +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CCAContactEditor::EditContactLD( TEnumsPC::TContactEditorMode aCreateNew, + const TDesC& aListId, + const TDesC& aWVID /* = KNullDesC */, + const TDesC& aNickName /* = KNullDesC */, + TBool aLoadFromStore /* = ETrue */, + TBool /*aFetchAlias = ETrue */, + TBool aCursorToBeginning /* = EFalse */ ) + { + TInt retval = 0; + + CleanupStack::PushL( this ); + TPtrC dummy( KNullDesC() ); + + CCAStatusPaneHandler& titlePane( *iAppUI->CAStatusPane() ); + + + // Check disk space before editing + IMUtils::FFSSpaceBelowCriticalLevelL( KContactSizeEstimate ); + + switch ( aCreateNew ) + { + case TEnumsPC::EAddToContact: + { + iInternalMode = TEnumsPC::EAddToContact; + iWVUID = &aWVID; + iNickName = &aNickName; + break; + } + case TEnumsPC::EEditContact: + { + iInternalMode = TEnumsPC::EEditContact; + iWVUID = &aWVID; + iNickName = &aNickName; + break; + } + case TEnumsPC::ECreateNew: + { + iInternalMode = TEnumsPC::EAddToContact; + iWVUID = &dummy; + iNickName = &dummy; + break; + } + default: + { + iInternalMode = TEnumsPC::EUnknownMode; + } + } + + // set the mode and get default values for user id and nick name + + if ( ( !aCreateNew ) && ( aLoadFromStore ) && ( !( iCCAContactEditPC->IsContact() ) ) ) + { + if ( ( aWVID.Length() != 0 ) && ( aListId.Length() != 0 ) ) + { + iCCAContactEditPC->InitialiseL( aWVID, aListId, iOwnStatus ); + //cross verification + if ( !iCCAContactEditPC->IsContact() ) + { + //some serious issue dont open contact editor + CleanupStack::PopAndDestroy( this ); + return retval; + } + } + } + + if ( !( ( iCCAContactEditPC->IsContact() ) && ( aLoadFromStore ) ) ) + { + if ( aWVID.Length() != 0 ) + { + iUserId = aWVID.AllocL(); + } + } + + + iCursorToBeginning = aCursorToBeginning; + + if ( ( aListId.Length() == 0 ) && ( !iOwnStatus ) ) + { + // and go to contact list creation + iListId = GetListIdL( aWVID, 0 ); + if ( !iListId ) + { + CleanupStack::PopAndDestroy( this ); + return retval; + } + } + else + { + iListId = aListId.AllocL(); + } + + // We have to use stacking decorators, because we can have stacked dialogs. + // REMEMBER to pop out the pushed decorator + titlePane.ClearNaviPaneL( ETrue ); + + // execute the actual form + CleanupStack::Pop( this ); + + retval = ExecuteLD( R_CHAT_CONTACT_EDITOR_DLG ); + + // Restore navipane(show tabs id available) + // fix for when add to im contacts is called from chatView,ConversationView + // doesnt affect the rest + titlePane.PopNaviPane(); + + return retval; + + } + +// --------------------------------------------------------- +// CCAContactEditor::EditContactLD +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CCAContactEditor::EditContactLD( + TInt aInitialFocus, + TEnumsPC::TContactEditorMode aCreateNew, + const TDesC& aListId ) + { + iInitialFocus = aInitialFocus; + TInt retval = EditContactLD( aCreateNew, aListId ); + return retval; + } + +// --------------------------------------------------------- +// CCAContactEditor::LoadFormDataL +// Loads all data displayed in form +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::LoadFormDataL() + { + + if ( iInternalMode == TEnumsPC::EAddToContact ) + { + // adding new contact, fetch the default values if they exist + if ( iWVUID ) + { + + // get a copy of original id + delete iOrigId; + iOrigId = NULL; + iOrigId = iWVUID->AllocL(); + + TPtrC displayId( CCAAppUi::DisplayId( *iOrigId ) ); + GetFormEdwin( EChatEditWV )->SetTextL( &displayId ); + + // set numeric as default, if requested + GetFormEdwin( EChatEditWV )->SetAknEditorInputMode( + iTextualInputMode ? + EAknEditorTextInputMode : + EAknEditorNumericInputMode ); + + if ( iCursorToBeginning ) + { + GetFormEdwin( EChatEditWV )->AddFlagToUserFlags( + CEikEdwin::ENoAutoSelection ); + } + + SetChangesPending( ETrue ); + } + + if ( iNicknameEnabled ) + { + if ( iNickName ) + { + GetFormEdwin( EChatEditNick )->SetTextL( iNickName ); + SetChangesPending( ETrue ); + } + } + + if ( iAliasEnabled ) + { + + delete iAlias; + + //iAlias is assigned NULL as GetAliasFromPresenceL may leave + iAlias = NULL; + iAlias = iCCAContactEditPC->GetAliasFromPresenceL( *iWVUID ); + + // set the alias field as read-only, as we are now editing + if ( iAlias ) + { + GetFormEdwin( EChatEditAlias )->SetTextL( iAlias ); + } + GetFormEdwin( EChatEditAlias )->SetReadOnly( ETrue ); + GetFormEdwin( EChatEditAlias )-> + AddFlagToUserFlags( CEikEdwin::EAvkonDisableCursor | + CEikEdwin::ENoAutoSelection ); + SetChangesPending( ETrue ); + } + + HideEmptyFieldsL(); + } + else + { + + iContactEditOperation = MCAUiContactEditCmdCB::TContactEditParams::ELoadContactDetails; + + iCCAContactEditCmd->ExecuteCommandL(); + + + // viewing or editing + if ( iUserId ) + { + + // editing or viewing existing contact, load nick name and wvid + { + + TPtrC displayId( CCAAppUi::DisplayId( *iOrigId ) ); + GetFormEdwin( EChatEditWV )->SetTextL( &displayId ); + // Make the text not highlighted and cursor at the end + GetFormEdwin( EChatEditWV )-> + AddFlagToUserFlags( CEikEdwin::ENoAutoSelection | + CEikEdwin::EJustAutoCurEnd ); + + if ( iUserIDNotEditable || iOwnStatus ) + { + // we can't edit WVID of existing contact. + GetFormEdwin( EChatEditWV )->SetReadOnly( ETrue ); + GetFormEdwin( EChatEditWV )-> + AddFlagToUserFlags( CEikEdwin::EAvkonDisableCursor | + CEikEdwin::ENoAutoSelection ); + } + + // set numeric as default, if requested + GetFormEdwin( EChatEditWV )->SetAknEditorInputMode( + iTextualInputMode ? + EAknEditorTextInputMode : + EAknEditorNumericInputMode ); + + // alias + if ( ! iAliasEnabled ) + { + // no alias + // 1. hide the alias entry completely + DeleteLine( EChatEditAlias, EFalse ); + } + else + { + // alias + // 1. put alias to alias field + // 2. make alias field not editable (in OfferKeyEventL display a note) + if ( iAlias ) + { + TPtrC aliasPtr( *iAlias ); + GetFormEdwin( EChatEditAlias )->SetTextL( &aliasPtr ); + + // User can only edit his/her own alias + if ( !iOwnStatus ) + { + GetFormEdwin( EChatEditAlias )->SetReadOnly( ETrue ); + GetFormEdwin( EChatEditAlias )-> + AddFlagToUserFlags( CEikEdwin::EAvkonDisableCursor | + CEikEdwin::ENoAutoSelection ); + } + } + } + // nickname + if ( iNicknameEnabled ) + { + // nickname + if ( iNick ) + { + GetFormEdwin( EChatEditNick )->SetTextL( iNick ); + GetFormEdwin( EChatEditNick )-> + AddFlagToUserFlags( CEikEdwin::ENoAutoSelection | + CEikEdwin::EJustAutoCurEnd ); + } + } + } + + HideEmptyFieldsL(); + } + + } + + // Hide the nick if it is not enabled + if ( !iNicknameEnabled || iOwnStatus ) + { + DeleteLine( EChatEditNick, EFalse ); + } + + UpdateTitleBarL(); + } + +// --------------------------------------------------------- +// CCAContactEditor::GetFormEdwin +// Fetches handler to edwin control pointed by aId +// (other items were commented in a header). +// --------------------------------------------------------- +// +CEikEdwin* CCAContactEditor::GetFormEdwin( TInt aId ) + { + return static_cast( Control( aId ) ) ; + } + +// --------------------------------------------------------- +// CCAContactEditor::GetEdwinTextBufferL +// Copies text to buffer and returns handle to it +// (other items were commented in a header). +// --------------------------------------------------------- +// +HBufC* CCAContactEditor::GetEdwinTextBufferL( TInt aId ) + { + return GetFormEdwin( aId )->GetTextInHBufL(); + } + +// --------------------------------------------------------- +// CCAContactEditor::GetEdwinTextBufferLC +// Copies edwin's text to buffer and returns handle to it +// (other items were commented in a header). +// --------------------------------------------------------- +// +HBufC* CCAContactEditor::GetEdwinTextBufferLC( TInt aId ) + { + HBufC* text = GetEdwinTextBufferL( aId ); + CleanupStack::PushL( text ); + return text; + } + + +// --------------------------------------------------------- +// CCAContactEditor::SetMenuBarTitleResourceL +// Update CBA-container with resource pointed by aResourceId +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::SetMenuBarTitleResourceL( TInt aResourceId ) + { + // Get handle to current cba-button container and update container with + // resource pointed by aResourceId (RESOURCE CBA) + CEikButtonGroupContainer* container = CEikButtonGroupContainer::Current(); + container->SetCommandSetL( aResourceId ); + container->DrawNow(); + } + +// --------------------------------------------------------- +// CCAContactEditor::UpdateTitleBarL +// Updates title bar according to current data edited +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::UpdateTitleBarL() + { + + CCAStatusPaneHandler* statusPane = iAppUI->CAStatusPane(); + + if ( iInternalMode == TEnumsPC::EAddToContact ) + { + HBufC* title = iEikonEnv->AllocReadResourceLC( R_CHAT_CD_NEW_ENTRY ); + statusPane->SetTitleL( *title ); + CleanupStack::PopAndDestroy( title ); + } + else if ( iOwnStatus ) + { + HBufC* title = iEikonEnv->AllocReadResourceLC( + R_QTN_CHAT_CD_OWN_DATA_TITLE ); + + statusPane->SetTitleL( *title ); + CleanupStack::PopAndDestroy( title ); + } + else + { + // editing existing + HBufC* title; + + // Identification of contact is one of the following + // in this order: + // 1. Nick name + // 2. Alias + // 3. WV ID + if ( iNicknameEnabled ) + { + title = GetEdwinTextBufferL( EChatEditNick ); + if ( title ) + { + CleanupStack::PushL( title ); + statusPane->SetTitleL( *title ); + CleanupStack::PopAndDestroy( title ); + return; + } + } + + if ( iAliasEnabled && iAlias ) + { + statusPane->SetTitleL( *iAlias ); + return; + } + + title = GetEdwinTextBufferL( EChatEditWV ); + if ( title ) + { + CleanupStack::PushL( title ); + statusPane->SetTitleL( *title ); + CleanupStack::PopAndDestroy( title ); + return; + } + } + } + +// --------------------------------------------------------- +// CCAContactEditor::HideEmptyFieldsL +// Hides fields that have no data +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::HideEmptyFieldsL() + { + if ( iInternalMode == TEnumsPC::EAddToContact ) + { + // in this case empty alias should be hidden + if ( ControlOrNull( EChatEditAlias ) ) + { + if ( GetFormEdwin( EChatEditAlias )->TextLength() == 0 ) + { + DeleteLine( EChatEditAlias ); + } + } + } + } + +// --------------------------------------------------------- +// CCAContactEditor::SetFocusToAvailableFieldL +// Sets focus to field that is available +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::SetFocusToAvailableFieldL() + { + TBool readOnly = ETrue; + TInt controlId = EChatEditWV; + TBool aliasField = EFalse, nickField( EFalse ), wvField( EFalse ); + + if ( ControlOrNull( EChatEditNick ) ) + { + nickField = ETrue; + } + + if ( ControlOrNull( EChatEditAlias ) ) + { + aliasField = ETrue; + } + + if ( ControlOrNull( EChatEditWV ) ) + { + wvField = ETrue; + } + + // When opening the editing view from the details view, the cursor is in the end of + // the text field that was in focus on details view. + // Check if focus must be changed to get it visible + if ( ControlOrNull( iInitialFocus ) ) + { + switch ( iInitialFocus ) + { + case EChatEditNick: + { + if ( nickField && + ( !GetFormEdwin( EChatEditNick )->IsReadOnly() ) + ) + { + readOnly = EFalse; + controlId = EChatEditNick; + } + break; + } + + case EChatEditAlias: + { + if ( aliasField && + ( !GetFormEdwin( EChatEditAlias )->IsReadOnly() ) + ) + { + readOnly = EFalse; + controlId = EChatEditAlias; + } + break; + } + + case EChatEditWV: + { + if ( wvField && + ( !GetFormEdwin( EChatEditWV )->IsReadOnly() ) + ) + { + readOnly = EFalse; + } + break; + } + + default: + { + break; + } + } + + //In case the focused field cannot be edited, then focus is + //in the first editable field from the top of the list. + //Identify from top which field is readOnly + if ( readOnly ) + { + + if ( wvField + && ( !GetFormEdwin( EChatEditWV )->IsReadOnly() ) + ) + { + controlId = EChatEditWV; + } + else if ( aliasField + && ( !GetFormEdwin( EChatEditAlias )->IsReadOnly() ) + ) + { + controlId = EChatEditAlias; + } + else if ( nickField + && ( !GetFormEdwin( EChatEditNick )->IsReadOnly() ) + ) + { + controlId = EChatEditNick ; + } + } + + if ( ControlOrNull( controlId ) ) + { + TryChangeFocusToL( controlId ); + GetFormEdwin( controlId )->ClearSelectionL(); + } + + } + + + } + +// --------------------------------------------------------- +// CCAContactEditor::SetInitialCurrentLine +// Set initial line to be in edit-state when edit or add-state is chosen +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::SetInitialCurrentLine() + { + CAknForm::SetInitialCurrentLine(); + + // try to set the focus to what it was in contact + // details viewer, if the caller gave us that + if ( iInitialFocus != EChatEditDummy ) + { + TRAPD( error, + + // the field might not be available, this call + // takes care of moving to a correct field + SetFocusToAvailableFieldL(); ); + + if ( error ) + { + CActiveScheduler::Current()->Error( error ); + } + } + } + +// --------------------------------------------------------- +// CCAContactEditor::OfferKeyEventL +// Overridden method for giving selection-key a default method (edit) +// (other items were commented in a header). +// --------------------------------------------------------- +// + +TKeyResponse CCAContactEditor::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + CHAT_DP( D_CHAT_LIT( "aKeyEvent.iScanCode == %d" ), aKeyEvent.iScanCode ); + CHAT_DP( D_CHAT_LIT( "aKeyEvent.iModifiers == %d" ), aKeyEvent.iModifiers ); + CHAT_DP( D_CHAT_LIT( "aKeyEvent.iRepeats == %d" ), aKeyEvent.iRepeats ); + CHAT_DP( D_CHAT_LIT( "IsEditAble() == %d" ), IsEditable() ); + + + + // Show note when user is trying to edit WV ID + if ( IsEditable() && + IsEditingKey( aKeyEvent ) && + IdOfFocusControl() == EChatEditWV && + aType == EEventKey && + ( iOwnStatus || ( iUserIDNotEditable && iInternalMode != TEnumsPC::EAddToContact ) ) ) + { + IMDialogUtils::DisplayInformationNoteL( + R_QTN_CHAT_UNABLE_MODIFY_USERID, + KNullDesC ); + + return EKeyWasConsumed; + } + + // Show note when user is trying to edit contacts alias + if ( !iOwnStatus && + IsEditable() && + IsEditingKey( aKeyEvent ) && + IdOfFocusControl() == EChatEditAlias && + aType == EEventKey ) + { + IMDialogUtils::DisplayInformationNoteL( + R_QTN_CHAT_UNABLE_MODIFY_ALIAS, + KNullDesC ); + + return EKeyWasConsumed; + } + + if ( aKeyEvent.iCode == EKeyPhoneSend ) + { + return EKeyWasConsumed; + } + + TKeyResponse retVal = CAknForm::OfferKeyEventL( aKeyEvent, aType ); + + // Show domain selection query if variated so + if ( IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_DOMAIN_SELECTION ) + && IsEditable() + && IdOfFocusControl() == EChatEditWV + && aType == EEventKey + && ( aKeyEvent.iCode == EKeyBackspace || aKeyEvent.iCode == EKeyDelete ) ) + { + CEikEdwin* edwin = GetFormEdwin( EChatEditWV ); + if ( edwin->TextLength() == 0 ) + { + HBufC* userName = HBufC::NewLC( KServerWVUserIdMaxLength ); + TPtr userPtr( userName->Des() ); + + + if ( iAppUI-> + UISessionManager().DisplayDomainSelectionQueryL( userPtr ) ) + { + // Domain selected + edwin->SetTextL( userName ); + edwin->SetCursorPosL( 0, EFalse ); + } + + CleanupStack::PopAndDestroy( userName ); + } + } + + return retVal; + } + +// --------------------------------------------------------- +// CCAContactEditor::DynInitMenuPaneL +// Gets called before form is displayed +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + // Execute base class's DynInitMenuPaneL + CAknForm::DynInitMenuPaneL( aResourceId, aMenuPane ); + + // if we're displaying general menu and help feature is not supported.. + if ( aResourceId == R_CHATCLIENT_GENERAL_MENU && + !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + // dimm the help menu item + aMenuPane->SetItemDimmed( EChatClientCmdHelp, ETrue ); + } + else if ( aResourceId == R_AVKON_FORM_MENUPANE ) + { + // Deleting is not needed when editing... + // nor when viewing own status + if ( IsEditable() || iOwnStatus ) + { + aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdDelete, + ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdDelete, + EFalse ); + } + + if ( !iAliasEnabled && iOwnStatus ) + { + aMenuPane->SetItemDimmed( EAknFormCmdEdit, ETrue ); + } + + if ( !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + aMenuPane->SetItemDimmed( EChatClientCmdHelp, ETrue ); + } + // Disable unnecessary items, that CAknForm adds... + aMenuPane->SetItemDimmed( EAknFormCmdDelete, ETrue ); + aMenuPane->SetItemDimmed( EAknFormCmdAdd, ETrue ); + aMenuPane->SetItemDimmed( EAknFormCmdLabel, ETrue ); + aMenuPane->SetItemDimmed( EAknFormCmdSave, ETrue ); + } + } + +// --------------------------------------------------------- +// CCAContactEditor::PreLayoutDynInitL +// Gets called before form is displayed +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::PreLayoutDynInitL() + { + //SetMenuBarTitleResourceL( R_AVKON_SOFTKEYS_DONE_CANCEL ); + SetMenuBarTitleResourceL( R_CHAT_SOFTKEYS_DONE_CANCEL__EMPTY ); + + LoadFormDataL(); + + SetInitialCurrentLine(); + + CAknForm::PreLayoutDynInitL(); + + // set own status, but for landscape mode only + iAppUI->UISessionManager().SetStatusPaneIconsL(); + } + +// --------------------------------------------------------- +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::PostLayoutDynInitL() + { + CAknForm::PostLayoutDynInitL(); + SetEditableL( ETrue ); + } + +// --------------------------------------------------------- +// CCAContactEditor::SaveFormDataL +// Gets called when user chooses to save data +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CCAContactEditor::SaveFormDataL() + { + // we need to be logged in + if ( !iAppUI->UISessionManager().LoginL( MCAUiLoginCmdCB::EQueryLogin ) ) + { + return EFalse; + } + + + // wait for background fetch + if ( !CCASyncChecker::CheckSyncStateL() ) + { + // canceled or not logged in + return EFalse; + } + MCABlockingPC* blockingInterface = iAppUI->GetProcessManager().GetBlockingInterface(); + + iAllFieldsEmpty = ETrue; + iContactWasSaved = EFalse; + iSaveStarted = ETrue; + + if ( iOwnStatus ) + { + if ( iAliasEnabled ) + { + HBufC* alias = GetEdwinTextBufferLC( EChatEditAlias ); + if ( !alias ) + { + CleanupStack::PopAndDestroy( alias ); + if ( IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_ALIAS_MANDATORY ) ) + { + IMDialogUtils::DisplayQueryDialogL( R_QTN_CHAT_NO_ALIAS_DEF ); + iAllFieldsEmpty = EFalse; + iSaveStarted = EFalse; + return EFalse; + } + //it should never be empty + alias = KNullDesC().AllocLC(); + } + + //call function tat will UpdateOwnAliasL( alias->Des() ); + iAppUI->ShowWaitDialogLC( R_QTN_GEN_NOTE_SAVING, ETrue ); + + MCASettingsPC* settingsPC = iAppUI->GetProcessManager().GetSettingsInterface(); + + iContactEditOperationError = iCCAContactEditPC->UpdateOwnAliasL( *alias ); + + CleanupStack::Pop(); //wait dialog + + CleanupStack::PopAndDestroy( alias ); + + if ( iContactEditOperationError ) + { + iAppUI->DismissWaitDialogL( KErrNone, EFalse, KNullDesC ); + iAliasNotOk = ETrue; + if ( iContactEditOperationError == ECSPInvalidPresenceValue ) + { + //iAliasNotOk = ETrue; + iAllFieldsEmpty = EFalse; + HBufC* text = StringLoader::LoadLC( R_QTN_CHAT_TOO_LONG_ALIAS_TEXT ); + IMDialogUtils::DisplayErrorNoteL( *text ); + CleanupStack::PopAndDestroy( text ); + } + iSaveStarted = EFalse; + return EFalse; + } + else + { + iAppUI->DismissWaitDialogL( KErrNone, EFalse, KNullDesC ); + // Alias saved OK, show confirmation note + IMDialogUtils::DisplayInformationNoteL( R_QTN_CHAT_CNOTE_SAVED ); + iAllFieldsEmpty = EFalse; + iContactWasSaved = ETrue; + } + } + iSaveStarted = EFalse; + return ETrue; + } + + //delete the old iNewUserId if exists + if ( iNewUserId ) + { + delete iNewUserId; + iNewUserId = NULL; + } + + //delete the old iNick if exists + if ( iNick ) + { + delete iNick; + iNick = NULL; + } + + // Get nickname + if ( iNicknameEnabled ) + { + iNick = GetEdwinTextBufferL( EChatEditNick ); + if ( iNick ) + { + iAllFieldsEmpty = EFalse; + } + } + + // make sure we have some kind of nick + if ( !iNick ) + { + iNick = HBufC::NewL( 0 ); + } + + iNewUserId = GetEdwinTextBufferL( EChatEditWV ); + + if ( !iNewUserId ) // if the field is empty + { + + // Create empty buffer + iNewUserId = HBufC::NewL( 0 ); + + if ( !iAllFieldsEmpty ) + { + CAknQueryDialog* dlg = + new ( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone ); + TInt ret( dlg->ExecuteLD( + R_CHAT_CEDITOR_ERROR_WVIDMISSING_QUERY ) ); + if ( ( ret != EAknSoftkeyOk ) && ( ret != EAknSoftkeyYes ) ) + { + if ( iInternalMode == TEnumsPC::EAddToContact ) + { + // just get out of here, nothing to delete + iContactDeleted = ETrue; + iSaveStarted = EFalse; + return ETrue; + } + else + { + + TInt err = DeleteCurrentContactL( EFalse ); + if ( err == KErrNone ) + { + iContactDeleted = ETrue; + CHAT_DP_TXT( "contact should NOT be saved.." ); + iSaveStarted = EFalse; + return ETrue; + } + else + { + // let user out of contact editor but report the error + iContactDeleted = ETrue; + CActiveScheduler::Current()->Error( err ); + iSaveStarted = EFalse; + return ETrue; + } + } + } + + CHAT_DP_TXT( "wvid missing, changing focus to editor.." ); + TryChangeFocusToL( EChatEditWV ); + iSaveStarted = EFalse; + return EFalse; + } + } + else + { + iAllFieldsEmpty = EFalse; + + if ( iOrigId ) + { + // we have some user id, so reconstruct it (add removed "wv:" and "@something") + HBufC* newId = CAUtils::ReconstructIdL( *iOrigId, *iNewUserId ); + + // replace the id with new one + delete iNewUserId; + iNewUserId = newId; + } + } + + if ( !CAUtils::ValidLoginIdL( *iNewUserId ) ) + { + HBufC* text = StringLoader::LoadLC( R_CHAT_ERROR_WRONG_WVID, *iNewUserId ); + IMDialogUtils::DisplayErrorNoteL( *text ); + CleanupStack::PopAndDestroy( text ); // text + iSaveStarted = EFalse; + return EFalse; + } + + // If all fields are empty then we can go back without saving contact + if ( iAllFieldsEmpty ) + { + iSaveStarted = EFalse; + return ETrue; + } + + + // check if there's already a contact with same wvid + + TBool contactInList( EFalse ); + TDesC* tmpUsrId = NULL; + + //Check whether a new contact/existing contact + TBool createNew = ( iInternalMode == TEnumsPC::EAddToContact ) ? ETrue : EFalse; + + TBool emptyNick = ( iNick->CompareC( KNullDesC ) == 0 ); + TBool sameNick = emptyNick ? EFalse + : iCCAContactEditPC->FindAnyContactByNickL( *iNick ); + + + if ( sameNick ) + { + // Contact with same nick was found from stored contacts, + // ask if user wants to edit nick + TInt ret = IMDialogUtils::DisplayYesNoConfirmationDialogL( + R_QTN_CHAT_SAME_NICK_NAME ); + + // If user wants to edit nick move focus to nick and highlight it. + // Otherwise continue saving with current nick + if ( ret == EAknSoftkeyOk || ret == EAknSoftkeyYes ) + { + FocusEdwinL( EChatEditNick, ETrue ); + iSaveStarted = EFalse; + return EFalse; + } + } + + if ( blockingInterface->IsContactBlocked( *iNewUserId ) + && ( 1 == IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_BLOCKING ) ) ) + { + iCCAContactEditPC->DeleteContactL( *iNewUserId ); + } + + if ( iCCAContactEditPC->IsWVIDAvailableAndValidL( createNew, *iListId, *iNewUserId, + contactInList, tmpUsrId ) ) + { + if ( contactInList ) + { + + TInt ret( IMDialogUtils::DisplayYesNoConfirmationDialogL( + R_QTN_CHAT_CREATE_CONFQ_EX_WVID ) ); + + if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) ) + { + iInternalMode = TEnumsPC::EEditContact; + // Change user id to match new target contact. + delete iUserId; + iUserId = NULL; + iUserId = tmpUsrId->AllocL(); + } + else + { + // move focus to wvid and highlight it + FocusEdwinL( EChatEditWV, ETrue ); + iSaveStarted = EFalse; + return EFalse; + } + } + + } + + else + { + iInternalMode = TEnumsPC::EAddToContact; + } + + + // check if unblock query enabled and blocked contacts + // are not shown in the contact list + TBool showUnblockQuery = + ( ( IMUtils::CRKeyL( KCRUidIMVariation, KIMVariationKey ) + & EIMFeatAddBlockedContactQuery ) + && ( IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_BLOCKING ) != 2 ) ); + + if ( showUnblockQuery ) + { + + + // check if the wvid to be added is blocked + if ( blockingInterface->IsContactBlocked( *iNewUserId ) ) + { + // show query + HBufC* prompt = NULL; + prompt = StringLoader::LoadLC( R_QTN_CHAT_CONTACT_ADD_BLOCKED, + CCAPCUtils::DisplayId( *iNewUserId ) ); + + TInt ret( IMDialogUtils::DisplayYesNoConfirmationDialogL( + *prompt ) ); + + if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) ) + { + //We have to create a list of users to be unblocked + CDesCArrayFlat* unBlockList = + new ( ELeave ) CDesCArrayFlat( 1 ); + CleanupStack::PushL( unBlockList ); + unBlockList->AppendL( *iNewUserId ); + + // unblock + iAppUI->ShowWaitDialogL( R_CHAT_BLOCK_REMOVING ); + TInt errorCode( KErrNone ); + TRAPD( err, errorCode = + blockingInterface->RemoveL( unBlockList, NULL ) ); + iAppUI->DismissWaitDialogL( err ); + + if ( errorCode != KErrNone ) + { + IMDialogUtils::DisplayErrorNoteL( errorCode ); + } + CleanupStack::PopAndDestroy( 2, prompt ); // unBlockList, prompt + } + else + { + CleanupStack::PopAndDestroy( prompt ); + prompt = StringLoader::LoadLC( R_QTN_CHAT_CONTACT_ADD_BLOCKED_NOT ); + IMDialogUtils::DisplayErrorNoteL( *prompt ); + CleanupStack::PopAndDestroy( prompt ); // prompt + // Return to place where adding was initiated + iContactWasSaved = ETrue; + iSaveStarted = EFalse; + return ETrue; + } + } + } + + HBufC* oldUserId = NULL; + + // proceed with adding or saving + if ( iInternalMode == TEnumsPC::EAddToContact ) + { + iAppUI->ShowWaitDialogLC( R_QTN_CHAT_FRIEND_ADDPB ); + + //*******************// add called + iContactEditOperation = MCAUiContactEditCmdCB::TContactEditParams::EAddContact; + iCCAContactEditCmd->ExecuteCommandL(); + + CleanupStack::PopAndDestroy(); // iAppUI->DismissWaitDialog + } + else + { + // editing a contact + if ( iUserId ) + { + oldUserId = iUserId->AllocLC(); + } + else + { + // in this case it's NULL, more nicer cleanup later + CleanupStack::PushL( oldUserId ); + } + + iAppUI->ShowWaitDialogLC( R_QTN_GEN_NOTE_SAVING ); + + + if ( iUserId && ( CAUtils::NeutralCompare( *iNewUserId, *iUserId ) == 0 ) ) + { + //call for update ****************** + + iContactEditOperation = MCAUiContactEditCmdCB::TContactEditParams::EUpdateContact; + iCCAContactEditCmd->ExecuteCommandL(); + + if ( iContactEditOperationError == KErrNone ) + { + delete iUserId; + iUserId = NULL; + iUserId = iNewUserId->AllocL(); + } + } + else + { + iCCAContactEditPC->SetAnyContactL( *iNewUserId ); + //*******************// add called + iContactEditOperation = MCAUiContactEditCmdCB::TContactEditParams::EAddContact; + iCCAContactEditCmd->ExecuteCommandL(); + + } + CleanupStack::PopAndDestroy(); // iAppUI->DismissWaitDialog + + } + + // handle possible error cases + CHAT_DP( D_CHAT_LIT( "*UpdateContactL error %d" ), iContactEditOperationError ); + + iSaveStarted = EFalse; + + HBufC* text = NULL; + + switch ( iContactEditOperationError ) + { + case ECSPAccountLost: // this error occurs when the list is full + case ECSPContactListFull: // flowthrough + { + text = iEikonEnv->AllocReadResourceLC( + R_QTN_CHAT_CONTACT_LIST_FULL ); + IMDialogUtils::DisplayErrorNoteL( *text ); + CleanupStack::PopAndDestroy( text ); + break; + } + + case ECSPUnknownUserId: // this error occurs when the userID is unknown + { + text = iEikonEnv->AllocReadResourceLC( + R_QTN_CHAT_VALIDATING_CONTACT_FAILED ); + IMDialogUtils::DisplayErrorNoteL( *text ); + CleanupStack::PopAndDestroy( text ); + + // move focus to wvid and highlight it + FocusEdwinL( EChatEditWV ); + + //iCCAContactEditPC->SetContactL( *iListId, *iNewUserId ); + + if ( iInternalMode != TEnumsPC::EAddToContact ) + { + CleanupStack::PopAndDestroy( oldUserId ); // oldUserId + } + + return EFalse; + } + + + case KErrNone: // contact added + { + iContactWasSaved = ETrue; + break; + } + + default: + { + // show error code + IMNoteMapper::ShowNoteL( iContactEditOperationError, *iNewUserId ); + break; + } + } + + if ( iInternalMode != TEnumsPC::EAddToContact ) + { + // editing a contact + + // got some error, so restore userid + if ( iContactEditOperationError != KErrNone ) + { + if ( oldUserId ) + { + delete iUserId; + iUserId = oldUserId; + } + CleanupStack::Pop( oldUserId ); + } + else + { + // it could be NULL, doesn't matter + CleanupStack::PopAndDestroy( oldUserId ); + } + } + + if ( iContactEditOperationError != KErrNone ) + { + return EFalse; + } + + + return ETrue; + } + +// --------------------------------------------------------- +// CCAContactEditor::DoNotSaveFormDataL +// Gets called when user chooses not to save data +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::DoNotSaveFormDataL() + { + // Refresh screen data + if ( iInternalMode == TEnumsPC::EEditAfterView ) + { + iInternalMode = TEnumsPC::EViewContact; + LoadFormDataL(); + SetEditableL( EFalse ); + } + } + +// --------------------------------------------------------- +// CCAContactEditor::OkToExitL +// Button that was pressed for dismissing dialog +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CCAContactEditor::OkToExitL( TInt aButtonId ) + { + CHAT_DP_TXT( "CCAContactEditor::OkToExitL" ); + if ( iSaveStarted ) + { + return EFalse; + } + + HideMenu(); + + if ( aButtonId == EAknSoftkeyEmpty ) + { + return EFalse; + } + // If user chose exit, then dialog can be dismissed from any state + if ( aButtonId == EEikCmdExit || aButtonId == EAknSoftkeyExit || aButtonId == EAknSoftkeyCancel ) + { + return ETrue; + } + + + // Functionality of EAknSoftkeyDone is the same as EAknSoftkeyBack + if ( aButtonId == EAknSoftkeyDone ) + { + aButtonId = EAknSoftkeyBack; + } + + if ( !iAppUI->UISessionManager().IsLoggedIn() ) + { + iAppUI->UISessionManager().LoginL(MCAUiLoginCmdCB::EQueryLogin); + SaveFormDataL(); + } + + // Call base class to handle the event + TBool okToExit( CAknForm::OkToExitL( aButtonId ) ); + + if ( aButtonId != EAknSoftkeyBack ) + { + return okToExit; + } + + if ( !iAppUI->UISessionManager().IsLoggedIn() ) + { + return EFalse; + } + + // iAllFieldsEmpty is ETrue if + // - Nothing has been changed. + // - All fields are empty + + // iContactDeleted is ETrue if + // - Contact is deleted + // - Wvid is empty and user wants to close edit mode. + + // iContactWasAdded is ETrue if + // - Contact is added successfully + + // None of these can be set at the same time if situation is ok to exit. + + if ( ( iAllFieldsEmpty ^ iContactDeleted ^ iContactWasSaved ) ) + { + if ( iInternalMode == EEditAfterView ) + { + // Change focus if needed + SetFocusToAvailableFieldL(); + //Set the internal state + DoNotSaveFormDataL(); + + // Reset flags + iAllFieldsEmpty = ETrue; + iContactDeleted = EFalse; + iContactWasSaved = EFalse; + return EFalse; + } + else + { + return ETrue; + } + } + return EFalse; + } + +// --------------------------------------------------------- +// CCAContactEditor::LaunchHelpL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAContactEditor::LaunchHelpL( const TDesC& aContext ) + { + if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + //make context array + //granularity 1 is ok cos there is added just one item + CArrayFix< TCoeHelpContext >* cntx = new( ELeave ) CArrayFixFlat < + TCoeHelpContext > ( 1 ); + CleanupStack::PushL( cntx ); + + cntx->AppendL( TCoeHelpContext( KUidChatClient, aContext ) ); + CleanupStack::Pop( cntx ); + + //and launch help - takes ownership of context array + HlpLauncher::LaunchHelpApplicationL( + CEikonEnv::Static()->WsSession(), cntx ); + } + } + +// --------------------------------------------------------- +// CCAContactEditor::QuerySaveChangesL +// Do not ask about saving the contact +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CCAContactEditor::QuerySaveChangesL() + { + return ETrue; + } + + + +// ----------------------------------------------------------------------------- +// CCAContactEditor::IsNonEditingKey() +// ----------------------------------------------------------------------------- +// +TBool CCAContactEditor::IsEditingKey( const TKeyEvent &aKeyEvent ) + { + switch ( aKeyEvent.iScanCode ) + { + // list of editing keys + case EStdKeyForwardSlash: // fallthrough + case EStdKeyBackSlash: + case EStdKeySemiColon: + case EStdKeySingleQuote: + case EStdKeyHash: + case EStdKeySquareBracketLeft: + case EStdKeySquareBracketRight: + case EStdKeyMinus: + case EStdKeyEquals: + case EStdKeyNkpForwardSlash: + case EStdKeyNkpAsterisk: + case EStdKeyNkpMinus: + case EStdKeyNkpPlus: + case EStdKeyNkpEnter: + case EStdKeyNkp1: + case EStdKeyNkp2: + case EStdKeyNkp3: + case EStdKeyNkp4: + case EStdKeyNkp5: + case EStdKeyNkp6: + case EStdKeyNkp7: + case EStdKeyNkp8: + case EStdKeyNkp9: + case EStdKeyNkp0: + case EStdKeyBackspace: + case EStdKeyTab: + case EStdKeyEnter: + case EStdKeySpace: + { + return ETrue; + } + } + + // qwerty keyboard: alphapetic keys 'a'-'z' + if ( aKeyEvent.iCode >= KAlphaCodeA && aKeyEvent.iCode <= KAlphaCodeZ ) + { + return ETrue; + } + + // numeric keys '0'-'9' + if ( aKeyEvent.iCode >= KNumCode0 && aKeyEvent.iCode <= KNumCode9 ) + { + return ETrue; + } + + // non editing key + return EFalse; + } + + +// ----------------------------------------------------------------------------- +// CCAContactEditor::FocusEdwinL +// ----------------------------------------------------------------------------- +// +void CCAContactEditor::FocusEdwinL( TInt aId, TBool aHighlight /*= EFalse*/ ) + { + TryChangeFocusToL( aId ); + CEikEdwin* wvField = GetFormEdwin( aId ); + if ( aHighlight ) + { + // Set field to be highlighted + wvField->SelectAllL(); + } + wvField->SetCursorPosL( wvField->TextLength(), aHighlight ); + } + + +// ----------------------------------------------------------------------------- +// CCAContactEditor::GetParameters +// this function is called by the contact edit object +// this function is called by the contact edit object +// based on the iContactEditOperation - The Command object +// gets the required data from UI +// ----------------------------------------------------------------------------- +// + +void CCAContactEditor::GetParameters( MCAUiContactEditCmdCB::TContactEditParams& aParam ) + { + + aParam.iContactEditOperation = iContactEditOperation; + + switch ( aParam.iContactEditOperation ) + { + case MCAUiContactEditCmdCB::TContactEditParams::ELoadContactDetails : + //load exisiting contact details + { + aParam.iAliasEnabled = iAliasEnabled; + aParam.iNicknameEnabled = iNicknameEnabled; + break; + } + + case MCAUiContactEditCmdCB::TContactEditParams::EAddContact : + //add a new contact + { + aParam.iListId = iListId; + aParam.iUserId = iNewUserId; + aParam.iNickname = iNick; + aParam.iAlias = iAlias; + aParam.iNewContact = ETrue; + break; + } + case MCAUiContactEditCmdCB::TContactEditParams::EUpdateContact : + //update an existing contact + { + aParam.iListId = iListId; + aParam.iUserId = iNewUserId; + aParam.iNickname = iNick; + aParam.iAlias = iAlias; + aParam.iNewContact = EFalse; + break; + } + case MCAUiContactEditCmdCB::TContactEditParams::EMoveContact : + //move a exisiting contact from one list to another + { + aParam.iListId = iListId; + aParam.iUserId = iUserId; + break; + } + default: + { + break; + } + } + } + + +// ----------------------------------------------------------------------------- +// CCAContactEditor::SetParameters +// this function is called by the contact edit object +// based on the iContactEditOperation - command object sets the +// data required by UI. +// The ownership of pointer varibles is also transferred to the UI. +// Hence UI must delete the allocated data. +// ----------------------------------------------------------------------------- +// +void CCAContactEditor::SetParameters( MCAUiContactEditCmdCB::TContactEditParams& aParam ) + { + switch ( aParam.iContactEditOperation ) + { + case MCAUiContactEditCmdCB::TContactEditParams::ELoadContactDetails : + { + iOwnStatus = aParam.iOwnData; + iOrigId = aParam.iOrigId; + iUserId = aParam.iUserId; + iAlias = aParam.iAlias; + iIdentification = aParam.iIdentification; + iNick = aParam.iNickname; + break; + } + + case MCAUiContactEditCmdCB::TContactEditParams::EAddContact : + case MCAUiContactEditCmdCB::TContactEditParams::EUpdateContact : + case MCAUiContactEditCmdCB::TContactEditParams::EMoveContact : + { + iContactEditOperationError = aParam.iContactEditOperationError; + break; + } + default: + { + break; + } + } + } + + +// ----------------------------------------------------------------------------- +// CCAContactEditor::DeleteCurrentContactL +// ----------------------------------------------------------------------------- +// +TInt CCAContactEditor::DeleteCurrentContactL( TBool aAskConfirmation /*= ETrue*/ ) + { + // can't delete self + if ( iOwnStatus ) + { + return KErrAccessDenied; + } + + // Get the name of the friend to be deleted + TPtrC name( *iIdentification ); + + // Load and format confirmation string from resource + HBufC* prompt = StringLoader::LoadLC( RSC_CHAT_DELETE_CONFIRMATION, name ); + + TInt ret = aAskConfirmation ? + IMDialogUtils::DisplayQueryDialogL( + R_GENERIC_YES_NO_CONFIRMATION_QUERY, *prompt ) : + EAknSoftkeyOk; + CleanupStack::PopAndDestroy( prompt ); + + TInt error( KErrCancel ); + + // Check what the user responded + if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) ) + { + // accepted, lets delete the contact + iAppUI->ShowWaitDialogLC( R_QTN_CHAT_DELETING_CONTACT ); + + error = iCCAContactEditPC->DeleteCurrentContactL( *iListId, *iOrigId ); + + CleanupStack::PopAndDestroy(); //iAppUI->DismissWaitDialogL() + if ( error <= Imps_ERROR_BASE ) + { + // server error + IMNoteMapper::ShowNoteL( error ); + } + } + + return error; + } + +// ----------------------------------------------------------------------------- +// CCAContactEditor::GetListIdL() +// ----------------------------------------------------------------------------- +// + +HBufC* CCAContactEditor::GetListIdL( const TDesC& aId, TInt aNoListsResource ) + { + + TInt itemCount( 0 ); + CDesCArrayFlat* listIdArray = NULL; + + RArray indexArray; + + HBufC* listId = NULL; + + listId = iCCAContactEditPC->GetListIdL( aId, aNoListsResource, itemCount, + listIdArray, indexArray, + ( iInternalMode == TEnumsPC::EMoveContact ) ? ETrue : EFalse + ); + + if ( !listId ) + { + if ( itemCount == 0 ) + { + if ( aNoListsResource != 0 ) + { + IMDialogUtils::DisplayInformationNoteL( aNoListsResource ); + } + else + { + // Show note with OK softkey, return value can be ignored + IMDialogUtils::DisplayQueryDialogL( R_QTN_CHAT_CEDITOR_NOCONTACTLISTS ); + TInt initValue = KErrNotFound; + // Advance to list creation + TInt ret = CCAUINGUtils::NewContactListL( initValue ); + + if ( ret == KErrNone ) + { + // List created succesfully, call this recursively to get list id + return iCCAContactEditPC->GetListIdL( aId, aNoListsResource, itemCount, + listIdArray, indexArray, + ( iInternalMode == TEnumsPC::EMoveContact ) ? ETrue : EFalse ); + } + else + { + CActiveScheduler::Current()->Error( ret ); + } + } + } + else if ( itemCount > 1 ) + { + //this means thats indexArray, listIdArray has been allocated by GetListIdL function. + //so we need to push the same in cleanupstack again + CleanupClosePushL( indexArray ); + CleanupStack::PushL( listIdArray ) ; + + TInt selectedIndex( 0 ); + HBufC* titleText = CCoeEnv::Static()->AllocReadResourceLC( + R_QTN_CHAT_SERVCONT_SELLIST ); + // launch the list query + TInt ret( IMDialogUtils::DisplayListQueryDialogL( &selectedIndex, listIdArray, + R_PRIVATE_CHAT_LIST_SELECT_RECIP_DLG, + *titleText, KNullDesC, ETrue ) ); + CleanupStack::PopAndDestroy( 2, listIdArray ); // listIdArray, titleText + + if ( ( ret == EAknSoftkeyOk || ret == EAknSoftkeyDone || ret == + EAknSoftkeySelect ) && ( iAppUI->UISessionManager().IsLoggedIn() ) ) + { + HBufC* listId = iCCAContactEditPC->GetListIdAtIndexL( indexArray[selectedIndex] ); + CleanupStack::PopAndDestroy( &indexArray ); //indexArray + return listId; + } + else + { + CleanupStack::PopAndDestroy( &indexArray ); //indexArray + } + } + } + + return listId; + } + + +// --------------------------------------------------------- +// CCAContactEditor::MoveContactL +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CCAContactEditor::MoveContactL( const TDesC& aListId, + HBufC*& aMovedListId, TBool& aCollapsed ) + { + CHAT_DP_TXT( "CCAContactEditor::MoveContactL() start" ); + aMovedListId = NULL; + if ( !iCCAContactEditPC->IsContact() ) + { + User::Leave( KErrNotFound ); + } + + if ( !CCASyncChecker::CheckSyncStateL() ) + { + return EFalse; + } + + iInternalMode = TEnumsPC::EMoveContact; + + // select list + HBufC* listId = GetListIdL( aListId, R_QTN_CHAT_NO_LISTS ); + + if ( !listId ) + { + // no other lists available + return EFalse; + } + + // copy the listid, where the contacts has to be moved, + // Ownership is transfered to the caller. + aMovedListId = listId->AllocL(); + + // Get the status of the list(collapsed/expanded) + // before performing the actual move. + aCollapsed = iCCAContactEditPC->IsCollapsedL( *listId ); + + CleanupStack::PushL( listId ); + + /* In case the contact is already in the selected list, it is + removed from the current list, but not moved to the selected list anymore. + */ + // check if there's already a contact with same wvid + TBool contactInList( EFalse ); + TDesC* tmpUsrId = NULL; + const TDesC& userId = iCCAContactEditPC->GetCurrentContactUserId(); + + if ( iCCAContactEditPC->IsWVIDAvailableAndValidL( ETrue, *listId, + userId, + contactInList, tmpUsrId ) ) + { + if ( contactInList ) + { + TInt error = iCCAContactEditPC->DeleteCurrentContactL( aListId, userId ); + CleanupStack::PopAndDestroy(); + return EFalse; + } + } + + + iListId = aListId.AllocL(); + + iUserId = listId->AllocL(); + + CCAWaitNote* note = CCAWaitNote::ShowWaitNoteLC( + R_QTN_CHAT_MOVING_CONTACT ); + + iContactEditOperation = MCAUiContactEditCmdCB::TContactEditParams::EMoveContact; + iCCAContactEditCmd->ExecuteCommandL(); + + CleanupStack::PopAndDestroy( 2, listId ); //note, listid + + switch ( iContactEditOperationError ) + { + + case ECSPContactListFull: // flowthrough + { + HBufC* text = iEikonEnv->AllocReadResourceLC( + R_QTN_CHAT_CONTACT_LIST_FULL ); + IMDialogUtils::DisplayErrorNoteL( *text ); + CleanupStack::PopAndDestroy( text ); + break; + } + case KErrNone: + { + // show note + IMDialogUtils::DisplayConfirmationNoteL( R_QTN_CHAT_CONTACT_MOVED ); + return ETrue;// if the control comes here..move was successful... + } + case ECSPPartiallySuccessful: + { + CCAUINGUtils::HandlePartialSuccessL(); + break; + } + default: + { + IMNoteMapper::ShowNoteL( iContactEditOperationError ); + break; + } + } + + CHAT_DP_TXT( "CCAContactEditor::MoveContactL() done" ); + return EFalse;// if the control comes here..move was failed... + } + + +// End of File