root/trunk/CConfigFile.h

Revision 14, 6.2 kB (checked in by sagrer, 4 months ago)

Поковырял код на предмет понять "где что есть". Заодно добавил везде шапку и вбил дополнительно в конфиг проекта те модули, которые вбиты не были - чтобы можно было быстро открыть любой файл через окно менеджера проекта.

Line 
1 ///////////////////////////////////////////////////////////
2 //                        TexGen                         //
3 //          утилита для подготовки текстур рельефа       //
4 //               для игры Проклятые Земли                //
5 //           Copyright (C) 2007-2008 Gipat Group         //
6 //              Распространяется на условиях             //
7 //    Gipat Group's opened EI-editor-utility license     //
8 //                      версии 1.0                       //
9 //                                                       //
10 //                  www.gipatgroup.org                   //
11 ///////////////////////////////////////////////////////////
12
13 //К работе над данным файлом приложили руки, ноги.... короче аффтары:
14 // 1) Снайпер (sniper-rifle@rambler.ru)
15
16 ////////////////////////////////////////////////////////////////////////
17
18 #ifndef CConfigFileH
19 #define CConfigFileH
20
21 #include <dstring.h>
22 #include <stddef.h>
23 #include <StrUtils.hpp>
24 #include <SysUtils.hpp>
25 #include <stdio.h>
26
27 //Некоторые константы:
28 const AnsiString IniVersion = "1";    //Константа для проверки версии файла
29 const AnsiString IniDefault = "Default"; //Просто константа %) А что, нельзя? ;)
30
31
32 class CConfigFile
33 {
34 private:
35         struct ValueChain    // Цепь пар "параметр - значения"
36         {
37           AnsiString Name,Value;
38           ValueChain *Next;
39         };
40         struct SectionsChain //Цепь секций
41         {
42           AnsiString Name;
43           ValueChain *Start;
44           SectionsChain *Next;
45         };
46
47         //Здесь лежат контейнеры данных, над которыми работают открытые методы.
48         AnsiString IniComment;                                                  //Комментарии, которые будут лежать в ini до начала полезных данных
49
50         void RemoveValues(ValueChain *Start);                                   //Нужно удалить все значения, которые были у раздела, при его удалении.
51         void RemoveAllSect();                                                   //Нужно очистить объект от данных
52         SectionsChain *DataStart;
53
54 public:
55        CConfigFile(){DataStart=NULL;IniComment="";}
56        ~CConfigFile(){RemoveAllSect();}
57
58        //По всему файлу
59        void LoadConfig(AnsiString FileName);                                   //Загружаем всю инфу из файла
60        void SaveConfig(AnsiString FileName);                                   //Савим данные в файл
61        //По секциям
62        bool SectionExists(AnsiString Name);                                    //Проверяем существование секции (раздела)
63        void AddSection(AnsiString Name);                                       //Добавляем запись о новой секции в список
64        void DelSection(AnsiString Name);                                       //Удаляем секцию, а так же всю её информацию...
65        void RenameSection(AnsiString Name, AnsiString NewName);               //Меняем имя раздела. Всё просто.
66        //По значениям
67        bool ValueExists(AnsiString Section, AnsiString ValueName);            //Проверяем, существует ли значение с заданным именем
68        void AddValue(AnsiString Section, AnsiString ValueName, AnsiString Value = "");//Добавляет параметр в секцию. Весьма удобно...
69        void DelValue(AnsiString Section, AnsiString ValueName);               //Удаляет из секции первое вхождение параметра, хотя предполагается что их не будет >1
70        void RenameValue(AnsiString Section, AnsiString OldName, AnsiString NewName);//Переименовывает параметр
71        void SetValue(AnsiString Section, AnsiString ValueName, AnsiString NewVal);//Задаёт значение параметра
72        AnsiString GetValue(AnsiString Section, AnsiString ValueName);         //Возвращает значение параметра. При ошибке возвращает пустую строку.
73        AnsiString GetValueEx(AnsiString Section, AnsiString ValueName, AnsiString Default); // Упрощенная процедура if...then
74        AnsiString GetComment(){return IniComment;}                              //Возвращает комментарии к файлу настроек
75        void SetComment(AnsiString NewComm){IniComment = NewComm;}             //Задаёт новый комментарий к файле настроек.
76
77        void UpgradeProgaIni();
78
79        void Debug();
80 };
81
82 class CStringChain
83 //Просто цепь стрингов. Эдакий двунаправленный список облегчённого вида %)
84 {
85 private:
86 public:
87   CStringChain(){Pred = Next = NULL; Item = "";};
88   CStringChain(AnsiString I){Pred = Next = NULL; Item = I;};
89  
90   AnsiString Item;
91   CStringChain *Pred;
92   CStringChain *Next;
93
94   void AddNext(AnsiString *NewItem)
95   {
96     CStringChain *X = new CStringChain;
97     X->Item = *NewItem;
98     X->Pred = this;
99     X->Next = Next;
100     Next = X;
101   }
102
103   void AddPred(AnsiString *NewItem)
104   {
105     CStringChain *X = new CStringChain;
106     X->Item = *NewItem;
107     X->Next = this;
108     X->Pred = Pred;
109     Pred = X;
110   }
111
112   void DelNext()
113   {
114     CStringChain *X = Next;
115     Next = X->Next;
116     X->Next = NULL;
117     delete X;
118   }
119
120   void DelPred()
121   {
122     CStringChain *X = Pred;
123     Pred = X->Pred;
124     X->Pred = NULL;
125     delete X;
126   }
127
128   void CopyFrom(CStringChain *Source)
129   {
130     //Метод помещает копию элементов Сурц перед текущим элементом.
131     Pred = NULL;
132     if(Next != NULL)delete Next;
133
134     while(Source != NULL)
135     {
136       AddPred(&Source->Item);
137       Source = Source->Next;
138     }
139   }
140
141   void Merge(CStringChain *Brunch)
142   {
143     //Метод приклеивает Brunch после последнего элемента
144     if(Next!=NULL)
145     {
146       Next->Merge(Brunch);
147     }
148     else
149     {
150       Next = Brunch;
151       Brunch->Pred = this;
152     }
153   }
154
155   AnsiString ToStr()
156   {
157     //Рекурсивно собираем инфу %) Хотя могли бы и в цикле конечно...
158     AnsiString Rez="";
159     if(this!=NULL)
160     {
161       Rez = Item;
162     }
163     if(Next!=NULL)
164     {
165       Rez += "\r\n"+Next->ToStr();
166     }
167     return Rez;
168   }
169
170   void FromStr(AnsiString *Source)
171   {
172     if(Source!=NULL)
173     {
174       int i=AnsiPos("\r\n",*Source);
175       if(i>0)
176       {
177         Item = LeftStr(*Source, i-1);
178         *Source = RightStr(*Source, Source->Length() - i - 1);
179         if(Next != NULL)
180         {
181           Next->FromStr(Source);
182         }
183       }
184       else
185       {
186         Item = *Source;
187         *Source="";
188       }
189     }
190   }
191
192   ~CStringChain(){if(Next != NULL)delete Next;}
193 };
194 #endif
Note: See TracBrowser for help on using the browser.