xml/xmldomandxpath/src/xmlengineserializer/xmlengserializerxop.h
changeset 0 e35f40988205
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/xmldomandxpath/src/xmlengineserializer/xmlengserializerxop.h	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,258 @@
+// Copyright (c) 2006-2009 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:
+// Implementation of XOP serializer
+//
+
+
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+#ifndef XMLENGSERIALIZERXOP_H
+#define XMLENGSERIALIZERXOP_H
+
+#include <xml/dom/xmlengserializer.h>
+#include <xml/dom/xmlengdataserializer.h>
+#include <f32file.h>
+
+class CDesC8ArrayFlat;
+class TXmlEngNode;
+class TXmlEngDataContainer;
+class MXmlEngSXOPOutputStream;
+
+const TInt KInitBufferSize = 4096; //initial output buffer size
+const TInt KXopStubMaxSize = 256; // href='cid:' + cid length
+
+/**
+ * XOP serializer
+ */
+class CXmlEngSerializerXOP: public CXmlEngSerializer, public MXmlEngDataSerializer
+    {
+ public:
+    /**
+     * Creates an instance of CXmlEngSerializerXOP class
+     *
+	 * @param aCleanXOPInfoset Indicates that MIME headers 
+	 *		  should be skipped upon serialization
+	 * @return Pointer to instance of CXmlEngSerializerXOP class
+     *
+     * @leave KErrNoMemory, KErrGeneral, KXmlEngErrWrongEncoding.
+     */
+	IMPORT_C static CXmlEngSerializerXOP* NewL( TBool aCleanXOPInfoset  );
+ 
+    /**
+     * Serializes TXmlEngNode
+     *
+	 * @param aRoot Root node of a DOM tree to be serialized
+	 * @return Number of bytes written
+     *
+     * @leave KErrNoMemory, KErrGeneral, KXmlEngErrWrongEncoding.
+     */
+	TInt SerializeL(const TXmlEngNode aRoot);
+
+    /**
+     * Serializes TXmlEngNode to file in XOP format
+     *
+	 * @param aFileName File to which DOM tree will be serialized
+	 * @param aRoot Root node of a DOM tree to be serialized	 
+	 * @param aOptions Serialization options
+	 * @return Number of bytes written
+     *
+     * @leave KErrNoMemory, KErrGeneral, KXmlEngErrWrongEncoding.
+     */
+	TInt SerializeL(const TDesC& aFileName,
+	                const TXmlEngNode aRoot,
+					const TXmlEngSerializationOptions& aOptions);
+
+    /**
+     * Serializes TXmlEngNode to file in XOP format
+     *
+	 * @param aRFs File server handle     
+	 * @param aFileName File to which DOM tree will be serialized
+	 * @param aRoot Root node of a DOM tree to be serialized
+	 * @param aOptions Serialization options	 	 
+	 * @return Number of bytes written
+     *
+     * @leave KErrNoMemory, KErrGeneral, KXmlEngErrWrongEncoding.
+     */
+	TInt SerializeL(RFs& aRFs,
+					const TDesC& aFileName,
+					const TXmlEngNode aRoot,
+					const TXmlEngSerializationOptions& aOptions);
+
+    /**
+     * Serializes TXmlEngNode to buffer in XOP format
+     *
+	 * @param aBuffer Buffer to which DOM tree will be serialized
+	 * @param aRoot Root node of a DOM tree to be serialized
+	 * @param aOptions Serialization options
+	 * @return Number of bytes written
+     *
+     * @leave KErrNoMemory, KErrGeneral, KXmlEngErrWrongEncoding.
+     */
+	TInt SerializeL( RBuf8& aBuffer, 
+                     const TXmlEngNode aRoot, 
+					 const TXmlEngSerializationOptions& aOptions );	 						  
+	 						  
+	/**
+     * Destructor.
+     */
+    ~CXmlEngSerializerXOP();
+
+  	/**
+     * Determines how data node should be serialized
+	 * @param aRoot Root node of a DOM tree to be serialized     	
+     *
+     */    
+    TPtrC8 SerializeDataL(TXmlEngNode aNode);
+ 
+protected: //functions
+
+    
+private: //functions
+    /**
+     * Constructor
+     *
+	 * @param aCleanXOPInfoset Indicates that MIME headers 
+	 *		  should be skipped upon serialization     
+     */
+    CXmlEngSerializerXOP( TBool aCleanXOPInfoset );
+
+    /**
+     * Second phase constructor
+     */
+    void ConstructL();
+
+    /**
+     * Serializes DOM tree to a stream
+     */
+	TInt StreamSerializeL(MXmlEngSXOPOutputStream& aOutputStream, 
+						  const TXmlEngNode aRoot,
+						  const TXmlEngSerializationOptions& aOptions);
+
+    /**
+     * Generates random CID
+     *
+	 * @param aCid randomly generated CID string
+     */
+	 void GenerateRandomCid(TDes8& aCid);
+
+    /**
+     * Opens already existing or creates a new file
+     *
+     * @param aFileName file name
+     * @param aFile Instance of class RFile
+     */
+	 void OpenOrCreateL(TDesC& aFileName, RFile& aFile);
+
+    /**
+     * Sets callback for text nodes in serialization options
+     *
+     * @param aOptions Serialization options
+     */
+	 void SetCallbackL(TXmlEngSerializationOptions& aOptions);
+
+	/**
+     * Leaves if a DOM tree contains 'Include' elements from XOP 
+     * namespace 'http://www.w3.org/2004/08/xop/include'
+     *
+     * @param aRoot Root node of a DOM tree to be serialized
+     */
+	 void LeaveIfXopIncludeL(TXmlEngNode aRoot);
+	 	 
+	/**
+     * Verifies if a DOM tree contains 'Include' elements from XOP 
+     * namespace 'http://www.w3.org/2004/08/xop/include'
+     *
+     * @param aRoot Root node of a DOM tree to be serialized
+     * @return ETrue if a DOM tree contains Include element from XOP namespace,
+     *		   EFalse otherwise.
+     */
+	 TBool HasXopInclude(TXmlEngNode aRoot);
+
+	/**
+     * Verifies if container's parent node has xmlmime:contentType 
+     * attribute information item. If found, the function returns ETrue 
+     * and xmlmime:contentType attribute value. Otherwise, function
+     * returns EFalse and aContentType is undefined.
+     *
+     * @param aContainer Data container whose parent node is to be searched
+     * @return ETrue if xmlmime:contentType attribute is found,
+     *		   EFalse otherwise.
+     */	 
+	 TBool GetContentTypeValue(TXmlEngDataContainer aContainer, TPtrC8& aContentType);
+
+	/**
+     * Decodes input data from base64 to binary octets and creates
+     * heap buffer with the decoded data. The buffer is pushed on the cleanup stack.
+     *
+     * @param aEncodedData Base64 encoded buffer
+     * @return Buffer with decoded data in binary octets
+     */	 
+	 HBufC8* CreateDecodedBufLC(TPtrC8 aEncodedData);
+	 
+	/**
+     * Appends given string to output buffer. If the serializer's 
+     * output type is file, the output buffer is released to the output stream 
+     * after reaching a specified threshold and the output buffer is cleared.
+     *
+     * @param aString String to write
+     * @param aFlush Indicates that buffer is written immediately  
+     */		 
+	 void BufferedWriteL(const TDesC8& aString, TBool aFlush = EFalse);
+
+	/**
+     * Flushes the output buffer and closes the output file.
+     */		 
+	 void CommitWriteL();	 
+	     
+public: //data
+
+private: //data
+	/** array that stores containers to be serialized **/
+	RArray<TXmlEngDataContainer> iDataContainerArray;
+
+	/** output buffer **/
+	HBufC8* iOutputBuffer;	
+
+	/** output buffer pointer **/
+	TPtr8* iOutputBufferPtr;
+	
+	/** size of data written **/
+	TInt iDataWritten;
+
+	/**	Indicates that MIME headers should be skipped upon serialization **/
+	TBool iCleanXOPInfoset;	
+
+	/** file server handle **/
+	RFs iRFs;
+	
+	/** output file handle **/
+	RFile iOutputFile;
+
+	/** buffer for storing xop stub that replaces binary data in xop document **/
+	HBufC8* iXopStub;
+
+	/** pointer to stub buffer **/
+	TPtr8* iXopStubPtr;	// pointer to TPtr8 to avoid initialization at construction	
+	
+	/** pointer to current output stream **/
+	MXmlEngSXOPOutputStream* iTmpOutputStream;
+    };
+
+
+
+#endif /* XMLENGSERIALIZERXOP_H */