00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <iostream>
00011 #include <fstream>
00012 #include <cassert>
00013 #include <celutil/debug.h>
00014 #include <celutil/directory.h>
00015 #include <celutil/util.h>
00016 #include <celengine/celestia.h>
00017 #include <celengine/parser.h>
00018 #include "configfile.h"
00019
00020 using namespace std;
00021
00022
00023 static unsigned int getUint(Hash* params,
00024 const string& paramName,
00025 unsigned int defaultValue)
00026 {
00027 double value = 0.0;
00028 if (params->getNumber(paramName, value))
00029 return (unsigned int) value;
00030 else
00031 return defaultValue;
00032 }
00033
00034
00035 CelestiaConfig* ReadCelestiaConfig(string filename, CelestiaConfig *config)
00036 {
00037 ifstream configFile(filename.c_str());
00038 if (!configFile.good())
00039 {
00040 DPRINTF(0, "Error opening config file.");
00041 return config;
00042 }
00043
00044 Tokenizer tokenizer(&configFile);
00045 Parser parser(&tokenizer);
00046
00047 if (tokenizer.nextToken() != Tokenizer::TokenName)
00048 {
00049 DPRINTF(0, "%s:%d 'Configuration' expected.\n", filename.c_str(),
00050 tokenizer.getLineNumber());
00051 return config;
00052 }
00053
00054 if (tokenizer.getStringValue() != "Configuration")
00055 {
00056 DPRINTF(0, "%s:%d 'Configuration' expected.\n", filename.c_str(),
00057 tokenizer.getLineNumber());
00058 return config;
00059 }
00060
00061 Value* configParamsValue = parser.readValue();
00062 if (configParamsValue == NULL || configParamsValue->getType() != Value::HashType)
00063 {
00064 DPRINTF(0, "%s: Bad configuration file.\n", filename.c_str());
00065 return config;
00066 }
00067
00068 Hash* configParams = configParamsValue->getHash();
00069
00070 if (config == NULL) config = new CelestiaConfig();
00071
00072 config->faintestVisible = 6.0f;
00073 configParams->getNumber("FaintestVisibleMagnitude", config->faintestVisible);
00074 configParams->getString("FavoritesFile", config->favoritesFile);
00075 config->favoritesFile = WordExp(config->favoritesFile);
00076 configParams->getString("DestinationFile", config->destinationsFile);
00077 config->destinationsFile = WordExp(config->destinationsFile);
00078 configParams->getString("InitScript", config->initScriptFile);
00079 config->initScriptFile = WordExp(config->initScriptFile);
00080 configParams->getString("DemoScript", config->demoScriptFile);
00081 config->demoScriptFile = WordExp(config->demoScriptFile);
00082 configParams->getString("AsterismsFile", config->asterismsFile);
00083 config->asterismsFile = WordExp(config->asterismsFile);
00084 configParams->getString("BoundariesFile", config->boundariesFile);
00085 config->boundariesFile = WordExp(config->boundariesFile);
00086 configParams->getString("DeepSkyCatalog", config->deepSkyCatalog);
00087 config->deepSkyCatalog = WordExp(config->deepSkyCatalog);
00088 configParams->getString("StarDatabase", config->starDatabaseFile);
00089 config->starDatabaseFile = WordExp(config->starDatabaseFile);
00090 configParams->getString("StarNameDatabase", config->starNamesFile);
00091 config->starNamesFile = WordExp(config->starNamesFile);
00092 configParams->getString("HDCrossIndex", config->HDCrossIndexFile);
00093 config->HDCrossIndexFile = WordExp(config->HDCrossIndexFile);
00094 configParams->getString("SAOCrossIndex", config->SAOCrossIndexFile);
00095 config->SAOCrossIndexFile = WordExp(config->SAOCrossIndexFile);
00096 configParams->getString("GlieseCrossIndex", config->GlieseCrossIndexFile);
00097 config->GlieseCrossIndexFile = WordExp(config->GlieseCrossIndexFile);
00098 configParams->getString("Font", config->mainFont);
00099 configParams->getString("LabelFont", config->labelFont);
00100 configParams->getString("TitleFont", config->titleFont);
00101 configParams->getString("LogoTexture", config->logoTextureFile);
00102 configParams->getString("Cursor", config->cursor);
00103
00104
00105
00106 double aaSamples = 1;
00107 configParams->getNumber("AntialiasingSamples", aaSamples);
00108 config->aaSamples = (unsigned int) aaSamples;
00109
00110 config->hdr = false;
00111 configParams->getBoolean("HighDynamicRange", config->hdr);
00112
00113 config->rotateAcceleration = 120.0f;
00114 configParams->getNumber("RotateAcceleration", config->rotateAcceleration);
00115 config->mouseRotationSensitivity = 1.0f;
00116 configParams->getNumber("MouseRotationSensitivity", config->mouseRotationSensitivity);
00117 configParams->getString("ScriptScreenshotDirectory", config->scriptScreenshotDirectory);
00118 config->scriptScreenshotDirectory = WordExp(config->scriptScreenshotDirectory);
00119 config->scriptSystemAccessPolicy = "ask";
00120 configParams->getString("ScriptSystemAccessPolicy", config->scriptSystemAccessPolicy);
00121
00122 config->ringSystemSections = getUint(configParams, "RingSystemSections", 100);
00123 config->orbitPathSamplePoints = getUint(configParams, "OrbitPathSamplePoints", 100);
00124 config->shadowTextureSize = getUint(configParams, "ShadowTextureSize", 256);
00125 config->eclipseTextureSize = getUint(configParams, "EclipseTextureSize", 128);
00126
00127 Value* solarSystemsVal = configParams->getValue("SolarSystemCatalogs");
00128 if (solarSystemsVal != NULL)
00129 {
00130 if (solarSystemsVal->getType() != Value::ArrayType)
00131 {
00132 DPRINTF(0, "%s: SolarSystemCatalogs must be an array.\n", filename.c_str());
00133 }
00134 else
00135 {
00136 Array* solarSystems = solarSystemsVal->getArray();
00137
00138
00139 for (Array::iterator iter = solarSystems->begin(); iter != solarSystems->end(); iter++)
00140 {
00141 Value* catalogNameVal = *iter;
00142
00143 if (catalogNameVal->getType() == Value::StringType)
00144 {
00145 config->solarSystemFiles.insert(config->solarSystemFiles.end(),
00146 WordExp(catalogNameVal->getString()));
00147 }
00148 else
00149 {
00150 DPRINTF(0, "%s: Solar system catalog name must be a string.\n",
00151 filename.c_str());
00152 }
00153 }
00154 }
00155 }
00156
00157 Value* starCatalogsVal = configParams->getValue("StarCatalogs");
00158 if (starCatalogsVal != NULL)
00159 {
00160 if (starCatalogsVal->getType() != Value::ArrayType)
00161 {
00162 DPRINTF(0, "%s: StarCatalogs must be an array.\n",
00163 filename.c_str());
00164 }
00165 else
00166 {
00167 Array* starCatalogs = starCatalogsVal->getArray();
00168 assert(starCatalogs != NULL);
00169
00170 for (Array::iterator iter = starCatalogs->begin();
00171 iter != starCatalogs->end(); iter++)
00172 {
00173 Value* catalogNameVal = *iter;
00174 assert(catalogNameVal != NULL);
00175
00176 if (catalogNameVal->getType() == Value::StringType)
00177 {
00178 config->starCatalogFiles.push_back(WordExp(catalogNameVal->getString()));
00179 }
00180 else
00181 {
00182 DPRINTF(0, "%s: Star catalog name must be a string.\n",
00183 filename.c_str());
00184 }
00185 }
00186 }
00187 }
00188
00189 Value* extrasDirsVal = configParams->getValue("ExtrasDirectories");
00190 if (extrasDirsVal != NULL)
00191 {
00192 if (extrasDirsVal->getType() == Value::ArrayType)
00193 {
00194 Array* extrasDirs = extrasDirsVal->getArray();
00195 assert(extrasDirs != NULL);
00196
00197 for (Array::iterator iter = extrasDirs->begin();
00198 iter != extrasDirs->end(); iter++)
00199 {
00200 Value* dirNameVal = *iter;
00201 if (dirNameVal->getType() == Value::StringType)
00202 {
00203 config->extrasDirs.insert(config->extrasDirs.end(),
00204 WordExp(dirNameVal->getString()));
00205 }
00206 else
00207 {
00208 DPRINTF(0, "%s: Extras directory name must be a string.\n",
00209 filename.c_str());
00210 }
00211 }
00212 }
00213 else if (extrasDirsVal->getType() == Value::StringType)
00214 {
00215 config->extrasDirs.insert(config->extrasDirs.end(),
00216 WordExp(extrasDirsVal->getString()));
00217 }
00218 else
00219 {
00220 DPRINTF(0, "%s: ExtrasDirectories must be an array or string.\n", filename.c_str());
00221 }
00222 }
00223
00224 Value* labelledStarsVal = configParams->getValue("LabelledStars");
00225 if (labelledStarsVal != NULL)
00226 {
00227 if (labelledStarsVal->getType() != Value::ArrayType)
00228 {
00229 DPRINTF(0, "%s: LabelledStars must be an array.\n", filename.c_str());
00230 }
00231 else
00232 {
00233 Array* labelledStars = labelledStarsVal->getArray();
00234
00235
00236 for (Array::iterator iter = labelledStars->begin(); iter != labelledStars->end(); iter++)
00237 {
00238 Value* starNameVal = *iter;
00239
00240 if (starNameVal->getType() == Value::StringType)
00241 {
00242 config->labelledStars.insert(config->labelledStars.end(),
00243 starNameVal->getString());
00244 }
00245 else
00246 {
00247 DPRINTF(0, "%s: Star name must be a string.\n", filename.c_str());
00248 }
00249 }
00250 }
00251 }
00252
00253 Value* ignoreExtVal = configParams->getValue("IgnoreGLExtensions");
00254 if (ignoreExtVal != NULL)
00255 {
00256 if (ignoreExtVal->getType() != Value::ArrayType)
00257 {
00258 DPRINTF(0, "%s: IgnoreGLExtensions must be an array.\n",
00259 filename.c_str());
00260 }
00261 else
00262 {
00263 Array* ignoreExt = ignoreExtVal->getArray();
00264
00265 for (Array::iterator iter = ignoreExt->begin();
00266 iter != ignoreExt->end(); iter++)
00267 {
00268 Value* extVal = *iter;
00269 if (extVal->getType() == Value::StringType)
00270 config->ignoreGLExtensions.push_back(extVal->getString());
00271 else
00272 DPRINTF(0, "%s: extension name must be a string.\n", filename.c_str());
00273 }
00274 }
00275 }
00276
00277 delete configParamsValue;
00278
00279 return config;
00280 }