syncmlfw/ds/syncagent/inc/NSmlDSCmds.h
changeset 0 b497e44ab2fc
child 9 57a65a3a658c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/ds/syncagent/inc/NSmlDSCmds.h	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,362 @@
+/*
+* Copyright (c) 2004 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:  DS Sync flow
+*
+*/
+
+
+#ifndef __NSMLDSCMDS_H__
+#define __NSMLDSCMDS_H__
+
+// INCLUDES
+#include <e32base.h>
+#include <SmlDataSyncDefs.h>
+#include "NSmlCmdsBase.h"
+#include "WBXMLDevInfParser.h"
+#include "nsmlagentlog.h"
+
+// FORWARD DECLARATIONS
+class CNSmlAgentBase;
+class CNSmlDSContent;
+class MSyncMLProgressObserver;
+class CWBXMLDevInfGenerator;
+class CWBXMLDevInfDocHandler;
+class CNSmlDbCaps;
+class CNSmlDbMetaHandler;
+class CNSmlDSBatchBuffer;
+
+inline void DeleteRPointerArray( TAny* aPtr )
+	{
+	( REINTERPRET_CAST ( RPointerArray<CNSmlDbCaps>*, aPtr ) )->ResetAndDestroy();
+	}
+
+// CLASS DECLARATION
+
+/**
+* CNSmlDSCmds implements DS specific parts of SyncML commands handling.
+*  
+* @lib nsmldsagent.lib
+*/
+class CNSmlDSCmds : public CNSmlCmdsBase, public MWBXMLDevInfCallbacks
+	{
+    public: // constructors and destructor
+    	/**
+    	* Symbian 2-phased constructor.
+		* @param aAgent Used synchronisation agent.
+		* @param aSessionID Sync session Id.
+		* @param aVerProto DS protocol version.
+		* @param aPublicId Public Id of the used DS protocol. 
+		* @param aSyncMLUserName SyncML server username.
+		* @param aSyncServer Used SyncML server's URI.
+    	* @param aDSContent Object used to handle datastore specific operations.
+    	* @param aDSObserver Observer callback.
+		* @param aVersionCheck Whether the protocol version is checked or not.
+    	*/
+    	static CNSmlDSCmds* NewL( CNSmlAgentBase* aAgent, const TDesC8& aSessionID, const TDesC8& aVerProto, const TInt aPublicId, const HBufC& aSyncMLUserName, CNSmlURI* aSyncServer, CNSmlDSContent& aDSContent, MSyncMLProgressObserver& aDSObserver, TBool aVersionCheck );   
+
+     	/**
+     	* Destructor.
+     	*/
+     	virtual ~CNSmlDSCmds();
+
+    public: // functions from base classes
+    	/**
+    	* From CNSmlCmdsBase. Builds a structure for the Alert command and calls 
+    	* the WBXML generator.
+    	* @param aAlertCode Aler code.
+    	* @param aLastSyncAnchor Anchor/Last value to be inserted to the command.
+    	* @param aNextSyncAnchor Anchor/Next value to be inserted to the command.
+    	*/
+    	void DoAlertL( const TDesC8& aAlertCode, TTime* aLastSyncAnchor = NULL, TTime* aNextSyncAnchor = NULL );
+    	
+    	/**
+    	* From CNSmlCmdsBase. Builds a structure for the Put command. A DevInfo
+    	* structure is constructed inside the Put. Finally the WBXML generator
+    	* is called.
+    	*/
+		void DoPutL();
+		
+		/**
+		* From CNSmlCmdsBase. Builds a structure for the Results command. A DevInfo
+		* structure is constructed inside the Results element. As a last step the
+		* WBXML generator is called.
+		* @return EReturnOK if the operation succeeded.
+		*/
+		CNSmlCmdsBase::TReturnValue DoResultsL();
+		
+		/**
+		* From CNSmlCmdsBase. Builds a structure for the Get command. This is used
+		* to ask DevInfo from the server. At the end of this function the WBXML 
+		* generator is called.
+		*/
+		void DoGetL();
+		
+		/**
+		* From CNSmlCmdsBase. Builds a structure for the Sync command. Calls the 
+		* WBXML generator.
+		* @return EReturnOK if completed successfully.
+		*/
+		CNSmlCmdsBase::TReturnValue DoStartSyncL();
+		
+		/**
+		* From CNSmlCmdsBase. Completes the generation of the Sync command.
+		*/
+		void DoEndSyncL();
+		
+		/**
+		* From CNSmlCmdsBase. Builds a structure for Add, Replace, Delete or Move
+		* command. Content's data is retrieved via the CNSmlDSContent::FetchNextItemL
+		* method. Finally the WBXML generator is called.
+		* @return EReturnOK if completed without errors.
+		*/
+		CNSmlCmdsBase::TReturnValue DoAddOrReplaceOrDeleteL();
+		
+		/**
+		* From CNSmlCmdsBase. Builds a structure for the Map command. Map items are
+		* retrieved by the CNSmlDSMapContainer::MapItemListL method. The WBXML
+		* generator is called.
+		* @return EReturnOK if completed successfully.
+		*/
+		CNSmlCmdsBase::TReturnValue DoMapL();
+		
+		/**
+		* From CNSmlCmdsBase. Handles the Results command received from a server.
+		* The ParseDeviceInfoL function is called in order to process the received
+		* DevInfo structure.
+		* @param aResults The received Results element.
+		*/
+		void ProcessResultsCmdL( SmlResults_t* aResults );
+		
+		/**
+		* From CNSmlCmdsBase. Handles the Put command received from a server.
+		* The ParseDeviceInfoL function is called in order to process the received
+		* DevInfo structure.
+		* @param aPut The received Put element.
+		*/
+		void ProcessPutCmdL( SmlPut_t* aPut );
+		
+		/**
+		* From CNSmlCmdsBase. Handles the Get command received from a server.
+		* @param aGet The received Get element.
+		*/
+		void ProcessGetCmdL( SmlGet_t* aGet );
+		
+		/**
+		* From CNSmlCmdsBase. Handles the Alert command received from a server.
+		* The CNSmlDSContent::SetIndexByLocalDatabaseL() function is called
+		* to find the correct data store. In case of initialization Alert command
+		* the received sync type is validated.
+		* @param aAlert The received Alert element.
+		* @param aNextAlert ETrue if the Alert is Next Alert.
+		* @param aServerAlert ETrue if the Alert is Server Alert.
+		* @param aDisplayAlert ETrue if the Alert is Display Alert.
+		*/
+		void ProcessAlertCmdL( SmlAlert_t* aAlert, TBool aNextAlert = EFalse, TBool aServerAlert = EFalse, TBool aDisplayAlert = EFalse );
+		
+		/**
+		* From CNSmlCmdsBase. Handles the Sync command received from a server. 
+		* The CNSmlDSContent::SetIndexByLocalDatabaseL() function is called
+		* to find the correct data store.
+		* @param aSync The received Sync element.
+		*/
+		void ProcessSyncL( SmlSync_t* aSync );
+		
+		/**
+		* From CNSmlCmdsBase. Handles the end of the received Sync command.
+		*/
+		void ProcessEndSyncL();
+		
+		/**
+		* From CNSmlCmdsBase. Handles the received Add, Replace, Delete and Move
+		* commands. The UpdateL() function is called to handle items in the command.
+		* @param aCmd Type of the received command.
+		* @param aContent Content of the received command.
+		*/
+		void ProcessUpdatesL( const TDesC8& aCmd, SmlGenericCmd_t* aContent );
+		
+		/**
+		* From CNSmlCmdsBase. Handles the received Atomic command. Inside Atomic all
+		* operations to data stores are performed in a transactional way. The received 
+		* Atomic command fails if the used data store does not support transactions.
+		* @param aAtomic The received Atomic command.
+		*/
+		void ProcessAtomicL( SmlAtomic_t* aAtomic );
+		
+		/**
+		* From CNSmlCmdsBase. Handles the end of a previously received Atomic command.
+		* All transactions are committed and their results checked. If any of the operations
+		* has failed then all of them will be rolled back.
+		*/
+		void ProcessEndAtomicL();
+		
+		/**
+		* From CNSmlCmdsBase. An empty implementation.
+		* @param aSequence The received Sequence element.
+		*/
+		void ProcessSequenceL( SmlSequence_t* aSequence);
+		
+		/**
+		* From CNSmlCmdsBase. An empty implementation.
+		*/
+		void ProcessEndSequence();
+		
+		/**
+		* From CNSmlCmdsBase. Generates the end tag of the SyncML element.
+		* @param aFinal ETrue if this is the last message from the client.
+		*/
+		void DoEndMessageL( TBool aFinal );
+		        
+    private: // constructors and operators
+    	/**
+    	* C++ constructor.
+    	* @param aDSContent Object used to handle datastore specific operations.
+    	* @param aDSObserver Observer callback.
+    	*/
+		CNSmlDSCmds( CNSmlDSContent& aDSContent, MSyncMLProgressObserver& aDSObserver );
+		
+		/**
+		* Symbian 2nd phase constructor.
+		* @param aAgent Used synchronisation agent.
+		* @param aSessionID Sync session Id.
+		* @param aVerProto DS protocol version.
+		* @param aPublicId Public Id of the used DS protocol. 
+		* @param aSyncMLUserName SyncML server username.
+		* @param aSyncServer Used SyncML server's URI.
+		* @param aVersionCheck Whether the protocol version is checked or not.
+		*/
+		void ConstructL( CNSmlAgentBase* aAgent, const TDesC8& aSessionID, const TDesC8& aVerProto, const TInt aPublicId, const HBufC& aSyncMLUserName, CNSmlURI* aSyncServer, TBool aVersionCheck );
+		
+		/**
+		* Prohibit copy constructor.
+		*/
+		CNSmlDSCmds( const CNSmlDSCmds& aOther );
+
+		/**
+		* Prohibit assignment operator.
+		*/
+		CNSmlDSCmds& operator=( const CNSmlDSCmds& aOther );
+    
+	private: // functions from base classes
+		/**
+		* From MWBXMLDevInfCallbacks. Callback function used by the DevInfo parser.
+		* @param aContent Pointer to the parsed content.
+		* @return Return code defined in the SyncML toolkit.
+		*/
+		Ret_t smlDeviceInfoL( SmlDevInfDevInfPtr_t aContent );
+
+	private: // new functions
+	TBool MatchServerAlertL( const SmlAlert_t* aAlert, TInt aStatusID );
+	TPtrC8 DoDeviceInfoL(TBool aConvert = EFalse);
+	void SwitchAlertCode(TDes8& aAlertCode);
+	void DoTargetWithFilterL( sml_target_s*& aTarget, const TDesC& aLocURIData ) const;
+	void FreeDeviceInfo();
+	void ParseDeviceInfoL( TInt aStatusID, const TPtrC8& aDeviceInfo );
+	void ProcessDeviceInfoL( const SmlDevInfDevInf_t& aContent );
+	void ProcessCTCapL( SmlDevInfCtCapList_t& aCapList, const TDesC8& aCTType ) const;
+	void ProcessFilterCapL ( SmlDevInfFilterCapList_t& aFilterCapList, const TDesC8& aCTType ) const;
+
+	void DoNumberOfChangesL( SmlPcdata_t*& aNoc ) const;
+	void UpdateL( const TDesC8& aCmd, const SmlGenericCmd_t* aContent, const SmlItem_t* aItem, const TDesC8& aUID, const TSmlDbItemUid aParent );
+	TBool IsDevInfoContentTypeOkL( const SmlPcdata_t* aMeta, TInt aStatusID ); 
+	TBool IsLUIDOkLC( const TDesC8& aCmd, const SmlGenericCmd_t* aContent, const SmlItem_t* aItem, HBufC8*& aLUID );
+	TBool IsGUIDOkLC( const TDesC8& aCmd, const SmlGenericCmd_t* aContent, const SmlItem_t* aItem, HBufC8*& aGUID );
+	TBool IsParentOkL( const sml_source_or_target_parent_s* aParent, TSmlDbItemUid& aGUID );
+	TBool IsParentOkLC( const sml_source_or_target_parent_s* aParent, HBufC8*& aGUID );
+	TBool IsFormatOkL( const TDesC8& aCmd, const SmlGenericCmd_t* aContent, const SmlItem_t* aItem );
+	TBool IsChrFormat( const SmlPcdata_t* aMeta, TPtrC8& aFormat ) const;
+	TBool CheckAndSetReceivedMediaTypeL( const TDesC8& aCmd, const SmlGenericCmd_t* aContent, const SmlItem_t* aItem );
+	TBool MediaTypeSetOkL( const SmlPcdata_t* aMeta, TBool& aFound, TPtr8& aMediaType,const TDesC8& aCmd ) const;
+	HBufC* AlertDataLC( const SmlItemList_t* aItemList ) const;
+	void AppendCTCapsL( CNSmlDbCaps& aDbCaps,const SmlDevInfDatastore_t* aDataStore, SmlDevInfCtCapList_t* aCtCapList ) const;
+	
+	TInt AlertParameter ( const SmlPcdata_t* aData, const TDesC8& aParamID ) const;
+		/**
+		* Performs mapping between datastore operation return values and SyncML error codes.
+		* @param aIndex Index to the current batch item.
+		* @param aStatus Datastore operation's return value that should be mapped.
+		*/
+		void MapStatusCodeL( const TInt aIndex, const TInt aStatus );
+		
+	TBool IsVersionOkL ( const SmlDevInfDevInf_t& aContent, TInt aStatusID );
+	TBool IsRxTxOkL( SmlDevInfDatastoreList_t* aCurrDatastore, TInt aStatusID, RPointerArray<CNSmlDbCaps>& aDbCapArray );
+	TBool UpdateServerIdInSettingsL( const SmlDevInfDevInf_t& aContent, TInt aStatusID );
+
+		/**
+		* Buffers the received chunked item.
+		* @param aUid UID of the received item.
+		* @param aCurrItem Current item's data.
+		* @param aMetaInCommand Current command's meta data.
+		* @param aBuffer Buffer where the received chunk is read.
+		* @return ESmlStatusOK if the whole item was received,
+		* ESmlStatusItemAccepted if the item was accepted or an error code.
+		*/
+		TNSmlError::TNSmlSyncMLStatusCode GetChunkL( const TDesC8& aUid, const SmlItem_t* aCurrentItem, const SmlPcdata_t* aMetaInCommand, CBufBase*& aBuffer );
+		
+		/**
+		* Commits batched items.
+		*/     	
+		void CommitBatchL();
+		
+		/**
+		* Converts UID from literal to numeric presentation.
+		* @param aLiteralUid UID in literal form.
+		* @param aNumericUid On return contains UID in numeric form.
+		* @result KErrNone if the conversion succeeded.
+		*/
+		TInt ConvertUid( const TDesC8& aLiteralUid, TSmlDbItemUid& aNumericUid );
+
+	private: // data	
+		// batched items buffer
+		CNSmlDSBatchBuffer* iBatchBuffer;
+		// device info switch
+		TBool iDSDeviceInfoParsed;
+		// MsgID of Get
+		HBufC8* iDSGetMsgId;
+		// CmdID of Get 
+		HBufC8* iDSGetCmdId;
+		// command name of a partially sent large object
+		HBufC8* iDSLargeObjectCmdName;
+		// Target in Sync from a server
+		CNSmlURI* iDSPreviousSyncTargetURI;
+		// class for content specific processing
+		CNSmlDSContent& iDSContent;
+		// observer callback
+		MSyncMLProgressObserver& iDSObserver;
+		// WBXML generator
+		CWBXMLDevInfGenerator* iDSDevGenerator; 
+		// buffer for received data
+		CBufFlat* iDataBuffer;
+		// flag to indicate if the item to be sent is a large object
+		TBool iLargeData;
+		// batch mode on/off
+		TBool iBatchModeOn;
+		// id of the ongoing atomic command
+		TInt iAtomicId;
+		// atomic transaction mode on/off
+		TBool iAtomicModeOn;
+		// atomic command has failed
+		TBool iAtomicHasFailed;
+		// UID of the received large object
+		HBufC8* iLargeUid;
+		// true if an item is opened
+		TBool iItemOpened;
+		// total number of sent bytes of a chunked item
+		TInt iBytesSent;
+		// UID generated by a datastore adapter
+		TSmlDbItemUid iNewUid;
+	};
+
+#endif // __NSMLDSCMDS_H__
+            
+// End of File