00001
00002
00003
00004
00005
00006
00007 #ifndef BALL_FORMAT_INIFILE_H
00008 #define BALL_FORMAT_INIFILE_H
00009
00010 #ifndef BALL_DATATYPE_STRINGHASHMAP_H
00011 # include <BALL/DATATYPE/stringHashMap.h>
00012 #endif
00013
00014 #ifndef BALL_CONCEPT_PROCESSOR_H
00015 # include <BALL/CONCEPT/processor.h>
00016 #endif
00017
00018 namespace BALL
00019 {
00020 class INIFile;
00021
00028 class BALL_EXPORT INIFile
00029 {
00030 public:
00031
00034 enum
00035 {
00038 MAX_LINE_LENGTH = 1048576
00039 };
00040
00041 class IteratorTraits_;
00042
00044 class BALL_EXPORT Section
00045 {
00046 public:
00047
00048 friend class INIFile;
00049 friend class IteratorTraits_;
00050
00052 const String& getName() const
00053 {
00054 return name_;
00055 }
00056
00058 bool operator == (const Section& section) const
00059 {
00060 return (name_ == section.name_ &&
00061 lines_ == section.lines_);
00062 }
00063
00065 bool operator < (const Section& section) const
00066 ;
00067
00069 bool operator > (const Section& section) const
00070 ;
00071
00072 protected:
00073
00074
00075 String name_;
00076
00077
00078 std::list<String> lines_;
00079
00080
00081 StringHashMap<std::list<String>::iterator> key_map_;
00082 };
00083
00085 typedef std::list<Section>::iterator SectionIterator;
00086
00091 typedef IteratorTraits_ LineIterator;
00092
00096 static const String UNDEFINED;
00097
00101 static const String HEADER;
00102
00106
00111 INIFile();
00112
00116 INIFile(const String& filename);
00117
00120 virtual ~INIFile();
00121
00126 void clear();
00127
00129
00132
00152 bool read();
00153
00160 bool write();
00161
00164 const String& getFilename() const;
00165
00169 void setFilename(const String& filename);
00170
00172
00175
00179 bool isValid() const;
00180
00182
00189
00198 LineIterator getLine(Size line_number);
00199
00201
00205
00215 bool setLine(LineIterator line_it, const String& line);
00216
00223 bool deleteLine(LineIterator line_it);
00224
00234 bool insertLine(LineIterator line_it, const String& line);
00235
00237
00240
00256 bool appendLine(const String& section_name, const String& line);
00257
00259 bool appendLine(const String& line);
00260
00263 Size getNumberOfLines() const;
00264
00271 bool hasSection(const String& section_name) const;
00272
00278 SectionIterator getSection(const String& section_name);
00279
00284 SectionIterator getSection(Position pos);
00285
00289 Size getNumberOfSections() const;
00290
00299 LineIterator getSectionFirstLine(const String& section_name);
00300
00307 LineIterator getSectionLastLine(const String& section_name);
00308
00315 Size getSectionLength(const String& section_name) const;
00316
00322 bool deleteSection(const String& section);
00323
00327 bool appendSection(const String& section);
00328
00330
00333
00341 bool hasEntry(const String& section, const String& key) const;
00342
00352 String getValue(const String& section, const String& key) const;
00353
00364 bool setValue(const String& section, const String& key, const String& value);
00365
00375 bool insertValue(const String& section, const String& key, const String& value);
00376
00378 const INIFile& operator = (const INIFile& file)
00379 ;
00380
00382
00385
00390 bool operator == (const INIFile& inifile) const;
00391
00394 bool isValid(const LineIterator& it) const;
00395
00398 bool isValid(const SectionIterator& it) const;
00399
00401
00404 bool apply(UnaryProcessor<LineIterator>& processor);
00405
00408 void setDuplicateKeyCheck(bool mode);
00409
00412 bool duplicateKeyCheckEnabled() const;
00413
00415 std::list<String> getContent() const
00416 ;
00417
00419 bool setContent(const std::list<String>& lines)
00420 ;
00421
00422 protected:
00423
00424 bool check_duplicate_keys_;
00425
00426 bool valid_;
00427
00428 String filename_;
00429
00430
00431 std::list<Section> sections_;
00432
00433
00434 StringHashMap<SectionIterator> section_index_;
00435
00436 public:
00437
00439 class BALL_EXPORT IteratorTraits_
00440 {
00441 friend class INIFile;
00442
00443 public:
00444
00445 BALL_CREATE(IteratorTraits_)
00446
00447
00448 IteratorTraits_();
00449
00451 IteratorTraits_(const IteratorTraits_& traits);
00452
00454 virtual ~IteratorTraits_();
00455
00457 const IteratorTraits_& operator = (const IteratorTraits_ &traits);
00458
00460 std::list<String>::iterator getPosition();
00461
00463 SectionIterator getSection();
00464
00466 const String& operator * () const;
00467
00469 IteratorTraits_& operator ++ ();
00470
00472 IteratorTraits_& operator -- ();
00473
00475 IteratorTraits_& getSectionNextLine();
00476
00478 bool operator == (const IteratorTraits_& traits) const;
00479
00481 bool operator != (const IteratorTraits_& traits) const;
00482
00484 bool operator + () const;
00485
00487 bool isValid() const;
00488
00490 void toSectionFirstLine();
00491
00493 void toSectionLastLine();
00494
00496 void toSectionEnd();
00497
00499 bool isSectionFirstLine() const;
00500
00502 bool isSectionLastLine() const;
00503
00505 bool isSectionEnd() const;
00506
00508 void toFirstLine();
00509
00511 void toLastLine();
00512
00514 void toEnd();
00515
00516 protected:
00517
00518
00519 IteratorTraits_(std::list<Section>& list,
00520 SectionIterator section,
00521 std::list<String>::iterator line);
00522
00523
00524 const std::list<Section>* getBound_() const;
00525
00526
00527 void setLine_(const String& line);
00528
00529 private:
00530
00531 std::list<Section>* bound_;
00532 SectionIterator section_;
00533 std::list<String>::iterator position_;
00534 };
00535 };
00536 }
00537
00538 #endif // BALL_FORMAT_INIFILE_H