VirtualBox

Changeset 32565 in vbox


Ignore:
Timestamp:
Sep 16, 2010 2:39:24 PM (14 years ago)
Author:
vboxsync
Message:

Runtime/Main: add xml/ovf parsing in memory

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/cpp/xml.h

    r30746 r32565  
    565565
    566566private:
     567    friend class XmlMemParser;
    567568    friend class XmlFileParser;
    568569    friend class XmlFileWriter;
     
    587588
    588589    xmlParserCtxtPtr m_ctxt;
     590};
     591
     592/*
     593 * XmlMemParser
     594 *
     595 */
     596
     597class RT_DECL_CLASS XmlMemParser : public XmlParserBase
     598{
     599public:
     600    XmlMemParser();
     601    ~XmlMemParser();
     602
     603    void read(const void* pvBuf, int cbSize, const iprt::MiniString &strFilename, Document &doc);
    589604};
    590605
  • trunk/src/VBox/Main/include/ovfreader.h

    r30157 r32565  
    403403{
    404404public:
     405    OVFReader(const void *pvBuf, int cbSize, const iprt::MiniString &path);
    405406    OVFReader(const iprt::MiniString &path);
    406407
     
    413414    xml::Document               m_doc;
    414415
     416    void parse();
    415417    void LoopThruSections(const xml::ElementNode *pReferencesElem, const xml::ElementNode *pCurElem);
    416418    void HandleDiskSection(const xml::ElementNode *pReferencesElem, const xml::ElementNode *pSectionElem);
  • trunk/src/VBox/Main/xml/ovfreader.cpp

    r29893 r32565  
    3131
    3232/**
     33 * Constructor. This parses the given XML file out of the memory. Throws lots of exceptions
     34 * on XML or OVF invalidity.
     35 * @param pvBuf  the memory buffer to parse
     36 * @param cbSize the size of the memory buffer
     37 * @param path   path to a filename for error messages.
     38 */
     39OVFReader::OVFReader(const void *pvBuf, int cbSize, const MiniString &path)
     40    : m_strPath(path)
     41{
     42    xml::XmlMemParser parser;
     43    parser.read(pvBuf, cbSize,
     44                m_strPath,
     45                m_doc);
     46    /* Start the parsing */
     47    parse();
     48}
     49
     50/**
    3351 * Constructor. This opens the given XML file and parses it. Throws lots of exceptions
    3452 * on XML or OVF invalidity.
     
    4159    parser.read(m_strPath,
    4260                m_doc);
    43 
     61    /* Start the parsing */
     62    parse();
     63}
     64
     65void OVFReader::parse()
     66{
    4467    const xml::ElementNode *pRootElem = m_doc.getRootElement();
    4568    if (    !pRootElem
  • trunk/src/VBox/Runtime/r3/xml.cpp

    r30746 r32565  
    13401340////////////////////////////////////////////////////////////////////////////////
    13411341//
     1342// XmlMemParser class
     1343//
     1344////////////////////////////////////////////////////////////////////////////////
     1345
     1346XmlMemParser::XmlMemParser()
     1347    : XmlParserBase()
     1348{
     1349}
     1350
     1351XmlMemParser::~XmlMemParser()
     1352{
     1353}
     1354
     1355/**
     1356 * Parse the given buffer and fills the given Document object with its contents.
     1357 * Throws XmlError on parsing errors.
     1358 *
     1359 * The document that is passed in will be reset before being filled if not empty.
     1360 *
     1361 * @param pvBuf in: memory buffer to parse.
     1362 * @param cbSize in: size of the memory buffer.
     1363 * @param strFilename in: name fo file to parse.
     1364 * @param doc out: document to be reset and filled with data according to file contents.
     1365 */
     1366void XmlMemParser::read(const void* pvBuf, int cbSize,
     1367                        const iprt::MiniString &strFilename,
     1368                        Document &doc)
     1369{
     1370    GlobalLock lock;
     1371//     global.setExternalEntityLoader(ExternalEntityLoader);
     1372
     1373    const char *pcszFilename = strFilename.c_str();
     1374
     1375    doc.m->reset();
     1376    if (!(doc.m->plibDocument = xmlCtxtReadMemory(m_ctxt,
     1377                                                  (const char*)pvBuf,
     1378                                                  cbSize,
     1379                                                  pcszFilename,
     1380                                                  NULL,       // encoding = auto
     1381                                                  XML_PARSE_NOBLANKS)))
     1382        throw XmlError(xmlCtxtGetLastError(m_ctxt));
     1383
     1384    doc.refreshInternals();
     1385}
     1386
     1387////////////////////////////////////////////////////////////////////////////////
     1388//
    13421389// XmlFileParser class
    13431390//
     
    13461393struct XmlFileParser::Data
    13471394{
    1348     xmlParserCtxtPtr ctxt;
    13491395    iprt::MiniString strXmlFilename;
    13501396
    13511397    Data()
    13521398    {
    1353         if (!(ctxt = xmlNewParserCtxt()))
    1354             throw std::bad_alloc();
    13551399    }
    13561400
    13571401    ~Data()
    13581402    {
    1359         xmlFreeParserCtxt(ctxt);
    1360         ctxt = NULL;
    13611403    }
    13621404};
     
    14311473    ReadContext context(pcszFilename);
    14321474    doc.m->reset();
    1433     if (!(doc.m->plibDocument = xmlCtxtReadIO(m->ctxt,
     1475    if (!(doc.m->plibDocument = xmlCtxtReadIO(m_ctxt,
    14341476                                              ReadCallback,
    14351477                                              CloseCallback,
     
    14381480                                              NULL,       // encoding = auto
    14391481                                              XML_PARSE_NOBLANKS)))
    1440         throw XmlError(xmlCtxtGetLastError(m->ctxt));
     1482        throw XmlError(xmlCtxtGetLastError(m_ctxt));
    14411483
    14421484    doc.refreshInternals();
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette