wvuing/IMPSConnectionUI/ClientPluginSrc/CCnUiClientPluginBase.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/IMPSConnectionUI/ClientPluginSrc/CCnUiClientPluginBase.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,468 @@
+/*
+* Copyright (c) 2004 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:  Shared basic implementation for client plug-ins.
+*
+*/
+
+// INCLUDE FILES
+#include <E32std.h>
+
+#include <CPEngAttributeStore2.h>
+#include <CPEngAttributeTransaction2.h>
+#include <CPEngAttributeListStore2.h>
+#include <CPEngAttributeListTransaction2.h>
+#include <CPEngContactListStore2.h>
+#include <CPEngContactListTransaction2.h>
+#include <CPEngNWSessionSlotID2.h>
+#include <CPEngNWSessionSlot2.h>
+#include <PEngPresenceEngineConsts2.h>
+#include <MPEngTransactionStatus2.h>
+#include <PEngWVPresenceErrors2.h>
+#include <PEngWVServices2.h>
+
+#include "CCnUiClientPluginBase.h"
+#include "IMPSPublishLevelPolicy.h"
+#include "impscommonuibuilddefinitions.h"
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// Destructor
+CCnUiClientPluginBase::~CCnUiClientPluginBase()
+    {
+    CancelAllProcessingAndCompleteIfNeeded();
+
+    delete iPEngAttributeStore;
+    delete iPEngAttributeListStore;
+
+    delete iPEngAttributePublisher;
+    delete iPEngAttributeListPublisher;
+
+    delete iPEngCntListStore;
+    delete iPEngCntListPublisher;
+
+    delete iNWSessionSlotID;
+    }
+
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CCnUiClientPluginBase::CCnUiClientPluginBase( TIMPSConnectionClient aClientID )
+        : iClientID( aClientID ),
+        iExplicitSyncNeeded( EFalse ),
+        iStepProcessingActive( EFalse )
+    {
+    }
+
+
+// Symbian OS default constructor can leave.
+void CCnUiClientPluginBase::ConstructL( CPEngNWSessionSlotID2& aNWSessionSlotID )
+    {
+
+    // Create contact-list store & publisher
+    iPEngCntListStore = CPEngContactListStore2::NewL( aNWSessionSlotID );
+    iPEngCntListPublisher = CPEngContactListTransaction2::NewL( aNWSessionSlotID );
+
+    // Create attribute-list store & publisher
+    iPEngAttributeListStore = CPEngAttributeListStore2::NewL( aNWSessionSlotID );
+    iPEngAttributeListPublisher = CPEngAttributeListTransaction2::NewL( aNWSessionSlotID );
+
+    // Create attribute store & publisher
+    iPEngAttributeStore = CPEngAttributeStore2::NewL( aNWSessionSlotID );
+    iPEngAttributePublisher = CPEngAttributeTransaction2::NewL( aNWSessionSlotID );
+
+    iNWSessionSlotID = aNWSessionSlotID.CloneL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::ClientID()
+// From MCnUiClientPlugin API
+// -----------------------------------------------------------------------------
+//
+TIMPSConnectionClient CCnUiClientPluginBase::ClientID()
+    {
+    return iClientID;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::ReleaseDynamicResources()
+// From MCnUiClientPlugin API
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::ReleaseDynamicResources()
+    {
+    //Cancel first possibly running processing stuffs
+    CancelAllPEngPublishers();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::ConnectionOpenInitL()
+// From MCnUiClientPlugin API
+// Connection open
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::ConnectionOpenInitL( TBool /*aSapConnectionOpen*/,
+                                                 const CIMPSSAPSettings& /*aSap*/ )
+    {
+    iExplicitSyncNeeded = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::VerifySapCapabilitiesL()
+// From MCnUiClientPlugin API
+// Connection open
+// -----------------------------------------------------------------------------
+//
+TBool CCnUiClientPluginBase::VerifySapCapabilitiesL()
+    {
+    CPEngNWSessionSlot2* slot = CPEngNWSessionSlot2::NewLC( *iNWSessionSlotID );
+    TPEngWVCspServicesTree2 cspTree;
+    TPckg<TPEngWVCspServicesTree2> cspTreePtr( cspTree );
+    User::LeaveIfError( slot->GetOption( KPEngWVCspServicesTree2,
+                                         KPEngNWSessionSlotTransportQuery,
+                                         cspTreePtr ) );
+
+    CleanupStack::PopAndDestroy( slot );
+    //let the real client to do the verification
+    return DoVerifySapCapabilities( cspTree );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::DoPostLoginProsessingL()
+// From MCnUiClientPlugin API
+// Connection open
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::DoPostLoginProsessingL( TRequestStatus& aStatus )
+    {
+    if ( iExplicitSyncNeeded )
+        {
+        //let the real client to start the processing if needed
+        DoStartExplicitPostLoginSyncL();
+        if ( iStepProcessingActive )
+            {
+            //processing started
+            iRequest = &aStatus;
+            *iRequest = KRequestPending;
+            iStepProcessType = EExplicitPostLoginSync;
+            }
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::CancelPostLoginProsessing()
+// From MCnUiClientPlugin API
+// Connection open
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::CancelPostLoginProsessing()
+    {
+    CancelAllProcessingAndCompleteIfNeeded();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::ConnectionCloseInitL()
+// From MCnUiClientPlugin API
+// Connection close
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::ConnectionCloseInitL( const CIMPSSAPSettings& /*aSap*/ )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::DoPreLogoutProsessingL()
+// From MCnUiClientPlugin API
+// Connection close
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::DoPreLogoutProsessingL( TRequestStatus& aStatus )
+    {
+    //let the real client to start the processing if needed
+    DoStartPreLogoutPublishL();
+    if ( iStepProcessingActive )
+        {
+        //processing started
+        iRequest = &aStatus;
+        *iRequest = KRequestPending;
+        iStepProcessType = EPreLogoutPublish;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::CancelPreLogoutProsessing()
+// From MCnUiClientPlugin API
+// Connection close
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::CancelPreLogoutProsessing()
+    {
+    CancelAllProcessingAndCompleteIfNeeded();
+    }
+
+
+
+
+// -----------------------------------------------------------------------------
+//
+// Callback methods for PENG publishers
+//
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::HandleContactListTransactionError()
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::HandleContactListTransactionError(
+    TInt aError,
+    CPEngContactListTransaction2& /*aAttributeTransaction*/,
+    TInt aTransactionOperation )
+    {
+    if ( aTransactionOperation == EPEngTransOpCntListBaseSync )
+        {
+        HandleStepComplete( EBaseCntListSynch, aError );
+        }
+    else
+        {
+        HandleStepComplete( ECntListPublish, aError );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::HandleContactListTransactionCompleteL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::HandleContactListTransactionCompleteL(
+    MPEngTransactionStatus2& aStatus ,
+    CPEngContactListTransaction2& /* aContactListTransaction */,
+    TInt aTransactionOperation )
+    {
+    TInt error( aStatus.Status() );
+    if ( error == KPEngNwErrPartiallySuccessful )
+        {
+        // ignore partial successfull
+        error = KErrNone;
+        }
+    User::LeaveIfError( error );
+    if ( aTransactionOperation == EPEngTransOpCntListBaseSync )
+        {
+        HandleStepComplete( EBaseCntListSynch, KErrNone );
+        }
+    else
+        {
+        HandleStepComplete( ECntListPublish, KErrNone );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::HandleAttributeListTransactionError()
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::HandleAttributeListTransactionError(
+    TInt aError,
+    CPEngAttributeListTransaction2& /* aAttributeTransaction */,
+    TInt /* aTransactionOperation */ )
+    {
+    HandleStepComplete( EAttribListPublish, aError );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::HandleAttributeListTransactionCompleteL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::HandleAttributeListTransactionCompleteL(
+    MPEngTransactionStatus2& aStatus,
+    CPEngAttributeListTransaction2& /* aAttributeListTransaction */,
+    TInt /* aTransactionOperation */ )
+    {
+    TInt error( aStatus.Status() );
+    if ( error == KPEngNwErrPartiallySuccessful )
+        {
+        // ignore partial successfull
+        error = KErrNone;
+        }
+    User::LeaveIfError( error );
+    HandleStepComplete( EAttribListPublish, KErrNone );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::HandleAttributeTransactionError()
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::HandleAttributeTransactionError(
+    TInt aError,
+    CPEngAttributeTransaction2& /* aAttributeTransaction */,
+    TInt /* aTransactionOperation */ )
+    {
+    HandleStepComplete( EAttributePublish, aError );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::HandleAttributeTransactionCompleteL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::HandleAttributeTransactionCompleteL(
+    MPEngTransactionStatus2& aStatus ,
+    CPEngAttributeTransaction2& /* aAttributeTransaction */,
+    TInt /* aTransactionOperation */ )
+    {
+    TInt error( aStatus.Status() );
+    if ( error == KPEngNwErrPartiallySuccessful )
+        {
+        // ignore partial successfull
+        error = KErrNone;
+        }
+    User::LeaveIfError( error );
+    HandleStepComplete( EAttributePublish, KErrNone );
+    }
+
+
+
+// -----------------------------------------------------------------------------
+//
+// Local helpers
+//
+// -----------------------------------------------------------------------------
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::SetActive()
+// Signalling method for derived clients
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::SetStepProcessingActive()
+    {
+    iStepProcessingActive = ETrue;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::HandleStepComplete()
+// Private helper
+// Handles the step completion and lets the client continue processing if needed
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::HandleStepComplete( TStepId aStepId, TInt aStepStatus )
+    {
+    if ( !iStepProcessingActive )
+        {
+        //Error coming from some publisher cancel, e.g.
+        //explicit cancel round running
+        //==> nothing to do (direct return protects agains cancel nesting.)
+        return;
+        }
+
+
+    //not active anymore
+    iStepProcessingActive = EFalse;
+
+    //let the derived class to handle the step completion
+    TInt err = KErrNone;
+    if ( iStepProcessType == EExplicitPostLoginSync )
+        {
+        TRAP( err, DoHandleExplicitPostLoginSyncStepCompleteL( aStepId,  aStepStatus ) );
+        }
+
+    else
+        {
+        //EPreLogoutPublish
+        TRAP( err, DoHandlePreLogoutPublishStepCompleteL( aStepId, aStepStatus ) );
+        }
+
+    if ( err != KErrNone )
+        {
+        //if starting failed, complete away with catched error..
+        iStepProcessingActive = EFalse;
+        aStepStatus = err;
+        }
+
+
+    if ( !iStepProcessingActive )
+        {
+        //No active processing anymore
+
+        //cancel still possibly existing processing
+        CancelAllPEngPublishers();
+
+        //and complete the original request
+        User::RequestComplete( iRequest, aStepStatus );
+        }
+    }
+
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::CancelAllProcessingAndCompleteIfNeeded()
+//
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::CancelAllProcessingAndCompleteIfNeeded()
+    {
+    //not definitely active anymore
+    iStepProcessingActive = EFalse;
+
+    //cancel all sub precessing parts
+    CancelAllPEngPublishers();
+
+    //and complete the original request if still having one
+    if ( iRequest )
+        {
+        User::RequestComplete( iRequest, KErrCancel );
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::CancelAllPEngPublishers()
+// Private helper
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::CancelAllPEngPublishers()
+    {
+    // nothing done here at the moment
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiClientPluginBase::LoginCancelledL()
+// Private helper
+// -----------------------------------------------------------------------------
+//
+void CCnUiClientPluginBase::LoginCancelledL()
+    {
+    // empty implementation
+    }
+
+
+//  End of File
+