PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransBase.cpp
branchRCL_3
changeset 17 a941bc465d9f
parent 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransBase.cpp	Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,339 @@
+/*
+* Copyright (c) 2005 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:  Base class for contact list create and synchronize handlers
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPEngContactListTransBase.h"
+#include "CPEngContactListSettings.h"
+#include "CPEngContactListModBase.h"
+
+#include "PEngListLibTools.h"
+#include "MPEngXMLSerializer.h"
+#include "MPEngXMLParser.h"
+
+#include "CPEngTransactionStatus.h"
+#include "PEngWVPresenceErrors2.h"
+#include "PresenceDebugPrint.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::CPEngContactListTransBase()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListTransBase::CPEngContactListTransBase(
+    CPEngContactListModBase& aContactList,
+    CPEngSessionSlotId& aSessionSlotId,
+    MPEngContactListTransactionManager& aManager,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId )
+        : iContactList( aContactList ),
+        iSessionSlotId( aSessionSlotId ),
+        iManager( aManager ),
+        iCSPVersion( aCSPVersion ),
+        iOperationId( aOperationId )
+    {
+    iContactList.Open();                                // CSI: 65 #
+    iContactList.Lock( EStorageLockLevelHigh );
+    iContactList.BufferServerSideNotifications();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransBase::ConstructL()
+    {
+    iTransactionStatus = CPEngTransactionStatus::NewL();
+    }
+
+
+// Destructor
+CPEngContactListTransBase::~CPEngContactListTransBase()
+    {
+    delete iTransactionStatus;
+
+    iContactList.ReleaseServerSideBuffering();
+    iContactList.Unlock();
+    iContactList.Close();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::RequestL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransBase::RequestL( TDes8& aSendBuffer )
+    {
+    aSendBuffer.Zero();
+    MPEngXMLSerializer* xmlSerializer = CreateXmlSerializerL( aSendBuffer );
+    CleanupClosePushL( *xmlSerializer );
+
+    // <TransactionContent xmlns="http://www.wireless -village.org/TRC1.1">
+    NListLibTools::AppendTransactionContentTagXmlL( *xmlSerializer, iCSPVersion );
+
+    switch ( iContactListSyncState )
+        {
+        case EPEngCntListCreate:
+            DoGetXMLCreateCntListL( *xmlSerializer );
+            break;
+
+        case EPEngCntListFetch:
+            DoGetXMLFetchCntListL( *xmlSerializer );
+            break;
+
+        case EPEngSubscribeCntList:
+            GetXMLSubscribeListL( *xmlSerializer );
+            break;
+
+        default:
+            User::Leave( KErrNotSupported );
+            break;
+        }
+
+
+    // end of transaction
+    // </TransactionContent>
+    xmlSerializer->EndTagL( KTransactionContent );
+    CleanupStack::PopAndDestroy( ); // xmlSerializer
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::LastRunningTransactionHandler()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransBase::LastRunningTransactionHandler()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::OutgoingProcessResponseL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransBase::ProcessResponseL( const TDesC8& aResponse,
+                                                  TRequestStatus& /* aStatus */ )
+    {
+    MPEngXMLParser* XMLparser = CreateXMLParserLC();
+
+    switch ( iContactListSyncState )
+        {
+        case EPEngCntListCreate:
+            {
+            DoParseCreateCntListResponseL( aResponse, *XMLparser );
+            break;
+            }
+
+
+        case EPEngCntListFetch:
+            {
+            DoParseFetchCntListResponseL( aResponse, *XMLparser );
+            break;
+            }
+
+
+        case EPEngSubscribeCntList:
+            {
+            ParseSubscribeListResponseL( aResponse, *XMLparser );
+            break;
+            }
+
+
+        default:
+            {
+            User::Leave( KErrNotSupported );
+            break;
+            }
+        }
+    CleanupStack::PopAndDestroy(); // XMLparser
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::CancelProcessing()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransBase::CancelProcessing()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::NewTransactionHandlersL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransBase::NewTransactionHandlersL(
+    RPointerArray<MPEngOutgoingTransactionHandler>& /* aHandlers */ )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::TransactionCompleted()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngContactListTransBase::TransactionCompleted()
+    {
+    return ( iContactListSyncState == EPEngTransactionCompleted );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::TransactionResult()
+// -----------------------------------------------------------------------------
+//
+CPEngTransactionStatus* CPEngContactListTransBase::TransactionResult()
+    {
+    CPEngTransactionStatus* temp = iTransactionStatus;
+    iTransactionStatus = NULL;
+    return temp;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::ReleaseHandler()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransBase::ReleaseHandler()
+    {
+    iContactListSyncState = EPEngTransactionCompleted;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::CompleteCntListTransactionL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransBase::CompleteCntListTransactionL()
+    {
+    iContactListSyncState = EPEngTransactionCompleted;
+    iContactList.Settings().SetPropertyL( KPEngHasBeenSynchronized,
+                                          KPEngCntLstPropertyNativeCached,
+                                          ETrue );
+    iContactList.Settings().SetPropertyL( KPEngListExistsOnServer,
+                                          KPEngCntLstPropertyNativeCached,
+                                          ETrue );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::GetXMLSubscribeList()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransBase::GetXMLSubscribeListL(
+    MPEngXMLSerializer& aXmlSerializer )
+    {
+    // <SubscribePresence-Request>
+    aXmlSerializer.StartTagL( KSubscribePresence );
+
+    NListLibTools::AppendContactListNameXmlL( aXmlSerializer,
+                                              iContactList.Settings() );
+
+
+    // append set of attributes which should be subscribed
+    NListLibTools::AppendAttributesForSubscriptionXmlL(
+        iContactList.Settings().SubscriptionAttributes(),
+        aXmlSerializer,
+        iSessionSlotId,
+        iCSPVersion );
+
+
+    // if server supports 1.2 CSP, use autosubscribe
+    if ( iCSPVersion == EWVCspV12 )
+        {
+        // <AutoSubscribe>T</AutoSubscribe>
+        aXmlSerializer.StartTagL( KAutoSubscribe ).
+        NarrowTextL( KXMLValueTrue ).
+        EndTagL( KAutoSubscribe );
+        }
+
+
+    // </SubscribePresence-Request>
+    aXmlSerializer.EndTagL( KSubscribePresence );
+
+
+    // register contacts to the Attribute library
+    TPEngContactlistDesViewWraper contacts( iContactList );
+    NListLibTools::ActivatePresenceAttributesL( contacts, iSessionSlotId );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransBase::ParseSubscribeListResponseL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransBase::ParseSubscribeListResponseL(
+    const TDesC8& aResponse,
+    MPEngXMLParser& aXMLparser )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngContactListTransBase::ParseSubscribeListResponseL() [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+
+    // try if there were some errors
+    CPEngTransactionStatus* transactionStatus = CPEngTransactionStatus::NewL();
+    CleanupClosePushL( *transactionStatus );
+    TInt err ( aXMLparser.ParseContactListResultL( aResponse,
+                                                   iOperationId,
+                                                   iContactList.StorageId(),
+                                                   *transactionStatus ) );
+    switch ( err )
+        {
+        case KPEngNwErrPartiallySuccessful:
+            {
+            // mark for remove bad contacts,
+            // transaction will also unregister their attribute models
+            NListLibTools::MarkForRemoveBadContactsL( *transactionStatus, iContactList );
+            }
+
+        // fall through
+        case KErrNone:
+            {
+            CompleteCntListTransactionL();
+            transactionStatus->SetStatus( KErrNone );
+            break;
+            }
+
+
+        case KPEngNwErrUnknownUser:
+            {
+            // unregister attribute models
+            TPEngContactlistDesViewWraper contacts( iContactList );
+            NListLibTools::DeactivatePresenceAttributesL( contacts, iSessionSlotId );
+
+            // all contact Ids are wrong, remove them
+            iContactList.ResetLocalView();
+            CompleteCntListTransactionL();
+            break;
+            }
+
+
+        default:
+            {
+            CompleteCntListTransactionL();
+            }
+        }
+
+    iTransactionStatus->ImportStatusFrom( *transactionStatus );
+    CleanupStack::Pop(); // transactionStatus
+
+    PENG_DP( D_PENG_LIT( "CPEngContactListTransBase::ParseSubscribeListResponseL() done [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+    }
+
+//  End of File
+