wvuing/IMPSConnectionUI/ClientPluginSrc/CCnUiClientPluginPEC.cpp
changeset 0 094583676ce7
--- /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 <E32std.h>
+
+#include "MIMPSSharedData.h"
+#include "CIMPSSharedDataFactory.h"
+#include "IMPSUIDDefs.h"
+
+//PEC attributes
+#include <CPEngAttributeTransaction2.h>
+#include <CPEngAttributeStore2.h>
+#include <MPEngPresenceAttrModel2.h>
+#include <MPEngPresenceAttrTypeProperties2.h>
+
+//PEC attribute lists
+#include <CPEngAttributeListStore2.h>
+#include <CPEngAttributeListTransaction2.h>
+#include <MPEngAttributeList2.h>
+
+//PEC contact lists
+#include <CPEngContactListStore2.h>
+#include <CPEngContactListTransaction2.h>
+#include <MPEngContactList2.h>
+
+// PEC
+#include <CPEngNWSessionSlotID2.h>
+#include <PEngWVServices2.h>
+
+#include <ImpsServices.h>
+#include <PEngWVPresenceErrors2.h>
+#include <PEngWVPresenceAttributes2.h>
+
+#include <WVSettingsSharedDataNG.h>
+#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<MPEngPresenceAttrModel2> 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<RPointerArray<MPEngPresenceAttrModel2>*>( aObject )->ResetAndDestroy();
+    }
+
+//  End of File
+
+
+
+