phonebookui/Phonebook2/ServerApplication/src/CPbk2SingleContactDataAssigner.cpp
changeset 0 e686773b3f54
child 7 b3431bff8c19
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2SingleContactDataAssigner.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,616 @@
+/*
+* Copyright (c) 2005-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:  Phonebook 2 single contact data assigner.
+*
+*/
+
+
+#include "CPbk2SingleContactDataAssigner.h"
+
+// Phonebook 2
+#include "CPbk2ServerAppAppUi.h"
+#include "MPbk2UiServiceObserver.h"
+#include "TPbk2TitlePaneOperator.h"
+#include "TPbk2ServerMessageDataRetriever.h"
+#include "CPbk2ServerAppStoreManager.h"
+#include "CPbk2SelectSinglePropertyPhase.h"
+#include "CPbk2ContactFetchPhase.h"
+#include "CPbk2SingleAssignDataPhase.h"
+#include "CPbk2SelectCreateNewPropertyPhase.h"
+#include "CPbk2PrepareSingleAssignPhase.h"
+#include "MPbk2SelectFieldProperty.h"
+#include <Pbk2UIControls.rsg>
+#include <Pbk2ServerApp.rsg>
+#include <CPbk2StoreManager.h>
+#include <CPbk2StoreConfiguration.h>
+#include <MPbk2ApplicationServices.h>
+#include "TPbk2AssignNoteService.h"
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <CVPbkContactStoreUriArray.h>
+#include <MVPbkContactLink.h>
+#include <CVPbkFieldTypeSelector.h>
+#include <MVPbkStoreContact.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <VPbkContactStoreUris.h>
+
+// System includes
+#include <AiwContactAssignDataTypes.h>
+
+using namespace AiwContactAssign;
+
+
+/// Unnamed namespace for local definitions
+namespace {
+
+#ifdef _DEBUG
+
+enum TPanicCode
+    {
+    ELogicPreselectedContacts,
+    EPanicLogicPhaseCompletion
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT( KPanicText, "CPbk2SingleContactDataAssigner" );
+    User::Panic( KPanicText, aReason );
+    }
+
+#endif // _DEBUG
+
+/**
+ * Sets title pane.
+ *
+ * @param aDataRetriever    Server message data retriever.
+ * @param aFlags            Assign flags.
+ * @param aMessage          Server message.
+ */
+void SetTitlePaneL
+        ( TPbk2ServerMessageDataRetriever& aDataRetriever, TUint aFlags,
+          const RMessage2& aMessage )
+    {
+    HBufC* titlePaneText = NULL;
+    if ( !( aFlags & AiwContactAssign::EUseProviderTitle ) )
+        {
+        titlePaneText = aDataRetriever.GetTitlePaneTextL( aMessage );
+        }
+    TPbk2TitlePaneOperator titlePaneOperator;
+    titlePaneOperator.SetTitlePaneL( titlePaneText ); // takes ownership
+    }
+
+} /// namespace
+
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::CPbk2SingleContactDataAssigner
+// --------------------------------------------------------------------------
+//
+CPbk2SingleContactDataAssigner::CPbk2SingleContactDataAssigner
+        ( MPbk2UiServiceObserver& aObserver ) :
+            iObserver( aObserver )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::~CPbk2SingleContactDataAssigner
+// --------------------------------------------------------------------------
+//
+CPbk2SingleContactDataAssigner::~CPbk2SingleContactDataAssigner()
+    {
+    delete iSelectPropertyPhase;
+    delete iFetchPhase;
+    delete iPrepareAssignPhase;
+    delete iAssignDataPhase;
+    delete iStoreUris;
+    delete iDataBuffer;
+    delete iAddressSelectFilterBuffer;
+    delete iPreselectedContact;
+    delete iSelectFieldProperty;
+    delete iContactViewFilter;
+    delete iStoreManager;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2SingleContactDataAssigner* CPbk2SingleContactDataAssigner::NewL
+        ( const RMessage2& aFetchCompleteMessage,
+          MPbk2UiServiceObserver& aObserver )
+    {
+    CPbk2SingleContactDataAssigner* self =
+        new(ELeave) CPbk2SingleContactDataAssigner( aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL( aFetchCompleteMessage );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::ConstructL( const RMessage2& aMessage )
+    {
+    // Retrieve data from the client-server message
+    TPbk2ServerMessageDataRetriever dataRetriever;
+    iAssignFlags = dataRetriever.SingleContactAssignFlagsL( aMessage );
+
+    // Set title pane
+    SetTitlePaneL( dataRetriever, iAssignFlags, aMessage );
+
+    CPbk2ServerAppAppUi& appUi = static_cast<CPbk2ServerAppAppUi&>
+        ( *CEikonEnv::Static()->EikAppUi() );
+
+    iPreselectedContact = dataRetriever.GetPreselectedContactLinksL
+        ( aMessage, appUi.ApplicationServices().ContactManager() );
+    iStoreUris = dataRetriever.GetContactStoreUriArrayL
+        ( aMessage, appUi.ApplicationServices().StoreConfiguration(),
+          iPreselectedContact, iUseDeviceConfig );
+
+    // Assert that there aren't multiple preselected contacts
+    __ASSERT_DEBUG( ( !iPreselectedContact ||
+        iPreselectedContact->Count() <= 1 ),
+        Panic( ELogicPreselectedContacts ) );
+
+    iAddressSelectFilterBuffer =
+        dataRetriever.GetAddressSelectFilterBufferL( aMessage );
+    iDataBuffer = dataRetriever.GetDataBufferL( aMessage );
+    iMimeType = dataRetriever.GetMimeTypeL( aMessage );
+    iFieldIndex = dataRetriever.GetFocusIndexL( aMessage );
+
+    iEditorHelpContext = dataRetriever.GetEditorHelpContextL( aMessage );
+
+    // Drop all non-writable stores
+    iStoreManager = CPbk2ServerAppStoreManager::NewL
+        ( appUi.StoreManager(),
+          appUi.ApplicationServices().ContactManager() );
+    iStoreManager->RemoveReadOnlyStoreUris
+        ( *iStoreUris, appUi.ApplicationServices().StoreProperties() );
+
+    // Retrieve view filter
+    iContactViewFilter =
+        dataRetriever.GetContactViewFilterForAttributeAssignL
+            ( aMessage,
+              appUi.ApplicationServices().ContactManager().FieldTypes() );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::LaunchServiceL
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::LaunchServiceL()
+    {
+    // Open stores
+    iStoreManager->LoadAndOpenContactStoresL( *iStoreUris, *this, ETrue );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::CancelService
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::CancelService()
+    {
+    if ( iAssignDataPhase )
+        {
+        iAssignDataPhase->CancelServicePhase();
+        }
+
+    if ( iPrepareAssignPhase )
+        {
+        iPrepareAssignPhase->CancelServicePhase();
+        }
+
+    if ( iSelectPropertyPhase )
+        {
+        iSelectPropertyPhase->CancelServicePhase();
+        }
+
+    if ( iFetchPhase )
+        {
+        iFetchPhase->CancelServicePhase();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::AcceptDelayedContactsL
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::AcceptDelayedContactsL
+        ( const TDesC8& /*aContactLinkBuffer*/ )
+    {
+    // Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::ExitServiceL
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::ExitServiceL( TInt aExitCommandId )
+    {
+    if ( iAssignDataPhase )
+        {
+        iAssignDataPhase->RequestCancelL( aExitCommandId );
+        }
+
+    if ( iPrepareAssignPhase )
+        {
+        iPrepareAssignPhase->RequestCancelL( aExitCommandId );
+        }
+
+    if ( iSelectPropertyPhase )
+        {
+        iSelectPropertyPhase->RequestCancelL( aExitCommandId );
+        }
+
+    if ( iFetchPhase )
+        {
+        iFetchPhase->RequestCancelL( aExitCommandId );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::ServiceResults
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::ServiceResults(TServiceResults* aResults) const
+    {
+    if ( iAssignDataPhase )
+        {
+        aResults->iLinkArray = iAssignDataPhase->Results();
+        aResults->iExtraData = iAssignDataPhase->ExtraResultData();
+        aResults->iFieldContent = iAssignDataPhase->FieldContent();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::NextPhase
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::NextPhase
+        ( MPbk2ServicePhase& aPhase )
+    {
+    TInt err = KErrNone;
+
+    if ( &aPhase == iFetchPhase )
+        {
+        MVPbkContactLinkArray* fetchResult = iFetchPhase->Results();
+        __ASSERT_DEBUG( fetchResult && fetchResult->Count() > 0,
+            Panic( EPanicLogicPhaseCompletion ) );
+
+        TRAP( err, LaunchSelectSinglePropertyPhaseL( fetchResult ) );
+        }
+    else if ( &aPhase == iSelectPropertyPhase )
+        {
+        TRAP( err, LaunchPrepareSingleAssignPhaseL
+            ( iSelectPropertyPhase->TakeStoreContact() ) );
+        }
+    else if ( &aPhase == iPrepareAssignPhase )
+        {
+        TRAP( err, LaunchAssignPhaseL
+            ( iPrepareAssignPhase->TakeStoreContact() ) );
+        }
+    else if ( &aPhase == iAssignDataPhase )
+        {
+        iObserver.ServiceComplete();
+        }
+    else
+        {
+        __ASSERT_DEBUG( EFalse, Panic( EPanicLogicPhaseCompletion ) );
+        }
+
+    if ( err != KErrNone )
+        {
+        iObserver.ServiceError( err );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::PreviousPhase
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::PreviousPhase
+        ( MPbk2ServicePhase& aPhase )
+    {
+    TInt err = KErrNone;
+
+    if ( &aPhase == iPrepareAssignPhase )
+        {
+        MVPbkContactLinkArray* resultLinks = aPhase.Results();
+        __ASSERT_DEBUG( resultLinks && resultLinks->Count() == 1,
+            Panic( EPanicLogicPhaseCompletion ) );
+
+        TRAP( err, LaunchSelectSinglePropertyPhaseL( resultLinks ) );
+        }
+
+    if ( err != KErrNone )
+        {
+        iObserver.ServiceError( err );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::PhaseCanceled
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::PhaseCanceled
+        ( MPbk2ServicePhase& /*aPhase*/ )
+    {
+    iObserver.ServiceCanceled();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::PhaseAborted
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::PhaseAborted
+        ( MPbk2ServicePhase& /*aPhase*/ )
+    {
+    iObserver.ServiceAborted();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::PhaseError
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::PhaseError
+        ( MPbk2ServicePhase& /*aPhase*/, TInt aErrorCode )
+    {
+    iObserver.ServiceError( aErrorCode );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::PhaseOkToExit
+// --------------------------------------------------------------------------
+//
+TBool CPbk2SingleContactDataAssigner::PhaseOkToExit
+        ( MPbk2ServicePhase& /*aPhase*/, TInt aCommandId )
+    {
+    // Deny exit and pass an asynchronous query to the consumer,
+    // which may later approve exit
+    iObserver.CompleteExitMessage( aCommandId );
+    return EFalse;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::PhaseAccept
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::PhaseAccept
+        ( MPbk2ServicePhase& /*aPhase*/, const TDesC8& /*aMarkedEntries*/,
+          const TDesC8& /*aLinkData*/ )
+    {
+    // Not supported in assign
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::ContactUiReadyL
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::ContactUiReadyL
+        ( MPbk2StartupMonitor& aStartupMonitor )
+    {
+    aStartupMonitor.DeregisterEvents( *this );
+ 
+   if ( iAssignFlags & ECreateNewContact )
+        {        
+        CVPbkContactStoreUriArray* validStores =
+            iStoreManager->CurrentlyValidStoresL();
+        CleanupStack::PushL( validStores );
+
+        CPbk2ServerAppAppUi& appUi = static_cast<CPbk2ServerAppAppUi&>
+            ( *CEikonEnv::Static()->EikAppUi() );
+
+        // Saving store URI
+        TVPbkContactStoreUriPtr savingStoreUri =
+            appUi.ApplicationServices().StoreConfiguration().
+                DefaultSavingStoreL();
+
+        TPbk2AssignNoteService noteService;
+        if ( validStores->IsIncluded ( savingStoreUri ) )
+            {
+            LaunchSelectCreateNewPropertyPhaseL( savingStoreUri );
+            }
+        else if ( noteService.ShowCreateNewToPhoneQueryL() )
+            {
+            savingStoreUri.Set( 
+                TVPbkContactStoreUriPtr( 
+                    VPbkContactStoreUris::DefaultCntDbUri() ) );
+            LaunchSelectCreateNewPropertyPhaseL( savingStoreUri );
+            }
+        else
+            {
+            // Canceled
+            iObserver.ServiceCanceled();
+            }
+
+        CleanupStack::PopAndDestroy( validStores );
+        }
+    else
+        {
+        if ( iPreselectedContact && iPreselectedContact->Count() == 1 )
+            {
+            if ( iStoreManager->ContactsAvailableL( *iPreselectedContact ) )
+                {
+                LaunchSelectSinglePropertyPhaseL( iPreselectedContact );
+                }
+            else
+                {
+                iObserver.ServiceError( KErrNotSupported );
+                }
+            }
+        else
+            {
+            LaunchFetchPhaseL();
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::StartupCanceled
+// --------------------------------------------------------------------------
+//
+void  CPbk2SingleContactDataAssigner::StartupCanceled( TInt aErrorCode )
+    {
+    if ( aErrorCode == KErrCancel )
+        {
+        iObserver.ServiceCanceled();
+        }
+    else
+        {
+        iObserver.ServiceError( aErrorCode );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::LaunchFetchPhaseL
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::LaunchFetchPhaseL()
+    {
+    CPbk2FetchDlg::TParams params;
+    params.iResId = R_PBK2_SINGLE_ENTRY_FETCH_DLG;
+    params.iFlags = CPbk2FetchDlg::EFetchSingle;
+
+    delete iFetchPhase;
+    iFetchPhase = NULL;
+    iFetchPhase = CPbk2ContactFetchPhase::NewL
+        ( *this, *iStoreManager, params, ETrue,
+          MPbk2FetchDlgObserver::EFetchYes, iContactViewFilter,
+          iUseDeviceConfig, iStoreUris );
+
+    CPbk2ServerAppAppUi& appUi = static_cast<CPbk2ServerAppAppUi&>
+        ( *CEikonEnv::Static()->EikAppUi() );
+
+    // Change layout to fetch's layout
+    appUi.ChangeStatuspaneLayoutL(
+        CPbk2ServerAppAppUi::EStatusPaneLayoutUsual );
+
+    iFetchPhase->LaunchServicePhaseL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::LaunchSelectSinglePropertyPhaseL
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::LaunchSelectSinglePropertyPhaseL
+        ( MVPbkContactLinkArray* aContactLinks )
+    {
+    delete iSelectPropertyPhase;
+    iSelectPropertyPhase = NULL;
+
+    // Prepare parameters by reseting them
+    delete iSelectFieldProperty;
+    iSelectFieldProperty = NULL;
+    iSelectFieldResult = KErrNotReady;
+
+    iSelectPropertyPhase = CPbk2SelectSinglePropertyPhase::NewL
+        ( *this, aContactLinks, iAddressSelectFilterBuffer,
+          iSelectFieldProperty, iSelectFieldResult );
+
+    iRelocationFlags = CPbk2ContactRelocator::EPbk2RelocatorExistingContact;
+
+    CPbk2ServerAppAppUi& appUi = static_cast<CPbk2ServerAppAppUi&>
+        ( *CEikonEnv::Static()->EikAppUi() );
+
+    // Change layout back to regular
+    appUi.ChangeStatuspaneLayoutL(
+        CPbk2ServerAppAppUi::EStatusPaneLayoutEmpty );
+
+    iSelectPropertyPhase->LaunchServicePhaseL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::LaunchSelectCreateNewPropertyPhaseL
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::LaunchSelectCreateNewPropertyPhaseL(
+        TVPbkContactStoreUriPtr  savingStoreUri )
+    {
+    delete iSelectPropertyPhase;
+    iSelectPropertyPhase = NULL;
+
+    // Prepare parameters by reseting them
+    delete iSelectFieldProperty;
+    iSelectFieldProperty = NULL;
+    iSelectFieldResult = KErrNotReady;
+
+    iSelectPropertyPhase = CPbk2SelectCreateNewPropertyPhase::NewL
+        ( savingStoreUri, *this, iAddressSelectFilterBuffer,  
+          iSelectFieldProperty, iSelectFieldResult, iInformationNoteFlags );
+
+    iRelocationFlags = CPbk2ContactRelocator::EPbk2RelocatorNewContact;
+
+    CPbk2ServerAppAppUi& appUi = static_cast<CPbk2ServerAppAppUi&>
+        ( *CEikonEnv::Static()->EikAppUi() );
+
+    // Change layout back to regular
+    appUi.ChangeStatuspaneLayoutL(
+        CPbk2ServerAppAppUi::EStatusPaneLayoutEmpty );
+
+    iSelectPropertyPhase->LaunchServicePhaseL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::LaunchPrepareSingleAssignPhaseL
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::LaunchPrepareSingleAssignPhaseL
+        ( MVPbkStoreContact* aStoreContact )
+    {
+    delete iPrepareAssignPhase;
+    iPrepareAssignPhase = NULL;
+
+    CleanupStack::PushL( aStoreContact );
+    iPrepareAssignPhase = CPbk2PrepareSingleAssignPhase::NewL
+        ( *this, aStoreContact, iSelectFieldProperty,
+          iSelectFieldResult, iFieldIndex, iInformationNoteFlags,
+          iRelocationFlags );
+    CleanupStack::Pop( aStoreContact );
+
+    iPrepareAssignPhase->LaunchServicePhaseL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SingleContactDataAssigner::LaunchAssignPhaseL
+// --------------------------------------------------------------------------
+//
+void CPbk2SingleContactDataAssigner::LaunchAssignPhaseL
+        ( MVPbkStoreContact* aStoreContact )
+    {
+    delete iAssignDataPhase;
+    iAssignDataPhase = NULL;
+
+    CleanupStack::PushL( aStoreContact );
+    iAssignDataPhase = CPbk2SingleAssignDataPhase::NewL
+        ( *this, aStoreContact, iSelectFieldProperty,
+          iFieldIndex, iDataBuffer, iMimeType,
+          iEditorHelpContext, iAssignFlags, iInformationNoteFlags );
+    CleanupStack::Pop( aStoreContact );
+
+    // In case of the assign phase it is important to delete the
+    // previous phases so that exit and cancel methods work correctly
+    delete iPrepareAssignPhase;
+    iPrepareAssignPhase = NULL;
+    delete iSelectPropertyPhase;
+    iSelectPropertyPhase = NULL;
+    delete iFetchPhase;
+    iFetchPhase = NULL;
+
+    iAssignDataPhase->LaunchServicePhaseL();
+    }
+
+// End of File