Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

configfile.cpp

Go to the documentation of this file.
00001 // configfile.cpp
00002 //
00003 // Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
00004 //
00005 // This program is free software; you can redistribute it and/or
00006 // modify it under the terms of the GNU General Public License
00007 // as published by the Free Software Foundation; either version 2
00008 // of the License, or (at your option) any later version.
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     // configParams->getNumber("LogoWidth", config->logoWidth);
00104     // configParams->getNumber("LogoHeight", config->logoHeight);
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             // assert(solarSystems != NULL);
00138 
00139             for (Array::iterator iter = solarSystems->begin(); iter != solarSystems->end(); iter++)
00140             {
00141                 Value* catalogNameVal = *iter;
00142                 // assert(catalogNameVal != NULL);
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             // assert(labelledStars != NULL);
00235 
00236             for (Array::iterator iter = labelledStars->begin(); iter != labelledStars->end(); iter++)
00237             {
00238                 Value* starNameVal = *iter;
00239                 // assert(starNameVal != NULL);
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 }

Generated on Sat Jan 14 22:30:30 2006 for Celestia by  doxygen 1.4.1