omadm/omadmextensions/adapters/nsmldmalwaysonadapter/inc/nsmldmalwaysonadapter.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 07 Jan 2010 12:39:15 +0200
changeset 1 4490afcb47b1
permissions -rw-r--r--
Revision: 200951 Kit: 201001

/*
* 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:  DM adapter for handling always-on settings.
*
*/


#ifndef NSMLDMALWAYSONADAPTER_H
#define NSMLDMALWAYSONADAPTER_H

#include <smldmadapter.h>

#include "nsmldmalwaysonsettingstore.h"

class CSmlDmAOCommandElement;
class CNSmlDmAOSettingStore;

// The DDF version must be changed if any changes in DDF structure 
// ( built in DDFStructureL() function )
_LIT8( KNSmlDmAOAdapterDDFVersion, "1.0" ); 
_LIT8( KNSmlDmAOAdapterTextPlain, "text/plain" );

// Names of the nodes
// When updating KNSmlDmAOAdapterAOURI also update 
// KNSmlDmAOAdapterURIMaxLength! */
_LIT8(KNSmlDmAOAdapterAOURI, "./VENDORCONFIG");
_LIT8(KNSmlDmAOAdapterAO, "VENDORCONFIG");
_LIT8(KNSmlDmAOAdapterName, "NAME");
_LIT8(KNSmlDmAOAdapterAwonPdpc, "AWON-PDPC");
_LIT8(KNSmlDmAOAdapterTRetry, "T-RETRY");


// Descriptions of the nodes
_LIT8( KNSmlDmAOAdapterAODescription, 
       "Always-on provides management of connections");
_LIT8( KNSmlDmAOAdapterNameDescription, 
       "Name of the VENDORCONFIG");
_LIT8( KNSmlDmAOAdapterAwonPdpcDescription, 
       "Always-on setting in home and visited network");
_LIT8( KNSmlDmAOAdapterTRetryDescription, 
       "T-Retry timer interval");

// Leaf nodes of VENDORCONFIG node
_LIT8( KNSmlDmAOAllLeafNodes, 
       "NAME/AWON-PDPC/T-RETRY");

// URI segment separator
// When updating this literal also update 
// KNSmlDmAOAdapterAPURIMaxLength and KNSmlDmAOAdapterURIMaxLength!
_LIT8( KNSmlDmAOSeparator, "/" );

// URI segment separator
// When updating KNSmlDmAOAdapterAOURI also update 
// KNSmlDmAOAdapterAPURIMaxLength and KNSmlDmAOAdapterURIMaxLength!
_LIT8( KNSmlDmAOUriListSeparator, "," );

// Prefix in URIs (removed for LUID mapping)
_LIT8( KNSmlDmAOAdapterURIPrefix, "./" );

// Name prefix for unnamed VENDORCONFIG nodes
_LIT8( KNSmlDmAONamePrefix, "VENDORCONFIG" );

const TInt KNSmlDmAOGranularity = 4;
const TInt KNSmlDmAOInvalidRef = -1;

// Maximum length of VENDORCONFIG URI including a separator 
// character in URI List. Node is not calculated here.  
// KNSmlDmAOAdapterAOURI + KNSmlDmAOSeparator + KNSmlDmAOUriListSeparator
const TInt KNSmlDmAOAdapterURIMaxLength =  16;
        
/**
 *  Always-on device management adapter
 *
 *  Always-on device management adapter manages settings
 *  related to VENDORCONFIG.
 *
 *  @lib nsmldmalwaysonadapter
 *  @since S60 v3.2
 */
