source: src-qt4/pc-pfmanager/config/rcconfig.cpp @ 1620346

9.1-release9.2-releasereleng/10.0releng/10.0.1releng/10.0.2
Last change on this file since 1620346 was 1620346, checked in by Kris Moore <kris@…>, 16 months ago

Initial import of PC-BSD /current/ SVN repo

  • Property mode set to 100755
File size: 5.8 KB
Line 
1
2#include "rcconfig.hpp"
3#include <qfile.h>
4#include <qtextstream.h>
5#include <iostream>
6#include <QRegExp>
7#include <QTextStream>
8
9RcConfig::RcConfig ( void )
10    : _modified(false)
11{
12}
13
14RcConfig::~RcConfig ( void )
15{
16}
17
18RcConfig* RcConfig::fromDefault ( void )
19{
20    return RcConfig::fromFile("/etc/rc.conf");
21}
22
23RcConfig* RcConfig::fromFile ( const QString& filename )
24{
25    RcConfig* inst = new RcConfig;
26    QFile file(filename);
27   
28    if ( file.open(QIODevice::ReadOnly) )
29    { // It went good
30        QString line;
31           
32        while ( !file.atEnd() )
33        {
34            line = file.readLine();
35            // Push back the lines of the file
36            inst->_lines.push_back(line);
37        }
38        inst->_file = filename;
39    }
40    else
41    { // Error to report
42        throw QString(tr("Error opening the specified rc.conf file."));
43    }
44    return inst;
45}
46
47// It may be a code doubling... but providing const/non const
48// is necessary to improve overall performance
49RcConfig::qstr_vector_it RcConfig::findLine ( const QRegExp& rx )
50{
51    qstr_vector_revit it = _lines.rbegin();
52    qstr_vector_revit last = _lines.rend();
53   
54    while ( it != last )
55    {
56        QString line = *it++;
57       
58        if ( rx.exactMatch(line) )
59        {
60            return it.base();
61        }
62    }
63    return _lines.end();
64}
65
66RcConfig::qstr_vector_cit RcConfig::findLine ( const QRegExp& rx ) const
67{
68    qstr_vector_crevit it = _lines.rbegin();
69    qstr_vector_crevit last = _lines.rend();
70   
71    // Reverse lookup: We need to find the LAST line
72    // since the last line is the one with the effect
73    while ( it != last )
74    {
75        QString line = *it++;
76       
77        if ( rx.exactMatch(line) )
78        {
79            return it.base();
80        }
81    }
82    return _lines.end();
83}
84
85void RcConfig::save ( void )
86{
87    QFile file(_file);
88   
89    // Try to write file to disk
90    //
91    if ( _modified )
92    { // We only save if the _modified flag is true
93        if ( file.open(QIODevice::WriteOnly) )
94        {
95            QTextStream stream(&file);
96           
97            for ( qstr_vector_cit it = _lines.begin();
98                it != _lines.end();
99                it++ )
100            { // Write line by line...
101                stream << (*it) << "\n";
102            }
103            _modified = false;
104        }
105    }
106}
107
108bool RcConfig::isEnabled ( const QString& service ) const
109{
110    const QString sregex = service + "_enable=\"[a-zA-Z]+\"\\s*";
111    const QRegExp regex(sregex);
112    qstr_vector_cit found;
113    bool enabled = false;
114   
115    found = findLine(regex);
116    if ( found != _lines.end() )
117    { // We have found one... let's see if it's enabled
118        QString line = (*found);
119       
120        if (line.indexOf("\"yes\"") == -1 && line.indexOf("\"YES\"") == -1 )
121                enabled = false;
122        else
123                enabled = true;
124    }
125    return enabled;
126}
127
128void RcConfig::enable ( const QString& service, const QString& enable )
129{
130    const QString sregex = service + "_enable=\"[a-zA-Z]*\"\\s*";
131    const QString senable = service + "_enable=\"" + enable + "\"";
132    const QRegExp regex(sregex);
133    qstr_vector_it found;
134   
135    found = RcConfig::findLine(regex);
136    if ( found != _lines.end() )
137    { // Let's replace the old
138        QString line = *found;
139        if ( line.indexOf("\"" + enable + "\"") != -1 )
140        { // but only if it does not have the current state
141            _lines.erase(found);
142            _lines.insert(found, senable); 
143            _modified = true;
144        }
145    }
146    else
147    { // Append the needed lines...       
148        _lines.push_back(senable);
149        _modified = true;
150    }
151    // And save changes
152    save();
153}
154
155void RcConfig::enable ( const QString& service )
156{
157    enable(service, "YES");
158}
159
160void RcConfig::disable ( const QString& service )
161{
162    enable(service, "NO");
163}
164
165void RcConfig::addParameter ( const QString& service, const QString& param, const QString& value )
166{
167    const QString sxline = service + "_" + param + "=\"[^\"]*\"\\s*";
168    const QString sxvalue = service + "_" + param + "=\"" + value + "\"\\s*";
169    QString newline = service + "_" + param + "=\"" + value + "\"";
170    const QRegExp xline(sxline);
171    const QRegExp xvalue(sxvalue);
172    qstr_vector_it found;
173   
174    found = findLine(xline);
175    if ( found != _lines.end() )
176    { // We have such a line
177        QString line = *found;
178       
179        if ( !xvalue.exactMatch(line) )
180        { // Let's modify it...
181            _lines.erase(found);
182            _lines.insert(found, newline);
183            _modified = true;
184        }
185    }
186    else
187    { // We do not have such a line, therefore we append it
188        _lines.push_back(newline);
189        _modified = true;
190    }
191    // And save the changes (if there are some)
192    save();
193}
194
195bool RcConfig::getParameter ( const QString& service, const QString& param, QString& retvalue ) const
196{
197    const QString sregex = service + "_" + param + "=\"([^\"]*)\"\\s*";
198    QRegExp regex(sregex);   
199    qstr_vector_cit it;
200    bool success = false;
201   
202    it = findLine(regex);
203    if ( it != _lines.end() )
204    {
205        QString line = *it;
206        int pos = 0;
207        // Fetch the value
208        pos = regex.indexIn(line);
209        if ( pos > -1 )
210        { // Retrieve capture
211            retvalue = regex.cap(1);
212            success = true;
213        }
214    }
215    // nothing found
216    return success;
217}
218
219bool RcConfig::exists ( const QString& service ) const
220{
221    const QString sregex = service + "_enable=\"[a-zA-Z]*\"\\s*";
222    const QRegExp regex(sregex);
223    qstr_vector_cit it;
224   
225    return ( (it = findLine(regex)) != _lines.end() );
226}
227
228bool RcConfig::exists ( const QString& service, const QString& param ) const
229{
230    const QString sregex = service + "_" + param + "=\"[^\"]*\"\\s*";
231    const QRegExp regex(sregex);
232    qstr_vector_cit it;
233   
234    return ( (it = findLine(regex)) != _lines.end() );
235}
236
Note: See TracBrowser for help on using the repository browser.