00001 #ifndef _B_XML_CONTENT_H
00002 #define _B_XML_CONTENT_H
00003
00004 #include <xml/BXMLDefs.h>
00005 #include <xml/BStringMap.h>
00006
00007 #include <String.h>
00008
00009 namespace B {
00010 namespace XML {
00011
00012
00013
00014
00015 class BXMLObject;
00016 class BNamespace;
00017 class BContent;
00018 class BNamed;
00019 class BElement;
00020 class BDocument;
00021 class BValued;
00022 class BAttribute;
00023 class BText;
00024 class BCData;
00025 class BComment;
00026 class BNamedSet;
00027 class BDocumentType;
00028 class BProcessingInstruction;
00029 class BDocumentTypeDefinition;
00030 class BDocumentTypeDefinition;
00031 class BElementDecl;
00032 class BAttributeDecl;
00033 class BEntityDecl;
00034 class BXMLObjectFactory;
00035 class BEntityStore;
00036
00037
00038
00039
00040
00041 typedef _Pointer_Set_<BElement *> ElementSet;
00042 typedef _Pointer_Set_<BXMLObject *> XMLObjectSet;
00043 typedef _Pointer_Set_<BXMLObject *> BXMLObjectSet;
00044 typedef _Pointer_Set_<BString *> _StringSet_;
00045
00046
00047
00048
00049
00050
00051 class BXMLObject
00052 {
00053 public:
00054 BXMLObject(uint32 type);
00055 virtual ~BXMLObject();
00056
00057
00058 uint32 Type() const;
00059
00060 private:
00061 uint32 _type;
00062 };
00063
00064
00065
00066
00067
00068 class BContent : public BXMLObject
00069 {
00070 public:
00071
00072
00073 BElement * Parent();
00074 const BElement * Parent() const;
00075
00076
00077
00078 BDocument * Document();
00079 const BDocument * Document() const;
00080
00081
00082
00083
00084 BContent * NextSibling();
00085 const BContent * NextSibling() const;
00086 BContent * NextSibling(uint32 typeMask);
00087 const BContent * NextSibling(uint32 typeMask) const;
00088 BContent * PreviousSibling();
00089 const BContent * PreviousSibling() const;
00090 BContent * PreviousSibling(uint32 typeMask);
00091 const BContent * PreviousSibling(uint32 typeMask) const;
00092
00093 BElement * NextSiblingElement();
00094 const BElement * NextSiblingElement() const;
00095 BElement * PreviousSiblingElement();
00096 const BElement * PreviousSiblingElement() const;
00097
00098 virtual BContent * Clone() const;
00099
00100 protected:
00101
00102
00103
00104 explicit BContent(const BContent & copy);
00105
00106
00107 BContent(uint32 type);
00108
00109 virtual ~BContent();
00110
00111 private:
00112
00113 BContent();
00114
00115 bool check_content_for_connections();
00116 status_t set_parent(BElement * parent);
00117 status_t set_next_sibling(BContent * sibling);
00118 status_t set_prev_sibling(BContent * sibling);
00119 status_t set_document(BDocument * document);
00120
00121 BElement * _parent;
00122 BContent * _nextSibling;
00123 BContent * _prevSibling;
00124 BDocument * _document;
00125
00126 friend class BElement;
00127 friend class BDocument;
00128 };
00129
00130
00131
00132
00133
00134
00135
00136 class BNamed
00137 {
00138 public:
00139 const char * Name() const;
00140
00141 virtual ~BNamed();
00142
00143 protected:
00144 explicit BNamed(const BNamed & copy);
00145
00146 BNamed(const char * name);
00147 BNamed(const BString & name);
00148 BNamed(BString & name, bool adopt = false);
00149
00150
00151 BNamespace * Namespace();
00152 const BNamespace * Namespace() const;
00153
00154 virtual void SetName(const char * name);
00155 virtual status_t SetNamespace(BNamespace * space);
00156
00157 private:
00158 BString _name;
00159 BNamespace * _namespace;
00160
00161 friend class BNamedSet;
00162 };
00163
00164
00165
00166
00167
00168
00169
00170
00171 class BNamespace : public BNamed
00172 {
00173 public:
00174 BNamespace(const BNamespace & copy);
00175 BNamespace(const char * prefix, const char * value);
00176 BNamespace(const BString & prefix, const BString & value);
00177 BNamespace(BString & prefix, BString & value, bool adopt);
00178
00179 virtual ~BNamespace();
00180
00181 const char * Value() const;
00182
00183
00184 virtual void SetDTD(BDocumentTypeDefinition * dtd);
00185
00186 const BDocumentTypeDefinition * GetDTD() const;
00187 BDocumentTypeDefinition * GetDTD();
00188
00189 private:
00190 BNamespace();
00191
00192 BString _value;
00193 BDocumentTypeDefinition * _dtd;
00194
00195 friend class BNamedSet;
00196 };
00197
00198
00199
00200
00201
00202
00203
00204 class BNamedSet
00205 {
00206 public:
00207 BNamedSet();
00208 virtual ~BNamedSet();
00209
00210 virtual status_t Add(BNamed * named);
00211 virtual void Remove(BNamed * named);
00212 virtual void Remove(int32 index);
00213 virtual BNamed * Find(const char * name);
00214 virtual const BNamed * Find(const char * name) const;
00215
00216 int32 CountItems() const;
00217 BNamed * ItemAt(int32 index);
00218 const BNamed * ItemAt(int32 index) const;
00219
00220 virtual void MakeEmpty(bool deleteData);
00221
00222 private:
00223 _Pointer_Set_<BNamed *> _data;
00224 };
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 class BElement : public BContent, public BNamed
00235 {
00236 public:
00237
00238
00239 BElement(const char * name);
00240 BElement(const BString & name);
00241 BElement(BString & name, bool adopt = false);
00242 BElement(const BElement & copy);
00243 virtual ~BElement();
00244
00245 virtual BContent * Clone() const;
00246 BElement & operator=(const BElement & copy);
00247
00248
00249
00250 virtual status_t SetNamespace(BNamespace * space);
00251 using BNamed::Namespace;
00252
00253 virtual status_t AddNamespace(BNamespace * space);
00254
00255 int32 CountNamespaces() const;
00256 BNamespace * NamespaceAt(int32 index);
00257 const BNamespace * NamespaceAt(int32 index) const;
00258
00259 BNamespace * FindNamespaceByPrefix(const char * prefix);
00260 const BNamespace * FindNamespaceByPrefix(const char * prefix) const;
00261 BNamespace * FindNamespaceByValue(const char * value);
00262 const BNamespace * FindNamespaceByValue(const char * value) const;
00263
00264
00265
00266
00267 BElement * FindNamespaceDecl(const BNamespace * space);
00268 const BElement * FindNamespaceDecl(const BNamespace * space) const;
00269
00270
00271
00272
00273
00274 BContent * FirstChild();
00275 const BContent * FirstChild() const;
00276 BContent * FirstChild(uint32 typeMask);
00277 const BContent * FirstChild(uint32 typeMask) const;
00278 BContent * LastChild();
00279 const BContent * LastChild() const;
00280 BContent * LastChild(uint32 typeMask);
00281 const BContent * LastChild(uint32 typeMask) const;
00282
00283
00284
00285 status_t FindElementNamed(const char * name, BElement ** element);
00286
00287
00288
00289 virtual status_t AddChildFirst(BContent * content);
00290
00291
00292 virtual status_t AddChildLast(BContent * content);
00293
00294
00295 virtual status_t AddChildBefore(BContent * content, BContent * before);
00296
00297
00298 virtual status_t AddChildAfter(BContent * content, BContent * after);
00299
00300
00301
00302 virtual status_t RemoveChild(BContent * content);
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313 virtual status_t AddAttribute(BAttribute * attribute, bool replace = false);
00314
00315 virtual status_t AddAttribute(const char * name, const char * val, bool replace = false);
00316 virtual status_t AddAttribute(const char * name, const BString & val, bool replace = false);
00317
00318 #if !_SMALL_XML_FOOTPRINT_
00319 virtual status_t AddAttribute(const char * name, BRect val, bool replace = false);
00320 virtual status_t AddAttribute(const char * name, BPoint val, bool replace = false);
00321 virtual status_t AddAttribute(const char * name, int8 val, bool replace = false);
00322 virtual status_t AddAttribute(const char * name, int16 val, bool replace = false);
00323 virtual status_t AddAttribute(const char * name, int32 val, bool replace = false);
00324 virtual status_t AddAttribute(const char * name, int64 val, bool replace = false);
00325 virtual status_t AddAttribute(const char * name, uint8 val, bool replace = false);
00326 virtual status_t AddAttribute(const char * name, uint16 val, bool replace = false);
00327 virtual status_t AddAttribute(const char * name, uint32 val, bool replace = false);
00328 virtual status_t AddAttribute(const char * name, uint64 val, bool replace = false);
00329 virtual status_t AddAttribute(const char * name, bool val, bool replace = false);
00330 virtual status_t AddAttribute(const char * name, float val, bool replace = false);
00331 virtual status_t AddAttribute(const char * name, double val, bool replace = false);
00332
00333 virtual status_t AddAttributeRGBColor(const char * name, rgb_color val, bool replace = false);
00334
00335 virtual status_t AddAttributeHTMLColor(const char * name, rgb_color val, bool replace = false);
00336
00337 virtual status_t AddAttributeXPath(const char * name, BContent * which, bool replace = false);
00338 #endif
00339
00340
00341
00342 int32 CountAttributes() const;
00343 BAttribute * AttributeAt(int32 index) const;
00344
00345
00346
00347 bool FindAttribute(const BAttribute * attribute) const;
00348
00349
00350 status_t FindAttribute(const char * name, BAttribute ** attribute);
00351 status_t FindAttribute(const char * name, const BAttribute ** attribute) const;
00352 status_t FindAttribute(const char * name, const char ** val) const;
00353 status_t FindAttribute(const char * name, BString * val) const;
00354
00355 #if !_SMALL_XML_FOOTPRINT_
00356 status_t FindAttribute(const char * name, BRect * val) const;
00357 status_t FindAttribute(const char * name, BPoint * val) const;
00358 status_t FindAttribute(const char * name, int8 * val) const;
00359 status_t FindAttribute(const char * name, int16 * val) const;
00360 status_t FindAttribute(const char * name, int32 * val) const;
00361 status_t FindAttribute(const char * name, int64 * val) const;
00362 status_t FindAttribute(const char * name, uint8 * val) const;
00363 status_t FindAttribute(const char * name, uint16 * val) const;
00364 status_t FindAttribute(const char * name, uint32 * val) const;
00365 status_t FindAttribute(const char * name, uint64 * val) const;
00366 status_t FindAttribute(const char * name, bool * val) const;
00367 status_t FindAttribute(const char * name, float * val) const;
00368 status_t FindAttribute(const char * name, double * val) const;
00369 status_t FindAttribute(const char * name, rgb_color * val) const;
00370
00371 status_t FindAttributeXPath(const char * name, BContent ** which);
00372 #endif
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388 bool FindAttribute(const char * name, const char ** val, const char * def) const;
00389 bool FindAttribute(const char * name, BString * val, const char * def) const;
00390
00391 #if !_SMALL_XML_FOOTPRINT_
00392 bool FindAttribute(const char * name, BRect * val, BRect def) const;
00393 bool FindAttribute(const char * name, BPoint * val, BPoint def) const;
00394 bool FindAttribute(const char * name, int8 * val, int8 def) const;
00395 bool FindAttribute(const char * name, int16 * val, int16 def) const;
00396 bool FindAttribute(const char * name, int32 * val, int32 def) const;
00397 bool FindAttribute(const char * name, int64 * val, int64 def) const;
00398 bool FindAttribute(const char * name, uint8 * val, uint8 def) const;
00399 bool FindAttribute(const char * name, uint16 * val, uint16 def) const;
00400 bool FindAttribute(const char * name, uint32 * val, uint32 def) const;
00401 bool FindAttribute(const char * name, uint64 * val, uint64 def) const;
00402 bool FindAttribute(const char * name, bool * val, bool def) const;
00403 bool FindAttribute(const char * name, float * val, float def) const;
00404 bool FindAttribute(const char * name, double * val, double def) const;
00405 bool FindAttribute(const char * name, rgb_color * val, rgb_color def) const;
00406
00407
00408 bool FindAttributeXPath(const char * name, BContent ** which, BContent * def);
00409 #endif
00410
00411
00412
00413 virtual status_t RemoveAttribute(BAttribute * attribute);
00414
00415 virtual status_t RemoveAttribute(const char * name);
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440 status_t GetData(BString * data) const;
00441
00442 #if 0 && !_SMALL_XML_FOOTPRINT_
00443 status_t GetData(BRect * data);
00444 status_t GetData(BPoint * data);
00445 status_t GetData(int8 * data);
00446 status_t GetData(int16 * data);
00447 status_t GetData(int32 * data);
00448 status_t GetData(int64 * data);
00449 status_t GetData(uint8 * data);
00450 status_t GetData(uint16 * data);
00451 status_t GetData(uint32 * data);
00452 status_t GetData(uint64 * data);
00453 status_t GetData(bool * data);
00454 status_t GetData(float * data);
00455 status_t GetData(double * data);
00456 status_t GetData(rgb_color * data);
00457 status_t GetDataXPath(BContent * pathTo);
00458
00459
00460
00461
00462 virtual status_t SetData(const char * data);
00463 virtual status_t SetData(BString * data);
00464 virtual status_t SetData(BRect * data);
00465 virtual status_t SetData(BPoint * data);
00466 virtual status_t SetData(int8 * data);
00467 virtual status_t SetData(int16 * data);
00468 virtual status_t SetData(int32 * data);
00469 virtual status_t SetData(int64 * data);
00470 virtual status_t SetData(uint8 * data);
00471 virtual status_t SetData(uint16 * data);
00472 virtual status_t SetData(uint32 * data);
00473 virtual status_t SetData(uint64 * data);
00474 virtual status_t SetData(bool * data);
00475 virtual status_t SetData(float * data);
00476 virtual status_t SetData(double * data);
00477 virtual status_t SetData(rgb_color * data);
00478
00479 virtual status_t SetDataXPath(BContent * pathTo);
00480 #endif
00481
00482
00483 private:
00484
00485 BContent * _firstChild;
00486 BContent * _lastChild;
00487 BNamedSet _attributes;
00488 BNamedSet _namespaces;
00489 };
00490
00491
00492
00493
00494
00495
00496 class BValued
00497 {
00498 public:
00499
00500
00501 status_t GetValue(const char ** value) const;
00502 status_t GetValue(BString * value) const;
00503
00504 #if !_SMALL_XML_FOOTPRINT_
00505 status_t GetValue(BRect * value) const;
00506 status_t GetValue(BPoint * value) const;
00507 status_t GetValue(int8 * value) const;
00508 status_t GetValue(int16 * value) const;
00509 status_t GetValue(int32 * value) const;
00510 status_t GetValue(int64 * value) const;
00511 status_t GetValue(uint8 * value) const;
00512 status_t GetValue(uint16 * value) const;
00513 status_t GetValue(uint32 * value) const;
00514 status_t GetValue(uint64 * value) const;
00515 status_t GetValue(bool * value) const;
00516 status_t GetValue(float * value) const;
00517 status_t GetValue(double * value) const;
00518 status_t GetValue(rgb_color * value) const;
00519 virtual status_t GetValueXPath(BContent ** pathTo);
00520 #endif
00521
00522
00523
00524 virtual void GetValueRaw(BString & value) const;
00525
00526
00527 virtual status_t SetValue(const char * value);
00528 virtual status_t SetValue(const char * value, int32 length);
00529
00530
00531
00532 virtual status_t SetValue(BString & value, bool adopt = false);
00533
00534 #if !_SMALL_XML_FOOTPRINT_
00535 virtual status_t SetValue(BRect value);
00536 virtual status_t SetValue(BPoint value);
00537 virtual status_t SetValue(int8 value);
00538 virtual status_t SetValue(int16 value);
00539 virtual status_t SetValue(int32 value);
00540 virtual status_t SetValue(int64 value);
00541 virtual status_t SetValue(uint8 value);
00542 virtual status_t SetValue(uint16 value);
00543 virtual status_t SetValue(uint32 value);
00544 virtual status_t SetValue(uint64 value);
00545 virtual status_t SetValue(bool value);
00546 virtual status_t SetValue(float value);
00547 virtual status_t SetValue(double value);
00548 virtual status_t SetValueRGBColor(rgb_color value);
00549 virtual status_t SetValueHTMLColor(rgb_color value);
00550 virtual status_t SetValueXPath(BContent * pathTo);
00551 #endif
00552
00553
00554
00555
00556 virtual status_t Append(const char * str);
00557 virtual status_t Insert(const char * str, int32 start = -1);
00558 virtual status_t Remove(int32 start = -1, int32 len = -1);
00559 virtual status_t Replace(const char * str, int32 start = 0, int32 len = -1);
00560
00561 protected:
00562
00563
00564
00565
00566
00567
00568
00569 virtual status_t ValidateValueChange(BString & newVal);
00570
00571 public:
00572 explicit BValued(const BValued & copy);
00573 BValued(const char * value);
00574 BValued(const BString & copy);
00575 BValued();
00576 virtual ~BValued();
00577
00578 protected:
00579
00580
00581 BString _value;
00582 };
00583
00584
00585
00586
00587
00588
00589
00590 class BAttribute : public BValued, public BNamed, public BXMLObject
00591 {
00592 public:
00593 BAttribute(const char * name);
00594 BAttribute(const char * name, const char * value);
00595 BAttribute(const BString & name);
00596 BAttribute(BString & name, bool adopt = false);
00597 BAttribute(const BAttribute & copy);
00598 virtual ~BAttribute();
00599 virtual BAttribute * Clone() const;
00600
00601
00602 virtual void GetValueRaw(BString & value) const;
00603
00604 virtual status_t SetNamespace(BNamespace * space);
00605 using BNamed::Namespace;
00606
00607 private:
00608 BAttribute();
00609 };
00610
00611
00612
00613
00614 class BProcessingInstruction : public BValued, public BNamed, public BContent
00615 {
00616 public:
00617 BProcessingInstruction(const char * target);
00618 BProcessingInstruction(const char * name, const char * value);
00619 BProcessingInstruction(const BString & name);
00620 BProcessingInstruction(BString & name, bool adopt = false);
00621 BProcessingInstruction(const BProcessingInstruction & copy);
00622
00623 virtual ~BProcessingInstruction();
00624
00625 virtual BProcessingInstruction * Clone() const;
00626
00627 virtual void GetValueRaw(BString & value) const;
00628 private:
00629 BProcessingInstruction();
00630 };
00631
00632
00633
00634
00635
00636 class BText : public BContent, public BValued
00637 {
00638 public:
00639 BText();
00640 BText(const BText & copy);
00641 BText(const char * value);
00642 BText(const BString & value);
00643 virtual ~BText();
00644 virtual BContent * Clone() const;
00645 };
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656 class BCData : public BContent, public BValued
00657 {
00658 public:
00659 BCData();
00660 BCData(const BCData & copy);
00661 BCData(const char * value);
00662 BCData(const BString & value);
00663 virtual ~BCData();
00664 virtual BContent * Clone() const;
00665 };
00666
00667
00668
00669
00670 class BComment : public BContent, public BValued
00671 {
00672 public:
00673 BComment();
00674 BComment(const BComment & copy);
00675 BComment(const char * value);
00676 BComment(const BString & value);
00677 virtual ~BComment();
00678 virtual BContent * Clone() const;
00679
00680
00681 virtual void GetValueRaw(BString & value) const;
00682
00683 private:
00684
00685 virtual status_t ValidateValueChange(BString & newVal);
00686 };
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698 class BDocument : public BXMLObject
00699 {
00700 public:
00701
00702
00703 BDocument();
00704 BDocument(const BDocument & copy);
00705 virtual ~BDocument();
00706
00707
00708
00709
00710
00711
00712 BContent * FirstChild();
00713 const BContent * FirstChild() const;
00714 BContent * FirstChild(uint32 typeMask);
00715 const BContent * FirstChild(uint32 typeMask) const;
00716 BContent * LastChild();
00717 const BContent * LastChild() const;
00718 BContent * LastChild(uint32 typeMask);
00719 const BContent * LastChild(uint32 typeMask) const;
00720
00721
00722 BDocumentType * DocumentType();
00723 const BDocumentType * DocumentType() const;
00724 BElement * Element();
00725 const BElement * Element() const;
00726
00727
00728
00729
00730 virtual status_t AddChildFirst(BContent * content);
00731
00732 virtual status_t AddChildLast(BContent * content);
00733
00734 virtual status_t AddChildBefore(BContent * content, BContent * before);
00735
00736 virtual status_t AddChildAfter(BContent * content, BContent * after);
00737
00738
00739
00740 virtual status_t RemoveChild(BContent * content);
00741
00742
00743
00744
00745
00746
00747
00748
00749