syncmlfw/dm/hostserver/dmhostserverbase/inc/nsmldmhostsession.h
changeset 0 b497e44ab2fc
child 2 5594fba90824
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/dm/hostserver/dmhostserverbase/inc/nsmldmhostsession.h	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,691 @@
+/*
+* 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:  Handles the communication with DM Tree Module (client). 
+* 				 Transfers adapter commands to DM Plug In Adapters.
+*
+*/
+
+
+#ifndef __NSMLDMHOSTSERVERSESSION_H__
+#define __NSMLDMHOSTSERVERSESSION_H__
+
+// ------------------------------------------------------------------------------------------------
+// Includes
+// ------------------------------------------------------------------------------------------------
+#include <e32base.h>
+#include <ecom.h>
+#include <smldmadapter.h>
+#include "nsmldmclientandserver.h"
+#include "nsmldmtreedtd.h"
+#include "nsmldmcmdarghandler.h"
+#include <nsmldmtreedbclient.h>
+
+// ------------------------------------------------------------------------------------------------
+// Data fórmats
+// ------------------------------------------------------------------------------------------------
+	
+struct TNSmlDmAdapter
+	{
+	CSmlDmAdapter* adapterPtr;
+	TUint32 adapterId;
+	TBool startAtomicCalled;
+	TBool commandsCalled;
+	TInt streamingLimit;
+	};	
+
+struct TNSmlDmCallbackRef
+	{
+	TNSmlDmHostCallbackType callBack;
+	TInt reference;
+	};
+
+struct TNSmlDmWriteStream
+	{
+    RWriteStream* streamPtr;
+	TUint32 adapterId;
+	};
+	
+
+// ------------------------------------------------------------------------------------------------
+// Class forwards
+// ------------------------------------------------------------------------------------------------
+class CNSmlDMHostServer;
+
+
+/**
+* Class CNSmlDMHostSession. Handles communication with the DM TreeModule (client).
+* Transfers adapter commands to DM Plug In Adapters.
+*
+* @lib nsmldmhostserver.lib
+*/
+class CNSmlDMHostSession : public CSession2, public MSmlDmCallback
+	{
+public:
+	enum TNSmlDmResultAnalysis
+		{
+		ENSmlDmAllWillFit = 0,
+		ENSmlDmSomeWillFit,
+		ENSmlDmStreamed,
+		ENSmlDmLargeDoesntFit
+		};
+		
+	/**
+	* Creates a new session object.
+	* @param aServer. Reference to server is needed in order to increase and decrease session counts.
+	* @return CNSmlDMHostSession*. New instance of this class.
+	*/
+	static CNSmlDMHostSession* NewL ( CNSmlDMHostServer& aServer );
+	
+	/**
+	* Handles the servicing of client requests.
+	*  Entry point for arriving messages.
+	* @param aMessage. An object which encapsulates a client request.
+	*/
+	void ServiceL ( const RMessage2 &aMessage );
+
+	/**
+	* Extracts the operation code from the message. 
+	*  Based on that calls the right private function.
+	* @param aMessage. An object which encapsulates a client request.
+	*/
+	void DispatchMessageL ( const RMessage2 &aMessage );
+
+
+	/**
+	* MSmlDmCallback - callback interface.
+ 	*  For returning fetch results from dm plug-in adapters.
+	* @param aResultsRef. Reference to correct command.
+	* @param aObject. The data which should be returned.
+	* @param aType. MIME type of the object.
+	*/
+	void SetResultsL ( TInt aResultsRef, CBufBase& aObject, const TDesC8& aType );
+
+	/**
+	* MSmlDmCallback - callback interface.
+ 	*  For returning fetch results from dm plug-in adapters (using streaming).
+	* @param aResultsRef. Reference to correct command.
+	* @param aStream. Large data which should be returned.
+	* @param aType. MIME type of the object.
+	*/
+	void SetResultsL ( TInt aResultsRef, RReadStream*& aStream, const TDesC8& aType );
+
+	/**
+	* MSmlDmCallback - callback interface.
+ 	*  For returning statuses for dm adapter commands.
+	* @param aStatusRef. Reference to correct command.
+	* @param aErrorCode. Information about the command success.
+	*/
+	void SetStatusL ( TInt aStatusRef, MSmlDmAdapter::TError aErrorCode );
+
+	/**
+	* MSmlDmCallback - callback interface.
+ 	*  This function is called for a new management object, 
+ 	*  both for node objects and for leaf objects by dm adapter.
+	* @param aURI	URI of the object. 
+	* @param aLUID	Typically this is ID for the database table.
+	*/
+	void SetMappingL ( const TDesC8& aURI, const TDesC8& aLUID );
+
+	/**
+	* MSmlDmCallback - callback interface.
+ 	*  The function is used to make a fetch to other adapters. 
+	* @param aURI. URI of the object. 
+	* @param aData. Reference to data, i.e. data is returned here
+	* @param aStatus. The status of fetch command is returned here
+	*/
+	void FetchLinkL ( const TDesC8& aURI, CBufBase& aData, MSmlDmAdapter::TError& aStatus );
+	
+	/**
+	* MSmlDmCallback - callback interface.
+ 	*  The function returns the LUID which is mapped to aURI. 
+	* @param aURI. URI of the object. 
+	* @return HBufC8*. If LUID is not found, the function allocates a null length string.
+	*/	
+	HBufC8* GetLuidAllocL ( const TDesC8& aURI );
+
+	/**
+	* C++ destructor.
+	*/
+	~CNSmlDMHostSession();	
+
+private:
+
+	/**        
+	* Symbian 2nd phase constructor
+	*/
+	void ConstructL();
+	
+	/**
+	* C++ constructor.
+	* @param aServer. The server instance, owner of session.
+	*/
+	CNSmlDMHostSession ( CNSmlDMHostServer& aServer);
+    
+	/**
+	* Panics the client
+	* @param aMessage. Message from client to panic.
+	* @param aReason. Reason code.
+	*/
+    void PanicClient ( const RMessage2& aMessage, TInt aReason ) const;
+
+	/**
+	* Empty function.
+	*  Kept here for possible future needs. 
+	*  Freeing of resources is done in the destructor.
+	*/
+    void CloseSessionL() const;
+ 
+
+	/**
+	* Gets DDF structure from the dm adapters.
+	*  aMessage parameter contains a list of adapters which are already loaded.
+	*  Writes the combined DDF structure to the chunk in the WBXML format.
+	*  Returns also a checksum of the DDF structure to the client. 
+	* @param aMessage. A list of already loaded adapters, and place for checksum.
+	*/
+    void GetDDFStructureL ( const RMessage2& aMessage );
+
+	/**
+	* Auxiliary function called by GetDDFStructureL.
+	*  Reads the UIDs of the loaded adapters from the message, 
+	*  and stores those to internal list. 
+	* @param aMessage. An object which encapsulates a client request.
+	* @param aUids. A reference parameter, a place for extracted list of UIDs.
+	*/
+    void ReadUidsL ( const RMessage2& aMessage, RArray<TUint32>& aUids ) const;
+
+	/**
+	* Auxiliary function called by GetDDFStructureL.
+	*  Gets a list of all the potential dm adapters.
+	*  Removes from it those which are alreay loaded.  
+	* @param aAllAds. A reference parameter, after this function call 
+	*                 contains the acceptable adapters.
+	* @param aUids. A list of adapters which are already loaded.
+	*/
+	void RemoveAlreadyLoadedL ( RImplInfoPtrArray& aAllAds, RArray<TUint32>& aUids ) const;    
+
+	/**
+	* Auxiliary function called by GetDDFStructureL.
+	*  Asks initial information from the loaded dm adapter.
+	*  E.g. whether the adapter supports streaming or not.
+	* @param aAdapter. A pointer to the just loaded dm plug-in adapter. 
+	* @param aVersions. A list of DDF versions collected from the adapters. 
+	* @param aUids. A list of adapter UIDs. Note that aVersions and aUids
+	*               are always ordered to ascending order in order to prevent
+	*               a checksum to change value if ECom framework gives a list
+	*				of potential plug-in adapters in different order.
+	* @param aAdapterId. Identifier of the dm plug-in adapter.
+	*/
+	void AskInfoFromAdapterL ( CSmlDmAdapter* aAdapter, RPointerArray<HBufC8>& aVersions, RArray<TInt32>& aUids, TInt32 aAdapterId );
+    
+	/**
+	* Auxiliary function called by GetDDFStructureL.
+	*  Writes a combined DDF stucture to the chunk using DM Utils services.
+	*/
+    void WriteTreeToChunkL();
+
+	/**
+	* Auxiliary function called by GetDDFStructureL.
+	*  Calculates a CCITT CRC checksum from the collected DDF versions and adapter UIDs 
+	* @param aVersions. A collected list from adapters containing versions of the DDF structure. 
+	* @param aUids. A list of adapter UIDs. 
+	* @return TUint16. Calculated checksum value.
+	*/
+    TUint16 CalcCheckSumL ( RPointerArray<HBufC8>& aVersions, RArray<TInt32>& aUids ) const;
+ 
+
+	/**
+	* Common function for handling UpdateLeafObject and Execute DM commands.
+	*  Reads parameters from the chunk.
+	*  Loads the requested adapter if this is a first command to it in this session.
+	*  Checks the need to inform adapter at atomic command situation.
+	*  Decides whether or not use streaming for passing data to dm plug-in adapter.
+	*  Informs the client (DM Tree Module) if there are unread statuses, results or mappings.
+	* @param aMessage. An object which encapsulates a client request. 
+	* @param aCommand. Needed to choose between Update and Execute commands. 
+	*/
+    void UpdateLeafOrExecuteL ( const RMessage2& aMessage, TNSmlDmHostOperationCodes aCommand );
+
+	/**
+	* Common function for handling UpdateLeafObject and Execute DM commands for large objects.
+	*  Reads parameters from the chunk.
+	*  Loads the requested adapter if this is a first command to it in this session.
+	*  Checks the need to inform adapter at atomic command situation.
+	*  Decides whether or not use streaming for passing data to dm plug-in adapter.
+	*  In case this is last package of the large object, closes and commits stream,
+	*  provided streaming was used for passing a data.
+	*  Informs the client (DM Tree Module) if there are unread statuses, results or mappings.
+	* @param aMessage. An object which encapsulates a client request. 
+	* @param aCommand. Needed to choose between Update and Execute commands. 
+	*/
+    void UpdateLeafOrExecuteLargeL ( const RMessage2& aMessage, TNSmlDmHostOperationCodes aCommand );
+
+	/**
+	* Auxiliary function of UpdateLeafOrExecuteLargeL.
+	*  Provided the dm plug-in adapter doesn't support streaming, this function
+	*  takes care of appending large object piece by piece.
+	*  When the last package arrives, calls the adapter and gives the built-up 
+	*  large object as a parameter.
+	* @param aMessage. An object which encapsulates a client request. 
+	* @param aAdIndex. Identifies the assigned adapter. 
+	* @param aCommand. Needed to choose between Update and Execute commands. 
+	*/
+    void UpdateOrExecuteLargeNoStreamL ( const RMessage2& aMessage, TInt aAdIndex, TNSmlDmHostOperationCodes aCommand );
+
+	/**
+	* Common function for handling Add Interior Node, Copy Node, or Delete Object DM commands.
+	*  Reads parameters from the chunk.
+	*  Loads the requested adapter if this is a first command to it in this session.
+	*  Checks the need to inform adapter at atomic command situation.
+	*  Informs the client (DM Tree Module) if there are unread statuses, results or mappings.
+	* @param aMessage. An object which encapsulates a client request. 
+	* @param aCommand. Needed to choose between Add, Copy, and Delete commands. 
+	*/
+    void AddCopyOrDeleteL ( const RMessage2& aMessage, TNSmlDmHostOperationCodes aCommand );
+
+	/**
+	* Common function for handling Fetch Leaf Object, Get Child URI List, or Fetch Leaf Object Size 
+	* DM commands.
+	*  Reads parameters from the chunk.
+	*  Loads the requested adapter if this is a first command to it in this session.
+	*  Checks the need to inform adapter at atomic command situation.
+	*  Informs the client (DM Tree Module) if there are unread statuses, results or mappings.
+	* @param aMessage. An object which encapsulates a client request. 
+	* @param aCommand. Needed to choose between Fetch, Get Child URI List, and Fetch Size commands. 
+	*/
+	void FetchLeafChildUrisOrSizeL ( const RMessage2& aMessage, TNSmlDmHostOperationCodes aCommand );
+
+	/**
+	* Called only from other DM Host Servers when they need to cross-reference AP -adapter. 
+	*  Loads the AP dm plug in adapter (i.e. Internet adapter).
+	*  Asks the DDF structure from the AP adapter.
+	*  Checks that the given URI is found from the DDF structure.
+	*  If the above actions are successful, calls the Fetch Leaf Object or Get Child URI List 
+	*  commands of AP adapter.
+	*  Writes the returned result to the chunk.
+	* @param aMessage. An object which encapsulates a client (other DM Host Server in this case) request. 
+	*/
+	void FetchLinkL ( const RMessage2& aMessage );
+
+
+	/**
+	* Sets a general atomic command state. 
+	*  When this state is set, StartAtomicL function of the adapters
+	*  is called when the first 'normal' command arrives.
+	*  In addition informs the client (DM Tree Module) if there are unread statuses, results or mappings.
+	* @param aMessage. An object which encapsulates a client request. 
+	*/
+   	void StartAtomicL ( const RMessage2& aMessage );
+
+	/**
+	* Resets the general atomic command state (When atomic commands were successful). 
+	*  This command is forwarded only to those adapters which have received StartAtomicL call.
+	*  In addition informs the client (DM Tree Module) if there are unread statuses, results or mappings.
+	* @param aMessage. An object which encapsulates a client request. 
+	*/
+   	void CommitAtomicL ( const RMessage2& aMessage );
+
+	/**
+	* Resets the general atomic command state (When one or more atomic commands failed). 
+	*  This command is forwarded only to those adapters which have received StartAtomicL call.
+	*  In addition informs the client (DM Tree Module) if there are unread statuses, results or mappings.
+	* @param aMessage. An object which encapsulates a client request. 
+	*/
+   	void RollbackAtomicL ( const RMessage2& aMessage );
+
+	/**
+	* Calls CompleteOutstandingCmdsL -function of the DM plug-in adapters.
+	*  This command is issued only to those adapters which have received some adapter 
+	*  commands during the session.
+	*  In addition informs the client (DM Tree Module) if there are unread statuses, results or mappings.
+	* @param aMessage. An object which encapsulates a client request. 
+	*/
+   	void CompleteCommandsL ( const RMessage2& aMessage );
+
+	/**
+	* Sets a handle to the global memory chunk. 
+	*  The chunk is a common data area between the client (DM Tree Module) and the server
+	*  (DM Host Server).
+	*  Additionally, a server id is sent in the message.
+	*  This id tells to the (common) session class which server session is serving.  
+	* @param aMessage. An object which encapsulates a client request. 
+	*/
+    void SetChunkHandleL ( const RMessage2& aMessage );
+
+
+	/**
+	* Gets the URI / Luid mappings which have been received from the dm adapters 
+	*  via callback function calls. 
+	*  These mappings are buffered by the session class, and - during this call,
+	*  all written to the chunk at once.
+	*  Additionally informs the client (DM Tree Module) if there are also unread statuses or results.
+	* @param aMessage. An object which encapsulates a client request. 
+	*/
+   	void GetMappingsL ( const RMessage2& aMessage ); 
+
+	/**
+	* Gets the DM command statuses received from the dm adapters via callback function calls. 
+	*  These statuse are buffered by the session class, and - during this call,
+	*  all written to the chunk at once.
+	*  Additionally informs the client (DM Tree Module) if there are also unread mappings or results.
+	* @param aMessage. An object which encapsulates a client request. 
+	*/
+   	void GetStatusesL ( const RMessage2& aMessage ); 
+
+	/**
+	* Gets the DM command results received from the dm adapters via callback function calls.
+	*  In practice, these are the results from the 'FetchLeafObject', 'FecthLeafObjectSize', 
+	*  and 'GetChildURIList' commands.
+	*  The results are all written to the chunk at once if they just fit there.
+	*  In case of large objects the result item is cut into pieces by writing one 'chunkfull' at time.
+	*  Informs the client (DM Tree Module) if the result is cut up and needs thus additional 
+	*  GetResultsL -function calls. Additionally, informs the client if there are unread mappings 
+	*  or statuses.
+	* @param aMessage. An object which encapsulates a client request. 
+	*/
+   	void GetResultsL ( const RMessage2& aMessage ); 
+   	
+
+	/**
+	* Auxiliary function called by the command handling functions (e.g. AddCopyOrDeleteL).
+	*  Loads the ECom plug-in Dm Adapter.
+	*  The adapter is identified with the given implementation UID.
+	* @param aIndex. A place in the internal list where the adpater pointer is stored. 
+	* @param aAdapterId. The implementation UID of the requested DM adapter. 
+	* @return CSmlDmAdapter*. New instance of the ECom plug-in DM adapter.
+	*/
+   	CSmlDmAdapter* LoadNewAdapterL ( TInt aIndex, TUint32 aAdapterId );
+
+	/**
+	* Auxiliary function called by the command handling functions (e.g. UpdateLeafOrExecuteL).
+	*  Reads the DM command parameters from the message and from the chunk.
+	*  Utilizes the DM Utils services for parsing data in the chunk.
+	* @param aMessage. An object which encapsulates a client request. 
+	*/
+   	void ReadCmdParamsL ( const RMessage2& aMessage );
+
+	/**
+	* Auxiliary function called by the FetchLeafChildUrisOrSizeL.
+	*  Reads the DM command parameters from the message and from the chunk.
+	*  Utilizes the DM Utils services for parsing data in the chunk.
+	* @param aMessage. An object which encapsulates a client request. 
+	* @param aPreviousLuids. A reference parameter, needed for freeing the reserved 
+	*                        heap memory when the luids can be destroyed. 
+	*/
+   	void ReadCmdFetchParamsL ( const RMessage2& aMessage, RPointerArray<HBufC8>& aPreviousLuids );
+
+	/**
+	* Auxiliary function called by the AddCopyOrDeleteL.
+	*  Reads the DM command parameters from the message and from the chunk.
+	*  Utilizes the DM Utils services for parsing data in the chunk.
+	* @param aMessage. An object which encapsulates a client request. 
+	*/
+   	void ReadCopyCmdParamsL ( const RMessage2& aMessage );
+    
+	/**
+	* Auxiliary function for deleting previous set of DM command parameters.
+	*/
+    void DeletePrevParams();
+
+	/**
+	* Auxiliary function called by the UpdateLeafOrExecuteLargeL.
+	*  Checks that the arrived command is not to different adapter,
+	*  during the large object update to the other. 
+	*/
+    void CheckIfCorrectAdapterL() const;
+
+	/**
+	* Auxiliary function called by the the command handling functions, 
+	* when the streaming is not used.
+	*  Calls the chosen DM adapter function of the given adapter.
+	*  The function parameters are set from the internal member variables.
+	* @param aCommand. Identifies the chosen adapter command. 
+	* @param aAdIndex. Identifies the chosen DM plug-in adapter. 
+	* @param aLargeObject. If the data is a large object, a different 
+	*                      internal variable is chosen. 
+	*/
+    void CallAdapterCommandL ( TNSmlDmHostOperationCodes aCommand, TInt aAdIndex, TBool aLargeObject = EFalse );
+
+	/**
+	* Auxiliary function called by the the command handling functions, 
+	* when the streaming is used.
+	*  Calls the chosen DM adapter function of the given adapter.
+	*  The function parameters are set from the internal member variables.
+	* @param aCommand. Identifies the chosen adapter command. 
+	* @param aAdIndex. Identifies the chosen DM plug-in adapter. 
+	* @param aWriteStream. A reference parameter. The adapter sets this parameter to point
+	*                      to the correct place. 
+	*/
+    void CallAdapterCommandL ( TNSmlDmHostOperationCodes aCommand, TInt aAdIndex, RWriteStream*& aWriteStream );
+
+	/**
+	* Serves the FetchLink callback when the AP adapter is not found from the server.
+	*  Issues an IPC -FetchLink command to the other DM Host Server 
+	*  using RNSmlDMFetchLink -client API.
+	* @param aURI. A path to the requested interior node object or leaf object. 
+	* @param aData. A reference parameter, i.e. a place for fetch result. 
+	* @param aStatus. A reference parameter telling the command success (e.g. EOk or ENotFound).
+	*/
+    void FetchLinkViaIPCL ( const TDesC8& aURI, CBufBase& aData, MSmlDmAdapter::TError& aStatus ) const;
+
+	/**
+	* Serves the FetchLink callback when the AP adapter is owned this server.
+	*  Asks first a luid from the callback server.
+	*  Calls FetchLeafObjectL -function of the DM adapter if the requested object is a leaf. 
+	*  Calls ChildURIListL -function of the DM adapter if the requested object is an interior node. 
+	* @param aURI. A path to the requested interior node object or leaf object. 
+	* @param aAdapterId. Identifies the requested adapter. 
+	* @param aData. A reference parameter, i.e. a place for fetch result. 
+	* @param aStatus. A reference parameter telling the command success (e.g. EOk or ENotFound).
+	* @param aNodeType. Defines whether the object is a leaf or a node.
+	*/
+    void FetchLinkFromAdapterL ( const TDesC8& aURI, TUint32 aAdapterId, CBufBase& aData, MSmlDmAdapter::TError& aStatus, TNSmlDmDDFFormat aNodeType );
+
+	/**
+	* Checks if the given URI can be found from the combined DDF structure.
+	*  If not, most probably the URI belongs to some other DM adapter which this server
+	*  is not capable of loading.  
+	* @param aURI. A path to the requested interior node object or leaf object. 
+	* @param aAdapterId. A reference parameter, to which DM Utils service writes the implementation
+	*                    UID of the adapter - if the URI was found. 
+	* @param aNodeType. A reference parameter defining whether the object is a leaf or a node.
+	* @return TBool. ETrue if both the URI and the adapter id were found, EFalse otherwise.
+	*/
+	TBool AdapterIdFromUriL ( const TDesC8& aURI, TUint32& aAdapterId, TNSmlDmDDFFormat& aNodeType );
+
+	/**
+	* Auxiliary function which is called from FetchLinkFromAdapterL.
+	*  Gets a previous URI segment list from the callback server. 
+	*  This function is called only during the fetchlink callback and when
+	*  the requested object is an interior node object.
+	* @param aAdapterId. Identifies the requested adapter. 
+	* @param aURI. A path to the requested interior node object. 
+	* @param aURISegList. A reference parameter where callback server writes a list of the child nodes.
+	*/
+	void PrevURISegListL ( TUint32 aAdapterId, const TDesC8& aURI, CArrayFixFlat<TSmlDmMappingInfo>& aURISegList );
+
+	/**
+	* Auxiliary function for calculating how much memory does one particular result item reserve.
+	*  This function is called from AnalyzeResultList. 
+	* @param aIndex. The place of the item in the internal result list.
+	* @return TInt. Needed memory area in bytes for the given result item.
+	*/
+	inline TInt ResultItemSize ( TInt aIndex );
+
+	/**
+	* Auxiliary function for calculating how much memory do the mappings need.
+	*  This function is called from GetMappingsL in order to adjust the chunk 
+	*  to adequate size before the mappings are written to the chunk. 
+	* @return TInt. Needed memory area in bytes for all the unread mappings.
+	*/
+	TInt SizeOfMappings();
+
+	/**
+	* Auxiliary function for calculating how much memory do the arrived statuse need.
+	*  This function is called from GetStatusesL in order to adjust the chunk 
+	*  to adequate size before the statuses are written to the chunk. 
+	* @return TInt. Needed memory area in bytes for all the unread statuses.
+	*/
+	TInt SizeOfStatuses() const;
+
+	/**
+	* Auxiliary function called by GetResultsL.
+	*  This function analyzes whether all the results will fit into the chunk
+	*  or not. 
+	* @param aOkToWrite. A reference parameter which is used only in case of
+	*                    'some will fit' for telling how many results can be
+	*                    written at once.
+	* @param aAdjustChunkSize. A reference parameter for adjusting the chunk to 
+	*					       adequate size before writing takes place.
+	* @return TNSmlDmResultAnalysis. Possible return values are: 1) 'all will fit',
+	*                                2) 'some will fit', 3) 'large object (streamed) -
+	*								 won't fit', and 4) 'large object (not streamed)
+	*								 - won't fit'.
+	*/
+	TNSmlDmResultAnalysis AnalyzeResultList ( TInt& aOkToWrite, TInt& aAdjustChunkSize );
+
+	/**
+	* Auxiliary function for removing the 'read' results from the internal list.
+	*  This function is called from GetResultsL after some (or all) results 
+	*  are written to the chunk. 
+	* @param aNumber. The number of the results which are needed to be 
+	*				  removed from the internal list.
+	*/
+	void RemoveResultCallbacksL ( TInt aNumber );
+
+	/**
+	* Auxiliary function for defining how much there is room in the chunk for actual
+	* data of the large object.
+	* @param aType. MIME type of the result item.
+	* @return TInt. The available size in bytes.
+	*/
+	inline TInt RoomForLargeData ( const TDesC8& aType ) const;
+	
+	// FOTA
+	/**
+	* This function is called only for the FOTA adapter.
+	*  Makes a request for the FOTA adapter to mark generic alerts sent.
+	*  In other words, the written generic alerts are issued without
+	*  errors to the remote server.
+	*/
+	void MarkGenAlertsSentL();
+	// FOTA end
+	
+	/**
+	* This function is called any adapter for marking GA sent
+	*  Makes a request for the required adapter to mark generic alerts sent.
+	*  In other words, the written generic alerts are issued without
+	*  errors to the remote server.
+	*/
+	void MarkGenAlertsSentL(const RMessage2& aMessage);
+	
+	/**
+	* This function is called for getting the accesspoint implementation uid
+	*/
+	TUint GetAccessPointImplUid();
+
+private:
+    struct TNSmlDmStreamCommitStatus
+    	{
+       	TBool iStreamingOngoing;
+    	TInt iOldStatusRef;
+    	TInt iNewStatusRef;
+       	TBool iStreamCommitted;
+    	};
+	CNSmlDMHostServer& iServer;
+	CNSmlDmMgmtTree* iMgmtTree;	
+    RChunk iChunk;
+    RArray<TNSmlDmStatusElement> iStatusCodeList;
+    RPointerArray<CNSmlDmResultElement> iResultList;
+    CArrayPtrSeg<HBufC8>* iMapUris;
+    CArrayPtrSeg<HBufC8>* iMapLuids;
+    RArray<TNSmlDmAdapter> iAdapters;
+    RArray<TNSmlDmCallbackRef> iCallbackList;
+    TBool iStartAtomic;
+	TNSmlDmWriteStream iLargeWriteStream;
+    HBufC8* iLargeObject;
+    HBufC* iSemaphoreName;
+    TBool iFetchLinkResult;
+    HBufC8* iResultOtherAdapter;
+    MSmlDmAdapter::TError iStatusOtherAdapter;
+    TBool iCbSessConnected;
+	RNSmlDMCallbackSession iCbSession;
+	RReadStream* iResultReadStream;
+	TInt iResultOffset;
+	TInt iOwnId;
+    
+	TUint32 iAdapterId;
+	TInt32 iStatusRef;
+	TInt32 iResultRef;
+	HBufC8* iLuid;
+	HBufC8* iUri;
+	HBufC8* iData;
+	HBufC8* iType;
+	HBufC8* iTargetLuid;
+	HBufC8* iTargetURI;	
+    CArrayFixFlat<TSmlDmMappingInfo>* iPrevSegURIList;
+    TNSmlDmStreamCommitStatus iCommitStatus;
+	};
+
+
+/**
+* Class RNSmlDMFetchLink. 
+* Simple client for connecting to other DM Host Servers. 
+* During FetchLink callback.
+*
+* @lib nsmldmhostserver.lib
+*/
+
+class RNSmlDMFetchLink : public RSessionBase
+	{
+public:
+
+	/**
+	* C++ constructor.
+	*/
+	RNSmlDMFetchLink();
+
+	/**
+	* Creates a session (i.e. a connection) to the other DM Host Server.
+	* @param aServer. The server name (e.g. "nsmldmhostserver2").	
+	*/
+	void OpenL ( const TDesC& aServer );
+
+	/**
+	* Sets a handle to the global memory chunk. 
+	*  The client DM Host Server will send a handle of the already existing chunk.
+	*  In other words, no new chunks are created for the FetchLink IPC command. 
+	*  Additionally, a server id is sent in the message.
+	*  This id tells to the common session class that it is acting as a 'FetchLink server'.
+	*  This information is needed in order to avoid destroying the chunk still in use.
+	* @param aHandle. A handle to the existing global memory chunk. 
+	*/
+	void SendChunkHandleL ( const RChunk& aChunk ) const;
+
+	/**
+	* Issues a fetch IPC command to the other DM Host Server.  
+	* @param aURI. A path to the requested interior node object or the leaf object. 
+	* @param aReadStream. A reference to the stream in the chunk from where the result
+	*					  can be read. 
+	* @return HBufC8*. The result of the fetch link command.
+	*/
+	HBufC8* FetchL ( const TDesC8& aURI, RReadStream& aReadStream ) const;
+
+	/**
+	* Closes a session to the other DM Host Server.  
+	*/
+	void Close();
+	};
+	
+#endif // __NSMLDMHOSTSERVERSESSION_H__