simpleengine/presencedm/inc/presencedmadapter.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 15 Mar 2010 12:42:13 +0200
branchRCL_3
changeset 6 aca99fb8a3dd
parent 0 c8caa15ef882
permissions -rw-r--r--
Revision: 201009 Kit: 201010

/*
* Copyright (c) 2006 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:    OMA Presence Settings Device Management Adapter
*
*/




#ifndef __PRESDMADAPTER_H__
#define __PRESDMADAPTER_H__

// Non-local includes
#include <e32base.h>
#include <smldmadapter.h>
#include <pressettingsapi.h>

// LITERALS
_LIT8(KPresDMDDFVersion, "1.0");

_LIT8(KPresDMIdentifier, "org.openmobilealliance/1.0/PRESENCE");
_LIT8(KPresDMNodeName, "OMA_PRESENCE");

// OMA Presence DM leaves
_LIT8(KPresDMName, "NAME");
_LIT8(KPresDMProviderId, "PROVIDER-ID");
_LIT8(KPresDMClientObjDataLim, "CLIENT-OBJ-DATA-LIMIT");
_LIT8(KPresDMContentSrvUri, "CONTENT-SERVER-URI");
_LIT8(KPresDMSrcThPublish, "SOURCE-THROTTLE-PUBLISH");
_LIT8(KPresDMMaxPresSubs, "MAX-NUMBER-OF-PRESENCE-SUBSCRIPTIONS");
_LIT8(KPresDMMaxPresSubsInLists, "MAX-NUMBER-OF-SUBSCRIPTIONS-IN-PRESENCE-LIST");
_LIT8(KPresDMServiceUriTemp, "SERVICE-URI-TEMPLATE");

// For holding additional S60 Presence leaves
_LIT8(KPresDMToConRef, "ToConRef");
_LIT8(KPresDMConRef, "ConRef");

// S60 additional leaves
_LIT8(KPresDMSIPProfile, "SIP-PROFILE");
_LIT8(KPresDMXDMSet, "XDM-SET");

// Descriptions
_LIT8(KPresDMNodeNameDescription, "This interior node acts as a placeholder for one or more accounts for a fixed node" );
_LIT8(KPresDMNameDescription, "User displayable name for the presence enabler");
_LIT8(KPresDMProviderIdDescription, "An identifier for the Presence application service access point");
_LIT8(KPresDMClientObjDataLimDescription, "Limits the size of the MIME object data to the specified value in bytes when PUBLISH and NOTIFY methods are used in the presence client");
_LIT8(KPresDMContentSrvUriDescription, "Defines the HTTP URI of the content server to be used for content indirection");
_LIT8(KPresDMSrcThPublishDescription, "Defines the minimum time interval (in seconds) between two consecutive publications from a Presence source");
_LIT8(KPresDMMaxPresSubsDescription, "Limits the total number of presence subscriptions");
_LIT8(KPresDMMaxPresSubsInListsDescription, "Limits the number of back-end subscriptions allowed for presence list");
_LIT8(KPresDMServiceUriTempDescription, "Defines the syntax of the service URI, in the form of a URI Template as specified in XDM Core Specification [XDMSPEC] subclause C.1");

_LIT8(KPresDMToConRefDescription, "Refers to a collection of connectivity definitions" );
_LIT8(KPresDMConRefDescription, "Indicates the linkage to connectivity parameters" );

_LIT8(KPresDMSIPProfileDescription, "SIP profile used");
_LIT8(KPresDMXDMSetDescription, "XDM settings set used");

_LIT8(KPresDmDynamicDescription, "Placeholder for one or more connectivity parameters");


// other constants
_LIT8(KPresDMTextPlain, "text/plain" );
_LIT8(KPresDMSeparator, "/" );
_LIT( KPresDMOpenBrack,    "(" );
_LIT( KPresDMCloseBrack,   ")" );

_LIT8(KPresDMSipLinkPrefix, "./SIP");
_LIT8(KPresDMSipIdPrefix, "SIPId");

_LIT8(KPresDMSipDMNode, "SIP"); // as specified in OMA SIP
_LIT8(KPresDMXdmDMNode, "OMA_XDM"); // as specified in OMA XDM

// CONSTANTS
const TInt KPresDMLogBufferMaxSize    = 2000;
const TInt KPresDMDefaultResultSize = 255;
const TInt KPresDMLevel = 2;
const TInt KPresDMHexLength = 8;
const TUint8 KPresDMObjectSizeWidth = 4;
const TUint8 KPresDMSeparatorDef = 0x2f; // forward slash
const TInt KPresDMMaxIntLength = 10;     // max length of 32bit integer
const TInt KPresSipIdLinkLength = 19;

