sipplugins/sippdevmgmtsipadapter/inc/nsmldmsipadapter.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 14:39:54 +0300
changeset 35 a858c2cf6a45
parent 0 307788aac0a8
permissions -rw-r--r--
Revision: 201025 Kit: 2010127

/*
* Copyright (c) 2004-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:  Device Management SIP Settings Adapter
*
*/


#ifndef __NSMLDMSIPADAPTER_H__
#define __NSMLDMSIPADAPTER_H__

// INCLUDES
#include <smldmadapter.h>

// CLASS DECLARATION
class CSIPProfileRegistryObserver;
class CSIPManagedProfileRegistry;
class CSIPManagedProfile;

/**
*  CNSmlDmSIPAdapter
*  OMA DM Adapter for Nokia SIP.
*
*  @lib nsmldmsipadapter.lib
*  @since S60 3.0.
*/
class CNSmlDmSIPAdapter : public CSmlDmAdapter, 
                          public MSIPProfileRegistryObserver

    {
    public:

        static CNSmlDmSIPAdapter* NewL( MSmlDmCallback* aDmCallback );
        static CNSmlDmSIPAdapter* NewLC( MSmlDmCallback* aDmCallback );

        virtual ~CNSmlDmSIPAdapter();

    private:  // Functions from base classes

        /**
         * From base class MsmlDmAdapter
         * Returns DDF version of the adapter.
         *
         * @since S60 3.0.
         * @param aVersion for returning DDF version of adapter
         */
        void DDFVersionL( CBufBase& aDDFVersion );

        /**
         * From base class MsmlDmAdapter
         * Builds DDF structure of the adapter.
         *
         * @since S60 3.0.
         * @param aDDF for returning DDF structure of adapter
         */
        void DDFStructureL( MSmlDmDDFObject& aDDF );

        /**
         * From base class MsmlDmAdapter
         * Updates leaf object value.
         *
         * @since S60 3.0.
         * @param aURI       URI of the object.
         * @param aLUID      LUID of the object (if the adapter has earlier
         *                   returned a LUID to the DM Module). For new
         *                   objects, this is the LUID inherited through the
         *                   parent node.
         * @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, 
            const TInt aStatusRef );

        /**
         * From base class MsmlDmAdapter
         * Updates leaf object value. Not supported.
         *
         * @since S60 3.0.
         * @param aURI       URI of the object.
         * @param aLUID      LUID of the object (if the adapter has earlier
         *                   returned a LUID to the DM Module). For new
         *                   objects, this is the LUID inherited through the
         *                   parent node.
         * @param aStream    Data of the object. Adapter should create write
         *                   stream and return, when data is written to 
         *                   stream by DM agent, StreamCommittedL() is called
         *                   by DM engine.
         * @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 );

        /**
         * From base class MsmlDmAdapter
         * Deletes an object.
         * 
         * @since S60 3.0.
         * @param aURI       URI of the object.
         * @param aLUID      LUID of the object (if the adapter has 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, 
            const TInt aStatusRef );

        /**
         * From base class MsmlDmAdapter
         * Fetches a leaf object.
         *
         * @since S60 3.0.
         * @param aURI        URI of the object.
         * @param aLUID       LUID of the object (if the adapter has 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, 
            const TInt aResultsRef, 
            const TInt aStatusRef );

        /**
         * From base class MsmlDmAdapter
         * Lists all children of given URI.
         *
         * @since S60 3.0.
         * @param aParentURI  URI of the parent object.
         * @param aParentLUID LUID of the parent object (if the adapter has
         *                    earlier returned LUID to the DM Module).
         * @param aPreviousURISegmentList URI list with mapping LUID 
         *                    information, which is known by DM engine. An
         *                    adapter can use this information when verifying
         *                    if old objects still exists. An adapter also
         *                    knows what objects are new to DM engine and can
         *                    provide LUID mapping for them.
         *                    aPreviousURISegmentList parameter (see above)
         *                    helps to recognise new objects.
         * @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, 
            const TInt aResultsRef, 
            const TInt aStatusRef );

        /**
         * From base class MsmlDmAdapter
         * Adds a node.
         *
         * @since S60 3.0.
         * @param aURI        URI of the object.
         * @param aParentLUID LUID of the parent object (if the adapter has
         *                    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, 
            const TInt aStatusRef );

        /**
         * From base class MsmlDmAdapter
         * Executes command. Not supported.
         *
         * @since S60 3.0.
         * @param aURI       URI of the command.
         * @param aLUID      LUID of the object (if the adapter has earlier
         *                   returned LUID to the DM Module).
         * @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, 
            const TInt aStatusRef );

        /**
         * From base class MsmlDmAdapter
         * Executes command. Not supported.
         *
         * @since S60 3.0.
         * @param aURI       URI of the command.
         * @param aLUID      LUID of the object (if the adapter has earlier
         *                   returned LUID to the DM Module).
         * @param aStream    Argument for the command. Adapter should create
         *                   write stream and return, when data is written to
         *                   stream by DM agent, StreamCommittedL() is called
         *                   by DM engine.
         * @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, 
            const TInt aStatusRef );

        /**
         * From base class MsmlDmAdapter
         * Copies command. Not supported.
         *
         * @since S60 3.0.
         * @param aTargetURI  Target URI for the command.
         * @param aSourceLUID LUID of the target object (if one exists, and if
         *                    the adapter has earlier returned a LUID to the
         *                    DM Module).
         * @param aSourceURI  Source URI for the command.
         * @param aSourceLUID LUID of the source object (if the adapter has
         *                    earlier returned a LUID to the DM Module).
         * @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 );

        /**
         * From base class MsmlDmAdapter
         * Fetches the size of a leaf object.
         *
         * @since S60 3.0.
         * @param aURI        URI of the object.
         * @param aLUID       LUID of the object (if the adapter has 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 );

        /**
         * From base class MsmlDmAdapter
         *
         * @since S60 3.0.
         * 
         */     
        void StartAtomicL();

        /**
         * From base class MsmlDmAdapter
         *
         * @since S60 3.0.
         * 
         */
        void CommitAtomicL();

        /**
         * From base class MsmlDmAdapter
         *
         * @since S60 3.0.
         * 
         */
        void RollbackAtomicL();

        /**
         * From base class MsmlDmAdapter
         * @since S60 3.0.
         * @param aItemSize size limit for stream usage
         * @return TBool ETrue for streaming support
         * 
         */
        TBool StreamingSupport( TInt& aItemSize );

        /**
         * From MsmlDmAdapter
         *
         * @since S60 3.0.
         * 
         */
        void StreamCommittedL();

        /**
         * From MsmlDmAdapter
         *
         * @since S60 3.0.
         * 
         */
        void CompleteOutstandingCmdsL();

    private: 

        CNSmlDmSIPAdapter( TAny* aEcomArguments );
        void ConstructL();

        /**
         * Fetches an object and stores fetch result to aResult.
         *
         * @since S60 3.0.
         * @param aURI URI of the object to be fetched.
         * @param ALUID Local UID of the object to be fetched.
         * @param aResult Handle for storing fetch result.
         * @return DM status.
         */
        CSmlDmAdapter::TError FetchObjectL( const TDesC8& aURI, 
            const TDesC8& aLUID, 
            CBufBase& aResult );
    
        /**
         * From base class MSIPProfileRegistryObserver.
         * An event related to SIP Profile has occurred.
         *
         * @param aProfileId a profile Id
         * @param aEvent an occurred event
         */
        void ProfileRegistryEventOccurred( TUint32 aProfileId, 
            MSIPProfileRegistryObserver::TEvent aEvent);

        /**
         * From base class MSIPProfileRegistryObserver.
         * An asynchronous error has occurred related to SIP profile
         * Event is send to those observers, who have the
         * corresponding profile instantiated.
         *
         * @param aProfileId the id of failed profile 
         * @param aError an occurred error
         */
        void ProfileRegistryErrorOccurred( TUint32 aProfileId, TInt aError );

        /**
         * Loads SIP profile information
         * @since S60 3.0.
         */        
        void LoadProfilesL();

        /**
         * Converts descriptor to int.
         * @since Series 60 2.8
         * @param aDes descriptor to convert.
         * @return TInt. Converted value.
         */
        TInt DesToInt(const TDesC8& aDes );

        /**
         * Removes last uri segment from aURI
         * @since S60 3.0.
         * @param aDes Descriptor to handle
         * @return pointer to uri
         */        
        TPtrC8 RemoveLastURISeg( const TDesC8& aURI );

        /**
         * Gets number of uri segments.
         * @since S60 3.0.
         * @param aURI Descriptor to handle
         * @return TInt. Number of URI segments.
         */
        TInt NumOfURISegs( const TDesC8& aURI );

        /**
         * Find profile location from aURI
         * @since S60 3.0.
         * @param aURI Descriptor to look for
         * @return Profile ID location.
         */
        TInt FindHexProfile( const TDesC8& aURI );

        /**
         * Gets last uri segment.
         * @since S60 3.0.
         * @param aURI Descriptor to handle
         * @return Pointer to URI
         */
        TPtrC8 LastURISeg( const TDesC8& aURI );

        /**
         * Removes ./ from uri
         * @since S60 3.0.
         * @param aURI Descriptor to handle
         * @return pointer to uri
         */
        TPtrC8 RemoveDotSlash( const TDesC8& aURI );

        /**
         * Set conref value according to aObject
         * @since S60 3.0.
         * @param aObject URI to look from AP adapter
         * @return Access point ID number
         */    
        TInt SetConRefL( const TDesC8& aObject, const TInt& aProfileid );

        /**
         * Get Access Point URI reference from AP adapter
         * @since S60 3.0.
         * @param aObject Object to insert found URI.
         * @param aIapID IapID to look.
         */
        TBool GetConRefL( CBufBase& aObject, const TInt& aProfileId );

        /**
         * Check for duplicate providerName and rename if same
         * @since S60 3.0.
         * @param aProfile Profile to check.
         * @param aProfileId ProfileId to be skipped in check.
         */
        void CheckDuplicateNameL( CSIPManagedProfile& aProfile, 
                                  const TInt& aProfileId );

        /**
         * Get SNAP ID.
         * @since S60 3.2.
         * @param aUri URI from which to find SNAP ID.
         * @return SNAP ID.
         */
        TUint32 SnapIdL( const TDesC8& aUri );

        /**
         * Set SNAP URI.
         * @since S60 3.2.
         * @param aObject Object in which found URI is set.
         * @param aSnapId SNAP ID from which to find URI.
         * @return ETrue if successful, EFalse if not.
         */
        MSmlDmAdapter::TError GetSnapUriL( TDes8& aObject, TUint32 aSnapId );

        /**
         * Update method for OutboundProxy node.
         * @since S60 3.2.
         * @param aProfileId ID of the profile to be updated.
         * @param aUri URI of the object to be updated.
         * @param aObject Value to be updated.
         * @return DM status.
         */
        MSmlDmAdapter::TError UpdateOutboundProxyNodeL( TUint32 aProfileId, 
            const TDesC8& aUri, const TDesC8& aObject );

        /**
         * Update method for RegistrarServer node.
         * @since S60 3.2.
         * @param aProfileId ID of the profile to be updated.
         * @param aUri URI of the object to be updated.
         * @param aObject Value to be updated.
         * @return DM status.
         */
        MSmlDmAdapter::TError UpdateRegistrarServerNodeL( TUint32 aProfileId, 
            const TDesC8& aUri, const TDesC8& aObject );

        /**
         * Fetch method for OutboundProxy node.
         * @since S60 3.2.
         * @param aUri URI of the object to be fetched.
         * @param aLuid LUID of the object to be fetched.
         * @param aSegmentResult Fetch result object.
         * @return DM status.
         */
        MSmlDmAdapter::TError FetchOutboundProxyNodeL( TUint32 aProfileId,
            const TDesC8& aUri, TDes8& aSegmentResult );

        /**
         * Fetch method for RegistrarServer node.
         * @since S60 3.2.
         * @param aUri URI of the object to be fetched.
         * @param aLuid LUID of the object to be fetched.
         * @param aSegmentResult Fetch result object.
         * @return DM status.
         */
        MSmlDmAdapter::TError FetchRegistrarServerNodeL( TUint32 aProfileId,
            const TDesC8& aUri, TDes8& aSegmentResult );

    private:     // Data

        /**
         * Handle for returning data to DM module.
         * Own.
         */
        MSmlDmCallback* iDmCallback;

        /**
         * Object for handling SIP profile settings.
         * Own.
         */
        CSIPManagedProfileRegistry* iSIPManagedProfileRegistry;

        /**
         * Array of pointers to all loaded SIP profiles.
         * Own.
         */
        CArrayPtrFlat<CSIPManagedProfile>* iProfiles;

        /**
         * Status of DM module.
         */
        TInt iStatus;

        /**
         * Array for knowing if there are modifications to profiles in memory.
         */
        RArray<TInt> iModifications;

        /**
         * Handle for returning results to dm-module.
         * Own.
         */
        CBufBase *iResults;

		private:    // Friend classes     

    	#ifdef TEST_EUNIT
    	public:
        	friend class UT_CNSmlDmSIPAdapter;
    	#endif
    };

#endif // __NSMLDMSIPADAPTER_H__