ServerWebSettingsHandler.cpp

Go to the documentation of this file.
00001 ////////////////////////////////////////////////////////////////////////////////
00002 //    Scorched3D (c) 2000-2004
00003 //
00004 //    This file is part of Scorched3D.
00005 //
00006 //    Scorched3D is free software; you can redistribute it and/or modify
00007 //    it under the terms of the GNU General Public License as published by
00008 //    the Free Software Foundation; either version 2 of the License, or
00009 //    (at your option) any later version.
00010 //
00011 //    Scorched3D is distributed in the hope that it will be useful,
00012 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 //    GNU General Public License for more details.
00015 //
00016 //    You should have received a copy of the GNU General Public License
00017 //    along with Scorched3D; if not, write to the Free Software
00018 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 ////////////////////////////////////////////////////////////////////////////////
00020 
00021 #include <webserver/ServerWebSettingsHandler.h>
00022 #include <webserver/ServerWebServerUtil.h>
00023 #include <server/ServerLog.h>
00024 #include <server/ScorchedServer.h>
00025 #include <server/ScorchedServerUtil.h>
00026 #include <server/ServerCommon.h>
00027 #include <server/ServerState.h>
00028 #include <server/ServerParams.h>
00029 #include <landscapedef/LandscapeDefinitionsBase.h>
00030 #include <common/Defines.h>
00031 #include <common/Logger.h>
00032 #include <common/OptionsScorched.h>
00033 #include <common/OptionsTransient.h>
00034 #include <common/StatsLogger.h>
00035 #include <engine/ModDirs.h>
00036 #include <engine/ModFiles.h>
00037 #include <tankai/TankAINames.h>
00038 #include <XML/XMLParser.h>
00039 #include <vector>
00040 #include <algorithm>
00041 
00042 static const char *getField(std::map<std::string, std::string> &fields, const char *field)
00043 {
00044         std::map<std::string, std::string>::iterator itor = 
00045                 fields.find(field);
00046         if (itor != fields.end())
00047         {
00048                 return (*itor).second.c_str();
00049         }
00050         return 0;
00051 }
00052 
00053 static void setValues(std::map<std::string, std::string> &fields)
00054 {
00055         std::list<OptionEntry *>::iterator itor;
00056         {
00057                 std::list<OptionEntry *> &options = 
00058                         ScorchedServer::instance()->getOptionsGame().
00059                                 getChangedOptions().getOptions();
00060                 for (itor = options.begin();
00061                         itor != options.end();
00062                         itor++)
00063                 {
00064                         OptionEntry *entry = (*itor);
00065                         std::map<std::string, std::string>::iterator findItor =
00066                                 fields.find(entry->getName());
00067                         if (findItor != fields.end())
00068                         {
00069                                 const char *value = (*findItor).second.c_str();
00070                                 entry->setValueFromString(value);
00071                         }
00072                 }       
00073         }
00074         {
00075                 std::list<OptionEntry *> &options = 
00076                         ScorchedServer::instance()->getOptionsGame().
00077                                 getChangedOptions().getPlayerTypeOptions();
00078                 for (itor = options.begin();
00079                         itor != options.end();
00080                         itor++)
00081                 {
00082                         OptionEntry *entry = (*itor);
00083                         std::map<std::string, std::string>::iterator findItor =
00084                                 fields.find(entry->getName());
00085                         if (findItor != fields.end())
00086                         {
00087                                 const char *value = (*findItor).second.c_str();
00088                                 entry->setValueFromString(value);
00089                         }
00090                 }       
00091         }
00092 }
00093 
00094 bool ServerWebSettingsHandler::SettingsPlayersHandler::processRequest(
00095         ServerWebServerIRequest &request,
00096         std::string &text)
00097 {
00098         if (!request.getSession()->credentials.hasPermission(
00099                 ServerAdminSessions::PERMISSION_ALTERSETTINGS)) return true;
00100 
00101         const char *action = getField(request.getFields(), "action");
00102         if (action && 0 == strcmp(action, "Load"))
00103         {
00104                 ScorchedServer::instance()->getOptionsGame().getChangedOptions().
00105                         readOptionsFromFile((char *) ServerParams::instance()->getServerFile());
00106         }
00107         else
00108         {
00109                 setValues(request.getFields());
00110         }
00111 
00112         {
00113                 TankAINames tankAIStore;
00114                 tankAIStore.loadAIs();
00115                 
00116                 std::string players;
00117                 std::list<OptionEntry *>::iterator itor;
00118                 std::list<OptionEntry *> &options = 
00119                         ScorchedServer::instance()->getOptionsGame().
00120                                 getChangedOptions().getPlayerTypeOptions();
00121                 for (itor = options.begin();
00122                         itor != options.end();
00123                         itor++)
00124                 {
00125                         OptionEntry *entry = (*itor);
00126                         
00127                         std::string value = "";
00128 
00129                         value.append("<tr><td>");
00130                         value.append(entry->getName());
00131                         value.append("</td><td>");
00132                         value.append(S3D::formatStringBuffer("<select name='%s'>", entry->getName()));
00133                         std::list<std::string> &ais = tankAIStore.getAis();
00134                         std::list<std::string>::iterator aiitor;
00135                         for (aiitor = ais.begin(); aiitor != ais.end(); aiitor++)
00136                         {
00137                                 std::string &ai = (*aiitor);
00138                                 value.append(S3D::formatStringBuffer("<option %s>%s</option>",
00139                                         (0 == strcmp(entry->getValueAsString(), ai.c_str())?"selected":""), 
00140                                         ai.c_str()));           
00141                         }
00142                         value.append("</select>");
00143                         value.append("</td></tr>\n");
00144                         
00145                         players.append(value);
00146                 }
00147                 
00148                 request.getFields()["PLAYERS"] = players;
00149         }       
00150 
00151         if (action && 0 == strcmp(action, "Save"))
00152         {
00153                 ScorchedServer::instance()->getOptionsGame().getChangedOptions().
00154                         writeOptionsToFile((char *) ServerParams::instance()->getServerFile());
00155         }
00156 
00157         return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "settingsplayers.html", request.getFields(), text);
00158 }
00159 
00160 bool ServerWebSettingsHandler::SettingsLandscapeHandler::processRequest(
00161         ServerWebServerIRequest &request,
00162         std::string &text)
00163 {
00164         if (!request.getSession()->credentials.hasPermission(
00165                 ServerAdminSessions::PERMISSION_ALTERSETTINGS)) return true;
00166 
00167         const char *action = getField(request.getFields(), "action");
00168         if (action && 0 == strcmp(action, "Load"))
00169         {
00170                 ScorchedServer::instance()->getOptionsGame().getChangedOptions().
00171                         readOptionsFromFile((char *) ServerParams::instance()->getServerFile());
00172         }
00173 
00174         LandscapeDefinitionsBase landscapeDefinitions;
00175         landscapeDefinitions.readLandscapeDefinitions();
00176         std::list<LandscapeDefinitionsEntry> &defns =
00177                 landscapeDefinitions.getAllLandscapes();
00178         std::list<LandscapeDefinitionsEntry>::iterator itor;
00179 
00180         OptionsGame &optionsGame = 
00181                 ScorchedServer::instance()->getOptionsGame().getChangedOptions();
00182 
00183         // Set new options if any 
00184         if (action && (
00185                 0 == strcmp(action, "Save") || 
00186                 0 == strcmp(action, "Set") || 
00187                 0 == strcmp(action, "Select All") || 
00188                 0 == strcmp(action, "Select None")
00189                 ))
00190         {
00191                 std::string landscapesString = "";
00192                 if (0 != strcmp(action, "Select None"))
00193                 {
00194                         for (itor = defns.begin();
00195                                 itor != defns.end();
00196                                 itor++)
00197                         {
00198                                 LandscapeDefinitionsEntry &dfn = *itor;
00199                 
00200                                 const char *setting = getField(request.getFields(), dfn.name.c_str());
00201                                 if (0 == strcmp(action, "Select All") || 
00202                                         (setting && 0 == strcmp(setting, "on")))
00203                                 {
00204                                         if (!landscapesString.empty()) landscapesString.append(":");
00205                                         landscapesString.append(dfn.name.c_str());
00206                                 }
00207                         }
00208                 }
00209                 else
00210                 {
00211                         landscapesString = " ";
00212                 }
00213                 optionsGame.getLandscapesEntry().setValue(landscapesString.c_str());
00214         }
00215 
00216         // Read the current options
00217         std::string landscapes;
00218         for (itor = defns.begin();
00219                 itor != defns.end();
00220                 itor++)
00221         {
00222                 LandscapeDefinitionsEntry &dfn = *itor;
00223 
00224                 bool enabled = landscapeDefinitions.landscapeEnabled(
00225                         optionsGame, dfn.name.c_str());
00226 
00227                 std::string value = S3D::formatStringBuffer(
00228                         "<input type='radio' name='%s' %s value='on'>On</input>"
00229                         "<input type='radio' name='%s' %s value='off'>Off</input>",
00230                         dfn.name.c_str(), (enabled?"checked":""),
00231                         dfn.name.c_str(), (!enabled?"checked":""));
00232 
00233                 landscapes.append(S3D::formatStringBuffer("<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n",
00234                         dfn.name.c_str(), 
00235                         (dfn.description.c_str()[0]?dfn.description.c_str():"-"), 
00236                         value.c_str()));
00237         }
00238         request.getFields()["LANDSCAPES"] = landscapes;
00239 
00240         if (action && 0 == strcmp(action, "Save"))
00241         {
00242                 ScorchedServer::instance()->getOptionsGame().getChangedOptions().
00243                         writeOptionsToFile((char *) ServerParams::instance()->getServerFile());
00244         }
00245 
00246         return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "settingslandscape.html", request.getFields(), text);
00247 }
00248 
00249 bool ServerWebSettingsHandler::SettingsAllHandler::processRequest(
00250         ServerWebServerIRequest &request,
00251         std::string &text)
00252 {
00253         if (!request.getSession()->credentials.hasPermission(
00254                 ServerAdminSessions::PERMISSION_ALTERSETTINGS)) return true;
00255 
00256         std::list<OptionEntry *>::iterator itor;
00257         std::list<OptionEntry *> &options = 
00258                 ScorchedServer::instance()->getOptionsGame().
00259                         getChangedOptions().getOptions();
00260 
00261         const char *action = getField(request.getFields(), "action");
00262         if (action && 0 == strcmp(action, "Load"))
00263         {
00264                 ScorchedServer::instance()->getOptionsGame().getChangedOptions().
00265                         readOptionsFromFile((char *) ServerParams::instance()->getServerFile());
00266         }
00267         else
00268         {
00269                 // Check if any changes have been made
00270                 setValues(request.getFields());
00271         }
00272 
00273         // Show the current settings
00274         std::string settings;
00275         for (itor = options.begin();
00276                 itor != options.end();
00277                 itor++)
00278         {
00279                 OptionEntry *entry = (*itor);
00280                 if (!(entry->getData() & OptionEntry::DataDepricated))
00281                 {
00282                         std::string value;
00283                         ServerWebServerUtil::generateSettingValue(entry, value);
00284                         
00285                         bool different = (0 != strcmp(entry->getValueAsString(), 
00286                                 entry->getDefaultValueAsString()));
00287                         std::string desc = entry->getDescription();
00288                         desc.append("<br>Default value : ");
00289                         if (different) desc.append("<b>");
00290                         desc.append(entry->getDefaultValueAsString());
00291                         if (different) desc.append("</b>");
00292 
00293                         settings += S3D::formatStringBuffer("<tr><td>%s</td>"
00294                                 "<td><font size=-1>%s</font></td>"
00295                                 "<td>%s</td></tr>\n",
00296                                 entry->getName(),
00297                                 desc.c_str(),
00298                                 value.c_str());
00299                 }
00300         }
00301 
00302         request.getFields()["SETTINGS"] = settings;
00303 
00304         if (action && 0 == strcmp(action, "Save"))
00305         {
00306                 ScorchedServer::instance()->getOptionsGame().getChangedOptions().
00307                         writeOptionsToFile((char *) ServerParams::instance()->getServerFile());
00308         }
00309 
00310         return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "settingsall.html", request.getFields(), text);
00311 }
00312 
00313 bool ServerWebSettingsHandler::SettingsMainHandler::processRequest(
00314         ServerWebServerIRequest &request,
00315         std::string &text)
00316 {
00317         if (!request.getSession()->credentials.hasPermission(
00318                 ServerAdminSessions::PERMISSION_ALTERSETTINGS)) return true;
00319 
00320         std::list<OptionEntry *>::iterator itor;
00321         std::list<OptionEntry *> &options = 
00322                 ScorchedServer::instance()->getOptionsGame().
00323                         getChangedOptions().getOptions();
00324 
00325         const char *action = getField(request.getFields(), "action");
00326         if (action && 0 == strcmp(action, "Load"))
00327         {
00328                 ScorchedServer::instance()->getOptionsGame().getChangedOptions().
00329                         readOptionsFromFile((char *) ServerParams::instance()->getServerFile());
00330         }
00331         else
00332         {
00333                 // Check if any changes have been made
00334                 setValues(request.getFields());
00335         }
00336 
00337         if (action && 0 == strcmp(action, "Save"))
00338         {
00339                 ScorchedServer::instance()->getOptionsGame().getChangedOptions().
00340                         writeOptionsToFile((char *) ServerParams::instance()->getServerFile());
00341         }
00342 
00343         return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "settingsmain.html", request.getFields(), text);
00344 }
00345 
00346 bool ServerWebSettingsHandler::SettingsModHandler::processRequest(
00347         ServerWebServerIRequest &request,
00348         std::string &text)
00349 {
00350         if (!request.getSession()->credentials.hasPermission(
00351                 ServerAdminSessions::PERMISSION_ALTERSETTINGS)) return true;
00352 
00353         std::list<OptionEntry *>::iterator itor;
00354         std::list<OptionEntry *> &options = 
00355                 ScorchedServer::instance()->getOptionsGame().
00356                         getChangedOptions().getOptions();
00357 
00358         const char *action = getField(request.getFields(), "action");
00359         if (action && 0 == strcmp(action, "Load"))
00360         {
00361                 ScorchedServer::instance()->getOptionsGame().getChangedOptions().
00362                         readOptionsFromFile((char *) ServerParams::instance()->getServerFile());
00363         }
00364         else
00365         {
00366                 // Check if any changes have been made
00367                 setValues(request.getFields());
00368         }
00369 
00370         // Import/upload a mod (if specified)
00371         if (!request.getParts().empty())
00372         {
00373                 std::map<std::string, NetMessage *>::iterator modupload =
00374                         request.getParts().find("modupload");
00375                 if (modupload != request.getParts().end())
00376                 {
00377                         NetMessage *message = (*modupload).second;
00378                         ModFiles files;
00379                         std::string mod;
00380                         if (files.importModFiles(mod, message->getBuffer()))
00381                         {
00382                                 if (files.writeModFiles(mod))
00383                                 {
00384                                         return ServerWebServerUtil::getHtmlMessage(
00385                                                 request.getSession(), 
00386                                                 "Mod Upload", 
00387                                                 S3D::formatStringBuffer("Successfuly uploaded and imported mod %s",
00388                                                 (mod[0]?mod.c_str():"Unknown")), 
00389                                                 request.getFields(), text);
00390                                 }
00391                                 else
00392                                 {
00393                                         return ServerWebServerUtil::getHtmlMessage(
00394                                                 request.getSession(), 
00395                                                 "Mod Upload", 
00396                                                 "Failed to write mod files to disk", 
00397                                                 request.getFields(), text);
00398                                 }
00399                         }
00400                         else
00401                         {
00402                                 return ServerWebServerUtil::getHtmlMessage(
00403                                         request.getSession(), 
00404                                         "Mod Upload", 
00405                                         "Failed to load mod files from network", 
00406                                         request.getFields(), text);
00407                         }
00408                 }
00409         }
00410 
00411         // Display the list of mods, and the displayed the currently selected mod
00412         ModDirs modDirs;
00413         if (modDirs.loadModDirs())
00414         {
00415                 OptionEntryString &modOption = 
00416                         ScorchedServer::instance()->getOptionsGame().getChangedOptions().getModEntry();
00417 
00418                 std::string mods;
00419                 std::list<ModInfo>::iterator itor;
00420                 for (itor = modDirs.getDirs().begin();
00421                         itor != modDirs.getDirs().end();
00422                         itor++)
00423                 {
00424                         ModInfo &modInfo = (*itor);
00425 
00426                         mods.append(S3D::formatStringBuffer("<tr><td>%s</td><td>%s</td><td><input type='radio' name='%s' %s value='%s'></input></td>\n",
00427                                 modInfo.getName(),
00428                                 modInfo.getDescription(),
00429                                 modOption.getName(),
00430                                 ((0 == strcmp(modOption.getValueAsString(), modInfo.getName()))?"checked":""),
00431                                 modInfo.getName()));
00432                 }
00433 
00434                 request.getFields()["MODS"] = mods;
00435         }
00436 
00437         if (action && 0 == strcmp(action, "Save"))
00438         {
00439                 ScorchedServer::instance()->getOptionsGame().getChangedOptions().
00440                         writeOptionsToFile((char *) ServerParams::instance()->getServerFile());
00441         }
00442 
00443         return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "settingsmod.html", request.getFields(), text);
00444 }

Generated on Mon Feb 16 15:14:54 2009 for Scorched3D by  doxygen 1.5.3