diff -r 000000000000 -r 094583676ce7 wvuing/IMPSConnectionUI/ClientPluginSrc/CCnUiClientPluginBase.cpp --- /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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 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 +