xdmprotocols/XcapProtocol/XcapAppUsage/XcapRlsServicesUsage/src/XcapRlsServicesUsage.cpp
branchRCL_3
changeset 18 fbd2e7cec7ef
parent 0 c8caa15ef882
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapRlsServicesUsage/src/XcapRlsServicesUsage.cpp	Wed Sep 01 12:23:14 2010 +0100
@@ -0,0 +1,271 @@
+/*
+* 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:  CXcapRlsServicesUsage
+*
+*/
+
+
+
+
+#include <XdmErrors.h>
+#include <XdmDocumentNode.h>
+#include <XdmNodeAttribute.h>
+#include "XcapRlsServicesUsage.h"
+
+// Used specification
+// OMA-RLS_XDM_Specification-V1_0-20060214-C, 14 February 2006
+
+// ----------------------------------------------------
+// CXcapRlsServicesUsage::CXcapRlsServicesUsage
+// 
+// ----------------------------------------------------
+//
+CXcapRlsServicesUsage::CXcapRlsServicesUsage( const CXdmEngine& aXdmEngine ) :
+CXcapAppUsage( aXdmEngine ),
+iResourceLists( NULL )
+    {
+    }
+
+// ----------------------------------------------------
+// CXcapRlsServicesUsage::NewL
+// 
+// ----------------------------------------------------
+//
+CXcapRlsServicesUsage* CXcapRlsServicesUsage::NewL( const TXcapAppUsageParams& aParameters )
+    {
+    CXcapRlsServicesUsage* self = new ( ELeave ) CXcapRlsServicesUsage( aParameters.iXdmEngine );
+    CleanupStack::PushL( self );	// << self
+    self->ConstructL();
+    CleanupStack::Pop( self );      // >> self
+    return self;
+    }
+
+// ----------------------------------------------------
+// CXcapRlsServicesUsage::~CXcapRlsServicesUsage
+// 
+// ----------------------------------------------------
+//
+CXcapRlsServicesUsage::~CXcapRlsServicesUsage()
+    {
+    delete iResourceLists;
+    }
+        
+// ----------------------------------------------------
+// CXcapRlsServicesUsage::ConstructL
+// 
+// ----------------------------------------------------
+//
+void CXcapRlsServicesUsage::ConstructL()
+    {
+    iResourceLists = CXcapAppUsage::NewL( iXdmEngine, KXdmResourceListsUsageUid );
+    }
+
+// ----------------------------------------------------
+// CXcapRlsServicesUsage::AUID
+// 
+// ----------------------------------------------------
+//
+TPtrC8 CXcapRlsServicesUsage::AUID() const
+    {
+    return TPtrC8( KXdmRlsServicesUsageAUID );
+    }
+                
+// ----------------------------------------------------
+// CXcapRlsServicesUsage::ContentType
+// 
+// ----------------------------------------------------
+//
+TPtrC8 CXcapRlsServicesUsage::ContentType() const
+    {
+    return TPtrC8( KXdmRlsServicesUsageContType );
+    }
+
+// ----------------------------------------------------
+// CXcapRlsServicesUsage::DefaultNamespace
+// 
+// ----------------------------------------------------
+//
+TPtrC8 CXcapRlsServicesUsage::DefaultNamespace() const
+    {
+    return TPtrC8( KXdmRlsServicesNamespace );
+    }   
+    
+// ----------------------------------------------------
+// CXcapRlsServicesUsage::ValidateNodeL
+// 
+// ----------------------------------------------------
+//
+TBool CXcapRlsServicesUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode )
+    {
+    // This method is called by base class for each element
+    // in document, here we have to declare every element, check element 
+    // datatype, restrictions for values and also do all checking that concerns  
+    // the structure of the element. If the datatype is some of
+    // the common datatypes defined in xcapappusage.h, the node
+    // can pe passed to the base class for value validation.
+    // If the node belongs to this namespace, the return value
+    // should be true, false otherwise.
+
+    
+    TBool found( EFalse );    
+    TDataType dataType ( EDataTypeUndefined );
+    TPtrC element = aXdmNode.NodeName();
+    // <rls-services>
+    if ( Match( element, KXdmRlsServices ) )   
+        {
+        found = ETrue;
+        }
+     // <service>
+    else if ( Match( element, KXdmService ) )    
+        {
+        // required attribute uri
+        if ( !aXdmNode.HasAttribute( KXdmUri ) )
+            {
+            LeaveWithErrorL( KXcapErrorMissingRequiredAttribute );
+            }
+            
+        // there should be either <resource-list> or
+        // <list> element and mandatory <packages> element
+        TBool resourcelist( EFalse );
+        TBool list( EFalse );
+        TBool packages( EFalse );
+        // go through all childs
+        TInt count( aXdmNode.NodeCount() );
+        for ( TInt i(0); i < count; i++ )
+            {
+            TPtrC childName = aXdmNode.ChileNode(i)->NodeName();
+            if ( Match( childName, KXdmResourceList ) )  
+                {
+                resourcelist = ETrue;
+                }
+            else if ( Match( childName, KXdmList ) ) 
+                {
+                list = ETrue;
+                }
+            else if ( Match( childName, KXdmPackages ) ) 
+                {
+                packages = ETrue;
+                }
+            }
+        // <resource-list> or <list>, not both
+        if ( resourcelist && list )
+            {
+            LeaveWithErrorL( KXcapErrorSchemaViolation );   
+            }
+        // each <service> must have at least one <packages> element
+        if ( !packages )
+            {
+            LeaveWithErrorL( KXcapErrorMissingRequiredElement );    
+            }
+        found = ETrue;
+        }
+    // <resource-list>
+    else if ( Match( element, KXdmResourceList ) )   
+        {
+        dataType = EDataTypeAnyURI;
+        found = ETrue;
+        }
+    // <packages>
+    else if ( Match( element, KXdmPackages ) )   
+        {
+        // each <packages> shall specify at least presence event package,
+        // go through all childs
+        TBool presence ( EFalse );
+        TInt count( aXdmNode.NodeCount() );
+        for ( TInt i(0); i < count; i++ )
+            {   
+            if ( Match( aXdmNode.ChileNode(i)->NodeName(), KXdmPackage ) ) 
+                {
+                TPtrC8 data = aXdmNode.ChileNode(i)->LeafNodeContent();
+                if ( !data.CompareF( KXdmPresence ) )
+                    {
+                    presence = ETrue;
+                    }
+                }
+            }
+        // check that the <package>presence<package> exists
+        if ( !presence )
+            {
+            LeaveWithErrorL( KXcapErrorMissingRequiredElementValue );   
+            }
+        found = ETrue;
+        }
+    // <package>
+    else if ( Match( element, KXdmPackage ) )   
+        {
+        dataType = EDataTypeString;
+        found = ETrue;
+        }
+    // <list> type=rl:listType from urn:ietf:params:xml:ns:resource-lists
+    // however belongs to the default namespace
+    // ( btw, there is mistake in specification example )
+    else if ( Match( element, KXdmList ) ) 
+        {
+        found = iResourceLists->ValidateNodeL( aXdmNode );
+        }
+    // <entry>,<display-name> from urn:ietf:params:xml:ns:resource-lists
+    if ( !found ) 
+        {
+        found = iResourceLists->ValidateNodeL( aXdmNode );
+        if ( found )
+            {
+            SetPrefixL( aXdmNode, KXdmResourceListsNsPrefix );   
+            }
+        }
+    if ( dataType != EDataTypeUndefined )
+        {
+        // pass to the base class for data validation
+        ValidateDataL( dataType, aXdmNode );
+        }
+    return found;
+    }
+
+// ----------------------------------------------------
+// CXcapRlsServicesUsage::ValidateAttributeL
+// 
+// ----------------------------------------------------
+//
+void CXcapRlsServicesUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr )
+    {
+    // This method is called by base class for each attribute
+    // in document, here we have to define data types
+    // for attributes, and pass them to the base class
+    // for the actual data checking.
+    
+    // uri 
+    if ( Match( aXdmNodeAttr.NodeName(), KXdmUri ) )
+        {
+        ValidateDataL( EDataTypeAnyURI, aXdmNodeAttr );
+        }
+    // the rest are rom urn:ietf:params:xml:ns:resource-lists
+    else
+        {
+        iResourceLists->ValidateAttributeL( aXdmNodeAttr ); 
+        }
+    }   
+                         
+// ----------------------------------------------------
+// CXcapRlsServicesUsage::AddNamespaceInformationL
+// 
+// ----------------------------------------------------
+//
+void CXcapRlsServicesUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument )
+    {
+    aXdmDocument.AppendNamespaceL( KXdmRlsServicesNamespace, KNullDesC8 );
+    aXdmDocument.AppendNamespaceL( KXdmResourceListsNamespace, KXdmResourceListsNsPrefix );
+    }
+
+
+// End of File
+