class CNSmlDmAOAdapter : public CSmlDmAdapter
    {
    
public:

/** Possible command types */
enum TCommandType
    {
    EAddCmd,
    EGetCmd,
    EGetSizeCmd,
    EDeleteCmd
    };


    static CNSmlDmAOAdapter* NewL( MSmlDmCallback* aDmCallback );
    
    virtual ~CNSmlDmAOAdapter();


// from base class CSmlDmAdapter

    /**
     *  The function returns current version of the DDF. 
     *
     *  @since S60 v3.2
     *  @param aVersion DDF version of the
     *  adapter. (filled by the adapter) 
     */
    void DDFVersionL( CBufBase& aDDFVersion );

    /**
     *  The function for filling the DDF structure of the adapter
     *
     *  @since S60 v3.2
     *  @param aDDFObject   Reference to root object.
    */
    void DDFStructureL( MSmlDmDDFObject& aDDF );

    /**
     * The function creates new leaf objects, or replaces data in existing 
     * leaf objects. The information about the success of the command is
     * returned by calling SetStatusL function of MSmlDmCallback callback
     * interface. 
     *     
     * @since S60 v3.2
     * @param aURI         URI of the object
     * @param aLUID        LUID of the object 
     * @param aObject      Data of the object.
     * @param aType        MIME type of the object
     * @param aStatusRef   Reference to correct command, i.e. this reference
     *                     must be used when calling the SetStatusL of this 
     *                     command
    */
    void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID,
							const TDesC8& aObject, const TDesC8& aType,
							TInt aStatusRef );
    /**
     * The function deletes an object and its child objects. 
     *
     * @since S60 v3.2
     * @param aURI         URI of the object
     * @param aLUID        LUID of the object (if the adapter have earlier 
     *                     returned LUID to the DM Module).
     * @param aStatusRef   Reference to correct command, i.e. this reference 
     *                     must be used when calling the SetStatusL of this 
     *                     command.
    */
    void DeleteObjectL( const TDesC8& aURI, const TDesC8& aLUID,
						TInt aStatusRef );

    /**
     * The function fetches data of a leaf object. The SetStatusL is used
     * as described in UpdateLeafObjectL(). The data is returned by using the
     * SetResultsL function of MSmlCallback callback interface.
	 *
     * @since S60 v3.2
     * @param aURI             URI of the object
     * @param aLUID            LUID of the object (if the adapter have 
     *                         earlier returned LUID to the DM Module).   
     * @param aType            MIME type of the object
     * @param aResultsRef      Reference to correct results, i.e. this 
     *                         reference must be used when returning the 
     *                         result by calling the SetResultsL.
     * @param aStatusRef       Reference to correct command, i.e. this 
     *                         reference must be used when calling the 
     *                         SetStatusL of this command.
    */
    void FetchLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID,
						   const TDesC8& aType, TInt aResultsRef,
						   TInt aStatusRef );

    /**
     * The function fetches the size of the data of a leaf object. The size 
     * is in bytes, and must reflect the number of bytes that will be 
     * transferred when the framework calls FetchLeafObjectL. 
	 *
     * @since S60 v3.2
     * @param aURI             URI of the object
     * @param aLUID            LUID of the object (if the adapter have 
     *                         earlier returned LUID to the DM Module).   
     * @param aType            MIME type of the object
     * @param aResultsRef      Reference to correct results, i.e. this 
     *                         reference must be used when returning the 
     *                         result by calling the SetResultsL.
     * @param aStatusRef       Reference to correct command, i.e. this 
     *                         reference must be used when calling the 
     *                         SetStatusL of this command.
    */
    void FetchLeafObjectSizeL( const TDesC8& aURI, const TDesC8& aLUID,
							   const TDesC8& aType, TInt aResultsRef,
							   TInt aStatusRef );

    /**
     * The function fetches URI list. An adapter returns the list of URI 
     * segments under the given URI be separated by slash ("/"). The URI 
     * segment names for new objects must be given by the adapter.
     * The list is returned by calling the SetResultsL function of 
     * MSmlCallback callback interface. 
	 *
     * @since S60 v3.2
     * @param aParentURI               URI of the parent object
     * @param aParentLUID              LUID of the parent object (if the
     *                                 adapter have earlier returned LUID to
     *                                 the DM Module).   
     * @param aPreviousURISegmentList  URI list with mapping LUID 
     *                                 information, which is known by DM
     *                                 engine.  
     * @param aResultsRef              Reference to correct results, i.e. 
     *                                 this reference must be used when 
     *                                 returning the result by calling the 
     *                                 SetResultsL.
     * @param aStatusRef               Reference to correct command, i.e. 
     *                                 this reference must be used when 
     *                                 calling the SetStatusL of this 
     *                                 command.
    */
    void ChildURIListL( const TDesC8& aURI, const TDesC8& aLUID,
					    const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList,
					    TInt aResultsRef, TInt aStatusRef );

    /**
     * The function adds node object. 
     *
     * @since S60 v3.2
     * @param aURI             URI of the object
     * @param aParentLUID      LUID of the parent object (if the adapter have
     *                         earlier returned LUID to the DM Module).   
     * @param aStatusRef       Reference to correct command, i.e. this 
     *                         reference must be used when calling the 
     *                         SetStatusL of this command.
    */
    void AddNodeObjectL( const TDesC8& aURI, const TDesC8& aParentLUID,
						 TInt aStatusRef );
    /**
     * The adapter does not support streaming and no implementation is 
     * provided for this function.
     *
     * @since S60 v3.2
     * @param aURI         URI of the object
     * @param aLUID        LUID of the object
     * @param aStream      Data of the object. 
     * @param aType        MIME type of the object
     * @param aStatusRef   Reference to correct command, i.e. this reference
     *                     must be used when calling the SetStatusL of this
     *                     command.
    */
    void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID,
							RWriteStream*& aStream, const TDesC8& aType,
		 					TInt aStatusRef );
    /**
     * The adapter does not support execute command and does not 
     * provide implementation for this function. 
     *
     *  @since S60 v3.2
     * @param aURI             URI of the command
     * @param aLUID            LUID of the object
     * @param aArgument        Argument for the command
     * @param aType            MIME type of the object 
     * @param aStatusRef       Reference to correct command, i.e. this 
     *                         reference must be used when calling the 
     *                         SetStatusL of this command.
    */
    void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, 
                          const TDesC8& aArgument, const TDesC8& aType, 
                          TInt aStatusRef );
    /**
     * The adapter does not support execute command and does not 
     * provide implementation for this function. 
     *
     * @since S60 v3.2
     * @param aURI         URI of the command
     * @param aLUID            LUID of the object 
     * @param aStream      Argument for the command. 
     * @param aType            MIME type of the object 
     * @param aStatusRef       Reference to correct command, i.e. this 
     *                         reference must be used when calling the 
     *                         SetStatusL of this command.
    */
    void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID,
						  RWriteStream*& aStream, const TDesC8& aType,
						  TInt aStatusRef );
    /**
     * The adapter does not support copy command and does not 
     * provide implementation for this function. 
     *
     * @since S60 v3.2
     * @param aTargetURI       Target URI for the command
     * @param aSourceLUID      LUID of the target object 
     * @param aSourceURI       Source URI for the command
     * @param aSourceLUID      LUID of the source object 
     * @param aType            MIME type of the objects
     * @param aStatusRef       Reference to correct command, i.e. this 
     *                         reference must be used when calling the 
     *                         SetStatusL of this command.
    */
    void CopyCommandL( const TDesC8& aTargetURI, const TDesC8& aTargetLUID, 
                       const TDesC8& aSourceURI, const TDesC8& aSourceLUID, 
                       const TDesC8& aType, TInt aStatusRef );
    /**
     * Not supported
     *  @since S60 v3.2
    */
    void StartAtomicL();
    /**
     * Not Supported     
     *  @since S60 v3.2
     *
    */
    void CommitAtomicL();
    /**
 	 * Not supported.
     *  @since S60 v3.2
     */
    void RollbackAtomicL();
    /**
     * Returns EFalse as the adapter does not support streaming
     *
     * @since S60 v3.2
     * @param aItemSize size limit for stream usage
     * @return TBool EFalse as streaming is not supported
    */
    TBool StreamingSupport( TInt& aItemSize );
    /**
     * Not supported
     *
     *  @since S60 v3.2
    */  
    void StreamCommittedL();
    /**
     * The function tells the adapter that all the commands of the message 
     * that can be passed to the adapter have now been passed.  This 
     * indciates that the adapter must supply status codes and results to 
     * any buffered commands. This must be done at latest by the time this 
     * function returns. This function is used at the end of SyncML messages, 
     * and during processing of Atomic.  
     *
     *  @since S60 v3.2
    */
    void CompleteOutstandingCmdsL();
        
    /**
     * Converts integer to 8bit descriptor
     *
     *  @since S60 v3.2
     * @param    aLuid The integer to be converted
     * @return    The Integer as a descriptor
     */
    HBufC8* IntToDes8L( TInt aLuid) const;
    
    /**
     * Converts 8bit descriptor to integer
     *
     *  @since S60 v3.2
     * @param    aLuid The descriptor to be converted
     * @return    Integer value of the descriptor
     */
    TUint DesToIntL(const TDesC8& aLuid) const;


