00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00036 #include "OW_config.h"
00037 #include "OW_ConfigFile.hpp"
00038 #include "OW_ConfigException.hpp"
00039 #include "OW_Format.hpp"
00040
00041 #include <fstream>
00042
00043 namespace OW_NAMESPACE
00044 {
00045 namespace ConfigFile
00046 {
00047
00049 void loadConfigFile(const String& filename, ConfigMap& rval)
00050 {
00051 std::ifstream file(filename.c_str());
00052 if (!file)
00053 {
00054 OW_THROW(ConfigException, Format("Unable to read config"
00055 " file: %1", filename).c_str());
00056 }
00057
00058 String line;
00059 int lineNum = 0;
00060 while (file)
00061 {
00062 lineNum++;
00063 line = String::getLine(file);
00064 if (!line.empty())
00065 {
00066
00067 if (line[0] == '#' || line[0] == ';')
00068 {
00069 continue;
00070 }
00071 size_t idx = line.indexOf('=');
00072 if (idx != String::npos)
00073 {
00074 if (idx + 1 < line.length())
00075 {
00076 String itemValue = line.substring(idx + 1).trim();
00077 if (!itemValue.empty())
00078 {
00079 String item = line.substring(0, idx).trim();
00080 rval[item].push_back(ItemData(filename, itemValue));
00081 }
00082 }
00083 }
00084 else
00085 {
00086 OW_THROW(ConfigException, Format("Error in config file:"
00087 " %1 at line %2.\n Line is %3", filename, lineNum,
00088 line).c_str());
00089 }
00090 }
00091 }
00092 }
00093
00095 String
00096 getConfigItem(const ConfigMap& configItems, const String &itemName, const String& defRetVal)
00097 {
00098 ConfigMap::const_iterator i = configItems.find(itemName);
00099 if (i != configItems.end() && i->second.size() > 0)
00100 {
00101 return i->second.back().value;
00102 }
00103 else
00104 {
00105 return defRetVal;
00106 }
00107 }
00108
00110 StringArray
00111 getMultiConfigItem(const ConfigMap& configItems, const String &itemName, const StringArray& defRetVal, const char* tokenizeSeparator)
00112 {
00113 ConfigMap::const_iterator item = configItems.find(itemName);
00114 if (item != configItems.end())
00115 {
00116 StringArray rv;
00117 rv.reserve(item->second.size());
00118 for (size_t i = 0; i < item->second.size(); ++i)
00119 {
00120 if (tokenizeSeparator)
00121 {
00122 StringArray tokenizedValue(item->second[i].value.tokenize(tokenizeSeparator));
00123 rv.insert(rv.end(), tokenizedValue.begin(), tokenizedValue.end());
00124 }
00125 else
00126 {
00127 rv.push_back(item->second[i].value);
00128 }
00129 }
00130 return rv;
00131 }
00132 else
00133 {
00134 return defRetVal;
00135 }
00136 }
00137
00139 void
00140 setConfigItem(ConfigMap& configItems, const String& itemName,
00141 const String& value, EOverwritePreviousFlag overwritePrevious)
00142 {
00143 ConfigMap::iterator it = configItems.find(itemName);
00144 if (it == configItems.end())
00145 {
00146 configItems[itemName].push_back(ItemData("", value));
00147 }
00148 else if (overwritePrevious == E_OVERWRITE_PREVIOUS)
00149 {
00150 ItemDataArray& values = configItems[itemName];
00151 values.clear();
00152 values.push_back(ItemData("", value));
00153 }
00154
00155 }
00156
00157
00158 }
00159 }
00160