xml/xmldomandxpath/src/xmlengineserializer/xmlengdeserializerxop.cpp
changeset 0 e35f40988205
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/xmldomandxpath/src/xmlengineserializer/xmlengdeserializerxop.cpp	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,309 @@
+// 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:
+// XML XOP Deserializer implementation
+//
+
+#include "xmlengdeserializerxop.h"
+#include <xml/dom/xmlengerrors.h>
+#include "xmlengcontenthandler.h"
+#include <xml/utils/xmlengxestd.h>
+#include <xml/utils/xmlengxestrings.h>
+#include <xml/dom/xmlengserializeerrors.h>
+
+#include <xml/parser.h>
+#include <xml/parserfeature.h>
+#include <xml/matchdata.h>
+#include <bafl/multipartparser.h>
+#include <bafl/bodypart.h>
+#include <f32file.h>
+
+_LIT8(KXmlMimeType, "text/xml");
+_LIT8(KParserType,"libxml2");
+
+// Implemented according to XOP Spec (http://www.w3.org/TR/xop10/)
+_LIT8(KMultipartMixed, "multipart/mixed");
+_LIT8(KBoundary1, "MIME_boundary"); 
+_LIT(KUrlStub, "http://url_stub");  
+
+using namespace Xml;
+
+// --------------------------------------------------------------------------------------
+// Creates an instance of CXMLDEDeserializerXOP
+// --------------------------------------------------------------------------------------
+//
+CXmlEngDeserializerXOP* CXmlEngDeserializerXOP::NewL( MContentHandler& aContentHandler,
+	 											TBool aCleanXOPInfoset ) 
+    {	    
+	CXmlEngDeserializerXOP* deserializerXop = new (ELeave) CXmlEngDeserializerXOP(aCleanXOPInfoset);
+	CleanupStack::PushL( deserializerXop ); 	
+	deserializerXop->ConstructL( aContentHandler );
+	CleanupStack::Pop(); //deserializerXop
+	return deserializerXop;
+    }
+
+// --------------------------------------------------------------------------------------
+// Enables CParser feature
+// --------------------------------------------------------------------------------------
+//
+EXPORT_C TInt CXmlEngDeserializerXOP::EnableFeature(TInt aParserFeature)
+	{
+	if(aParserFeature == EConvertTagsToLowerCase)
+		{
+		iParserMode |= aParserFeature;
+		return KErrNone;		
+		}
+	return CXmlEngDeserializer::EnableFeature(aParserFeature);
+	}
+	
+// --------------------------------------------------------------------------------------
+// Disables CParser feature
+// --------------------------------------------------------------------------------------
+//
+EXPORT_C TInt CXmlEngDeserializerXOP::DisableFeature(TInt aParserFeature)
+	{
+	if(aParserFeature == EConvertTagsToLowerCase)
+		{
+		iParserMode &= ~aParserFeature;
+		return KErrNone;		
+		}	
+	return CXmlEngDeserializer::DisableFeature(aParserFeature);
+	}
+
+// --------------------------------------------------------------------------------------
+// Checks if a feature is enabled
+// --------------------------------------------------------------------------------------
+//	
+EXPORT_C TBool CXmlEngDeserializerXOP::IsFeatureEnabled(TInt aParserFeature) const
+	{
+	if(aParserFeature == EConvertTagsToLowerCase)
+		{
+		return iParserMode & aParserFeature;		
+		}	
+	return iParser->IsFeatureEnabled(aParserFeature);
+	}
+    
+// --------------------------------------------------------------------------------------
+// Deserializes document
+// --------------------------------------------------------------------------------------
+//
+void CXmlEngDeserializerXOP::DeserializeL()
+    {
+	switch(iSerializationOutput)
+		{
+		case EDeserializeFromFile:
+			{
+			RFs fs;
+			User::LeaveIfError(fs.Connect());
+			CleanupClosePushL(fs); 
+		    DeserializeL(fs, iInputFileName->Des(), iParsingOptions);
+		    CleanupStack::PopAndDestroy(&fs); //fs
+		    break;
+			}
+		case EDeserializeFromBuffer:
+			{
+			if(iBuffer.Length() == 0)
+				{
+				User::Leave(KXmlEngErrNoParameters);
+				}
+			DeserializeL(iBuffer, iParsingOptions);
+			break;
+			}
+		case EDeserializeFromStream:
+			{
+			// Currently this feature is not supported. Implement when need arises or remove.			
+			User::Leave(KErrNotSupported);
+			}
+		default:
+			{
+			User::Leave(KErrNotSupported);
+			break;
+			}						
+		}   
+    }
+
+// --------------------------------------------------------------------------------------
+// Deserialize document
+// --------------------------------------------------------------------------------------
+//
+void CXmlEngDeserializerXOP::DeserializeL( const TDesC& aFileName,
+										   const TXmlEngParsingOptions& aOptions ) 
+    {
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs); 
+	DeserializeL(fs, aFileName, aOptions);
+	CleanupStack::PopAndDestroy(&fs); //fs
+	}
+
+// --------------------------------------------------------------------------------------
+// Deserialize document
+// --------------------------------------------------------------------------------------
+//
+void CXmlEngDeserializerXOP::DeserializeL( RFs& aRFs, 
+										const TDesC& aFileName,
+										const TXmlEngParsingOptions& aOptions ) 
+    {
+	iBodyPartArray.ResetAndDestroy();     
+	if(iData)
+	   	{
+	   	delete iData;
+	   	iData = NULL;
+	   	}
+	iData = ReadFileL( aRFs, aFileName );
+	TPtrC8 dataPtr = iData->Des();
+	CXmlEngDeserializerXOP::DeserializeL( dataPtr, aOptions );	
+	}
+
+// --------------------------------------------------------------------------------------
+// Deserialize document
+// --------------------------------------------------------------------------------------
+//
+void CXmlEngDeserializerXOP::DeserializeL( const TDesC8& aBuffer,
+										   const TXmlEngParsingOptions& aOptions ) 
+    {
+    TXmlEngParsingOptions originalOpts = iParsingOptions;
+    iParsingOptions = aOptions;
+
+    if( iCleanXOPInfoset )
+    	{
+		Xml::ParseL(*iParser, aBuffer);
+		}
+	else
+		{
+	    if(!aBuffer.Length())
+	    	{
+	    	User::Leave(KXmlEngErrNoParameters);
+	    	}
+	    if(iBodyPartArray.Count())
+	        iBodyPartArray.ResetAndDestroy();   	
+	    
+	   	MultipartParser::ParseL( aBuffer, KMultipartMixed, KBoundary1, KUrlStub, iBodyPartArray );    	
+
+		// get xml document
+		CBodyPart* bodyPart = NULL;
+		if(iBodyPartArray.Count() > 0)	
+			{
+			bodyPart = iBodyPartArray[0];		
+			}
+		else
+			{
+			//The multipart document wasn't parsed correctly
+			User::Leave(KXmlEngErrBadMultipart);
+			}
+		Xml::ParseL(*iParser, bodyPart->Body());		
+		}
+	iParsingOptions = originalOpts;
+	iBodyPartArray.ResetAndDestroy();
+    }        
+
+// --------------------------------------------------------------------------------------
+// Retrieves pointer to data referenced by CID from parsed multipart package
+// --------------------------------------------------------------------------------------
+//
+TInt CXmlEngDeserializerXOP::GetData(const TDesC8& aCid, TPtrC8& aData)
+	{
+	for(TInt i = 0; i < iBodyPartArray.Count(); i++)
+		{
+		TPtrC8 cid = iBodyPartArray[i]->ContentID();
+		if(iBodyPartArray[i]->ContentID() == aCid)
+			{
+			TInt size = iBodyPartArray[i]->Body().Size();
+			iDataPtr.Set(iBodyPartArray[i]->Body());
+			aData.Set(iDataPtr);
+			return KErrNone;
+			}
+		}
+	return KErrNotFound;
+	}
+  
+// --------------------------------------------------------------------------------------
+// Default Constructor
+// --------------------------------------------------------------------------------------
+//
+CXmlEngDeserializerXOP::CXmlEngDeserializerXOP( TBool aCleanXOPInfoset ) 
+	 : iData(NULL), iCleanXOPInfoset(aCleanXOPInfoset)
+    {
+    }
+    
+// --------------------------------------------------------------------------------------
+// Destructor
+// --------------------------------------------------------------------------------------
+//
+CXmlEngDeserializerXOP::~CXmlEngDeserializerXOP()
+    {
+    if(iData)
+    	{
+    	delete iData;
+    	}
+    iBodyPartArray.ResetAndDestroy();
+    delete iInternalHandler;  
+    }
+
+// --------------------------------------------------------------------------------------
+// 2nd phase constructor
+// --------------------------------------------------------------------------------------
+//
+void CXmlEngDeserializerXOP::ConstructL( MContentHandler& aContentHandler )
+    {
+    if(iInternalHandler)
+    	{
+    	delete iInternalHandler;
+    	iInternalHandler = NULL;
+    	}    
+    iInternalHandler = CXmlEngContentHandler::NewL(this, &aContentHandler);
+
+    if(iParser)
+    	{
+    	delete iParser;
+    	iParser = NULL;
+    	}
+
+    CMatchData* matchData = CMatchData::NewLC();
+    matchData->SetMimeTypeL(KXmlMimeType);
+    matchData->SetVariantL(KParserType); 
+    iParser = CParser::NewL(*matchData, *iInternalHandler);
+    CleanupStack::PopAndDestroy(matchData);
+    }
+
+// --------------------------------------------------------------------------------------
+// Read file
+// --------------------------------------------------------------------------------------
+//
+HBufC8* CXmlEngDeserializerXOP::ReadFileL( RFs& aRFs, const TDesC& aFileName)
+    {
+    RFile file;
+    User::LeaveIfError(file.Open(aRFs, aFileName, EFileRead));
+    CleanupClosePushL(file);
+    TInt size;
+    User::LeaveIfError(file.Size(size));
+    HBufC8* buf = HBufC8::NewLC(size);
+    TPtr8 bufPtr(buf->Des());
+    User::LeaveIfError(file.Read(bufPtr));
+    CleanupStack::Pop(buf); // buf
+    CleanupStack::PopAndDestroy(&file); // file
+    return buf;
+    }
+
+/*
+// --------------------------------------------------------------------------------------
+// SerializationOutput
+// --------------------------------------------------------------------------------------
+//
+TXmlEngDeserializationSource CXmlEngDeserializerXOP::SerializationOutput()
+    {
+    return iSerializationOutput;
+    }
+*/
+
+