00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
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
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
00270 setValues(request.getFields());
00271 }
00272
00273
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
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
00367 setValues(request.getFields());
00368 }
00369
00370
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
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 }