private:

     /**
     * Constructor
     */
    CNSmlDmAOAdapter();

    /**
     * Constructor
     * @param aDmCallback Callback object to the framework
     */
    CNSmlDmAOAdapter( MSmlDmCallback* aDmCallback );   

    /**
     * Second phase constructor
     */
    void ConstructL();
     
    /**
     * Parses the last URI segment from URI
     * @param    aURI The whole URI
     * @return    The last URI segment
     */
    TPtrC8 LastURISeg(const TDesC8& aURI) const; 


private: //data

    /**
     * Setting store object, which is called for managing settings 
     * in CommsDat. Own.
     */
     CNSmlDmAOSettingStore * iSettingStore;
        
    };


/**
 *  CSmlDmAOCommandElement 
 *
 * Helper class, which stores a single command for a VENDORCONFIG. 
 *  @lib nsmldmalwaysonadapter
 *  @since S60 v3.2
 */

class CSmlDmAOCommandElement : public CBase
    {

public:

    static CSmlDmAOCommandElement* NewLC( TBool aLeaf, 
                                          TInt aStatusRef, 
                                          TInt aResultRef, 
                                          CNSmlDmAOAdapter::TCommandType  aCmdType, 
                                          const TDesC8& aLastUriSeg, 
                                          const TDesC8& aData );

     ~CSmlDmAOCommandElement();

    /**
     * Returns the iExecuted member value of the object
     *
     * @since S60 v3.2
     * @return The iExecuted member value of the object
     */
    inline TBool Executed();

    /**
     * Sets the iExecuted member value of the object
     *
     * @since S60 v3.2
     * @param aExecuted Executed value for the object. 
     */    
    inline void SetExecuted( TBool aExecuted );
    
    /**
     * Returns the iStatus member value of the object
     *
     * @since S60 v3.2
     * @return The iStatus value of the object
     */
    inline CSmlDmAdapter::TError Status();
    
    /**
     * Sets the iStatus member value of the object
     *
     * @since S60 v3.2
     * @param aStatus Status value for the object. 
     */    
    inline void SetStatus( CSmlDmAdapter::TError aStatus ); 
    
    /**
     * Returns the iLeaf member value of the object
     *
     * @since S60 v3.2
     * @return The iLeaf member value of the object
     */
    inline TBool Leaf();
    
    /**
     * Returns the iStatusRef member value of the object
     *
     * @since S60 v3.2
     * @return The iStatusRef member value of the object
     */
    inline TInt StatusRef();
    
    /**
     * Returns the iResultRef member value of the object
     *
     * @since S60 v3.2
     * @return The iResultRef member value of the object
     */
    inline TInt ResultRef();
    
    /**
     * Returns the iCmdType member value of the object
     *
     * @since S60 v3.2
     * @return The iCmdType member value of the object
     */
    inline CNSmlDmAOAdapter::TCommandType  CmdType();        
    
    /**
     * Returns the iData member value of the object
     *
     * @since S60 v3.2
     * @return The iData member value of the object
     */
    inline const HBufC8* Data();
    
    /**
     * Returns the iLastUriSeg member value of the object
     *
     * @since S60 v3.2
     * @return The iLastUriSeg member value of the object
     */
    inline const HBufC8* LastUriSeg();
    
    /**
     * Sets the iData member value of the object
     *
     * @since S60 v3.2
     * @param aData Data set to the object. The data will be owned by 
     * the command object. 
     */    
    inline void SetData( HBufC8* aData );

private:

    CSmlDmAOCommandElement( TBool aLeaf, 
                            TInt aStatusRef, 
                            TInt aResultRef, 
                            CNSmlDmAOAdapter::TCommandType aCmdType );                              

    void ConstructL( const TDesC8& aLastUriSeg, const TDesC8& aData );   

    
private: //data

    /**
     * Has command been executed. 
     * Set to ETrue when command is executed.
     */
    TBool iExecuted;
    
    /**
     * The execution status of an exeuted command. 
     * Filled in when command is executed.
     */    
    CSmlDmAdapter::TError iStatus;
    
    
    /**
     * True if commend is for a leaf node, False if it is for a NAPDEF node.
     */    
    const TBool iLeaf;
    
    /**
     * Reference for returning the status to DM framework.
     */    
    const TInt iStatusRef;
    
    /**
     * Reference for returning result of Get command to the DM framework.
     */    
    const TInt iResultRef;
    
    /**
     * Type of command.
     */    
    const CNSmlDmAOAdapter::TCommandType  iCmdType;        
    

    /**
     * Data which is either ment to be stored to setting store 
     * or which has been fetched from there. 
     */
    HBufC8* iData;

    /**
     * Last segment in the command URI, which indicates the leaf node 
     * in question. For non leaf command empty string. 
     */    
    HBufC8* iLastUriSeg;

    };
    
#include "nsmldmalwaysonadapter.inl"    

#endif // NSMLDMALWAYSONADAPTER_H