VirtualBox

Changeset 28163 in vbox


Ignore:
Timestamp:
Apr 11, 2010 5:15:21 PM (15 years ago)
Author:
vboxsync
Message:

IPRT: xml optimizations, preps for better namespace support

Location:
trunk
Files:
2 edited

Legend:

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

    r27918 r28163  
    4848typedef xmlError *xmlErrorPtr;
    4949
     50typedef struct _xmlAttr xmlAttr;
     51typedef struct _xmlNode xmlNode;
     52
    5053namespace xml
    5154{
     
    454457    int isElement()
    455458    {
    456         return mType == IsElement;
     459        return m_Type == IsElement;
    457460    }
    458461
    459462protected:
    460463    typedef enum {IsElement, IsAttribute, IsContent} EnumType;
    461     EnumType mType;
     464
     465    EnumType    m_Type;
     466    Node        *m_pParent;
     467    xmlNode     *m_plibNode;            // != NULL if this is an element or content node
     468    xmlAttr     *m_plibAttr;            // != NULL if this is an attribute node
     469    const char  *m_pcszNamespace;
     470    const char  *m_pcszName;            // element or attribute name, points either into plibNode or plibAttr;
     471                                        // NULL if this is a content node
    462472
    463473    // hide the default constructor so people use only our factory methods
    464     Node(EnumType type);
     474    Node(EnumType type,
     475         Node *pParent,
     476         xmlNode *plibNode,
     477         xmlAttr *plibAttr);
    465478    Node(const Node &x);      // no copying
    466479
     
    517530protected:
    518531    // hide the default constructor so people use only our factory methods
    519     ElementNode();
     532    ElementNode(Node *pParent, xmlNode *plibNode);
    520533    ElementNode(const ElementNode &x);      // no copying
    521534
     
    531544protected:
    532545    // hide the default constructor so people use only our factory methods
    533     ContentNode();
     546    ContentNode(Node *pParent, xmlNode *plibNode);
    534547    ContentNode(const ContentNode &x);      // no copying
    535548
     
    544557protected:
    545558    // hide the default constructor so people use only our factory methods
    546     AttributeNode();
     559    AttributeNode(Node *pParent, xmlAttr *plibAttr);
    547560    AttributeNode(const AttributeNode &x);      // no copying
    548561
  • trunk/src/VBox/Runtime/r3/xml.cpp

    r27918 r28163  
    420420struct Node::Data
    421421{
    422     xmlNode     *plibNode;          // != NULL if this is an element or content node
    423     xmlAttr     *plibAttr;          // != NULL if this is an attribute node
    424 
    425     Node        *pParent;           // NULL only for the root element
    426     const char  *pcszName;          // element or attribute name, points either into plibNode or plibAttr;
    427                                     // NULL if this is a content node
    428 
    429422    struct compare_const_char
    430423    {
     
    444437};
    445438
    446 Node::Node(EnumType type)
    447     : mType(type),
     439Node::Node(EnumType type,
     440           Node *pParent,
     441           xmlNode *plibNode,
     442           xmlAttr *plibAttr)
     443    : m_Type(type),
     444      m_pParent(pParent),
     445      m_plibNode(plibNode),
     446      m_plibAttr(plibAttr),
     447      m_pcszNamespace(NULL),
     448      m_pcszName(NULL),
    448449      m(new Data)
    449450{
    450     m->plibNode = NULL;
    451     m->plibAttr = NULL;
    452     m->pParent = NULL;
    453451}
    454452
     
    461459{
    462460    // go thru this element's attributes
    463     xmlAttr *plibAttr = m->plibNode->properties;
     461    xmlAttr *plibAttr = m_plibNode->properties;
    464462    while (plibAttr)
    465463    {
    466464        const char *pcszAttribName = (const char*)plibAttr->name;
    467         boost::shared_ptr<AttributeNode> pNew(new AttributeNode);
    468         pNew->m->plibAttr = plibAttr;
    469         pNew->m->pcszName = (const char*)plibAttr->name;
    470         pNew->m->pParent = this;
     465        boost::shared_ptr<AttributeNode> pNew(new AttributeNode(this, plibAttr));
    471466        // store
    472467        m->attribs[pcszAttribName] = pNew;
     
    476471
    477472    // go thru this element's child elements
    478     xmlNodePtr plibNode = m->plibNode->children;
     473    xmlNodePtr plibNode = m_plibNode->children;
    479474    while (plibNode)
    480475    {
     
    482477
    483478        if (plibNode->type == XML_ELEMENT_NODE)
    484             pNew = boost::shared_ptr<Node>(new ElementNode);
     479            pNew = boost::shared_ptr<Node>(new ElementNode(this, plibNode));
    485480        else if (plibNode->type == XML_TEXT_NODE)
    486             pNew = boost::shared_ptr<Node>(new ContentNode);
     481            pNew = boost::shared_ptr<Node>(new ContentNode(this, plibNode));
    487482        if (pNew)
    488483        {
    489             pNew->m->plibNode = plibNode;
    490             pNew->m->pcszName = (const char*)plibNode->name;
    491             pNew->m->pParent = this;
    492484            // store
    493485            m->children.push_back(pNew);
     
    503495const char* Node::getName() const
    504496{
    505     return m->pcszName;
     497    return m_pcszName;
    506498}
    507499
     
    514506bool Node::nameEquals(const char *pcszNamespace, const char *pcsz) const
    515507{
    516     if (m->pcszName == pcsz)
     508    if (m_pcszName == pcsz)
    517509        return true;
    518     if (m->pcszName == NULL)
     510    if (m_pcszName == NULL)
    519511        return false;
    520512    if (pcsz == NULL)
    521513        return false;
    522     if (strcmp(m->pcszName, pcsz))
     514    if (strcmp(m_pcszName, pcsz))
    523515        return false;
    524516
     
    527519        return true;
    528520    // caller wants namespace:
    529     if (    !m->plibNode->ns
    530          || !m->plibNode->ns->prefix
    531          || !*m->plibNode->ns->prefix
    532        )
     521    if (!m_pcszNamespace)
    533522        // but node has no namespace:
    534523        return false;
    535     return !strcmp((const char*)m->plibNode->ns->prefix, pcszNamespace);
     524    return !strcmp(m_pcszNamespace, pcszNamespace);
    536525}
    537526
     
    544533const char* Node::getValue() const
    545534{
    546     if (    (m->plibAttr)
    547          && (m->plibAttr->children)
     535    if (    (m_plibAttr)
     536         && (m_plibAttr->children)
    548537       )
    549538        // libxml hides attribute values in another node created as a
    550539        // single child of the attribute node, and it's in the content field
    551         return (const char*)m->plibAttr->children->content;
    552 
    553     if (    (m->plibNode)
    554          && (m->plibNode->children)
     540        return (const char*)m_plibAttr->children->content;
     541
     542    if (    (m_plibNode)
     543         && (m_plibNode->children)
    555544       )
    556         return (const char*)m->plibNode->children->content;
     545        return (const char*)m_plibNode->children->content;
    557546
    558547    return NULL;
     
    634623int Node::getLineNumber() const
    635624{
    636     if (m->plibAttr)
    637         return m->pParent->m->plibNode->line;
    638 
    639     return m->plibNode->line;
    640 }
    641 
    642 ElementNode::ElementNode()
    643     : Node(IsElement)
    644 {
     625    if (m_plibAttr)
     626        return m_pParent->m_plibNode->line;
     627
     628    return m_plibNode->line;
     629}
     630
     631ElementNode::ElementNode(Node *pParent, xmlNode *plibNode)
     632    : Node(IsElement,
     633           pParent,
     634           plibNode,
     635           NULL)
     636{
     637    m_pcszName = (const char*)plibNode->name;
     638
     639    if (    plibNode->ns
     640         && plibNode->ns->prefix
     641       )
     642        m_pcszNamespace = (const char*)m_plibNode->ns->prefix;
    645643}
    646644
     
    921919{
    922920    // we must be an element, not an attribute
    923     if (!m->plibNode)
     921    if (!m_plibNode)
    924922        throw ENodeIsNotElement(RT_SRC_POS);
    925923
     
    929927                                (const xmlChar*)pcszElementName)))
    930928        throw std::bad_alloc();
    931     xmlAddChild(m->plibNode, plibNode);
     929    xmlAddChild(m_plibNode, plibNode);
    932930
    933931    // now wrap this in C++
    934     ElementNode *p = new ElementNode;
     932    ElementNode *p = new ElementNode(this, plibNode);
    935933    boost::shared_ptr<ElementNode> pNew(p);
    936     pNew->m->plibNode = plibNode;
    937     pNew->m->pcszName = (const char*)plibNode->name;
    938 
    939934    m->children.push_back(pNew);
    940935
     
    956951    if (!(plibNode = xmlNewText((const xmlChar*)pcszContent)))
    957952        throw std::bad_alloc();
    958     xmlAddChild(m->plibNode, plibNode);
     953    xmlAddChild(m_plibNode, plibNode);
    959954
    960955    // now wrap this in C++
    961     ContentNode *p = new ContentNode;
     956    ContentNode *p = new ContentNode(this, plibNode);
    962957    boost::shared_ptr<ContentNode> pNew(p);
    963     pNew->m->plibNode = plibNode;
    964     pNew->m->pcszName = NULL;
    965 
    966958    m->children.push_back(pNew);
    967959
     
    988980    {
    989981        // libxml side: xmlNewProp creates an attribute
    990         xmlAttr *plibAttr = xmlNewProp(m->plibNode, (xmlChar*)pcszName, (xmlChar*)pcszValue);
     982        xmlAttr *plibAttr = xmlNewProp(m_plibNode, (xmlChar*)pcszName, (xmlChar*)pcszValue);
    991983        const char *pcszAttribName = (const char*)plibAttr->name;
    992984
    993985        // C++ side: create an attribute node around it
    994         boost::shared_ptr<AttributeNode> pNew(new AttributeNode);
    995         pNew->m->plibAttr = plibAttr;
    996         pNew->m->pcszName = (const char*)plibAttr->name;
    997         pNew->m->pParent = this;
     986        boost::shared_ptr<AttributeNode> pNew(new AttributeNode(this, plibAttr));
    998987        // store
    999988        m->attribs[pcszAttribName] = pNew;
     
    10591048}
    10601049
    1061 AttributeNode::AttributeNode()
    1062     : Node(IsAttribute)
    1063 {
    1064 }
    1065 
    1066 ContentNode::ContentNode()
    1067     : Node(IsContent)
     1050AttributeNode::AttributeNode(Node *pParent, xmlAttr *plibAttr)
     1051    : Node(IsAttribute,
     1052           pParent,
     1053           NULL,
     1054           plibAttr)
     1055{
     1056    m_pcszName = (const char*)plibAttr->name;
     1057}
     1058
     1059ContentNode::ContentNode(Node *pParent, xmlNode *plibNode)
     1060    : Node(IsContent,
     1061           pParent,
     1062           plibNode,
     1063           NULL)
    10681064{
    10691065}
     
    11951191void Document::refreshInternals() // private
    11961192{
    1197     m->pRootElement = new ElementNode();
    1198     m->pRootElement->m->plibNode = xmlDocGetRootElement(m->plibDocument);
    1199     m->pRootElement->m->pcszName = (const char*)m->pRootElement->m->plibNode->name;
     1193    m->pRootElement = new ElementNode(NULL, xmlDocGetRootElement(m->plibDocument));
    12001194
    12011195    m->pRootElement->buildChildren();
     
    12401234
    12411235    // now wrap this in C++
    1242     m->pRootElement = new ElementNode();
    1243     m->pRootElement->m->plibNode = plibRootNode;
    1244     m->pRootElement->m->pcszName = (const char*)plibRootNode->name;
     1236    m->pRootElement = new ElementNode(NULL, plibRootNode);
    12451237
    12461238    return m->pRootElement;
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