PECengine/ListLibrary2/AttrListSrc/CPEngAttributeListTransCreateAttrList.cpp
branchRCL_3
changeset 17 a941bc465d9f
parent 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/AttrListSrc/CPEngAttributeListTransCreateAttrList.cpp	Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,344 @@
+/*
+* 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:  Create attribute list transaction handler
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPEngAttributeListTransCreateAttrList.h"
+
+#include "CPEngAttributeListItem.h"
+#include "PEngListLibTools.h"
+#include "MPEngXMLSerializer.h"
+#include "MPEngXMLParser.h"
+#include "CPEngTransactionStatus.h"
+#include "PEngWVPresenceErrors2.h"
+#include "PEngAttrLibFactory.h"
+#include "MPEngPresenceAttrManager.h"
+#include "MPEngAttributeListTransactionManager.h"
+#include "MPEngTransactionFactory.h"
+
+#include <e32std.h>
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransCreateAttrList::CPEngAttributeListTransCreateAttrList()
+// -----------------------------------------------------------------------------
+//
+CPEngAttributeListTransCreateAttrList::CPEngAttributeListTransCreateAttrList(
+    MPEngAttributeListTransactionManager& aAttrListTransManager,
+    CPEngContactListTransactionManager& aCntListTransManager,
+    MPEngPresenceAttrManager& aPresenceAttributeManager,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId,
+    TBool aSync )
+        : CPEngAttributeListTransBase(  aAttrListTransManager,
+                                        aCntListTransManager,
+                                        aCSPVersion,
+                                        aOperationId ),
+        iPresenceAttributeManager( aPresenceAttributeManager ),
+        iSynchronization ( aSync )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransCreateAttrList::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransCreateAttrList::ConstructL(
+    const CPEngAttributeListItem& aAttributeListItem )
+    {
+    CPEngAttributeListTransBase::ConstructL();
+    iAttributeListItem = CPEngAttributeListItem::NewL( aAttributeListItem );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransCreateAttrList::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPEngAttributeListTransCreateAttrList* CPEngAttributeListTransCreateAttrList::NewLC(
+    const CPEngAttributeListItem& aAttributeListItem,
+    MPEngAttributeListTransactionManager& aAttrListTransManager,
+    CPEngContactListTransactionManager& aCntListTransManager,
+    MPEngPresenceAttrManager& aPresenceAttributeManager,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId,
+    TBool aSync )
+    {
+    CPEngAttributeListTransCreateAttrList* self =
+        new ( ELeave ) CPEngAttributeListTransCreateAttrList(
+        aAttrListTransManager,
+        aCntListTransManager,
+        aPresenceAttributeManager,
+        aCSPVersion,
+        aOperationId,
+        aSync );
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aAttributeListItem );
+
+    return self;
+    }
+
+
+// Destructor
+CPEngAttributeListTransCreateAttrList::~CPEngAttributeListTransCreateAttrList()
+    {
+    delete iAttributeListItem;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransCreateAttrList::RequestL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransCreateAttrList::RequestL( TDes8& aSendBuffer )
+    {
+    aSendBuffer.Zero();
+    MPEngXMLSerializer* xmlSerializer = CreateXmlSerializerL( aSendBuffer );
+    CleanupClosePushL( *xmlSerializer );
+
+    // <TransactionContent xmlns="http://www.wireless -village.org/TRC1.1">
+    NListLibTools::AppendTransactionContentTagXmlL( *xmlSerializer, iCSPVersion );
+
+    // <CreateAttributeList-Request>
+    xmlSerializer->StartTagL( KCreateAttributeList );
+
+    // <PresenceSubList
+    xmlSerializer->StartTagL( KPresenceSubList );
+
+    // check if attribute lists is empty, then we append empty standart atrribute's name space
+    if ( 0 == iAttributeListItem->PresenceAttributes().Count() )
+        {
+        // attribute name space
+        if ( iCSPVersion == EWVCspV11 )
+            {
+            // xmlns="http://www.wirelessvillage.org/PA1.1"
+            xmlSerializer->AttributeL( KXmlXmlns, KPresenceSubListAttributesNS );
+            }
+        else
+            {
+            // xmlns="http://www.openmobilealliance.org/DTD/WV-PA1.2"
+            xmlSerializer->AttributeL( KXmlXmlns, KPresenceSubListAttributesNS_CSP12 );
+            }
+        }
+    else
+        {
+        // xmlns="Name space"
+        // append attribute's namespace according to attributes on the list
+        // Append Attribute name space
+        TPtrC8 attributeName;
+        TPtrC8 attributeNameSpace;
+        User::LeaveIfError( iPresenceAttributeManager.GetAttributeXmlNameAndNameSpace(
+                                iAttributeListItem->PresenceAttributes()[0],
+                                attributeName, attributeNameSpace ) );
+
+        xmlSerializer->AttributeL( KXmlXmlns, attributeNameSpace );
+
+        // Append attributes one by one
+        TInt count ( iAttributeListItem->PresenceAttributes().Count() );
+        for ( TInt x( 0 ) ; x < count ; x++ )
+            {
+            User::LeaveIfError( iPresenceAttributeManager.GetAttributeXmlNameAndNameSpace(
+                                    iAttributeListItem->PresenceAttributes()[x],
+                                    attributeName, attributeNameSpace ) );
+            // append attribute name
+            xmlSerializer->StartTagL( attributeName ).EndTagL( attributeName );
+            }
+        }
+
+    //</PresenceSubList>
+    xmlSerializer->EndTagL( KPresenceSubList );
+
+    // now it depends if this is synchronization handler or not
+    if ( iSynchronization )
+        {
+        // this us sync handler,
+        // all settings are taken from current and new at the same time
+        XMLAppendContactIdsL( *xmlSerializer, iAttributeListItem->ArrayOfContacts(
+                                  CPEngAttributeListItem::ECurrentContactIDs ) );
+
+        XMLAppendContactIdsL( *xmlSerializer, iAttributeListItem->ArrayOfContacts(
+                                  CPEngAttributeListItem::ENewContactIDs ) );
+
+        XMLAppendContactListsL( *xmlSerializer, iAttributeListItem->ArrayOfContacts(
+                                    CPEngAttributeListItem::ECurrentContactLists ) );
+
+        XMLAppendContactListsL( *xmlSerializer, iAttributeListItem->ArrayOfContacts(
+                                    CPEngAttributeListItem::ENewContactLists ) );
+
+        XMLAppendDefaultFlagL( *xmlSerializer, iAttributeListItem->CurrentlyDefault() );
+        }
+    else
+        {
+        // this is update handler so settings are taken from new
+        XMLAppendContactIdsL( *xmlSerializer, iAttributeListItem->ArrayOfContacts(
+                                  CPEngAttributeListItem::ENewContactIDs ) );
+
+        XMLAppendContactListsL( *xmlSerializer, iAttributeListItem->ArrayOfContacts(
+                                    CPEngAttributeListItem::ENewContactLists ) );
+
+        XMLAppendDefaultFlagL( *xmlSerializer, iAttributeListItem->NewDefault() );
+        }
+
+    // </CreateAttributeList-Request>
+    // </TransactionContent>
+    xmlSerializer->EndTagL( KCreateAttributeList
+                          ).EndTagL( KTransactionContent );
+    CleanupStack::PopAndDestroy( ); // xmlSerializer
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransCreateAttrList::ConsumeMessageFromServerL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransCreateAttrList::DoConsumeMessageFromServerL(
+    const TDesC8& aResponse )
+    {
+    MPEngXMLParser* XMLparser = CreateXMLParserLC();
+    // try if there were some errors
+    TInt err ( XMLparser->ParseResultL( aResponse, iOperationId, *iTransactionStatus ) );
+    RArray<TUint32> wrongAttributes;
+    CleanupClosePushL( wrongAttributes );
+    switch ( err )
+        {
+        case KErrNone:
+            {
+            // successful operation, all went fine, process according to it
+            // if this was synchronization, just mark those attr list as in sync
+            if ( iSynchronization )
+                {
+                iAttributeListTransManager.AttributeListCreated( iAttributeListItem->PresenceAttributes() );
+                }
+            else
+                {
+                // since we have copy of the Attribute list item, just commit it
+                iAttributeListTransManager.CommitDefinedContactsL(
+                    &iAttributeListItem->ArrayOfContacts( CPEngAttributeListItem::ENewContactLists ),
+                    &iAttributeListItem->ArrayOfContacts( CPEngAttributeListItem::ENewContactIDs ) );
+
+                if ( iAttributeListItem->NewDefault() )
+                    {
+                    iAttributeListTransManager.CommitDefaultL();
+                    }
+                }
+            break;
+            }
+
+        case KPEngNwErrPartiallySuccessful:
+            {
+            // partial success, figure what went fine and what went OK
+            // we are interested in failed WV IDs, contact list and attributes
+            // anyhow we managed to create attr list
+            if ( iSynchronization )
+                {
+                iAttributeListTransManager.AttributeListCreated( iAttributeListItem->PresenceAttributes() );
+                }
+
+            TInt count ( iTransactionStatus->DetailedResultCount() );
+            for ( TInt x ( 0 ) ; x < count ; x++ )
+                {
+                const MPEngDetailedResultEntry2& detailedResult = iTransactionStatus->DetailedResult( x );
+
+                switch ( detailedResult.Error() )
+                    {
+                    case KPEngNwErrUnknownUser:
+                        {
+                        // rollback wrong WV ID
+                        TPtrC wrongWVWID;
+                        detailedResult.GetDetailedDesc( wrongWVWID, EPEngDTPresenceID );
+                        iAttributeListTransManager.RollBackContactIdL( wrongWVWID );
+                        break;
+                        }
+
+                    case KPEngNwErrContactListDoesNotExist:
+                        {
+                        // rollback wrong cnt list
+                        TPtrC wrongCntList;
+                        detailedResult.GetDetailedDesc( wrongCntList, EPEngDTContactListID );
+                        iAttributeListTransManager.RollBackContactListL( wrongCntList );
+                        break;
+                        }
+
+                    case KPEngNwErrInvalidOrUnSupportedPresenceAttribute:
+                        {
+                        TUint32 wrongAttrib;
+                        detailedResult.GetDetailedInt( wrongAttrib, EPEngDIAttributeID );
+                        wrongAttributes.AppendL( wrongAttrib );
+                        break;
+                        }
+
+                    default:
+                        {
+                        }
+                    }
+                }
+            break;
+            }
+
+        case KPEngNwErrUnknownUser:
+        case KPEngNwErrContactListDoesNotExist:
+            {
+            // none of the IDs/cnts list was added,
+            //remove them from the delta list of the attribute list
+            iAttributeListTransManager.RollBackDefinedContactsL(
+                &iAttributeListItem->ArrayOfContacts( CPEngAttributeListItem::ENewContactLists ) ,
+                &iAttributeListItem->ArrayOfContacts( CPEngAttributeListItem::ENewContactIDs ) );
+
+            // it this was sync, roll back also current
+            if ( iSynchronization )
+                {
+                iAttributeListTransManager.RollBackDefinedContactsL(
+                    &iAttributeListItem->ArrayOfContacts( CPEngAttributeListItem::ECurrentContactLists ) ,
+                    &iAttributeListItem->ArrayOfContacts( CPEngAttributeListItem::ECurrentContactIDs ) );
+
+                }
+
+            if ( iAttributeListItem->NewDefault() )
+                {
+                iAttributeListTransManager.RollBackDefaultL();
+                }
+            }
+
+        // handle all folllowing errors in the same, default, way
+        case KPEngNwErrInvalidOrUnSupportedPresenceAttribute:
+        default:
+            {
+            if ( iAttributeListItem->NewDefault() )
+                {
+                iAttributeListTransManager.RollBackDefaultL();
+                }
+            break;
+            }
+        }
+
+    // store changes and continue
+    iAttributeListTransManager.StoreChangesToStoreL();
+    CleanupStack::PopAndDestroy( 2 ); // wrongAttributes, XMLparser
+
+    if ( iSynchronization )
+        {
+        iAttributeListTransManager.AttributeEngineSynchronizedL();
+        }
+    }
+
+//  End of File
+