/**
* The main class of the OMA Presence DM adapter. Handles
* requests of fetching and updating settings sets and 
* settings items.
*
* @since S60 3.2
*/
class CPresenceDMAdapter : public CSmlDmAdapter
    {
    public:
    
        /**
        * Symbian first phase constructor
        *
        * @since S60 3.2
        * @param MSmlDmCallback* aDmCallback
        * @return pointer to newly created CPresenceDMAdapter
        */
        static CPresenceDMAdapter* NewL( MSmlDmCallback* aDmCallback );

        /**
        * Destructor
        */
        ~CPresenceDMAdapter();
        
        // Adapter interface from CSmlDmAdapter, see CSmlDmAdapter
        void DDFVersionL(CBufBase& aDDFVersion);
        void DDFStructureL(MSmlDmDDFObject& aDDF);
        void UpdateLeafObjectL(const TDesC8& aUri, const TDesC8& aLUID, 
                                const TDesC8& aObject, const TDesC8& aType, 
                                TInt aStatusRef);
        void DeleteObjectL(const TDesC8& aUri, const TDesC8& aLUID, 
                            const TInt aStatusRef); 
        void FetchLeafObjectL(const TDesC8& aUri, const TDesC8& aLUID, 
                               const TDesC8& aType, const TInt aResultsRef, 
                               const TInt aStatusRef); 
        void ChildURIListL(const TDesC8& aUri, const TDesC8& aLUID, 
                            const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList, 
                            const TInt aResultsRef, const TInt aStatusRef);
        void AddNodeObjectL(const TDesC8& aUri, const TDesC8& aParentLUID, 
                             const TInt aStatusRef);
        void UpdateLeafObjectL(const TDesC8& aUri, const TDesC8& aLUID, 
                                RWriteStream*& aStream, const TDesC8& aType, 
                                const TInt aStatusRef);
        void FetchLeafObjectSizeL(const TDesC8& aUri, const TDesC8& aLUID, 
                                   const TDesC8& aType, const TInt aResultsRef, 
                                   const TInt aStatusRef);
        void ExecuteCommandL(const TDesC8& aUri, const TDesC8& aLUID, 
                              const TDesC8& aArgument, const TDesC8& aType, 
                              const TInt aStatusRef);
        void ExecuteCommandL(const TDesC8& aUri, const TDesC8& aLUID, 
                              RWriteStream*& aStream, const TDesC8& aType, 
                              const TInt aStatusRef);
        void CopyCommandL(const TDesC8& aTargetURI, const TDesC8& aTargetLUID, 
                           const TDesC8& aSourceURI, const TDesC8& aSourceLUID, 
                           const TDesC8& aType, TInt aStatusRef);
        void StartAtomicL();
        void CommitAtomicL();
        void RollbackAtomicL();
        TBool StreamingSupport(TInt& aItemSize);
        void StreamCommittedL();
        void CompleteOutstandingCmdsL();

    private:

        /**
         * Default constructor
         *
         * @since S60 3.2
         * @param   aDmCallback Pointer to callback interface 
         */
        CPresenceDMAdapter( MSmlDmCallback* aDmCallback );

        /**
        * Fetches an object from the given uri
        *
        * @since S60 3.2
        * @param aUri Uri to the fetched object
        * @param aObject The result is inserted to this buffer
        * @return Error code
        */
        CSmlDmAdapter::TError FetchObjectL(const TDesC8& aUri, CBufBase& aObject);

        /**
        * Updates the parameters of given DDF node
        *
        * @since S60 3.2
        * @param aNode The node to update.
        * @param aAccTypes Access types of the node.
        * @param aOccurrence Occurrance of the node.
        * @param aScope Scope of the node.
        * @param aFormat Format of the node.
        * @param aDescription A description of the node.   
        */
        void FillNodeInfoL(MSmlDmDDFObject& aNode,TSmlDmAccessTypes aAccTypes,
                            MSmlDmDDFObject::TOccurence aOccurrence, 
                            MSmlDmDDFObject::TScope aScope, 
                            MSmlDmDDFObject::TDFFormat aFormat,
                            const TDesC8& aDescription);

        /**
        * Get property from settings storage
        *
        * @since S60 3.2
        * @param aSetId unique id of the settings set
        * @param aProperty type of asked property
        * @param aObject returns property value
        * @return CSmlDmAdapter::EOk if successfull
        */
        CSmlDmAdapter::TError GetPropertyL( TInt aSetId, 
                                            TPresSettingsProperty aProperty, 
                                            CBufBase& aObject );

        /**
        * Create/update settings property
        *
        * @since S60 3.2
        * @param aSetId unique id of the settings set
        * @param aProperty type of property
        * @param aObject property value
        * @return CSmlDmAdapter::EOk if successfull
        */
        CSmlDmAdapter::TError UpdatePropertyL( TInt aSetId, 
                                               TPresSettingsProperty aProperty, 
                                               const TDesC8& aObject );
        
        /**
        * Compares strings
        *
        * @since S60 3.2
        * @param aLeft first string
        * @param aRight second string
        * @return True if the strings are identical
        */
        TBool Match( const TDesC8& aLeft, const TDesC8& aRight );
        
        /**
        * Finds uri based on SIP id, updates result
        *
        * @since S60 3.2
        * @param aSipID SIP ID
        * @param aObject object to be updated
        * @return Ok or Error
        */
        CPresenceDMAdapter::TError GetConRefFromSipIDL( TInt aSipID,
                                               CBufBase& aObject );
                                               
        /**
        * Finds uri based on XDM id, updates result
        *
        * @since S60 3.2
        * @param aXdmID XDM ID
        * @param aObject object to be updated
        * @return Ok or Error
        */
        CPresenceDMAdapter::TError GetConRefFromXdmIDL( TInt aXdmID,
                                               CBufBase& aObject );
                                               
        /**
        * Find SIP id based on uri
        *
        * @since S60 3.2
        * @param aUri uri of the wanted object
        * @return SIP id or KErrNotFound
        */  
        TInt GetSipIdFromConRefL(const TDesC8& aUri );
        
        /**
        * Find XDM id based on uri
        *
        * @since S60 3.2
        * @param aUri uri of the wanted object
        * @return XDM id or KErrNotFound
        */  
        TInt GetXdmIdFromConRefL(const TDesC8& aUri );
        
        /**
        * Finds whether the given persence id is valid or not
        *
        * @since S60 3.2
        * @param aSetId presence id to check
        * @return ETrue if valid
        */  
        TBool IsPresIDValidL(TInt aSetId);
        
        /**
        * Check presence settings duplicate names, provides alternate name
        *  if necessary
        *
        * @since S60 3.2
        * @param aSetId presence id
        * @param aSetName presence set name needs to be checked, 
        *   alternate name returns here
        * @return none
        */  
        void CheckDuplicateNameL(TDes& aSetName, const TInt& aSetId);
        
        /**
        * sets the proper length of presence settings discriptor items,
        * give shorter descriptor if necessary
        *
        * @since S60 3.2
        * @param aValue presence settings descriptor item to be evaluated
        * @param aProp which property this descriptor belongs to.
        * @return ETrue if name is validated, EFalse if it cant be validated
        */  
        TBool SetProperLength(TPresSettingsProperty aProp, TPtr& aValue); 
        
        /** 
        * Checks if there is ordinal numbering at the end of
        * descriptor and rips it off if there is.
        *
        * @param aName pointer to source descriptor
        * @return HBufC* containing the name ready for the numbering
        */
        HBufC* GetPrefixL( HBufC* aName );
        
        /**
        * 8 bit descriptor to integer
        *
        * @since S60 3.2
        * @param aLuid Descriptor to convert
        * @return TInt converted integer
        */
        TInt DesToInt( const TDesC8& aLuid ) const;
        
        /**
        * Integer to 8 bit descriptor, leaves pointer to stack
        *
        * @since S60 3.2
        * @param aLuid Integer to convert
        * @return HBufC8* 8 bit heap pointer to descriptor
        */        
        HBufC8* IntToDes8LC( const TInt aLuid ) const;
        
        /**
        * Integer to 16 bit descriptor, leaves pointer to stack
        *
        * @since S60 3.2
        * @param aLuid Integer to convert
        * @return HBufC* 16 bit heap pointer to descriptor
        */        
        HBufC* IntToDesLC( const TInt aLuid ) const;
        
        /**
        * 16 bit descriptor to 8 bit descriptor, leaves pointer to stack
        *
        * @since S60 3.2
        * @param aSource 16 bit descriptor to convert
        * @return HBufC8* pointer to 8 bit heap descriptor
        */        
        HBufC8* ConvertLC(const TDesC& aSource) const;
        
        /**
        * 8 bit descriptor to 16 bit descriptor, leaves pointer to stack
        *
        * @since S60 3.2
        * @param aSource 8 bit descriptor to convert
        * @return HBufC* pointer to 16 bit heap descriptor
        */        
        HBufC* ConvertLC(const TDesC8& aSource) const;
        
    private: // Data
    
        /**
        * Settings ID of presence set which is in cache
        */
        TInt iGetSetID;
        
        /**
        * Presence set which is in cache
        */
        TPresSettingsSet iGetSet;

    };

#endif // __PRESDMADAPTER_H__

// End of File