--- /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
+