~ubuntu-branches/ubuntu/oneiric/psi/oneiric

« back to all changes in this revision

Viewing changes to src/tools/qxml/qdom.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jan Niehusmann
  • Date: 2006-01-20 00:20:36 UTC
  • mfrom: (1.2.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20060120002036-7nw6yo6totip0ee5
Tags: 0.10-2
* Added upstream changelog (Closes: Bug#327748)
* Mention --no-gpg and --no-gpg-agent in manpage (Closes: Bug#204416)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/****************************************************************************
 
2
** $Id: qdom.cpp,v 1.1 2004/02/29 00:05:06 justin Exp $
 
3
**
 
4
** Implementation of QDomDocument and related classes.
 
5
**
 
6
** Created : 000518
 
7
**
 
8
** Copyright (C) 1992-2002 Trolltech AS.  All rights reserved.
 
9
**
 
10
** This file is part of the xml module of the Qt GUI Toolkit.
 
11
**
 
12
** This file may be distributed under the terms of the Q Public License
 
13
** as defined by Trolltech AS of Norway and appearing in the file
 
14
** LICENSE.QPL included in the packaging of this file.
 
15
**
 
16
** This file may be distributed and/or modified under the terms of the
 
17
** GNU General Public License version 2 as published by the Free Software
 
18
** Foundation and appearing in the file LICENSE.GPL included in the
 
19
** packaging of this file.
 
20
**
 
21
** Licensees holding valid Qt Enterprise Edition licenses may use this
 
22
** file in accordance with the Qt Commercial License Agreement provided
 
23
** with the Software.
 
24
**
 
25
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 
26
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 
27
**
 
28
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
 
29
**   information about Qt Commercial License Agreements.
 
30
** See http://www.trolltech.com/qpl/ for QPL licensing information.
 
31
** See http://www.trolltech.com/gpl/ for GPL licensing information.
 
32
**
 
33
** Contact info@trolltech.com if any conditions of this licensing are
 
34
** not clear to you.
 
35
**
 
36
**********************************************************************/
 
37
 
 
38
#include "qdom.h"
 
39
 
 
40
#ifndef QT_NO_DOM
 
41
 
 
42
#include "qxml.h"
 
43
#include "qptrlist.h"
 
44
#include "qdict.h"
 
45
#include "qtextstream.h"
 
46
#include "qtextcodec.h"
 
47
#include "qiodevice.h"
 
48
#include "qregexp.h"
 
49
#include "qbuffer.h"
 
50
 
 
51
namespace PsiXml {
 
52
 
 
53
/*
 
54
  ### old todo comments -- I don't know if they still apply...
 
55
 
 
56
  If the document dies, remove all pointers to it from children
 
57
  which can not be deleted at this time.
 
58
 
 
59
  If a node dies and has direct children which can not be deleted,
 
60
  then remove the pointer to the parent.
 
61
 
 
62
  createElement and friends create double reference counts.
 
63
*/
 
64
 
 
65
/*
 
66
  Reference counting:
 
67
 
 
68
  Some simple rules:
 
69
  1) If an intern object returns a pointer to another intern object
 
70
     then the reference count of the returned object is not increased.
 
71
  2) If an extern object is created and gets a pointer to some intern
 
72
     object, then the extern object increases the intern objects reference count.
 
73
  3) If an extern object is deleted, then it decreases the reference count
 
74
     on its associated intern object and deletes it if nobody else hold references
 
75
     on the intern object.
 
76
*/
 
77
 
 
78
 
 
79
/*
 
80
  Helper to split a qualified name in the prefix and local name.
 
81
*/
 
82
static void qt_split_namespace( QString& prefix, QString& name, const QString& qName, bool hasURI )
 
83
{
 
84
    int i = qName.find( ':' );
 
85
    if ( i == -1 ) {
 
86
        if ( hasURI )
 
87
            prefix = "";
 
88
        else
 
89
            prefix = QString::null;
 
90
        name = qName;
 
91
    } else {
 
92
        prefix = qName.left( i );
 
93
        name = qName.mid( i + 1 );
 
94
    }
 
95
}
 
96
 
 
97
/*
 
98
  Counter for the QDomNodeListPrivate timestamps.
 
99
*/
 
100
static volatile long qt_nodeListTime = 0;
 
101
 
 
102
/**************************************************************
 
103
 *
 
104
 * Private class declerations
 
105
 *
 
106
 **************************************************************/
 
107
 
 
108
class QDomImplementationPrivate : public QShared
 
109
{
 
110
public:
 
111
    QDomImplementationPrivate();
 
112
    ~QDomImplementationPrivate();
 
113
 
 
114
    QDomImplementationPrivate* clone();
 
115
 
 
116
};
 
117
 
 
118
class QDomNodePrivate : public QShared
 
119
{
 
120
public:
 
121
    QDomNodePrivate( QDomDocumentPrivate*, QDomNodePrivate* parent = 0 );
 
122
    QDomNodePrivate( QDomNodePrivate* n, bool deep );
 
123
    virtual ~QDomNodePrivate();
 
124
 
 
125
    QString nodeName() const { return name; }
 
126
    QString nodeValue() const { return value; }
 
127
    virtual void setNodeValue( const QString& v ) { value = v; }
 
128
 
 
129
    QDomDocumentPrivate* ownerDocument();
 
130
    void setOwnerDocument( QDomDocumentPrivate* doc );
 
131
 
 
132
    virtual QDomNamedNodeMapPrivate* attributes();
 
133
    virtual bool hasAttributes() { return FALSE; }
 
134
    virtual QDomNodePrivate* insertBefore( QDomNodePrivate* newChild, QDomNodePrivate* refChild );
 
135
    virtual QDomNodePrivate* insertAfter( QDomNodePrivate* newChild, QDomNodePrivate* refChild );
 
136
    virtual QDomNodePrivate* replaceChild( QDomNodePrivate* newChild, QDomNodePrivate* oldChild );
 
137
    virtual QDomNodePrivate* removeChild( QDomNodePrivate* oldChild );
 
138
    virtual QDomNodePrivate* appendChild( QDomNodePrivate* newChild );
 
139
 
 
140
    QDomNodePrivate* namedItem( const QString& name );
 
141
 
 
142
    virtual QDomNodePrivate* cloneNode( bool deep = TRUE );
 
143
    virtual void normalize();
 
144
    virtual void clear();
 
145
 
 
146
    QDomNodePrivate* parent() { return hasParent ? ownerNode : 0; }
 
147
    void setParent( QDomNodePrivate *p ) { ownerNode = p; hasParent = TRUE; }
 
148
    void setNoParent() {
 
149
        ownerNode = hasParent ? (QDomNodePrivate*)ownerDocument() : 0;
 
150
        hasParent = FALSE;
 
151
    }
 
152
 
 
153
    // Dynamic cast
 
154
    virtual bool isAttr() { return FALSE; }
 
155
    virtual bool isCDATASection() { return FALSE; }
 
156
    virtual bool isDocumentFragment() { return FALSE; }
 
157
    virtual bool isDocument() { return FALSE; }
 
158
    virtual bool isDocumentType() { return FALSE; }
 
159
    virtual bool isElement() { return FALSE; }
 
160
    virtual bool isEntityReference() { return FALSE; }
 
161
    virtual bool isText() { return FALSE; }
 
162
    virtual bool isEntity() { return FALSE; }
 
163
    virtual bool isNotation() { return FALSE; }
 
164
    virtual bool isProcessingInstruction() { return FALSE; }
 
165
    virtual bool isCharacterData() { return FALSE; }
 
166
    virtual bool isComment() { return FALSE; }
 
167
    virtual QDomNode::NodeType nodeType() const { return QDomNode::BaseNode; }
 
168
 
 
169
    virtual void save( QTextStream&, int, int ) const;
 
170
 
 
171
    // Variables
 
172
    QDomNodePrivate* prev;
 
173
    QDomNodePrivate* next;
 
174
    QDomNodePrivate* ownerNode; // either the node's parent or the node's owner document
 
175
    QDomNodePrivate* first;
 
176
    QDomNodePrivate* last;
 
177
 
 
178
    QString name; // this is the local name if prefix != null
 
179
    QString value;
 
180
    QString prefix; // set this only for ElementNode and AttributeNode
 
181
    QString namespaceURI; // set this only for ElementNode and AttributeNode
 
182
    bool createdWithDom1Interface;
 
183
    bool hasParent;
 
184
};
 
185
 
 
186
class QDomNodeListPrivate : public QShared
 
187
{
 
188
public:
 
189
    QDomNodeListPrivate( QDomNodePrivate* );
 
190
    QDomNodeListPrivate( QDomNodePrivate*, const QString&  );
 
191
    QDomNodeListPrivate( QDomNodePrivate*, const QString&, const QString&  );
 
192
    virtual ~QDomNodeListPrivate();
 
193
 
 
194
    virtual bool operator== ( const QDomNodeListPrivate& ) const;
 
195
    virtual bool operator!= ( const QDomNodeListPrivate& ) const;
 
196
 
 
197
    void createList();
 
198
    virtual QDomNodePrivate* item( int index );
 
199
    virtual uint length() const;
 
200
 
 
201
    QDomNodePrivate* node_impl;
 
202
    QString tagname;
 
203
    QString nsURI;
 
204
    QPtrList<QDomNodePrivate> list;
 
205
    long timestamp;
 
206
};
 
207
 
 
208
class QDomNamedNodeMapPrivate : public QShared
 
209
{
 
210
public:
 
211
    QDomNamedNodeMapPrivate( QDomNodePrivate* );
 
212
    ~QDomNamedNodeMapPrivate();
 
213
 
 
214
    QDomNodePrivate* namedItem( const QString& name ) const;
 
215
    QDomNodePrivate* namedItemNS( const QString& nsURI, const QString& localName ) const;
 
216
    QDomNodePrivate* setNamedItem( QDomNodePrivate* arg );
 
217
    QDomNodePrivate* setNamedItemNS( QDomNodePrivate* arg );
 
218
    QDomNodePrivate* removeNamedItem( const QString& name );
 
219
    QDomNodePrivate* item( int index ) const;
 
220
    uint length() const;
 
221
    bool contains( const QString& name ) const;
 
222
    bool containsNS( const QString& nsURI, const QString & localName ) const;
 
223
 
 
224
    /**
 
225
     * Remove all children from the map.
 
226
     */
 
227
    void clearMap();
 
228
    bool isReadOnly() { return readonly; }
 
229
    void setReadOnly( bool r ) { readonly = r; }
 
230
    bool isAppendToParent() { return appendToParent; }
 
231
    /**
 
232
     * If TRUE, then the node will redirect insert/remove calls
 
233
     * to its parent by calling QDomNodePrivate::appendChild or removeChild.
 
234
     * In addition the map wont increase or decrease the reference count
 
235
     * of the nodes it contains.
 
236
     *
 
237
     * By default this value is FALSE and the map will handle reference counting
 
238
     * by itself.
 
239
     */
 
240
    void setAppendToParent( bool b ) { appendToParent = b; }
 
241
 
 
242
    /**
 
243
     * Creates a copy of the map. It is a deep copy
 
244
     * that means that all children are cloned.
 
245
     */
 
246
    QDomNamedNodeMapPrivate* clone( QDomNodePrivate* parent );
 
247
 
 
248
    // Variables
 
249
    QDict<QDomNodePrivate> map;
 
250
    QDomNodePrivate* parent;
 
251
    bool readonly;
 
252
    bool appendToParent;
 
253
};
 
254
 
 
255
class QDomDocumentTypePrivate : public QDomNodePrivate
 
256
{
 
257
public:
 
258
    QDomDocumentTypePrivate( QDomDocumentPrivate*, QDomNodePrivate* parent = 0 );
 
259
    QDomDocumentTypePrivate( QDomDocumentTypePrivate* n, bool deep );
 
260
    ~QDomDocumentTypePrivate();
 
261
    void init();
 
262
 
 
263
    // Reimplemented from QDomNodePrivate
 
264
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
265
    QDomNodePrivate* insertBefore( QDomNodePrivate* newChild, QDomNodePrivate* refChild );
 
266
    QDomNodePrivate* insertAfter( QDomNodePrivate* newChild, QDomNodePrivate* refChild );
 
267
    QDomNodePrivate* replaceChild( QDomNodePrivate* newChild, QDomNodePrivate* oldChild );
 
268
    QDomNodePrivate* removeChild( QDomNodePrivate* oldChild );
 
269
    QDomNodePrivate* appendChild( QDomNodePrivate* newChild );
 
270
 
 
271
    bool isDocumentType() { return TRUE; }
 
272
    QDomNode::NodeType nodeType() const { return QDomNode::DocumentTypeNode; }
 
273
 
 
274
    void save( QTextStream& s, int, int ) const;
 
275
 
 
276
    // Variables
 
277
    QDomNamedNodeMapPrivate* entities;
 
278
    QDomNamedNodeMapPrivate* notations;
 
279
    QString publicId;
 
280
    QString systemId;
 
281
    QString internalSubset;
 
282
};
 
283
 
 
284
class QDomDocumentFragmentPrivate : public QDomNodePrivate
 
285
{
 
286
public:
 
287
    QDomDocumentFragmentPrivate( QDomDocumentPrivate*, QDomNodePrivate* parent = 0 );
 
288
    QDomDocumentFragmentPrivate( QDomNodePrivate* n, bool deep );
 
289
    ~QDomDocumentFragmentPrivate();
 
290
 
 
291
    // Reimplemented from QDomNodePrivate
 
292
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
293
    bool isDocumentFragment() { return TRUE; }
 
294
    QDomNode::NodeType nodeType() const { return QDomNode::DocumentFragmentNode; }
 
295
};
 
296
 
 
297
class QDomCharacterDataPrivate : public QDomNodePrivate
 
298
{
 
299
public:
 
300
    QDomCharacterDataPrivate( QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& data );
 
301
    QDomCharacterDataPrivate( QDomCharacterDataPrivate* n, bool deep );
 
302
    ~QDomCharacterDataPrivate();
 
303
 
 
304
    uint dataLength() const;
 
305
    QString substringData( unsigned long offset, unsigned long count ) const;
 
306
    void appendData( const QString& arg );
 
307
    void insertData( unsigned long offset, const QString& arg );
 
308
    void deleteData( unsigned long offset, unsigned long count );
 
309
    void replaceData( unsigned long offset, unsigned long count, const QString& arg );
 
310
 
 
311
    // Reimplemented from QDomNodePrivate
 
312
    bool isCharacterData() { return TRUE; }
 
313
    QDomNode::NodeType nodeType() const { return QDomNode::CharacterDataNode; }
 
314
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
315
 
 
316
};
 
317
 
 
318
class QDomTextPrivate : public QDomCharacterDataPrivate
 
319
{
 
320
public:
 
321
    QDomTextPrivate( QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& value );
 
322
    QDomTextPrivate( QDomTextPrivate* n, bool deep );
 
323
    ~QDomTextPrivate();
 
324
 
 
325
    QDomTextPrivate* splitText( int offset );
 
326
 
 
327
    // Reimplemented from QDomNodePrivate
 
328
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
329
    bool isText() { return TRUE; }
 
330
    QDomNode::NodeType nodeType() const { return QDomNode::TextNode; }
 
331
    void save( QTextStream& s, int, int ) const;
 
332
 
 
333
};
 
334
 
 
335
class QDomAttrPrivate : public QDomNodePrivate
 
336
{
 
337
public:
 
338
    QDomAttrPrivate( QDomDocumentPrivate*, QDomNodePrivate*, const QString& name );
 
339
    QDomAttrPrivate( QDomDocumentPrivate*, QDomNodePrivate*, const QString& nsURI, const QString& qName );
 
340
    QDomAttrPrivate( QDomAttrPrivate* n, bool deep );
 
341
    ~QDomAttrPrivate();
 
342
 
 
343
    bool specified() const;
 
344
 
 
345
    // Reimplemented from QDomNodePrivate
 
346
    void setNodeValue( const QString& v );
 
347
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
348
    bool isAttr() { return TRUE; }
 
349
    QDomNode::NodeType nodeType() const { return QDomNode::AttributeNode; }
 
350
    void save( QTextStream& s, int, int ) const;
 
351
 
 
352
    // Variables
 
353
    bool m_specified;
 
354
};
 
355
 
 
356
class QDomElementPrivate : public QDomNodePrivate
 
357
{
 
358
public:
 
359
    QDomElementPrivate( QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& name );
 
360
    QDomElementPrivate( QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& nsURI, const QString& qName );
 
361
    QDomElementPrivate( QDomElementPrivate* n, bool deep );
 
362
    ~QDomElementPrivate();
 
363
 
 
364
    QString attribute( const QString& name,  const QString& defValue ) const;
 
365
    QString attributeNS( const QString& nsURI, const QString& localName, const QString& defValue ) const;
 
366
    void setAttribute( const QString& name, const QString& value );
 
367
    void setAttributeNS( const QString& nsURI, const QString& qName, const QString& newValue );
 
368
    void removeAttribute( const QString& name );
 
369
    QDomAttrPrivate* attributeNode( const QString& name);
 
370
    QDomAttrPrivate* attributeNodeNS( const QString& nsURI, const QString& localName );
 
371
    QDomAttrPrivate* setAttributeNode( QDomAttrPrivate* newAttr );
 
372
    QDomAttrPrivate* setAttributeNodeNS( QDomAttrPrivate* newAttr );
 
373
    QDomAttrPrivate* removeAttributeNode( QDomAttrPrivate* oldAttr );
 
374
    bool hasAttribute( const QString& name );
 
375
    bool hasAttributeNS( const QString& nsURI, const QString& localName );
 
376
 
 
377
    QString text();
 
378
 
 
379
    // Reimplemented from QDomNodePrivate
 
380
    QDomNamedNodeMapPrivate* attributes() { return m_attr; }
 
381
    bool hasAttributes() { return ( m_attr->length() > 0 ); }
 
382
    bool isElement() { return TRUE; }
 
383
    QDomNode::NodeType nodeType() const { return QDomNode::ElementNode; }
 
384
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
385
    void save( QTextStream& s, int, int ) const;
 
386
 
 
387
    // Variables
 
388
    QDomNamedNodeMapPrivate* m_attr;
 
389
};
 
390
 
 
391
 
 
392
class QDomCommentPrivate : public QDomCharacterDataPrivate
 
393
{
 
394
public:
 
395
    QDomCommentPrivate( QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& value );
 
396
    QDomCommentPrivate( QDomCommentPrivate* n, bool deep );
 
397
    ~QDomCommentPrivate();
 
398
 
 
399
    // Reimplemented from QDomNodePrivate
 
400
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
401
    bool isComment() { return TRUE; }
 
402
    QDomNode::NodeType nodeType() const { return QDomNode::CommentNode; }
 
403
    void save( QTextStream& s, int, int ) const;
 
404
 
 
405
};
 
406
 
 
407
class QDomCDATASectionPrivate : public QDomTextPrivate
 
408
{
 
409
public:
 
410
    QDomCDATASectionPrivate( QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& value );
 
411
    QDomCDATASectionPrivate( QDomCDATASectionPrivate* n, bool deep );
 
412
    ~QDomCDATASectionPrivate();
 
413
 
 
414
    // Reimplemented from QDomNodePrivate
 
415
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
416
    bool isCDATASection() { return TRUE; }
 
417
    QDomNode::NodeType nodeType() const { return QDomNode::CDATASectionNode; }
 
418
    void save( QTextStream& s, int, int ) const;
 
419
 
 
420
};
 
421
 
 
422
class QDomNotationPrivate : public QDomNodePrivate
 
423
{
 
424
public:
 
425
    QDomNotationPrivate( QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& name,
 
426
                          const QString& pub, const QString& sys );
 
427
    QDomNotationPrivate( QDomNotationPrivate* n, bool deep );
 
428
    ~QDomNotationPrivate();
 
429
 
 
430
    // Reimplemented from QDomNodePrivate
 
431
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
432
    bool isNotation() { return TRUE; }
 
433
    QDomNode::NodeType nodeType() const { return QDomNode::NotationNode; }
 
434
    void save( QTextStream& s, int, int ) const;
 
435
 
 
436
    // Variables
 
437
    QString m_sys;
 
438
    QString m_pub;
 
439
};
 
440
 
 
441
class QDomEntityPrivate : public QDomNodePrivate
 
442
{
 
443
public:
 
444
    QDomEntityPrivate( QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& name,
 
445
                        const QString& pub, const QString& sys, const QString& notation );
 
446
    QDomEntityPrivate( QDomEntityPrivate* n, bool deep );
 
447
    ~QDomEntityPrivate();
 
448
 
 
449
    // Reimplemented from QDomNodePrivate
 
450
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
451
    bool isEntity() { return TRUE; }
 
452
    QDomNode::NodeType nodeType() const { return QDomNode::EntityNode; }
 
453
    void save( QTextStream& s, int, int ) const;
 
454
 
 
455
    // Variables
 
456
    QString m_sys;
 
457
    QString m_pub;
 
458
    QString m_notationName;
 
459
};
 
460
 
 
461
class QDomEntityReferencePrivate : public QDomNodePrivate
 
462
{
 
463
public:
 
464
    QDomEntityReferencePrivate( QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& name );
 
465
    QDomEntityReferencePrivate( QDomNodePrivate* n, bool deep );
 
466
    ~QDomEntityReferencePrivate();
 
467
 
 
468
    // Reimplemented from QDomNodePrivate
 
469
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
470
    bool isEntityReference() { return TRUE; }
 
471
    QDomNode::NodeType nodeType() const { return QDomNode::EntityReferenceNode; }
 
472
    void save( QTextStream& s, int, int ) const;
 
473
};
 
474
 
 
475
class QDomProcessingInstructionPrivate : public QDomNodePrivate
 
476
{
 
477
public:
 
478
    QDomProcessingInstructionPrivate( QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& target,
 
479
                                       const QString& data);
 
480
    QDomProcessingInstructionPrivate( QDomProcessingInstructionPrivate* n, bool deep );
 
481
    ~QDomProcessingInstructionPrivate();
 
482
 
 
483
    // Reimplemented from QDomNodePrivate
 
484
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
485
    bool isProcessingInstruction() { return TRUE; }
 
486
    QDomNode::NodeType nodeType() const { return QDomNode::ProcessingInstructionNode; }
 
487
    void save( QTextStream& s, int, int ) const;
 
488
};
 
489
 
 
490
class QDomDocumentPrivate : public QDomNodePrivate
 
491
{
 
492
public:
 
493
    QDomDocumentPrivate();
 
494
    QDomDocumentPrivate( const QString& name );
 
495
    QDomDocumentPrivate( QDomDocumentTypePrivate* dt );
 
496
    QDomDocumentPrivate( QDomDocumentPrivate* n, bool deep );
 
497
    ~QDomDocumentPrivate();
 
498
 
 
499
    bool setContent( QXmlInputSource *source, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn );
 
500
    bool setContent( QXmlInputSource *source, QXmlReader *reader, QString *errorMsg, int *errorLine, int *errorColumn );
 
501
 
 
502
    // Attributes
 
503
    QDomDocumentTypePrivate* doctype() { return type; };
 
504
    QDomImplementationPrivate* implementation() { return impl; };
 
505
    QDomElementPrivate* documentElement();
 
506
 
 
507
    // Factories
 
508
    QDomElementPrivate* createElement( const QString& tagName );
 
509
    QDomElementPrivate* createElementNS( const QString& nsURI, const QString& qName );
 
510
    QDomDocumentFragmentPrivate* createDocumentFragment();
 
511
    QDomTextPrivate* createTextNode( const QString& data );
 
512
    QDomCommentPrivate* createComment( const QString& data );
 
513
    QDomCDATASectionPrivate* createCDATASection( const QString& data );
 
514
    QDomProcessingInstructionPrivate* createProcessingInstruction( const QString& target, const QString& data );
 
515
    QDomAttrPrivate* createAttribute( const QString& name );
 
516
    QDomAttrPrivate* createAttributeNS( const QString& nsURI, const QString& qName );
 
517
    QDomEntityReferencePrivate* createEntityReference( const QString& name );
 
518
 
 
519
    QDomNodePrivate* importNode( const QDomNodePrivate* importedNode, bool deep );
 
520
 
 
521
    // Reimplemented from QDomNodePrivate
 
522
    QDomNodePrivate* cloneNode( bool deep = TRUE );
 
523
    bool isDocument() { return TRUE; }
 
524
    QDomNode::NodeType nodeType() const { return QDomNode::DocumentNode; }
 
525
    void clear();
 
526
    void save( QTextStream&, int, int ) const;
 
527
 
 
528
    // Variables
 
529
    QDomImplementationPrivate* impl;
 
530
    QDomDocumentTypePrivate* type;
 
531
};
 
532
 
 
533
/**************************************************************
 
534
 *
 
535
 * QDomHandler
 
536
 *
 
537
 **************************************************************/
 
538
 
 
539
class QDomHandler : public QXmlDefaultHandler
 
540
{
 
541
public:
 
542
    QDomHandler( QDomDocumentPrivate* d, bool namespaceProcessing );
 
543
    ~QDomHandler();
 
544
 
 
545
    // content handler
 
546
    bool endDocument();
 
547
    bool startElement( const QString& nsURI, const QString& localName, const QString& qName, const QXmlAttributes& atts );
 
548
    bool endElement( const QString& nsURI, const QString& localName, const QString& qName );
 
549
    bool characters( const QString& ch );
 
550
    bool processingInstruction( const QString& target, const QString& data );
 
551
    bool skippedEntity( const QString& name );
 
552
 
 
553
    // error handler
 
554
    bool fatalError( const QXmlParseException& exception );
 
555
 
 
556
    // lexical handler
 
557
    bool startCDATA();
 
558
    bool endCDATA();
 
559
    bool startEntity( const QString & );
 
560
    bool endEntity( const QString & );
 
561
    bool startDTD( const QString& name, const QString& publicId, const QString& systemId );
 
562
    bool comment( const QString& ch );
 
563
 
 
564
    // decl handler
 
565
    bool externalEntityDecl( const QString &name, const QString &publicId, const QString &systemId ) ;
 
566
 
 
567
    // DTD handler
 
568
    bool notationDecl( const QString & name, const QString & publicId, const QString & systemId );
 
569
    bool unparsedEntityDecl( const QString &name, const QString &publicId, const QString &systemId, const QString &notationName ) ;
 
570
 
 
571
    QString errorMsg;
 
572
    int errorLine;
 
573
    int errorColumn;
 
574
 
 
575
private:
 
576
    QDomDocumentPrivate *doc;
 
577
    QDomNodePrivate *node;
 
578
    QString entityName;
 
579
    bool cdata;
 
580
    bool nsProcessing;
 
581
};
 
582
 
 
583
/**************************************************************
 
584
 *
 
585
 * QDomImplementationPrivate
 
586
 *
 
587
 **************************************************************/
 
588
 
 
589
QDomImplementationPrivate::QDomImplementationPrivate()
 
590
{
 
591
}
 
592
 
 
593
QDomImplementationPrivate::~QDomImplementationPrivate()
 
594
{
 
595
}
 
596
 
 
597
QDomImplementationPrivate* QDomImplementationPrivate::clone()
 
598
{
 
599
    QDomImplementationPrivate* p = new QDomImplementationPrivate;
 
600
    // We are not interested in this node
 
601
    p->deref();
 
602
    return p;
 
603
}
 
604
 
 
605
/**************************************************************
 
606
 *
 
607
 * QDomImplementation
 
608
 *
 
609
 **************************************************************/
 
610
 
 
611
/*!
 
612
    \class QDomImplementation qdom.h
 
613
    \reentrant
 
614
    \brief The QDomImplementation class provides information about the
 
615
    features of the DOM implementation.
 
616
\if defined(commercial)
 
617
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
618
\endif
 
619
 
 
620
    \module XML
 
621
    \ingroup xml-tools
 
622
 
 
623
    This class describes the features that are supported by the DOM
 
624
    implementation. Currently the XML subset of DOM Level 1 and DOM
 
625
    Level 2 Core are supported.
 
626
 
 
627
    Normally you will use the function QDomDocument::implementation()
 
628
    to get the implementation object.
 
629
 
 
630
    You can create a new document type with createDocumentType() and a
 
631
    new document with createDocument().
 
632
 
 
633
    For further information about the Document Object Model see \link
 
634
    http://www.w3.org/TR/REC-DOM-Level-1/\endlink and \link
 
635
    http://www.w3.org/TR/DOM-Level-2-Core/\endlink. For a more general
 
636
    introduction of the DOM implementation see the QDomDocument
 
637
    documentation.
 
638
 
 
639
    \sa hasFeature()
 
640
*/
 
641
 
 
642
/*!
 
643
    Constructs a QDomImplementation object.
 
644
*/
 
645
QDomImplementation::QDomImplementation()
 
646
{
 
647
    impl = 0;
 
648
}
 
649
 
 
650
/*!
 
651
    Constructs a copy of \a x.
 
652
*/
 
653
QDomImplementation::QDomImplementation( const QDomImplementation& x )
 
654
{
 
655
    impl = x.impl;
 
656
    if ( impl )
 
657
        impl->ref();
 
658
}
 
659
 
 
660
QDomImplementation::QDomImplementation( QDomImplementationPrivate* p )
 
661
{
 
662
    // We want to be co-owners, so increase the reference count
 
663
    impl = p;
 
664
    if (impl)
 
665
        impl->ref();
 
666
}
 
667
 
 
668
/*!
 
669
    Assigns \a x to this DOM implementation.
 
670
*/
 
671
QDomImplementation& QDomImplementation::operator= ( const QDomImplementation& x )
 
672
{
 
673
    if ( x.impl )
 
674
        x.impl->ref(); // avoid x=x
 
675
    if ( impl && impl->deref() )
 
676
        delete impl;
 
677
    impl = x.impl;
 
678
 
 
679
    return *this;
 
680
}
 
681
 
 
682
/*!
 
683
    Returns TRUE if \a x and this DOM implementation object were
 
684
    created from the same QDomDocument; otherwise returns FALSE.
 
685
*/
 
686
bool QDomImplementation::operator==( const QDomImplementation& x ) const
 
687
{
 
688
    return ( impl == x.impl );
 
689
}
 
690
 
 
691
/*!
 
692
    Returns TRUE if \a x and this DOM implementation object were
 
693
    created from different QDomDocuments; otherwise returns FALSE.
 
694
*/
 
695
bool QDomImplementation::operator!=( const QDomImplementation& x ) const
 
696
{
 
697
    return ( impl != x.impl );
 
698
}
 
699
 
 
700
/*!
 
701
    Destroys the object and frees its resources.
 
702
*/
 
703
QDomImplementation::~QDomImplementation()
 
704
{
 
705
    if ( impl && impl->deref() )
 
706
        delete impl;
 
707
}
 
708
 
 
709
/*!
 
710
    The function returns TRUE if QDom implements the requested \a
 
711
    version of a \a feature; otherwise returns FALSE.
 
712
 
 
713
    The currently supported features and their versions:
 
714
    \table
 
715
    \header \i Feature \i Version
 
716
    \row \i XML \i 1.0
 
717
    \endtable
 
718
*/
 
719
bool QDomImplementation::hasFeature( const QString& feature, const QString& version )
 
720
{
 
721
    if ( feature == "XML" ) {
 
722
        if ( version.isEmpty() || version == "1.0" ) {
 
723
            return TRUE;
 
724
        }
 
725
    }
 
726
    // ### add DOM level 2 features
 
727
    return FALSE;
 
728
}
 
729
 
 
730
/*!
 
731
    Creates a document type node for the name \a qName.
 
732
 
 
733
    \a publicId specifies the public identifier of the external
 
734
    subset. If you specify QString::null as the \a publicId, this
 
735
    means that the document type has no public identifier.
 
736
 
 
737
    \a systemId specifies the system identifier of the external
 
738
    subset. If you specify QString::null as the \a systemId, this
 
739
    means that the document type has no system identifier.
 
740
 
 
741
    Since you cannot have a public identifier without a system
 
742
    identifier, the public identifier is set to QString::null if there
 
743
    is no system identifier.
 
744
 
 
745
    DOM level 2 does not support any other document type declaration
 
746
    features.
 
747
 
 
748
    The only way you can use a document type that was created this
 
749
    way, is in combination with the createDocument() function to
 
750
    create a QDomDocument with this document type.
 
751
 
 
752
    \sa createDocument();
 
753
*/
 
754
QDomDocumentType QDomImplementation::createDocumentType( const QString& qName, const QString& publicId, const QString& systemId )
 
755
{
 
756
    QDomDocumentTypePrivate *dt = new QDomDocumentTypePrivate( 0 );
 
757
    dt->name = qName;
 
758
    if ( systemId.isNull() ) {
 
759
        dt->publicId = QString::null;
 
760
        dt->systemId = QString::null;
 
761
    } else {
 
762
        dt->publicId = publicId;
 
763
        dt->systemId = systemId;
 
764
    }
 
765
    return QDomDocumentType( dt );
 
766
}
 
767
 
 
768
/*!
 
769
    Creates a DOM document with the document type \a doctype. This
 
770
    function also adds a root element node with the qualified name \a
 
771
    qName and the namespace URI \a nsURI.
 
772
*/
 
773
QDomDocument QDomImplementation::createDocument( const QString& nsURI, const QString& qName, const QDomDocumentType& doctype )
 
774
{
 
775
    QDomDocument doc( doctype );
 
776
    QDomElement root = doc.createElementNS( nsURI, qName );
 
777
    doc.appendChild( root );
 
778
    return doc;
 
779
}
 
780
 
 
781
/*!
 
782
    Returns FALSE if the object was created by
 
783
    QDomDocument::implementation(); otherwise returns TRUE.
 
784
*/
 
785
bool QDomImplementation::isNull()
 
786
{
 
787
    return ( impl == 0 );
 
788
}
 
789
 
 
790
/**************************************************************
 
791
 *
 
792
 * QDomNodeListPrivate
 
793
 *
 
794
 **************************************************************/
 
795
 
 
796
QDomNodeListPrivate::QDomNodeListPrivate( QDomNodePrivate* n_impl )
 
797
{
 
798
    node_impl = n_impl;
 
799
    if ( node_impl )
 
800
        node_impl->ref();
 
801
    timestamp = -1;
 
802
}
 
803
 
 
804
QDomNodeListPrivate::QDomNodeListPrivate( QDomNodePrivate* n_impl, const QString& name )
 
805
{
 
806
    node_impl = n_impl;
 
807
    if ( node_impl )
 
808
        node_impl->ref();
 
809
    tagname = name;
 
810
    timestamp = -1;
 
811
}
 
812
 
 
813
QDomNodeListPrivate::QDomNodeListPrivate( QDomNodePrivate* n_impl, const QString& _nsURI, const QString& localName )
 
814
{
 
815
    node_impl = n_impl;
 
816
    if ( node_impl )
 
817
        node_impl->ref();
 
818
    tagname = localName;
 
819
    nsURI = _nsURI;
 
820
    timestamp = -1;
 
821
}
 
822
 
 
823
QDomNodeListPrivate::~QDomNodeListPrivate()
 
824
{
 
825
    if ( node_impl && node_impl->deref() )
 
826
        delete node_impl;
 
827
}
 
828
 
 
829
bool QDomNodeListPrivate::operator== ( const QDomNodeListPrivate& other ) const
 
830
{
 
831
    return ( node_impl == other.node_impl ) && ( tagname == other.tagname ) ;
 
832
}
 
833
 
 
834
bool QDomNodeListPrivate::operator!= ( const QDomNodeListPrivate& other ) const
 
835
{
 
836
    return ( node_impl != other.node_impl ) || ( tagname != other.tagname ) ;
 
837
}
 
838
 
 
839
void QDomNodeListPrivate::createList()
 
840
{
 
841
    if ( !node_impl )
 
842
        return;
 
843
    timestamp = qt_nodeListTime;
 
844
    QDomNodePrivate* p = node_impl->first;
 
845
 
 
846
    list.clear();
 
847
    if ( tagname.isNull() ) {
 
848
        while ( p ) {
 
849
            list.append( p );
 
850
            p = p->next;
 
851
        }
 
852
    } else if ( nsURI.isNull() ) {
 
853
        while ( p && p != node_impl ) {
 
854
            if ( p->isElement() && p->nodeName() == tagname ) {
 
855
                list.append( p );
 
856
            }
 
857
            if ( p->first )
 
858
                p = p->first;
 
859
            else if ( p->next )
 
860
                p = p->next;
 
861
            else {
 
862
                p = p->parent();
 
863
                while ( p && p != node_impl && !p->next )
 
864
                    p = p->parent();
 
865
                if ( p && p != node_impl )
 
866
                    p = p->next;
 
867
            }
 
868
        }
 
869
    } else {
 
870
        while ( p && p != node_impl ) {
 
871
            if ( p->isElement() && p->name==tagname && p->namespaceURI==nsURI ) {
 
872
                list.append( p );
 
873
            }
 
874
            if ( p->first )
 
875
                p = p->first;
 
876
            else if ( p->next )
 
877
                p = p->next;
 
878
            else {
 
879
                p = p->parent();
 
880
                while ( p && p != node_impl && !p->next )
 
881
                    p = p->parent();
 
882
                if ( p && p != node_impl )
 
883
                    p = p->next;
 
884
            }
 
885
        }
 
886
    }
 
887
}
 
888
 
 
889
QDomNodePrivate* QDomNodeListPrivate::item( int index )
 
890
{
 
891
    if ( !node_impl )
 
892
        return 0;
 
893
    if ( timestamp < qt_nodeListTime )
 
894
        createList();
 
895
    return list.at( index );
 
896
}
 
897
 
 
898
uint QDomNodeListPrivate::length() const
 
899
{
 
900
    if ( !node_impl )
 
901
        return 0;
 
902
    if ( timestamp < qt_nodeListTime ) {
 
903
        QDomNodeListPrivate *that = (QDomNodeListPrivate*)this;
 
904
        that->createList();
 
905
    }
 
906
    return list.count();
 
907
}
 
908
 
 
909
/**************************************************************
 
910
 *
 
911
 * QDomNodeList
 
912
 *
 
913
 **************************************************************/
 
914
 
 
915
/*!
 
916
    \class QDomNodeList qdom.h
 
917
    \reentrant
 
918
    \brief The QDomNodeList class is a list of QDomNode objects.
 
919
\if defined(commercial)
 
920
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
921
\endif
 
922
 
 
923
    \module XML
 
924
    \ingroup xml-tools
 
925
 
 
926
    Lists can be obtained by QDomDocument::elementsByTagName() and
 
927
    QDomNode::childNodes(). The Document Object Model (DOM) requires
 
928
    these lists to be "live": whenever you change the underlying
 
929
    document, the contents of the list will get updated.
 
930
 
 
931
    You can get a particular node from the list with item(). The
 
932
    number of items in the list is returned by count() (and by
 
933
    length()).
 
934
 
 
935
    For further information about the Document Object Model see \link
 
936
    http://www.w3.org/TR/REC-DOM-Level-1/\endlink and \link
 
937
    http://www.w3.org/TR/DOM-Level-2-Core/\endlink. For a more general
 
938
    introduction of the DOM implementation see the QDomDocument
 
939
    documentation.
 
940
 
 
941
    \sa QDomNode::childNodes() QDomDocument::elementsByTagName()
 
942
*/
 
943
 
 
944
/*!
 
945
    Creates an empty node list.
 
946
*/
 
947
QDomNodeList::QDomNodeList()
 
948
{
 
949
    impl = 0;
 
950
}
 
951
 
 
952
QDomNodeList::QDomNodeList( QDomNodeListPrivate* p )
 
953
{
 
954
    impl = p;
 
955
}
 
956
 
 
957
/*!
 
958
    Constructs a copy of \a n.
 
959
*/
 
960
QDomNodeList::QDomNodeList( const QDomNodeList& n )
 
961
{
 
962
    impl = n.impl;
 
963
    if ( impl )
 
964
        impl->ref();
 
965
}
 
966
 
 
967
/*!
 
968
    Assigns \a n to this node list.
 
969
*/
 
970
QDomNodeList& QDomNodeList::operator= ( const QDomNodeList& n )
 
971
{
 
972
    if ( n.impl )
 
973
        n.impl->ref();
 
974
    if ( impl && impl->deref() )
 
975
        delete impl;
 
976
    impl = n.impl;
 
977
 
 
978
    return *this;
 
979
}
 
980
 
 
981
/*!
 
982
    Returns TRUE if the node list \a n and this node list are equal;
 
983
    otherwise returns FALSE.
 
984
*/
 
985
bool QDomNodeList::operator== ( const QDomNodeList& n ) const
 
986
{
 
987
    if ( impl == n.impl )
 
988
        return TRUE;
 
989
    if ( !impl || !n.impl )
 
990
        return FALSE;
 
991
    return (*impl == *n.impl);
 
992
}
 
993
 
 
994
/*!
 
995
    Returns TRUE the node list \a n and this node list are not equal;
 
996
    otherwise returns FALSE.
 
997
*/
 
998
bool QDomNodeList::operator!= ( const QDomNodeList& n ) const
 
999
{
 
1000
    return !operator==(n);
 
1001
}
 
1002
 
 
1003
/*!
 
1004
    Destroys the object and frees its resources.
 
1005
*/
 
1006
QDomNodeList::~QDomNodeList()
 
1007
{
 
1008
    if ( impl && impl->deref() )
 
1009
        delete impl;
 
1010
}
 
1011
 
 
1012
/*!
 
1013
    Returns the node at position \a index.
 
1014
 
 
1015
    If \a index is negative or if \a index >= length() then a null
 
1016
    node is returned (i.e. a node for which QDomNode::isNull() returns
 
1017
    TRUE).
 
1018
 
 
1019
    \sa count()
 
1020
*/
 
1021
QDomNode QDomNodeList::item( int index ) const
 
1022
{
 
1023
    if ( !impl )
 
1024
        return QDomNode();
 
1025
 
 
1026
    return QDomNode( impl->item( index ) );
 
1027
}
 
1028
 
 
1029
/*!
 
1030
    Returns the number of nodes in the list.
 
1031
 
 
1032
    This function is the same as count().
 
1033
*/
 
1034
uint QDomNodeList::length() const
 
1035
{
 
1036
    if ( !impl )
 
1037
        return 0;
 
1038
    return impl->length();
 
1039
}
 
1040
 
 
1041
/*!
 
1042
    \fn uint QDomNodeList::count() const
 
1043
 
 
1044
    Returns the number of nodes in the list.
 
1045
 
 
1046
    This function is the same as length().
 
1047
*/
 
1048
 
 
1049
 
 
1050
/**************************************************************
 
1051
 *
 
1052
 * QDomNodePrivate
 
1053
 *
 
1054
 **************************************************************/
 
1055
 
 
1056
inline void QDomNodePrivate::setOwnerDocument( QDomDocumentPrivate* doc )
 
1057
{
 
1058
    ownerNode = doc;
 
1059
    hasParent = FALSE;
 
1060
}
 
1061
 
 
1062
QDomNodePrivate::QDomNodePrivate( QDomDocumentPrivate* doc, QDomNodePrivate *par )
 
1063
{
 
1064
    if ( par )
 
1065
        setParent( par );
 
1066
    else
 
1067
        setOwnerDocument( doc );
 
1068
    prev = 0;
 
1069
    next = 0;
 
1070
    first = 0;
 
1071
    last = 0;
 
1072
    createdWithDom1Interface = TRUE;
 
1073
}
 
1074
 
 
1075
QDomNodePrivate::QDomNodePrivate( QDomNodePrivate* n, bool deep )
 
1076
{
 
1077
    setOwnerDocument( n->ownerDocument() );
 
1078
    prev = 0;
 
1079
    next = 0;
 
1080
    first = 0;
 
1081
    last = 0;
 
1082
 
 
1083
    name = n->name;
 
1084
    value = n->value;
 
1085
    prefix = n->prefix;
 
1086
    namespaceURI = n->namespaceURI;
 
1087
    createdWithDom1Interface = n->createdWithDom1Interface;
 
1088
 
 
1089
    if ( !deep )
 
1090
        return;
 
1091
 
 
1092
    for ( QDomNodePrivate* x = n->first; x; x = x->next )
 
1093
        appendChild( x->cloneNode( TRUE ) );
 
1094
}
 
1095
 
 
1096
QDomNodePrivate::~QDomNodePrivate()
 
1097
{
 
1098
    QDomNodePrivate* p = first;
 
1099
    QDomNodePrivate* n;
 
1100
 
 
1101
    while ( p ) {
 
1102
        n = p->next;
 
1103
        if ( p->deref() )
 
1104
            delete p;
 
1105
        else
 
1106
            p->setNoParent();
 
1107
        p = n;
 
1108
    }
 
1109
 
 
1110
    first = 0;
 
1111
    last = 0;
 
1112
}
 
1113
 
 
1114
void QDomNodePrivate::clear()
 
1115
{
 
1116
    QDomNodePrivate* p = first;
 
1117
    QDomNodePrivate* n;
 
1118
 
 
1119
    while ( p ) {
 
1120
        n = p->next;
 
1121
        if ( p->deref() )
 
1122
            delete p;
 
1123
        p = n;
 
1124
    }
 
1125
 
 
1126
    first = 0;
 
1127
    last = 0;
 
1128
}
 
1129
 
 
1130
QDomNodePrivate* QDomNodePrivate::namedItem( const QString& n )
 
1131
{
 
1132
    QDomNodePrivate* p = first;
 
1133
    while ( p ) {
 
1134
        if ( p->nodeName() == n )
 
1135
            return p;
 
1136
        p = p->next;
 
1137
    }
 
1138
 
 
1139
    return 0;
 
1140
}
 
1141
 
 
1142
QDomNamedNodeMapPrivate* QDomNodePrivate::attributes()
 
1143
{
 
1144
    return 0;
 
1145
}
 
1146
 
 
1147
QDomNodePrivate* QDomNodePrivate::insertBefore( QDomNodePrivate* newChild, QDomNodePrivate* refChild )
 
1148
{
 
1149
    // Error check
 
1150
    if ( !newChild )
 
1151
        return 0;
 
1152
 
 
1153
    // Error check
 
1154
    if ( newChild == refChild )
 
1155
        return 0;
 
1156
 
 
1157
    // Error check
 
1158
    if ( refChild && refChild->parent() != this )
 
1159
        return 0;
 
1160
 
 
1161
    // "mark lists as dirty"
 
1162
    qt_nodeListTime++;
 
1163
 
 
1164
    // Special handling for inserting a fragment. We just insert
 
1165
    // all elements of the fragment instead of the fragment itself.
 
1166
    if ( newChild->isDocumentFragment() ) {
 
1167
        // Fragment is empty ?
 
1168
        if ( newChild->first == 0 )
 
1169
            return newChild;
 
1170
 
 
1171
        // New parent
 
1172
        QDomNodePrivate* n = newChild->first;
 
1173
        while ( n )  {
 
1174
            n->setParent( this );
 
1175
            n = n->next;
 
1176
        }
 
1177
 
 
1178
        // Insert at the beginning ?
 
1179
        if ( !refChild || refChild->prev == 0 ) {
 
1180
            if ( first )
 
1181
                first->prev = newChild->last;
 
1182
            newChild->last->next = first;
 
1183
            if ( !last )
 
1184
                last = newChild->last;
 
1185
            first = newChild->first;
 
1186
        } else {
 
1187
            // Insert in the middle
 
1188
            newChild->last->next = refChild;
 
1189
            newChild->first->prev = refChild->prev;
 
1190
            refChild->prev->next = newChild->first;
 
1191
            refChild->prev = newChild->last;
 
1192
        }
 
1193
 
 
1194
        // No need to increase the reference since QDomDocumentFragment
 
1195
        // does not decrease the reference.
 
1196
 
 
1197
        // Remove the nodes from the fragment
 
1198
        newChild->first = 0;
 
1199
        newChild->last = 0;
 
1200
        return newChild;
 
1201
    }
 
1202
 
 
1203
    // No more errors can occur now, so we take
 
1204
    // ownership of the node.
 
1205
    newChild->ref();
 
1206
 
 
1207
    if ( newChild->parent() )
 
1208
        newChild->parent()->removeChild( newChild );
 
1209
 
 
1210
    newChild->setParent( this );
 
1211
 
 
1212
    if ( !refChild ) {
 
1213
        if ( first )
 
1214
            first->prev = newChild;
 
1215
        newChild->next = first;
 
1216
        if ( !last )
 
1217
            last = newChild;
 
1218
        first = newChild;
 
1219
        return newChild;
 
1220
    }
 
1221
 
 
1222
    if ( refChild->prev == 0 ) {
 
1223
        if ( first )
 
1224
            first->prev = newChild;
 
1225
        newChild->next = first;
 
1226
        if ( !last )
 
1227
            last = newChild;
 
1228
        first = newChild;
 
1229
        return newChild;
 
1230
    }
 
1231
 
 
1232
    newChild->next = refChild;
 
1233
    newChild->prev = refChild->prev;
 
1234
    refChild->prev->next = newChild;
 
1235
    refChild->prev = newChild;
 
1236
 
 
1237
    return newChild;
 
1238
}
 
1239
 
 
1240
QDomNodePrivate* QDomNodePrivate::insertAfter( QDomNodePrivate* newChild, QDomNodePrivate* refChild )
 
1241
{
 
1242
    // Error check
 
1243
    if ( !newChild )
 
1244
        return 0;
 
1245
 
 
1246
    // Error check
 
1247
    if ( newChild == refChild )
 
1248
        return 0;
 
1249
 
 
1250
    // Error check
 
1251
    if ( refChild && refChild->parent() != this )
 
1252
        return 0;
 
1253
 
 
1254
    // "mark lists as dirty"
 
1255
    qt_nodeListTime++;
 
1256
 
 
1257
    // Special handling for inserting a fragment. We just insert
 
1258
    // all elements of the fragment instead of the fragment itself.
 
1259
    if ( newChild->isDocumentFragment() ) {
 
1260
        // Fragment is empty ?
 
1261
        if ( newChild->first == 0 )
 
1262
            return newChild;
 
1263
 
 
1264
        // New parent
 
1265
        QDomNodePrivate* n = newChild->first;
 
1266
        while ( n ) {
 
1267
            n->setParent( this );
 
1268
            n = n->next;
 
1269
        }
 
1270
 
 
1271
        // Insert at the end
 
1272
        if ( !refChild || refChild->next == 0 ) {
 
1273
            if ( last )
 
1274
                last->next = newChild->first;
 
1275
            newChild->first->prev = last;
 
1276
            if ( !first )
 
1277
                first = newChild->first;
 
1278
            last = newChild->last;
 
1279
        } else { // Insert in the middle
 
1280
            newChild->first->prev = refChild;
 
1281
            newChild->last->next = refChild->next;
 
1282
            refChild->next->prev = newChild->last;
 
1283
            refChild->next = newChild->first;
 
1284
        }
 
1285
 
 
1286
        // No need to increase the reference since QDomDocumentFragment
 
1287
        // does not decrease the reference.
 
1288
 
 
1289
        // Remove the nodes from the fragment
 
1290
        newChild->first = 0;
 
1291
        newChild->last = 0;
 
1292
        return newChild;
 
1293
    }
 
1294
 
 
1295
    // Release new node from its current parent
 
1296
    if ( newChild->parent() )
 
1297
        newChild->parent()->removeChild( newChild );
 
1298
 
 
1299
    // No more errors can occur now, so we take
 
1300
    // ownership of the node
 
1301
    newChild->ref();
 
1302
 
 
1303
    newChild->setParent( this );
 
1304
 
 
1305
    // Insert at the end
 
1306
    if ( !refChild ) {
 
1307
        if ( last )
 
1308
            last->next = newChild;
 
1309
        newChild->prev = last;
 
1310
        if ( !first )
 
1311
            first = newChild;
 
1312
        last = newChild;
 
1313
        return newChild;
 
1314
    }
 
1315
 
 
1316
    if ( refChild->next == 0 ) {
 
1317
        if ( last )
 
1318
            last->next = newChild;
 
1319
        newChild->prev = last;
 
1320
        if ( !first )
 
1321
            first = newChild;
 
1322
        last = newChild;
 
1323
        return newChild;
 
1324
    }
 
1325
 
 
1326
    newChild->prev = refChild;
 
1327
    newChild->next = refChild->next;
 
1328
    refChild->next->prev = newChild;
 
1329
    refChild->next = newChild;
 
1330
 
 
1331
    return newChild;
 
1332
}
 
1333
 
 
1334
QDomNodePrivate* QDomNodePrivate::replaceChild( QDomNodePrivate* newChild, QDomNodePrivate* oldChild )
 
1335
{
 
1336
    if ( oldChild->parent() != this )
 
1337
        return 0;
 
1338
    if ( !newChild || !oldChild )
 
1339
        return 0;
 
1340
    if ( newChild == oldChild )
 
1341
        return 0;
 
1342
 
 
1343
    // mark lists as dirty
 
1344
    qt_nodeListTime++;
 
1345
 
 
1346
    // Special handling for inserting a fragment. We just insert
 
1347
    // all elements of the fragment instead of the fragment itself.
 
1348
    if ( newChild->isDocumentFragment() ) {
 
1349
        // Fragment is empty ?
 
1350
        if ( newChild->first == 0 )
 
1351
            return newChild;
 
1352
 
 
1353
        // New parent
 
1354
        QDomNodePrivate* n = newChild->first;
 
1355
        while ( n ) {
 
1356
            n->setParent( this );
 
1357
            n = n->next;
 
1358
        }
 
1359
 
 
1360
 
 
1361
        if ( oldChild->next )
 
1362
            oldChild->next->prev = newChild->last;
 
1363
        if ( oldChild->prev )
 
1364
            oldChild->prev->next = newChild->first;
 
1365
 
 
1366
        newChild->last->next = oldChild->next;
 
1367
        newChild->first->prev = oldChild->prev;
 
1368
 
 
1369
        if ( first == oldChild )
 
1370
            first = newChild->first;
 
1371
        if ( last == oldChild )
 
1372
            last = newChild->last;
 
1373
 
 
1374
        oldChild->setNoParent();
 
1375
        oldChild->next = 0;
 
1376
        oldChild->prev = 0;
 
1377
 
 
1378
        // No need to increase the reference since QDomDocumentFragment
 
1379
        // does not decrease the reference.
 
1380
 
 
1381
        // Remove the nodes from the fragment
 
1382
        newChild->first = 0;
 
1383
        newChild->last = 0;
 
1384
 
 
1385
        // We are no longer interested in the old node
 
1386
        if ( oldChild ) oldChild->deref();
 
1387
 
 
1388
        return oldChild;
 
1389
    }
 
1390
 
 
1391
    // No more errors can occur now, so we take
 
1392
    // ownership of the node
 
1393
    newChild->ref();
 
1394
 
 
1395
    // Release new node from its current parent
 
1396
    if ( newChild->parent() )
 
1397
        newChild->parent()->removeChild( newChild );
 
1398
 
 
1399
    newChild->setParent( this );
 
1400
 
 
1401
    if ( oldChild->next )
 
1402
        oldChild->next->prev = newChild;
 
1403
    if ( oldChild->prev )
 
1404
        oldChild->prev->next = newChild;
 
1405
 
 
1406
    newChild->next = oldChild->next;
 
1407
    newChild->prev = oldChild->prev;
 
1408
 
 
1409
    if ( first == oldChild )
 
1410
        first = newChild;
 
1411
    if ( last == oldChild )
 
1412
        last = newChild;
 
1413
 
 
1414
    oldChild->setNoParent();
 
1415
    oldChild->next = 0;
 
1416
    oldChild->prev = 0;
 
1417
 
 
1418
    // We are no longer interested in the old node
 
1419
    if ( oldChild ) oldChild->deref();
 
1420
 
 
1421
    return oldChild;
 
1422
}
 
1423
 
 
1424
QDomNodePrivate* QDomNodePrivate::removeChild( QDomNodePrivate* oldChild )
 
1425
{
 
1426
    // Error check
 
1427
    if ( oldChild->parent() != this )
 
1428
        return 0;
 
1429
 
 
1430
    // "mark lists as dirty"
 
1431
    qt_nodeListTime++;
 
1432
 
 
1433
    // Perhaps oldChild was just created with "createElement" or that. In this case
 
1434
    // its parent is QDomDocument but it is not part of the documents child list.
 
1435
    if ( oldChild->next == 0 && oldChild->prev == 0 && first != oldChild )
 
1436
        return 0;
 
1437
 
 
1438
    if ( oldChild->next )
 
1439
        oldChild->next->prev = oldChild->prev;
 
1440
    if ( oldChild->prev )
 
1441
        oldChild->prev->next = oldChild->next;
 
1442
 
 
1443
    if ( last == oldChild )
 
1444
        last = oldChild->prev;
 
1445
    if ( first == oldChild )
 
1446
        first = oldChild->next;
 
1447
 
 
1448
    oldChild->setNoParent();
 
1449
    oldChild->next = 0;
 
1450
    oldChild->prev = 0;
 
1451
 
 
1452
    // We are no longer interested in the old node
 
1453
    if ( oldChild ) oldChild->deref();
 
1454
 
 
1455
    return oldChild;
 
1456
}
 
1457
 
 
1458
QDomNodePrivate* QDomNodePrivate::appendChild( QDomNodePrivate* newChild )
 
1459
{
 
1460
    // No reference manipulation needed. Done in insertAfter.
 
1461
    return insertAfter( newChild, 0 );
 
1462
}
 
1463
 
 
1464
QDomDocumentPrivate* QDomNodePrivate::ownerDocument()
 
1465
{
 
1466
    QDomNodePrivate* p = this;
 
1467
    while ( p && !p->isDocument() ) {
 
1468
        if ( !p->hasParent )
 
1469
            return (QDomDocumentPrivate*)p->ownerNode;
 
1470
        p = p->parent();
 
1471
    }
 
1472
 
 
1473
    return (QDomDocumentPrivate*)p;
 
1474
}
 
1475
 
 
1476
QDomNodePrivate* QDomNodePrivate::cloneNode( bool deep )
 
1477
{
 
1478
    QDomNodePrivate* p = new QDomNodePrivate( this, deep );
 
1479
    // We are not interested in this node
 
1480
    p->deref();
 
1481
    return p;
 
1482
}
 
1483
 
 
1484
static void qNormalizeNode( QDomNodePrivate* n )
 
1485
{
 
1486
    QDomNodePrivate* p = n->first;
 
1487
    QDomTextPrivate* t = 0;
 
1488
 
 
1489
    while ( p ) {
 
1490
        if ( p->isText() ) {
 
1491
            if ( t ) {
 
1492
                QDomNodePrivate* tmp = p->next;
 
1493
                t->appendData( p->nodeValue() );
 
1494
                n->removeChild( p );
 
1495
                p = tmp;
 
1496
            } else {
 
1497
                t = (QDomTextPrivate*)p;
 
1498
                p = p->next;
 
1499
            }
 
1500
        } else {
 
1501
            p = p->next;
 
1502
            t = 0;
 
1503
        }
 
1504
    }
 
1505
}
 
1506
void QDomNodePrivate::normalize()
 
1507
{
 
1508
    // ### This one has moved from QDomElementPrivate to this position. It is
 
1509
    // not tested.
 
1510
    qNormalizeNode( this );
 
1511
}
 
1512
 
 
1513
void QDomNodePrivate::save( QTextStream& s, int depth, int indent ) const
 
1514
{
 
1515
    const QDomNodePrivate* n = first;
 
1516
    while ( n ) {
 
1517
        n->save( s, depth, indent );
 
1518
        n = n->next;
 
1519
    }
 
1520
}
 
1521
 
 
1522
/**************************************************************
 
1523
 *
 
1524
 * QDomNode
 
1525
 *
 
1526
 **************************************************************/
 
1527
 
 
1528
#define IMPL ((QDomNodePrivate*)impl)
 
1529
 
 
1530
/*!
 
1531
    \class QDomNode qdom.h
 
1532
    \reentrant
 
1533
    \brief The QDomNode class is the base class for all the nodes in a DOM tree.
 
1534
\if defined(commercial)
 
1535
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
1536
\endif
 
1537
 
 
1538
    \module XML
 
1539
    \ingroup xml-tools
 
1540
 
 
1541
    Many functions in the DOM return a QDomNode.
 
1542
 
 
1543
    You can find out the type of a node using isAttr(),
 
1544
    isCDATASection(), isDocumentFragment(), isDocument(),
 
1545
    isDocumentType(), isElement(), isEntityReference(), isText(),
 
1546
    isEntity(), isNotation(), isProcessingInstruction(),
 
1547
    isCharacterData() and isComment().
 
1548
 
 
1549
    A QDomNode can be converted into one of its subclasses using
 
1550
    toAttr(), toCDATASection(), toDocumentFragment(), toDocument(),
 
1551
    toDocumentType(), toElement(), toEntityReference(), toText(),
 
1552
    toEntity(), toNotation(), toProcessingInstruction(),
 
1553
    toCharacterData() or toComment(). You can convert a node to a null
 
1554
    node with clear().
 
1555
 
 
1556
    Copies of the QDomNode class share their data using explicit
 
1557
    sharing. This means that modifying one node will change all
 
1558
    copies. This is especially useful in combination with functions
 
1559
    which return a QDomNode, e.g. firstChild(). You can make an
 
1560
    independent (deep) copy of the node with cloneNode().
 
1561
 
 
1562
    Nodes are inserted with insertBefore(), insertAfter() or
 
1563
    appendChild(). You can replace one node with another using
 
1564
    replaceChild() and remove a node with removeChild().
 
1565
 
 
1566
    To traverse nodes use firstChild() to get a node's first child (if
 
1567
    any), and nextSibling() to traverse. QDomNode also provides
 
1568
    lastChild(), previousSibling() and parentNode(). To find the first
 
1569
    child node with a particular node name use namedItem().
 
1570
 
 
1571
    To find out if a node has children use hasChildNodes() and to get
 
1572
    a list of all of a node's children use childNodes().
 
1573
 
 
1574
    The node's name and value (the meaning of which varies depending
 
1575
    on its type) is returned by nodeName() and nodeValue()
 
1576
    respectively. The node's type is returned by nodeType(). The
 
1577
    node's value can be set with setNodeValue().
 
1578
 
 
1579
    The document to which the node belongs is returned by
 
1580
    ownerDocument().
 
1581
 
 
1582
    Adjacent QDomText nodes can be merged into a single node with
 
1583
    normalize().
 
1584
 
 
1585
    \l QDomElement nodes have attributes which can be retrieved with
 
1586
    attributes().
 
1587
 
 
1588
    QDomElement and QDomAttr nodes can have namespaces which can be
 
1589
    retrieved with namespaceURI(). Their local name is retrieved with
 
1590
    localName(), and their prefix with prefix(). The prefix can be set
 
1591
    with setPrefix().
 
1592
 
 
1593
    You can write the XML representation of the node to a text stream
 
1594
    with save().
 
1595
 
 
1596
    The following example looks for the first element in an XML document and
 
1597
    prints the names of all the elements that are its direct children.
 
1598
    \code
 
1599
    QDomDocument d;
 
1600
    d.setContent( someXML );
 
1601
    QDomNode n = d.firstChild();
 
1602
    while ( !n.isNull() ) {
 
1603
        if ( n.isElement() ) {
 
1604
            QDomElement e = n.toElement();
 
1605
            cout << "Element name: " << e.tagName() << endl;
 
1606
            break;
 
1607
        }
 
1608
        n = n.nextSibling();
 
1609
    }
 
1610
    \endcode
 
1611
 
 
1612
    For further information about the Document Object Model see \link
 
1613
    http://www.w3.org/TR/REC-DOM-Level-1/\endlink and \link
 
1614
    http://www.w3.org/TR/DOM-Level-2-Core/\endlink. For a more general
 
1615
    introduction of the DOM implementation see the QDomDocument
 
1616
    documentation.
 
1617
*/
 
1618
 
 
1619
/*!
 
1620
    Constructs a \link isNull() null\endlink node.
 
1621
*/
 
1622
QDomNode::QDomNode()
 
1623
{
 
1624
    impl = 0;
 
1625
}
 
1626
 
 
1627
/*!
 
1628
    Constructs a copy of \a n.
 
1629
 
 
1630
    The data of the copy is shared (shallow copy): modifying one node
 
1631
    will also change the other. If you want to make a deep copy, use
 
1632
    cloneNode().
 
1633
*/
 
1634
QDomNode::QDomNode( const QDomNode& n )
 
1635
{
 
1636
    impl = n.impl;
 
1637
    if ( impl ) impl->ref();
 
1638
}
 
1639
 
 
1640
/*!  \internal
 
1641
  Constructs a new node for the data \a n.
 
1642
*/
 
1643
QDomNode::QDomNode( QDomNodePrivate* n )
 
1644
{
 
1645
    impl = n;
 
1646
    if ( impl ) impl->ref();
 
1647
}
 
1648
 
 
1649
/*!
 
1650
    Assigns a copy of \a n to this DOM node.
 
1651
 
 
1652
    The data of the copy is shared (shallow copy): modifying one node
 
1653
    will also change the other. If you want to make a deep copy, use
 
1654
    cloneNode().
 
1655
*/
 
1656
QDomNode& QDomNode::operator= ( const QDomNode& n )
 
1657
{
 
1658
    if ( n.impl ) n.impl->ref();
 
1659
    if ( impl && impl->deref() ) delete impl;
 
1660
    impl = n.impl;
 
1661
 
 
1662
    return *this;
 
1663
}
 
1664
 
 
1665
/*!
 
1666
    Returns TRUE if \a n and this DOM node are equal; otherwise
 
1667
    returns FALSE.
 
1668
*/
 
1669
bool QDomNode::operator== ( const QDomNode& n ) const
 
1670
{
 
1671
    return ( impl == n.impl );
 
1672
}
 
1673
 
 
1674
/*!
 
1675
    Returns TRUE if \a n and this DOM node are not equal; otherwise
 
1676
    returns FALSE.
 
1677
*/
 
1678
bool QDomNode::operator!= ( const QDomNode& n ) const
 
1679
{
 
1680
    return ( impl != n.impl );
 
1681
}
 
1682
 
 
1683
/*!
 
1684
    Destroys the object and frees its resources.
 
1685
*/
 
1686
QDomNode::~QDomNode()
 
1687
{
 
1688
    if ( impl && impl->deref() ) delete impl;
 
1689
}
 
1690
 
 
1691
/*!
 
1692
    Returns the name of the node.
 
1693
 
 
1694
    The meaning of the name depends on the subclass:
 
1695
    \table
 
1696
    \header \i Name \i Meaning
 
1697
    \row \i QDomAttr \i The name of the attribute
 
1698
    \row \i QDomCDATASection \i The string "#cdata-section"
 
1699
    \row \i QDomComment \i The string "#comment"
 
1700
    \row \i QDomDocument \i The string "#document"
 
1701
    \row \i QDomDocumentFragment \i The string "#document-fragment"
 
1702
    \row \i QDomDocumentType \i The name of the document type
 
1703
    \row \i QDomElement \i The tag name
 
1704
    \row \i QDomEntity \i The name of the entity
 
1705
    \row \i QDomEntityReference \i The name of the referenced entity
 
1706
    \row \i QDomNotation \i The name of the notation
 
1707
    \row \i QDomProcessingInstruction \i The target of the processing instruction
 
1708
    \row \i QDomText \i The string "#text"
 
1709
    \endtable
 
1710
 
 
1711
    \sa nodeValue()
 
1712
*/
 
1713
QString QDomNode::nodeName() const
 
1714
{
 
1715
    if ( !impl )
 
1716
        return QString::null;
 
1717
 
 
1718
    if ( !IMPL->prefix.isEmpty() )
 
1719
        return IMPL->prefix + ":" + IMPL->name;
 
1720
    return IMPL->name;
 
1721
}
 
1722
 
 
1723
/*!
 
1724
    Returns the value of the node.
 
1725
 
 
1726
    The meaning of the value depends on the subclass:
 
1727
    \table
 
1728
    \header \i Name \i Meaning
 
1729
    \row \i QDomAttr \i The attribute value
 
1730
    \row \i QDomCDATASection \i The content of the CDATA section
 
1731
    \row \i QDomComment \i The comment
 
1732
    \row \i QDomProcessingInstruction \i The data of the processing intruction
 
1733
    \row \i QDomText \i The text
 
1734
    \endtable
 
1735
 
 
1736
    All the other subclasses do not have a node value and will return
 
1737
    QString::null.
 
1738
 
 
1739
    \sa setNodeValue() nodeName()
 
1740
*/
 
1741
QString QDomNode::nodeValue() const
 
1742
{
 
1743
    if ( !impl )
 
1744
        return QString::null;
 
1745
    return IMPL->value;
 
1746
}
 
1747
 
 
1748
/*!
 
1749
    Sets the node's value to \a v.
 
1750
 
 
1751
    \sa nodeValue()
 
1752
*/
 
1753
void QDomNode::setNodeValue( const QString& v )
 
1754
{
 
1755
    if ( !impl )
 
1756
        return;
 
1757
    IMPL->setNodeValue( v );
 
1758
}
 
1759
 
 
1760
/*!
 
1761
    \enum QDomNode::NodeType
 
1762
 
 
1763
    This enum defines the type of the node:
 
1764
    \value ElementNode
 
1765
    \value AttributeNode
 
1766
    \value TextNode
 
1767
    \value CDATASectionNode
 
1768
    \value EntityReferenceNode
 
1769
    \value EntityNode
 
1770
    \value ProcessingInstructionNode
 
1771
    \value CommentNode
 
1772
    \value DocumentNode
 
1773
    \value DocumentTypeNode
 
1774
    \value DocumentFragmentNode
 
1775
    \value NotationNode
 
1776
    \value BaseNode  A QDomNode object, i.e. not a QDomNode subclass.
 
1777
    \value CharacterDataNode
 
1778
*/
 
1779
 
 
1780
/*!
 
1781
    Returns the type of the node.
 
1782
 
 
1783
    \sa toAttr(), toCDATASection(), toDocumentFragment(),
 
1784
    toDocument() toDocumentType(), toElement(), toEntityReference(),
 
1785
    toText(), toEntity() toNotation(), toProcessingInstruction(),
 
1786
    toCharacterData(), toComment()
 
1787
*/
 
1788
QDomNode::NodeType QDomNode::nodeType() const
 
1789
{
 
1790
    if ( !impl )
 
1791
        return QDomNode::BaseNode;
 
1792
    return IMPL->nodeType();
 
1793
}
 
1794
 
 
1795
/*!
 
1796
    Returns the parent node. If this node has no parent, a null node
 
1797
    is returned (i.e. a node for which isNull() returns TRUE).
 
1798
*/
 
1799
QDomNode QDomNode::parentNode() const
 
1800
{
 
1801
    if ( !impl )
 
1802
        return QDomNode();
 
1803
    return QDomNode( IMPL->parent() );
 
1804
}
 
1805
 
 
1806
/*!
 
1807
    Returns a list of all direct child nodes.
 
1808
 
 
1809
    Most often you will call this function on a QDomElement object.
 
1810
 
 
1811
    For example, if the XML document looks like this:
 
1812
    \code
 
1813
    <body>
 
1814
    <h1>Heading</h1>
 
1815
    <p>Hello <b>you</b></p>
 
1816
    </body>
 
1817
    \endcode
 
1818
    Then the list of child nodes for the "body"-element will contain
 
1819
    the node created by the &lt;h1&gt; tag and the node created by the
 
1820
    &lt;p&gt; tag.
 
1821
 
 
1822
    The nodes in the list are not copied; so changing the nodes in the
 
1823
    list will also change the children of this node.
 
1824
 
 
1825
    \sa firstChild() lastChild()
 
1826
*/
 
1827
QDomNodeList QDomNode::childNodes() const
 
1828
{
 
1829
    if ( !impl )
 
1830
        return QDomNodeList();
 
1831
    return QDomNodeList( new QDomNodeListPrivate( impl ) );
 
1832
}
 
1833
 
 
1834
/*!
 
1835
    Returns the first child of the node. If there is no child node, a
 
1836
    \link isNull() null node\endlink is returned. Changing the
 
1837
    returned node will also change the node in the document tree.
 
1838
 
 
1839
    \sa lastChild() childNodes()
 
1840
*/
 
1841
QDomNode QDomNode::firstChild() const
 
1842
{
 
1843
    if ( !impl )
 
1844
        return QDomNode();
 
1845
    return QDomNode( IMPL->first );
 
1846
}
 
1847
 
 
1848
/*!
 
1849
    Returns the last child of the node. If there is no child node, a
 
1850
    \link isNull() null node\endlink is returned. Changing the
 
1851
    returned node will also change the node in the document tree.
 
1852
 
 
1853
    \sa firstChild() childNodes()
 
1854
*/
 
1855
QDomNode QDomNode::lastChild() const
 
1856
{
 
1857
    if ( !impl )
 
1858
        return QDomNode();
 
1859
    return QDomNode( IMPL->last );
 
1860
}
 
1861
 
 
1862
/*!
 
1863
    Returns the previous sibling in the document tree. Changing the
 
1864
    returned node will also change the node in the document tree.
 
1865
 
 
1866
    For example, if you have XML like this:
 
1867
    \code
 
1868
    <h1>Heading</h1>
 
1869
    <p>The text...</p>
 
1870
    <h2>Next heading</h2>
 
1871
    \endcode
 
1872
    and this QDomNode represents the &lt;p&gt; tag, previousSibling()
 
1873
    will return the node representing the &lt;h1&gt; tag.
 
1874
 
 
1875
    \sa nextSibling()
 
1876
*/
 
1877
QDomNode QDomNode::previousSibling() const
 
1878
{
 
1879
    if ( !impl )
 
1880
        return QDomNode();
 
1881
    return QDomNode( IMPL->prev );
 
1882
}
 
1883
 
 
1884
/*!
 
1885
    Returns the next sibling in the document tree. Changing the
 
1886
    returned node will also change the node in the document tree.
 
1887
 
 
1888
    If you have XML like this:
 
1889
    \code
 
1890
    <h1>Heading</h1>
 
1891
    <p>The text...</p>
 
1892
    <h2>Next heading</h2>
 
1893
    \endcode
 
1894
    and this QDomNode represents the &lt;p&gt; tag, nextSibling() will
 
1895
    return the node representing the &lt;h2&gt; tag.
 
1896
 
 
1897
    \sa previousSibling()
 
1898
*/
 
1899
QDomNode QDomNode::nextSibling() const
 
1900
{
 
1901
    if ( !impl )
 
1902
        return QDomNode();
 
1903
    return QDomNode( IMPL->next );
 
1904
}
 
1905
 
 
1906
/*!
 
1907
    Returns a named node map of all attributes. Attributes are only
 
1908
    provided for \l{QDomElement}s.
 
1909
 
 
1910
    Changing the attributes in the map will also change the attributes
 
1911
    of this QDomNode.
 
1912
*/
 
1913
QDomNamedNodeMap QDomNode::attributes() const
 
1914
{
 
1915
    if ( !impl )
 
1916
        return QDomNamedNodeMap();
 
1917
 
 
1918
    return QDomNamedNodeMap( impl->attributes() );
 
1919
}
 
1920
 
 
1921
/*!
 
1922
    Returns the document to which this node belongs.
 
1923
*/
 
1924
QDomDocument QDomNode::ownerDocument() const
 
1925
{
 
1926
    if ( !impl )
 
1927
        return QDomDocument();
 
1928
    return QDomDocument( IMPL->ownerDocument() );
 
1929
}
 
1930
 
 
1931
/*!
 
1932
    Creates a deep (not shallow) copy of the QDomNode.
 
1933
 
 
1934
    If \a deep is TRUE, then the cloning is done recursively which
 
1935
    means that all the node's children are deep copied too. If \a deep
 
1936
    is FALSE only the node itself is copied and the copy will have no
 
1937
    child nodes.
 
1938
*/
 
1939
QDomNode QDomNode::cloneNode( bool deep ) const
 
1940
{
 
1941
    if ( !impl )
 
1942
        return QDomNode();
 
1943
    return QDomNode( IMPL->cloneNode( deep ) );
 
1944
}
 
1945
 
 
1946
/*!
 
1947
    Calling normalize() on an element converts all its children into a
 
1948
    standard form. This means that adjacent QDomText objects will be
 
1949
    merged into a single text object (QDomCDATASection nodes are not
 
1950
    merged).
 
1951
*/
 
1952
void QDomNode::normalize()
 
1953
{
 
1954
    if ( !impl )
 
1955
        return;
 
1956
    IMPL->normalize();
 
1957
}
 
1958
 
 
1959
/*!
 
1960
    Returns TRUE if the DOM implementation implements the feature \a
 
1961
    feature and this feature is supported by this node in the version
 
1962
    \a version; otherwise returns FALSE.
 
1963
 
 
1964
    \sa QDomImplementation::hasFeature()
 
1965
*/
 
1966
bool QDomNode::isSupported( const QString& feature, const QString& version ) const
 
1967
{
 
1968
    QDomImplementation i;
 
1969
    return i.hasFeature( feature, version );
 
1970
}
 
1971
 
 
1972
/*!
 
1973
    Returns the namespace URI of this node or QString::null if the
 
1974
    node has no namespace URI.
 
1975
 
 
1976
    Only nodes of type \link QDomNode::NodeType ElementNode\endlink or
 
1977
    \link QDomNode::NodeType AttributeNode\endlink can have
 
1978
    namespaces. A namespace URI must be specified at creation time and
 
1979
    cannot be changed later.
 
1980
 
 
1981
    \sa prefix() localName() QDomDocument::createElementNS()
 
1982
    QDomDocument::createAttributeNS()
 
1983
*/
 
1984
QString QDomNode::namespaceURI() const
 
1985
{
 
1986
    if ( !impl )
 
1987
        return QString::null;
 
1988
    return IMPL->namespaceURI;
 
1989
}
 
1990
 
 
1991
/*!
 
1992
    Returns the namespace prefix of the node or QString::null if the
 
1993
    node has no namespace prefix.
 
1994
 
 
1995
    Only nodes of type \link QDomNode::NodeType ElementNode\endlink or
 
1996
    \link QDomNode::NodeType AttributeNode\endlink can have
 
1997
    namespaces. A namespace prefix must be specified at creation time.
 
1998
    If a node was created with a namespace prefix, you can change it
 
1999
    later with setPrefix().
 
2000
 
 
2001
    If you create an element or attribute with
 
2002
    QDomDocument::createElement() or QDomDocument::createAttribute(),
 
2003
    the prefix will be QString::null. If you use
 
2004
    QDomDocument::createElementNS() or
 
2005
    QDomDocument::createAttributeNS() instead, the prefix will not be
 
2006
    QString::null; but it might be an empty string if the name does
 
2007
    not have a prefix.
 
2008
 
 
2009
    \sa setPrefix() localName() namespaceURI()
 
2010
    QDomDocument::createElementNS() QDomDocument::createAttributeNS()
 
2011
*/
 
2012
QString QDomNode::prefix() const
 
2013
{
 
2014
    if ( !impl )
 
2015
        return QString::null;
 
2016
    return IMPL->prefix;
 
2017
}
 
2018
 
 
2019
/*!
 
2020
    If the node has a namespace prefix, this function changes the
 
2021
    namespace prefix of the node to \a pre. Otherwise this function
 
2022
    does nothing.
 
2023
 
 
2024
    Only nodes of type \link QDomNode::NodeType ElementNode\endlink or
 
2025
    \link QDomNode::NodeType AttributeNode\endlink can have
 
2026
    namespaces. A namespace prefix must have be specified at creation
 
2027
    time; it is not possible to add a namespace prefix afterwards.
 
2028
 
 
2029
    \sa prefix() localName() namespaceURI()
 
2030
    QDomDocument::createElementNS() QDomDocument::createAttributeNS()
 
2031
*/
 
2032
void QDomNode::setPrefix( const QString& pre )
 
2033
{
 
2034
    if ( !impl || IMPL->prefix.isNull() )
 
2035
        return;
 
2036
    if ( isAttr() || isElement() )
 
2037
        IMPL->prefix = pre;
 
2038
}
 
2039
 
 
2040
/*!
 
2041
    If the node uses namespaces, this function returns the local name
 
2042
    of the node; otherwise it returns QString::null.
 
2043
 
 
2044
    Only nodes of type \link QDomNode::NodeType ElementNode\endlink or
 
2045
    \link QDomNode::NodeType AttributeNode\endlink can have
 
2046
    namespaces. A namespace must have been specified at creation time;
 
2047
    it is not possible to add a namespace afterwards.
 
2048
 
 
2049
    \sa prefix() namespaceURI() QDomDocument::createElementNS()
 
2050
    QDomDocument::createAttributeNS()
 
2051
*/
 
2052
QString QDomNode::localName() const
 
2053
{
 
2054
    if ( !impl || IMPL->createdWithDom1Interface )
 
2055
        return QString::null;
 
2056
    return IMPL->name;
 
2057
}
 
2058
 
 
2059
/*!
 
2060
    Returns TRUE if the node has attributes; otherwise returns FALSE.
 
2061
 
 
2062
    \sa attributes()
 
2063
*/
 
2064
bool QDomNode::hasAttributes() const
 
2065
{
 
2066
    if ( !impl )
 
2067
        return FALSE;
 
2068
    return IMPL->hasAttributes();
 
2069
}
 
2070
 
 
2071
/*!
 
2072
    Inserts the node \a newChild before the child node \a refChild.
 
2073
    \a refChild must be a direct child of this node. If \a refChild is
 
2074
    \link isNull() null\endlink then \a newChild is inserted as the
 
2075
    node's first child.
 
2076
 
 
2077
    If \a newChild is the child of another node, it is reparented to
 
2078
    this node. If \a newChild is a child of this node, then its
 
2079
    position in the list of children is changed.
 
2080
 
 
2081
    If \a newChild is a QDomDocumentFragment, then the children of the
 
2082
    fragment are removed from the fragment and inserted before \a
 
2083
    refChild.
 
2084
 
 
2085
    Returns a new reference to \a newChild on success or a \link
 
2086
    isNull() null node\endlink on failure.
 
2087
 
 
2088
    \sa insertAfter() replaceChild() removeChild() appendChild()
 
2089
*/
 
2090
QDomNode QDomNode::insertBefore( const QDomNode& newChild, const QDomNode& refChild )
 
2091
{
 
2092
    if ( !impl )
 
2093
        return QDomNode();
 
2094
    return QDomNode( IMPL->insertBefore( newChild.impl, refChild.impl ) );
 
2095
}
 
2096
 
 
2097
/*!
 
2098
    Inserts the node \a newChild after the child node \a refChild. \a
 
2099
    refChild must be a direct child of this node. If \a refChild is
 
2100
    \link isNull() null\endlink then \a newChild is appended as this
 
2101
    node's last child.
 
2102
 
 
2103
    If \a newChild is the child of another node, it is reparented to
 
2104
    this node. If \a newChild is a child of this node, then its
 
2105
    position in the list of children is changed.
 
2106
 
 
2107
    If \a newChild is a QDomDocumentFragment, then the children of the
 
2108
    fragment are removed from the fragment and inserted after \a
 
2109
    refChild.
 
2110
 
 
2111
    Returns a new reference to \a newChild on success or a \link
 
2112
    isNull() null node\endlink on failure.
 
2113
 
 
2114
    \sa insertBefore() replaceChild() removeChild() appendChild()
 
2115
*/
 
2116
QDomNode QDomNode::insertAfter( const QDomNode& newChild, const QDomNode& refChild )
 
2117
{
 
2118
    if ( !impl )
 
2119
        return QDomNode();
 
2120
    return QDomNode( IMPL->insertAfter( newChild.impl, refChild.impl ) );
 
2121
}
 
2122
 
 
2123
/*!
 
2124
    Replaces \a oldChild with \a newChild. \a oldChild must be a
 
2125
    direct child of this node.
 
2126
 
 
2127
    If \a newChild is the child of another node, it is reparented to
 
2128
    this node. If \a newChild is a child of this node, then its
 
2129
    position in the list of children is changed.
 
2130
 
 
2131
    If \a newChild is a QDomDocumentFragment, then \a oldChild is
 
2132
    replaced by all of the children of the fragment.
 
2133
 
 
2134
    Returns a new reference to \a oldChild on success or a \link
 
2135
    isNull() null node\endlink an failure.
 
2136
 
 
2137
    \sa insertBefore() insertAfter() removeChild() appendChild()
 
2138
*/
 
2139
QDomNode QDomNode::replaceChild( const QDomNode& newChild, const QDomNode& oldChild )
 
2140
{
 
2141
    if ( !impl )
 
2142
        return QDomNode();
 
2143
    return QDomNode( IMPL->replaceChild( newChild.impl, oldChild.impl ) );
 
2144
}
 
2145
 
 
2146
/*!
 
2147
    Removes \a oldChild from the list of children. \a oldChild must be
 
2148
    a direct child of this node.
 
2149
 
 
2150
    Returns a new reference to \a oldChild on success or a \link
 
2151
    isNull() null node\endlink on failure.
 
2152
 
 
2153
    \sa insertBefore() insertAfter() replaceChild() appendChild()
 
2154
*/
 
2155
QDomNode QDomNode::removeChild( const QDomNode& oldChild )
 
2156
{
 
2157
    if ( !impl )
 
2158
        return QDomNode();
 
2159
 
 
2160
    if ( oldChild.isNull() )
 
2161
        return QDomNode();
 
2162
 
 
2163
    return QDomNode( IMPL->removeChild( oldChild.impl ) );
 
2164
}
 
2165
 
 
2166
/*!
 
2167
    Appends \a newChild as the node's last child.
 
2168
 
 
2169
    If \a newChild is the child of another node, it is reparented to
 
2170
    this node. If \a newChild is a child of this node, then its
 
2171
    position in the list of children is changed.
 
2172
 
 
2173
    If \a newChild is a QDomDocumentFragment, then the children of the
 
2174
    fragment are removed from the fragment and appended.
 
2175
 
 
2176
    Returns a new reference to \a newChild.
 
2177
 
 
2178
    \sa insertBefore() insertAfter() replaceChild() removeChild()
 
2179
*/
 
2180
QDomNode QDomNode::appendChild( const QDomNode& newChild )
 
2181
{
 
2182
    if ( !impl )
 
2183
        return QDomNode();
 
2184
    return QDomNode( IMPL->appendChild( newChild.impl ) );
 
2185
}
 
2186
 
 
2187
/*!
 
2188
    Returns TRUE if the node has one or more children; otherwise
 
2189
    returns FALSE.
 
2190
*/
 
2191
bool QDomNode::hasChildNodes() const
 
2192
{
 
2193
    if ( !impl )
 
2194
        return FALSE;
 
2195
    return IMPL->first != 0;
 
2196
}
 
2197
 
 
2198
/*!
 
2199
    Returns TRUE if this node is null (i.e. if it has no type or
 
2200
    contents); otherwise returns FALSE.
 
2201
*/
 
2202
bool QDomNode::isNull() const
 
2203
{
 
2204
    return ( impl == 0 );
 
2205
}
 
2206
 
 
2207
/*!
 
2208
    Converts the node into a null node; if it was not a null node
 
2209
    before, its type and contents are deleted.
 
2210
 
 
2211
    \sa isNull()
 
2212
*/
 
2213
void QDomNode::clear()
 
2214
{
 
2215
    if ( impl && impl->deref() ) delete impl;
 
2216
    impl = 0;
 
2217
}
 
2218
 
 
2219
/*!
 
2220
    Returns the first direct child node for which nodeName() equals \a
 
2221
    name.
 
2222
 
 
2223
    If no such direct child exists, a \link isNull() null node\endlink
 
2224
    is returned.
 
2225
 
 
2226
    \sa nodeName()
 
2227
*/
 
2228
QDomNode QDomNode::namedItem( const QString& name ) const
 
2229
{
 
2230
    if ( !impl )
 
2231
        return QDomNode();
 
2232
    return QDomNode( impl->namedItem( name ) );
 
2233
}
 
2234
 
 
2235
/*!
 
2236
    Writes the XML representation of the node and all its children to
 
2237
    the stream \a str. This function uses \a indent as the amount of
 
2238
    space to indent the node.
 
2239
*/
 
2240
void QDomNode::save( QTextStream& str, int indent ) const
 
2241
{
 
2242
    if ( impl )
 
2243
        IMPL->save( str, 1, indent );
 
2244
}
 
2245
 
 
2246
/*!
 
2247
    \relates QDomNode
 
2248
 
 
2249
    Writes the XML representation of the node \a node and all its
 
2250
    children to the stream \a str.
 
2251
*/
 
2252
QTextStream& operator<<( QTextStream& str, const QDomNode& node )
 
2253
{
 
2254
    node.save( str, 1 );
 
2255
 
 
2256
    return str;
 
2257
}
 
2258
 
 
2259
/*!
 
2260
    Returns TRUE if the node is an attribute; otherwise returns FALSE.
 
2261
 
 
2262
    If this function returns TRUE, it does not imply that this object
 
2263
    is a QDomAttribute; you can get the QDomAttribute with
 
2264
    toAttribute().
 
2265
 
 
2266
    \sa toAttr()
 
2267
*/
 
2268
bool QDomNode::isAttr() const
 
2269
{
 
2270
    if(impl)
 
2271
        return impl->isAttr();
 
2272
    return FALSE;
 
2273
}
 
2274
 
 
2275
/*!
 
2276
    Returns TRUE if the node is a CDATA section; otherwise returns
 
2277
    FALSE.
 
2278
 
 
2279
    If this function returns TRUE, it does not imply that this object
 
2280
    is a QDomCDATASection; you can get the QDomCDATASection with
 
2281
    toCDATASection().
 
2282
 
 
2283
    \sa toCDATASection()
 
2284
*/
 
2285
bool QDomNode::isCDATASection() const
 
2286
{
 
2287
    if(impl)
 
2288
        return impl->isCDATASection();
 
2289
    return FALSE;
 
2290
}
 
2291
 
 
2292
/*!
 
2293
    Returns TRUE if the node is a document fragment; otherwise returns
 
2294
    FALSE.
 
2295
 
 
2296
    If this function returns TRUE, it does not imply that this object
 
2297
    is a QDomDocumentFragment; you can get the QDomDocumentFragment
 
2298
    with toDocumentFragment().
 
2299
 
 
2300
    \sa toDocumentFragment()
 
2301
*/
 
2302
bool QDomNode::isDocumentFragment() const
 
2303
{
 
2304
    if(impl)
 
2305
        return impl->isDocumentFragment();
 
2306
    return FALSE;
 
2307
}
 
2308
 
 
2309
/*!
 
2310
    Returns TRUE if the node is a document; otherwise returns FALSE.
 
2311
 
 
2312
    If this function returns TRUE, it does not imply that this object
 
2313
    is a QDomDocument; you can get the QDomDocument with toDocument().
 
2314
 
 
2315
    \sa toDocument()
 
2316
*/
 
2317
bool QDomNode::isDocument() const
 
2318
{
 
2319
    if(impl)
 
2320
        return impl->isDocument();
 
2321
    return FALSE;
 
2322
}
 
2323
 
 
2324
/*!
 
2325
    Returns TRUE if the node is a document type; otherwise returns
 
2326
    FALSE.
 
2327
 
 
2328
    If this function returns TRUE, it does not imply that this object
 
2329
    is a QDomDocumentType; you can get the QDomDocumentType with
 
2330
    toDocumentType().
 
2331
 
 
2332
    \sa toDocumentType()
 
2333
*/
 
2334
bool QDomNode::isDocumentType() const
 
2335
{
 
2336
    if(impl)
 
2337
        return impl->isDocumentType();
 
2338
    return FALSE;
 
2339
}
 
2340
 
 
2341
/*!
 
2342
    Returns TRUE if the node is an element; otherwise returns FALSE.
 
2343
 
 
2344
    If this function returns TRUE, it does not imply that this object
 
2345
    is a QDomElement; you can get the QDomElement with toElement().
 
2346
 
 
2347
    \sa toElement()
 
2348
*/
 
2349
bool QDomNode::isElement() const
 
2350
{
 
2351
    if(impl)
 
2352
        return impl->isElement();
 
2353
    return FALSE;
 
2354
}
 
2355
 
 
2356
/*!
 
2357
    Returns TRUE if the node is an entity reference; otherwise returns
 
2358
    FALSE.
 
2359
 
 
2360
    If this function returns TRUE, it does not imply that this object
 
2361
    is a QDomEntityReference; you can get the QDomEntityReference with
 
2362
    toEntityReference().
 
2363
 
 
2364
    \sa toEntityReference()
 
2365
*/
 
2366
bool QDomNode::isEntityReference() const
 
2367
{
 
2368
    if(impl)
 
2369
        return impl->isEntityReference();
 
2370
    return FALSE;
 
2371
}
 
2372
 
 
2373
/*!
 
2374
    Returns TRUE if the node is a text node; otherwise returns FALSE.
 
2375
 
 
2376
    If this function returns TRUE, it does not imply that this object
 
2377
    is a QDomText; you can get the QDomText with toText().
 
2378
 
 
2379
    \sa toText()
 
2380
*/
 
2381
bool QDomNode::isText() const
 
2382
{
 
2383
    if(impl)
 
2384
        return impl->isText();
 
2385
    return FALSE;
 
2386
}
 
2387
 
 
2388
/*!
 
2389
    Returns TRUE if the node is an entity; otherwise returns FALSE.
 
2390
 
 
2391
    If this function returns TRUE, it does not imply that this object
 
2392
    is a QDomEntity; you can get the QDomEntity with toEntity().
 
2393
 
 
2394
    \sa toEntity()
 
2395
*/
 
2396
bool QDomNode::isEntity() const
 
2397
{
 
2398
    if(impl)
 
2399
        return impl->isEntity();
 
2400
    return FALSE;
 
2401
}
 
2402
 
 
2403
/*!
 
2404
    Returns TRUE if the node is a notation; otherwise returns FALSE.
 
2405
 
 
2406
    If this function returns TRUE, it does not imply that this object
 
2407
    is a QDomNotation; you can get the QDomNotation with toNotation().
 
2408
 
 
2409
    \sa toNotation()
 
2410
*/
 
2411
bool QDomNode::isNotation() const
 
2412
{
 
2413
    if(impl)
 
2414
        return impl->isNotation();
 
2415
    return FALSE;
 
2416
}
 
2417
 
 
2418
/*!
 
2419
    Returns TRUE if the node is a processing instruction; otherwise
 
2420
    returns FALSE.
 
2421
 
 
2422
    If this function returns TRUE, it does not imply that this object
 
2423
    is a QDomProcessingInstruction; you can get the
 
2424
    QProcessingInstruction with toProcessingInstruction().
 
2425
 
 
2426
    \sa toProcessingInstruction()
 
2427
*/
 
2428
bool QDomNode::isProcessingInstruction() const
 
2429
{
 
2430
    if(impl)
 
2431
        return impl->isProcessingInstruction();
 
2432
    return FALSE;
 
2433
}
 
2434
 
 
2435
/*!
 
2436
    Returns TRUE if the node is a character data node; otherwise
 
2437
    returns FALSE.
 
2438
 
 
2439
    If this function returns TRUE, it does not imply that this object
 
2440
    is a QDomCharacterData; you can get the QDomCharacterData with
 
2441
    toCharacterData().
 
2442
 
 
2443
    \sa toCharacterData()
 
2444
*/
 
2445
bool QDomNode::isCharacterData() const
 
2446
{
 
2447
    if(impl)
 
2448
        return impl->isCharacterData();
 
2449
    return FALSE;
 
2450
}
 
2451
 
 
2452
/*!
 
2453
    Returns TRUE if the node is a comment; otherwise returns FALSE.
 
2454
 
 
2455
    If this function returns TRUE, it does not imply that this object
 
2456
    is a QDomComment; you can get the QDomComment with toComment().
 
2457
 
 
2458
    \sa toComment()
 
2459
*/
 
2460
bool QDomNode::isComment() const
 
2461
{
 
2462
     if(impl)
 
2463
        return impl->isComment();
 
2464
    return FALSE;
 
2465
}
 
2466
 
 
2467
#undef IMPL
 
2468
 
 
2469
/**************************************************************
 
2470
 *
 
2471
 * QDomNamedNodeMapPrivate
 
2472
 *
 
2473
 **************************************************************/
 
2474
 
 
2475
QDomNamedNodeMapPrivate::QDomNamedNodeMapPrivate( QDomNodePrivate* n )
 
2476
{
 
2477
    readonly = FALSE;
 
2478
    parent = n;
 
2479
    appendToParent = FALSE;
 
2480
}
 
2481
 
 
2482
QDomNamedNodeMapPrivate::~QDomNamedNodeMapPrivate()
 
2483
{
 
2484
    clearMap();
 
2485
}
 
2486
 
 
2487
QDomNamedNodeMapPrivate* QDomNamedNodeMapPrivate::clone( QDomNodePrivate* p )
 
2488
{
 
2489
    QDomNamedNodeMapPrivate* m = new QDomNamedNodeMapPrivate( p );
 
2490
    m->readonly = readonly;
 
2491
    m->appendToParent = appendToParent;
 
2492
 
 
2493
    QDictIterator<QDomNodePrivate> it ( map );
 
2494
    for ( ; it.current(); ++it )
 
2495
        m->setNamedItem( it.current()->cloneNode() );
 
2496
 
 
2497
    // we are no longer interested in ownership
 
2498
    m->deref();
 
2499
    return m;
 
2500
}
 
2501
 
 
2502
void QDomNamedNodeMapPrivate::clearMap()
 
2503
{
 
2504
    // Dereference all of our children if we took references
 
2505
    if ( !appendToParent ) {
 
2506
        QDictIterator<QDomNodePrivate> it( map );
 
2507
        for ( ; it.current(); ++it )
 
2508
            if ( it.current()->deref() )
 
2509
                delete it.current();
 
2510
    }
 
2511
 
 
2512
    map.clear();
 
2513
}
 
2514
 
 
2515
QDomNodePrivate* QDomNamedNodeMapPrivate::namedItem( const QString& name ) const
 
2516
{
 
2517
    QDomNodePrivate* p = map[ name ];
 
2518
    return p;
 
2519
}
 
2520
 
 
2521
QDomNodePrivate* QDomNamedNodeMapPrivate::namedItemNS( const QString& nsURI, const QString& localName ) const
 
2522
{
 
2523
    QDictIterator<QDomNodePrivate> it( map );
 
2524
    QDomNodePrivate *n = it.current();
 
2525
    while ( n ) {
 
2526
        if ( !n->prefix.isNull() ) {
 
2527
            // node has a namespace
 
2528
            if ( n->namespaceURI==nsURI && n->name==localName ) {
 
2529
                return n;
 
2530
            }
 
2531
        }
 
2532
        ++it;
 
2533
        n = it.current();
 
2534
    }
 
2535
    return 0;
 
2536
}
 
2537
 
 
2538
QDomNodePrivate* QDomNamedNodeMapPrivate::setNamedItem( QDomNodePrivate* arg )
 
2539
{
 
2540
    if ( readonly || !arg )
 
2541
        return 0;
 
2542
 
 
2543
    if ( appendToParent )
 
2544
        return parent->appendChild( arg );
 
2545
 
 
2546
    QDomNodePrivate *n = map[ arg->nodeName() ];
 
2547
    // We take a reference
 
2548
    arg->ref();
 
2549
    map.insert( arg->nodeName(), arg );
 
2550
    return n;
 
2551
}
 
2552
 
 
2553
QDomNodePrivate* QDomNamedNodeMapPrivate::setNamedItemNS( QDomNodePrivate* arg )
 
2554
{
 
2555
    if ( readonly || !arg )
 
2556
        return 0;
 
2557
 
 
2558
    if ( appendToParent )
 
2559
        return parent->appendChild( arg );
 
2560
 
 
2561
    if ( !arg->prefix.isNull() ) {
 
2562
        // node has a namespace
 
2563
        QDomNodePrivate *n = namedItemNS( arg->namespaceURI, arg->name );
 
2564
        // We take a reference
 
2565
        arg->ref();
 
2566
        map.insert( arg->nodeName(), arg );
 
2567
        return n;
 
2568
    } else {
 
2569
        // ### check the following code if it is ok
 
2570
        return setNamedItem( arg );
 
2571
    }
 
2572
}
 
2573
 
 
2574
QDomNodePrivate* QDomNamedNodeMapPrivate::removeNamedItem( const QString& name )
 
2575
{
 
2576
    if ( readonly )
 
2577
        return 0;
 
2578
 
 
2579
    QDomNodePrivate* p = namedItem( name );
 
2580
    if ( p == 0 )
 
2581
        return 0;
 
2582
    if ( appendToParent )
 
2583
        return parent->removeChild( p );
 
2584
 
 
2585
    map.remove( p->nodeName() );
 
2586
    // We took a reference, so we have to free one here
 
2587
    p->deref();
 
2588
    return p;
 
2589
}
 
2590
 
 
2591
QDomNodePrivate* QDomNamedNodeMapPrivate::item( int index ) const
 
2592
{
 
2593
    if ( (uint)index >= length() )
 
2594
        return 0;
 
2595
 
 
2596
    QDictIterator<QDomNodePrivate> it( map );
 
2597
    for ( int i = 0; i < index; ++i, ++it )
 
2598
        ;
 
2599
    return it.current();
 
2600
}
 
2601
 
 
2602
uint QDomNamedNodeMapPrivate::length() const
 
2603
{
 
2604
    return map.count();
 
2605
}
 
2606
 
 
2607
bool QDomNamedNodeMapPrivate::contains( const QString& name ) const
 
2608
{
 
2609
    return ( map[ name ] != 0 );
 
2610
}
 
2611
 
 
2612
bool QDomNamedNodeMapPrivate::containsNS( const QString& nsURI, const QString & localName ) const
 
2613
{
 
2614
    return ( namedItemNS( nsURI, localName ) != 0 );
 
2615
}
 
2616
 
 
2617
/**************************************************************
 
2618
 *
 
2619
 * QDomNamedNodeMap
 
2620
 *
 
2621
 **************************************************************/
 
2622
 
 
2623
#define IMPL ((QDomNamedNodeMapPrivate*)impl)
 
2624
 
 
2625
/*!
 
2626
    \class QDomNamedNodeMap qdom.h
 
2627
    \reentrant
 
2628
    \brief The QDomNamedNodeMap class contains a collection of nodes
 
2629
    that can be accessed by name.
 
2630
\if defined(commercial)
 
2631
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
2632
\endif
 
2633
 
 
2634
    \module XML
 
2635
    \ingroup xml-tools
 
2636
 
 
2637
    Note that QDomNamedNodeMap does not inherit from QDomNodeList.
 
2638
    QDomNamedNodeMaps do not provide any specific node ordering.
 
2639
    Although nodes in a QDomNamedNodeMap may be accessed by an ordinal
 
2640
    index, this is simply to allow a convenient enumeration of the
 
2641
    contents of a QDomNamedNodeMap, and does not imply that the DOM
 
2642
    specifies an ordering of the nodes.
 
2643
 
 
2644
    The QDomNamedNodeMap is used in three places:
 
2645
    \list 1
 
2646
    \i QDomDocumentType::entities() returns a map of all entities
 
2647
        described in the DTD.
 
2648
    \i QDomDocumentType::notations() returns a map of all notations
 
2649
        described in the DTD.
 
2650
    \i QDomNode::attributes() returns a map of all attributes of an
 
2651
        element.
 
2652
    \endlist
 
2653
 
 
2654
    Items in the map are identified by the name which QDomNode::name()
 
2655
    returns. Nodes are retrieved using namedItem(), namedItemNS() or
 
2656
    item(). New nodes are inserted with setNamedItem() or
 
2657
    setNamedItemNS() and removed with removeNamedItem() or
 
2658
    removeNamedItemNS(). Use contains() to see if an item with the
 
2659
    given name is in the named node map. The number of items is
 
2660
    returned by length().
 
2661
 
 
2662
    Terminology: in this class we use "item" and "node"
 
2663
    interchangeably.
 
2664
*/
 
2665
 
 
2666
/*!
 
2667
    Constructs an empty named node map.
 
2668
*/
 
2669
QDomNamedNodeMap::QDomNamedNodeMap()
 
2670
{
 
2671
    impl = 0;
 
2672
}
 
2673
 
 
2674
/*!
 
2675
    Constructs a copy of \a n.
 
2676
*/
 
2677
QDomNamedNodeMap::QDomNamedNodeMap( const QDomNamedNodeMap& n )
 
2678
{
 
2679
    impl = n.impl;
 
2680
    if ( impl )
 
2681
        impl->ref();
 
2682
}
 
2683
 
 
2684
QDomNamedNodeMap::QDomNamedNodeMap( QDomNamedNodeMapPrivate* n )
 
2685
{
 
2686
    impl = n;
 
2687
    if ( impl )
 
2688
        impl->ref();
 
2689
}
 
2690
 
 
2691
/*!
 
2692
    Assigns \a n to this named node map.
 
2693
*/
 
2694
QDomNamedNodeMap& QDomNamedNodeMap::operator= ( const QDomNamedNodeMap& n )
 
2695
{
 
2696
    if ( impl && impl->deref() )
 
2697
        delete impl;
 
2698
    impl = n.impl;
 
2699
    if ( impl )
 
2700
        impl->ref();
 
2701
 
 
2702
    return *this;
 
2703
}
 
2704
 
 
2705
/*!
 
2706
    Returns TRUE if \a n and this named node map are equal; otherwise
 
2707
    returns FALSE.
 
2708
*/
 
2709
bool QDomNamedNodeMap::operator== ( const QDomNamedNodeMap& n ) const
 
2710
{
 
2711
    return ( impl == n.impl );
 
2712
}
 
2713
 
 
2714
/*!
 
2715
    Returns TRUE if \a n and this named node map are not equal;
 
2716
    otherwise returns FALSE.
 
2717
*/
 
2718
bool QDomNamedNodeMap::operator!= ( const QDomNamedNodeMap& n ) const
 
2719
{
 
2720
    return ( impl != n.impl );
 
2721
}
 
2722
 
 
2723
/*!
 
2724
    Destroys the object and frees its resources.
 
2725
*/
 
2726
QDomNamedNodeMap::~QDomNamedNodeMap()
 
2727
{
 
2728
    if ( impl && impl->deref() )
 
2729
        delete impl;
 
2730
}
 
2731
 
 
2732
/*!
 
2733
    Returns the node called \a name.
 
2734
 
 
2735
    If the named node map does not contain such a node, a \link
 
2736
    QDomNode::isNull() null node\endlink is returned. A node's name is
 
2737
    the name returned by QDomNode::nodeName().
 
2738
 
 
2739
    \sa setNamedItem() namedItemNS()
 
2740
*/
 
2741
QDomNode QDomNamedNodeMap::namedItem( const QString& name ) const
 
2742
{
 
2743
    if ( !impl )
 
2744
        return QDomNode();
 
2745
    return QDomNode( IMPL->namedItem( name ) );
 
2746
}
 
2747
 
 
2748
/*!
 
2749
    Inserts the node \a newNode into the named node map. The name used
 
2750
    by the map is the node name of \a newNode as returned by
 
2751
    QDomNode::nodeName().
 
2752
 
 
2753
    If the new node replaces an existing node, i.e. the map contains a
 
2754
    node with the same name, the replaced node is returned.
 
2755
 
 
2756
    \sa namedItem() removeNamedItem() setNamedItemNS()
 
2757
*/
 
2758
QDomNode QDomNamedNodeMap::setNamedItem( const QDomNode& newNode )
 
2759
{
 
2760
    if ( !impl )
 
2761
        return QDomNode();
 
2762
    return QDomNode( IMPL->setNamedItem( (QDomNodePrivate*)newNode.impl ) );
 
2763
}
 
2764
 
 
2765
/*!
 
2766
    Removes the node called \a name from the map.
 
2767
 
 
2768
    The function returns the removed node or a \link
 
2769
    QDomNode::isNull() null node\endlink if the map did not contain a
 
2770
    node called \a name.
 
2771
 
 
2772
    \sa setNamedItem() namedItem() removeNamedItemNS()
 
2773
*/
 
2774
QDomNode QDomNamedNodeMap::removeNamedItem( const QString& name )
 
2775
{
 
2776
    if ( !impl )
 
2777
        return QDomNode();
 
2778
    return QDomNode( IMPL->removeNamedItem( name ) );
 
2779
}
 
2780
 
 
2781
/*!
 
2782
    Retrieves the node at position \a index.
 
2783
 
 
2784
    This can be used to iterate over the map. Note that the nodes in
 
2785
    the map are ordered arbitrarily.
 
2786
 
 
2787
    \sa length()
 
2788
*/
 
2789
QDomNode QDomNamedNodeMap::item( int index ) const
 
2790
{
 
2791
    if ( !impl )
 
2792
        return QDomNode();
 
2793
    return QDomNode( IMPL->item( index ) );
 
2794
}
 
2795
 
 
2796
/*!
 
2797
    Returns the node associated with the local name \a localName and
 
2798
    the namespace URI \a nsURI.
 
2799
 
 
2800
    If the map does not contain such a node, a \link
 
2801
    QDomNode::isNull() null node\endlink is returned.
 
2802
 
 
2803
    \sa setNamedItemNS() namedItem()
 
2804
*/
 
2805
QDomNode QDomNamedNodeMap::namedItemNS( const QString& nsURI, const QString& localName ) const
 
2806
{
 
2807
    if ( !impl )
 
2808
        return QDomNode();
 
2809
    return QDomNode( IMPL->namedItemNS( nsURI, localName ) );
 
2810
}
 
2811
 
 
2812
/*!
 
2813
    Inserts the node \a newNode in the map. If a node with the same
 
2814
    namespace URI and the same local name already exists in the map,
 
2815
    it is replaced by \a newNode. If the new node replaces an existing
 
2816
    node, the replaced node is returned.
 
2817
 
 
2818
    \sa namedItemNS() removeNamedItemNS() setNamedItem()
 
2819
*/
 
2820
QDomNode QDomNamedNodeMap::setNamedItemNS( const QDomNode& newNode )
 
2821
{
 
2822
    if ( !impl )
 
2823
        return QDomNode();
 
2824
    return QDomNode( IMPL->setNamedItemNS( (QDomNodePrivate*)newNode.impl ) );
 
2825
}
 
2826
 
 
2827
/*!
 
2828
    Removes the node with the local name \a localName and the
 
2829
    namespace URI \a nsURI from the map.
 
2830
 
 
2831
    The function returns the removed node or a \link
 
2832
    QDomNode::isNull() null node\endlink if the map did not contain a
 
2833
    node with the local name \a localName and the namespace URI \a
 
2834
    nsURI.
 
2835
 
 
2836
    \sa setNamedItemNS() namedItemNS() removeNamedItem()
 
2837
*/
 
2838
QDomNode QDomNamedNodeMap::removeNamedItemNS( const QString& nsURI, const QString& localName )
 
2839
{
 
2840
    if ( !impl )
 
2841
        return QDomNode();
 
2842
    QDomNodePrivate *n = IMPL->namedItemNS( nsURI, localName );
 
2843
    if ( !n )
 
2844
        return QDomNode();
 
2845
    return QDomNode( IMPL->removeNamedItem( n->name ) );
 
2846
}
 
2847
 
 
2848
/*!
 
2849
    Returns the number of nodes in the map.
 
2850
 
 
2851
    \sa item()
 
2852
*/
 
2853
uint QDomNamedNodeMap::length() const
 
2854
{
 
2855
    if ( !impl )
 
2856
        return 0;
 
2857
    return IMPL->length();
 
2858
}
 
2859
 
 
2860
/*!
 
2861
    \fn uint QDomNamedNodeMap::count() const
 
2862
 
 
2863
    Returns the number of nodes in the map.
 
2864
 
 
2865
    This function is the same as length().
 
2866
*/
 
2867
 
 
2868
/*!
 
2869
    Returns TRUE if the map contains a node called \a name; otherwise
 
2870
    returns FALSE.
 
2871
*/
 
2872
bool QDomNamedNodeMap::contains( const QString& name ) const
 
2873
{
 
2874
    if ( !impl )
 
2875
        return FALSE;
 
2876
    return IMPL->contains( name );
 
2877
}
 
2878
 
 
2879
#undef IMPL
 
2880
 
 
2881
/**************************************************************
 
2882
 *
 
2883
 * QDomDocumentTypePrivate
 
2884
 *
 
2885
 **************************************************************/
 
2886
 
 
2887
QDomDocumentTypePrivate::QDomDocumentTypePrivate( QDomDocumentPrivate* doc, QDomNodePrivate* parent )
 
2888
    : QDomNodePrivate( doc, parent )
 
2889
{
 
2890
    init();
 
2891
}
 
2892
 
 
2893
QDomDocumentTypePrivate::QDomDocumentTypePrivate( QDomDocumentTypePrivate* n, bool deep )
 
2894
    : QDomNodePrivate( n, deep )
 
2895
{
 
2896
    init();
 
2897
    // Refill the maps with our new children
 
2898
    QDomNodePrivate* p = first;
 
2899
    while ( p ) {
 
2900
        if ( p->isEntity() )
 
2901
            // Dont use normal insert function since we would create infinite recursion
 
2902
            entities->map.insert( p->nodeName(), p );
 
2903
        if ( p->isNotation() )
 
2904
            // Dont use normal insert function since we would create infinite recursion
 
2905
            notations->map.insert( p->nodeName(), p );
 
2906
    }
 
2907
}
 
2908
 
 
2909
QDomDocumentTypePrivate::~QDomDocumentTypePrivate()
 
2910
{
 
2911
    if ( entities->deref() )
 
2912
        delete entities;
 
2913
    if ( notations->deref() )
 
2914
        delete notations;
 
2915
}
 
2916
 
 
2917
void QDomDocumentTypePrivate::init()
 
2918
{
 
2919
    entities = new QDomNamedNodeMapPrivate( this );
 
2920
    notations = new QDomNamedNodeMapPrivate( this );
 
2921
    publicId = QString::null;
 
2922
    systemId = QString::null;
 
2923
    internalSubset = QString::null;
 
2924
 
 
2925
    entities->setAppendToParent( TRUE );
 
2926
    notations->setAppendToParent( TRUE );
 
2927
}
 
2928
 
 
2929
QDomNodePrivate* QDomDocumentTypePrivate::cloneNode( bool deep)
 
2930
{
 
2931
    QDomNodePrivate* p = new QDomDocumentTypePrivate( this, deep );
 
2932
    // We are not interested in this node
 
2933
    p->deref();
 
2934
    return p;
 
2935
}
 
2936
 
 
2937
QDomNodePrivate* QDomDocumentTypePrivate::insertBefore( QDomNodePrivate* newChild, QDomNodePrivate* refChild )
 
2938
{
 
2939
    // Call the origianl implementation
 
2940
    QDomNodePrivate* p = QDomNodePrivate::insertBefore( newChild, refChild );
 
2941
    // Update the maps
 
2942
    if ( p && p->isEntity() )
 
2943
        entities->map.insert( p->nodeName(), p );
 
2944
    else if ( p && p->isNotation() )
 
2945
        notations->map.insert( p->nodeName(), p );
 
2946
 
 
2947
    return p;
 
2948
}
 
2949
 
 
2950
QDomNodePrivate* QDomDocumentTypePrivate::insertAfter( QDomNodePrivate* newChild, QDomNodePrivate* refChild )
 
2951
{
 
2952
    // Call the origianl implementation
 
2953
    QDomNodePrivate* p = QDomNodePrivate::insertAfter( newChild, refChild );
 
2954
    // Update the maps
 
2955
    if ( p && p->isEntity() )
 
2956
        entities->map.insert( p->nodeName(), p );
 
2957
    else if ( p && p->isNotation() )
 
2958
        notations->map.insert( p->nodeName(), p );
 
2959
 
 
2960
    return p;
 
2961
}
 
2962
 
 
2963
QDomNodePrivate* QDomDocumentTypePrivate::replaceChild( QDomNodePrivate* newChild, QDomNodePrivate* oldChild )
 
2964
{
 
2965
    // Call the origianl implementation
 
2966
    QDomNodePrivate* p = QDomNodePrivate::replaceChild( newChild, oldChild );
 
2967
    // Update the maps
 
2968
    if ( p ) {
 
2969
        if ( oldChild && oldChild->isEntity() )
 
2970
            entities->map.remove( oldChild->nodeName() );
 
2971
        else if ( oldChild && oldChild->isNotation() )
 
2972
            notations->map.remove( oldChild->nodeName() );
 
2973
 
 
2974
        if ( p->isEntity() )
 
2975
            entities->map.insert( p->nodeName(), p );
 
2976
        else if ( p->isNotation() )
 
2977
            notations->map.insert( p->nodeName(), p );
 
2978
    }
 
2979
 
 
2980
    return p;
 
2981
}
 
2982
 
 
2983
QDomNodePrivate* QDomDocumentTypePrivate::removeChild( QDomNodePrivate* oldChild )
 
2984
{
 
2985
    // Call the origianl implementation
 
2986
    QDomNodePrivate* p = QDomNodePrivate::removeChild(  oldChild );
 
2987
    // Update the maps
 
2988
    if ( p && p->isEntity() )
 
2989
        entities->map.remove( p->nodeName() );
 
2990
    else if ( p && p->isNotation() )
 
2991
        notations->map.remove( p ->nodeName() );
 
2992
 
 
2993
    return p;
 
2994
}
 
2995
 
 
2996
QDomNodePrivate* QDomDocumentTypePrivate::appendChild( QDomNodePrivate* newChild )
 
2997
{
 
2998
    return insertAfter( newChild, 0 );
 
2999
}
 
3000
 
 
3001
void QDomDocumentTypePrivate::save( QTextStream& s, int, int indent ) const
 
3002
{
 
3003
    if ( name.isEmpty() )
 
3004
        return;
 
3005
 
 
3006
    s << "<!DOCTYPE " << name;
 
3007
 
 
3008
    if ( !publicId.isNull() ) {
 
3009
        s << " PUBLIC \"" << publicId << "\"";
 
3010
        if ( !systemId.isNull() )
 
3011
            s << " \"" << systemId << "\"";
 
3012
    } else if ( !systemId.isNull() ) {
 
3013
        s << " SYSTEM \"" << systemId << "\"";
 
3014
    }
 
3015
 
 
3016
    if ( entities->length()>0 || notations->length()>0 ) {
 
3017
        s << " [ " << endl;
 
3018
 
 
3019
        QDictIterator<QDomNodePrivate> it2( notations->map );
 
3020
        for ( ; it2.current(); ++it2 )
 
3021
            it2.current()->save( s, 0, indent );
 
3022
 
 
3023
        QDictIterator<QDomNodePrivate> it( entities->map );
 
3024
        for ( ; it.current(); ++it )
 
3025
            it.current()->save( s, 0, indent );
 
3026
 
 
3027
        s << " ]";
 
3028
    }
 
3029
 
 
3030
    s << ">" << endl;
 
3031
}
 
3032
 
 
3033
/**************************************************************
 
3034
 *
 
3035
 * QDomDocumentType
 
3036
 *
 
3037
 **************************************************************/
 
3038
 
 
3039
#define IMPL ((QDomDocumentTypePrivate*)impl)
 
3040
 
 
3041
/*!
 
3042
    \class QDomDocumentType qdom.h
 
3043
    \reentrant
 
3044
    \brief The QDomDocumentType class is the representation of the DTD
 
3045
    in the document tree.
 
3046
\if defined(commercial)
 
3047
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
3048
\endif
 
3049
 
 
3050
    \module XML
 
3051
    \ingroup xml-tools
 
3052
 
 
3053
    The QDomDocumentType class allows read-only access to some of the
 
3054
    data structures in the DTD: it can return a map of all entities()
 
3055
    and notations(). In addition the function name() returns the name
 
3056
    of the document type as specified in the &lt;!DOCTYPE name&gt;
 
3057
    tag. This class also provides the publicId(), systemId() and
 
3058
    internalSubset() functions.
 
3059
 
 
3060
    \sa QDomDocument
 
3061
*/
 
3062
 
 
3063
/*!
 
3064
    Creates an empty QDomDocumentType object.
 
3065
*/
 
3066
QDomDocumentType::QDomDocumentType() : QDomNode()
 
3067
{
 
3068
}
 
3069
 
 
3070
/*!
 
3071
    Constructs a copy of \a n.
 
3072
 
 
3073
    The data of the copy is shared (shallow copy): modifying one node
 
3074
    will also change the other. If you want to make a deep copy, use
 
3075
    cloneNode().
 
3076
*/
 
3077
QDomDocumentType::QDomDocumentType( const QDomDocumentType& n )
 
3078
    : QDomNode( n )
 
3079
{
 
3080
}
 
3081
 
 
3082
QDomDocumentType::QDomDocumentType( QDomDocumentTypePrivate* n )
 
3083
    : QDomNode( n )
 
3084
{
 
3085
}
 
3086
 
 
3087
/*!
 
3088
    Assigns \a n to this document type.
 
3089
 
 
3090
    The data of the copy is shared (shallow copy): modifying one node
 
3091
    will also change the other. If you want to make a deep copy, use
 
3092
    cloneNode().
 
3093
*/
 
3094
QDomDocumentType& QDomDocumentType::operator= ( const QDomDocumentType& n )
 
3095
{
 
3096
    return (QDomDocumentType&) QDomNode::operator=( n );
 
3097
}
 
3098
 
 
3099
/*!
 
3100
    Destroys the object and frees its resources.
 
3101
*/
 
3102
QDomDocumentType::~QDomDocumentType()
 
3103
{
 
3104
}
 
3105
 
 
3106
/*!
 
3107
    Returns the name of the document type as specified in the
 
3108
    &lt;!DOCTYPE name&gt; tag.
 
3109
 
 
3110
    \sa nodeName()
 
3111
*/
 
3112
QString QDomDocumentType::name() const
 
3113
{
 
3114
    if ( !impl )
 
3115
        return QString::null;
 
3116
 
 
3117
    return IMPL->nodeName();
 
3118
}
 
3119
 
 
3120
/*!
 
3121
    Returns a map of all entities described in the DTD.
 
3122
*/
 
3123
QDomNamedNodeMap QDomDocumentType::entities() const
 
3124
{
 
3125
    if ( !impl )
 
3126
        return QDomNamedNodeMap();
 
3127
    return QDomNamedNodeMap( IMPL->entities );
 
3128
}
 
3129
 
 
3130
/*!
 
3131
    Returns a map of all notations described in the DTD.
 
3132
*/
 
3133
QDomNamedNodeMap QDomDocumentType::notations() const
 
3134
{
 
3135
    if ( !impl )
 
3136
        return QDomNamedNodeMap();
 
3137
    return QDomNamedNodeMap( IMPL->notations );
 
3138
}
 
3139
 
 
3140
/*!
 
3141
    Returns the public identifier of the external DTD subset or
 
3142
    QString::null if there is no public identifier.
 
3143
 
 
3144
    \sa systemId() internalSubset() QDomImplementation::createDocumentType()
 
3145
*/
 
3146
QString QDomDocumentType::publicId() const
 
3147
{
 
3148
    if ( !impl )
 
3149
        return QString::null;
 
3150
    return IMPL->publicId;
 
3151
}
 
3152
 
 
3153
/*!
 
3154
    Returns the system identifier of the external DTD subset or
 
3155
    QString::null if there is no system identifier.
 
3156
 
 
3157
    \sa publicId() internalSubset() QDomImplementation::createDocumentType()
 
3158
*/
 
3159
QString QDomDocumentType::systemId() const
 
3160
{
 
3161
    if ( !impl )
 
3162
        return QString::null;
 
3163
    return IMPL->systemId;
 
3164
}
 
3165
 
 
3166
/*!
 
3167
    Returns the internal subset of the document type or QString::null
 
3168
    if there is no internal subset.
 
3169
 
 
3170
    \sa publicId() systemId()
 
3171
*/
 
3172
QString QDomDocumentType::internalSubset() const
 
3173
{
 
3174
    if ( !impl )
 
3175
        return QString::null;
 
3176
    return IMPL->internalSubset;
 
3177
}
 
3178
 
 
3179
/*!
 
3180
    Returns \c DocumentTypeNode.
 
3181
 
 
3182
    \sa isDocumentType() QDomNode::toDocumentType()
 
3183
*/
 
3184
QDomNode::NodeType QDomDocumentType::nodeType() const
 
3185
{
 
3186
    return DocumentTypeNode;
 
3187
}
 
3188
 
 
3189
/*!
 
3190
    This function overloads QDomNode::isDocumentType().
 
3191
 
 
3192
    \sa nodeType() QDomNode::toDocumentType()
 
3193
*/
 
3194
bool QDomDocumentType::isDocumentType() const
 
3195
{
 
3196
    return TRUE;
 
3197
}
 
3198
 
 
3199
#undef IMPL
 
3200
 
 
3201
/**************************************************************
 
3202
 *
 
3203
 * QDomDocumentFragmentPrivate
 
3204
 *
 
3205
 **************************************************************/
 
3206
 
 
3207
QDomDocumentFragmentPrivate::QDomDocumentFragmentPrivate( QDomDocumentPrivate* doc, QDomNodePrivate* parent )
 
3208
    : QDomNodePrivate( doc, parent )
 
3209
{
 
3210
    name = "#document-fragment";
 
3211
}
 
3212
 
 
3213
QDomDocumentFragmentPrivate::QDomDocumentFragmentPrivate( QDomNodePrivate* n, bool deep )
 
3214
    : QDomNodePrivate( n, deep )
 
3215
{
 
3216
}
 
3217
 
 
3218
QDomDocumentFragmentPrivate::~QDomDocumentFragmentPrivate()
 
3219
{
 
3220
}
 
3221
 
 
3222
QDomNodePrivate* QDomDocumentFragmentPrivate::cloneNode( bool deep)
 
3223
{
 
3224
    QDomNodePrivate* p = new QDomDocumentFragmentPrivate( this, deep );
 
3225
    // We are not interested in this node
 
3226
    p->deref();
 
3227
    return p;
 
3228
}
 
3229
 
 
3230
/**************************************************************
 
3231
 *
 
3232
 * QDomDocumentFragment
 
3233
 *
 
3234
 **************************************************************/
 
3235
 
 
3236
#define IMPL ((QDomDocumentFragmentPrivate*)impl)
 
3237
 
 
3238
/*!
 
3239
    \class QDomDocumentFragment qdom.h
 
3240
    \reentrant
 
3241
    \brief The QDomDocumentFragment class is a tree of QDomNodes which is not usually a complete QDomDocument.
 
3242
\if defined(commercial)
 
3243
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
3244
\endif
 
3245
 
 
3246
    \module XML
 
3247
    \ingroup xml-tools
 
3248
 
 
3249
    If you want to do complex tree operations it is useful to have a
 
3250
    lightweight class to store nodes and their relations.
 
3251
    QDomDocumentFragment stores a subtree of a document which does not
 
3252
    necessarily represent a well-formed XML document.
 
3253
 
 
3254
    QDomDocumentFragment is also useful if you want to group several
 
3255
    nodes in a list and insert them all together as children of some
 
3256
    node. In these cases QDomDocumentFragment can be used as a
 
3257
    temporary container for this list of children.
 
3258
 
 
3259
    The most important feature of QDomDocumentFragment is that it is
 
3260
    treated in a special way by QDomNode::insertAfter(),
 
3261
    QDomNode::insertBefore(), QDomNode::replaceChild() and
 
3262
    QDomNode::appendChild(): instead of inserting the fragment itself, all
 
3263
    the fragment's children are inserted.
 
3264
*/
 
3265
 
 
3266
/*!
 
3267
    Constructs an empty document fragment.
 
3268
*/
 
3269
QDomDocumentFragment::QDomDocumentFragment()
 
3270
{
 
3271
}
 
3272
 
 
3273
QDomDocumentFragment::QDomDocumentFragment( QDomDocumentFragmentPrivate* n )
 
3274
    : QDomNode( n )
 
3275
{
 
3276
}
 
3277
 
 
3278
/*!
 
3279
    Constructs a copy of \a x.
 
3280
 
 
3281
    The data of the copy is shared (shallow copy): modifying one node
 
3282
    will also change the other. If you want to make a deep copy, use
 
3283
    cloneNode().
 
3284
*/
 
3285
QDomDocumentFragment::QDomDocumentFragment( const QDomDocumentFragment& x )
 
3286
    : QDomNode( x )
 
3287
{
 
3288
}
 
3289
 
 
3290
/*!
 
3291
    Assigns \a x to this DOM document fragment.
 
3292
 
 
3293
    The data of the copy is shared (shallow copy): modifying one node
 
3294
    will also change the other. If you want to make a deep copy, use
 
3295
    cloneNode().
 
3296
*/
 
3297
QDomDocumentFragment& QDomDocumentFragment::operator= ( const QDomDocumentFragment& x )
 
3298
{
 
3299
    return (QDomDocumentFragment&) QDomNode::operator=( x );
 
3300
}
 
3301
 
 
3302
/*!
 
3303
    Destroys the object and frees its resources.
 
3304
*/
 
3305
QDomDocumentFragment::~QDomDocumentFragment()
 
3306
{
 
3307
}
 
3308
 
 
3309
/*!
 
3310
    Returns \c DocumentFragment.
 
3311
 
 
3312
    \sa isDocumentFragment() QDomNode::toDocumentFragment()
 
3313
*/
 
3314
QDomNode::NodeType QDomDocumentFragment::nodeType() const
 
3315
{
 
3316
    return QDomNode::DocumentFragmentNode;
 
3317
}
 
3318
 
 
3319
/*!
 
3320
    This function reimplements QDomNode::isDocumentFragment().
 
3321
 
 
3322
    \sa nodeType() QDomNode::toDocumentFragment()
 
3323
*/
 
3324
bool QDomDocumentFragment::isDocumentFragment() const
 
3325
{
 
3326
    return TRUE;
 
3327
}
 
3328
 
 
3329
#undef IMPL
 
3330
 
 
3331
/**************************************************************
 
3332
 *
 
3333
 * QDomCharacterDataPrivate
 
3334
 *
 
3335
 **************************************************************/
 
3336
 
 
3337
QDomCharacterDataPrivate::QDomCharacterDataPrivate( QDomDocumentPrivate* d, QDomNodePrivate* p,
 
3338
                                                      const QString& data )
 
3339
    : QDomNodePrivate( d, p )
 
3340
{
 
3341
    value = data;
 
3342
 
 
3343
    name = "#character-data";
 
3344
}
 
3345
 
 
3346
QDomCharacterDataPrivate::QDomCharacterDataPrivate( QDomCharacterDataPrivate* n, bool deep )
 
3347
    : QDomNodePrivate( n, deep )
 
3348
{
 
3349
}
 
3350
 
 
3351
QDomCharacterDataPrivate::~QDomCharacterDataPrivate()
 
3352
{
 
3353
}
 
3354
 
 
3355
QDomNodePrivate* QDomCharacterDataPrivate::cloneNode( bool deep )
 
3356
{
 
3357
    QDomNodePrivate* p = new QDomCharacterDataPrivate( this, deep );
 
3358
    // We are not interested in this node
 
3359
    p->deref();
 
3360
    return p;
 
3361
}
 
3362
 
 
3363
uint QDomCharacterDataPrivate::dataLength() const
 
3364
{
 
3365
    return value.length();
 
3366
}
 
3367
 
 
3368
QString QDomCharacterDataPrivate::substringData( unsigned long offset, unsigned long n ) const
 
3369
{
 
3370
    return value.mid( offset, n );
 
3371
}
 
3372
 
 
3373
void QDomCharacterDataPrivate::insertData( unsigned long offset, const QString& arg )
 
3374
{
 
3375
    value.insert( offset, arg );
 
3376
}
 
3377
 
 
3378
void QDomCharacterDataPrivate::deleteData( unsigned long offset, unsigned long n )
 
3379
{
 
3380
    value.remove( offset, n );
 
3381
}
 
3382
 
 
3383
void QDomCharacterDataPrivate::replaceData( unsigned long offset, unsigned long n, const QString& arg )
 
3384
{
 
3385
    value.replace( offset, n, arg );
 
3386
}
 
3387
 
 
3388
void QDomCharacterDataPrivate::appendData( const QString& arg )
 
3389
{
 
3390
    value += arg;
 
3391
}
 
3392
 
 
3393
/**************************************************************
 
3394
 *
 
3395
 * QDomCharacterData
 
3396
 *
 
3397
 **************************************************************/
 
3398
 
 
3399
#define IMPL ((QDomCharacterDataPrivate*)impl)
 
3400
 
 
3401
/*!
 
3402
    \class QDomCharacterData qdom.h
 
3403
    \reentrant
 
3404
    \brief The QDomCharacterData class represents a generic string in the DOM.
 
3405
\if defined(commercial)
 
3406
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
3407
\endif
 
3408
 
 
3409
    \module XML
 
3410
    \ingroup xml-tools
 
3411
 
 
3412
    Character data as used in XML specifies a generic data string.
 
3413
    More specialized versions of this class are QDomText, QDomComment
 
3414
    and QDomCDATASection.
 
3415
 
 
3416
    The data string is set with setData() and retrieved with data().
 
3417
    You can retrieve a portion of the data string using
 
3418
    substringData(). Extra data can be appended with appendData(), or
 
3419
    inserted with insertData(). Portions of the data string can be
 
3420
    deleted with deleteData() or replaced with replaceData(). The
 
3421
    length of the data string is returned by length().
 
3422
 
 
3423
    The node type of the node containing this character data is
 
3424
    returned by nodeType().
 
3425
 
 
3426
    \sa QDomText QDomComment QDomCDATASection
 
3427
*/
 
3428
 
 
3429
/*!
 
3430
    Constructs an empty character data object.
 
3431
*/
 
3432
QDomCharacterData::QDomCharacterData()
 
3433
{
 
3434
}
 
3435
 
 
3436
/*!
 
3437
    Constructs a copy of \a x.
 
3438
 
 
3439
    The data of the copy is shared (shallow copy): modifying one node
 
3440
    will also change the other. If you want to make a deep copy, use
 
3441
    cloneNode().
 
3442
*/
 
3443
QDomCharacterData::QDomCharacterData( const QDomCharacterData& x )
 
3444
    : QDomNode( x )
 
3445
{
 
3446
}
 
3447
 
 
3448
QDomCharacterData::QDomCharacterData( QDomCharacterDataPrivate* n )
 
3449
    : QDomNode( n )
 
3450
{
 
3451
}
 
3452
 
 
3453
/*!
 
3454
    Assigns \a x to this character data.
 
3455
 
 
3456
    The data of the copy is shared (shallow copy): modifying one node
 
3457
    will also change the other. If you want to make a deep copy, use
 
3458
    cloneNode().
 
3459
*/
 
3460
QDomCharacterData& QDomCharacterData::operator= ( const QDomCharacterData& x )
 
3461
{
 
3462
    return (QDomCharacterData&) QDomNode::operator=( x );
 
3463
}
 
3464
 
 
3465
/*!
 
3466
    Destroys the object and frees its resources.
 
3467
*/
 
3468
QDomCharacterData::~QDomCharacterData()
 
3469
{
 
3470
}
 
3471
 
 
3472
/*!
 
3473
    Returns the string stored in this object.
 
3474
 
 
3475
    If the node is a \link isNull() null node\endlink, it will return
 
3476
    QString::null.
 
3477
*/
 
3478
QString QDomCharacterData::data() const
 
3479
{
 
3480
    if ( !impl )
 
3481
        return QString::null;
 
3482
    return impl->nodeValue();
 
3483
}
 
3484
 
 
3485
/*!
 
3486
    Sets this object's string to \a v.
 
3487
*/
 
3488
void QDomCharacterData::setData( const QString& v )
 
3489
{
 
3490
    if ( impl )
 
3491
        impl->setNodeValue( v );
 
3492
}
 
3493
 
 
3494
/*!
 
3495
    Returns the length of the stored string.
 
3496
*/
 
3497
uint QDomCharacterData::length() const
 
3498
{
 
3499
    if ( impl )
 
3500
        return IMPL->dataLength();
 
3501
    return 0;
 
3502
}
 
3503
 
 
3504
/*!
 
3505
    Returns the substring of length \a count from position \a offset.
 
3506
*/
 
3507
QString QDomCharacterData::substringData( unsigned long offset, unsigned long count )
 
3508
{
 
3509
    if ( !impl )
 
3510
        return QString::null;
 
3511
    return IMPL->substringData( offset, count );
 
3512
}
 
3513
 
 
3514
/*!
 
3515
    Appends the string \a arg to the stored string.
 
3516
*/
 
3517
void QDomCharacterData::appendData( const QString& arg )
 
3518
{
 
3519
    if ( impl )
 
3520
        IMPL->appendData( arg );
 
3521
}
 
3522
 
 
3523
/*!
 
3524
    Inserts the string \a arg into the stored string at position \a offset.
 
3525
*/
 
3526
void QDomCharacterData::insertData( unsigned long offset, const QString& arg )
 
3527
{
 
3528
    if ( impl )
 
3529
        IMPL->insertData( offset, arg );
 
3530
}
 
3531
 
 
3532
/*!
 
3533
    Deletes a substring of length \a count from position \a offset.
 
3534
*/
 
3535
void QDomCharacterData::deleteData( unsigned long offset, unsigned long count )
 
3536
{
 
3537
    if ( impl )
 
3538
        IMPL->deleteData( offset, count );
 
3539
}
 
3540
 
 
3541
/*!
 
3542
    Replaces the substring of length \a count starting at position \a
 
3543
    offset with the string \a arg.
 
3544
*/
 
3545
void QDomCharacterData::replaceData( unsigned long offset, unsigned long count, const QString& arg )
 
3546
{
 
3547
    if ( impl )
 
3548
        IMPL->replaceData( offset, count, arg );
 
3549
}
 
3550
 
 
3551
/*!
 
3552
    Returns the type of node this object refers to (i.e. \c TextNode,
 
3553
    \c CDATASectionNode, \c CommentNode or \c CharacterDataNode). For
 
3554
    a \link isNull() null node\endlink \c CharacterDataNode is
 
3555
    returned.
 
3556
*/
 
3557
QDomNode::NodeType QDomCharacterData::nodeType() const
 
3558
{
 
3559
    if( !impl )
 
3560
        return CharacterDataNode;
 
3561
    return QDomNode::nodeType();
 
3562
}
 
3563
 
 
3564
/*!
 
3565
    Returns TRUE.
 
3566
*/
 
3567
bool QDomCharacterData::isCharacterData() const
 
3568
{
 
3569
    return TRUE;
 
3570
}
 
3571
 
 
3572
#undef IMPL
 
3573
 
 
3574
/**************************************************************
 
3575
 *
 
3576
 * QDomAttrPrivate
 
3577
 *
 
3578
 **************************************************************/
 
3579
 
 
3580
QDomAttrPrivate::QDomAttrPrivate( QDomDocumentPrivate* d, QDomNodePrivate* parent, const QString& name_ )
 
3581
    : QDomNodePrivate( d, parent )
 
3582
{
 
3583
    name = name_;
 
3584
    m_specified = FALSE;
 
3585
}
 
3586
 
 
3587
QDomAttrPrivate::QDomAttrPrivate( QDomDocumentPrivate* d, QDomNodePrivate* p, const QString& nsURI, const QString& qName )
 
3588
    : QDomNodePrivate( d, p )
 
3589
{
 
3590
    qt_split_namespace( prefix, name, qName, !nsURI.isNull() );
 
3591
    namespaceURI = nsURI;
 
3592
    createdWithDom1Interface = FALSE;
 
3593
    m_specified = FALSE;
 
3594
}
 
3595
 
 
3596
QDomAttrPrivate::QDomAttrPrivate( QDomAttrPrivate* n, bool deep )
 
3597
    : QDomNodePrivate( n, deep )
 
3598
{
 
3599
    m_specified = n->specified();
 
3600
}
 
3601
 
 
3602
QDomAttrPrivate::~QDomAttrPrivate()
 
3603
{
 
3604
}
 
3605
 
 
3606
void QDomAttrPrivate::setNodeValue( const QString& v )
 
3607
{
 
3608
    value = v;
 
3609
    QDomTextPrivate *t = new QDomTextPrivate( 0, this, v );
 
3610
    // keep the refcount balanced: appendChild() does a ref() anyway.
 
3611
    t->deref();
 
3612
    if ( first ) {
 
3613
        delete removeChild( first );
 
3614
    }
 
3615
    appendChild( t );
 
3616
}
 
3617
 
 
3618
QDomNodePrivate* QDomAttrPrivate::cloneNode( bool deep )
 
3619
{
 
3620
    QDomNodePrivate* p = new QDomAttrPrivate( this, deep );
 
3621
    // We are not interested in this node
 
3622
    p->deref();
 
3623
    return p;
 
3624
}
 
3625
 
 
3626
bool QDomAttrPrivate::specified() const
 
3627
{
 
3628
    return m_specified;
 
3629
}
 
3630
 
 
3631
/*
 
3632
  Encode an attribute value upon saving.
 
3633
*/
 
3634
static QString encodeAttr( const QString& str )
 
3635
{
 
3636
    QString tmp( str );
 
3637
    uint len = tmp.length();
 
3638
    uint i = 0;
 
3639
    while ( i < len ) {
 
3640
        if ( tmp[(int)i] == '<' ) {
 
3641
            tmp.replace( i, 1, "&lt;" );
 
3642
            len += 3;
 
3643
            i += 4;
 
3644
        } else if ( tmp[(int)i] == '"' ) {
 
3645
            tmp.replace( i, 1, "&quot;" );
 
3646
            len += 5;
 
3647
            i += 6;
 
3648
        } else if ( tmp[(int)i] == '&' ) {
 
3649
            tmp.replace( i, 1, "&amp;" );
 
3650
            len += 4;
 
3651
            i += 5;
 
3652
        } else if ( tmp[(int)i] == '>' && i>=2 && tmp[(int)i-1]==']' && tmp[(int)i-2]==']' ) {
 
3653
            tmp.replace( i, 1, "&gt;" );
 
3654
            len += 3;
 
3655
            i += 4;
 
3656
        } else {
 
3657
            ++i;
 
3658
        }
 
3659
    }
 
3660
 
 
3661
    return tmp;
 
3662
}
 
3663
 
 
3664
void QDomAttrPrivate::save( QTextStream& s, int, int ) const
 
3665
{
 
3666
    if ( namespaceURI.isNull() ) {
 
3667
        s << name << "=\"" << encodeAttr( value ) << "\"";
 
3668
    } else {
 
3669
        // ### optimize this (see comment of QDomElementPrivate::save()
 
3670
        s << prefix << ":" << name << "=\"" << encodeAttr( value ) << "\""
 
3671
            << " xmlns:" << prefix << "=\"" << encodeAttr( namespaceURI ) << "\"";
 
3672
    }
 
3673
}
 
3674
 
 
3675
/**************************************************************
 
3676
 *
 
3677
 * QDomAttr
 
3678
 *
 
3679
 **************************************************************/
 
3680
 
 
3681
#define IMPL ((QDomAttrPrivate*)impl)
 
3682
 
 
3683
/*!
 
3684
    \class QDomAttr qdom.h
 
3685
    \reentrant
 
3686
    \brief The QDomAttr class represents one attribute of a QDomElement.
 
3687
\if defined(commercial)
 
3688
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
3689
\endif
 
3690
 
 
3691
    \module XML
 
3692
    \ingroup xml-tools
 
3693
 
 
3694
    For example, the following piece of XML produces an element with
 
3695
    no children, but two attributes:
 
3696
 
 
3697
    \code
 
3698
    <link href="http://www.trolltech.com" color="red" />
 
3699
    \endcode
 
3700
 
 
3701
    You can access the attributes of an element with code like this:
 
3702
 
 
3703
    \code
 
3704
    QDomElement e = //...
 
3705
    //...
 
3706
    QDomAttr a = e.attributeNode( "href" );
 
3707
    cout << a.value() << endl;                // prints "http://www.trolltech.com"
 
3708
    a.setValue( "http://doc.trolltech.com" ); // change the node's attribute
 
3709
    QDomAttr a2 = e.attributeNode( "href" );
 
3710
    cout << a2.value() << endl;               // prints "http://doc.trolltech.com"
 
3711
    \endcode
 
3712
 
 
3713
    This example also shows that changing an attribute received from
 
3714
    an element changes the attribute of the element. If you do not
 
3715
    want to change the value of the element's attribute you must
 
3716
    use cloneNode() to get an independent copy of the attribute.
 
3717
 
 
3718
    QDomAttr can return the name() and value() of an attribute. An
 
3719
    attribute's value is set with setValue(). If specified() returns
 
3720
    TRUE the value was either set in the document or set with
 
3721
    setValue(); otherwise the value hasn't been set. The node this
 
3722
    attribute is attached to (if any) is returned by ownerElement().
 
3723
 
 
3724
    For further information about the Document Object Model see
 
3725
    \link http://www.w3.org/TR/REC-DOM-Level-1/\endlink and
 
3726
    \link http://www.w3.org/TR/DOM-Level-2-Core/\endlink.
 
3727
    For a more general introduction of the DOM implementation see the
 
3728
    QDomDocument documentation.
 
3729
*/
 
3730
 
 
3731
 
 
3732
/*!
 
3733
    Constructs an empty attribute.
 
3734
*/
 
3735
QDomAttr::QDomAttr()
 
3736
{
 
3737
}
 
3738
 
 
3739
/*!
 
3740
    Constructs a copy of \a x.
 
3741
 
 
3742
    The data of the copy is shared (shallow copy): modifying one node
 
3743
    will also change the other. If you want to make a deep copy, use
 
3744
    cloneNode().
 
3745
*/
 
3746
QDomAttr::QDomAttr( const QDomAttr& x )
 
3747
    : QDomNode( x )
 
3748
{
 
3749
}
 
3750
 
 
3751
QDomAttr::QDomAttr( QDomAttrPrivate* n )
 
3752
    : QDomNode( n )
 
3753
{
 
3754
}
 
3755
 
 
3756
/*!
 
3757
    Assigns \a x to this DOM attribute.
 
3758
 
 
3759
    The data of the copy is shared (shallow copy): modifying one node
 
3760
    will also change the other. If you want to make a deep copy, use
 
3761
    cloneNode().
 
3762
*/
 
3763
QDomAttr& QDomAttr::operator= ( const QDomAttr& x )
 
3764
{
 
3765
    return (QDomAttr&) QDomNode::operator=( x );
 
3766
}
 
3767
 
 
3768
/*!
 
3769
    Destroys the object and frees its resources.
 
3770
*/
 
3771
QDomAttr::~QDomAttr()
 
3772
{
 
3773
}
 
3774
 
 
3775
/*!
 
3776
    Returns the attribute's name.
 
3777
*/
 
3778
QString QDomAttr::name() const
 
3779
{
 
3780
    if ( !impl )
 
3781
        return QString::null;
 
3782
    return impl->nodeName();
 
3783
}
 
3784
 
 
3785
/*!
 
3786
    Returns TRUE if the attribute has either been expicitly specified
 
3787
    in the XML document or was set by the user with setValue().
 
3788
    Returns FALSE if the value hasn't been specified or set.
 
3789
 
 
3790
    \sa setValue()
 
3791
*/
 
3792
bool QDomAttr::specified() const
 
3793
{
 
3794
    if ( !impl )
 
3795
        return FALSE;
 
3796
    return IMPL->specified();
 
3797
}
 
3798
 
 
3799
/*!
 
3800
    Returns the element node this attribute is attached to or a \link
 
3801
    QDomNode::isNull() null node\endlink if this attribute is not
 
3802
    attached to any element.
 
3803
*/
 
3804
QDomElement QDomAttr::ownerElement() const
 
3805
{
 
3806
    if ( !impl && !impl->parent()->isElement() )
 
3807
        return QDomElement();
 
3808
    return QDomElement( (QDomElementPrivate*)(impl->parent()) );
 
3809
}
 
3810
 
 
3811
/*!
 
3812
    Returns the value of the attribute or QString::null if the
 
3813
    attribute has not been specified.
 
3814
 
 
3815
    \sa specified() setValue()
 
3816
*/
 
3817
QString QDomAttr::value() const
 
3818
{
 
3819
    if ( !impl )
 
3820
        return QString::null;
 
3821
    return impl->nodeValue();
 
3822
}
 
3823
 
 
3824
/*!
 
3825
    Sets the attribute's value to \a v.
 
3826
 
 
3827
    \sa value()
 
3828
*/
 
3829
void QDomAttr::setValue( const QString& v )
 
3830
{
 
3831
    if ( !impl )
 
3832
        return;
 
3833
    impl->setNodeValue( v );
 
3834
    IMPL->m_specified = TRUE;
 
3835
}
 
3836
 
 
3837
/*!
 
3838
    Returns \link QDomNode::NodeType AttributeNode\endlink.
 
3839
*/
 
3840
QDomNode::NodeType QDomAttr::nodeType() const
 
3841
{
 
3842
    return AttributeNode;
 
3843
}
 
3844
 
 
3845
/*!
 
3846
    Returns TRUE.
 
3847
*/
 
3848
bool QDomAttr::isAttr() const
 
3849
{
 
3850
    return TRUE;
 
3851
}
 
3852
 
 
3853
#undef IMPL
 
3854
 
 
3855
/**************************************************************
 
3856
 *
 
3857
 * QDomElementPrivate
 
3858
 *
 
3859
 **************************************************************/
 
3860
 
 
3861
QDomElementPrivate::QDomElementPrivate( QDomDocumentPrivate* d, QDomNodePrivate* p,
 
3862
                                          const QString& tagname )
 
3863
    : QDomNodePrivate( d, p )
 
3864
{
 
3865
    name = tagname;
 
3866
    m_attr = new QDomNamedNodeMapPrivate( this );
 
3867
}
 
3868
 
 
3869
QDomElementPrivate::QDomElementPrivate( QDomDocumentPrivate* d, QDomNodePrivate* p,
 
3870
        const QString& nsURI, const QString& qName )
 
3871
    : QDomNodePrivate( d, p )
 
3872
{
 
3873
    qt_split_namespace( prefix, name, qName, !nsURI.isNull() );
 
3874
    namespaceURI = nsURI;
 
3875
    createdWithDom1Interface = FALSE;
 
3876
    m_attr = new QDomNamedNodeMapPrivate( this );
 
3877
}
 
3878
 
 
3879
QDomElementPrivate::QDomElementPrivate( QDomElementPrivate* n, bool deep ) :
 
3880
    QDomNodePrivate( n, deep )
 
3881
{
 
3882
    m_attr = n->m_attr->clone( this );
 
3883
    // Reference is down to 0, so we set it to 1 here.
 
3884
    m_attr->ref();
 
3885
}
 
3886
 
 
3887
QDomElementPrivate::~QDomElementPrivate()
 
3888
{
 
3889
    if ( m_attr->deref() )
 
3890
        delete m_attr;
 
3891
}
 
3892
 
 
3893
QDomNodePrivate* QDomElementPrivate::cloneNode( bool deep)
 
3894
{
 
3895
    QDomNodePrivate* p = new QDomElementPrivate( this, deep );
 
3896
    // We are not interested in this node
 
3897
    p->deref();
 
3898
    return p;
 
3899
}
 
3900
 
 
3901
QString QDomElementPrivate::attribute( const QString& name_, const QString& defValue ) const
 
3902
{
 
3903
    QDomNodePrivate* n = m_attr->namedItem( name_ );
 
3904
    if ( !n )
 
3905
        return defValue;
 
3906
 
 
3907
    return n->nodeValue();
 
3908
}
 
3909
 
 
3910
QString QDomElementPrivate::attributeNS( const QString& nsURI, const QString& localName, const QString& defValue ) const
 
3911
{
 
3912
    QDomNodePrivate* n = m_attr->namedItemNS( nsURI, localName );
 
3913
    if ( !n )
 
3914
        return defValue;
 
3915
 
 
3916
    return n->nodeValue();
 
3917
}
 
3918
 
 
3919
void QDomElementPrivate::setAttribute( const QString& aname, const QString& newValue )
 
3920
{
 
3921
    QDomNodePrivate* n = m_attr->namedItem( aname );
 
3922
    if ( !n ) {
 
3923
        n = new QDomAttrPrivate( ownerDocument(), this, aname );
 
3924
        n->setNodeValue( newValue );
 
3925
 
 
3926
        // Referencing is done by the map, so we set the reference counter back
 
3927
        // to 0 here. This is ok since we created the QDomAttrPrivate.
 
3928
        n->deref();
 
3929
        m_attr->setNamedItem( n );
 
3930
    } else {
 
3931
        n->setNodeValue( newValue );
 
3932
    }
 
3933
}
 
3934
 
 
3935
void QDomElementPrivate::setAttributeNS( const QString& nsURI, const QString& qName, const QString& newValue )
 
3936
{
 
3937
    QString prefix, localName;
 
3938
    qt_split_namespace( prefix, localName, qName, TRUE );
 
3939
    QDomNodePrivate* n = m_attr->namedItemNS( nsURI, localName );
 
3940
    if ( !n ) {
 
3941
        n = new QDomAttrPrivate( ownerDocument(), this, nsURI, qName );
 
3942
        n->setNodeValue( newValue );
 
3943
 
 
3944
        // Referencing is done by the map, so we set the reference counter back
 
3945
        // to 0 here. This is ok since we created the QDomAttrPrivate.
 
3946
        n->deref();
 
3947
        m_attr->setNamedItem( n );
 
3948
    } else {
 
3949
        n->setNodeValue( newValue );
 
3950
        n->prefix = prefix;
 
3951
    }
 
3952
}
 
3953
 
 
3954
void QDomElementPrivate::removeAttribute( const QString& aname )
 
3955
{
 
3956
    QDomNodePrivate* p = m_attr->removeNamedItem( aname );
 
3957
    if ( p && p->count == 0 )
 
3958
        delete p;
 
3959
}
 
3960
 
 
3961
QDomAttrPrivate* QDomElementPrivate::attributeNode( const QString& aname )
 
3962
{
 
3963
    return (QDomAttrPrivate*)m_attr->namedItem( aname );
 
3964
}
 
3965
 
 
3966
QDomAttrPrivate* QDomElementPrivate::attributeNodeNS( const QString& nsURI, const QString& localName )
 
3967
{
 
3968
    return (QDomAttrPrivate*)m_attr->namedItemNS( nsURI, localName );
 
3969
}
 
3970
 
 
3971
QDomAttrPrivate* QDomElementPrivate::setAttributeNode( QDomAttrPrivate* newAttr )
 
3972
{
 
3973
    QDomNodePrivate* n = m_attr->namedItem( newAttr->nodeName() );
 
3974
 
 
3975
    // Referencing is done by the maps
 
3976
    m_attr->setNamedItem( newAttr );
 
3977
 
 
3978
    return (QDomAttrPrivate*)n;
 
3979
}
 
3980
 
 
3981
QDomAttrPrivate* QDomElementPrivate::setAttributeNodeNS( QDomAttrPrivate* newAttr )
 
3982
{
 
3983
    QDomNodePrivate* n = 0;
 
3984
    if ( !newAttr->prefix.isNull() )
 
3985
        n = m_attr->namedItemNS( newAttr->namespaceURI, newAttr->name );
 
3986
 
 
3987
    // Referencing is done by the maps
 
3988
    m_attr->setNamedItem( newAttr );
 
3989
 
 
3990
    return (QDomAttrPrivate*)n;
 
3991
}
 
3992
 
 
3993
QDomAttrPrivate* QDomElementPrivate::removeAttributeNode( QDomAttrPrivate* oldAttr )
 
3994
{
 
3995
    return (QDomAttrPrivate*)m_attr->removeNamedItem( oldAttr->nodeName() );
 
3996
}
 
3997
 
 
3998
bool QDomElementPrivate::hasAttribute( const QString& aname )
 
3999
{
 
4000
    return m_attr->contains( aname );
 
4001
}
 
4002
 
 
4003
bool QDomElementPrivate::hasAttributeNS( const QString& nsURI, const QString& localName )
 
4004
{
 
4005
    return m_attr->containsNS( nsURI, localName );
 
4006
}
 
4007
 
 
4008
QString QDomElementPrivate::text()
 
4009
{
 
4010
    QString t( "" );
 
4011
 
 
4012
    QDomNodePrivate* p = first;
 
4013
    while ( p ) {
 
4014
        if ( p->isText() || p->isCDATASection() )
 
4015
            t += p->nodeValue();
 
4016
        else if ( p->isElement() )
 
4017
            t += ((QDomElementPrivate*)p)->text();
 
4018
        p = p->next;
 
4019
    }
 
4020
 
 
4021
    return t;
 
4022
}
 
4023
 
 
4024
void QDomElementPrivate::save( QTextStream& s, int depth, int indent ) const
 
4025
{
 
4026
    if ( !( prev && prev->isText() ) )
 
4027
        for ( int i = 0; i < depth*indent; ++i )
 
4028
            s << " ";
 
4029
 
 
4030
    QString qName( name );
 
4031
    QString nsDecl( "" );
 
4032
    if ( !namespaceURI.isNull() ) {
 
4033
        // ### optimize this, so that you only declare namespaces that are not
 
4034
        // yet declared -- we loose default namespace mappings, so maybe we
 
4035
        // should rather store the information that we get from
 
4036
        // startPrefixMapping()/endPrefixMapping() and use them (you have to
 
4037
        // take care if the DOM tree is modified, though)
 
4038
        if ( prefix.isEmpty() ) {
 
4039
            nsDecl = " xmlns";
 
4040
        } else {
 
4041
            qName = prefix + ":" + name;
 
4042
            nsDecl = " xmlns:" + prefix;
 
4043
        }
 
4044
        nsDecl += "=\"" + encodeAttr( namespaceURI ) + "\"";
 
4045
    }
 
4046
    s << "<" << qName << nsDecl;
 
4047
 
 
4048
    if ( !m_attr->map.isEmpty() ) {
 
4049
        s << " ";
 
4050
        QDictIterator<QDomNodePrivate> it( m_attr->map );
 
4051
        for ( ; it.current(); ++it ) {
 
4052
            it.current()->save( s, 0, indent );
 
4053
            s << " ";
 
4054
        }
 
4055
    }
 
4056
 
 
4057
    if ( last ) {
 
4058
        // has child nodes
 
4059
        if ( first->isText() )
 
4060
            s << ">";
 
4061
        else
 
4062
            s << ">" << endl;
 
4063
        QDomNodePrivate::save( s, depth + 1, indent);
 
4064
        if ( !last->isText() )
 
4065
            for( int i = 0; i < depth*indent; ++i )
 
4066
                s << " ";
 
4067
 
 
4068
        s << "</" << qName << ">";
 
4069
    } else {
 
4070
        s << "/>";
 
4071
    }
 
4072
    if ( !( next && next->isText() ) )
 
4073
        s << endl;
 
4074
}
 
4075
 
 
4076
/**************************************************************
 
4077
 *
 
4078
 * QDomElement
 
4079
 *
 
4080
 **************************************************************/
 
4081
 
 
4082
#define IMPL ((QDomElementPrivate*)impl)
 
4083
 
 
4084
/*!
 
4085
    \class QDomElement qdom.h
 
4086
    \reentrant
 
4087
    \brief The QDomElement class represents one element in the DOM tree.
 
4088
\if defined(commercial)
 
4089
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
4090
\endif
 
4091
 
 
4092
    \module XML
 
4093
    \ingroup xml-tools
 
4094
 
 
4095
    Elements have a tagName() and zero or more attributes associated
 
4096
    with them. The tag name can be changed with setTagName().
 
4097
 
 
4098
    Element attributes are represented by QDomAttr objects that can
 
4099
    be queried using the attribute() and attributeNode() functions.
 
4100
    You can set attributes with the setAttribute() and
 
4101
    setAttributeNode() functions. Attributes can be removed with
 
4102
    removeAttribute(). There are namespace-aware equivalents to these
 
4103
    functions, i.e. setAttributeNS(), setAttributeNodeNS() and
 
4104
    removeAttributeNS().
 
4105
 
 
4106
    If you want to access the text of a node use text(), e.g.
 
4107
    \code
 
4108
    QDomElement e = //...
 
4109
    //...
 
4110
    QString s = e.text()
 
4111
    \endcode
 
4112
    The text() function operates recursively to find the text (since
 
4113
    not all elements contain text). If you want to find all the text
 
4114
    in all of a node's children, iterate over the children looking for
 
4115
    QDomText nodes, e.g.
 
4116
    \code
 
4117
    QString text;
 
4118
    QDomElement element = doc.documentElement();
 
4119
    for( QDomNode n = element.firstChild(); !n.isNull(); n = n.nextSibling() )
 
4120
    {
 
4121
        QDomText t = n.toText();
 
4122
        if ( !t.isNull() )
 
4123
            text += t.data();
 
4124
    }
 
4125
    \endcode
 
4126
    Note that we attempt to convert each node to a text node and use
 
4127
    text() rather than using firstChild().toText().data() or
 
4128
    n.toText().data() directly on the node, because the node may not
 
4129
    be a text element.
 
4130
 
 
4131
    You can get a list of all the decendents of an element which have
 
4132
    a specified tag name with elementsByTagName() or
 
4133
    elementsByTagNameNS().
 
4134
 
 
4135
    For further information about the Document Object Model see
 
4136
    \link http://www.w3.org/TR/REC-DOM-Level-1/\endlink and
 
4137
    \link http://www.w3.org/TR/DOM-Level-2-Core/\endlink.
 
4138
    For a more general introduction of the DOM implementation see the
 
4139
    QDomDocument documentation.
 
4140
*/
 
4141
 
 
4142
/*!
 
4143
    Constructs an empty element. Use the QDomDocument::createElement()
 
4144
    function to construct elements with content.
 
4145
*/
 
4146
QDomElement::QDomElement()
 
4147
    : QDomNode()
 
4148
{
 
4149
}
 
4150
 
 
4151
/*!
 
4152
    Constructs a copy of \a x.
 
4153
 
 
4154
    The data of the copy is shared (shallow copy): modifying one node
 
4155
    will also change the other. If you want to make a deep copy, use
 
4156
    cloneNode().
 
4157
*/
 
4158
QDomElement::QDomElement( const QDomElement& x )
 
4159
    : QDomNode( x )
 
4160
{
 
4161
}
 
4162
 
 
4163
QDomElement::QDomElement( QDomElementPrivate* n )
 
4164
    : QDomNode( n )
 
4165
{
 
4166
}
 
4167
 
 
4168
/*!
 
4169
    Assigns \a x to this DOM element.
 
4170
 
 
4171
    The data of the copy is shared (shallow copy): modifying one node
 
4172
    will also change the other. If you want to make a deep copy, use
 
4173
    cloneNode().
 
4174
*/
 
4175
QDomElement& QDomElement::operator= ( const QDomElement& x )
 
4176
{
 
4177
    return (QDomElement&) QDomNode::operator=( x );
 
4178
}
 
4179
 
 
4180
/*!
 
4181
    Destroys the object and frees its resources.
 
4182
*/
 
4183
QDomElement::~QDomElement()
 
4184
{
 
4185
}
 
4186
 
 
4187
/*!
 
4188
    Returns \c ElementNode.
 
4189
*/
 
4190
QDomNode::NodeType QDomElement::nodeType() const
 
4191
{
 
4192
    return ElementNode;
 
4193
}
 
4194
 
 
4195
/*!
 
4196
    Sets this element's tag name to \a name.
 
4197
 
 
4198
    \sa tagName()
 
4199
*/
 
4200
void QDomElement::setTagName( const QString& name )
 
4201
{
 
4202
    if ( impl )
 
4203
        impl->name = name;
 
4204
}
 
4205
 
 
4206
/*!
 
4207
    Returns the tag name of this element. For an XML element like this:
 
4208
    \code
 
4209
    <img src="myimg.png">
 
4210
    \endcode
 
4211
    the tagname would return "img".
 
4212
 
 
4213
    \sa setTagName()
 
4214
*/
 
4215
QString QDomElement::tagName() const
 
4216
{
 
4217
    if ( !impl )
 
4218
        return QString::null;
 
4219
    return impl->nodeName();
 
4220
}
 
4221
 
 
4222
/*!
 
4223
    Returns the attribute called \a name. If the attribute does not
 
4224
    exist \a defValue is returned.
 
4225
 
 
4226
    \sa setAttribute() attributeNode() setAttributeNode() attributeNS()
 
4227
*/
 
4228
QString QDomElement::attribute( const QString& name,  const QString& defValue ) const
 
4229
{
 
4230
    if ( !impl )
 
4231
        return defValue;
 
4232
    return IMPL->attribute( name, defValue );
 
4233
}
 
4234
 
 
4235
/*!
 
4236
    Adds an attribute called \a name with value \a value. If an
 
4237
    attribute with the same name exists, its value is replaced by \a
 
4238
    value.
 
4239
 
 
4240
    \sa attribute() setAttributeNode() setAttributeNS()
 
4241
*/
 
4242
void QDomElement::setAttribute( const QString& name, const QString& value )
 
4243
{
 
4244
    if ( !impl )
 
4245
        return;
 
4246
    IMPL->setAttribute( name, value );
 
4247
}
 
4248
 
 
4249
/*!
 
4250
    \overload
 
4251
*/
 
4252
void QDomElement::setAttribute( const QString& name, int value )
 
4253
{
 
4254
    // ### 4.0: inline
 
4255
    setAttribute( name, long(value) );
 
4256
}
 
4257
 
 
4258
/*!
 
4259
    \overload
 
4260
*/
 
4261
void QDomElement::setAttribute( const QString& name, uint value )
 
4262
{
 
4263
    // ### 4.0: inline
 
4264
    setAttribute( name, ulong(value) );
 
4265
}
 
4266
 
 
4267
/*!
 
4268
    \overload
 
4269
*/
 
4270
void QDomElement::setAttribute( const QString& name, long value )
 
4271
{
 
4272
    if ( !impl )
 
4273
        return;
 
4274
    QString x;
 
4275
    x.setNum( value );
 
4276
    IMPL->setAttribute( name, x );
 
4277
}
 
4278
 
 
4279
/*!
 
4280
    \overload
 
4281
*/
 
4282
void QDomElement::setAttribute( const QString& name, ulong value )
 
4283
{
 
4284
    if ( !impl )
 
4285
        return;
 
4286
    QString x;
 
4287
    x.setNum( value );
 
4288
    IMPL->setAttribute( name, x );
 
4289
}
 
4290
 
 
4291
/*!
 
4292
    \overload
 
4293
*/
 
4294
void QDomElement::setAttribute( const QString& name, double value )
 
4295
{
 
4296
    if ( !impl )
 
4297
        return;
 
4298
    QString x;
 
4299
    x.setNum( value );
 
4300
    IMPL->setAttribute( name, x );
 
4301
}
 
4302
 
 
4303
/*!
 
4304
    Removes the attribute called name \a name from this element.
 
4305
 
 
4306
    \sa setAttribute() attribute() removeAttributeNS()
 
4307
*/
 
4308
void QDomElement::removeAttribute( const QString& name )
 
4309
{
 
4310
    if ( !impl )
 
4311
        return;
 
4312
    IMPL->removeAttribute( name );
 
4313
}
 
4314
 
 
4315
/*!
 
4316
    Returns the QDomAttr object that corresponds to the attribute
 
4317
    called \a name. If no such attribute exists a \link
 
4318
    QDomNode::isNull() null attribute\endlink is returned.
 
4319
 
 
4320
    \sa setAttributeNode() attribute() setAttribute() attributeNodeNS()
 
4321
*/
 
4322
QDomAttr QDomElement::attributeNode( const QString& name)
 
4323
{
 
4324
    if ( !impl )
 
4325
        return QDomAttr();
 
4326
    return QDomAttr( IMPL->attributeNode( name ) );
 
4327
}
 
4328
 
 
4329
/*!
 
4330
    Adds the attribute \a newAttr to this element.
 
4331
 
 
4332
    If the element has another attribute that has the same name as \a
 
4333
    newAttr, this function replaces that attribute and returns it;
 
4334
    otherwise the function returns a \link QDomNode::isNull() null
 
4335
    attribute\endlink.
 
4336
 
 
4337
    \sa attributeNode() setAttribute() setAttributeNodeNS()
 
4338
*/
 
4339
QDomAttr QDomElement::setAttributeNode( const QDomAttr& newAttr )
 
4340
{
 
4341
    if ( !impl )
 
4342
        return QDomAttr();
 
4343
    return QDomAttr( IMPL->setAttributeNode( ((QDomAttrPrivate*)newAttr.impl) ) );
 
4344
}
 
4345
 
 
4346
/*!
 
4347
    Removes the attribute \a oldAttr from the element and returns it.
 
4348
 
 
4349
    \sa attributeNode() setAttributeNode()
 
4350
*/
 
4351
QDomAttr QDomElement::removeAttributeNode( const QDomAttr& oldAttr )
 
4352
{
 
4353
    if ( !impl )
 
4354
        return QDomAttr(); // ### should this return oldAttr?
 
4355
    return QDomAttr( IMPL->removeAttributeNode( ((QDomAttrPrivate*)oldAttr.impl) ) );
 
4356
}
 
4357
 
 
4358
/*!
 
4359
    Returns a QDomNodeList containing all descendent elements of this
 
4360
    element that are called \a tagname. The order they are in the node
 
4361
    list is the order they are encountered in a preorder traversal of
 
4362
    the element tree.
 
4363
 
 
4364
    \sa elementsByTagNameNS() QDomDocument::elementsByTagName()
 
4365
*/
 
4366
QDomNodeList QDomElement::elementsByTagName( const QString& tagname ) const
 
4367
{
 
4368
    return QDomNodeList( new QDomNodeListPrivate( impl, tagname ) );
 
4369
}
 
4370
 
 
4371
/*!
 
4372
    Returns TRUE.
 
4373
*/
 
4374
bool QDomElement::isElement() const
 
4375
{
 
4376
    return TRUE;
 
4377
}
 
4378
 
 
4379
/*!
 
4380
    Returns a QDomNamedNodeMap containing all this element's attributes.
 
4381
 
 
4382
    \sa attribute() setAttribute() attributeNode() setAttributeNode()
 
4383
*/
 
4384
QDomNamedNodeMap QDomElement::attributes() const
 
4385
{
 
4386
    if ( !impl )
 
4387
        return QDomNamedNodeMap();
 
4388
    return QDomNamedNodeMap( IMPL->attributes() );
 
4389
}
 
4390
 
 
4391
/*!
 
4392
    Returns TRUE if this element has an attribute called \a name;
 
4393
    otherwise returns FALSE.
 
4394
*/
 
4395
bool QDomElement::hasAttribute( const QString& name ) const
 
4396
{
 
4397
    if ( !impl )
 
4398
        return FALSE;
 
4399
    return IMPL->hasAttribute( name );
 
4400
}
 
4401
 
 
4402
/*!
 
4403
    Returns the attribute with the local name \a localName and the
 
4404
    namespace URI \a nsURI. If the attribute does not exist \a
 
4405
    defValue is returned.
 
4406
 
 
4407
    \sa setAttributeNS() attributeNodeNS() setAttributeNodeNS() attribute()
 
4408
*/
 
4409
QString QDomElement::attributeNS( const QString nsURI, const QString& localName, const QString& defValue ) const
 
4410
{
 
4411
    if ( !impl )
 
4412
        return defValue;
 
4413
    return IMPL->attributeNS( nsURI, localName, defValue );
 
4414
}
 
4415
 
 
4416
/*!
 
4417
    Adds an attribute with the qualified name \a qName and the
 
4418
    namespace URI \a nsURI with the value \a value. If an attribute
 
4419
    with the same local name and namespace URI exists, its prefix is
 
4420
    replaced by the prefix of \a qName and its value is repaced by \a
 
4421
    value.
 
4422
 
 
4423
    Although \a qName is the qualified name, the local name is used to
 
4424
    decide if an existing attribute's value should be replaced.
 
4425
 
 
4426
    \sa attributeNS() setAttributeNodeNS() setAttribute()
 
4427
*/
 
4428
void QDomElement::setAttributeNS( const QString nsURI, const QString& qName, const QString& value )
 
4429
{
 
4430
    if ( !impl )
 
4431
        return;
 
4432
    IMPL->setAttributeNS( nsURI, qName, value );
 
4433
}
 
4434
 
 
4435
/*!
 
4436
    \overload
 
4437
*/
 
4438
void QDomElement::setAttributeNS( const QString nsURI, const QString& qName, int value )
 
4439
{
 
4440
    // ### 4.0: inline
 
4441
    setAttributeNS( nsURI, qName, long(value) );
 
4442
}
 
4443
 
 
4444
/*!
 
4445
    \overload
 
4446
*/
 
4447
void QDomElement::setAttributeNS( const QString nsURI, const QString& qName, uint value )
 
4448
{
 
4449
    // ### 4.0: inline
 
4450
    setAttributeNS( nsURI, qName, ulong(value) );
 
4451
}
 
4452
 
 
4453
/*!
 
4454
    \overload
 
4455
*/
 
4456
void QDomElement::setAttributeNS( const QString nsURI, const QString& qName, long value )
 
4457
{
 
4458
    if ( !impl )
 
4459
        return;
 
4460
    QString x;
 
4461
    x.setNum( value );
 
4462
    IMPL->setAttributeNS( nsURI, qName, x );
 
4463
}
 
4464
 
 
4465
/*!
 
4466
    \overload
 
4467
*/
 
4468
void QDomElement::setAttributeNS( const QString nsURI, const QString& qName, ulong value )
 
4469
{
 
4470
    if ( !impl )
 
4471
        return;
 
4472
    QString x;
 
4473
    x.setNum( value );
 
4474
    IMPL->setAttributeNS( nsURI, qName, x );
 
4475
}
 
4476
 
 
4477
/*!
 
4478
    \overload
 
4479
*/
 
4480
void QDomElement::setAttributeNS( const QString nsURI, const QString& qName, double value )
 
4481
{
 
4482
    if ( !impl )
 
4483
        return;
 
4484
    QString x;
 
4485
    x.setNum( value );
 
4486
    IMPL->setAttributeNS( nsURI, qName, x );
 
4487
}
 
4488
 
 
4489
/*!
 
4490
    Removes the attribute with the local name \a localName and the
 
4491
    namespace URI \a nsURI from this element.
 
4492
 
 
4493
    \sa setAttributeNS() attributeNS() removeAttribute()
 
4494
*/
 
4495
void QDomElement::removeAttributeNS( const QString& nsURI, const QString& localName )
 
4496
{
 
4497
    if ( !impl )
 
4498
        return;
 
4499
    QDomNodePrivate *n = IMPL->attributeNodeNS( nsURI, localName );
 
4500
    if ( !n )
 
4501
        return;
 
4502
    IMPL->removeAttribute( n->nodeName() );
 
4503
}
 
4504
 
 
4505
/*!
 
4506
    Returns the QDomAttr object that corresponds to the attribute with
 
4507
    the local name \a localName and the namespace URI \a nsURI. If no
 
4508
    such attribute exists a \link QDomNode::isNull() null
 
4509
    attribute\endlink is returned.
 
4510
 
 
4511
    \sa setAttributeNode() attribute() setAttribute() attributeNodeNS()
 
4512
*/
 
4513
QDomAttr QDomElement::attributeNodeNS( const QString& nsURI, const QString& localName )
 
4514
{
 
4515
    if ( !impl )
 
4516
        return QDomAttr();
 
4517
    return QDomAttr( IMPL->attributeNodeNS( nsURI, localName ) );
 
4518
}
 
4519
 
 
4520
/*!
 
4521
    Adds the attribute \a newAttr to this element.
 
4522
 
 
4523
    If the element has another attribute that has the same local name
 
4524
    and namespace URI as \a newAttr, this function replaces that
 
4525
    attribute and returns it; otherwise the function returns a \link
 
4526
    QDomNode::isNull() null attribute\endlink.
 
4527
 
 
4528
    \sa attributeNodeNS() setAttributeNS() setAttributeNode()
 
4529
*/
 
4530
QDomAttr QDomElement::setAttributeNodeNS( const QDomAttr& newAttr )
 
4531
{
 
4532
    if ( !impl )
 
4533
        return QDomAttr();
 
4534
    return QDomAttr( IMPL->setAttributeNodeNS( ((QDomAttrPrivate*)newAttr.impl) ) );
 
4535
}
 
4536
 
 
4537
/*!
 
4538
    Returns a QDomNodeList containing all the descendent elements of
 
4539
    this element with the local name \a localName and the namespace
 
4540
    URI \a nsURI. The order they are in the node list is the order
 
4541
    they are encountered in a preorder traversal of the element tree.
 
4542
 
 
4543
    \sa elementsByTagName() QDomDocument::elementsByTagNameNS()
 
4544
*/
 
4545
QDomNodeList QDomElement::elementsByTagNameNS( const QString& nsURI, const QString& localName ) const
 
4546
{
 
4547
    return QDomNodeList( new QDomNodeListPrivate( impl, nsURI, localName ) );
 
4548
}
 
4549
 
 
4550
/*!
 
4551
    Returns TRUE if this element has an attribute with the local name
 
4552
    \a localName and the namespace URI \a nsURI; otherwise returns
 
4553
    FALSE.
 
4554
*/
 
4555
bool QDomElement::hasAttributeNS( const QString& nsURI, const QString& localName ) const
 
4556
{
 
4557
    if ( !impl )
 
4558
        return FALSE;
 
4559
    return IMPL->hasAttributeNS( nsURI, localName );
 
4560
}
 
4561
 
 
4562
/*!
 
4563
    Returns the element's text or QString::null.
 
4564
 
 
4565
    Example:
 
4566
    \code
 
4567
    <h1>Hello <b>Qt</b> <![CDATA[<xml is cool>]]></h1>
 
4568
    \endcode
 
4569
 
 
4570
    The function text() of the QDomElement for the &lt;h1&gt; tag,
 
4571
    will return "Hello Qt &lt;xml is cool&gt;".
 
4572
 
 
4573
    Comments are ignored by this function. It only evaluates QDomText
 
4574
    and QDomCDATASection objects.
 
4575
*/
 
4576
QString QDomElement::text() const
 
4577
{
 
4578
    if ( !impl )
 
4579
        return QString::null;
 
4580
    return IMPL->text();
 
4581
}
 
4582
 
 
4583
#undef IMPL
 
4584
 
 
4585
/**************************************************************
 
4586
 *
 
4587
 * QDomTextPrivate
 
4588
 *
 
4589
 **************************************************************/
 
4590
 
 
4591
QDomTextPrivate::QDomTextPrivate( QDomDocumentPrivate* d, QDomNodePrivate* parent, const QString& value )
 
4592
    : QDomCharacterDataPrivate( d, parent, value )
 
4593
{
 
4594
    name = "#text";
 
4595
}
 
4596
 
 
4597
QDomTextPrivate::QDomTextPrivate( QDomTextPrivate* n, bool deep )
 
4598
    : QDomCharacterDataPrivate( n, deep )
 
4599
{
 
4600
}
 
4601
 
 
4602
QDomTextPrivate::~QDomTextPrivate()
 
4603
{
 
4604
}
 
4605
 
 
4606
QDomNodePrivate* QDomTextPrivate::cloneNode( bool deep)
 
4607
{
 
4608
    QDomNodePrivate* p = new QDomTextPrivate( this, deep );
 
4609
    // We are not interested in this node
 
4610
    p->deref();
 
4611
    return p;
 
4612
}
 
4613
 
 
4614
QDomTextPrivate* QDomTextPrivate::splitText( int offset )
 
4615
{
 
4616
    if ( !parent() ) {
 
4617
        qWarning( "QDomText::splitText  The node has no parent. So I can not split" );
 
4618
        return 0;
 
4619
    }
 
4620
 
 
4621
    QDomTextPrivate* t = new QDomTextPrivate( ownerDocument(), 0, value.mid( offset ) );
 
4622
    value.truncate( offset );
 
4623
 
 
4624
    parent()->insertAfter( t, this );
 
4625
 
 
4626
    return t;
 
4627
}
 
4628
 
 
4629
void QDomTextPrivate::save( QTextStream& s, int, int ) const
 
4630
{
 
4631
    s << encodeAttr( value );
 
4632
}
 
4633
 
 
4634
/**************************************************************
 
4635
 *
 
4636
 * QDomText
 
4637
 *
 
4638
 **************************************************************/
 
4639
 
 
4640
#define IMPL ((QDomTextPrivate*)impl)
 
4641
 
 
4642
/*!
 
4643
    \class QDomText qdom.h
 
4644
    \reentrant
 
4645
    \brief The QDomText class represents text data in the parsed XML document.
 
4646
\if defined(commercial)
 
4647
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
4648
\endif
 
4649
 
 
4650
    \module XML
 
4651
    \ingroup xml-tools
 
4652
 
 
4653
    You can split the text in a QDomText object over two QDomText
 
4654
    objecs with splitText().
 
4655
 
 
4656
    For further information about the Document Object Model see
 
4657
    \link http://www.w3.org/TR/REC-DOM-Level-1/\endlink and
 
4658
    \link http://www.w3.org/TR/DOM-Level-2-Core/\endlink.
 
4659
    For a more general introduction of the DOM implementation see the
 
4660
    QDomDocument documentation.
 
4661
*/
 
4662
 
 
4663
/*!
 
4664
    Constructs an empty QDomText object.
 
4665
 
 
4666
    To construct a QDomText with content, use QDomDocument::createTextNode().
 
4667
*/
 
4668
QDomText::QDomText()
 
4669
    : QDomCharacterData()
 
4670
{
 
4671
}
 
4672
 
 
4673
/*!
 
4674
    Constructs a copy of \a x.
 
4675
 
 
4676
    The data of the copy is shared (shallow copy): modifying one node
 
4677
    will also change the other. If you want to make a deep copy, use
 
4678
    cloneNode().
 
4679
*/
 
4680
QDomText::QDomText( const QDomText& x )
 
4681
    : QDomCharacterData( x )
 
4682
{
 
4683
}
 
4684
 
 
4685
QDomText::QDomText( QDomTextPrivate* n )
 
4686
    : QDomCharacterData( n )
 
4687
{
 
4688
}
 
4689
 
 
4690
/*!
 
4691
    Assigns \a x to this DOM text.
 
4692
 
 
4693
    The data of the copy is shared (shallow copy): modifying one node
 
4694
    will also change the other. If you want to make a deep copy, use
 
4695
    cloneNode().
 
4696
*/
 
4697
QDomText& QDomText::operator= ( const QDomText& x )
 
4698
{
 
4699
    return (QDomText&) QDomNode::operator=( x );
 
4700
}
 
4701
 
 
4702
/*!
 
4703
    Destroys the object and frees its resources.
 
4704
*/
 
4705
QDomText::~QDomText()
 
4706
{
 
4707
}
 
4708
 
 
4709
/*!
 
4710
    Returns \c TextNode.
 
4711
*/
 
4712
QDomNode::NodeType QDomText::nodeType() const
 
4713
{
 
4714
    return TextNode;
 
4715
}
 
4716
 
 
4717
/*!
 
4718
    Splits this DOM text object into two QDomText objects. This object
 
4719
    keeps its first \a offset characters and the second (newly
 
4720
    created) object is inserted into the document tree after this
 
4721
    object with the remaining characters.
 
4722
 
 
4723
    The function returns the newly created object.
 
4724
 
 
4725
    \sa QDomNode::normalize()
 
4726
*/
 
4727
QDomText QDomText::splitText( int offset )
 
4728
{
 
4729
    if ( !impl )
 
4730
        return QDomText();
 
4731
    return QDomText( IMPL->splitText( offset ) );
 
4732
}
 
4733
 
 
4734
/*!
 
4735
    Returns TRUE.
 
4736
*/
 
4737
bool QDomText::isText() const
 
4738
{
 
4739
    return TRUE;
 
4740
}
 
4741
 
 
4742
#undef IMPL
 
4743
 
 
4744
/**************************************************************
 
4745
 *
 
4746
 * QDomCommentPrivate
 
4747
 *
 
4748
 **************************************************************/
 
4749
 
 
4750
QDomCommentPrivate::QDomCommentPrivate( QDomDocumentPrivate* d, QDomNodePrivate* parent, const QString& value )
 
4751
    : QDomCharacterDataPrivate( d, parent, value )
 
4752
{
 
4753
    name = "#comment";
 
4754
}
 
4755
 
 
4756
QDomCommentPrivate::QDomCommentPrivate( QDomCommentPrivate* n, bool deep )
 
4757
    : QDomCharacterDataPrivate( n, deep )
 
4758
{
 
4759
}
 
4760
 
 
4761
QDomCommentPrivate::~QDomCommentPrivate()
 
4762
{
 
4763
}
 
4764
 
 
4765
QDomNodePrivate* QDomCommentPrivate::cloneNode( bool deep)
 
4766
{
 
4767
    QDomNodePrivate* p = new QDomCommentPrivate( this, deep );
 
4768
    // We are not interested in this node
 
4769
    p->deref();
 
4770
    return p;
 
4771
}
 
4772
 
 
4773
void QDomCommentPrivate::save( QTextStream& s, int, int ) const
 
4774
{
 
4775
    s << "<!--" << value << "-->";
 
4776
}
 
4777
 
 
4778
/**************************************************************
 
4779
 *
 
4780
 * QDomComment
 
4781
 *
 
4782
 **************************************************************/
 
4783
 
 
4784
#define IMPL ((QDomCommentPrivate*)impl)
 
4785
 
 
4786
/*!
 
4787
    \class QDomComment qdom.h
 
4788
    \reentrant
 
4789
    \brief The QDomComment class represents an XML comment.
 
4790
\if defined(commercial)
 
4791
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
4792
\endif
 
4793
 
 
4794
    \module XML
 
4795
    \ingroup xml-tools
 
4796
 
 
4797
    A comment in the parsed XML such as this:
 
4798
    \code
 
4799
    <!-- this is a comment -->
 
4800
    \endcode
 
4801
    is represented by QDomComment objects in the parsed Dom tree.
 
4802
 
 
4803
    For further information about the Document Object Model see
 
4804
    \link http://www.w3.org/TR/REC-DOM-Level-1/\endlink and
 
4805
    \link http://www.w3.org/TR/DOM-Level-2-Core/\endlink.
 
4806
    For a more general introduction of the DOM implementation see the
 
4807
    QDomDocument documentation.
 
4808
*/
 
4809
 
 
4810
/*!
 
4811
    Constructs an empty comment. To construct a comment with content,
 
4812
    use the QDomDocument::createComment() function.
 
4813
*/
 
4814
QDomComment::QDomComment()
 
4815
    : QDomCharacterData()
 
4816
{
 
4817
}
 
4818
 
 
4819
/*!
 
4820
    Constructs a copy of \a x.
 
4821
 
 
4822
    The data of the copy is shared (shallow copy): modifying one node
 
4823
    will also change the other. If you want to make a deep copy, use
 
4824
    cloneNode().
 
4825
*/
 
4826
QDomComment::QDomComment( const QDomComment& x )
 
4827
    : QDomCharacterData( x )
 
4828
{
 
4829
}
 
4830
 
 
4831
QDomComment::QDomComment( QDomCommentPrivate* n )
 
4832
    : QDomCharacterData( n )
 
4833
{
 
4834
}
 
4835
 
 
4836
/*!
 
4837
    Assigns \a x to this DOM comment.
 
4838
 
 
4839
    The data of the copy is shared (shallow copy): modifying one node
 
4840
    will also change the other. If you want to make a deep copy, use
 
4841
    cloneNode().
 
4842
*/
 
4843
QDomComment& QDomComment::operator= ( const QDomComment& x )
 
4844
{
 
4845
    return (QDomComment&) QDomNode::operator=( x );
 
4846
}
 
4847
 
 
4848
/*!
 
4849
    Destroys the object and frees its resources.
 
4850
*/
 
4851
QDomComment::~QDomComment()
 
4852
{
 
4853
}
 
4854
 
 
4855
/*!
 
4856
    Returns \c CommentNode.
 
4857
*/
 
4858
QDomNode::NodeType QDomComment::nodeType() const
 
4859
{
 
4860
    return CommentNode;
 
4861
}
 
4862
 
 
4863
/*!
 
4864
    Returns TRUE.
 
4865
*/
 
4866
bool QDomComment::isComment() const
 
4867
{
 
4868
    return TRUE;
 
4869
}
 
4870
 
 
4871
#undef IMPL
 
4872
 
 
4873
/**************************************************************
 
4874
 *
 
4875
 * QDomCDATASectionPrivate
 
4876
 *
 
4877
 **************************************************************/
 
4878
 
 
4879
QDomCDATASectionPrivate::QDomCDATASectionPrivate( QDomDocumentPrivate* d, QDomNodePrivate* parent,
 
4880
                                                    const QString& value )
 
4881
    : QDomTextPrivate( d, parent, value )
 
4882
{
 
4883
    name = "#cdata-section";
 
4884
}
 
4885
 
 
4886
QDomCDATASectionPrivate::QDomCDATASectionPrivate( QDomCDATASectionPrivate* n, bool deep )
 
4887
    : QDomTextPrivate( n, deep )
 
4888
{
 
4889
}
 
4890
 
 
4891
QDomCDATASectionPrivate::~QDomCDATASectionPrivate()
 
4892
{
 
4893
}
 
4894
 
 
4895
QDomNodePrivate* QDomCDATASectionPrivate::cloneNode( bool deep)
 
4896
{
 
4897
    QDomNodePrivate* p = new QDomCDATASectionPrivate( this, deep );
 
4898
    // We are not interested in this node
 
4899
    p->deref();
 
4900
    return p;
 
4901
}
 
4902
 
 
4903
void QDomCDATASectionPrivate::save( QTextStream& s, int, int ) const
 
4904
{
 
4905
    // ### How do we escape "]]>" ?
 
4906
    // "]]>" is not allowed; so there should be none in value anyway
 
4907
    s << "<![CDATA[" << value << "]]>";
 
4908
}
 
4909
 
 
4910
/**************************************************************
 
4911
 *
 
4912
 * QDomCDATASection
 
4913
 *
 
4914
 **************************************************************/
 
4915
 
 
4916
#define IMPL ((QDomCDATASectionPrivate*)impl)
 
4917
 
 
4918
/*!
 
4919
    \class QDomCDATASection qdom.h
 
4920
    \reentrant
 
4921
    \brief The QDomCDATASection class represents an XML CDATA section.
 
4922
\if defined(commercial)
 
4923
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
4924
\endif
 
4925
 
 
4926
    \module XML
 
4927
    \ingroup xml-tools
 
4928
 
 
4929
    CDATA sections are used to escape blocks of text containing
 
4930
    characters that would otherwise be regarded as markup. The only
 
4931
    delimiter that is recognized in a CDATA section is the "]]&gt;"
 
4932
    string that terminates the CDATA section. CDATA sections cannot be
 
4933
    nested. Their primary purpose is for including material such as
 
4934
    XML fragments, without needing to escape all the delimiters.
 
4935
 
 
4936
    Adjacent QDomCDATASection nodes are not merged by the
 
4937
    QDomNode::normalize() function.
 
4938
 
 
4939
    For further information about the Document Object Model see
 
4940
    \link http://www.w3.org/TR/REC-DOM-Level-1/\endlink and
 
4941
    \link http://www.w3.org/TR/DOM-Level-2-Core/\endlink.
 
4942
    For a more general introduction of the DOM implementation see the
 
4943
    QDomDocument documentation.
 
4944
*/
 
4945
 
 
4946
/*!
 
4947
    Constructs an empty CDATA section. To create a CDATA section with
 
4948
    content, use the QDomDocument::createCDATASection() function.
 
4949
*/
 
4950
QDomCDATASection::QDomCDATASection()
 
4951
    : QDomText()
 
4952
{
 
4953
}
 
4954
 
 
4955
/*!
 
4956
    Constructs a copy of \a x.
 
4957
 
 
4958
    The data of the copy is shared (shallow copy): modifying one node
 
4959
    will also change the other. If you want to make a deep copy, use
 
4960
    cloneNode().
 
4961
*/
 
4962
QDomCDATASection::QDomCDATASection( const QDomCDATASection& x )
 
4963
    : QDomText( x )
 
4964
{
 
4965
}
 
4966
 
 
4967
QDomCDATASection::QDomCDATASection( QDomCDATASectionPrivate* n )
 
4968
    : QDomText( n )
 
4969
{
 
4970
}
 
4971
 
 
4972
/*!
 
4973
    Assigns \a x to this CDATA section.
 
4974
 
 
4975
    The data of the copy is shared (shallow copy): modifying one node
 
4976
    will also change the other. If you want to make a deep copy, use
 
4977
    cloneNode().
 
4978
*/
 
4979
QDomCDATASection& QDomCDATASection::operator= ( const QDomCDATASection& x )
 
4980
{
 
4981
    return (QDomCDATASection&) QDomNode::operator=( x );
 
4982
}
 
4983
 
 
4984
/*!
 
4985
    Destroys the object and frees its resources.
 
4986
*/
 
4987
QDomCDATASection::~QDomCDATASection()
 
4988
{
 
4989
}
 
4990
 
 
4991
/*!
 
4992
    Returns \c CDATASection.
 
4993
*/
 
4994
QDomNode::NodeType QDomCDATASection::nodeType() const
 
4995
{
 
4996
    return CDATASectionNode;
 
4997
}
 
4998
 
 
4999
/*!
 
5000
    Returns TRUE.
 
5001
*/
 
5002
bool QDomCDATASection::isCDATASection() const
 
5003
{
 
5004
    return TRUE;
 
5005
}
 
5006
 
 
5007
#undef IMPL
 
5008
 
 
5009
/**************************************************************
 
5010
 *
 
5011
 * QDomNotationPrivate
 
5012
 *
 
5013
 **************************************************************/
 
5014
 
 
5015
QDomNotationPrivate::QDomNotationPrivate( QDomDocumentPrivate* d, QDomNodePrivate* parent,
 
5016
                                            const QString& aname,
 
5017
                                            const QString& pub, const QString& sys )
 
5018
    : QDomNodePrivate( d, parent )
 
5019
{
 
5020
    name = aname;
 
5021
    m_pub = pub;
 
5022
    m_sys = sys;
 
5023
}
 
5024
 
 
5025
QDomNotationPrivate::QDomNotationPrivate( QDomNotationPrivate* n, bool deep )
 
5026
    : QDomNodePrivate( n, deep )
 
5027
{
 
5028
    m_sys = n->m_sys;
 
5029
    m_pub = n->m_pub;
 
5030
}
 
5031
 
 
5032
QDomNotationPrivate::~QDomNotationPrivate()
 
5033
{
 
5034
}
 
5035
 
 
5036
QDomNodePrivate* QDomNotationPrivate::cloneNode( bool deep)
 
5037
{
 
5038
    QDomNodePrivate* p = new QDomNotationPrivate( this, deep );
 
5039
    // We are not interested in this node
 
5040
    p->deref();
 
5041
    return p;
 
5042
}
 
5043
 
 
5044
void QDomNotationPrivate::save( QTextStream& s, int, int ) const
 
5045
{
 
5046
    s << "<!NOTATION " << name << " ";
 
5047
    if ( !m_pub.isNull() )  {
 
5048
        s << "PUBLIC \"" << m_pub << "\"";
 
5049
        if ( !m_sys.isNull() )
 
5050
            s << " \"" << m_sys << "\"";
 
5051
    }  else {
 
5052
        s << "SYSTEM \"" << m_sys << "\"";
 
5053
    }
 
5054
    s << ">" << endl;
 
5055
}
 
5056
 
 
5057
/**************************************************************
 
5058
 *
 
5059
 * QDomNotation
 
5060
 *
 
5061
 **************************************************************/
 
5062
 
 
5063
#define IMPL ((QDomNotationPrivate*)impl)
 
5064
 
 
5065
/*!
 
5066
    \class QDomNotation qdom.h
 
5067
    \reentrant
 
5068
    \brief The QDomNotation class represents an XML notation.
 
5069
\if defined(commercial)
 
5070
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
5071
\endif
 
5072
 
 
5073
    \module XML
 
5074
    \ingroup xml-tools
 
5075
 
 
5076
    A notation either declares, by name, the format of an unparsed
 
5077
    entity (see section 4.7 of the XML 1.0 specification), or is used
 
5078
    for formal declaration of processing instruction targets (see
 
5079
    section 2.6 of the XML 1.0 specification).
 
5080
 
 
5081
    DOM does not support editing notation nodes; they are therefore
 
5082
    read-only.
 
5083
 
 
5084
    A notation node does not have any parent.
 
5085
 
 
5086
    You can retrieve the publicId() and systemId() from a notation
 
5087
    node.
 
5088
 
 
5089
    For further information about the Document Object Model see
 
5090
    \link http://www.w3.org/TR/REC-DOM-Level-1/\endlink and
 
5091
    \link http://www.w3.org/TR/DOM-Level-2-Core/\endlink.
 
5092
    For a more general introduction of the DOM implementation see the
 
5093
    QDomDocument documentation.
 
5094
*/
 
5095
 
 
5096
 
 
5097
/*!
 
5098
    Constructor.
 
5099
*/
 
5100
QDomNotation::QDomNotation()
 
5101
    : QDomNode()
 
5102
{
 
5103
}
 
5104
 
 
5105
/*!
 
5106
    Constructs a copy of \a x.
 
5107
 
 
5108
    The data of the copy is shared (shallow copy): modifying one node
 
5109
    will also change the other. If you want to make a deep copy, use
 
5110
    cloneNode().
 
5111
*/
 
5112
QDomNotation::QDomNotation( const QDomNotation& x )
 
5113
    : QDomNode( x )
 
5114
{
 
5115
}
 
5116
 
 
5117
QDomNotation::QDomNotation( QDomNotationPrivate* n )
 
5118
    : QDomNode( n )
 
5119
{
 
5120
}
 
5121
 
 
5122
/*!
 
5123
    Assigns \a x to this DOM notation.
 
5124
 
 
5125
    The data of the copy is shared (shallow copy): modifying one node
 
5126
    will also change the other. If you want to make a deep copy, use
 
5127
    cloneNode().
 
5128
*/
 
5129
QDomNotation& QDomNotation::operator= ( const QDomNotation& x )
 
5130
{
 
5131
    return (QDomNotation&) QDomNode::operator=( x );
 
5132
}
 
5133
 
 
5134
/*!
 
5135
    Destroys the object and frees its resources.
 
5136
*/
 
5137
QDomNotation::~QDomNotation()
 
5138
{
 
5139
}
 
5140
 
 
5141
/*!
 
5142
    Returns \c NotationNode.
 
5143
*/
 
5144
QDomNode::NodeType QDomNotation::nodeType() const
 
5145
{
 
5146
    return NotationNode;
 
5147
}
 
5148
 
 
5149
/*!
 
5150
    Returns the public identifier of this notation.
 
5151
*/
 
5152
QString QDomNotation::publicId() const
 
5153
{
 
5154
    if ( !impl )
 
5155
        return QString::null;
 
5156
    return IMPL->m_pub;
 
5157
}
 
5158
 
 
5159
/*!
 
5160
    Returns the system identifier of this notation.
 
5161
*/
 
5162
QString QDomNotation::systemId() const
 
5163
{
 
5164
    if ( !impl )
 
5165
        return QString::null;
 
5166
    return IMPL->m_sys;
 
5167
}
 
5168
 
 
5169
/*!
 
5170
    Returns TRUE.
 
5171
*/
 
5172
bool QDomNotation::isNotation() const
 
5173
{
 
5174
    return TRUE;
 
5175
}
 
5176
 
 
5177
#undef IMPL
 
5178
 
 
5179
/**************************************************************
 
5180
 *
 
5181
 * QDomEntityPrivate
 
5182
 *
 
5183
 **************************************************************/
 
5184
 
 
5185
QDomEntityPrivate::QDomEntityPrivate( QDomDocumentPrivate* d, QDomNodePrivate* parent,
 
5186
                                        const QString& aname,
 
5187
                                        const QString& pub, const QString& sys, const QString& notation )
 
5188
    : QDomNodePrivate( d, parent )
 
5189
{
 
5190
    name = aname;
 
5191
    m_pub = pub;
 
5192
    m_sys = sys;
 
5193
    m_notationName = notation;
 
5194
}
 
5195
 
 
5196
QDomEntityPrivate::QDomEntityPrivate( QDomEntityPrivate* n, bool deep )
 
5197
    : QDomNodePrivate( n, deep )
 
5198
{
 
5199
    m_sys = n->m_sys;
 
5200
    m_pub = n->m_pub;
 
5201
    m_notationName = n->m_notationName;
 
5202
}
 
5203
 
 
5204
QDomEntityPrivate::~QDomEntityPrivate()
 
5205
{
 
5206
}
 
5207
 
 
5208
QDomNodePrivate* QDomEntityPrivate::cloneNode( bool deep)
 
5209
{
 
5210
    QDomNodePrivate* p = new QDomEntityPrivate( this, deep );
 
5211
    // We are not interested in this node
 
5212
    p->deref();
 
5213
    return p;
 
5214
}
 
5215
 
 
5216
/*
 
5217
  Encode an entity value upon saving.
 
5218
*/
 
5219
static QCString encodeEntity( const QCString& str )
 
5220
{
 
5221
    QCString tmp( str );
 
5222
    uint len = tmp.length();
 
5223
    uint i = 0;
 
5224
    const char* d = tmp.data();
 
5225
    while ( i < len ) {
 
5226
        if ( d[i] == '%' ){
 
5227
            tmp.replace( i, 1, "&#60;" );
 
5228
            d = tmp.data();
 
5229
            len += 4;
 
5230
            i += 5;
 
5231
        }
 
5232
        else if ( d[i] == '"' ) {
 
5233
            tmp.replace( i, 1, "&#34;" );
 
5234
            d = tmp.data();
 
5235
            len += 4;
 
5236
            i += 5;
 
5237
        } else if ( d[i] == '&' && i + 1 < len && d[i+1] == '#' ) {
 
5238
            // Dont encode &lt; or &quot; or &custom;.
 
5239
            // Only encode character references
 
5240
            tmp.replace( i, 1, "&#38;" );
 
5241
            d = tmp.data();
 
5242
            len += 4;
 
5243
            i += 5;
 
5244
        } else {
 
5245
            ++i;
 
5246
        }
 
5247
    }
 
5248
 
 
5249
    return tmp;
 
5250
}
 
5251
 
 
5252
void QDomEntityPrivate::save( QTextStream& s, int, int ) const
 
5253
{
 
5254
    if ( m_sys.isNull() && m_pub.isNull() ) {
 
5255
        s << "<!ENTITY " << name << " \"" << encodeEntity( value.utf8() ) << "\">" << endl;
 
5256
    } else {
 
5257
        s << "<!ENTITY " << name << " ";
 
5258
        if ( m_pub.isNull() ) {
 
5259
            s << "SYSTEM \"" << m_sys << "\"";
 
5260
        } else {
 
5261
            s << "PUBLIC \"" << m_pub << "\" \"" << m_sys << "\"";
 
5262
        }
 
5263
        if (! m_notationName.isNull() ) {
 
5264
            s << " NDATA " << m_notationName;
 
5265
        }
 
5266
        s << ">" << endl;
 
5267
    }
 
5268
}
 
5269
 
 
5270
/**************************************************************
 
5271
 *
 
5272
 * QDomEntity
 
5273
 *
 
5274
 **************************************************************/
 
5275
 
 
5276
#define IMPL ((QDomEntityPrivate*)impl)
 
5277
 
 
5278
/*!
 
5279
    \class QDomEntity qdom.h
 
5280
    \reentrant
 
5281
    \brief The QDomEntity class represents an XML entity.
 
5282
\if defined(commercial)
 
5283
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
5284
\endif
 
5285
 
 
5286
    \module XML
 
5287
    \ingroup xml-tools
 
5288
 
 
5289
    This class represents an entity in an XML document, either parsed
 
5290
    or unparsed. Note that this models the entity itself not the
 
5291
    entity declaration.
 
5292
 
 
5293
    DOM does not support editing entity nodes; if a user wants to make
 
5294
    changes to the contents of an entity, every related
 
5295
    QDomEntityReference node must be replaced in the DOM tree by a
 
5296
    clone of the entity's contents, and then the desired changes must
 
5297
    be made to each of the clones instead. All the descendents of an
 
5298
    entity node are read-only.
 
5299
 
 
5300
    An entity node does not have any parent.
 
5301
 
 
5302
    You can access the entity's publicId(), systemId() and
 
5303
    notationName() when available.
 
5304
 
 
5305
    For further information about the Document Object Model see
 
5306
    \link http://www.w3.org/TR/REC-DOM-Level-1/\endlink and
 
5307
    \link http://www.w3.org/TR/DOM-Level-2-Core/\endlink.
 
5308
    For a more general introduction of the DOM implementation see the
 
5309
    QDomDocument documentation.
 
5310
*/
 
5311
 
 
5312
 
 
5313
/*!
 
5314
    Constructs an empty entity.
 
5315
*/
 
5316
QDomEntity::QDomEntity()
 
5317
    : QDomNode()
 
5318
{
 
5319
}
 
5320
 
 
5321
 
 
5322
/*!
 
5323
    Constructs a copy of \a x.
 
5324
 
 
5325
    The data of the copy is shared (shallow copy): modifying one node
 
5326
    will also change the other. If you want to make a deep copy, use
 
5327
    cloneNode().
 
5328
*/
 
5329
QDomEntity::QDomEntity( const QDomEntity& x )
 
5330
    : QDomNode( x )
 
5331
{
 
5332
}
 
5333
 
 
5334
QDomEntity::QDomEntity( QDomEntityPrivate* n )
 
5335
    : QDomNode( n )
 
5336
{
 
5337
}
 
5338
 
 
5339
/*!
 
5340
    Assigns \a x to this DOM entity.
 
5341
 
 
5342
    The data of the copy is shared (shallow copy): modifying one node
 
5343
    will also change the other. If you want to make a deep copy, use
 
5344
    cloneNode().
 
5345
*/
 
5346
QDomEntity& QDomEntity::operator= ( const QDomEntity& x )
 
5347
{
 
5348
    return (QDomEntity&) QDomNode::operator=( x );
 
5349
}
 
5350
 
 
5351
/*!
 
5352
    Destroys the object and frees its resources.
 
5353
*/
 
5354
QDomEntity::~QDomEntity()
 
5355
{
 
5356
}
 
5357
 
 
5358
/*!
 
5359
    Returns \c EntityNode.
 
5360
*/
 
5361
QDomNode::NodeType QDomEntity::nodeType() const
 
5362
{
 
5363
    return EntityNode;
 
5364
}
 
5365
 
 
5366
/*!
 
5367
    Returns the public identifier associated with this entity. If the
 
5368
    public identifier was not specified QString::null is returned.
 
5369
*/
 
5370
QString QDomEntity::publicId() const
 
5371
{
 
5372
    if ( !impl )
 
5373
        return QString::null;
 
5374
    return IMPL->m_pub;
 
5375
}
 
5376
 
 
5377
/*!
 
5378
    Returns the system identifier associated with this entity. If the
 
5379
    system identifier was not specified QString::null is returned.
 
5380
*/
 
5381
QString QDomEntity::systemId() const
 
5382
{
 
5383
    if ( !impl )
 
5384
        return QString::null;
 
5385
    return IMPL->m_sys;
 
5386
}
 
5387
 
 
5388
/*!
 
5389
    For unparsed entities this function returns the name of the
 
5390
    notation for the entity. For parsed entities this function returns
 
5391
    QString::null.
 
5392
*/
 
5393
QString QDomEntity::notationName() const
 
5394
{
 
5395
    if ( !impl )
 
5396
        return QString::null;
 
5397
    return IMPL->m_notationName;
 
5398
}
 
5399
 
 
5400
/*!
 
5401
    Returns TRUE.
 
5402
*/
 
5403
bool QDomEntity::isEntity() const
 
5404
{
 
5405
    return TRUE;
 
5406
}
 
5407
 
 
5408
#undef IMPL
 
5409
 
 
5410
/**************************************************************
 
5411
 *
 
5412
 * QDomEntityReferencePrivate
 
5413
 *
 
5414
 **************************************************************/
 
5415
 
 
5416
QDomEntityReferencePrivate::QDomEntityReferencePrivate( QDomDocumentPrivate* d, QDomNodePrivate* parent, const QString& aname )
 
5417
    : QDomNodePrivate( d, parent )
 
5418
{
 
5419
    name = aname;
 
5420
}
 
5421
 
 
5422
QDomEntityReferencePrivate::QDomEntityReferencePrivate( QDomNodePrivate* n, bool deep )
 
5423
    : QDomNodePrivate( n, deep )
 
5424
{
 
5425
}
 
5426
 
 
5427
QDomEntityReferencePrivate::~QDomEntityReferencePrivate()
 
5428
{
 
5429
}
 
5430
 
 
5431
QDomNodePrivate* QDomEntityReferencePrivate::cloneNode( bool deep)
 
5432
{
 
5433
    QDomNodePrivate* p = new QDomEntityReferencePrivate( this, deep );
 
5434
    // We are not interested in this node
 
5435
    p->deref();
 
5436
    return p;
 
5437
}
 
5438
 
 
5439
void QDomEntityReferencePrivate::save( QTextStream& s, int, int ) const
 
5440
{
 
5441
    s << "&" << name << ";";
 
5442
}
 
5443
 
 
5444
/**************************************************************
 
5445
 *
 
5446
 * QDomEntityReference
 
5447
 *
 
5448
 **************************************************************/
 
5449
 
 
5450
#define IMPL ((QDomEntityReferencePrivate*)impl)
 
5451
 
 
5452
/*!
 
5453
    \class QDomEntityReference qdom.h
 
5454
    \reentrant
 
5455
    \brief The QDomEntityReference class represents an XML entity reference.
 
5456
\if defined(commercial)
 
5457
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
5458
\endif
 
5459
 
 
5460
    \module XML
 
5461
    \ingroup xml-tools
 
5462
 
 
5463
    A QDomEntityReference object may be inserted into the DOM tree
 
5464
    when an entity reference is in the source document, or when the
 
5465
    user wishes to insert an entity reference.
 
5466
 
 
5467
    Note that character references and references to predefined
 
5468
    entities are expanded by the XML processor so that characters are
 
5469
    represented by their Unicode equivalent rather than by an entity
 
5470
    reference.
 
5471
 
 
5472
    Moreover, the XML processor may completely expand references to
 
5473
    entities while building the DOM tree, instead of providing
 
5474
    QDomEntityReference objects.
 
5475
 
 
5476
    If it does provide such objects, then for a given entity reference
 
5477
    node, it may be that there is no entity node representing the
 
5478
    referenced entity; but if such an entity exists, then the child
 
5479
    list of the entity reference node is the same as that of the
 
5480
    entity  node. As with the entity node, all descendents of the
 
5481
    entity reference are read-only.
 
5482
 
 
5483
    For further information about the Document Object Model see
 
5484
    \link http://www.w3.org/TR/REC-DOM-Level-1/\endlink and
 
5485
    \link http://www.w3.org/TR/DOM-Level-2-Core/\endlink.
 
5486
    For a more general introduction of the DOM implementation see the
 
5487
    QDomDocument documentation.
 
5488
*/
 
5489
 
 
5490
/*!
 
5491
    Constructs an empty entity reference. Use
 
5492
    QDomDocument::createEntityReference() to create a entity reference
 
5493
    with content.
 
5494
*/
 
5495
QDomEntityReference::QDomEntityReference()
 
5496
    : QDomNode()
 
5497
{
 
5498
}
 
5499
 
 
5500
/*!
 
5501
    Constructs a copy of \a x.
 
5502
 
 
5503
    The data of the copy is shared (shallow copy): modifying one node
 
5504
    will also change the other. If you want to make a deep copy, use
 
5505
    cloneNode().
 
5506
*/
 
5507
QDomEntityReference::QDomEntityReference( const QDomEntityReference& x )
 
5508
    : QDomNode( x )
 
5509
{
 
5510
}
 
5511
 
 
5512
QDomEntityReference::QDomEntityReference( QDomEntityReferencePrivate* n )
 
5513
    : QDomNode( n )
 
5514
{
 
5515
}
 
5516
 
 
5517
/*!
 
5518
    Assigns \a x to this entity reference.
 
5519
 
 
5520
    The data of the copy is shared (shallow copy): modifying one node
 
5521
    will also change the other. If you want to make a deep copy, use
 
5522
    cloneNode().
 
5523
*/
 
5524
QDomEntityReference& QDomEntityReference::operator= ( const QDomEntityReference& x )
 
5525
{
 
5526
    return (QDomEntityReference&) QDomNode::operator=( x );
 
5527
}
 
5528
 
 
5529
/*!
 
5530
    Destroys the object and frees its resources.
 
5531
*/
 
5532
QDomEntityReference::~QDomEntityReference()
 
5533
{
 
5534
}
 
5535
 
 
5536
/*!
 
5537
    Returns \c EntityReference.
 
5538
*/
 
5539
QDomNode::NodeType QDomEntityReference::nodeType() const
 
5540
{
 
5541
    return EntityReferenceNode;
 
5542
}
 
5543
 
 
5544
/*!
 
5545
    Returns TRUE.
 
5546
*/
 
5547
bool QDomEntityReference::isEntityReference() const
 
5548
{
 
5549
    return TRUE;
 
5550
}
 
5551
 
 
5552
#undef IMPL
 
5553
 
 
5554
/**************************************************************
 
5555
 *
 
5556
 * QDomProcessingInstructionPrivate
 
5557
 *
 
5558
 **************************************************************/
 
5559
 
 
5560
QDomProcessingInstructionPrivate::QDomProcessingInstructionPrivate( QDomDocumentPrivate* d,
 
5561
        QDomNodePrivate* parent, const QString& target, const QString& data )
 
5562
    : QDomNodePrivate( d, parent )
 
5563
{
 
5564
    name = target;
 
5565
    value = data;
 
5566
}
 
5567
 
 
5568
QDomProcessingInstructionPrivate::QDomProcessingInstructionPrivate( QDomProcessingInstructionPrivate* n, bool deep )
 
5569
    : QDomNodePrivate( n, deep )
 
5570
{
 
5571
}
 
5572
 
 
5573
QDomProcessingInstructionPrivate::~QDomProcessingInstructionPrivate()
 
5574
{
 
5575
}
 
5576
 
 
5577
QDomNodePrivate* QDomProcessingInstructionPrivate::cloneNode( bool deep)
 
5578
{
 
5579
    QDomNodePrivate* p = new QDomProcessingInstructionPrivate( this, deep );
 
5580
    // We are not interested in this node
 
5581
    p->deref();
 
5582
    return p;
 
5583
}
 
5584
 
 
5585
void QDomProcessingInstructionPrivate::save( QTextStream& s, int, int ) const
 
5586
{
 
5587
    s << "<?" << name << " " << value << "?>" << endl;
 
5588
}
 
5589
 
 
5590
/**************************************************************
 
5591
 *
 
5592
 * QDomProcessingInstruction
 
5593
 *
 
5594
 **************************************************************/
 
5595
 
 
5596
#define IMPL ((QDomProcessingInstructionPrivate*)impl)
 
5597
 
 
5598
/*!
 
5599
    \class QDomProcessingInstruction qdom.h
 
5600
    \reentrant
 
5601
    \brief The QDomProcessingInstruction class represents an XML processing
 
5602
    instruction.
 
5603
\if defined(commercial)
 
5604
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
5605
\endif
 
5606
 
 
5607
    \module XML
 
5608
    \ingroup xml-tools
 
5609
 
 
5610
    Processing instructions are used in XML to keep processor-specific
 
5611
    information in the text of the document.
 
5612
 
 
5613
    The content of the processing instruction is retrieved with data()
 
5614
    and set with setData(). The processing instruction's target is
 
5615
    retrieved with target().
 
5616
 
 
5617
    For further information about the Document Object Model see
 
5618
    \link http://www.w3.org/TR/REC-DOM-Level-1/\endlink and
 
5619
    \link http://www.w3.org/TR/DOM-Level-2-Core/\endlink.
 
5620
    For a more general introduction of the DOM implementation see the
 
5621
    QDomDocument documentation.
 
5622
*/
 
5623
 
 
5624
/*!
 
5625
    Constructs an empty processing instruction. Use
 
5626
    QDomDocument::createProcessingInstruction() to create a processing
 
5627
    instruction with content.
 
5628
*/
 
5629
QDomProcessingInstruction::QDomProcessingInstruction()
 
5630
    : QDomNode()
 
5631
{
 
5632
}
 
5633
 
 
5634
/*!
 
5635
    Constructs a copy of \a x.
 
5636
 
 
5637
    The data of the copy is shared (shallow copy): modifying one node
 
5638
    will also change the other. If you want to make a deep copy, use
 
5639
    cloneNode().
 
5640
*/
 
5641
QDomProcessingInstruction::QDomProcessingInstruction( const QDomProcessingInstruction& x )
 
5642
    : QDomNode( x )
 
5643
{
 
5644
}
 
5645
 
 
5646
QDomProcessingInstruction::QDomProcessingInstruction( QDomProcessingInstructionPrivate* n )
 
5647
    : QDomNode( n )
 
5648
{
 
5649
}
 
5650
 
 
5651
/*!
 
5652
    Assigns \a x to this processing instruction.
 
5653
 
 
5654
    The data of the copy is shared (shallow copy): modifying one node
 
5655
    will also change the other. If you want to make a deep copy, use
 
5656
    cloneNode().
 
5657
*/
 
5658
QDomProcessingInstruction& QDomProcessingInstruction::operator= ( const QDomProcessingInstruction& x )
 
5659
{
 
5660
    return (QDomProcessingInstruction&) QDomNode::operator=( x );
 
5661
}
 
5662
 
 
5663
/*!
 
5664
    Destroys the object and frees its resources.
 
5665
*/
 
5666
QDomProcessingInstruction::~QDomProcessingInstruction()
 
5667
{
 
5668
}
 
5669
 
 
5670
/*!
 
5671
    Returns \c ProcessingInstructionNode.
 
5672
*/
 
5673
QDomNode::NodeType QDomProcessingInstruction::nodeType() const
 
5674
{
 
5675
    return ProcessingInstructionNode;
 
5676
}
 
5677
 
 
5678
/*!
 
5679
    Returns the target of this processing instruction.
 
5680
 
 
5681
    \sa data()
 
5682
*/
 
5683
QString QDomProcessingInstruction::target() const
 
5684
{
 
5685
    if ( !impl )
 
5686
        return QString::null;
 
5687
    return impl->nodeName();
 
5688
}
 
5689
 
 
5690
/*!
 
5691
    Returns the content of this processing instruction.
 
5692
 
 
5693
    \sa setData() target()
 
5694
*/
 
5695
QString QDomProcessingInstruction::data() const
 
5696
{
 
5697
    if ( !impl )
 
5698
        return QString::null;
 
5699
    return impl->nodeValue();
 
5700
}
 
5701
 
 
5702
/*!
 
5703
    Sets the data contained in the processing instruction to \a d.
 
5704
 
 
5705
    \sa data()
 
5706
*/
 
5707
void QDomProcessingInstruction::setData( const QString& d )
 
5708
{
 
5709
    if ( !impl )
 
5710
        return;
 
5711
    impl->setNodeValue( d );
 
5712
}
 
5713
 
 
5714
/*!
 
5715
    Returns TRUE.
 
5716
*/
 
5717
bool QDomProcessingInstruction::isProcessingInstruction() const
 
5718
{
 
5719
    return TRUE;
 
5720
}
 
5721
 
 
5722
#undef IMPL
 
5723
 
 
5724
/**************************************************************
 
5725
 *
 
5726
 * QDomDocumentPrivate
 
5727
 *
 
5728
 **************************************************************/
 
5729
 
 
5730
QDomDocumentPrivate::QDomDocumentPrivate()
 
5731
    : QDomNodePrivate( 0 )
 
5732
{
 
5733
    impl = new QDomImplementationPrivate();
 
5734
    type = new QDomDocumentTypePrivate( this, this );
 
5735
 
 
5736
    name = "#document";
 
5737
}
 
5738
 
 
5739
QDomDocumentPrivate::QDomDocumentPrivate( const QString& aname )
 
5740
    : QDomNodePrivate( 0 )
 
5741
{
 
5742
    impl = new QDomImplementationPrivate();
 
5743
    type = new QDomDocumentTypePrivate( this, this );
 
5744
    type->name = aname;
 
5745
 
 
5746
    name = "#document";
 
5747
}
 
5748
 
 
5749
QDomDocumentPrivate::QDomDocumentPrivate( QDomDocumentTypePrivate* dt )
 
5750
    : QDomNodePrivate( 0 )
 
5751
{
 
5752
    impl = new QDomImplementationPrivate();
 
5753
    if ( dt != 0 ) {
 
5754
        type = dt;
 
5755
        type->ref();
 
5756
    } else {
 
5757
        type = new QDomDocumentTypePrivate( this, this );
 
5758
    }
 
5759
 
 
5760
    name = "#document";
 
5761
}
 
5762
 
 
5763
QDomDocumentPrivate::QDomDocumentPrivate( QDomDocumentPrivate* n, bool deep )
 
5764
    : QDomNodePrivate( n, deep )
 
5765
{
 
5766
    impl = n->impl->clone();
 
5767
    // Reference count is down to 0, so we set it to 1 here.
 
5768
    impl->ref();
 
5769
    type = (QDomDocumentTypePrivate*)n->type->cloneNode();
 
5770
    type->setParent( this );
 
5771
    // Reference count is down to 0, so we set it to 1 here.
 
5772
    type->ref();
 
5773
}
 
5774
 
 
5775
QDomDocumentPrivate::~QDomDocumentPrivate()
 
5776
{
 
5777
    if ( impl->deref() ) delete impl;
 
5778
    if ( type->deref() ) delete type;
 
5779
}
 
5780
 
 
5781
void QDomDocumentPrivate::clear()
 
5782
{
 
5783
    if ( impl->deref() ) delete impl;
 
5784
    if ( type->deref() ) delete type;
 
5785
    impl = 0;
 
5786
    type = 0;
 
5787
    QDomNodePrivate::clear();
 
5788
}
 
5789
 
 
5790
bool QDomDocumentPrivate::setContent( QXmlInputSource *source, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn )
 
5791
{
 
5792
    QXmlSimpleReader reader;
 
5793
    if ( namespaceProcessing ) {
 
5794
        reader.setFeature( "http://xml.org/sax/features/namespaces", TRUE );
 
5795
        reader.setFeature( "http://xml.org/sax/features/namespace-prefixes", FALSE );
 
5796
    } else {
 
5797
        reader.setFeature( "http://xml.org/sax/features/namespaces", FALSE );
 
5798
        reader.setFeature( "http://xml.org/sax/features/namespace-prefixes", TRUE );
 
5799
    }
 
5800
    reader.setFeature( "http://trolltech.com/xml/features/report-whitespace-only-CharData", FALSE );
 
5801
 
 
5802
    return setContent( source, &reader, errorMsg, errorLine, errorColumn );
 
5803
}
 
5804
 
 
5805
bool QDomDocumentPrivate::setContent( QXmlInputSource *source, QXmlReader *reader, QString *errorMsg, int *errorLine, int *errorColumn )
 
5806
{
 
5807
    clear();
 
5808
    impl = new QDomImplementationPrivate;
 
5809
    type = new QDomDocumentTypePrivate( this, this );
 
5810
 
 
5811
    bool namespaceProcessing = reader->feature( "http://xml.org/sax/features/namespaces" )
 
5812
        && !reader->feature( "http://xml.org/sax/features/namespace-prefixes" );
 
5813
 
 
5814
    QDomHandler hnd( this, namespaceProcessing );
 
5815
    reader->setContentHandler( &hnd );
 
5816
    reader->setErrorHandler( &hnd );
 
5817
    reader->setLexicalHandler( &hnd );
 
5818
    reader->setDeclHandler( &hnd );
 
5819
    reader->setDTDHandler( &hnd );
 
5820
 
 
5821
    if ( !reader->parse( source ) ) {
 
5822
        if ( errorMsg )
 
5823
            *errorMsg = hnd.errorMsg;
 
5824
        if ( errorLine )
 
5825
            *errorLine = hnd.errorLine;
 
5826
        if ( errorColumn )
 
5827
            *errorColumn = hnd.errorColumn;
 
5828
        return FALSE;
 
5829
    }
 
5830
 
 
5831
    return TRUE;
 
5832
}
 
5833
 
 
5834
QDomNodePrivate* QDomDocumentPrivate::cloneNode( bool deep)
 
5835
{
 
5836
    QDomNodePrivate* p = new QDomDocumentPrivate( this, deep );
 
5837
    // We are not interested in this node
 
5838
    p->deref();
 
5839
    return p;
 
5840
}
 
5841
 
 
5842
QDomElementPrivate* QDomDocumentPrivate::documentElement()
 
5843
{
 
5844
    QDomNodePrivate* p = first;
 
5845
    while ( p && !p->isElement() )
 
5846
        p = p->next;
 
5847
 
 
5848
    return (QDomElementPrivate*)p;
 
5849
}
 
5850
 
 
5851
QDomElementPrivate* QDomDocumentPrivate::createElement( const QString& tagName )
 
5852
{
 
5853
    QDomElementPrivate* e = new QDomElementPrivate( this, 0, tagName );
 
5854
    e->deref();
 
5855
    return e;
 
5856
}
 
5857
 
 
5858
QDomElementPrivate* QDomDocumentPrivate::createElementNS( const QString& nsURI, const QString& qName )
 
5859
{
 
5860
    QDomElementPrivate* e = new QDomElementPrivate( this, 0, nsURI, qName );
 
5861
    e->deref();
 
5862
    return e;
 
5863
}
 
5864
 
 
5865
QDomDocumentFragmentPrivate* QDomDocumentPrivate::createDocumentFragment()
 
5866
{
 
5867
    QDomDocumentFragmentPrivate* f = new QDomDocumentFragmentPrivate( this, (QDomNodePrivate*)0 );
 
5868
    f->deref();
 
5869
    return f;
 
5870
}
 
5871
 
 
5872
QDomTextPrivate* QDomDocumentPrivate::createTextNode( const QString& data )
 
5873
{
 
5874
    QDomTextPrivate* t = new QDomTextPrivate( this, 0, data );
 
5875
    t->deref();
 
5876
    return t;
 
5877
}
 
5878
 
 
5879
QDomCommentPrivate* QDomDocumentPrivate::createComment( const QString& data )
 
5880
{
 
5881
    QDomCommentPrivate* c = new QDomCommentPrivate( this, 0, data );
 
5882
    c->deref();
 
5883
    return c;
 
5884
}
 
5885
 
 
5886
QDomCDATASectionPrivate* QDomDocumentPrivate::createCDATASection( const QString& data )
 
5887
{
 
5888
    QDomCDATASectionPrivate* c = new QDomCDATASectionPrivate( this, 0, data );
 
5889
    c->deref();
 
5890
    return c;
 
5891
}
 
5892
 
 
5893
QDomProcessingInstructionPrivate* QDomDocumentPrivate::createProcessingInstruction( const QString& target, const QString& data )
 
5894
{
 
5895
    QDomProcessingInstructionPrivate* p = new QDomProcessingInstructionPrivate( this, 0, target, data );
 
5896
    p->deref();
 
5897
    return p;
 
5898
}
 
5899
 
 
5900
QDomAttrPrivate* QDomDocumentPrivate::createAttribute( const QString& aname )
 
5901
{
 
5902
    QDomAttrPrivate* a = new QDomAttrPrivate( this, 0, aname );
 
5903
    a->deref();
 
5904
    return a;
 
5905
}
 
5906
 
 
5907
QDomAttrPrivate* QDomDocumentPrivate::createAttributeNS( const QString& nsURI, const QString& qName )
 
5908
{
 
5909
    QDomAttrPrivate* a = new QDomAttrPrivate( this, 0, nsURI, qName );
 
5910
    a->deref();
 
5911
    return a;
 
5912
}
 
5913
 
 
5914
QDomEntityReferencePrivate* QDomDocumentPrivate::createEntityReference( const QString& aname )
 
5915
{
 
5916
    QDomEntityReferencePrivate* e = new QDomEntityReferencePrivate( this, 0, aname );
 
5917
    e->deref();
 
5918
    return e;
 
5919
}
 
5920
 
 
5921
QDomNodePrivate* QDomDocumentPrivate::importNode( const QDomNodePrivate* importedNode, bool deep )
 
5922
{
 
5923
    QDomNodePrivate *node = 0;
 
5924
    switch ( importedNode->nodeType() ) {
 
5925
        case QDomNode::AttributeNode:
 
5926
            node = new QDomAttrPrivate( (QDomAttrPrivate*)importedNode, TRUE );
 
5927
            break;
 
5928
        case QDomNode::DocumentFragmentNode:
 
5929
            node = new QDomDocumentFragmentPrivate( (QDomDocumentFragmentPrivate*)importedNode, deep );
 
5930
            break;
 
5931
        case QDomNode::ElementNode:
 
5932
            node = new QDomElementPrivate( (QDomElementPrivate*)importedNode, deep );
 
5933
            break;
 
5934
        case QDomNode::EntityNode:
 
5935
            node = new QDomEntityPrivate( (QDomEntityPrivate*)importedNode, deep );
 
5936
            break;
 
5937
        case QDomNode::EntityReferenceNode:
 
5938
            node = new QDomEntityReferencePrivate( (QDomEntityReferencePrivate*)importedNode, FALSE );
 
5939
            break;
 
5940
        case QDomNode::NotationNode:
 
5941
            node = new QDomNotationPrivate( (QDomNotationPrivate*)importedNode, deep );
 
5942
            break;
 
5943
        case QDomNode::ProcessingInstructionNode:
 
5944
            node = new QDomProcessingInstructionPrivate( (QDomProcessingInstructionPrivate*)importedNode, deep );
 
5945
            break;
 
5946
        case QDomNode::TextNode:
 
5947
            node = new QDomTextPrivate( (QDomTextPrivate*)importedNode, deep );
 
5948
            break;
 
5949
        case QDomNode::CDATASectionNode:
 
5950
            node = new QDomCDATASectionPrivate( (QDomCDATASectionPrivate*)importedNode, deep );
 
5951
            break;
 
5952
        case QDomNode::CommentNode:
 
5953
            node = new QDomCommentPrivate( (QDomCommentPrivate*)importedNode, deep );
 
5954
            break;
 
5955
        default:
 
5956
            break;
 
5957
    }
 
5958
    if ( node ) {
 
5959
        node->setOwnerDocument( this );
 
5960
        // The QDomNode constructor increases the refcount, so deref() first to
 
5961
        // keep refcount balanced.
 
5962
        node->deref();
 
5963
    }
 
5964
    return node;
 
5965
}
 
5966
 
 
5967
void QDomDocumentPrivate::save( QTextStream& s, int, int indent ) const
 
5968
{
 
5969
    bool doc = FALSE;
 
5970
 
 
5971
    QDomNodePrivate* n = first;
 
5972
    if ( n && n->isProcessingInstruction() && n->nodeName()=="xml" ) {
 
5973
        // we have an XML declaration
 
5974
        QString data = n->nodeValue();
 
5975
        QRegExp encoding( QString::fromLatin1("encoding\\s*=\\s*((\"([^\"]*)\")|('([^']*)'))") );
 
5976
        encoding.search( data );
 
5977
        QString enc = encoding.cap(3);
 
5978
        if ( enc.isEmpty() ) {
 
5979
            enc = encoding.cap(5);
 
5980
        }
 
5981
        if ( enc.isEmpty() ) {
 
5982
            s.setEncoding( QTextStream::UnicodeUTF8 );
 
5983
        } else {
 
5984
            s.setCodec( QTextCodec::codecForName( enc ) );
 
5985
        }
 
5986
    } else {
 
5987
        s.setEncoding( QTextStream::UnicodeUTF8 );
 
5988
    }
 
5989
    while ( n ) {
 
5990
        if ( !doc && !(n->isProcessingInstruction()&&n->nodeName()=="xml") ) {
 
5991
            // save doctype after XML declaration
 
5992
            type->save( s, 0, indent );
 
5993
            doc = TRUE;
 
5994
        }
 
5995
        n->save( s, 0, indent );
 
5996
        n = n->next;
 
5997
    }
 
5998
}
 
5999
 
 
6000
/**************************************************************
 
6001
 *
 
6002
 * QDomDocument
 
6003
 *
 
6004
 **************************************************************/
 
6005
 
 
6006
#define IMPL ((QDomDocumentPrivate*)impl)
 
6007
 
 
6008
/*!
 
6009
    \class QDomDocument qdom.h
 
6010
    \reentrant
 
6011
    \brief The QDomDocument class represents an XML document.
 
6012
\if defined(commercial)
 
6013
    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
 
6014
\endif
 
6015
 
 
6016
    \module XML
 
6017
    \ingroup xml-tools
 
6018
 
 
6019
    The QDomDocument class represents the entire XML document.
 
6020
    Conceptually, it is the root of the document tree, and provides
 
6021
    the primary access to the document's data.
 
6022
 
 
6023
    Since elements, text nodes, comments, processing instructions,
 
6024
    etc., cannot exist outside the context of a document, the document
 
6025
    class also contains the factory functions needed to create these
 
6026
    objects. The node objects created have an ownerDocument() function
 
6027
    which associates them with the document within whose context they
 
6028
    were created. The DOM classes that will be used most often are
 
6029
    QDomNode, QDomDocument, QDomElement and QDomText.
 
6030
 
 
6031
    The parsed XML is represented internally by a tree of objects that
 
6032
    can be accessed using the various QDom classes. All QDom classes
 
6033
    only \e reference objects in the internal tree. The internal
 
6034
    objects in the DOM tree will get deleted once the last QDom
 
6035
    object referencing them and the QDomDocument itself are deleted.
 
6036
 
 
6037
    Creation of elements, text nodes, etc. is done using the various
 
6038
    factory functions provided in this class. Using the default
 
6039
    constructors of the QDom classes will only result in empty
 
6040
    objects that cannot be manipulated or inserted into the Document.
 
6041
 
 
6042
    The QDomDocument class has several functions for creating document
 
6043
    data, for example, createElement(), createTextNode(),
 
6044
    createComment(), createCDATASection(),
 
6045
    createProcessingInstruction(), createAttribute() and
 
6046
    createEntityReference(). Some of these functions have versions
 
6047
    that support namespaces, i.e. createElementNS() and
 
6048
    createAttributeNS(). The createDocumentFragment() function is used
 
6049
    to hold parts of the document; this is useful for manipulating for
 
6050
    complex documents.
 
6051
 
 
6052
    The entire content of the document is set with setContent(). This
 
6053
    function parses the string it is passed as an XML document and
 
6054
    creates the DOM tree that represents the document. The root
 
6055
    element is available using documentElement(). The textual
 
6056
    representation of the document can be obtained using toString().
 
6057
 
 
6058
    It is possible to insert a node from another document into the
 
6059
    document using importNode().
 
6060
 
 
6061
    You can obtain a list of all the elements that have a particular
 
6062
    tag with elementsByTagName() or with elementsByTagNameNS().
 
6063
 
 
6064
    The QDom classes are typically used as follows:
 
6065
    \code
 
6066
    QDomDocument doc( "mydocument" );
 
6067
    QFile file( "mydocument.xml" );
 
6068
    if ( !file.open( IO_ReadOnly ) )
 
6069
        return;
 
6070
    if ( !doc.setContent( &file ) ) {
 
6071
        file.close();
 
6072
        return;
 
6073
    }
 
6074
    file.close();
 
6075
 
 
6076
    // print out the element names of all elements that are direct children
 
6077
    // of the outermost element.
 
6078
    QDomElement docElem = doc.documentElement();
 
6079
 
 
6080
    QDomNode n = docElem.firstChild();
 
6081
    while( !n.isNull() ) {
 
6082
        QDomElement e = n.toElement(); // try to convert the node to an element.
 
6083
        if( !e.isNull() ) {
 
6084
            cout << e.tagName() << endl; // the node really is an element.
 
6085
        }
 
6086
        n = n.nextSibling();
 
6087
    }
 
6088
 
 
6089
    // Here we append a new element to the end of the document
 
6090
    QDomElement elem = doc.createElement( "img" );
 
6091
    elem.setAttribute( "src", "myimage.png" );
 
6092
    docElem.appendChild( elem );
 
6093
    \endcode
 
6094
 
 
6095
    Once \c doc and \c elem go out of scope, the whole internal tree
 
6096
    representing the XML document is deleted.
 
6097
 
 
6098
    To create a document using DOM use code like this:
 
6099
    \code
 
6100
    QDomDocument doc( "MyML" );
 
6101
    QDomElement root = doc.createElement( "MyML" );
 
6102
    doc.appendChild( root );
 
6103
 
 
6104
    QDomElement tag = doc.createElement( "Greeting" );
 
6105
    root.appendChild( tag );
 
6106
 
 
6107
    QDomText t = doc.createTextNode( "Hello World" );
 
6108
    tag.appendChild( t );
 
6109
 
 
6110
    QString xml = doc.toString();
 
6111
    \endcode
 
6112
 
 
6113
    For further information about the Document Object Model see
 
6114
    \link http://www.w3.org/TR/REC-DOM-Level-1/\endlink and
 
6115
    \link http://www.w3.org/TR/DOM-Level-2-Core/\endlink.
 
6116
    For a more general introduction of the DOM implementation see the
 
6117
    QDomDocument documentation.
 
6118
*/
 
6119
 
 
6120
 
 
6121
/*!
 
6122
    Constructs an empty document.
 
6123
*/
 
6124
QDomDocument::QDomDocument()
 
6125
{
 
6126
    impl = new QDomDocumentPrivate;
 
6127
}
 
6128
 
 
6129
/*!
 
6130
    Creates a document and sets the name of the document type to \a
 
6131
    name.
 
6132
*/
 
6133
QDomDocument::QDomDocument( const QString& name )
 
6134
{
 
6135
    // We take over ownership
 
6136
    impl = new QDomDocumentPrivate( name );
 
6137
}
 
6138
 
 
6139
/*!
 
6140
    Creates a document with the document type \a doctype.
 
6141
 
 
6142
    \sa QDomImplementation::createDocumentType()
 
6143
*/
 
6144
QDomDocument::QDomDocument( const QDomDocumentType& doctype )
 
6145
{
 
6146
    impl = new QDomDocumentPrivate( (QDomDocumentTypePrivate*)(doctype.impl) );
 
6147
}
 
6148
 
 
6149
/*!
 
6150
    Constructs a copy of \a x.
 
6151
 
 
6152
    The data of the copy is shared (shallow copy): modifying one node
 
6153
    will also change the other. If you want to make a deep copy, use
 
6154
    cloneNode().
 
6155
*/
 
6156
QDomDocument::QDomDocument( const QDomDocument& x )
 
6157
    : QDomNode( x )
 
6158
{
 
6159
}
 
6160
 
 
6161
QDomDocument::QDomDocument( QDomDocumentPrivate* x )
 
6162
    : QDomNode( x )
 
6163
{
 
6164
}
 
6165
 
 
6166
/*!
 
6167
    Assigns \a x to this DOM document.
 
6168
 
 
6169
    The data of the copy is shared (shallow copy): modifying one node
 
6170
    will also change the other. If you want to make a deep copy, use
 
6171
    cloneNode().
 
6172
*/
 
6173
QDomDocument& QDomDocument::operator= ( const QDomDocument& x )
 
6174
{
 
6175
    return (QDomDocument&) QDomNode::operator=( x );
 
6176
}
 
6177
 
 
6178
/*!
 
6179
    Destroys the object and frees its resources.
 
6180
*/
 
6181
QDomDocument::~QDomDocument()
 
6182
{
 
6183
}
 
6184
 
 
6185
/*!
 
6186
    \overload
 
6187
 
 
6188
    This function reads the XML document from the string \a text.
 
6189
    Since \a text is already a Unicode string, no encoding detection
 
6190
    is done.
 
6191
*/
 
6192
bool QDomDocument::setContent( const QString& text, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn )
 
6193
{
 
6194
    if ( !impl )
 
6195
        impl = new QDomDocumentPrivate;
 
6196
    QXmlInputSource source;
 
6197
    source.setData( text );
 
6198
    return IMPL->setContent( &source, namespaceProcessing, errorMsg, errorLine, errorColumn );
 
6199
}
 
6200
 
 
6201
/*!
 
6202
    This function parses the XML document from the byte array \a
 
6203
    buffer and sets it as the content of the document. It tries to
 
6204
    detect the encoding of the document as required by the XML
 
6205
    specification.
 
6206
 
 
6207
    If \a namespaceProcessing is TRUE, the parser recognizes
 
6208
    namespaces in the XML file and sets the prefix name, local name
 
6209
    and namespace URI to appropriate values. If \a namespaceProcessing
 
6210
    is FALSE, the parser does no namespace processing when it reads
 
6211
    the XML file.
 
6212
 
 
6213
    If a parse error occurs, the function returns FALSE; otherwise it
 
6214
    returns TRUE. If a parse error occurs and \a errorMsg, \a
 
6215
    errorLine and \a errorColumn are not 0, the error message is
 
6216
    placed in \a *errorMsg, the line number \a *errorLine and the
 
6217
    column number in \a *errorColumn.
 
6218
 
 
6219
    If \a namespaceProcessing is TRUE, the function QDomNode::prefix()
 
6220
    returns a string for all elements and attributes. It returns an
 
6221
    empty string if the element or attribute has no prefix.
 
6222
 
 
6223
    If \a namespaceProcessing is FALSE, the functions
 
6224
    QDomNode::prefix(), QDomNode::localName() and
 
6225
    QDomNode::namespaceURI() return QString::null.
 
6226
 
 
6227
    \sa QDomNode::namespaceURI() QDomNode::localName()
 
6228
    QDomNode::prefix() QString::isNull() QString::isEmpty()
 
6229
*/
 
6230
bool QDomDocument::setContent( const QByteArray& buffer, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn )
 
6231
{
 
6232
    if ( !impl )
 
6233
        impl = new QDomDocumentPrivate;
 
6234
    QBuffer buf( buffer );
 
6235
    QXmlInputSource source( &buf );
 
6236
    return IMPL->setContent( &source, namespaceProcessing, errorMsg, errorLine, errorColumn );
 
6237
}
 
6238
 
 
6239
/*!
 
6240
    \overload
 
6241
 
 
6242
    This function reads the XML document from the C string \a buffer.
 
6243
 
 
6244
    \warning This function does not try to detect the encoding:
 
6245
    instead it assumes that the C string is UTF-8 encoded.
 
6246
*/
 
6247
bool QDomDocument::setContent( const QCString& buffer, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn )
 
6248
{
 
6249
    return setContent( QString::fromUtf8( buffer, buffer.length() ), namespaceProcessing, errorMsg, errorLine, errorColumn );
 
6250
}
 
6251
 
 
6252
/*!
 
6253
    \overload
 
6254
 
 
6255
    This function reads the XML document from the IO device \a dev.
 
6256
*/
 
6257
bool QDomDocument::setContent( QIODevice* dev, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn )
 
6258
{
 
6259
    if ( !impl )
 
6260
        impl = new QDomDocumentPrivate;
 
6261
    QXmlInputSource source( dev );
 
6262
    return IMPL->setContent( &source, namespaceProcessing, errorMsg, errorLine, errorColumn );
 
6263
}
 
6264
 
 
6265
/*!
 
6266
    \overload
 
6267
 
 
6268
    This function reads the XML document from the string \a text.
 
6269
    Since \a text is already a Unicode string, no encoding detection
 
6270
    is performed.
 
6271
 
 
6272
    No namespace processing is performed either.
 
6273
*/
 
6274
bool QDomDocument::setContent( const QString& text, QString *errorMsg, int *errorLine, int *errorColumn )
 
6275
{
 
6276
    return setContent( text, FALSE, errorMsg, errorLine, errorColumn );
 
6277
}
 
6278
 
 
6279
/*!
 
6280
    \overload
 
6281
 
 
6282
    This function reads the XML document from the byte array \a
 
6283
    buffer.
 
6284
 
 
6285
    No namespace processing is performed.
 
6286
*/
 
6287
bool QDomDocument::setContent( const QByteArray& buffer, QString *errorMsg, int *errorLine, int *errorColumn  )
 
6288
{
 
6289
    return setContent( buffer, FALSE, errorMsg, errorLine, errorColumn );
 
6290
}
 
6291
 
 
6292
/*!
 
6293
    \overload
 
6294
 
 
6295
    This function reads the XML document from the C string \a buffer.
 
6296
 
 
6297
    No namespace processing is performed.
 
6298
 
 
6299
    \warning This function does not try to detect the encoding:
 
6300
    instead it assumes that the C string is UTF-8 encoded.
 
6301
*/
 
6302
bool QDomDocument::setContent( const QCString& buffer, QString *errorMsg, int *errorLine, int *errorColumn  )
 
6303
{
 
6304
    return setContent( buffer, FALSE, errorMsg, errorLine, errorColumn );
 
6305
}
 
6306
 
 
6307
/*!
 
6308
    \overload
 
6309
 
 
6310
    This function reads the XML document from the IO device \a dev.
 
6311
 
 
6312
    No namespace processing is performed.
 
6313
*/
 
6314
bool QDomDocument::setContent( QIODevice* dev, QString *errorMsg, int *errorLine, int *errorColumn  )
 
6315
{
 
6316
    return setContent( dev, FALSE, errorMsg, errorLine, errorColumn );
 
6317
}
 
6318
 
 
6319
/*!
 
6320
    \overload
 
6321
 
 
6322
    This function reads the XML document from the QXmlInputSource \a source and
 
6323
    parses it with the QXmlReader \a reader.
 
6324
 
 
6325
    This function doesn't change the features of the \a reader. If you want to
 
6326
    use certain features for parsing you can use this function to set up the
 
6327
    reader appropriate.
 
6328
 
 
6329
    \sa QXmlSimpleReader
 
6330
*/
 
6331
bool QDomDocument::setContent( QXmlInputSource *source, QXmlReader *reader, QString *errorMsg, int *errorLine, int *errorColumn  )
 
6332
{
 
6333
    if ( !impl )
 
6334
        impl = new QDomDocumentPrivate;
 
6335
    return IMPL->setContent( source, reader, errorMsg, errorLine, errorColumn );
 
6336
}
 
6337
 
 
6338
/*!
 
6339
    Converts the parsed document back to its textual representation.
 
6340
 
 
6341
    \sa toCString()
 
6342
*/
 
6343
QString QDomDocument::toString() const
 
6344
{
 
6345
    QString str;
 
6346
    QTextStream s( str, IO_WriteOnly );
 
6347
    save( s, 1 );
 
6348
 
 
6349
    return str;
 
6350
}
 
6351
 
 
6352
/*!
 
6353
    \overload
 
6354
 
 
6355
    This function uses \a indent as the amount of space to indent
 
6356
    subelements.
 
6357
*/
 
6358
QString QDomDocument::toString( int indent ) const
 
6359
{
 
6360
    QString str;
 
6361
    QTextStream s( str, IO_WriteOnly );
 
6362
    save( s, indent );
 
6363
 
 
6364
    return str;
 
6365
}
 
6366
 
 
6367
/*!
 
6368
    Converts the parsed document back to its textual representation
 
6369
    and returns a QCString for that is encoded in UTF-8.
 
6370
 
 
6371
    \sa toString()
 
6372
*/
 
6373
QCString QDomDocument::toCString() const
 
6374
{
 
6375
    // ### if there is an encoding specified in the xml declaration, this
 
6376
    // encoding declaration should be changed to utf8
 
6377
    return toString().utf8();
 
6378
}
 
6379
 
 
6380
/*!
 
6381
    \overload
 
6382
 
 
6383
    This function uses \a indent as the amount of space to indent
 
6384
    subelements.
 
6385
*/
 
6386
QCString QDomDocument::toCString( int indent ) const
 
6387
{
 
6388
    // ### if there is an encoding specified in the xml declaration, this
 
6389
    // encoding declaration should be changed to utf8
 
6390
    return toString( indent ).utf8();
 
6391
}
 
6392
 
 
6393
 
 
6394
/*!
 
6395
    Returns the document type of this document.
 
6396
*/
 
6397
QDomDocumentType QDomDocument::doctype() const
 
6398
{
 
6399
    if ( !impl )
 
6400
        return QDomDocumentType();
 
6401
    return QDomDocumentType( IMPL->doctype() );
 
6402
}
 
6403
 
 
6404
/*!
 
6405
    Returns a QDomImplementation object.
 
6406
*/
 
6407
QDomImplementation QDomDocument::implementation() const
 
6408
{
 
6409
    if ( !impl )
 
6410
        return QDomImplementation();
 
6411
    return QDomImplementation( IMPL->implementation() );
 
6412
}
 
6413
 
 
6414
/*!
 
6415
    Returns the root element of the document.
 
6416
*/
 
6417
QDomElement QDomDocument::documentElement() const
 
6418
{
 
6419
    if ( !impl )
 
6420
        return QDomElement();
 
6421
    return QDomElement( IMPL->documentElement() );
 
6422
}
 
6423
 
 
6424
/*!
 
6425
    Creates a new element called \a tagName that can be inserted into
 
6426
    the DOM tree, e.g. using QDomNode::appendChild().
 
6427
 
 
6428
    \sa createElementNS() QDomNode::appendChild() QDomNode::insertBefore()
 
6429
    QDomNode::insertAfter()
 
6430
*/
 
6431
QDomElement QDomDocument::createElement( const QString& tagName )
 
6432
{
 
6433
    if ( !impl )
 
6434
        return QDomElement();
 
6435
    return QDomElement( IMPL->createElement( tagName ) );
 
6436
}
 
6437
 
 
6438
/*!
 
6439
    Creates a new document fragment, that can be used to hold parts of
 
6440
    the document, e.g. when doing complex manipulations of the
 
6441
    document tree.
 
6442
*/
 
6443
QDomDocumentFragment QDomDocument::createDocumentFragment()
 
6444
{
 
6445
    if ( !impl )
 
6446
        return QDomDocumentFragment();
 
6447
    return QDomDocumentFragment( IMPL->createDocumentFragment() );
 
6448
}
 
6449
 
 
6450
/*!
 
6451
    Creates a text node for the string \a value that can be inserted
 
6452
    into the document tree, e.g. using QDomNode::appendChild().
 
6453
 
 
6454
    \sa QDomNode::appendChild() QDomNode::insertBefore() QDomNode::insertAfter()
 
6455
*/
 
6456
QDomText QDomDocument::createTextNode( const QString& value )
 
6457
{
 
6458
    if ( !impl )
 
6459
        return QDomText();
 
6460
    return QDomText( IMPL->createTextNode( value ) );
 
6461
}
 
6462
 
 
6463
/*!
 
6464
    Creates a new comment for the string \a value that can be inserted
 
6465
    into the document, e.g. using QDomNode::appendChild().
 
6466
 
 
6467
    \sa QDomNode::appendChild() QDomNode::insertBefore() QDomNode::insertAfter()
 
6468
*/
 
6469
QDomComment QDomDocument::createComment( const QString& value )
 
6470
{
 
6471
    if ( !impl )
 
6472
        return QDomComment();
 
6473
    return QDomComment( IMPL->createComment( value ) );
 
6474
}
 
6475
 
 
6476
/*!
 
6477
    Creates a new CDATA section for the string \a value that can be
 
6478
    inserted into the document, e.g. using QDomNode::appendChild().
 
6479
 
 
6480
    \sa QDomNode::appendChild() QDomNode::insertBefore() QDomNode::insertAfter()
 
6481
*/
 
6482
QDomCDATASection QDomDocument::createCDATASection( const QString& value )
 
6483
{
 
6484
    if ( !impl )
 
6485
        return QDomCDATASection();
 
6486
    return QDomCDATASection( IMPL->createCDATASection( value ) );
 
6487
}
 
6488
 
 
6489
/*!
 
6490
    Creates a new processing instruction that can be inserted into the
 
6491
    document, e.g. using QDomNode::appendChild(). This function sets
 
6492
    the target for the processing instruction to \a target and the
 
6493
    data to \a data.
 
6494
 
 
6495
    \sa QDomNode::appendChild() QDomNode::insertBefore() QDomNode::insertAfter()
 
6496
*/
 
6497
QDomProcessingInstruction QDomDocument::createProcessingInstruction( const QString& target,
 
6498
                                                                     const QString& data )
 
6499
{
 
6500
    if ( !impl )
 
6501
        return QDomProcessingInstruction();
 
6502
    return QDomProcessingInstruction( IMPL->createProcessingInstruction( target, data ) );
 
6503
}
 
6504
 
 
6505
 
 
6506
/*!
 
6507
    Creates a new attribute called \a name that can be inserted into
 
6508
    an element, e.g. using QDomElement::setAttributeNode().
 
6509
 
 
6510
    \sa createAttributeNS()
 
6511
*/
 
6512
QDomAttr QDomDocument::createAttribute( const QString& name )
 
6513
{
 
6514
    if ( !impl )
 
6515
        return QDomAttr();
 
6516
    return QDomAttr( IMPL->createAttribute( name ) );
 
6517
}
 
6518
 
 
6519
/*!
 
6520
    Creates a new entity reference called \a name that can be inserted
 
6521
    into the document, e.g. using QDomNode::appendChild().
 
6522
 
 
6523
    \sa QDomNode::appendChild() QDomNode::insertBefore() QDomNode::insertAfter()
 
6524
*/
 
6525
QDomEntityReference QDomDocument::createEntityReference( const QString& name )
 
6526
{
 
6527
    if ( !impl )
 
6528
        return QDomEntityReference();
 
6529
    return QDomEntityReference( IMPL->createEntityReference( name ) );
 
6530
}
 
6531
 
 
6532
/*!
 
6533
    Returns a QDomNodeList, that contains all the elements in the
 
6534
    document with the name \a tagname. The order of the node list is
 
6535
    the order they are encountered in a preorder traversal of the
 
6536
    element tree.
 
6537
 
 
6538
    \sa elementsByTagNameNS() QDomElement::elementsByTagName()
 
6539
*/
 
6540
QDomNodeList QDomDocument::elementsByTagName( const QString& tagname ) const
 
6541
{
 
6542
    return QDomNodeList( new QDomNodeListPrivate( impl, tagname ) );
 
6543
}
 
6544
 
 
6545
/*!
 
6546
    Imports the node \a importedNode from another document to this
 
6547
    document. \a importedNode remains in the original document; this
 
6548
    function creates a copy that can be used within this document.
 
6549
 
 
6550
    This function returns the imported node that belongs to this
 
6551
    document. The returned node has no parent. It is not possible to
 
6552
    import QDomDocument and QDomDocumentType nodes. In those cases
 
6553
    this function returns a \link QDomNode::isNull() null node\endlink.
 
6554
 
 
6555
    If \a deep is TRUE, this function imports not only the node \a
 
6556
    importedNode but its whole subtree; if it is FALSE, only the \a
 
6557
    importedNode is imported. The argument \a deep has no effect on
 
6558
    QDomAttr and QDomEntityReference nodes, since the descendents of
 
6559
    QDomAttr nodes are always imported and those of
 
6560
    QDomEntityReference nodes are never imported.
 
6561
 
 
6562
    The behavior of this function is slightly different depending on
 
6563
    the node types:
 
6564
    \table
 
6565
    \header \i Node Type \i Behaviour
 
6566
    \row \i QDomAttr
 
6567
         \i The owner element is set to 0 and the specified flag is
 
6568
            set to TRUE in the generated attribute. The whole subtree
 
6569
            of \a importedNode is always imported for attribute nodes:
 
6570
            \a deep has no effect.
 
6571
    \row \i QDomDocument
 
6572
         \i Document nodes cannot be imported.
 
6573
    \row \i QDomDocumentFragment
 
6574
         \i If \a deep is TRUE, this function imports the whole
 
6575
            document fragment; otherwise it only generates an empty
 
6576
            document fragment.
 
6577
    \row \i QDomDocumentType
 
6578
         \i Document type nodes cannot be imported.
 
6579
    \row \i QDomElement
 
6580
         \i Attributes for which QDomAttr::specified() is TRUE are
 
6581
            also imported, other attributes are not imported. If \a
 
6582
            deep is TRUE, this function also imports the subtree of \a
 
6583
            importedNode; otherwise it imports only the element node
 
6584
            (and some attributes, see above).
 
6585
    \row \i QDomEntity
 
6586
         \i Entity nodes can be imported, but at the moment there is
 
6587
            no way to use them since the document type is read-only in
 
6588
            DOM level 2.
 
6589
    \row \i QDomEntityReference
 
6590
         \i Descendents of entity reference nodes are never imported:
 
6591
            \a deep has no effect.
 
6592
    \row \i QDomNotation
 
6593
         \i Notation nodes can be imported, but at the moment there is
 
6594
            no way to use them since the document type is read-only in
 
6595
            DOM level 2.
 
6596
    \row \i QDomProcessingInstruction
 
6597
         \i The target and value of the processing instruction is
 
6598
            copied to the new node.
 
6599
    \row \i QDomText
 
6600
         \i The text is copied to the new node.
 
6601
    \row \i QDomCDATASection
 
6602
         \i The text is copied to the new node.
 
6603
    \row \i QDomComment
 
6604
         \i The text is copied to the new node.
 
6605
    \endtable
 
6606
 
 
6607
    \sa QDomElement::setAttribute() QDomNode::insertBefore()
 
6608
        QDomNode::insertAfter() QDomNode::replaceChild() QDomNode::removeChild()
 
6609
        QDomNode::appendChild()
 
6610
*/
 
6611
QDomNode QDomDocument::importNode( const QDomNode& importedNode, bool deep )
 
6612
{
 
6613
    if ( !impl )
 
6614
        return QDomNode();
 
6615
    return QDomNode( IMPL->importNode( importedNode.impl, deep ) );
 
6616
}
 
6617
 
 
6618
/*!
 
6619
    Creates a new element with namespace support that can be inserted
 
6620
    into the DOM tree. The name of the element is \a qName and the
 
6621
    namespace URI is \a nsURI. This function also sets
 
6622
    QDomNode::prefix() and QDomNode::localName() to appropriate values
 
6623
    (depending on \a qName).
 
6624
 
 
6625
    \sa createElement()
 
6626
*/
 
6627
QDomElement QDomDocument::createElementNS( const QString& nsURI, const QString& qName )
 
6628
{
 
6629
    if ( !impl )
 
6630
        return QDomElement();
 
6631
    return QDomElement( IMPL->createElementNS( nsURI, qName ) );
 
6632
}
 
6633
 
 
6634
/*!
 
6635
    Creates a new attribute with namespace support that can be
 
6636
    inserted into an element. The name of the attribute is \a qName
 
6637
    and the namespace URI is \a nsURI. This function also sets
 
6638
    QDomNode::prefix() and QDomNode::localName() to appropriate values
 
6639
    (depending on \a qName).
 
6640
 
 
6641
    \sa createAttribute()
 
6642
*/
 
6643
QDomAttr QDomDocument::createAttributeNS( const QString& nsURI, const QString& qName )
 
6644
{
 
6645
    if ( !impl )
 
6646
        return QDomAttr();
 
6647
    return QDomAttr( IMPL->createAttributeNS( nsURI, qName ) );
 
6648
}
 
6649
 
 
6650
/*!
 
6651
    Returns a QDomNodeList that contains all the elements in the
 
6652
    document with the local name \a localName and a namespace URI of
 
6653
    \a nsURI. The order of the node list is the order they are
 
6654
    encountered in a preorder traversal of the element tree.
 
6655
 
 
6656
    \sa elementsByTagName() QDomElement::elementsByTagNameNS()
 
6657
*/
 
6658
QDomNodeList QDomDocument::elementsByTagNameNS( const QString& nsURI, const QString& localName )
 
6659
{
 
6660
    return QDomNodeList( new QDomNodeListPrivate( impl, nsURI, localName ) );
 
6661
}
 
6662
 
 
6663
/*!
 
6664
    Returns the element whose ID is equal to \a elementId. If no
 
6665
    element with the ID was found, this function returns a \link
 
6666
    QDomNode::isNull() null element\endlink.
 
6667
 
 
6668
    Since the QDomClasses do not know which attributes are element
 
6669
    IDs, this function returns always a \link QDomNode::isNull() null
 
6670
    element\endlink. This may change in a future version.
 
6671
*/
 
6672
QDomElement QDomDocument::elementById( const QString& /*elementId*/ )
 
6673
{
 
6674
    return QDomElement();
 
6675
}
 
6676
 
 
6677
/*!
 
6678
    Returns \c DocumentNode.
 
6679
*/
 
6680
QDomNode::NodeType QDomDocument::nodeType() const
 
6681
{
 
6682
    return DocumentNode;
 
6683
}
 
6684
 
 
6685
/*!
 
6686
    Returns TRUE.
 
6687
*/
 
6688
bool QDomDocument::isDocument() const
 
6689
{
 
6690
    return TRUE;
 
6691
}
 
6692
 
 
6693
 
 
6694
#undef IMPL
 
6695
 
 
6696
/**************************************************************
 
6697
 *
 
6698
 * Node casting functions
 
6699
 *
 
6700
 **************************************************************/
 
6701
 
 
6702
/*!
 
6703
    Converts a QDomNode into a QDomAttr. If the node is not an
 
6704
    attribute, the returned object will be \link QDomNode::isNull()
 
6705
    null\endlink.
 
6706
 
 
6707
    \sa isAttr()
 
6708
*/
 
6709
QDomAttr QDomNode::toAttr()
 
6710
{
 
6711
    if ( impl && impl->isAttr() )
 
6712
        return QDomAttr( ((QDomAttrPrivate*)impl) );
 
6713
    return QDomAttr();
 
6714
}
 
6715
 
 
6716
/*!
 
6717
    Converts a QDomNode into a QDomCDATASection. If the node is not a
 
6718
    CDATA section, the returned object will be \link
 
6719
    QDomNode::isNull() null\endlink.
 
6720
 
 
6721
    \sa isCDATASection()
 
6722
*/
 
6723
QDomCDATASection QDomNode::toCDATASection()
 
6724
{
 
6725
    if ( impl && impl->isCDATASection() )
 
6726
        return QDomCDATASection( ((QDomCDATASectionPrivate*)impl) );
 
6727
    return QDomCDATASection();
 
6728
}
 
6729
 
 
6730
/*!
 
6731
    Converts a QDomNode into a QDomDocumentFragment. If the node is
 
6732
    not a document fragment the returned object will be \link
 
6733
    QDomNode::isNull() null\endlink.
 
6734
 
 
6735
    \sa isDocumentFragment()
 
6736
*/
 
6737
QDomDocumentFragment QDomNode::toDocumentFragment()
 
6738
{
 
6739
    if ( impl && impl->isDocumentFragment() )
 
6740
        return QDomDocumentFragment( ((QDomDocumentFragmentPrivate*)impl) );
 
6741
    return QDomDocumentFragment();
 
6742
}
 
6743
 
 
6744
/*!
 
6745
    Converts a QDomNode into a QDomDocument. If the node is not a
 
6746
    document the returned object will be \link QDomNode::isNull()
 
6747
    null\endlink.
 
6748
 
 
6749
    \sa isDocument()
 
6750
*/
 
6751
QDomDocument QDomNode::toDocument()
 
6752
{
 
6753
    if ( impl && impl->isDocument() )
 
6754
        return QDomDocument( ((QDomDocumentPrivate*)impl) );
 
6755
    return QDomDocument();
 
6756
}
 
6757
 
 
6758
/*!
 
6759
    Converts a QDomNode into a QDomDocumentType. If the node is not a
 
6760
    document type the returned object will be \link QDomNode::isNull()
 
6761
    null\endlink.
 
6762
 
 
6763
    \sa isDocumentType()
 
6764
*/
 
6765
QDomDocumentType QDomNode::toDocumentType()
 
6766
{
 
6767
    if ( impl && impl->isDocumentType() )
 
6768
        return QDomDocumentType( ((QDomDocumentTypePrivate*)impl) );
 
6769
    return QDomDocumentType();
 
6770
}
 
6771
 
 
6772
/*!
 
6773
    Converts a QDomNode into a QDomElement. If the node is not an
 
6774
    element the returned object will be \link QDomNode::isNull()
 
6775
    null\endlink.
 
6776
 
 
6777
    \sa isElement()
 
6778
*/
 
6779
QDomElement QDomNode::toElement()
 
6780
{
 
6781
    if ( impl && impl->isElement() )
 
6782
        return QDomElement( ((QDomElementPrivate*)impl) );
 
6783
    return QDomElement();
 
6784
}
 
6785
 
 
6786
/*!
 
6787
    Converts a QDomNode into a QDomEntityReference. If the node is not
 
6788
    an entity reference, the returned object will be \link
 
6789
    QDomNode::isNull() null\endlink.
 
6790
 
 
6791
    \sa isEntityReference()
 
6792
*/
 
6793
QDomEntityReference QDomNode::toEntityReference()
 
6794
{
 
6795
    if ( impl && impl->isEntityReference() )
 
6796
        return QDomEntityReference( ((QDomEntityReferencePrivate*)impl) );
 
6797
    return QDomEntityReference();
 
6798
}
 
6799
 
 
6800
/*!
 
6801
    Converts a QDomNode into a QDomText. If the node is not a text,
 
6802
    the returned object will be \link QDomNode::isNull() null\endlink.
 
6803
 
 
6804
    \sa isText()
 
6805
*/
 
6806
QDomText QDomNode::toText()
 
6807
{
 
6808
    if ( impl && impl->isText() )
 
6809
        return QDomText( ((QDomTextPrivate*)impl) );
 
6810
    return QDomText();
 
6811
}
 
6812
 
 
6813
/*!
 
6814
    Converts a QDomNode into a QDomEntity. If the node is not an
 
6815
    entity the returned object will be \link QDomNode::isNull()
 
6816
    null\endlink.
 
6817
 
 
6818
    \sa isEntity()
 
6819
*/
 
6820
QDomEntity QDomNode::toEntity()
 
6821
{
 
6822
    if ( impl && impl->isEntity() )
 
6823
        return QDomEntity( ((QDomEntityPrivate*)impl) );
 
6824
    return QDomEntity();
 
6825
}
 
6826
 
 
6827
/*!
 
6828
    Converts a QDomNode into a QDomNotation. If the node is not a
 
6829
    notation the returned object will be \link QDomNode::isNull()
 
6830
    null\endlink.
 
6831
 
 
6832
    \sa isNotation()
 
6833
*/
 
6834
QDomNotation QDomNode::toNotation()
 
6835
{
 
6836
    if ( impl && impl->isNotation() )
 
6837
        return QDomNotation( ((QDomNotationPrivate*)impl) );
 
6838
    return QDomNotation();
 
6839
}
 
6840
 
 
6841
/*!
 
6842
    Converts a QDomNode into a QDomProcessingInstruction. If the node
 
6843
    is not a processing instruction the returned object will be \link
 
6844
    QDomNode::isNull() null\endlink.
 
6845
 
 
6846
    \sa isProcessingInstruction()
 
6847
*/
 
6848
QDomProcessingInstruction QDomNode::toProcessingInstruction()
 
6849
{
 
6850
    if ( impl && impl->isProcessingInstruction() )
 
6851
        return QDomProcessingInstruction( ((QDomProcessingInstructionPrivate*)impl) );
 
6852
    return QDomProcessingInstruction();
 
6853
}
 
6854
 
 
6855
/*!
 
6856
    Converts a QDomNode into a QDomCharacterData. If the node is not a
 
6857
    character data node the returned object will be \link
 
6858
    QDomNode::isNull() null\endlink.
 
6859
 
 
6860
    \sa isCharacterData()
 
6861
*/
 
6862
QDomCharacterData QDomNode::toCharacterData()
 
6863
{
 
6864
    if ( impl && impl->isCharacterData() )
 
6865
        return QDomCharacterData( ((QDomCharacterDataPrivate*)impl) );
 
6866
    return QDomCharacterData();
 
6867
}
 
6868
 
 
6869
/*!
 
6870
    Converts a QDomNode into a QDomComment. If the node is not a
 
6871
    comment the returned object will be \link QDomNode::isNull()
 
6872
    null\endlink.
 
6873
 
 
6874
    \sa isComment()
 
6875
*/
 
6876
QDomComment QDomNode::toComment()
 
6877
{
 
6878
    if ( impl && impl->isComment() )
 
6879
        return QDomComment( ((QDomCommentPrivate*)impl) );
 
6880
    return QDomComment();
 
6881
}
 
6882
 
 
6883
/**************************************************************
 
6884
 *
 
6885
 * QDomHandler
 
6886
 *
 
6887
 **************************************************************/
 
6888
 
 
6889
QDomHandler::QDomHandler( QDomDocumentPrivate* adoc, bool namespaceProcessing )
 
6890
{
 
6891
    doc = adoc;
 
6892
    node = doc;
 
6893
    cdata = FALSE;
 
6894
    nsProcessing = namespaceProcessing;
 
6895
}
 
6896
 
 
6897
QDomHandler::~QDomHandler()
 
6898
{
 
6899
}
 
6900
 
 
6901
bool QDomHandler::endDocument()
 
6902
{
 
6903
    // ### is this really necessary? (rms)
 
6904
    if ( node != doc )
 
6905
        return FALSE;
 
6906
    return TRUE;
 
6907
}
 
6908
 
 
6909
bool QDomHandler::startDTD( const QString& name, const QString& publicId, const QString& systemId )
 
6910
{
 
6911
    doc->doctype()->name = name;
 
6912
    doc->doctype()->publicId = publicId;
 
6913
    doc->doctype()->systemId = systemId;
 
6914
    return TRUE;
 
6915
}
 
6916
 
 
6917
bool QDomHandler::startElement( const QString& nsURI, const QString&, const QString& qName, const QXmlAttributes& atts )
 
6918
{
 
6919
    // tag name
 
6920
    QDomNodePrivate* n;
 
6921
    if ( nsProcessing ) {
 
6922
        n = doc->createElementNS( nsURI, qName );
 
6923
    } else {
 
6924
        n = doc->createElement( qName );
 
6925
    }
 
6926
    node->appendChild( n );
 
6927
    node = n;
 
6928
 
 
6929
    // attributes
 
6930
    for ( int i=0; i<atts.length(); i++ )
 
6931
    {
 
6932
        if ( nsProcessing ) {
 
6933
            ((QDomElementPrivate*)node)->setAttributeNS( atts.uri(i), atts.qName(i), atts.value(i) );
 
6934
        } else {
 
6935
            ((QDomElementPrivate*)node)->setAttribute( atts.qName(i), atts.value(i) );
 
6936
        }
 
6937
    }
 
6938
 
 
6939
    return TRUE;
 
6940
}
 
6941
 
 
6942
bool QDomHandler::endElement( const QString&, const QString&, const QString& )
 
6943
{
 
6944
    if ( node == doc )
 
6945
        return FALSE;
 
6946
    node = node->parent();
 
6947
 
 
6948
    return TRUE;
 
6949
}
 
6950
 
 
6951
bool QDomHandler::characters( const QString&  ch )
 
6952
{
 
6953
    // No text as child of some document
 
6954
    if ( node == doc )
 
6955
        return FALSE;
 
6956
 
 
6957
    if ( cdata ) {
 
6958
        node->appendChild( doc->createCDATASection( ch ) );
 
6959
    } else if ( !entityName.isEmpty() ) {
 
6960
        QDomEntityPrivate* e = new QDomEntityPrivate( doc, 0, entityName,
 
6961
                QString::null, QString::null, QString::null );
 
6962
        e->value = ch;
 
6963
        doc->doctype()->appendChild( e );
 
6964
        node->appendChild( doc->createEntityReference( entityName ) );
 
6965
    } else {
 
6966
        node->appendChild( doc->createTextNode( ch ) );
 
6967
    }
 
6968
 
 
6969
    return TRUE;
 
6970
}
 
6971
 
 
6972
bool QDomHandler::processingInstruction( const QString& target, const QString& data )
 
6973
{
 
6974
    node->appendChild( doc->createProcessingInstruction( target, data ) );
 
6975
    return TRUE;
 
6976
}
 
6977
 
 
6978
bool QDomHandler::skippedEntity( const QString& name )
 
6979
{
 
6980
    node->appendChild( doc->createEntityReference( name ) );
 
6981
    return TRUE;
 
6982
}
 
6983
 
 
6984
bool QDomHandler::fatalError( const QXmlParseException& exception )
 
6985
{
 
6986
    errorMsg = exception.message();
 
6987
    errorLine =  exception.lineNumber();
 
6988
    errorColumn =  exception.columnNumber();
 
6989
    return QXmlDefaultHandler::fatalError( exception );
 
6990
}
 
6991
 
 
6992
bool QDomHandler::startCDATA()
 
6993
{
 
6994
    cdata = TRUE;
 
6995
    return TRUE;
 
6996
}
 
6997
 
 
6998
bool QDomHandler::endCDATA()
 
6999
{
 
7000
    cdata = FALSE;
 
7001
    return TRUE;
 
7002
}
 
7003
 
 
7004
bool QDomHandler::startEntity( const QString &name )
 
7005
{
 
7006
    entityName = name;
 
7007
    return TRUE;
 
7008
}
 
7009
 
 
7010
bool QDomHandler::endEntity( const QString & )
 
7011
{
 
7012
    entityName = QString::null;
 
7013
    return TRUE;
 
7014
}
 
7015
 
 
7016
bool QDomHandler::comment( const QString& ch )
 
7017
{
 
7018
    node->appendChild( doc->createComment( ch ) );
 
7019
    return TRUE;
 
7020
}
 
7021
 
 
7022
bool QDomHandler::unparsedEntityDecl( const QString &name, const QString &publicId, const QString &systemId, const QString &notationName )
 
7023
{
 
7024
    QDomEntityPrivate* e = new QDomEntityPrivate( doc, 0, name,
 
7025
            publicId, systemId, notationName );
 
7026
    doc->doctype()->appendChild( e );
 
7027
    return TRUE;
 
7028
}
 
7029
 
 
7030
bool QDomHandler::externalEntityDecl( const QString &name, const QString &publicId, const QString &systemId )
 
7031
{
 
7032
    return unparsedEntityDecl( name, publicId, systemId, QString::null );
 
7033
}
 
7034
 
 
7035
bool QDomHandler::notationDecl( const QString & name, const QString & publicId, const QString & systemId )
 
7036
{
 
7037
    QDomNotationPrivate* n = new QDomNotationPrivate( doc, 0, name, publicId, systemId );
 
7038
    doc->doctype()->appendChild( n );
 
7039
    return TRUE;
 
7040
}
 
7041
 
 
7042
} // namespace PsiXml
 
7043
 
 
7044
#endif //QT_NO_DOM