phonebookui/Phonebook2/ServerApplication/src/CPbk2AssignService.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2AssignService.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,405 @@
+/*
+* 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 application server assign service.
+*
+*/
+
+
+#include "CPbk2AssignService.h"
+
+// Phonebook 2
+#include "CPbk2SingleContactDataAssigner.h"
+#include "CPbk2MultiContactDataAssigner.h"
+#include "CPbk2ContactAttributeAssigner.h"
+#include "TPbk2ServerMessageDataRetriever.h"
+#include "CPbk2ServerAppAppUi.h"
+#include <MPbk2ApplicationServices.h>
+
+// Virtual Phonebook
+#include <MVPbkContactLinkArray.h>
+
+// System includes
+#include <AiwContactAssignDataTypes.h>
+
+using namespace AiwContactAssign;
+
+
+/// Unnamed namespace for local definitions
+namespace {
+
+_LIT(KPanicText, "CPbk2AssignService");
+
+enum TPanicCode
+    {
+    EInvalidRequest,
+    EInvalidAssignType
+    };
+
+// RMessage IPC-argument slot order
+const TInt KResponseSlot = 0;
+const TInt KPackedResultsSlot = 0;
+const TInt KExtraResultsSlot = 1;
+const TInt KResultSizeSlot = 0;
+const TInt KAssignInstructionsSlot = 2;
+
+const TInt KExitAcceptedSlot = 0;           // ok to exit protocol
+const TInt KExitCommandIdSlot = 1;          // ok to exit protocol
+const TInt KCompleteExitCommandIdSlot = 0;  // ok to exit protocol
+
+
+// Assign types
+enum TAssignType
+    {
+    EInvalidType,
+    ESingleContactDataAssign,
+    EMultipleContactDataAssign,
+    EContactAttributeAssign,
+    };
+
+/**
+ * Retrieves assign type from given message.
+ *
+ * @param aMessage  Message.
+ * @return  Assign type.
+ */
+TAssignType AssignTypeL( const RMessage2& aMessage )
+    {
+    TAssignType result = EInvalidType;
+
+    TAiwContactAssignDataBasePckg dataPckg;
+    aMessage.ReadL( KAssignInstructionsSlot, dataPckg );
+
+    switch ( TAiwContactAssignDataBase::AssignDataTypeFromBuffer
+            ( dataPckg ) )
+        {
+        case EAiwSingleContactAssignV1:
+            {
+            result = ESingleContactDataAssign;
+
+            // Perform additional check for multiple preselected contacts
+            TPbk2ServerMessageDataRetriever dataRetriever;
+            CPbk2ServerAppAppUi& appUi = static_cast<CPbk2ServerAppAppUi&>
+                ( *CEikonEnv::Static()->EikAppUi() );
+            MVPbkContactLinkArray* preselectedContacts =
+                dataRetriever.GetPreselectedContactLinksL
+                    ( aMessage,
+                      appUi.ApplicationServices().ContactManager() );
+            if ( preselectedContacts && preselectedContacts->Count() > 1 )
+                {
+                // Multiple preselected contacts found, switch to
+                // multi assign mode
+                result = EMultipleContactDataAssign;
+                }
+            delete preselectedContacts;
+            break;
+            }
+        case EAiwMultipleContactAssignV1:
+            {
+            result = EMultipleContactDataAssign;
+            break;
+            }
+        case EAiwContactAttributeAssignV1:
+            {
+            result = EContactAttributeAssign;
+            break;
+            }
+        default:
+            {
+            aMessage.Panic( KPanicText, EInvalidAssignType );
+            break;
+            }
+        }
+    return result;
+    }
+
+} /// namespace
+
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::CPbk2AssignService
+// --------------------------------------------------------------------------
+//
+CPbk2AssignService::CPbk2AssignService( const RMessage2& aExitMsg ) :
+        iExitMsg( aExitMsg )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::~CPbk2AssignService
+// --------------------------------------------------------------------------
+//
+CPbk2AssignService::~CPbk2AssignService()
+    {
+    if ( !iAssignCompleteMsg.IsNull() )
+        {
+        iAssignCompleteMsg.Complete( KErrServerTerminated );
+        }
+
+    delete iUiService;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2AssignService* CPbk2AssignService::NewL( const RMessage2& aExitMsg )
+    {
+    CPbk2AssignService* self =
+        new ( ELeave ) CPbk2AssignService( aExitMsg );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::LaunchServiceL
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::LaunchServiceL( const RMessage2& aMessage )
+    {
+    if ( ( iAssignCompleteMsg.Handle() != KNullHandle ) &&
+         ( iExitMsg.Handle() == KNullHandle ) )
+        {
+        aMessage.Panic( KPanicText, EInvalidRequest );
+        }
+
+    delete iUiService;
+    iUiService = NULL;
+
+    switch ( AssignTypeL( aMessage ) )
+        {
+        case ESingleContactDataAssign:
+            {
+            iUiService = CPbk2SingleContactDataAssigner::NewL
+                ( aMessage, *this );
+            break;
+            }
+        case EMultipleContactDataAssign:
+            {
+            iUiService = CPbk2MultiContactDataAssigner::NewL
+                ( aMessage, *this );
+            break;
+            }
+        case EContactAttributeAssign:
+            {
+            iUiService = CPbk2ContactAttributeAssigner::NewL
+                ( aMessage, *this );
+            break;
+            }
+        default:
+            {
+            aMessage.Panic( KPanicText, EInvalidRequest );
+            break;
+            }
+        }
+
+    iAssignCompleteMsg = aMessage;
+    iUiService->LaunchServiceL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::CancelService
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::CancelService( const RMessage2& aMessage )
+    {
+    // If iAssignCompleteMsg is already completed do nothing
+    if ( !iAssignCompleteMsg.IsNull() )
+        {
+        iUiService->CancelService();
+        }
+
+    aMessage.Complete( KErrNone );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::GetResultsL
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::GetResultsL( const RMessage2& aMessage )
+    {
+    if ( iUiService )
+        {
+        MPbk2UiService::TServiceResults results;
+        iUiService->ServiceResults(&results);
+        if ( results.iLinkArray )
+            {
+            HBufC8* packedResults = results.iLinkArray->PackLC();
+            TPckg<TInt> extraData(results.iExtraData);
+            TRAP_IGNORE(
+                aMessage.WriteL(KPackedResultsSlot, *packedResults );
+                aMessage.WriteL(KExtraResultsSlot, extraData );
+            );
+            CleanupStack::PopAndDestroy(); // packedResults
+            }
+        }
+    aMessage.Complete( KErrNone );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::GetResultSizeL
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::GetResultSizeL( const RMessage2& aMessage )
+    {
+    if ( iUiService )
+        {
+        MPbk2UiService::TServiceResults results;
+        iUiService->ServiceResults(&results);
+        if ( results.iLinkArray )
+            {
+            HBufC8* packedResults = results.iLinkArray->PackLC();
+            TPtr8 ptr = packedResults->Des();
+            TPckg<TInt> buffer( ptr.Size() );
+            TRAP_IGNORE( aMessage.WriteL(
+                KResultSizeSlot, buffer ) );
+            CleanupStack::PopAndDestroy(); // packedResults
+            }
+        }
+    aMessage.Complete( KErrNone );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::TryExitServiceL
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::TryExitServiceL( const RMessage2& aMessage )
+    {
+    TBool accepted = EFalse;
+    TPckg<TBool> acceptedPkg( accepted );
+    aMessage.ReadL( KExitAcceptedSlot, acceptedPkg );
+
+    if ( iUiService && accepted )
+        {
+        TInt exitId = KErrNotFound;
+        TPckg<TInt> exitPkg( exitId );
+        aMessage.ReadL( KExitCommandIdSlot, exitPkg );
+
+        iUiService->ExitServiceL( exitId );
+        }
+
+    aMessage.Complete( KErrNone );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::TryAcceptServiceL
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::TryAcceptServiceL( const RMessage2& aMessage )
+    {
+    // Accept protocol not supported in assign
+    aMessage.Complete( KErrNotSupported );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::ServiceComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::ServiceComplete()
+    {
+    if ( !iAssignCompleteMsg.IsNull() )
+        {
+        TPckg<TBool> complete( EFalse );
+        TRAP_IGNORE( iAssignCompleteMsg.WriteL( KResponseSlot, complete ) );
+        iAssignCompleteMsg.Complete( KErrNone );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::ServiceCanceled
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::ServiceCanceled()
+    {
+    if ( !iAssignCompleteMsg.IsNull() )
+        {
+        TPckg<TBool> cancel( ETrue );
+        TRAP_IGNORE( iAssignCompleteMsg.WriteL( KResponseSlot, cancel ) );
+        iAssignCompleteMsg.Complete( KErrCancel );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::ServiceAborted
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::ServiceAborted()
+    {
+    if ( !iAssignCompleteMsg.IsNull() )
+        {
+        iAssignCompleteMsg.Complete( KErrAbort );
+
+        // There is nothing to do if ProcessCommandL leaves.
+        // Of course it shouldn't leave in practice because it's
+        // exit command.
+        TRAP_IGNORE( ExitApplicationL() );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::ServiceError
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::ServiceError( TInt aErrorCode )
+    {
+    if ( !iAssignCompleteMsg.IsNull() )
+        {
+        TPckg<TInt> error( aErrorCode );
+        TRAP_IGNORE( iAssignCompleteMsg.WriteL( KResponseSlot, error ) );
+        iAssignCompleteMsg.Complete( aErrorCode );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::CompleteExitMessage
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::CompleteExitMessage( TInt aExitCommandId )
+    {
+    TPckg<TInt> exitCommandId( aExitCommandId );
+    if ( iUiService && iExitMsg.Handle() != KNullHandle )
+        {
+        TRAP_IGNORE( iExitMsg.WriteL(
+            KCompleteExitCommandIdSlot, exitCommandId ) );
+        iExitMsg.Complete( KErrNone );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::CompleteAcceptMsg
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::CompleteAcceptMsg
+        ( const TDesC8& /*aMarkedEntries*/, const TDesC8& /*aLinkData*/ )
+    {
+    // Not supported in assign
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AssignService::ExitApplicationL
+// --------------------------------------------------------------------------
+//
+void CPbk2AssignService::ExitApplicationL()
+    {
+    // Exit application
+    CEikonEnv* eikonEnv = CEikonEnv::Static();
+    if ( eikonEnv )
+        {
+        CEikAppUi* appUi = eikonEnv->EikAppUi();
+        MEikCommandObserver* cmdObs =
+            static_cast<MEikCommandObserver*>( appUi );
+
+        cmdObs->ProcessCommandL( EAknCmdExit );
+        }
+    }
+
+// End of File