diff -r 000000000000 -r 094583676ce7 wvuing/IMPSConnectionUI/ClientPluginSrc/CCnUiClientPluginPEC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/IMPSConnectionUI/ClientPluginSrc/CCnUiClientPluginPEC.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,492 @@ +/* +* 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: PEC client plugin. +* +*/ + +// INCLUDE FILES +#include + +#include "MIMPSSharedData.h" +#include "CIMPSSharedDataFactory.h" +#include "IMPSUIDDefs.h" + +//PEC attributes +#include +#include +#include +#include + +//PEC attribute lists +#include +#include +#include + +//PEC contact lists +#include +#include +#include + +// PEC +#include +#include + +#include +#include +#include + +#include +#include "CCnUiClientPluginPEC.h" +#include "IMPSPublishLevelPolicy.h" +#include "impspresenceconnectionuiconstsng.h" + + +// ================= MEMBER FUNCTIONS ======================= +// Two-phased constructor. +CCnUiClientPluginPEC* CCnUiClientPluginPEC::NewL( CPEngNWSessionSlotID2& aNWSessionSlotID ) + { + CCnUiClientPluginPEC* self = new ( ELeave ) CCnUiClientPluginPEC(); + + CleanupStack::PushL( self ); + self->ConstructL( aNWSessionSlotID ); + CleanupStack::Pop( self ); //self + + return self; + } + + +// Destructor +CCnUiClientPluginPEC::~CCnUiClientPluginPEC() + { + } + + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CCnUiClientPluginPEC::CCnUiClientPluginPEC() + : CCnUiClientPluginBase( EIMPSConnClientPEC ) + { + } + + +// Symbian OS default constructor can leave. +void CCnUiClientPluginPEC::ConstructL( CPEngNWSessionSlotID2& aNWSessionSlotID ) + { + CCnUiClientPluginBase::ConstructL( aNWSessionSlotID ); + } + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::CurrentConnectionModeSettingL() +// From MCnUiClientPlugin +// ----------------------------------------------------------------------------- +// +TCnUiConnectionMode CCnUiClientPluginPEC::CurrentConnectionModeSettingL() + { + // dummy implementation + TCnUiConnectionMode cMode( ECnUiCMAutomatic ); + return cMode; + } + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::ReWakeAutomaticConnectionModeL() +// From MCnUiClientPlugin +// ----------------------------------------------------------------------------- +// +void CCnUiClientPluginPEC::ReWakeAutomaticConnectionModeL() + { + // this is no longer needed + } + + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::ConnectionOpenInitL() +// From MCnUiClientPlugin - connection open related methods +// Overloaded from CCnUiClientPluginBase +// ----------------------------------------------------------------------------- +// +void CCnUiClientPluginPEC::ConnectionOpenInitL( TBool aSapConnectionOpen, + const CIMPSSAPSettings& aSap ) + { + //let first the base class to do its things like disable synchronization + //of unknown lists + CCnUiClientPluginBase::ConnectionOpenInitL( aSapConnectionOpen, aSap ); + + //if opening real NW connection, initialize the local + //attribute lists and attributes here as needed + //==>they will get synchronized with PEC engine login & synchronization + if ( !aSapConnectionOpen ) + { + IMPSPublishLevelPolicy::InitializePublishLevelL( *iNWSessionSlotID ); + } + } + + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::DoPostLoginProsessingL() +// From MCnUiClientPlugin - connection open related methods +// Overloaded from CCnUiClientPluginBase +// ----------------------------------------------------------------------------- +// +void CCnUiClientPluginPEC::DoPostLoginProsessingL( TRequestStatus& aStatus ) + { + + //do first the client specific things (enable profiles presence updates) + MIMPSSharedData* sharedData = CIMPSSharedDataFactory::CreatePermanentKeyHandlerL( + NULL, + KIMPSProfileEngineKeyUid ); + + //From SharedDataKeys.h + //1 == allowed to update Presence attributes + //ignore possible settings errors, all this is done with best effort way... + sharedData->SetIntKey( EIMPSSharedKeysProEngAllowUpdatePresence, 1 ); + + delete sharedData; + + //and the let the base class take the charge... + //NOTE!! Order must be this becase the base might start something + //asynhronous & and after that leaving isn't allowd... + + CCnUiClientPluginBase::DoPostLoginProsessingL( aStatus ); + } + + + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::DoPreLogoutProsessingL() +// From MCnUiClientPlugin - connection close related methods +// Overloaded from CCnUiClientPluginBase +// ----------------------------------------------------------------------------- +// +void CCnUiClientPluginPEC::DoPreLogoutProsessingL( TRequestStatus& aStatus ) + { + + //do first the client specific things (disable profiles presence updates) + MIMPSSharedData* sharedData = CIMPSSharedDataFactory::CreatePermanentKeyHandlerL( + NULL, + KIMPSProfileEngineKeyUid ); + + //From SharedDataKeys.h + //0 == not allowed to update Presence attributes, default + //ignore possible settings errors, all this is done with best effort way... + sharedData->SetIntKey( EIMPSSharedKeysProEngAllowUpdatePresence, 0 ); + + delete sharedData; + + //and the let the base class take the charge... + //NOTE!! Order must be this becase the base might start something + //asynhronous & and after that leaving isn't allowd... + CCnUiClientPluginBase::DoPreLogoutProsessingL( aStatus ); + } + + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::DoVerifySapCapabilities() +// From CCnUiClientPluginBase +// ----------------------------------------------------------------------------- +// +TBool CCnUiClientPluginPEC::DoVerifySapCapabilities( TPEngWVCspServicesTree2 aCurrentNwServices ) + { + // For PEC WV server must support all of these main features + // Logical and is used + //==> if any of these is EFalse, result will be EFalse + + TBool capabOK = aCurrentNwServices.iFundamentalFeat.FeatureSupported(); + capabOK &= aCurrentNwServices.iFundamentalFeat.SubFunctionSupported( KPEngFFSubFuncSRCH ); + capabOK &= aCurrentNwServices.iFundamentalFeat.SubFunctionSupported( KPEngFFSubFuncSTSRC ); + + capabOK &= aCurrentNwServices.iPresenceFeat.FeatureSupported(); + capabOK &= aCurrentNwServices.iPresenceFeat.SubFunctionSupported( KPEngWVSubFuncGCLI ); + capabOK &= aCurrentNwServices.iPresenceFeat.SubFunctionSupported( KPEngWVSubFuncCCLI ); + capabOK &= aCurrentNwServices.iPresenceFeat.SubFunctionSupported( KPEngWVSubFuncDCLI ); + capabOK &= aCurrentNwServices.iPresenceFeat.SubFunctionSupported( KPEngWVSubFuncMCLS ); + + capabOK &= aCurrentNwServices.iPresenceFeat.SubFunctionSupported( KPEngWVSubFuncGETWL ); + capabOK &= aCurrentNwServices.iPresenceFeat.SubFunctionSupported( KPEngWVSubFuncGETPR ); + capabOK &= aCurrentNwServices.iPresenceFeat.SubFunctionSupported( KPEngWVSubFuncUPDPR ); + + capabOK &= aCurrentNwServices.iPresenceFeat.SubFunctionSupported( KPEngWVSubFuncCALI ); + capabOK &= aCurrentNwServices.iPresenceFeat.SubFunctionSupported( KPEngWVSubFuncDALI ); + capabOK &= aCurrentNwServices.iPresenceFeat.SubFunctionSupported( KPEngWVSubFuncGALS ); + + + + return capabOK; + } + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::DoClientKnownCntListsLC() +// Template method from CCnUiClientPluginBase +// ----------------------------------------------------------------------------- +// +CDesCArray* CCnUiClientPluginPEC::DoClientKnownCntListsLC() + { + CDesCArrayFlat* lists = new ( ELeave ) CDesCArrayFlat( 4 ); //4 known lists + CleanupStack::PushL( lists ); + + //enumerate here those lists that are used by PEC & needs to be + //synchronized when PEC is doing login + + CPEngContactListStore2* contactListStore = CPEngContactListStore2::NewLC( *iNWSessionSlotID ); + + const MDesCArray& array = contactListStore->AllContactListsL(); + + for ( TInt i = 1; i < array.MdcaCount(); i++ ) + { + TPtrC list = array.MdcaPoint( i ); + if ( list.FindF( KIMPSPECContactListIdentifier() ) != KErrNotFound ) + { + // this seems to be PECUi's list + lists->AppendL( list ); + } + } + CleanupStack::PopAndDestroy( contactListStore ); + + return lists; + } + + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::DoStartExplicitPostLoginSyncL() +// From CCnUiClientPluginBase +// ----------------------------------------------------------------------------- +// +void CCnUiClientPluginPEC::DoStartExplicitPostLoginSyncL() + { + // first do the base synchronization + User::LeaveIfError( iPEngCntListPublisher->BaseSynchronizeContactLists( *this ) ); + SetStepProcessingActive(); + iStepId = EBaseCntListSynch; + } + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::DoHandleExplicitPostLoginSyncStepCompleteL() +// From CCnUiClientPluginBase +// ----------------------------------------------------------------------------- +// +void CCnUiClientPluginPEC::DoHandleExplicitPostLoginSyncStepCompleteL( TStepId aStepId, + TInt& aStepStatus ) + { + switch ( aStepId ) + { + case EBaseCntListSynch: + { + if ( aStepStatus == KErrNone ) + { + //initialize the local attribute lists as needed + IMPSPublishLevelPolicy::InitializePublishLevelL( *iNWSessionSlotID ); + + //and synchronize known PEC list explicitly with network server + MDesCArray* knownLists = DoClientKnownCntListsLC(); + User::LeaveIfError( iPEngCntListPublisher->SynchronizeContactLists( + *knownLists, + *this ) ); + CleanupStack::PopAndDestroy(); //knownLists + SetStepProcessingActive(); + iStepId = ECntListPublish; + } + break; + } + + case ECntListPublish: + { + if ( ( aStepStatus == KErrNone ) || + ( aStepStatus == KPEngNwErrPartiallySuccessful ) ) + { + //Contact lists are now successfully synchronized + aStepStatus = KErrNone; + + User::LeaveIfError( iPEngAttributeListPublisher->PublishAttributeLists( *this ) ); + SetStepProcessingActive(); + iStepId = EAttribListPublish; + } + break; + } + + case EAttribListPublish: + { + if ( ( aStepStatus == KErrNone ) || + ( aStepStatus == KPEngNwErrPartiallySuccessful ) ) + { + //Attribute lists are now successfully synchronized + + + aStepStatus = KErrNone; + UpdateAttributesL(); + SetStepProcessingActive(); + iStepId = EAttributePublish; + } + break; + } + + + case EAttributePublish: + { + //ignore possibly from attribute publish propagating errors + aStepStatus = KErrNone; + break; + } + + + default: + { + //nothing to do + break; + } + } + } + + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::DoStartPreLogoutPublishL() +// From CCnUiClientPluginBase +// ----------------------------------------------------------------------------- +// +void CCnUiClientPluginPEC::DoStartPreLogoutPublishL() + { + } + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::DoHandlePreLogoutPublishStepCompleteL() +// From CCnUiClientPluginBase +// ----------------------------------------------------------------------------- +// +void CCnUiClientPluginPEC::DoHandlePreLogoutPublishStepCompleteL( TStepId /*aStepId*/, + TInt& /*aStepStatus*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::DoHandlePreLogoutPublishStepCompleteL() +// +// ----------------------------------------------------------------------------- +// +void CCnUiClientPluginPEC::UpdateAttributesL() + { + RPointerArray models; + CleanupStack::PushL( TCleanupItem( DestroyCloseModelArray, &models ) ); + + MPEngPresenceAttrModel2* userAvail = NULL; + TInt err = iPEngAttributeStore->GetAndLockOwnAttribute( KUidPrAttrUserAvailability, + userAvail ); + + // if the model was locked, the pointer is still null, but we want to continue with + // the other attributes + if ( ( err != KErrNone ) && ( err != KErrLocked ) ) + { + User::Leave( err ); + } + else + { + CleanupClosePushL( *userAvail ); + models.AppendL( userAvail ); + CleanupStack::Pop(); // userAvail + } + + MPEngPresenceAttrModel2* onlineStatus = NULL; + err = iPEngAttributeStore->GetAndLockOwnAttribute( KUidPrAttrOnlineStatus, onlineStatus ); + + // if the model was locked, the pointer is still null, but we want to continue with + // the other attributes + if ( ( err != KErrNone ) && ( err != KErrLocked ) ) + { + User::Leave( err ); + } + else + { + CleanupClosePushL( *onlineStatus ); + onlineStatus->SetQualifier( ETrue ); + models.AppendL( onlineStatus ); + CleanupStack::Pop(); // onlineStatus + } + + MPEngPresenceAttrModel2* clientInfo = NULL; + err = iPEngAttributeStore->GetAndLockOwnAttribute( KUidPrAttrClientInfo, clientInfo ); + + // if the model was locked, the pointer is still null, but we want to continue with + // the other attributes + if ( ( err != KErrNone ) && ( err != KErrLocked ) ) + { + User::Leave( err ); + } + else + { + CleanupClosePushL( *clientInfo ); + models.AppendL( clientInfo ); + CleanupStack::Pop(); // clientInfo + } + + MPEngPresenceAttrModel2* statusText = NULL; + err = iPEngAttributeStore->GetAndLockOwnAttribute( KUidPrAttrStatusText, statusText ); + + // if the model was locked, the pointer is still null, but we want to continue with + // the other attributes + if ( ( err != KErrNone ) && ( err != KErrLocked ) ) + { + User::Leave( err ); + } + else + { + CleanupClosePushL( *statusText ); + models.AppendL( statusText ); + CleanupStack::Pop(); // statusText + } + + MPEngPresenceAttrModel2* statusContent = NULL; + err = iPEngAttributeStore->GetAndLockOwnAttribute( KUidPrAttrStatusContent, statusContent ); + + // if the model was locked, the pointer is still null, but we want to continue with + // the other attributes + if ( ( err != KErrNone ) && ( err != KErrLocked ) ) + { + User::Leave( err ); + } + else + { + CleanupClosePushL( *statusContent ); + models.AppendL( statusContent ); + CleanupStack::Pop(); // statusContent + } + + User::LeaveIfError( iPEngAttributePublisher->PublishAndUnLockOwnAttributes( models, *this ) ); + CleanupStack::Pop(); // models + } + + +// ----------------------------------------------------------------------------- +// CCnUiClientPluginPEC::DestroyCloseModelArray() +// +// ----------------------------------------------------------------------------- +// +void CCnUiClientPluginPEC::DestroyCloseModelArray( TAny* aObject ) + { + reinterpret_cast*>( aObject )->ResetAndDestroy(); + } + +// End of File + + + +