~sergio-br2/vbam/fixes_have-svg-icons

« back to all changes in this revision

Viewing changes to src/gtk/configfile.cpp

  • Committer: bgk
  • Date: 2008-04-20 07:28:48 UTC
  • Revision ID: svn-v4:a31d4220-a93d-0410-bf67-fe4944624d44:trunk:481
Initial version of the GTK GUI (forwardported from VBA's CVS)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
 
2
// Copyright (C) 1999-2003 Forgotten
 
3
// Copyright (C) 2004 Forgotten and the VBA development team
 
4
 
 
5
// This program is free software; you can redistribute it and/or modify
 
6
// it under the terms of the GNU General Public License as published by
 
7
// the Free Software Foundation; either version 2, or(at your option)
 
8
// any later version.
 
9
//
 
10
// This program is distributed in the hope that it will be useful,
 
11
// but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
// GNU General Public License for more details.
 
14
//
 
15
// You should have received a copy of the GNU General Public License
 
16
// along with this program; if not, write to the Free Software Foundation,
 
17
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
18
 
 
19
#include "configfile.h"
 
20
 
 
21
#include <string.h>
 
22
#include <glib.h>
 
23
 
 
24
#include <glibmm/fileutils.h>
 
25
#include <glibmm/iochannel.h>
 
26
 
 
27
namespace VBA
 
28
{
 
29
namespace Config
 
30
{
 
31
 
 
32
using std::string;
 
33
using Glib::IOChannel;
 
34
 
 
35
Line::Line(const string & _rsKey, const string & _rsValue) :
 
36
  m_sKey(_rsKey),
 
37
  m_sValue(_rsValue)
 
38
{
 
39
}
 
40
 
 
41
Section::Section(const string & _rsName) :
 
42
  m_sName(_rsName)
 
43
{
 
44
}
 
45
 
 
46
bool Section::bKeyExists(const string & _rsKey)
 
47
{
 
48
  for (iterator it = begin(); it != end(); it++)
 
49
  {
 
50
    if (it->m_sKey == _rsKey)
 
51
    {
 
52
      return true;
 
53
    }
 
54
  }
 
55
  return false;
 
56
}
 
57
 
 
58
void Section::vSetKey(const string & _rsKey, const string & _rsValue)
 
59
{
 
60
  for (iterator it = begin(); it != end(); it++)
 
61
  {
 
62
    if (it->m_sKey == _rsKey)
 
63
    {
 
64
      it->m_sValue = _rsValue;
 
65
      return;
 
66
    }
 
67
  }
 
68
  push_back(Line(_rsKey, _rsValue));
 
69
}
 
70
 
 
71
string Section::sGetKey(const string & _rsKey) const
 
72
{
 
73
  for (const_iterator it = begin(); it != end(); it++)
 
74
  {
 
75
    if (it->m_sKey == _rsKey)
 
76
    {
 
77
      return it->m_sValue;
 
78
    }
 
79
  }
 
80
  throw KeyNotFound(m_sName, _rsKey);
 
81
}
 
82
 
 
83
void Section::vRemoveKey(const string & _rsKey)
 
84
{
 
85
  for (iterator it = begin(); it != end(); it++)
 
86
  {
 
87
    if (it->m_sKey == _rsKey)
 
88
    {
 
89
      erase(it);
 
90
      return;
 
91
    }
 
92
  }
 
93
}
 
94
 
 
95
File::File()
 
96
{
 
97
}
 
98
 
 
99
File::File(const string & _rsFile)
 
100
{
 
101
  vLoad(_rsFile);
 
102
}
 
103
 
 
104
File::~File()
 
105
{
 
106
}
 
107
 
 
108
bool File::bSectionExists(const string & _rsName)
 
109
{
 
110
  for (iterator it = begin(); it != end(); it++)
 
111
  {
 
112
    if (it->sGetName() == _rsName)
 
113
    {
 
114
      return true;
 
115
    }
 
116
  }
 
117
  return false;
 
118
}
 
119
 
 
120
Section * File::poAddSection(const string & _rsName)
 
121
{
 
122
  Section * poSection = NULL;
 
123
  for (iterator it = begin(); it != end(); it++)
 
124
  {
 
125
    if (it->sGetName() == _rsName)
 
126
    {
 
127
      poSection = &(*it);
 
128
    }
 
129
  }
 
130
  if (poSection == NULL)
 
131
  {
 
132
    push_back(Section(_rsName));
 
133
    poSection = &back();
 
134
  }
 
135
  return poSection;
 
136
}
 
137
 
 
138
Section * File::poGetSection(const string & _rsName)
 
139
{
 
140
  for (iterator it = begin(); it != end(); it++)
 
141
  {
 
142
    if (it->sGetName() == _rsName)
 
143
    {
 
144
      return &(*it);
 
145
    }
 
146
  }
 
147
  throw SectionNotFound(_rsName);
 
148
}
 
149
 
 
150
void File::vRemoveSection(const string & _rsName)
 
151
{
 
152
  for (iterator it = begin(); it != end(); it++)
 
153
  {
 
154
    if (it->sGetName() == _rsName)
 
155
    {
 
156
      erase(it);
 
157
      return;
 
158
    }
 
159
  }
 
160
}
 
161
 
 
162
void File::vLoad(const string & _rsFile,
 
163
                 bool _bAddSection,
 
164
                 bool _bAddKey)
 
165
{
 
166
  string sBuffer = Glib::file_get_contents(_rsFile);
 
167
  Section * poSection = NULL;
 
168
  char ** lines = g_strsplit(sBuffer.c_str(), "\n", 0);
 
169
  char * tmp;
 
170
  int i = 0;
 
171
  while (lines[i])
 
172
  {
 
173
    if (lines[i][0] == '[')
 
174
    {
 
175
      if ((tmp = strchr(lines[i], ']')))
 
176
      {
 
177
        *tmp = '\0';
 
178
        if (_bAddSection)
 
179
        {
 
180
          poSection = poAddSection(&lines[i][1]);
 
181
        }
 
182
        else
 
183
        {
 
184
          try
 
185
          {
 
186
            poSection = poGetSection(&lines[i][1]);
 
187
          }
 
188
          catch (...)
 
189
          {
 
190
            poSection = NULL;
 
191
          }
 
192
        }
 
193
      }
 
194
    }
 
195
    else if (lines[i][0] != '#' && poSection != NULL)
 
196
    {
 
197
      if ((tmp = strchr(lines[i], '=')))
 
198
      {
 
199
        *tmp = '\0';
 
200
        tmp++;
 
201
        if (_bAddKey || poSection->bKeyExists(lines[i]))
 
202
        {
 
203
          poSection->vSetKey(lines[i], tmp);
 
204
        }
 
205
      }
 
206
    }
 
207
    i++;
 
208
  }
 
209
  g_strfreev(lines);
 
210
}
 
211
 
 
212
void File::vSave(const string & _rsFile)
 
213
{
 
214
  Glib::RefPtr<IOChannel> poFile = IOChannel::create_from_file(_rsFile, "w");
 
215
  poFile->set_encoding("");
 
216
 
 
217
  for (const_iterator poSection = begin();
 
218
       poSection != end();
 
219
       poSection++)
 
220
  {
 
221
    string sName = "[" + poSection->sGetName() + "]\n";
 
222
    poFile->write(sName);
 
223
 
 
224
    for (Section::const_iterator poLine = poSection->begin();
 
225
         poLine != poSection->end();
 
226
         poLine++)
 
227
    {
 
228
      string sLine = poLine->m_sKey + "=" + poLine->m_sValue + "\n";
 
229
      poFile->write(sLine);
 
230
    }
 
231
    poFile->write("\n");
 
232
  }
 
233
}
 
234
 
 
235
void File::vClear()
 
236
{
 
237
  clear();
 
238
}
 
239
 
 
240
std::ostream & operator<<(std::ostream & _roOut, const File & _roFile)
 
241
{
 
242
  for (File::const_iterator poSection = _roFile.begin();
 
243
       poSection != _roFile.end();
 
244
       poSection++)
 
245
  {
 
246
    string sName = "[" + poSection->sGetName() + "]\n";
 
247
    _roOut << sName;
 
248
 
 
249
    for (Section::const_iterator poLine = poSection->begin();
 
250
         poLine != poSection->end();
 
251
         poLine++)
 
252
    {
 
253
      string sLine = poLine->m_sKey + "=" + poLine->m_sValue + "\n";
 
254
      _roOut << sLine;
 
255
    }
 
256
    _roOut << "\n";
 
257
  }
 
258
  return _roOut;
 
259
}
 
260
 
 
261
} // namespace Config
 
262
} // namespace VBA