summaryrefslogtreecommitdiff
path: root/source/data/Config.cpp
blob: 6cdda2fdee18f91cc9ec60b8b5304cf71fb31398 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "Config.h"

const string Config::SCREEN_WIDTH_KEY("screen_width");
const string Config::SCREEN_HEIGHT_KEY("screen_height");
const string Config::FULLSCREEN_KEY("fullscreen");

const string Config::SCREEN_WIDTH_DEFAULT("800");
const string Config::SCREEN_HEIGHT_DEFAULT("600");
const string Config::FULLSCREEN_DEFAULT("false");


Config::Config(const string& filename)
    :_screenWidth(0),
    _screenHeight(0)
{
    ifstream inStream(filename.c_str(), fstream::in);

    map<string, string> readValues;
    map<string, string> unfoundValues;
    readFile(inStream, readValues);
    fillValues(readValues, unfoundValues);

    inStream.close();

    ofstream outStream(filename.c_str(), fstream::app);

    writeUnfoundValues(outStream, unfoundValues);

    outStream.close();
}

unsigned int Config::screenWidth() const
{
    return _screenWidth;
}
unsigned int Config::screenHeight() const
{
    return _screenHeight;
}
bool Config::fullscreen() const
{
    return _fullscreen;
}

void Config::readFile(ifstream& file, map<string,string>& map)
{
    if (!file.is_open()) return;

    string nextEntry;
    while(!file.eof())
    {
        file >> nextEntry;

        string::size_type equalsIndex = nextEntry.find("=",0);
        if (equalsIndex!=string::npos)
        {
            string key = nextEntry.substr(0,equalsIndex);
            string value = nextEntry.substr(equalsIndex+1);

            map[key] = value;
        }
    }
}

void Config::fillValues(const map<string, string>& readValues, map<string, string>& unfoundValues)
{
    setScreenWidth(extractValue(readValues, unfoundValues, SCREEN_WIDTH_KEY, SCREEN_WIDTH_DEFAULT));
    setScreenHeight(extractValue(readValues, unfoundValues, SCREEN_HEIGHT_KEY, SCREEN_HEIGHT_DEFAULT));
    setFullscreen(extractValue(readValues, unfoundValues, FULLSCREEN_KEY, FULLSCREEN_DEFAULT));
}

string Config::extractValue(const map<string, string>& readValues, map<string, string>& unfoundValues, const string& key, const string& defaultValue)
{
    map<string, string>::const_iterator findIter = readValues.find(key);
    if (findIter != readValues.end())
    {
        return findIter->second;
    }
    else
    {
        unfoundValues[key] = defaultValue;
        return defaultValue;
    }
}

void Config::writeUnfoundValues(ofstream& file, const map<string, string>& unfoundValues)
{
    for (map<string, string>::const_iterator iter = unfoundValues.begin(); iter!=unfoundValues.end(); ++iter)
    {
        file << iter->first << "=" << iter->second << endl;
    }
}

void Config::setScreenWidth(const string& screenWidthStr)
{
    _screenWidth = atoi(screenWidthStr.c_str());
}
void Config::setScreenHeight(const string& screenHeightStr)
{
    _screenHeight = atoi(screenHeightStr.c_str());
}
void Config::setFullscreen(const string& fullscreenStr)
{
    _fullscreen = fullscreenStr=="true";
}