xmlwrite.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:19k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: xmlwrite.cpp,v 1.5.32.1 2004/07/19 21:04:07 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. /* 
  50.  * $Id: xmlwrite.cpp,v 1.5.32.1 2004/07/19 21:04:07 hubbe Exp $
  51.  *
  52.  * XMLWriter Class Implementation File
  53.  * -----------------------------------
  54.  * 
  55.  * Author: Consumer Group
  56.  * RealNetworks Inc., Copyright (C) 1997, All rights reserved
  57.  * January 12, 1999
  58.  *
  59.  * Abstraction:
  60.  * This file contains the implementation of the XMLWriter class and all it's 
  61.  * helper classes.
  62.  *
  63.  */
  64. // Includes for this file...
  65. #include "xmlwrite.h"
  66. #include "looseprs.h"
  67. #include "hxslist.h"
  68. #include "chxdataf.h"
  69. #include "hxcom.h"
  70. #include "hxbuffer.h"
  71. #include "hxstrutl.h"
  72. //#include <fcntl.h>
  73. // For debugging...
  74. #include "hxassert.h"
  75. #include "hxheap.h"
  76. #ifdef _DEBUG
  77. #undef HX_THIS_FILE             
  78. static const char HX_THIS_FILE[] = __FILE__;
  79. #endif
  80. #define MAX_WRITER_BUFFER 1024
  81. #if defined _WINDOWS
  82. #define WRITER_EOL "n"
  83. #elif defined _MACINTOSH
  84. #define WRITER_EOL "r"
  85. #else
  86. #define WRITER_EOL "n"
  87. #endif
  88. /*
  89.  * XMLWriter
  90.  * ---------
  91.  * Constructor.
  92.  *
  93.  * input:
  94.  * void
  95.  *
  96.  * output:
  97.  * N/A
  98.  *
  99.  */
  100. XMLWriter::XMLWriter(void)
  101. {
  102. }
  103. /*
  104.  * ~XMLWriter
  105.  * ----------
  106.  * Destructor.
  107.  *
  108.  * input:
  109.  * void
  110.  *
  111.  * output:
  112.  * N/A
  113.  *
  114.  */
  115. XMLWriter::~XMLWriter(void)
  116. {
  117.     // Clear it...
  118.     Clear();
  119. }
  120. /*
  121.  * CreateTag
  122.  * ---------
  123.  * Creates a tag in the writer and returns a pointer to it.
  124.  *
  125.  * input:
  126.  * const char *name     - Name for the tag.
  127.  *
  128.  * output:
  129.  * XMLWriterTag *     - Pointer to the newly created tag.
  130.  *
  131.  */
  132. XMLWriterTag *
  133. XMLWriter::CreateTag(const char *name)
  134. {
  135.     // Create the tag...
  136.     XMLWriterTag *newTag = new XMLWriterTag;
  137.     HX_ASSERT(newTag != NULL);
  138.     newTag->SetName(name);
  139.     
  140.     // Add the tag to the array...
  141.     m_tags.AddTail(newTag);
  142.     return newTag;
  143. }
  144. /*
  145.  * Write
  146.  * -----
  147.  * Writes all the data to a IHXBuffer object and returns a pointer to the buffer.
  148.  *
  149.  * input:
  150.  * IHXBuffer * - Pointer to an IHXBuffer.  User must delete it.
  151.  * INT32& length - Number of characters written out to the buffer.
  152.  *
  153.  * output:
  154.  * BOOL - TRUE if successful.
  155.  *
  156.  */
  157. BOOL
  158. XMLWriter::Write(IHXBuffer *buffer, INT32& numChars)
  159. {
  160.     HX_ASSERT(buffer != NULL);
  161.     // Get the size required...
  162.     INT32 length = GetLength();
  163.     // Set the size for the buffer...
  164.     buffer->SetSize(length + length/2);
  165.     // Go through the tags and write them to the buffer...
  166.     LISTPOSITION position = m_tags.GetHeadPosition();
  167.     while (position != NULL)
  168. ((XMLWriterTag *)(m_tags.GetNext(position)))->Write(buffer, numChars);
  169.     // Ok..
  170.     return TRUE;
  171. }
  172. /* 
  173.  * GetLength
  174.  * ---------
  175.  * Returns the entire length required for the tree of xml.
  176.  *
  177.  * input:
  178.  * void
  179.  *
  180.  * output:
  181.  * INT32     - Length to write the xml.
  182.  *
  183.  */
  184. INT32
  185. XMLWriter::GetLength(void) const
  186. {
  187.     INT32 length = 0;
  188.     // Go through the list of tags and sum up their individual lengths....
  189.     LISTPOSITION position = m_tags.GetHeadPosition();
  190.     while (position != NULL)
  191.     {
  192. XMLWriterTag *tag = (XMLWriterTag *)(m_tags.GetNext(position));
  193. length += tag->GetLength();
  194.     }
  195.     return length;
  196. }
  197. /* 
  198.  * Clear
  199.  * -----
  200.  * Clear the structure from memory.
  201.  *
  202.  * input:
  203.  * void
  204.  *
  205.  * output:
  206.  * void
  207.  *
  208.  */
  209. void
  210. XMLWriter::Clear(void)
  211. {
  212.     // If there are any tags in the list, delete them...
  213.     LISTPOSITION position = m_tags.GetHeadPosition();
  214.     while(position != NULL)
  215.     {
  216. delete (XMLWriterTag *)(m_tags.GetNext(position));
  217.     }
  218. }
  219. //*****************************************************************************************************************
  220. // XMLWriterAttribute Implementation
  221. //*****************************************************************************************************************
  222.  
  223. /*
  224.  * XMLWriterAttribute
  225.  * ------------------
  226.  * Writer attribute constructor.
  227.  *
  228.  * input:
  229.  * void
  230.  *
  231.  * output:
  232.  * N/A
  233.  *
  234.  */
  235. XMLWriterAttribute::XMLWriterAttribute(void) : m_name(NULL), m_value(NULL)
  236. {
  237. }
  238.  
  239. /* 
  240.  * ~XMLWriterAttribute
  241.  * -------------------
  242.  * Writer attribute destructor.
  243.  *
  244.  * input:
  245.  * void
  246.  *
  247.  * output:
  248.  * N/A
  249.  *
  250.  */
  251. XMLWriterAttribute::~XMLWriterAttribute(void)
  252. {
  253.     // Delete the strings...
  254.     if (m_name != NULL) delete [] m_name;
  255.     if (m_value != NULL) delete [] m_value;
  256.     m_name = m_value = NULL;
  257. }
  258. /* 
  259.  * Write
  260.  * -----
  261.  * Write to the given buffer.
  262.  *
  263.  * input:
  264.  * IHXBuffer *buffer     - Buffer to write to.
  265.  * INT32 loc     - Pointer into the buffer from where to begin to write.
  266.  *
  267.  * output:
  268.  * void
  269.  *
  270.  */
  271. void
  272. XMLWriterAttribute::Write(IHXBuffer *buffer, INT32& loc)
  273. {
  274.     HX_ASSERT(buffer != NULL);
  275.     
  276.     // If either the name or the value are empty, do not write anything out...
  277.     if (m_name == NULL) return;
  278.     // Properly format what we will write out...
  279.     char temp[MAX_WRITER_BUFFER]; /* Flawfinder: ignore */
  280.     temp[0] = '';
  281.     char tabs[MAX_WRITER_BUFFER]; /* Flawfinder: ignore */
  282.     tabs[0] = '';
  283.     // Create the proper indentation...
  284.     for (INT32 i = 0; i < m_depth; i++)
  285. SafeStrCat(tabs, "t", MAX_WRITER_BUFFER);
  286.     // Create the output string...
  287.     SafeSprintf(temp, MAX_WRITER_BUFFER, "%s%s="%s"", tabs, m_name, m_value);
  288.     // Write to file...
  289.     SafeStrCpy((char *)(buffer->GetBuffer()) + loc,  temp, buffer->GetSize()-loc);
  290.     loc += strlen(temp);
  291. }
  292. /*
  293.  * GetLength
  294.  * ---------
  295.  * Returns the length required to print this attribute.
  296.  *
  297.  * input:
  298.  * void
  299.  *
  300.  * output:
  301.  * INT32     - Length required.
  302.  *
  303.  */
  304. INT32 
  305. XMLWriterAttribute::GetLength(void) const
  306. {
  307.     // Get the lengths of the strings and return their sum...
  308.     INT32 nameLength = strlen(m_name);
  309.     INT32 valueLength = strlen(m_value);
  310.     return m_depth + nameLength + valueLength + 2;
  311. }
  312. /*
  313.  * SetName
  314.  * -------
  315.  * Set the name for the attribute.
  316.  *
  317.  * input:
  318.  * const char *name     - Name of the attribute.
  319.  *
  320.  * output:
  321.  * void
  322.  *
  323.  */
  324. void 
  325. XMLWriterAttribute::SetName(const char *name)
  326. {
  327.     if (m_name != NULL) delete [] m_name;
  328.     m_name = NULL;
  329.     if (name == NULL) return;
  330.     m_name = new char[strlen(name) + 1];
  331.     strcpy(m_name, name); /* Flawfinder: ignore */
  332. }
  333. /*
  334.  * SetValue
  335.  * --------
  336.  * Set the value for the attribute.
  337.  *
  338.  * input:
  339.  * const char *value - Value of the attribute.
  340.  *
  341.  * output:
  342.  * void
  343.  *
  344.  */
  345. void
  346. XMLWriterAttribute::SetValue(const char *value)
  347. {
  348.     if (m_value != NULL) delete [] m_value;
  349.     m_value = NULL;
  350.     if (value == NULL) return;
  351.     m_value = new char[strlen(value) + 1];
  352.     strcpy(m_value, value); /* Flawfinder: ignore */
  353. }
  354. //*****************************************************************************************************************
  355. // XMLWriterTag Implementation
  356. //*****************************************************************************************************************
  357. /* 
  358.  * XMLWriterTag
  359.  * ------------
  360.  * Constructor.
  361.  *
  362.  * input:
  363.  * void
  364.  *
  365.  * output:
  366.  * N/A
  367.  *
  368.  */
  369. XMLWriterTag::XMLWriterTag(void) : m_type(XMLPlainTag), m_name(NULL), m_comment(NULL), m_depth(0)
  370. {
  371. }
  372. /* 
  373.  * ~XMLWriterTag
  374.  * -------------
  375.  * Destructor.
  376.  *
  377.  * input:
  378.  * void
  379.  *
  380.  * output:
  381.  * N/A
  382.  *
  383.  */
  384. XMLWriterTag::~XMLWriterTag(void)
  385. {
  386.     // Go through the list of children and delete each of them.  This will then be
  387.     // repeated by the children's children and we will recursively delete the tree.
  388.     LISTPOSITION tagPosition = m_tags.GetHeadPosition();
  389.     while (tagPosition != NULL)
  390.     {
  391. delete (XMLWriterTag *)(m_tags.GetNext(tagPosition));
  392.     }
  393.     // Delete the attributes...
  394.     LISTPOSITION attrPosition = m_attributes.GetHeadPosition();
  395.     while (attrPosition != NULL)
  396.     {
  397. delete (XMLWriterAttribute *)(m_attributes.GetNext(attrPosition));
  398.     }   
  399.     // Delete the strings...
  400.     if (m_name != NULL) delete [] m_name;
  401.     if (m_comment != NULL) delete [] m_comment;
  402.     m_name = NULL;
  403.     m_comment = NULL;
  404. }
  405. /*
  406.  * GetLength
  407.  * ---------
  408.  * Returns the length required to print this and all it's attributes.
  409.  *
  410.  * input:
  411.  * void
  412.  *
  413.  * output:
  414.  * INT32     - The length required.
  415.  *
  416.  */
  417. INT32
  418. XMLWriterTag::GetLength(void) const
  419. {
  420.     INT32 length = 0;
  421.     // Get the combined attributes lengths...
  422.     LISTPOSITION position = m_attributes.GetHeadPosition();
  423.     while (position != NULL)
  424.     {
  425. length += ((XMLWriterAttribute *)(m_attributes.GetNext(position)))->GetLength();
  426.     }
  427.     // Get the combined lengths of the child tags...
  428.     position = m_tags.GetHeadPosition();
  429.     while (position != NULL)
  430.     {
  431. length += ((XMLWriterTag *)(m_tags.GetNext(position)))->GetLength();
  432.     }
  433.     // Tack on the length required in the different cases...
  434.     length += 2*m_depth + ((m_name != NULL)? 2*(strlen(m_name)) : 0) + 20 + ((m_comment != NULL)? strlen(m_comment) : 0);   // 20 is arbitrary, based on all the stuff needed for brackets and slashes.
  435.     return length;
  436. }
  437. /*
  438.  * Write
  439.  * -----
  440.  * Write out this tag to the given file object.
  441.  *
  442.  * input:
  443.  * IHXBuffer *buffer - Pointer to buffer to use.
  444.  * INT32& loc - Pointer to a location in the buffer where to print to.
  445.  *
  446.  * output:
  447.  * void
  448.  *
  449.  */
  450. void
  451. XMLWriterTag::Write(IHXBuffer *buffer, INT32& loc)
  452. {
  453.     char temp[MAX_WRITER_BUFFER]; /* Flawfinder: ignore */
  454.     char tabs[MAX_WRITER_BUFFER]; /* Flawfinder: ignore */
  455.     temp[0] = tabs[0] = '';
  456.     
  457.     // See the depth of this tag and create a string composed of depth number of tabs...
  458.     for (INT32 i = 0; i < m_depth; i++)
  459. SafeStrCat(tabs,  "t", MAX_WRITER_BUFFER);
  460.     // Switch on the type of tag...
  461.     switch (m_type)
  462.     {
  463.     case XMLPlainTag:
  464. {
  465.     // If the name field is empty, return...
  466.     if (m_name == NULL) return;
  467.     // If there are attributes....
  468.     if (m_attributes.GetCount() > 0)
  469.     {
  470. // Open the open tag...
  471. SafeSprintf(temp, MAX_WRITER_BUFFER, "%s<%s%s", tabs, m_name, WRITER_EOL);
  472. SafeStrCpy((char *)(buffer->GetBuffer()) + loc,  temp, buffer->GetSize()-loc);
  473. loc += strlen(temp);
  474. // Write the attributes...
  475. WriteAttributes(buffer, loc);
  476. // Close the open tag...
  477. SafeSprintf(temp, MAX_WRITER_BUFFER, ">%s", WRITER_EOL);
  478. SafeStrCpy((char *)(buffer->GetBuffer()) + loc,  temp, buffer->GetSize()-loc);
  479. loc += strlen(temp);
  480. // Write any other tags...
  481. WriteTags(buffer, loc);
  482. // Write the closing tag...
  483. SafeSprintf(temp, MAX_WRITER_BUFFER, "%s</%s>%s", tabs, m_name, WRITER_EOL);
  484. SafeStrCpy((char *)(buffer->GetBuffer()) + loc,  temp, buffer->GetSize()-loc);
  485. loc += strlen(temp);
  486.     }
  487.     // When there are no attributes, just open and close the tag...
  488.     else
  489.     {
  490. // Open the tag...
  491. SafeSprintf(temp, MAX_WRITER_BUFFER, "%s<%s>%s", tabs, m_name, WRITER_EOL);
  492. SafeStrCpy((char *)(buffer->GetBuffer()) + loc,  temp, buffer->GetSize()-loc);
  493. loc += strlen(temp);
  494. // Write the other tags...
  495. WriteTags(buffer, loc);
  496. // Close the tag...
  497. SafeSprintf(temp, MAX_WRITER_BUFFER, "%s</%s>%s", tabs, m_name, WRITER_EOL);
  498. SafeStrCpy((char *)(buffer->GetBuffer()) + loc,  temp, buffer->GetSize()-loc);
  499. loc += strlen(temp);
  500.     }
  501. }
  502. break;
  503.     case XMLCommentTag:
  504. {
  505.     // If the comment field is empty, return...
  506.     if (m_comment == NULL) return;
  507.     // Otherwise, format it and write it out...
  508.     SafeSprintf(temp, MAX_WRITER_BUFFER, "%s<-- %s -->%s", tabs, m_comment, WRITER_EOL);
  509.     SafeStrCpy((char *)(buffer->GetBuffer()) + loc,  temp, buffer->GetSize()-loc);
  510.     loc += strlen(temp);
  511. }
  512. break;
  513.     case XMLDirectiveTag:
  514. {
  515. }
  516. break;
  517.     case XMLProcInstTag:
  518. {
  519.     // If there are no attributes, then don't print out...
  520.     if (m_attributes.IsEmpty()) return;
  521.     if (m_name == NULL) return;
  522.     // Otherwise, format the beginning...
  523.     SafeSprintf(temp, MAX_WRITER_BUFFER, "%s<?%s ", tabs, m_name);
  524.     SafeStrCpy((char *)(buffer->GetBuffer()) + loc,  temp, buffer->GetSize()-loc);
  525.     loc += strlen(temp);
  526.     // Write out the attributes...
  527.     WriteAttributes(buffer, loc);
  528.     // Format the ending...
  529.     SafeSprintf(temp, buffer->GetSize()-loc, "?>%s", WRITER_EOL);
  530.     SafeStrCpy((char *)(buffer->GetBuffer()) + loc,  temp, buffer->GetSize()-loc);
  531.     loc += strlen(temp);
  532. }
  533. break;
  534.     }
  535. }
  536. /* 
  537.  * SetProcessingInstruction
  538.  * ------------------------
  539.  * Make this tag a processing instruction.
  540.  *
  541.  * input:
  542.  * const char *instruction     - Name of the instruction to use.
  543.  *
  544.  * output:
  545.  * void
  546.  *
  547.  */
  548. void 
  549. XMLWriterTag::SetProcessingInstruction(const char *instruction)
  550. {
  551.     m_type = XMLProcInstTag;
  552.     if (m_name != NULL) delete [] m_name;
  553.     m_name = NULL;
  554.     if (instruction != NULL)
  555.     {
  556. m_name = new char[strlen(instruction) + 1];
  557. strcpy(m_name, instruction); /* Flawfinder: ignore */
  558.     }
  559. }
  560. /*
  561.  * WriteAttributes
  562.  * ---------------
  563.  * Write out the attributes for this tag.
  564.  *
  565.  * input:
  566.  * IHXBuffer *buffer - Buffer to write to.
  567.  * INT32& loc - Location to where we start writing.
  568.  *
  569.  * output:
  570.  * void
  571.  *
  572.  */
  573. void 
  574. XMLWriterTag::WriteAttributes(IHXBuffer *buffer, INT32& loc)
  575. {
  576.     // If there are no attributes, return...
  577.     if (m_attributes.IsEmpty()) return;
  578.     // Write out the attributes to the buffer...
  579.     LISTPOSITION position = m_attributes.GetHeadPosition();
  580.     while (position != NULL)
  581.     {
  582. ((XMLWriterAttribute *)(m_attributes.GetNext(position)))->Write(buffer, loc);
  583. if (position != NULL) *(((char *)(buffer->GetBuffer())) + loc++) = 'n';
  584.     }
  585. }
  586. /*
  587.  * WriteTags
  588.  * ---------
  589.  * Write out the tags for this tag.
  590.  *
  591.  * input:
  592.  * IHXBuffer *buffer - Buffer to write to.
  593.  * INT32& loc - Location to where we start writing.
  594.  *
  595.  * output:
  596.  * void
  597.  *
  598.  */
  599. void 
  600. XMLWriterTag::WriteTags(IHXBuffer *buffer, INT32& loc)
  601. {
  602.     // If there are no attributes, return...
  603.     if (m_tags.IsEmpty()) return;
  604.     // Get the size and call write on each...
  605.     LISTPOSITION position = m_tags.GetHeadPosition();
  606.     while (position != NULL)
  607.     {
  608. ((XMLWriterTag *)(m_tags.GetNext(position)))->Write(buffer, loc);
  609.     }
  610. }
  611. /*
  612.  * CreateTag
  613.  * ---------
  614.  * Create a tag with the given name, adding it to the child list and return it.
  615.  *
  616.  * input:
  617.  * const char *name     - Name of the tag.
  618.  *
  619.  * output:
  620.  * XMLWriterTag *     - Pointer to the newly created tag.
  621.  *
  622.  */
  623. XMLWriterTag *
  624. XMLWriterTag::CreateTag(const char *name)
  625. {
  626.     XMLWriterTag *newTag = new XMLWriterTag;
  627.     HX_ASSERT(newTag != NULL);
  628.     newTag->SetName(name);
  629.     newTag->m_depth = m_depth + 1;
  630.     m_tags.AddTail(newTag);
  631.     return newTag;
  632. }
  633. /*
  634.  * AddAttribute
  635.  * ------------
  636.  * Add an attribute to the tag and then return a pointer to that attribute.
  637.  *
  638.  * input:
  639.  * const char *name     - Name of the attribute.
  640.  * const char *value     - Value of the attribute.
  641.  *
  642.  * output:
  643.  * XMLWriterAttribute *     - Attribute that was added.
  644.  *
  645.  */
  646. XMLWriterAttribute *
  647. XMLWriterTag::AddAttribute(const char *name, const char *value)
  648. {
  649.     // Create an attribute...
  650.     XMLWriterAttribute *newAttribute = new XMLWriterAttribute;
  651.     HX_ASSERT(newAttribute != NULL);
  652.     // Set the name and value...
  653.     newAttribute->SetName(name);
  654.     newAttribute->SetValue(value);
  655.     newAttribute->m_depth = m_depth;
  656.     // Add the attribute...
  657.     m_attributes.AddTail(newAttribute);
  658.     return newAttribute;
  659. }
  660. /* 
  661.  * CreateAttribute
  662.  * ---------------
  663.  * Creates an attribute, adding it to the list of attributes, then returning the pointer to it.
  664.  *
  665.  * input:
  666.  * void
  667.  *
  668.  * output:
  669.  * XMLWriterAttribute *     - The pointer to the newly created attribute.
  670.  *
  671.  */
  672. XMLWriterAttribute *
  673. XMLWriterTag::CreateAttribute(void)
  674. {
  675.     // Create the attribute...
  676.     XMLWriterAttribute *newAttribute = new XMLWriterAttribute;
  677.     HX_ASSERT(newAttribute != NULL);
  678.     // Add the attribute to the list of attributes...
  679.     m_attributes.AddTail(newAttribute);
  680.     newAttribute->m_depth = m_depth;
  681.     return newAttribute;
  682. }
  683. /*
  684.  * SetComment
  685.  * ----------
  686.  * Set the comment and set the type as a comment.
  687.  *
  688.  * input:
  689.  * const char *comment - Comment to set.
  690.  *
  691.  * output:
  692.  * void
  693.  *
  694.  */
  695. void
  696. XMLWriterTag::SetComment(const char *comment)
  697. {
  698.     if (m_comment != NULL) delete [] m_comment;
  699.     m_comment = NULL;
  700.     if (comment != NULL)
  701.     {
  702. m_comment = new char[strlen(comment) + 1];
  703. strcpy(m_comment, comment); /* Flawfinder: ignore */
  704.     }
  705.     m_type = XMLCommentTag;
  706. }
  707. /* 
  708.  * SetName
  709.  * -------
  710.  * Set the name of this tag.
  711.  *
  712.  * input:
  713.  * const char *name - Name to set for this tag.
  714.  *
  715.  * output:
  716.  * void
  717.  *
  718.  */
  719. void
  720. XMLWriterTag::SetName(const char *name)
  721. {
  722.     if (m_name != NULL) delete [] m_name;
  723.     m_name = NULL;
  724.     if (name != NULL)
  725.     {
  726. m_name = new char[strlen(name) + 1];
  727. strcpy(m_name, name); /* Flawfinder: ignore */
  728.     }
  729. }