omadmadapters/nsmldmalwaysonadapter/src/nsmldmalwaysonadapter.cpp
changeset 45 0f9fc722d255
parent 44 137912d1a556
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadmadapters/nsmldmalwaysonadapter/src/nsmldmalwaysonadapter.cpp	Tue Jul 13 03:48:30 2010 +0530
@@ -0,0 +1,647 @@
+/*
+* Copyright (c) 2007 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:  Provides handling of Always-on settings in Device management.
+*
+*/
+
+
+#include <ecom/implementationproxy.h>
+
+#include "nsmldmalwaysonadapter.h"
+#include "logger.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// --------------------------------------------------------------------------
+// Maps plugin UID to its factory function (constructor)
+// --------------------------------------------------------------------------
+const TImplementationProxy ImplementationTable[] =
+    {
+    IMPLEMENTATION_PROXY_ENTRY(0x101f6d36, 
+                               CNSmlDmAOAdapter::NewL)
+    };
+
+// --------------------------------------------------------------------------
+// For ecom plugin implementation
+// -------------------------------------------------------------------------
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+    {
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+    return ImplementationTable;
+    }
+
+// --------------------------------------------------------------------------
+// CNSmlDmAOAdapter::NewL
+// --------------------------------------------------------------------------
+CNSmlDmAOAdapter* CNSmlDmAOAdapter::NewL( MSmlDmCallback* aDmCallback )
+    {
+    LOGSTRING("CNSmlDmAOAdapter::NewL: Start");
+    
+    CNSmlDmAOAdapter* self = new (ELeave) CNSmlDmAOAdapter( aDmCallback );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    
+    LOGSTRING("CNSmlDmAOAdapter::NewL: End");
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CNSmlDmAOAdapter::CNSmlDmAOAdapter
+// --------------------------------------------------------------------------
+
+CNSmlDmAOAdapter::CNSmlDmAOAdapter( MSmlDmCallback* aDmCallback ) 
+    : CSmlDmAdapter( aDmCallback )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CNSmlDmAOAdapter::ConstructL
+// --------------------------------------------------------------------------
+void CNSmlDmAOAdapter::ConstructL()
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::CNSmlDmAOAdapter: Start" );
+    
+    iSettingStore = CNSmlDmAOSettingStore::NewL( this );
+    
+    LOGSTRING( "CNSmlDmAOAdapter::CNSmlDmAOAdapter: End" );
+    }
+
+// --------------------------------------------------------------------------
+// CNSmlDmAOAdapter::~CNSmlDmAOAdapter
+// --------------------------------------------------------------------------
+CNSmlDmAOAdapter::~CNSmlDmAOAdapter()
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::~CNSmlDmAOAdapter: Start" );    
+ 
+    //iBuffer.ResetAndDestroy();
+    //iBuffer.Close();
+    delete iSettingStore;
+ 
+    LOGSTRING( "CNSmlDmAOAdapter::~CNSmlDmAOAdapter: End" );
+    }
+    
+// --------------------------------------------------------------------------
+// CNSmlDmAOAdapter::DDFVersionL
+// Returns ddf version nr
+// --------------------------------------------------------------------------
+void CNSmlDmAOAdapter::DDFVersionL( CBufBase& aDDFVersion )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::DDFVersionL: Start" );
+ 
+    aDDFVersion.InsertL( 0, KNSmlDmAOAdapterDDFVersion );
+ 
+    LOGSTRING( "CNSmlDmAOAdapter::DDFVersionL:End" );
+    }
+   
+// --------------------------------------------------------------------------
+// CNSmlDmAOAdapter::DDFStructureL
+//  Constructs the DDF structure
+// --------------------------------------------------------------------------
+void CNSmlDmAOAdapter::DDFStructureL( MSmlDmDDFObject& aDDF )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::DDFStructureL: Start" );
+    TSmlDmAccessTypes accessTypes;
+
+    // VENDORCONFIG
+    MSmlDmDDFObject& ao = aDDF.AddChildObjectL( KNSmlDmAOAdapterAO );
+    
+    accessTypes.SetGet();    
+    
+    ao.SetAccessTypesL( accessTypes );
+    ao.SetOccurenceL( MSmlDmDDFObject::EOne );
+    ao.SetScopeL( MSmlDmDDFObject::EPermanent );
+    ao.SetDFFormatL( MSmlDmDDFObject::ENode );
+    ao.AddDFTypeMimeTypeL( KNSmlDmAOAdapterTextPlain );
+    ao.SetDescriptionL( KNSmlDmAOAdapterAODescription );
+    accessTypes.Reset();
+
+    // VENDORCONFIG/Name
+    MSmlDmDDFObject& name = ao.AddChildObjectL( KNSmlDmAOAdapterName );
+    
+    accessTypes.SetGet();
+    accessTypes.SetReplace();
+    accessTypes.SetAdd();
+    
+    name.SetAccessTypesL( accessTypes );
+    name.SetOccurenceL( MSmlDmDDFObject::EOne );
+    name.SetScopeL( MSmlDmDDFObject::EDynamic );
+    name.SetDFFormatL( MSmlDmDDFObject::EChr );
+    name.SetDescriptionL( KNSmlDmAOAdapterNameDescription );
+    accessTypes.Reset();
+
+    // VENDORCONFIG/AWON-PDPC
+    MSmlDmDDFObject& awonPdpc = 
+                          ao.AddChildObjectL( KNSmlDmAOAdapterAwonPdpc );
+    
+    accessTypes.SetGet();
+    accessTypes.SetReplace();
+    accessTypes.SetAdd();
+    
+    awonPdpc.SetAccessTypesL( accessTypes );
+    awonPdpc.SetOccurenceL( MSmlDmDDFObject::EOne );
+    awonPdpc.SetScopeL( MSmlDmDDFObject::EDynamic );
+    awonPdpc.SetDFFormatL( MSmlDmDDFObject::EChr );
+    awonPdpc.SetDescriptionL( KNSmlDmAOAdapterAwonPdpcDescription );
+    accessTypes.Reset();
+        
+    // VENDORCONFIG/T-RETRY
+    MSmlDmDDFObject& tRetry = 
+                          ao.AddChildObjectL( KNSmlDmAOAdapterTRetry );
+    
+    accessTypes.SetGet();
+    accessTypes.SetReplace();
+    accessTypes.SetAdd();
+    
+    tRetry.SetAccessTypesL( accessTypes );
+    tRetry.SetOccurenceL( MSmlDmDDFObject::EOne );
+    tRetry.SetScopeL( MSmlDmDDFObject::EDynamic );
+    tRetry.SetDFFormatL( MSmlDmDDFObject::EChr );
+    tRetry.SetDescriptionL( KNSmlDmAOAdapterTRetryDescription );
+    accessTypes.Reset();
+    
+    LOGSTRING( "CNSmlDmAOAdapter::DDFStructureL: End" );    
+    }
+
+// -------------------------------------------------------------------------
+// CNSmlDmAOAdapter::UpdateLeafObjectL
+// Adds or updates leaf node value. 
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::UpdateLeafObjectL( const TDesC8& aURI, 
+                                          const TDesC8& aLUID, 
+                                          const TDesC8& aObject, 
+                                          const TDesC8& /*aType*/, 
+                                          TInt aStatusRef )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::UpdateLeafObjectL: Start" );
+    LOGSTRING4( "\tUpdateLeafObjectL  \tURI: %S, \n\tLUID: %S,\
+                         \tobject: %S ", 
+                        &aURI, &aLUID, &aObject );
+        
+	// execute command and return status  
+    CSmlDmAOCommandElement* cmd = 
+    CSmlDmAOCommandElement::NewLC( ETrue, 
+                                   aStatusRef,
+                                   KNSmlDmAOInvalidRef, 
+                                   CNSmlDmAOAdapter::EAddCmd,
+                                   LastURISeg( aURI ), 
+                                   aObject);
+    
+    TInt luid( KDefaultLuid );
+    
+    if ( aLUID.Length() > 0 )
+        {
+        luid = DesToIntL( aLUID );    
+        }
+                                                                                                     
+    iSettingStore->ExecuteCmdL( *cmd, luid );    
+    
+    LOGSTRING2( "\tCmd executed with status: %d", 
+                          cmd->Status() );
+    Callback().SetStatusL( aStatusRef, cmd->Status() );     
+    CleanupStack::PopAndDestroy( cmd );                
+        
+    LOGSTRING( "CNSmlDmAOAdapter::UpdateLeafObjectL: End" );    
+    }
+// --------------------------------------------------------------------------
+// CNSmlDmAOAdapter::DeleteObjectL
+// Not supported
+// --------------------------------------------------------------------------
+
+void CNSmlDmAOAdapter::DeleteObjectL( const TDesC8& /*aURI*/, 
+                                      const TDesC8& /*aLUID*/,
+						              TInt aStatusRef )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::DeleteObjectL: Start" );
+    Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); 
+    LOGSTRING( "CNSmlDmAOAdapter::DeleteObjectL: End" );
+    }
+    
+// -------------------------------------------------------------------------
+// CNSmlDmAOAdapter::FetchLeafObjectL
+// Fetches leaf object value.
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::FetchLeafObjectL( const TDesC8& aURI, 
+                                         const TDesC8& aLUID, 
+                                         const TDesC8& /*aType*/, 
+                                         const TInt aResultsRef, 
+                                         const TInt aStatusRef )
+    {
+    LOGSTRING( "NSmlDmAOAdapter::FetchLeafObjectL: Start" );
+    LOGSTRING3( "\tFetchLeafObjectL  \tURI: %S, \tLUID: %S,", 
+                        &aURI, &aLUID );
+    
+    CSmlDmAOCommandElement* cmd = 
+    CSmlDmAOCommandElement::NewLC( ETrue, 
+                                   aStatusRef, 
+                                   aResultsRef, 
+                                   CNSmlDmAOAdapter::EGetCmd,
+                                   LastURISeg( aURI ), 
+                                   KNullDesC8);
+
+    TInt luid( KDefaultLuid );
+    
+    if ( aLUID.Length() > 0 )
+        {
+        luid = DesToIntL( aLUID );    
+        }
+        
+    iSettingStore->ExecuteCmdL( *cmd, luid );
+    LOGSTRING2( "\tCmd executed with status: %d ", 
+                          cmd->Status() );
+
+    // if executed return status
+    if ( cmd->Executed() ) 
+        {
+        Callback().SetStatusL( aStatusRef, cmd->Status() );            
+        // if successful set results
+        if ( cmd->Status() == CSmlDmAdapter::EOk )
+            {
+            LOGSTRING2( "\tCmd executed with result: %S ", 
+                                  cmd->Data() );
+            CBufBase* result = CBufFlat::NewL( cmd->Data()->Size() );
+            CleanupStack::PushL( result );
+            result->InsertL( 0, *cmd->Data() );
+            Callback().SetResultsL( aResultsRef, *result, KNullDesC8 );
+            CleanupStack::PopAndDestroy( result );
+            }
+        }
+    else
+        {
+        // failed to execute command
+        Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+        }
+    CleanupStack::PopAndDestroy( cmd );
+    
+    
+    LOGSTRING( "NSmlDmAOAdapter::FetchLeafObjectL: End" );
+    }
+
+// --------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::FetchLeafObjectSizeL
+//  Fetches leaf object size.
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::FetchLeafObjectSizeL( const TDesC8& aURI, 
+                                             const TDesC8& aLUID,
+									         const TDesC8& /* aType */, 
+									         TInt aResultsRef,
+									         TInt aStatusRef )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::FetchLeafObjectSizeL: Start" );
+    LOGSTRING3( "\tFetchLeafObjectSizeL  \tURI: %S, \tLUID: %S,", 
+                         &aURI, &aLUID );
+   
+    CSmlDmAOCommandElement* cmd = 
+    CSmlDmAOCommandElement::NewLC( ETrue, 
+                                   aStatusRef, 
+                                   aResultsRef, 
+                                   CNSmlDmAOAdapter::EGetSizeCmd,
+                                   LastURISeg( aURI ), 
+                                   KNullDesC8);
+                                   
+    TInt luid( KDefaultLuid );
+    
+    if ( aLUID.Length() > 0 )
+        {
+        luid = DesToIntL( aLUID );    
+        }
+                                       
+    iSettingStore->ExecuteCmdL( *cmd, luid );
+    
+    LOGSTRING2( "\tCmd executed with status: %d ", 
+                          cmd->Status() );
+    // if executed get status
+    if ( cmd->Executed() ) 
+        {
+        Callback().SetStatusL( aStatusRef, cmd->Status() );            
+        // if successful get results
+        if ( cmd->Status() == CSmlDmAdapter::EOk )
+            {
+            LOGSTRING2( "\tCmd executed with result: %S ", 
+                                  cmd->Data() );
+            CBufBase* result = CBufFlat::NewL( cmd->Data()->Size() );
+            CleanupStack::PushL( result );
+            result->InsertL( 0, *cmd->Data() );
+            Callback().SetResultsL( aResultsRef, *result, KNullDesC8 );
+            CleanupStack::PopAndDestroy( result );
+            }
+        }
+    else
+        {
+        // failed to execute command
+        Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+        }
+    
+    CleanupStack::PopAndDestroy( cmd );
+        
+    LOGSTRING( "CNSmlDmAOAdapter::FetchLeafObjectSizeL: End" );
+    }
+
+// ------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::ChildURIListL
+//  Fetches child nodes of a node. these may be either all VENDORCONFIG 
+//  nodes or leaf nodes under a VENDORCONFIG node. 
+// ------------------------------------------------------------------------
+void CNSmlDmAOAdapter::ChildURIListL( const TDesC8& aURI, 
+                                      const TDesC8& aLUID,
+					                  const CArrayFix<TSmlDmMappingInfo>& 
+					                  /*aPreviousURISegmentList*/,
+					                  TInt aResultsRef, 
+					                  TInt aStatusRef )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::ChildURIListL: Start" );
+    LOGSTRING3( "\tChildURIListL  URI: %S, LUID: %S ", 
+                        &aURI, &aLUID );
+    
+    CBufBase* resultList = CBufFlat::NewL( KSmlMaxURISegLen );
+    CleanupStack::PushL( resultList );
+	
+	// get all leaf nodes below VENDORCONFIG node
+    if ( !aURI.Compare( KNSmlDmAOAdapterAO ) )
+        {        
+        CSmlDmAOCommandElement* cmd = 
+        CSmlDmAOCommandElement::NewLC( EFalse, 
+                                       aStatusRef,
+                                       aResultsRef, 
+                                       CNSmlDmAOAdapter::EGetCmd, 
+                                       KNullDesC8, 
+                                       KNullDesC8 );
+                                       
+        TInt luid( KDefaultLuid );
+    
+        if ( aLUID.Length() > 0 )
+            {
+            luid = DesToIntL( aLUID );    
+            }
+                                           
+        iSettingStore->ExecuteCmdL( *cmd, luid );
+        
+        LOGSTRING2( "\tCmd executed with status: %d ", 
+                              cmd->Status() );
+   
+        Callback().SetStatusL( aStatusRef, cmd->Status() );
+        if( cmd->Status() == CSmlDmAdapter::EOk )
+            {
+            resultList->InsertL( 0, *cmd->Data() );
+            Callback().SetResultsL( aResultsRef, 
+                                    *resultList, 
+                                    KNullDesC8 );
+            } 
+   
+        CleanupStack::PopAndDestroy( cmd );               
+        }        
+   
+    CleanupStack::PopAndDestroy( resultList );
+    LOGSTRING( "CNSmlDmAOAdapter::ChildURIListL: End" );
+    }
+ 
+// --------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::AddNodeObjectL
+//  Not supported
+// --------------------------------------------------------------------------
+void CNSmlDmAOAdapter::AddNodeObjectL( const TDesC8& /*aURI*/, 
+                                       const TDesC8& /*aParentLUID*/,
+								       TInt aStatusRef )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::AddNodeObjectL: Start" );
+    Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+    LOGSTRING( "CNSmlDmAOAdapter::AddNodeObjectL: End" );
+    }
+
+// -------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::UpdateLeafObjectL
+//  Not supported from stream
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::UpdateLeafObjectL( const TDesC8& /* aURI */, 
+                                          const TDesC8& /* aLUID */, 
+                                          RWriteStream*& /* aStream */, 
+                                          const TDesC8& /* aType */, 
+                                          TInt aStatusRef )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::UpdateLeafObjectL: Start" );
+    Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);    
+    LOGSTRING( "CNSmlDmAOAdapter::UpdateLeafObjectL: End" );
+    }
+
+
+
+// -------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::ExecuteCommandL
+//  Not supported
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::ExecuteCommandL( const TDesC8& /* aURI */, 
+                                        const TDesC8& /* aLUID */, 
+                                        const TDesC8& /* aArgument */, 
+                                        const TDesC8& /* aType */, 
+                                        TInt aStatusRef )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::ExecuteCommandL: Start" );
+    Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError);    
+    LOGSTRING( "CNSmlDmAOAdapter::ExecuteCommandL: End" );
+    }
+// -------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::ExecuteCommandL
+//  Not supported
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::ExecuteCommandL( const TDesC8& /* aURI */, 
+                                        const TDesC8& /* aLUID */, 
+                                        RWriteStream*& /* aStream */, 
+                                        const TDesC8& /* aType */, 
+                                        TInt aStatusRef )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::ExecuteCommandL: Start" );
+    Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError );    
+    LOGSTRING( "CNSmlDmAOAdapter::ExecuteCommandL: End" );
+    }
+ 
+// -------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::CopyCommandL
+//  Not supported
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::CopyCommandL( const TDesC8& /* aTargetURI */ , 
+                                     const TDesC8& /* aTargetLUID */ , 
+                                     const TDesC8& /* aSourceURI */ , 
+                                     const TDesC8& /* aSourceLUID */, 
+                                     const TDesC8& /* aType */ , 
+                                     TInt aStatusRef )
+    {
+    //not supported
+    LOGSTRING( "CNSmlDmAOAdapter::CopyCommandL: Sart" );
+    Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError );    
+    LOGSTRING( "CNSmlDmAOAdapter::CopyCommandL: End" );
+    }
+// -------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::StartAtomicL
+//  Not supported
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::StartAtomicL()
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::StartAtomicL: Start" );
+    LOGSTRING( "CNSmlDmAOAdapter::StartAtomicL: End" );
+    }
+// -------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::CommitAtomicL
+//  Not supported
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::CommitAtomicL()
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::CommitAtomicL: Start" );
+    LOGSTRING( "CNSmlDmAOAdapter::CommitAtomicL: End" );
+    }
+
+// -------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::RollbackAtomicL
+//  Not supported
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::RollbackAtomicL()
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::RollbackAtomicL: Start" );
+    LOGSTRING( "CNSmlDmAOAdapter::RollbackAtomicL: End" );
+    }
+
+TBool CNSmlDmAOAdapter::StreamingSupport( TInt& /* aItemSize */ )
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::StreamingSupport: Start" );
+    LOGSTRING( "CNSmlDmAOAdapter::StreamingSupport: End" );
+    return EFalse;
+    }
+// -------------------------------------------------------------------------
+//  CNSmlDmAOAdapter::StreamCommittedL
+//  Not supported
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::StreamCommittedL()
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::StreamCommittedL: Start" );
+    LOGSTRING( "CNSmlDmAOAdapter::StreamCommittedL: End" );
+    }
+
+// -------------------------------------------------------------------------
+// CNSmlDmAOAdapter::CompleteOutstandingCmdsL
+// Buffering not needed because nodes can't be added
+// -------------------------------------------------------------------------
+void CNSmlDmAOAdapter::CompleteOutstandingCmdsL()
+    {
+    LOGSTRING( "CNSmlDmAOAdapter::CompleteOutstandingCmdsL: Start");
+    LOGSTRING( "CNSmlDmAOAdapter::CompleteOutstandingCmdsL: End" );    
+    }
+
+// --------------------------------------------------------------------------
+// CNSmlDmAOAdapter::IntToDes8L
+// Converts integer to 8bit descriptor
+// --------------------------------------------------------------------------
+HBufC8* CNSmlDmAOAdapter::IntToDes8L( TInt aLuid ) const
+    {
+    HBufC8* buf = HBufC8::NewL( 10 ); //10 = max length of 32bit integer
+    TPtr8 ptrBuf = buf->Des();
+    ptrBuf.Num( aLuid );
+    return buf;
+    }
+    
+// --------------------------------------------------------------------------
+// CNSmlDmAOAdapter::DesToIntL
+// Converts 8bit descriptor to int
+// --------------------------------------------------------------------------
+TUint CNSmlDmAOAdapter::DesToIntL( const TDesC8& aLuid ) const
+    {
+    TLex8 lex( aLuid );
+    TUint value( 0 );
+    User::LeaveIfError( lex.Val( value ) );
+    return value;
+    }        
+
+// --------------------------------------------------------------------------
+// CNSmlDmAOAdapter::LastURISeg
+// Returns the last uri segemnt of a uri. 
+// --------------------------------------------------------------------------
+TPtrC8 CNSmlDmAOAdapter::LastURISeg( const TDesC8& aURI ) const
+    {
+    TInt i;
+    for ( i=aURI.Length()-1; i >= 0; i-- )
+        {
+        if ( aURI[i]=='/' )
+            {
+            break;
+            }
+        }
+        
+    if ( i==0 )
+        {
+        return aURI;
+        }
+    else
+        {
+        return aURI.Mid( i + 1 );
+        }
+    }
+
+
+//---------------------- CSmlDmAOCommandElement -------------------------//
+
+// --------------------------------------------------------------------------
+// CSmlDmAOCommandElement* CSmlDmAOCommandElement::NewLC
+// --------------------------------------------------------------------------
+
+CSmlDmAOCommandElement* CSmlDmAOCommandElement::NewLC( TBool aLeaf,
+                                                       TInt aStatusRef, 
+                                                       TInt aResultRef, 
+                                                       CNSmlDmAOAdapter::TCommandType aCmdType,
+                                                       const TDesC8& aLastUriSeg, 
+                                                       const TDesC8& aData )
+    {
+    CSmlDmAOCommandElement* self = new (ELeave) CSmlDmAOCommandElement( aLeaf, 
+                                                                        aStatusRef, 
+                                                                        aResultRef, 
+                                                                        aCmdType );
+    CleanupStack::PushL(self);
+    self->ConstructL( aLastUriSeg, aData );
+    return self;
+    }    
+    
+// --------------------------------------------------------------------------
+// CSmlDmAOCommandElement::~CSmlDmAOCommandElement
+// --------------------------------------------------------------------------
+CSmlDmAOCommandElement::~CSmlDmAOCommandElement()
+    {
+    delete iLastUriSeg;
+    delete iData;
+    }
+    
+// --------------------------------------------------------------------------
+// CSmlDmAOCommandElement::CSmlDmAOCommandElement
+// --------------------------------------------------------------------------
+CSmlDmAOCommandElement::CSmlDmAOCommandElement( TBool aLeaf,
+                                                TInt aStatusRef, 
+                                                TInt aResultRef, 
+                                                CNSmlDmAOAdapter::TCommandType  aCmdType )
+                                                : iStatus( CSmlDmAdapter::EError ),
+                                                iLeaf( aLeaf ),
+                                                iStatusRef( aStatusRef ),
+                                                iResultRef( aResultRef ),
+                                                iCmdType( aCmdType ),
+                                                iData( NULL )
+                                                
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CSmlDmAOCommandElement::ConstructL
+// --------------------------------------------------------------------------
+void CSmlDmAOCommandElement::ConstructL( const TDesC8& aLastUriSeg, 
+                                         const TDesC8& aData )
+    {
+    iLastUriSeg = aLastUriSeg.AllocL();    
+    iData = aData.AllocL();
+    }