/*
* Copyright (c) 2011-2015, Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#include "XmlElement.h"
#include "XmlSerializingContext.h"
#include "NonCopyable.hpp"
#include <string>
struct _xmlDoc;
struct _xmlNode;
struct _xmlError;
/**
* The CXmlDocSource is used by CXmlDocSink.
* The interaction between the xml source and xml sink is defined
* in the process method of CXmlDocSink. One can subclass CXmlDocSource
* for different purposes by implementing the populate method and then
* use it with any existing implementation of CXmlDocSink.
*/
class CXmlDocSource : private utility::NonCopyable
{
public:
/**
* Constructor
*
* @param[out] pDoc a pointer to the xml document that will be filled by the class
* @param[in] pRootNode a pointer to the root element of the document.
* @param[in] bValidateWithSchema a boolean that toggles schema validation
*/
CXmlDocSource(_xmlDoc *pDoc, bool bValidateWithSchema = false, _xmlNode *pRootNode = NULL);
/**
* Constructor
*
* @param[out] pDoc a pointer to the xml document that will be filled by the class
* @param[in] strRootElementType a string containing the root element type
* @param[in] strRootElementName a string containing the root element name
* @param[in] strNameAttributeName a string containing the name of the root name attribute
* @param[in] bValidateWithSchema a boolean that toggles schema validation
*/
CXmlDocSource(_xmlDoc *pDoc, bool bValidateWithSchema,
const std::string &strRootElementType = "",
const std::string &strRootElementName = "",
const std::string &strNameAttributeName = "");
/**
* Destructor
*/
virtual ~CXmlDocSource();
/**
* Method called by the CXmlDocSink::process method.
*
* @param[out] serializingContext is used as error output
*
* @return false if there are any error
*/
virtual bool populate(CXmlSerializingContext &serializingContext);
/**
* Method that returns the root element of the Xml tree.
*
* @param[out] xmlRootElement a reference to the CXmleElement destination
*/
void getRootElement(CXmlElement &xmlRootElement) const;
/**
* Getter method.
*
* @return the root element's name
*/
std::string getRootElementName() const;
/** Get the Schemas' base (folder) URI
*/
std::string getSchemaBaseUri();
/** Set the Schema's base (folder) URI
*
* The schema for validating the XML document will be searched for in that
* folder.
*
* @param[in] uri The Schemas' base URI
*/
void setSchemaBaseUri(const std::string &uri);
/**
* Getter method.
* Method that returns the root element's attribute with name matching strAttributeName.
*
* @param[in] strAttributeName is a std::string used to find the corresponding attribute
*
* @return the value of the root's attribute named as strAttributeName
*/
std::string getRootElementAttributeString(const std::string &strAttributeName) const;
/**
* Getter method.
* Method that returns the xmlDoc contained in the Source.
* (Can be used in a Doc Sink)
*
* @return the document _pDoc
*/
_xmlDoc *getDoc() const;
/**
* Method that checks that the xml document has been correctly parsed.
*
* @return false if any error occurs during the parsing
*/
virtual bool isParsable() const;
/**
* Helper method to build final URI from base and relative uri/path
*
* base = "/path/to/file.xml"
* - uri - returned value
* . /path/to/
* file.xsd /path/to/file.xsd
* ../from/file.xsd /path/from/file.xsd
* /path2/file.xsd /path2/file.xsd
*
* @param[in] base uri, if base is directory, it must contains separator last
* @param[in] relative uri
*
* @return new made URI if succeeded relative input otherwise
*/
static std::string mkUri(const std::string &base, const std::string &relative);
/**
* Helper method for creating an xml document from either a file or a
* string.
*
* @param[in] source either a filename or a string representing an xml document
* @param[in] fromFile true if source is a filename, false if source is an xml
* represents an xml document
* @param[in] xincludes if true, process xincludes tags
* @param[in] serializingContext will receive any serialization error
*/
static _xmlDoc *mkXmlDoc(const std::string &source, bool fromFile, bool xincludes,
CXmlSerializingContext &serializingContext);
protected:
/**
* Doc
*/
_xmlDoc *_pDoc;
/**
* Root node
*/
_xmlNode *_pRootNode;
private:
/** Method that check the validity of the document with the xsd file.
*
* @return true if document is valid, false if any error occures
*/
bool isInstanceDocumentValid();
std::string getSchemaUri() const;
/**
* Element type info
*/
std::string _strRootElementType;
/**
* Element name info
*/
std::string _strRootElementName;
/**
* Element name attribute info
*/
std::string _strNameAttributeName;
/**
* Boolean that enables the validation via xsd files
*/
bool _bValidateWithSchema;
std::string _schemaBaseUri;
};