phonebookui/Phonebook2/UIServices/src/CPbk2ServerAppConnection.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIServices/src/CPbk2ServerAppConnection.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,387 @@
+/*
+* 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 UI Service server application connection.
+*
+*/
+
+
+#include "CPbk2ServerAppConnection.h"
+
+// Phonebook 2
+#include "MPbk2ConnectionObserver.h"
+#include "CPbk2ExitServiceMonitor.h"
+#include "CPbk2AcceptServiceMonitor.h"
+#include <Pbk2InternalUID.h>
+
+// System includes
+#include <coemain.h>
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::CPbk2ServerAppConnection
+// --------------------------------------------------------------------------
+//
+CPbk2ServerAppConnection::CPbk2ServerAppConnection
+        ( MPbk2ConnectionObserver& aObserver ) :
+            CActive( EPriorityStandard ),
+            iObserver( aObserver )
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::CPbk2ServerAppConnection()") );
+    CActiveScheduler::Add( this );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::~CPbk2ServerAppConnection
+// --------------------------------------------------------------------------
+//
+CPbk2ServerAppConnection::~CPbk2ServerAppConnection()
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::~CPbk2ServerAppConnection()") );
+    Cancel();
+    delete iArrayResults;
+    delete iFieldResults;
+    DisconnectMonitors();
+    DisconnectServerApplication();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2ServerAppConnection* CPbk2ServerAppConnection::NewL
+        ( MPbk2ConnectionObserver& aObserver )
+    {
+    CPbk2ServerAppConnection* self =
+        new ( ELeave ) CPbk2ServerAppConnection( aObserver );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::LaunchAssignL
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::LaunchAssignL
+        ( HBufC8* aConfigurationPackage, HBufC8* aDataPackage,
+          HBufC8* aAssignInstructions )
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::LaunchAssignL()") );
+    // Need to trap, because consumer freezes if ConnectL function leaves.
+    // Reason for the freeze is that connection stays open.
+    TRAPD( error, ConnectL() );
+    if ( error == KErrNone )
+        {
+        iPbk2AppService.LaunchAssignL(
+            iStatus,  aConfigurationPackage, aDataPackage,
+            aAssignInstructions, iCanceled );
+        SetActive();
+        }
+    else
+        {
+        DisconnectMonitors();
+        DisconnectServerApplication();
+        User::Leave( error );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::LaunchAttributeAssignL
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::LaunchAttributeAssignL
+    ( HBufC8* aConfigurationPackage,
+      TPbk2AttributeAssignData& aAttributePackage,
+      HBufC8* aAssignInstructions )
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::LaunchAttributeAssignL()") );
+    ConnectL();
+    iPbk2AppService.LaunchAttributeAssignL
+        ( iStatus,  aConfigurationPackage, aAttributePackage,
+          aAssignInstructions, iCanceled );
+    SetActive();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::LaunchAttributeUnassignL
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::LaunchAttributeUnassignL
+    ( HBufC8* aConfigurationPackage,
+      TPbk2AttributeAssignData aAttributePackage,
+      HBufC8* aAssignInstructions )
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::LaunchAttributeUnassignL()") );
+    ConnectL();
+    iPbk2AppService.LaunchAttributeUnassignL
+        ( iStatus,  aConfigurationPackage, aAttributePackage,
+          aAssignInstructions, iCanceled );
+    SetActive();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::CancelAssign
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::CancelAssign()
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::CancelAssign()") );
+    if ( iPbk2AppService.Handle() != KNullHandle )
+        {
+        iPbk2AppService.CancelAssign( iCanceled );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::LaunchFetchL
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::LaunchFetchL
+        ( HBufC8* aConfigurationPackage, HBufC8* aFetchInstructions )
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::LaunchFetchL()") );
+    //AIW Cancel command uses CancelFetch and leaves AO active,
+    //call here Cancel() to avoid using active AO (E32User-CBase 42)
+    Cancel();
+    // Need to trap, because consumer freezes if ConnectL function leaves.
+    // Reason for the freeze is that connection stays open.
+    TRAPD( error, ConnectL() );
+
+    if ( error == KErrNone )
+        {
+        iPbk2AppService.LaunchFetchL
+            ( iStatus, aConfigurationPackage,
+              aFetchInstructions, iCanceled );
+        SetActive();
+        }
+    else
+        {
+        DisconnectMonitors();
+        DisconnectServerApplication();
+        User::Leave( error );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::CancelFetch
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::CancelFetch()
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::CancelFetch()") );
+    if ( iPbk2AppService.Handle() != KNullHandle )
+        {
+        iPbk2AppService.CancelFetch( iCanceled );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::RunL
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::RunL()
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::RunL(%d)"), iStatus.Int() );
+    switch( iStatus.Int() )
+        {
+        case KErrNone:
+            {
+            GetResultsL();
+            iObserver.OperationCompleteL( *iArrayResults, iExtraResultData,
+                *iFieldResults );
+            DisconnectMonitors();
+            DisconnectServerApplication();
+            break;
+            }
+        case KErrCancel:            // FALLTHROUGH
+        case KErrServerTerminated:
+            {
+            iObserver.OperationCanceledL();
+            DisconnectMonitors();
+            DisconnectServerApplication();
+            break;
+            }
+        case KErrAbort:
+            {
+            // Abort is like completion with KErrCancel,
+            // expect that we leave the server application alive
+            // and wait for it to close itself down and send
+            // HandleServerAppExit notification
+            iObserver.OperationCanceledL();
+            DisconnectMonitors();
+            break;
+            }
+        default:
+            {
+            // Delegate to RunError
+            User::Leave( iStatus.Int() );
+            break;
+            }
+        };
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::RunError
+// --------------------------------------------------------------------------
+//
+TInt CPbk2ServerAppConnection::RunError( TInt aError )
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::RunError(%d)"), aError );
+    TRAPD( err,  iObserver.OperationErrorL( aError ) );
+    DisconnectMonitors();
+    DisconnectServerApplication();
+    return err;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::DoCancel
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::DoCancel()
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::DoCancel()") );
+    // Cancels outstanding notification monitors
+    if ( iExitServiceMonitor )
+        {
+        iExitServiceMonitor->Cancel();
+        }
+    if ( iAcceptServiceMonitor )
+        {
+        iAcceptServiceMonitor->Cancel();
+        }
+
+    // Cancels outstanding operations
+    CancelAssign();
+    CancelFetch();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::HandleServerAppExit
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::HandleServerAppExit( TInt aReason )
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+        "CPbk2ServerAppConnection::HandleServerAppExit(%d)"), aReason );
+    TBool okToExit = EFalse;
+
+    // Query the observer whether it is ok to exit application
+    // (the consumer process)
+    TRAPD( err,
+        okToExit = iObserver.OkToExitL( aReason, EPbk2ExitApplication ) );
+
+    if ( err != KErrNone )
+        {
+        CCoeEnv::Static()->HandleError( err );
+        }
+
+    if (okToExit)
+        {
+        MAknServerAppExitObserver::HandleServerAppExit( aReason );
+        }
+    else
+        {
+        DisconnectServerApplication();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::ConnectL
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::ConnectL()
+    {
+    if ( iPbk2AppService.Handle() == KNullHandle )
+        {
+        iPbk2AppService.ConnectChainedAppL
+            ( TUid::Uid( KPbk2ServerAppUID3 ) );
+
+        delete iExitAppServerMonitor;
+        iExitAppServerMonitor = NULL;
+        iExitAppServerMonitor = CApaServerAppExitMonitor::NewL
+            ( iPbk2AppService, *this, CActive::EPriorityStandard );
+
+        delete iExitServiceMonitor;
+        iExitServiceMonitor = NULL;
+        iExitServiceMonitor = CPbk2ExitServiceMonitor::NewL
+            ( iPbk2AppService, iObserver );
+
+        delete iAcceptServiceMonitor;
+        iAcceptServiceMonitor = NULL;
+        iAcceptServiceMonitor = CPbk2AcceptServiceMonitor::NewL
+            ( iPbk2AppService, iObserver );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::GetResultsL
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::GetResultsL()
+    {
+    // Important to delete old results
+    delete iArrayResults;
+    iArrayResults = NULL;
+    delete iFieldResults;
+    iFieldResults = NULL;
+
+    iExtraResultData = KErrNotSupported;
+
+    // First get the result size
+    TInt arraySize = 0;
+    TInt fieldSize = 0;
+    iPbk2AppService.GetResultSizeL( arraySize, fieldSize );
+    iArrayResults = HBufC8::NewL( arraySize );
+    iFieldResults = HBufC::NewL( fieldSize );
+
+    // Then get the results
+    iPbk2AppService.GetResultsL( *iArrayResults, iExtraResultData,
+        *iFieldResults );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::DisconnectMonitors
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::DisconnectMonitors()
+    {
+    delete iExitServiceMonitor;
+    iExitServiceMonitor = NULL;
+    delete iAcceptServiceMonitor;
+    iAcceptServiceMonitor = NULL;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ServerAppConnection::DisconnectServerApplication
+// --------------------------------------------------------------------------
+//
+void CPbk2ServerAppConnection::DisconnectServerApplication()
+    {
+    delete iExitAppServerMonitor;
+    iExitAppServerMonitor = NULL;
+    iPbk2AppService.Close();
+    }
+
+// End of File