glest-source/source/glest_game/menu/menu_state_mods.cpp
andy5995 643aff1aa3
glest_game/menu:reformat/restyle source code
* used 'indent -nut -i2 -bli0 -ppi 3 *`
2018-01-25 02:21:52 -06:00

4040 lines
157 KiB
C++

// ==============================================================
// This file is part of Glest (www.glest.org)
//
// Copyright (C) 2011 Mark Vejvoda
//
// You can redistribute this code and/or modify it under
// the terms of the GNU General Public License as published
// by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version
// ==============================================================
#include "menu_state_mods.h"
#include "renderer.h"
#include "sound_renderer.h"
#include "core_data.h"
#include "config.h"
#include "menu_state_root.h"
#include "metrics.h"
#include "conversion.h"
#include <algorithm>
#include <curl/curl.h>
#include "cache_manager.h"
// Need the include below for vc++ 2010 because Microsoft messed up their STL!
#include <iterator>
#include "leak_dumper.h"
namespace Glest
{
namespace Game
{
using namespace::Shared::Util;
struct FormatString
{
void operator () (string & s)
{
s = formatString (s);
}
};
// ===============================
// class ModInfo
// ===============================
ModInfo::ModInfo ()
{
name = "";
url = "";
imageUrl = "";
description = "";
count = "";
crc = "";
type = mt_None;
}
// =====================================================
// class MenuStateConnectedGame
// =====================================================
MenuStateMods::MenuStateMods (Program * program,
MainMenu * mainMenu):MenuState (program,
mainMenu,
"mods")
{
containerName = "Mods";
Lang & lang = Lang::getInstance ();
Config & config = Config::getInstance ();
modPreviewImage = NULL;
displayModPreviewImage.clear ();
ftpClientThread = NULL;
selectedTechName = "";
selectedTilesetName = "";
selectedMapName = "";
selectedScenarioName = "";
modInfoSelected = NULL;
showFullConsole = false;
keyButtonsLineHeight = 20;
keyButtonsHeight = 20;
keyButtonsWidth = 200;
keyButtonsWidthTech = keyButtonsWidth;
keyButtonsWidthMap = keyButtonsWidth + 15;
keyButtonsWidthTil = keyButtonsWidth - 5;
keyButtonsWidthScen = keyButtonsWidth + 20;
scrollListsYPos = 700;
listBoxLength = 200;
keyButtonsYBase = scrollListsYPos;
keyButtonsToRender = listBoxLength / keyButtonsLineHeight;
labelWidth = 5;
keyButtonsXBase = 0;
modMenuState = mmst_None;
oldMenuState = mmst_None;
int installButtonYPos = scrollListsYPos - listBoxLength - 20;
int returnLineY = 80;
enableMapPreview = config.getBool ("MapPreview", "true");
validMapPreview = false;
mapPreviewTexture = NULL;
//create
techInfoXPos = 5;
keyTechScrollBarTitle1.registerGraphicComponent (containerName,
"keyTechScrollBarTitle1");
keyTechScrollBarTitle1.init (techInfoXPos + 5, scrollListsYPos + 30,
labelWidth, 20);
keyTechScrollBarTitle1.setText (lang.getString ("TechTitle1"));
keyTechScrollBarTitle1.setFont (CoreData::getInstance ().
getMenuFontBig ());
keyTechScrollBarTitle1.setFont3D (CoreData::getInstance ().
getMenuFontBig3D ());
keyTechScrollBarTitle2.registerGraphicComponent (containerName,
"keyTechScrollBarTitle2");
keyTechScrollBarTitle2.init (techInfoXPos - 10 + keyButtonsWidthTech,
scrollListsYPos + 17, labelWidth, 20);
keyTechScrollBarTitle2.setText (lang.getString ("TechTitle2"));
keyTechScrollBarTitle2.setFont (CoreData::getInstance ().
getMenuFontNormal ());
keyTechScrollBarTitle2.setFont3D (CoreData::getInstance ().
getMenuFontNormal3D ());
mapInfoXPos = 260;
keyMapScrollBarTitle1.registerGraphicComponent (containerName,
"keyMapScrollBarTitle1");
keyMapScrollBarTitle1.init (mapInfoXPos + 5, scrollListsYPos + 30,
labelWidth, 20);
keyMapScrollBarTitle1.setText (lang.getString ("MapTitle1"));
keyMapScrollBarTitle1.setFont (CoreData::getInstance ().
getMenuFontBig ());
keyMapScrollBarTitle1.setFont3D (CoreData::getInstance ().
getMenuFontBig3D ());
keyMapScrollBarTitle2.registerGraphicComponent (containerName,
"keyMapScrollBarTitle2");
keyMapScrollBarTitle2.init (mapInfoXPos - 10 + keyButtonsWidthMap,
scrollListsYPos + 17, labelWidth, 20);
keyMapScrollBarTitle2.setText (lang.getString ("MapTitle2"));
keyMapScrollBarTitle2.setFont (CoreData::getInstance ().
getMenuFontNormal ());
keyMapScrollBarTitle2.setFont3D (CoreData::getInstance ().
getMenuFontNormal3D ());
tilesetInfoXPos = 530;
keyTilesetScrollBarTitle1.registerGraphicComponent (containerName,
"keyTilesetScrollBarTitle1");
keyTilesetScrollBarTitle1.init (tilesetInfoXPos + 5,
scrollListsYPos + 30, labelWidth, 20);
keyTilesetScrollBarTitle1.setText (lang.getString ("TilesetTitle1"));
keyTilesetScrollBarTitle1.setFont (CoreData::getInstance ().
getMenuFontBig ());
keyTilesetScrollBarTitle1.setFont3D (CoreData::getInstance ().
getMenuFontBig3D ());
scenarioInfoXPos = 755;
keyScenarioScrollBarTitle1.registerGraphicComponent (containerName,
"keyScenarioScrollBarTitle1");
keyScenarioScrollBarTitle1.init (scenarioInfoXPos, scrollListsYPos + 30,
labelWidth, 20);
keyScenarioScrollBarTitle1.setText (lang.getString ("ScenarioTitle1"));
keyScenarioScrollBarTitle1.setFont (CoreData::getInstance ().
getMenuFontBig ());
keyScenarioScrollBarTitle1.setFont3D (CoreData::getInstance ().
getMenuFontBig3D ());
mainMessageBoxState = ftpmsg_None;
mainMessageBox.registerGraphicComponent (containerName,
"mainMessageBox");
mainMessageBox.init (lang.getString ("Yes"), lang.getString ("No"),
450);
mainMessageBox.setEnabled (false);
lineHorizontal.init (0, installButtonYPos - 60);
lineVertical.init (500, returnLineY, 5,
installButtonYPos - 60 - returnLineY);
lineVertical.setHorizontal (false);
lineReturn.init (0, returnLineY);
modDescrLabel.registerGraphicComponent (containerName, "modDescrLabel");
modDescrLabel.init (15, installButtonYPos - 60 - 20, 450, 20);
modDescrLabel.setWordWrap (true);
modDescrLabel.setText ("description is empty");
pleaseWaitLabel.registerGraphicComponent (containerName,
"pleaseWaitLabel");
pleaseWaitLabel.init (50, installButtonYPos - 120, 450, 20);
pleaseWaitLabel.setText ("");
pleaseWaitLabel.setFont (CoreData::getInstance ().getMenuFontBig ());
pleaseWaitLabel.setFont3D (CoreData::getInstance ().
getMenuFontBig3D ());
buttonReturn.registerGraphicComponent (containerName, "buttonReturn");
buttonReturn.init (800, returnLineY - 30, 125);
buttonReturn.setText (lang.getString ("Return"));
lineVerticalReturn.init (buttonReturn.getX () - 10, returnLineY - 80, 5,
81);
lineVerticalReturn.setHorizontal (false);
int buttonLineUpY = installButtonYPos + 10;
int buttonLineDownY = installButtonYPos - 20;
int legendButtonY = buttonLineDownY - 30;
buttonInstalled.registerGraphicComponent (containerName,
"buttonInstalled");
buttonInstalled.init (5, legendButtonY, 240);
buttonInstalled.setText (" " + lang.getString ("ModInstalled"));
buttonInstalled.setUseCustomTexture (true);
buttonInstalled.setCustomTexture (CoreData::getInstance ().
getOnServerInstalledTexture ());
buttonInstalled.setEnabled (false);
buttonAvailable.registerGraphicComponent (containerName,
"buttonAvailable");
buttonAvailable.init (255, legendButtonY, 240);
buttonAvailable.setUseCustomTexture (true);
buttonAvailable.setCustomTexture (CoreData::getInstance ().
getOnServerTexture ());
buttonAvailable.setText (" " + lang.getString ("ModAvailable"));
buttonOnlyLocal.registerGraphicComponent (containerName,
"buttonOnlyLocal");
buttonOnlyLocal.init (505, legendButtonY, 240);
buttonOnlyLocal.setUseCustomTexture (true);
buttonOnlyLocal.setCustomTexture (CoreData::getInstance ().
getNotOnServerTexture ());
buttonOnlyLocal.setText (" " + lang.getString ("ModOnlyLocal"));
buttonConflict.registerGraphicComponent (containerName,
"buttonConflict");
buttonConflict.init (755, legendButtonY, 240);
buttonConflict.setUseCustomTexture (true);
buttonConflict.setCustomTexture (CoreData::getInstance ().
getOnServerDifferentTexture ());
buttonConflict.setText (" " + lang.getString ("ModHasConflict"));
buttonInstallTech.registerGraphicComponent (containerName,
"buttonInstallTech");
buttonInstallTech.init (techInfoXPos + 45, buttonLineUpY, 125);
buttonInstallTech.setText (lang.getString ("Install"));
buttonRemoveTech.registerGraphicComponent (containerName,
"buttonRemoveTech");
buttonRemoveTech.init (techInfoXPos + 45, buttonLineDownY, 125);
buttonRemoveTech.setText (lang.getString ("Remove"));
buttonInstallTileset.registerGraphicComponent (containerName,
"buttonInstallTileset");
buttonInstallTileset.init (tilesetInfoXPos + 30, buttonLineUpY, 125);
buttonInstallTileset.setText (lang.getString ("Install"));
buttonRemoveTileset.registerGraphicComponent (containerName,
"buttonRemoveTileset");
buttonRemoveTileset.init (tilesetInfoXPos + 30, buttonLineDownY, 125);
buttonRemoveTileset.setText (lang.getString ("Remove"));
buttonInstallMap.registerGraphicComponent (containerName,
"buttonInstallMap");
buttonInstallMap.init (mapInfoXPos + 50, buttonLineUpY, 125);
buttonInstallMap.setText (lang.getString ("Install"));
buttonRemoveMap.registerGraphicComponent (containerName,
"buttonRemoveMap");
buttonRemoveMap.init (mapInfoXPos + 50, buttonLineDownY, 125);
buttonRemoveMap.setText (lang.getString ("Remove"));
buttonInstallScenario.registerGraphicComponent (containerName,
"buttonInstallScenario");
buttonInstallScenario.init (scenarioInfoXPos + 45, buttonLineUpY, 125);
buttonInstallScenario.setText (lang.getString ("Install"));
buttonRemoveScenario.registerGraphicComponent (containerName,
"buttonRemoveScenario");
buttonRemoveScenario.init (scenarioInfoXPos + 45, buttonLineDownY, 125);
buttonRemoveScenario.setText (lang.getString ("Remove"));
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
keyTilesetScrollBar.init (tilesetInfoXPos + keyButtonsWidthTil,
scrollListsYPos - listBoxLength +
keyButtonsLineHeight, false, 200, 20);
keyTilesetScrollBar.setLength (listBoxLength);
keyTilesetScrollBar.setElementCount (0);
keyTilesetScrollBar.setVisibleSize (keyButtonsToRender);
keyTilesetScrollBar.setVisibleStart (0);
keyTechScrollBar.init (techInfoXPos + keyButtonsWidthTech + labelWidth +
20,
scrollListsYPos - listBoxLength +
keyButtonsLineHeight, false, 200, 20);
keyTechScrollBar.setLength (listBoxLength);
keyTechScrollBar.setElementCount (0);
keyTechScrollBar.setVisibleSize (keyButtonsToRender);
keyTechScrollBar.setVisibleStart (0);
keyMapScrollBar.init (mapInfoXPos + keyButtonsWidthMap + labelWidth +
20,
scrollListsYPos - listBoxLength +
keyButtonsLineHeight, false, 200, 20);
keyMapScrollBar.setLength (listBoxLength);
keyMapScrollBar.setElementCount (0);
keyMapScrollBar.setVisibleSize (keyButtonsToRender);
keyMapScrollBar.setVisibleStart (0);
keyScenarioScrollBar.init (scenarioInfoXPos + keyButtonsWidthScen,
scrollListsYPos - listBoxLength +
keyButtonsLineHeight, false, 200, 20);
keyScenarioScrollBar.setLength (listBoxLength);
keyScenarioScrollBar.setElementCount (0);
keyScenarioScrollBar.setVisibleSize (keyButtonsToRender);
keyScenarioScrollBar.setVisibleStart (0);
GraphicComponent::applyAllCustomProperties (containerName);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
// Start http meta data thread
static string mutexOwnerId =
string (extractFileFromDirectoryPath (__FILE__).c_str ()) +
string ("_") + intToStr (__LINE__);
modHttpServerThread = new SimpleTaskThread (this, 0, 200);
modHttpServerThread->setUniqueID (mutexOwnerId);
modHttpServerThread->start ();
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
// Setup File Transfer thread
findDirs (config.getPathListForType (ptTilesets), tilesetFiles);
findDirs (config.getPathListForType (ptTechs), techTreeFiles);
vector < string > mapPathList = config.getPathListForType (ptMaps);
std::pair < string, string > mapsPath;
if (mapPathList.empty () == false)
{
mapsPath.first = mapPathList[0];
}
if (mapPathList.size () > 1)
{
mapsPath.second = mapPathList[1];
}
std::pair < string, string > tilesetsPath;
vector < string > tilesetsList =
Config::getInstance ().getPathListForType (ptTilesets);
if (tilesetsList.empty () == false)
{
tilesetsPath.first = tilesetsList[0];
if (tilesetsList.size () > 1)
{
tilesetsPath.second = tilesetsList[1];
}
}
std::pair < string, string > techtreesPath;
vector < string > techtreesList =
Config::getInstance ().getPathListForType (ptTechs);
if (techtreesList.empty () == false)
{
techtreesPath.first = techtreesList[0];
if (techtreesList.size () > 1)
{
techtreesPath.second = techtreesList[1];
}
}
std::pair < string, string > scenariosPath;
vector < string > scenariosList =
Config::getInstance ().getPathListForType (ptScenarios);
if (scenariosList.empty () == false)
{
scenariosPath.first = scenariosList[0];
if (scenariosList.size () > 1)
{
scenariosPath.second = scenariosList[1];
}
}
string fileArchiveExtension =
config.getString ("FileArchiveExtension", "");
string fileArchiveExtractCommand =
config.getString ("FileArchiveExtractCommand", "");
string fileArchiveExtractCommandParameters =
config.getString ("FileArchiveExtractCommandParameters", "");
int32 fileArchiveExtractCommandSuccessResult =
config.getInt ("FileArchiveExtractCommandSuccessResult", "0");
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
console.setOnlyChatMessagesInStoredLines (false);
// Get path to temp files
string tempFilePath = "temp/";
if (getGameReadWritePath (GameConstants::path_logs_CacheLookupKey) !=
"")
{
tempFilePath =
getGameReadWritePath (GameConstants::path_logs_CacheLookupKey) +
tempFilePath;
}
else
{
string userData = config.getString ("UserData_Root", "");
if (userData != "")
{
endPathWithSlash (userData);
}
tempFilePath = userData + tempFilePath;
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Temp files path [%s]\n", tempFilePath.c_str ());
ftpClientThread = new FTPClientThread (-1, "",
mapsPath, tilesetsPath,
techtreesPath, scenariosPath,
this, fileArchiveExtension,
fileArchiveExtractCommand,
fileArchiveExtractCommandParameters,
fileArchiveExtractCommandSuccessResult,
tempFilePath);
ftpClientThread->start ();
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line %d]\n", __FILE__,
__FUNCTION__, __LINE__);
}
void MenuStateMods::reloadUI ()
{
Lang & lang = Lang::getInstance ();
console.resetFonts ();
keyTechScrollBarTitle1.setText (lang.getString ("TechTitle1"));
keyTechScrollBarTitle1.setFont (CoreData::getInstance ().
getMenuFontBig ());
keyTechScrollBarTitle1.setFont3D (CoreData::getInstance ().
getMenuFontBig3D ());
keyTechScrollBarTitle2.setText (lang.getString ("TechTitle2"));
keyTechScrollBarTitle2.setFont (CoreData::getInstance ().
getMenuFontNormal ());
keyTechScrollBarTitle2.setFont3D (CoreData::getInstance ().
getMenuFontNormal3D ());
keyMapScrollBarTitle1.setText (lang.getString ("MapTitle1"));
keyMapScrollBarTitle1.setFont (CoreData::getInstance ().
getMenuFontBig ());
keyMapScrollBarTitle1.setFont3D (CoreData::getInstance ().
getMenuFontBig3D ());
keyMapScrollBarTitle2.setText (lang.getString ("MapTitle2"));
keyMapScrollBarTitle2.setFont (CoreData::getInstance ().
getMenuFontNormal ());
keyMapScrollBarTitle2.setFont3D (CoreData::getInstance ().
getMenuFontNormal3D ());
keyTilesetScrollBarTitle1.setText (lang.getString ("TilesetTitle1"));
keyTilesetScrollBarTitle1.setFont (CoreData::getInstance ().
getMenuFontBig ());
keyTilesetScrollBarTitle1.setFont3D (CoreData::getInstance ().
getMenuFontBig3D ());
pleaseWaitLabel.setText ("");
pleaseWaitLabel.setFont (CoreData::getInstance ().getMenuFontBig ());
pleaseWaitLabel.setFont3D (CoreData::getInstance ().
getMenuFontBig3D ());
keyScenarioScrollBarTitle1.setText (lang.getString ("ScenarioTitle1"));
keyScenarioScrollBarTitle1.setFont (CoreData::getInstance ().
getMenuFontBig ());
keyScenarioScrollBarTitle1.setFont3D (CoreData::getInstance ().
getMenuFontBig3D ());
mainMessageBox.init (lang.getString ("Yes"), lang.getString ("No"),
450);
modDescrLabel.setText ("description is empty");
buttonReturn.setText (lang.getString ("Return"));
buttonInstalled.setText (lang.getString ("ModInstalled"));
buttonAvailable.setText (lang.getString ("ModAvailable"));
buttonOnlyLocal.setText (lang.getString ("ModOnlyLocal"));
buttonConflict.setText (lang.getString ("ModHasConflict"));
buttonInstallTech.setText (lang.getString ("Install"));
buttonRemoveTech.setText (lang.getString ("Remove"));
buttonInstallTileset.setText (lang.getString ("Install"));
buttonRemoveTileset.setText (lang.getString ("Remove"));
buttonInstallMap.setText (lang.getString ("Install"));
buttonRemoveMap.setText (lang.getString ("Remove"));
buttonInstallScenario.setText (lang.getString ("Install"));
buttonRemoveScenario.setText (lang.getString ("Remove"));
GraphicComponent::
reloadFontsForRegisterGraphicComponents (containerName);
}
void MenuStateMods::simpleTask (BaseThread * callingThread,
void *userdata)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper safeMutexThreadOwner (callingThread->
getMutexThreadOwnerValid (),
mutexOwnerId);
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
callingThread->getMutexThreadOwnerValid ()->setOwnerId (mutexOwnerId);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
Lang & lang = Lang::getInstance ();
Config & config = Config::getInstance ();
string fileArchiveExtractCommand =
config.getString ("FileArchiveExtractCommand", "");
int expectedResult =
config.getInt ("FileArchiveExtractCommandSuccessResult", "0");
bool findArchive =
executeShellCommand (fileArchiveExtractCommand, expectedResult);
if (findArchive == false)
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
showMessageBox (lang.getString ("ModRequires7z"),
lang.getString ("Notice"), true);
}
std::string techsMetaData = "";
std::string tilesetsMetaData = "";
std::string mapsMetaData = "";
std::string scenariosMetaData = "";
modMenuState = mmst_Loading;
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (config.getString ("Masterserver", "") != "")
{
string baseURL = config.getString ("Masterserver");
if (baseURL != "")
{
endPathWithSlash (baseURL, false);
}
string phpVersionParam =
config.getString ("phpVersionParam", "?version=0.1");
string playerUUID =
"&uuid=" +
SystemFlags::escapeURL (Config::getInstance ().
getString ("PlayerId", ""));
string gameVersion =
"&glestVersion=" + SystemFlags::escapeURL (glestVersionString);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf
("In [%s::%s Line %d] About to call first http url, base [%s]..\n",
__FILE__, __FUNCTION__, __LINE__, baseURL.c_str ());
CURL *handle = SystemFlags::initHTTP ();
CURLcode curlResult = CURLE_OK;
techsMetaData =
SystemFlags::getHTTP (baseURL + "showTechsForGlest.php" +
phpVersionParam + gameVersion + playerUUID,
handle, -1, &curlResult);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("techsMetaData [%s] curlResult = %d\n",
techsMetaData.c_str (), curlResult);
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
if (curlResult != CURLE_OK)
{
string curlError = curl_easy_strerror (curlResult);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModErrorGettingServerData").c_str (),
curlError.c_str ());
console.addLine (string ("#1 ") + szBuf, true);
}
if (curlResult == CURLE_OK ||
(curlResult != CURLE_COULDNT_RESOLVE_HOST &&
curlResult != CURLE_COULDNT_CONNECT))
{
tilesetsMetaData =
SystemFlags::getHTTP (baseURL + "showTilesetsForGlest.php" +
phpVersionParam + gameVersion, handle, -1,
&curlResult);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("tilesetsMetaData [%s]\n", tilesetsMetaData.c_str ());
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
if (curlResult != CURLE_OK)
{
string curlError = curl_easy_strerror (curlResult);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModErrorGettingServerData").c_str (),
curlError.c_str ());
console.addLine (string ("#2 ") + szBuf, true);
}
mapsMetaData =
SystemFlags::getHTTP (baseURL + "showMapsForGlest.php" +
phpVersionParam + gameVersion, handle, -1,
&curlResult);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("mapsMetaData [%s]\n", mapsMetaData.c_str ());
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
if (curlResult != CURLE_OK)
{
string curlError = curl_easy_strerror (curlResult);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModErrorGettingServerData").c_str (),
curlError.c_str ());
console.addLine (string ("#3 ") + szBuf, true);
}
scenariosMetaData =
SystemFlags::getHTTP (baseURL + "showScenariosForGlest.php" +
phpVersionParam + gameVersion, handle, -1,
&curlResult);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("scenariosMetaData [%s]\n", scenariosMetaData.c_str ());
if (curlResult != CURLE_OK)
{
string curlError = curl_easy_strerror (curlResult);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModErrorGettingServerData").c_str (),
curlError.c_str ());
console.addLine (string ("#4 ") + szBuf, true);
}
}
SystemFlags::cleanupHTTP (&handle);
}
else
{
console.addLine (lang.getString ("MasterServerMissing"), true);
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
tilesetListRemote.clear ();
Tokenize (tilesetsMetaData, tilesetListRemote, "\n");
modMenuState = mmst_CalculatingCRC;
getTilesetsLocalList ();
for (unsigned int i = 0; i < tilesetListRemote.size (); i++)
{
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
string result = refreshTilesetModInfo (tilesetListRemote[i]);
if (result != "")
{
ModInfo modinfo;
modinfo = tilesetCacheList[result];
GraphicButton *button = new GraphicButton ();
button->init (tilesetInfoXPos, keyButtonsYBase, keyButtonsWidthTil,
keyButtonsHeight);
button->setText (modinfo.name);
button->setUseCustomTexture (true);
button->setCustomTexture (CoreData::getInstance ().
getCustomTexture ());
keyTilesetButtons.push_back (button);
}
}
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
for (unsigned int i = 0; i < tilesetFilesUserData.size (); i++)
{
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
string tilesetName = tilesetFilesUserData[i];
bool alreadyHasTileset =
(tilesetCacheList.find (tilesetName) != tilesetCacheList.end ());
if (alreadyHasTileset == false)
{
GraphicButton *button = new GraphicButton ();
button->init (tilesetInfoXPos, keyButtonsYBase, keyButtonsWidthTil,
keyButtonsHeight);
button->setText (tilesetName);
button->setUseCustomTexture (true);
button->setCustomTexture (CoreData::getInstance ().
getCustomTexture ());
keyTilesetButtons.push_back (button);
}
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
techListRemote.clear ();
Tokenize (techsMetaData, techListRemote, "\n");
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
getTechsLocalList ();
for (unsigned int i = 0; i < techListRemote.size (); i++)
{
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
string result = refreshTechModInfo (techListRemote[i]);
if (result != "")
{
ModInfo modinfo;
modinfo = techCacheList[result];
GraphicButton *button = new GraphicButton ();
button->init (techInfoXPos, keyButtonsYBase, keyButtonsWidthTech,
keyButtonsHeight);
button->setText (modinfo.name);
button->setUseCustomTexture (true);
button->setCustomTexture (CoreData::getInstance ().
getCustomTexture ());
keyTechButtons.push_back (button);
GraphicLabel *label = new GraphicLabel ();
label->init (techInfoXPos + keyButtonsWidthTech + 10,
keyButtonsYBase, labelWidth, 20);
label->setText (modinfo.count);
labelsTech.push_back (label);
}
}
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
for (unsigned int i = 0; i < techTreeFilesUserData.size (); i++)
{
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
string techName = techTreeFilesUserData[i];
bool alreadyHasTech =
(techCacheList.find (techName) != techCacheList.end ());
if (alreadyHasTech == false)
{
vector < string > techPaths = config.getPathListForType (ptTechs);
string & techPath = techPaths[1];
endPathWithSlash (techPath);
vector < string > factions;
findAll (techPath + techName + "/factions/*.", factions, false,
false);
GraphicButton *button = new GraphicButton ();
button->init (techInfoXPos, keyButtonsYBase, keyButtonsWidthTech,
keyButtonsHeight);
button->setText (techName);
button->setUseCustomTexture (true);
button->setCustomTexture (CoreData::getInstance ().
getCustomTexture ());
keyTechButtons.push_back (button);
int techFactionCount = (int) factions.size ();
GraphicLabel *label = new GraphicLabel ();
label->init (techInfoXPos + keyButtonsWidthTech + 10,
keyButtonsYBase, labelWidth, 20);
label->setText (intToStr (techFactionCount));
labelsTech.push_back (label);
}
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
mapListRemote.clear ();
Tokenize (mapsMetaData, mapListRemote, "\n");
getMapsLocalList ();
for (unsigned int i = 0; i < mapListRemote.size (); i++)
{
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
string result = refreshMapModInfo (mapListRemote[i]);
if (result != "")
{
ModInfo modinfo;
modinfo = mapCacheList[result];
GraphicButton *button = new GraphicButton ();
button->init (mapInfoXPos, keyButtonsYBase, keyButtonsWidthMap,
keyButtonsHeight);
button->setText (modinfo.name);
button->setUseCustomTexture (true);
button->setCustomTexture (CoreData::getInstance ().
getCustomTexture ());
keyMapButtons.push_back (button);
GraphicLabel *label = new GraphicLabel ();
label->init (mapInfoXPos + keyButtonsWidthMap + 10, keyButtonsYBase,
labelWidth, 20);
label->setText (modinfo.count);
labelsMap.push_back (label);
}
}
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
for (unsigned int i = 0; i < mapFilesUserData.size (); i++)
{
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
string mapName = mapFilesUserData[i];
bool alreadyHasMap =
(mapCacheList.find (mapName) != mapCacheList.end ());
if (alreadyHasMap == false)
{
vector < string > mapPaths = config.getPathListForType (ptMaps);
string & mapPath = mapPaths[1];
endPathWithSlash (mapPath);
mapPath += mapName;
MapInfo mapInfo = loadMapInfo (mapPath);
GraphicButton *button = new GraphicButton ();
button->init (mapInfoXPos, keyButtonsYBase, keyButtonsWidthMap,
keyButtonsHeight);
button->setText (mapName);
button->setUseCustomTexture (true);
button->setCustomTexture (CoreData::getInstance ().
getCustomTexture ());
keyMapButtons.push_back (button);
int mapPlayerCount = mapInfo.players;
GraphicLabel *label = new GraphicLabel ();
label->init (mapInfoXPos + keyButtonsWidthMap + 10, keyButtonsYBase,
labelWidth, 20);
label->setText (intToStr (mapPlayerCount));
labelsMap.push_back (label);
}
}
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
scenarioListRemote.clear ();
Tokenize (scenariosMetaData, scenarioListRemote, "\n");
getScenariosLocalList ();
for (unsigned int i = 0; i < scenarioListRemote.size (); i++)
{
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
string result = refreshScenarioModInfo (scenarioListRemote[i]);
if (result != "")
{
ModInfo modinfo;
modinfo = scenarioCacheList[result];
GraphicButton *button = new GraphicButton ();
button->init (scenarioInfoXPos, keyButtonsYBase,
keyButtonsWidthScen, keyButtonsHeight);
button->setText (modinfo.name);
button->setUseCustomTexture (true);
button->setCustomTexture (CoreData::getInstance ().
getCustomTexture ());
keyScenarioButtons.push_back (button);
}
}
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
for (unsigned int i = 0; i < scenarioFilesUserData.size (); i++)
{
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__,
__LINE__);
return;
}
string scenarioName = scenarioFilesUserData[i];
bool alreadyHasScenario =
(scenarioCacheList.find (scenarioName) != scenarioCacheList.end ());
if (alreadyHasScenario == false)
{
vector < string > scenarioPaths =
config.getPathListForType (ptScenarios);
string & scenarioPath = scenarioPaths[1];
endPathWithSlash (scenarioPath);
scenarioPath += scenarioName;
GraphicButton *button = new GraphicButton ();
button->init (scenarioInfoXPos, keyButtonsYBase,
keyButtonsWidthScen, keyButtonsHeight);
button->setText (scenarioName);
button->setUseCustomTexture (true);
button->setCustomTexture (CoreData::getInstance ().
getCustomTexture ());
keyScenarioButtons.push_back (button);
}
}
if (callingThread->getQuitStatus () == true
|| safeMutexThreadOwner.isValidMutex () == false)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
keyTilesetScrollBar.init (tilesetInfoXPos + keyButtonsWidthTil,
scrollListsYPos - listBoxLength +
keyButtonsLineHeight, false, 200, 20);
keyTilesetScrollBar.setLength (listBoxLength);
keyTilesetScrollBar.setElementCount ((int) keyTilesetButtons.size ());
keyTilesetScrollBar.setVisibleSize (keyButtonsToRender);
keyTilesetScrollBar.setVisibleStart (0);
keyTechScrollBar.init (techInfoXPos + keyButtonsWidthTech + labelWidth +
20,
scrollListsYPos - listBoxLength +
keyButtonsLineHeight, false, 200, 20);
keyTechScrollBar.setLength (listBoxLength);
keyTechScrollBar.setElementCount ((int) keyTechButtons.size ());
keyTechScrollBar.setVisibleSize (keyButtonsToRender);
keyTechScrollBar.setVisibleStart (0);
keyMapScrollBar.init (mapInfoXPos + keyButtonsWidthMap + labelWidth +
20,
scrollListsYPos - listBoxLength +
keyButtonsLineHeight, false, 200, 20);
keyMapScrollBar.setLength (listBoxLength);
keyMapScrollBar.setElementCount ((int) keyMapButtons.size ());
keyMapScrollBar.setVisibleSize (keyButtonsToRender);
keyMapScrollBar.setVisibleStart (0);
keyScenarioScrollBar.init (scenarioInfoXPos + keyButtonsWidthScen,
scrollListsYPos - listBoxLength +
keyButtonsLineHeight, false, 200, 20);
keyScenarioScrollBar.setLength (listBoxLength);
keyScenarioScrollBar.setElementCount ((int) keyScenarioButtons.size ());
keyScenarioScrollBar.setVisibleSize (keyButtonsToRender);
keyScenarioScrollBar.setVisibleStart (0);
modMenuState = mmst_None;
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (modHttpServerThread != NULL)
{
modHttpServerThread->signalQuit ();
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
}
MapInfo MenuStateMods::loadMapInfo (string file)
{
try
{
Lang & lang = Lang::getInstance ();
// Not painting properly so this is on hold
MapPreview::loadMapInfo (file, &mapInfo,
lang.getString ("MaxPlayers"),
lang.getString ("Size"), true);
}
catch (exception & e)
{
SystemFlags::OutputDebug (SystemFlags::debugError,
"In [%s::%s Line: %d] Error [%s] loading map [%s]\n",
__FILE__, __FUNCTION__, __LINE__, e.what (),
file.c_str ());
throw megaglest_runtime_error ("Error loading map file: [" + file +
"] msg: " + e.what ());
}
return mapInfo;
}
void MenuStateMods::getTechsLocalList ()
{
Config & config = Config::getInstance ();
vector < string > results;
findDirs (config.getPathListForType (ptTechs), results);
techTreeFiles = results;
techTreeFilesUserData.clear ();
if (config.getPathListForType (ptTechs).size () > 1)
{
string path = config.getPathListForType (ptTechs)[1];
endPathWithSlash (path);
findDirs (path, techTreeFilesUserData, false, false);
}
}
string MenuStateMods::refreshTechModInfo (string techInfo)
{
std::vector < std::string > techInfoList;
Tokenize (techInfo, techInfoList, "|");
if (techInfoList.size () >= 6)
{
Config & config = Config::getInstance ();
ModInfo modinfo;
modinfo.name = techInfoList[0];
modinfo.count = techInfoList[1];
modinfo.crc = techInfoList[2];
modinfo.description = techInfoList[3];
modinfo.url = techInfoList[4];
modinfo.imageUrl = techInfoList[5];
modinfo.type = mt_Techtree;
string itemPath =
config.getPathListForType (ptTechs,
"")[1] + "/" + modinfo.name +
string ("/*");
if (itemPath.empty () == false)
{
bool forceRefresh =
(mapCRCUpdateList.find (itemPath) == mapCRCUpdateList.end ());
uint32 crc =
getFolderTreeContentsCheckSumRecursively (itemPath, ".xml", NULL,
forceRefresh);
if (crc == 0)
{
itemPath =
config.getPathListForType (ptTechs,
"")[0] + "/" + modinfo.name +
string ("/*");
if (itemPath.empty () == false)
{
forceRefresh =
(mapCRCUpdateList.find (itemPath) == mapCRCUpdateList.end ());
crc =
getFolderTreeContentsCheckSumRecursively (itemPath, ".xml",
NULL, forceRefresh);
}
}
modinfo.localCRC = uIntToStr (crc);
//printf("itemPath='%s' remote crc:'%s' local crc:'%s' crc='%d' \n",itemPath.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str(),crc);
}
else
{
modinfo.localCRC = "";
}
techCacheList[modinfo.name] = modinfo;
return modinfo.name;
}
return "";
}
void MenuStateMods::refreshTechs ()
{
getTechsLocalList ();
for (int i = 0; i < (int) techListRemote.size (); i++)
{
refreshTechModInfo (techListRemote[i]);
}
}
void MenuStateMods::getTilesetsLocalList ()
{
Config & config = Config::getInstance ();
vector < string > results;
findDirs (config.getPathListForType (ptTilesets), results);
tilesetFiles = results;
tilesetFilesUserData.clear ();
if (config.getPathListForType (ptTilesets).size () > 1)
{
string path = config.getPathListForType (ptTilesets)[1];
endPathWithSlash (path);
findDirs (path, tilesetFilesUserData, false, false);
}
}
string MenuStateMods::refreshTilesetModInfo (string tilesetInfo)
{
std::vector < std::string > tilesetInfoList;
Tokenize (tilesetInfo, tilesetInfoList, "|");
if (tilesetInfoList.size () >= 5)
{
Config & config = Config::getInstance ();
ModInfo modinfo;
modinfo.name = tilesetInfoList[0];
modinfo.crc = tilesetInfoList[1];
modinfo.description = tilesetInfoList[2];
modinfo.url = tilesetInfoList[3];
modinfo.imageUrl = tilesetInfoList[4];
modinfo.type = mt_Tileset;
string itemPath =
config.getPathListForType (ptTilesets,
"")[1] + "/" + modinfo.name +
string ("/*");
if (itemPath.empty () == false)
{
bool forceRefresh =
(mapCRCUpdateList.find (itemPath) == mapCRCUpdateList.end ());
uint32 crc =
getFolderTreeContentsCheckSumRecursively (itemPath, ".xml", NULL,
forceRefresh);
if (crc == 0)
{
itemPath =
config.getPathListForType (ptTilesets,
"")[0] + "/" + modinfo.name +
string ("/*");
if (itemPath.empty () == false)
{
forceRefresh =
(mapCRCUpdateList.find (itemPath) == mapCRCUpdateList.end ());
crc =
getFolderTreeContentsCheckSumRecursively (itemPath, ".xml",
NULL, forceRefresh);
}
}
modinfo.localCRC = uIntToStr (crc);
//printf("itemPath='%s' remote crc:'%s' local crc:'%s' crc='%d' \n",itemPath.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str(),crc);
//printf("#1 refreshTilesetModInfo name [%s] modInfo.crc [%s] modInfo.localCRC [%s]\n",modinfo.name.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str());
}
else
{
modinfo.localCRC = "";
//printf("#2 refreshTilesetModInfo name [%s] modInfo.crc [%s] modInfo.localCRC [%s]\n",modinfo.name.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str());
}
tilesetCacheList[modinfo.name] = modinfo;
return modinfo.name;
}
return "";
}
void MenuStateMods::refreshTilesets ()
{
getTilesetsLocalList ();
for (int i = 0; i < (int) tilesetListRemote.size (); i++)
{
refreshTilesetModInfo (tilesetListRemote[i]);
}
}
void MenuStateMods::getMapsLocalList ()
{
/*
Config &config = Config::getInstance();
vector<string> results;
set<string> allMaps;
findAll(config.getPathListForType(ptMaps), "*.gbm", results, false, false);
copy(results.begin(), results.end(), std::inserter(allMaps, allMaps.begin()));
results.clear();
findAll(config.getPathListForType(ptMaps), "*.mgm", results, false, false);
copy(results.begin(), results.end(), std::inserter(allMaps, allMaps.begin()));
results.clear();
copy(allMaps.begin(), allMaps.end(), std::back_inserter(results));
mapFiles = results;
mapFilesUserData.clear();
if(config.getPathListForType(ptMaps).size() > 1) {
string path = config.getPathListForType(ptMaps)[1];
endPathWithSlash(path);
vector<string> results2;
set<string> allMaps2;
findAll(path + "*.gbm", results2, false, false);
copy(results2.begin(), results2.end(), std::inserter(allMaps2, allMaps2.begin()));
results2.clear();
findAll(path + "*.mgm", results2, false, false);
copy(results2.begin(), results2.end(), std::inserter(allMaps2, allMaps2.begin()));
results2.clear();
copy(allMaps2.begin(), allMaps2.end(), std::back_inserter(results2));
mapFilesUserData = results2;
//printf("\n\nMap path [%s] mapFilesUserData.size() = %d\n\n\n",path.c_str(),mapFilesUserData.size());
}
*/
Config & config = Config::getInstance ();
string scenarioDir = "";
vector < string > pathList =
config.getPathListForType (ptMaps, scenarioDir);
vector < string > invalidMapList;
vector < string > allMaps =
MapPreview::findAllValidMaps (pathList, scenarioDir, false, false,
&invalidMapList);
if (allMaps.empty ())
{
throw megaglest_runtime_error ("No maps were found!");
}
vector < string > results;
copy (allMaps.begin (), allMaps.end (), std::back_inserter (results));
mapFiles = results;
mapFilesUserData =
MapPreview::findAllValidMaps (pathList, scenarioDir, true, false,
&invalidMapList);
}
string MenuStateMods::refreshMapModInfo (string mapInfo)
{
std::vector < std::string > mapInfoList;
Tokenize (mapInfo, mapInfoList, "|");
if (mapInfoList.size () >= 6)
{
//Config &config = Config::getInstance();
ModInfo modinfo;
modinfo.name = mapInfoList[0];
modinfo.count = mapInfoList[1];
modinfo.crc = mapInfoList[2];
modinfo.description = mapInfoList[3];
modinfo.url = mapInfoList[4];
modinfo.imageUrl = mapInfoList[5];
modinfo.type = mt_Map;
modinfo.localCRC = getMapCRC (modinfo.name);
mapCacheList[modinfo.name] = modinfo;
return modinfo.name;
}
return "";
}
string MenuStateMods::getMapCRC (string mapName)
{
Config & config = Config::getInstance ();
vector < string > mappaths = config.getPathListForType (ptMaps, "");
string result = "";
if (mappaths.empty () == false)
{
Checksum checksum;
string itemPath = mappaths[1] + "/" + mapName;
if (fileExists (itemPath))
{
checksum.addFile (itemPath);
uint32 crc = checksum.getSum ();
result = uIntToStr (crc);
//printf("itemPath='%s' modinfo.name='%s' remote crc:'%s' local crc:'%s' crc='%d' \n",itemPath.c_str(),modinfo.name.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str(),crc);
}
else
{
itemPath = mappaths[0] + "/" + mapName;
if (fileExists (itemPath))
{
checksum.addFile (itemPath);
uint32 crc = checksum.getSum ();
result = uIntToStr (crc);
//printf("itemPath='%s' modinfo.name='%s' remote crc:'%s' local crc:'%s' crc='%d' \n",itemPath.c_str(),modinfo.name.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str(),crc);
}
else
{
result = "";
}
}
}
else
{
result = "";
}
return result;
}
void MenuStateMods::refreshMaps ()
{
getMapsLocalList ();
for (int i = 0; i < (int) mapListRemote.size (); i++)
{
refreshMapModInfo (mapListRemote[i]);
}
}
void MenuStateMods::getScenariosLocalList ()
{
Config & config = Config::getInstance ();
vector < string > results;
findDirs (config.getPathListForType (ptScenarios), results);
scenarioFiles = results;
scenarioFilesUserData.clear ();
if (config.getPathListForType (ptScenarios).size () > 1)
{
string path = config.getPathListForType (ptScenarios)[1];
endPathWithSlash (path);
findDirs (path, scenarioFilesUserData, false, false);
}
}
string MenuStateMods::refreshScenarioModInfo (string scenarioInfo)
{
std::vector < std::string > scenarioInfoList;
Tokenize (scenarioInfo, scenarioInfoList, "|");
if (scenarioInfoList.size () >= 5)
{
Config & config = Config::getInstance ();
ModInfo modinfo;
modinfo.name = scenarioInfoList[0];
modinfo.crc = scenarioInfoList[1];
modinfo.description = scenarioInfoList[2];
modinfo.url = scenarioInfoList[3];
modinfo.imageUrl = scenarioInfoList[4];
modinfo.type = mt_Scenario;
string itemPath =
config.getPathListForType (ptScenarios,
"")[1] + "/" + modinfo.name +
string ("/*");
if (itemPath.empty () == false)
{
bool forceRefresh =
(mapCRCUpdateList.find (itemPath) == mapCRCUpdateList.end ());
uint32 crc =
getFolderTreeContentsCheckSumRecursively (itemPath, ".xml", NULL,
forceRefresh);
if (crc == 0)
{
itemPath =
config.getPathListForType (ptScenarios,
"")[0] + "/" + modinfo.name +
string ("/*");
if (itemPath.empty () == false)
{
forceRefresh =
(mapCRCUpdateList.find (itemPath) == mapCRCUpdateList.end ());
crc =
getFolderTreeContentsCheckSumRecursively (itemPath, ".xml",
NULL, forceRefresh);
}
}
modinfo.localCRC = uIntToStr (crc);
//printf(" itemPath='%s' remote crc:'%s' local crc:'%s' crc='%d' \n",itemPath.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str(),crc);
}
else
{
modinfo.localCRC = "";
}
scenarioCacheList[modinfo.name] = modinfo;
return modinfo.name;
}
return "";
}
void MenuStateMods::refreshScenarios ()
{
getScenariosLocalList ();
for (int i = 0; i < (int) scenarioListRemote.size (); i++)
{
refreshScenarioModInfo (scenarioListRemote[i]);
}
}
void MenuStateMods::cleanUp ()
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line %d]\n", __FILE__,
__FUNCTION__, __LINE__);
if (modHttpServerThread != NULL)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line %d]\n", __FILE__,
__FUNCTION__, __LINE__);
modHttpServerThread->signalQuit ();
//modHttpServerThread->setThreadOwnerValid(false);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line %d]\n", __FILE__,
__FUNCTION__, __LINE__);
if (modHttpServerThread->canShutdown (true) == true
&& modHttpServerThread->shutdownAndWait () == true)
{
delete modHttpServerThread;
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
modHttpServerThread = NULL;
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
if (ftpClientThread != NULL)
{
ftpClientThread->setCallBackObject (NULL);
ftpClientThread->signalQuit ();
sleep (0);
if (ftpClientThread->canShutdown (true) == true &&
ftpClientThread->shutdownAndWait () == true)
{
delete ftpClientThread;
}
else
{
char szBuf[8096] = "";
snprintf (szBuf, 8096,
"In [%s::%s %d] Error cannot shutdown ftpClientThread\n",
extractFileFromDirectoryPath (__FILE__).c_str (),
__FUNCTION__, __LINE__);
//SystemFlags::OutputDebug(SystemFlags::debugError,szBuf);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("%s", szBuf);
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem, "%s", szBuf);
//publishToMasterserverThread->cleanup();
}
ftpClientThread = NULL;
// ftpClientThread->signalQuit();
// ftpClientThread->setCallBackObject(NULL);
// if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
// if( ftpClientThread->shutdownAndWait() == true) {
// if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
// delete ftpClientThread;
// }
// ftpClientThread = NULL;
// if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
clearUserButtons ();
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
cleanupPreviewTexture ();
cleanupMapPreviewTexture ();
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
}
MenuStateMods::~MenuStateMods ()
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
cleanUp ();
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d]\n", __FILE__, __FUNCTION__, __LINE__);
}
void MenuStateMods::clearUserButtons ()
{
// Techs
while (!keyTechButtons.empty ())
{
delete keyTechButtons.back ();
keyTechButtons.pop_back ();
}
keyTechScrollBar.setElementCount (0);
while (!labelsTech.empty ())
{
delete labelsTech.back ();
labelsTech.pop_back ();
}
// Tilesets
while (!keyTilesetButtons.empty ())
{
delete keyTilesetButtons.back ();
keyTilesetButtons.pop_back ();
}
keyTilesetScrollBar.setElementCount (0);
// Maps
while (!keyMapButtons.empty ())
{
delete keyMapButtons.back ();
keyMapButtons.pop_back ();
}
while (!labelsMap.empty ())
{
delete labelsMap.back ();
labelsMap.pop_back ();
}
keyMapScrollBar.setElementCount (0);
// Scenarios
while (!keyScenarioButtons.empty ())
{
delete keyScenarioButtons.back ();
keyScenarioButtons.pop_back ();
}
keyScenarioScrollBar.setElementCount (0);
}
void MenuStateMods::mouseClick (int x, int y, MouseButton mouseButton)
{
CoreData & coreData = CoreData::getInstance ();
SoundRenderer & soundRenderer = SoundRenderer::getInstance ();
Lang & lang = Lang::getInstance ();
if (buttonReturn.mouseClick (x, y))
{
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line %d]\n", __FILE__,
__FUNCTION__, __LINE__);
soundRenderer.playFx (coreData.getClickSoundA ());
if (fileFTPProgressList.empty () == false)
{
mainMessageBoxState = ftpmsg_Quit;
mainMessageBox.init (lang.getString ("Yes"), lang.getString ("No"),
450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModDownloadInProgressCancelQuestion").
c_str (), fileFTPProgressList.size ());
showMessageBox (szBuf, lang.getString ("Question"), true);
}
else
{
cleanUp ();
mainMenu->setState (new MenuStateRoot (program, mainMenu));
return;
}
}
else if (mainMessageBox.getEnabled ())
{
int button = 0;
if (mainMessageBox.mouseClick (x, y, button))
{
soundRenderer.playFx (coreData.getClickSoundA ());
mainMessageBox.setEnabled (false);
mainMessageBox.init (lang.getString ("Yes"), lang.getString ("No"),
450);
if (button == 0)
{
if (mainMessageBoxState == ftpmsg_Quit)
{
mainMessageBoxState = ftpmsg_None;
mainMenu->setState (new MenuStateRoot (program, mainMenu));
return;
}
else if (mainMessageBoxState == ftpmsg_GetMap ||
mainMessageBoxState == ftpmsg_ReplaceMap)
{
bool getItemAfterRemoval =
(mainMessageBoxState == ftpmsg_ReplaceMap);
mainMessageBoxState = ftpmsg_None;
Config & config = Config::getInstance ();
vector < string > mapPaths = config.getPathListForType (ptMaps);
if (mapPaths.size () > 1)
{
string removeMap = mapPaths[1];
endPathWithSlash (removeMap);
removeMap += selectedMapName;
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Removing Map [%s]\n", removeMap.c_str ());
removeFile (removeMap);
bool remoteHasMap =
(mapCacheList.find (selectedMapName) !=
mapCacheList.end ());
if (remoteHasMap == false)
{
for (unsigned int i = 0; i < keyMapButtons.size (); ++i)
{
GraphicButton *button = keyMapButtons[i];
if (button != NULL
&& button->getText () == selectedMapName)
{
delete button;
keyMapButtons.erase (keyMapButtons.begin () + i);
labelsMap.erase (labelsMap.begin () + i);
keyMapScrollBar.setElementCount ((int) keyMapButtons.
size ());
break;
}
}
}
if (getItemAfterRemoval == false)
{
selectedMapName = "";
}
refreshMaps ();
Checksum::clearFileCache ();
if (getItemAfterRemoval == true)
{
string mapName = selectedMapName;
string mapURL = mapCacheList[mapName].url;
if (ftpClientThread != NULL)
ftpClientThread->addMapToRequests (mapName, mapURL);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->
setOwnerId (mutexOwnerId);
fileFTPProgressList[mapName] = pair < int, string > (0, "");
safeMutexFTPProgress.ReleaseLock ();
buttonInstallMap.setEnabled (false);
}
}
}
else if (mainMessageBoxState == ftpmsg_GetTileset ||
mainMessageBoxState == ftpmsg_ReplaceTileset)
{
bool getItemAfterRemoval =
(mainMessageBoxState == ftpmsg_ReplaceTileset);
mainMessageBoxState = ftpmsg_None;
Config & config = Config::getInstance ();
vector < string > tilesetPaths =
config.getPathListForType (ptTilesets);
if (tilesetPaths.size () > 1)
{
string removeTileset = tilesetPaths[1];
endPathWithSlash (removeTileset);
removeTileset += selectedTilesetName;
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Removing Tileset [%s]\n", removeTileset.c_str ());
removeFolder (removeTileset);
bool remoteHasTileset =
(tilesetCacheList.find (selectedTilesetName) !=
tilesetCacheList.end ());
if (remoteHasTileset == false)
{
//printf("\n\n\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ remote DOES NOT have removed tileset [%s]\n\n\n",selectedTilesetName.c_str());
for (unsigned int i = 0; i < keyTilesetButtons.size (); ++i)
{
GraphicButton *button = keyTilesetButtons[i];
if (button != NULL
&& button->getText () == selectedTilesetName)
{
delete button;
keyTilesetButtons.erase (keyTilesetButtons.begin () +
i);
keyTilesetScrollBar.
setElementCount ((int) keyTilesetButtons.size ());
break;
}
}
}
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->
setOwnerId (mutexOwnerId);
Checksum::clearFileCache ();
vector < string > paths =
Config::getInstance ().getPathListForType (ptTilesets);
string pathSearchString =
string ("/") + selectedTilesetName + string ("/*");
const string filterFileExt = ".xml";
clearFolderTreeContentsCheckSum (paths, pathSearchString,
filterFileExt);
clearFolderTreeContentsCheckSumList (paths, pathSearchString,
filterFileExt);
safeMutexFTPProgress.ReleaseLock ();
if (getItemAfterRemoval == false)
{
selectedTilesetName = "";
}
refreshTilesets ();
}
if (getItemAfterRemoval == true)
{
string tilesetName = selectedTilesetName;
string tilesetURL = tilesetCacheList[tilesetName].url;
if (ftpClientThread != NULL)
ftpClientThread->addTilesetToRequests (tilesetName,
tilesetURL);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->
setOwnerId (mutexOwnerId);
fileFTPProgressList[tilesetName] =
pair < int, string > (0, "");
safeMutexFTPProgress.ReleaseLock ();
buttonInstallTileset.setEnabled (false);
}
}
else if (mainMessageBoxState == ftpmsg_GetTechtree ||
mainMessageBoxState == ftpmsg_ReplaceTechtree)
{
bool getItemAfterRemoval =
(mainMessageBoxState == ftpmsg_ReplaceTechtree);
mainMessageBoxState = ftpmsg_None;
Config & config = Config::getInstance ();
vector < string > techPaths =
config.getPathListForType (ptTechs);
if (techPaths.size () > 1)
{
string removeTech = techPaths[1];
endPathWithSlash (removeTech);
removeTech += selectedTechName;
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Removing Techtree [%s]\n", removeTech.c_str ());
removeFolder (removeTech);
bool remoteHasTech =
(techCacheList.find (selectedTechName) !=
techCacheList.end ());
if (remoteHasTech == false)
{
for (unsigned int i = 0; i < keyTechButtons.size (); ++i)
{
GraphicButton *button = keyTechButtons[i];
if (button != NULL
&& button->getText () == selectedTechName)
{
delete button;
keyTechButtons.erase (keyTechButtons.begin () + i);
labelsTech.erase (labelsTech.begin () + i);
keyTechScrollBar.setElementCount ((int) keyTechButtons.
size ());
break;
}
}
}
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->
setOwnerId (mutexOwnerId);
// Clear the CRC file Cache
Checksum::clearFileCache ();
vector < string > paths =
Config::getInstance ().getPathListForType (ptTechs);
string pathSearchString =
string ("/") + selectedTechName + string ("/*");
const string filterFileExt = ".xml";
clearFolderTreeContentsCheckSum (paths, pathSearchString,
filterFileExt);
clearFolderTreeContentsCheckSumList (paths, pathSearchString,
filterFileExt);
safeMutexFTPProgress.ReleaseLock ();
if (getItemAfterRemoval == false)
{
selectedTechName = "";
}
refreshTechs ();
}
if (getItemAfterRemoval == true)
{
string techName = selectedTechName;
string techURL = techCacheList[techName].url;
if (ftpClientThread != NULL)
ftpClientThread->addTechtreeToRequests (techName, techURL);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->
setOwnerId (mutexOwnerId);
fileFTPProgressList[techName] = pair < int, string > (0, "");
safeMutexFTPProgress.ReleaseLock ();
buttonInstallTech.setEnabled (false);
}
}
else if (mainMessageBoxState == ftpmsg_GetScenario ||
mainMessageBoxState == ftpmsg_ReplaceScenario)
{
bool getItemAfterRemoval =
(mainMessageBoxState == ftpmsg_ReplaceScenario);
mainMessageBoxState = ftpmsg_None;
Config & config = Config::getInstance ();
vector < string > scenarioPaths =
config.getPathListForType (ptScenarios);
if (scenarioPaths.size () > 1)
{
string removeScenario = scenarioPaths[1];
endPathWithSlash (removeScenario);
removeScenario += selectedScenarioName;
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Removing Scenario [%s]\n",
removeScenario.c_str ());
removeFolder (removeScenario);
bool remoteHasScenario =
(scenarioCacheList.find (selectedScenarioName) !=
scenarioCacheList.end ());
if (remoteHasScenario == false)
{
for (unsigned int i = 0; i < keyScenarioButtons.size ();
++i)
{
GraphicButton *button = keyScenarioButtons[i];
if (button != NULL
&& button->getText () == selectedScenarioName)
{
delete button;
keyScenarioButtons.erase (keyScenarioButtons.begin () +
i);
keyScenarioScrollBar.
setElementCount ((int) keyScenarioButtons.size ());
break;
}
}
}
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->
setOwnerId (mutexOwnerId);
Checksum::clearFileCache ();
vector < string > paths =
Config::getInstance ().getPathListForType (ptScenarios);
string pathSearchString =
string ("/") + selectedScenarioName + string ("/*");
const string filterFileExt = ".xml";
clearFolderTreeContentsCheckSum (paths, pathSearchString,
filterFileExt);
clearFolderTreeContentsCheckSumList (paths, pathSearchString,
filterFileExt);
safeMutexFTPProgress.ReleaseLock ();
if (getItemAfterRemoval == false)
{
selectedScenarioName = "";
}
refreshScenarios ();
}
if (getItemAfterRemoval == true)
{
string scenarioName = selectedScenarioName;
string scenarioURL = scenarioCacheList[scenarioName].url;
if (ftpClientThread != NULL)
ftpClientThread->addScenarioToRequests (scenarioName,
scenarioURL);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->
setOwnerId (mutexOwnerId);
fileFTPProgressList[scenarioName] =
pair < int, string > (0, "");
safeMutexFTPProgress.ReleaseLock ();
buttonInstallScenario.setEnabled (false);
}
}
}
}
}
else if (keyTechScrollBar.mouseClick (x, y))
{
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
soundRenderer.playFx (coreData.getClickSoundA ());
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
}
else if (keyTilesetScrollBar.mouseClick (x, y))
{
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
soundRenderer.playFx (coreData.getClickSoundA ());
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
}
else if (keyMapScrollBar.mouseClick (x, y))
{
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
soundRenderer.playFx (coreData.getClickSoundA ());
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
}
else if (keyScenarioScrollBar.mouseClick (x, y))
{
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
soundRenderer.playFx (coreData.getClickSoundA ());
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
}
else if (buttonInstallTech.mouseClick (x, y)
&& buttonInstallTech.getEnabled ())
{
soundRenderer.playFx (coreData.getClickSoundB ());
if (selectedTechName != "")
{
bool alreadyHasTech =
(std::
find (techTreeFiles.begin (), techTreeFiles.end (),
selectedTechName) != techTreeFiles.end ());
if (alreadyHasTech == true)
{
bool remoteHasTech =
(techCacheList.find (selectedTechName) != techCacheList.end ());
if (remoteHasTech == true)
{
ModInfo & modInfo = techCacheList[selectedTechName];
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d] remote CRC [%s]\n", __FILE__,
__FUNCTION__, __LINE__, modInfo.crc.c_str ());
Config & config = Config::getInstance ();
string itemPath =
config.getPathListForType (ptTechs,
"")[1] + "/" + selectedTechName +
string ("/*");
bool forceRefresh =
(mapCRCUpdateList.find (itemPath) == mapCRCUpdateList.end ());
if (strToUInt (modInfo.crc) != 0
&& strToUInt (modInfo.crc) !=
getFolderTreeContentsCheckSumRecursively (itemPath, ".xml",
NULL,
forceRefresh))
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d] local CRC [%u]\n", __FILE__,
__FUNCTION__, __LINE__,
getFolderTreeContentsCheckSumRecursively (itemPath,
".xml",
NULL));
mainMessageBoxState = ftpmsg_ReplaceTechtree;
mainMessageBox.init (lang.getString ("Yes"),
lang.getString ("No"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModLocalRemoteMismatch").c_str (),
selectedTechName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModTechAlreadyInstalled").c_str (),
selectedTechName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
mapCRCUpdateList[itemPath] = true;
}
}
else
{
string techName = selectedTechName;
string techURL = techCacheList[techName].url;
if (ftpClientThread != NULL)
ftpClientThread->addTechtreeToRequests (techName, techURL);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
fileFTPProgressList[techName] = pair < int, string > (0, "");
safeMutexFTPProgress.ReleaseLock ();
buttonInstallTech.setEnabled (false);
}
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
showMessageBox (lang.getString ("ModSelectTechToInstall"),
lang.getString ("Notice"), true);
}
}
else if (buttonRemoveTech.mouseClick (x, y)
&& buttonRemoveTech.getEnabled ())
{
soundRenderer.playFx (coreData.getClickSoundB ());
if (selectedTechName != "")
{
bool alreadyHasTech =
(std::
find (techTreeFiles.begin (), techTreeFiles.end (),
selectedTechName) != techTreeFiles.end ());
if (alreadyHasTech == true)
{
mainMessageBoxState = ftpmsg_GetTechtree;
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModRemoveTechConfirm").c_str (),
selectedTechName.c_str ());
showMessageBox (szBuf, lang.getString ("Question"), true);
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModCannotRemoveTechNotInstalled").
c_str (), selectedTechName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
showMessageBox (lang.getString ("ModSelectTechToRemove"),
lang.getString ("Notice"), true);
}
}
else if (buttonInstallTileset.mouseClick (x, y)
&& buttonInstallTileset.getEnabled ())
{
soundRenderer.playFx (coreData.getClickSoundB ());
if (selectedTilesetName != "")
{
bool alreadyHasTileset =
(std::
find (tilesetFiles.begin (), tilesetFiles.end (),
selectedTilesetName) != tilesetFiles.end ());
if (alreadyHasTileset == true)
{
bool remoteHasTileset =
(tilesetCacheList.find (selectedTilesetName) !=
tilesetCacheList.end ());
if (remoteHasTileset)
{
ModInfo & modInfo = tilesetCacheList[selectedTilesetName];
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d] remote CRC [%s]\n", __FILE__,
__FUNCTION__, __LINE__, modInfo.crc.c_str ());
Config & config = Config::getInstance ();
string itemPath =
config.getPathListForType (ptTilesets,
"")[1] + "/" +
selectedTilesetName + string ("/*");
bool forceRefresh =
(mapCRCUpdateList.find (itemPath) == mapCRCUpdateList.end ());
if (strToUInt (modInfo.crc) != 0 &&
strToUInt (modInfo.crc) !=
getFolderTreeContentsCheckSumRecursively (itemPath, ".xml",
NULL,
forceRefresh))
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d] local CRC [%u] [%s]\n",
__FILE__, __FUNCTION__, __LINE__,
getFolderTreeContentsCheckSumRecursively (itemPath,
".xml",
NULL),
itemPath.c_str ());
mainMessageBoxState = ftpmsg_ReplaceTileset;
mainMessageBox.init (lang.getString ("Yes"),
lang.getString ("No"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModLocalRemoteMismatch").c_str (),
selectedTilesetName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModTilesetAlreadyInstalled").
c_str (), selectedTilesetName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
}
}
else
{
string tilesetName = selectedTilesetName;
string tilesetURL = tilesetCacheList[tilesetName].url;
if (ftpClientThread != NULL)
ftpClientThread->addTilesetToRequests (tilesetName, tilesetURL);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
fileFTPProgressList[tilesetName] = pair < int, string > (0, "");
safeMutexFTPProgress.ReleaseLock ();
buttonInstallTileset.setEnabled (false);
}
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
showMessageBox (lang.getString ("ModSelectTilesetToInstall"),
lang.getString ("Notice"), true);
}
}
else if (buttonRemoveTileset.mouseClick (x, y)
&& buttonRemoveTileset.getEnabled ())
{
soundRenderer.playFx (coreData.getClickSoundB ());
if (selectedTilesetName != "")
{
bool alreadyHasTileset =
(std::
find (tilesetFiles.begin (), tilesetFiles.end (),
selectedTilesetName) != tilesetFiles.end ());
if (alreadyHasTileset == true)
{
mainMessageBoxState = ftpmsg_GetTileset;
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModRemoveTilesetConfirm").c_str (),
selectedTilesetName.c_str ());
showMessageBox (szBuf, lang.getString ("Question"), true);
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModCannotRemoveTilesetNotInstalled").
c_str (), selectedTilesetName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
showMessageBox (lang.getString ("ModSelectTilesetToRemove"),
lang.getString ("Notice"), true);
}
}
else if (buttonInstallMap.mouseClick (x, y)
&& buttonInstallMap.getEnabled ())
{
soundRenderer.playFx (coreData.getClickSoundB ());
if (selectedMapName != "")
{
bool alreadyHasMap =
(std::
find (mapFiles.begin (), mapFiles.end (),
selectedMapName) != mapFiles.end ());
if (alreadyHasMap == true)
{
bool remoteHasMap =
(mapCacheList.find (selectedMapName) != mapCacheList.end ());
if (remoteHasMap)
{
ModInfo & modInfo = mapCacheList[selectedMapName];
if (modInfo.crc != modInfo.localCRC)
{
mainMessageBoxState = ftpmsg_ReplaceMap;
mainMessageBox.init (lang.getString ("Yes"),
lang.getString ("No"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModLocalRemoteMismatch").c_str (),
selectedMapName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModMapAlreadyInstalled").c_str (),
selectedMapName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
}
}
else
{
string mapName = selectedMapName;
string mapURL = mapCacheList[mapName].url;
if (ftpClientThread != NULL)
ftpClientThread->addMapToRequests (mapName, mapURL);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
fileFTPProgressList[mapName] = pair < int, string > (0, "");
safeMutexFTPProgress.ReleaseLock ();
buttonInstallMap.setEnabled (false);
}
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
showMessageBox (lang.getString ("ModSelectMapToInstall"),
lang.getString ("Notice"), true);
}
}
else if (buttonRemoveMap.mouseClick (x, y)
&& buttonRemoveMap.getEnabled ())
{
soundRenderer.playFx (coreData.getClickSoundB ());
if (selectedMapName != "")
{
bool alreadyHasMap =
(std::
find (mapFiles.begin (), mapFiles.end (),
selectedMapName) != mapFiles.end ());
if (alreadyHasMap == true)
{
mainMessageBoxState = ftpmsg_GetMap;
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModRemoveMapConfirm").c_str (),
selectedMapName.c_str ());
showMessageBox (szBuf, lang.getString ("Question"), true);
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModCannotRemoveMapNotInstalled").
c_str (), selectedMapName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
showMessageBox (lang.getString ("ModSelectMapToRemove"),
lang.getString ("Notice"), true);
}
}
else if (buttonInstallScenario.mouseClick (x, y)
&& buttonInstallScenario.getEnabled ())
{
soundRenderer.playFx (coreData.getClickSoundB ());
if (selectedScenarioName != "")
{
bool alreadyHasScenario =
(std::
find (scenarioFiles.begin (), scenarioFiles.end (),
selectedScenarioName) != scenarioFiles.end ());
if (alreadyHasScenario == true)
{
bool remoteHasScenario =
(scenarioCacheList.find (selectedScenarioName) !=
scenarioCacheList.end ());
if (remoteHasScenario)
{
ModInfo & modInfo = scenarioCacheList[selectedScenarioName];
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d] remote CRC [%s]\n", __FILE__,
__FUNCTION__, __LINE__, modInfo.crc.c_str ());
Config & config = Config::getInstance ();
string itemPath =
config.getPathListForType (ptScenarios,
"")[1] + "/" +
selectedScenarioName + string ("/*");
bool forceRefresh =
(mapCRCUpdateList.find (itemPath) == mapCRCUpdateList.end ());
if (strToUInt (modInfo.crc) != 0 &&
strToUInt (modInfo.crc) !=
getFolderTreeContentsCheckSumRecursively (itemPath, "",
NULL,
forceRefresh))
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line %d] local CRC [%u]\n", __FILE__,
__FUNCTION__, __LINE__,
getFolderTreeContentsCheckSumRecursively (itemPath,
"",
NULL));
mainMessageBoxState = ftpmsg_ReplaceScenario;
mainMessageBox.init (lang.getString ("Yes"),
lang.getString ("No"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModLocalRemoteMismatch").c_str (),
selectedScenarioName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModScenarioAlreadyInstalled").
c_str (), selectedScenarioName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
}
}
else
{
string scenarioName = selectedScenarioName;
string scenarioURL = scenarioCacheList[scenarioName].url;
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d] adding file to download [%s]\n",__FILE__,__FUNCTION__,__LINE__,scenarioURL.c_str());
if (ftpClientThread != NULL)
ftpClientThread->addScenarioToRequests (scenarioName,
scenarioURL);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL),
mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
fileFTPProgressList[scenarioName] = pair < int, string > (0, "");
safeMutexFTPProgress.ReleaseLock ();
buttonInstallScenario.setEnabled (false);
}
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
showMessageBox (lang.getString ("ModSelectScenarioToInstall"),
lang.getString ("Notice"), true);
}
}
else if (buttonRemoveScenario.mouseClick (x, y)
&& buttonRemoveScenario.getEnabled ())
{
soundRenderer.playFx (coreData.getClickSoundB ());
if (selectedScenarioName != "")
{
bool alreadyHasScenario =
(std::
find (scenarioFiles.begin (), scenarioFiles.end (),
selectedScenarioName) != scenarioFiles.end ());
if (alreadyHasScenario == true)
{
mainMessageBoxState = ftpmsg_GetScenario;
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModRemoveScenarioConfirm").c_str (),
selectedScenarioName.c_str ());
showMessageBox (szBuf, lang.getString ("Question"), true);
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModCannotRemoveScenarioNotInstalled").
c_str (), selectedScenarioName.c_str ());
showMessageBox (szBuf, lang.getString ("Notice"), true);
}
}
else
{
mainMessageBoxState = ftpmsg_None;
mainMessageBox.init (lang.getString ("Ok"), 450);
showMessageBox (lang.getString ("ModSelectScenarioToRemove"),
lang.getString ("Notice"), true);
}
}
else
{
if (keyMapScrollBar.getElementCount () != 0)
{
for (int i = keyMapScrollBar.getVisibleStart ();
i <= keyMapScrollBar.getVisibleEnd (); ++i)
{
if (keyMapButtons[i]->mouseClick (x, y)
&& keyMapButtons[i]->getEnabled ())
{
string mapName = keyMapButtons[i]->getText ();
selectedTechName = "";
selectedTilesetName = "";
selectedMapName = "";
selectedScenarioName = "";
if (mapName != "")
{
selectedMapName = mapName;
bool remoteHasMap =
(mapCacheList.find (mapName) != mapCacheList.end ());
if (remoteHasMap)
{
showRemoteDesription (&mapCacheList[selectedMapName]);
if (mapCacheList[selectedMapName].localCRC != "")
{
loadMapPreview (mapName);
}
}
else
{
showLocalDescription (mapName);
loadMapPreview (mapName);
}
}
break;
}
}
}
if (keyTechScrollBar.getElementCount () != 0)
{
for (int i = keyTechScrollBar.getVisibleStart ();
i <= keyTechScrollBar.getVisibleEnd (); ++i)
{
if (keyTechButtons[i]->mouseClick (x, y)
&& keyTechButtons[i]->getEnabled ())
{
string techName = keyTechButtons[i]->getText ();
selectedTechName = "";
selectedTilesetName = "";
selectedMapName = "";
selectedScenarioName = "";
if (techName != "")
{
selectedTechName = techName;
bool remoteHasTech =
(techCacheList.find (techName) != techCacheList.end ());
if (remoteHasTech)
{
showRemoteDesription (&techCacheList[techName]);
}
else
{
showLocalDescription (techName);
}
}
break;
}
}
}
if (keyTilesetScrollBar.getElementCount () != 0)
{
for (int i = keyTilesetScrollBar.getVisibleStart ();
i <= keyTilesetScrollBar.getVisibleEnd (); ++i)
{
if (keyTilesetButtons[i]->mouseClick (x, y)
&& keyTilesetButtons[i]->getEnabled ())
{
string tilesetName = keyTilesetButtons[i]->getText ();
selectedTechName = "";
selectedTilesetName = "";
selectedMapName = "";
selectedScenarioName = "";
if (tilesetName != "")
{
selectedTilesetName = tilesetName;
bool remoteHasTileset =
(tilesetCacheList.find (tilesetName) !=
tilesetCacheList.end ());
if (remoteHasTileset)
{
showRemoteDesription (&tilesetCacheList[tilesetName]);
}
else
{
showLocalDescription (tilesetName);
}
}
break;
}
}
}
if (keyScenarioScrollBar.getElementCount () != 0)
{
for (int i = keyScenarioScrollBar.getVisibleStart ();
i <= keyScenarioScrollBar.getVisibleEnd (); ++i)
{
if (keyScenarioButtons[i]->mouseClick (x, y)
&& keyScenarioButtons[i]->getEnabled ())
{
string scenarioName = keyScenarioButtons[i]->getText ();
selectedTechName = "";
selectedTilesetName = "";
selectedMapName = "";
selectedScenarioName = "";
if (scenarioName != "")
{
selectedScenarioName = scenarioName;
bool remoteHasScenario =
(scenarioCacheList.find (scenarioName) !=
scenarioCacheList.end ());
if (remoteHasScenario)
{
showRemoteDesription (&scenarioCacheList[scenarioName]);
}
else
{
showLocalDescription (scenarioName);
}
}
break;
}
}
}
}
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line %d]\n", __FILE__,
__FUNCTION__, __LINE__);
}
string MenuStateMods::getPreviewImageFileForMod (const ModInfo * modInfo)
{
string fileName = "";
if (modInfo->imageUrl != "")
{
Config & config = Config::getInstance ();
string userData = config.getString ("UserData_Root", "");
if (userData != "")
{
endPathWithSlash (userData);
}
string tempPath = userData + "temp/";
if (isdir (tempPath.c_str ()) == false)
{
createDirectoryPaths (tempPath);
}
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("### tempPath [%s] isdir = %d\n", tempPath.c_str (),
isdir (tempPath.c_str ()));
if (isdir (tempPath.c_str ()) == true)
{
fileName = tempPath;
switch (modInfo->type)
{
case mt_Map:
fileName += "map_";
break;
case mt_Tileset:
fileName += "tileset_";
break;
case mt_Techtree:
fileName += "tech_";
break;
case mt_Scenario:
fileName += "scenario_";
break;
}
fileName += extractFileFromDirectoryPath (modInfo->imageUrl);
}
}
return fileName;
}
void MenuStateMods::showLocalDescription (string name)
{
Lang & lang = Lang::getInstance ();
modInfoSelected = NULL;
cleanupPreviewTexture ();
validMapPreview = false;
cleanupMapPreviewTexture ();
modDescrLabel.setText (lang.getString ("ModOnlyLocal") + ":\n'" + name +
"'");
}
void MenuStateMods::loadMapPreview (string mapName)
{
Config & config = Config::getInstance ();
cleanupMapPreviewTexture ();
vector < string > mapPaths = config.getPathListForType (ptMaps);
string & mapPath = mapPaths[1];
endPathWithSlash (mapPath);
mapPath += mapName;
MapInfo mapInfo = loadMapInfo (mapPath);
if (enableMapPreview == true)
{
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n",
extractFileFromDirectoryPath (__FILE__).
c_str (), __FUNCTION__, __LINE__);
mapPreview.loadFromFile (mapPath.c_str ());
//printf("Loading map preview MAP\n");
cleanupMapPreviewTexture ();
validMapPreview = true;
}
}
void MenuStateMods::showRemoteDesription (ModInfo * modInfo)
{
//displayModPreviewImage = false;
modInfoSelected = modInfo;
validMapPreview = false;
cleanupMapPreviewTexture ();
string modText = modInfo->description;
replaceAll (modText, "\\n", "\n");
modDescrLabel.setText (modText);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("### modInfo->imageUrl [%s]\n", modInfo->imageUrl.c_str ());
if (modInfo->imageUrl != "")
{
cleanupPreviewTexture ();
string tempImage = getPreviewImageFileForMod (modInfo);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("### tempImage [%s] exists [%d]\n", tempImage.c_str (),
fileExists (tempImage));
if (tempImage != "" && fileExists (tempImage) == false)
{
if (ftpClientThread != NULL)
ftpClientThread->addFileToRequests (tempImage, modInfo->imageUrl);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL), mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
fileFTPProgressList[tempImage] = pair < int, string > (0, "");
safeMutexFTPProgress.ReleaseLock ();
}
else
{
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL), mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
if (fileFTPProgressList.find (tempImage) ==
fileFTPProgressList.end ())
{
//displayModPreviewImage = true;
displayModPreviewImage[tempImage] = true;
}
safeMutexFTPProgress.ReleaseLock ();
}
}
}
void MenuStateMods::mouseUp (int x, int y, const MouseButton mouseButton)
{
if (mouseButton == mbLeft)
{
keyTechScrollBar.mouseUp (x, y);
keyTilesetScrollBar.mouseUp (x, y);
keyMapScrollBar.mouseUp (x, y);
keyScenarioScrollBar.mouseUp (x, y);
}
}
void MenuStateMods::mouseMove (int x, int y, const MouseState * ms)
{
buttonReturn.mouseMove (x, y);
if (mainMessageBox.getEnabled ())
{
mainMessageBox.mouseMove (x, y);
}
buttonInstallTech.mouseMove (x, y);
buttonRemoveTech.mouseMove (x, y);
buttonInstallTileset.mouseMove (x, y);
buttonRemoveTileset.mouseMove (x, y);
buttonInstallMap.mouseMove (x, y);
buttonRemoveMap.mouseMove (x, y);
buttonInstallScenario.mouseMove (x, y);
buttonRemoveScenario.mouseMove (x, y);
if (ms->get (mbLeft))
{
keyMapScrollBar.mouseDown (x, y);
keyTechScrollBar.mouseDown (x, y);
keyTilesetScrollBar.mouseDown (x, y);
keyScenarioScrollBar.mouseDown (x, y);
}
else
{
keyMapScrollBar.mouseMove (x, y);
keyTechScrollBar.mouseMove (x, y);
keyTilesetScrollBar.mouseMove (x, y);
keyScenarioScrollBar.mouseMove (x, y);
}
if (keyMapScrollBar.getElementCount () != 0)
{
for (int i = keyMapScrollBar.getVisibleStart ();
i <= keyMapScrollBar.getVisibleEnd (); ++i)
{
keyMapButtons[i]->mouseMove (x, y);
}
}
if (keyTechScrollBar.getElementCount () != 0)
{
for (int i = keyTechScrollBar.getVisibleStart ();
i <= keyTechScrollBar.getVisibleEnd (); ++i)
{
keyTechButtons[i]->mouseMove (x, y);
}
}
if (keyTilesetScrollBar.getElementCount () != 0)
{
for (int i = keyTilesetScrollBar.getVisibleStart ();
i <= keyTilesetScrollBar.getVisibleEnd (); ++i)
{
keyTilesetButtons[i]->mouseMove (x, y);
}
}
if (keyScenarioScrollBar.getElementCount () != 0)
{
for (int i = keyScenarioScrollBar.getVisibleStart ();
i <= keyScenarioScrollBar.getVisibleEnd (); ++i)
{
keyScenarioButtons[i]->mouseMove (x, y);
}
}
}
void MenuStateMods::cleanupPreviewTexture ()
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("In [%s::%s Line: %d] scenarioLogoTexture [%p]\n", __FILE__,
__FUNCTION__, __LINE__, modPreviewImage);
if (modPreviewImage != NULL)
{
Renderer::getInstance ().endTexture (rsGlobal, modPreviewImage,
false);
}
modPreviewImage = NULL;
}
void MenuStateMods::cleanupMapPreviewTexture ()
{
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n",
extractFileFromDirectoryPath (__FILE__).
c_str (), __FUNCTION__, __LINE__);
//printf("CLEANUP map preview texture\n");
if (mapPreviewTexture != NULL)
{
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n",
extractFileFromDirectoryPath (__FILE__).
c_str (), __FUNCTION__, __LINE__);
mapPreviewTexture->end ();
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n",
extractFileFromDirectoryPath (__FILE__).
c_str (), __FUNCTION__, __LINE__);
delete mapPreviewTexture;
mapPreviewTexture = NULL;
}
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n",
extractFileFromDirectoryPath (__FILE__).
c_str (), __FUNCTION__, __LINE__);
}
void MenuStateMods::render ()
{
try
{
Renderer & renderer = Renderer::getInstance ();
renderer.renderLine (&lineHorizontal);
renderer.renderLine (&lineVertical);
renderer.renderLine (&lineReturn);
renderer.renderLine (&lineVerticalReturn);
renderer.renderButton (&buttonReturn);
renderer.renderButton (&buttonInstallTech);
renderer.renderButton (&buttonRemoveTech);
renderer.renderButton (&buttonInstallTileset);
renderer.renderButton (&buttonRemoveTileset);
renderer.renderButton (&buttonInstallMap);
renderer.renderButton (&buttonRemoveMap);
renderer.renderButton (&buttonInstallScenario);
renderer.renderButton (&buttonRemoveScenario);
renderer.renderButton (&buttonInstalled);
renderer.renderButton (&buttonAvailable);
renderer.renderButton (&buttonConflict);
renderer.renderButton (&buttonOnlyLocal);
renderer.renderLabel (&modDescrLabel);
if (modInfoSelected != NULL)
{
string tempImage = getPreviewImageFileForMod (modInfoSelected);
if (displayModPreviewImage.find (tempImage) !=
displayModPreviewImage.end ()
&& displayModPreviewImage[tempImage] == true)
{
if (modPreviewImage == NULL)
{
string tempImage = getPreviewImageFileForMod (modInfoSelected);
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf
("### Render tempImage [%s] fileExists(tempImage) = %d\n",
tempImage.c_str (), fileExists (tempImage));
if (tempImage != "" && fileExists (tempImage) == true)
{
cleanupPreviewTexture ();
modPreviewImage = Renderer::findTexture (tempImage);
}
}
if (modPreviewImage != NULL)
{
renderer.renderTextureQuad (508, 90, 485, 325, modPreviewImage,
1.0f);
}
}
}
// Render Tech List
renderer.renderLabel (&keyTechScrollBarTitle1);
renderer.renderLabel (&keyTechScrollBarTitle2);
if (keyTechScrollBar.getElementCount () != 0)
{
for (int i = keyTechScrollBar.getVisibleStart ();
i <= keyTechScrollBar.getVisibleEnd (); ++i)
{
bool alreadyHasTech =
(std::
find (techTreeFiles.begin (), techTreeFiles.end (),
keyTechButtons[i]->getText ()) != techTreeFiles.end ());
if (keyTechButtons[i]->getText () == selectedTechName)
{
bool lightedOverride = true;
renderer.renderButton (keyTechButtons[i], &WHITE,
&lightedOverride);
}
else if (alreadyHasTech == true)
{
Vec4f buttonColor = WHITE;
buttonColor.w = 0.75f;
bool remoteHasTech =
(techCacheList.find (keyTechButtons[i]->getText ()) !=
techCacheList.end ());
if (remoteHasTech)
{
ModInfo & modInfo =
techCacheList[keyTechButtons[i]->getText ()];
if (modInfo.crc == modInfo.localCRC)
{
keyTechButtons[i]->
setCustomTexture (CoreData::getInstance ().
getOnServerInstalledTexture ());
}
else
{
//printf("modInfo.name=%s modInfo.crc=%s modInfo.localCRC=%s\n",modInfo.name.c_str(),modInfo.crc.c_str(),modInfo.localCRC.c_str());
keyTechButtons[i]->
setCustomTexture (CoreData::getInstance ().
getOnServerDifferentTexture ());
}
}
else
{
keyTechButtons[i]->setCustomTexture (CoreData::getInstance ().
getNotOnServerTexture
());
}
renderer.renderButton (keyTechButtons[i], &buttonColor);
}
else
{
Vec4f fontColor =
Vec4f (200.0f / 255.0f, 187.0f / 255.0f, 190.0f / 255.0f,
0.75f);
//Vec4f fontColor=Vec4f(1.0f, 0.0f, 0.0f, 0.75f);
keyTechButtons[i]->setCustomTexture (CoreData::getInstance ().
getOnServerTexture ());
renderer.renderButton (keyTechButtons[i], &fontColor);
}
renderer.renderLabel (labelsTech[i]);
}
}
renderer.renderScrollBar (&keyTechScrollBar);
// Render Tileset List
renderer.renderLabel (&keyTilesetScrollBarTitle1);
if (keyTilesetScrollBar.getElementCount () != 0)
{
for (int i = keyTilesetScrollBar.getVisibleStart ();
i <= keyTilesetScrollBar.getVisibleEnd (); ++i)
{
bool alreadyHasTileset =
(std::
find (tilesetFiles.begin (), tilesetFiles.end (),
keyTilesetButtons[i]->getText ()) !=
tilesetFiles.end ());
if (keyTilesetButtons[i]->getText () == selectedTilesetName)
{
bool lightedOverride = true;
renderer.renderButton (keyTilesetButtons[i], &WHITE,
&lightedOverride);
}
else if (alreadyHasTileset == true)
{
Vec4f buttonColor = WHITE;
buttonColor.w = 0.75f;
bool remoteHasTileset =
(tilesetCacheList.find (keyTilesetButtons[i]->getText ()) !=
tilesetCacheList.end ());
if (remoteHasTileset)
{
ModInfo & modInfo =
tilesetCacheList[keyTilesetButtons[i]->getText ()];
if (modInfo.crc == modInfo.localCRC)
{
keyTilesetButtons[i]->
setCustomTexture (CoreData::getInstance ().
getOnServerInstalledTexture ());
}
else
{
//printf("modInfo.name=%s modInfo.crc=%s modInfo.localCRC=%s\n",modInfo.name.c_str(),modInfo.crc.c_str(),modInfo.localCRC.c_str());
//printf("name [%s] modInfo.crc [%s] modInfo.localCRC [%s]\n",modInfo.name.c_str(),modInfo.crc.c_str(),modInfo.localCRC.c_str());
keyTilesetButtons[i]->
setCustomTexture (CoreData::getInstance ().
getOnServerDifferentTexture ());
}
}
else
{
keyTilesetButtons[i]->
setCustomTexture (CoreData::getInstance ().
getNotOnServerTexture ());
}
renderer.renderButton (keyTilesetButtons[i], &buttonColor);
}
else
{
Vec4f fontColor =
Vec4f (200.0f / 255.0f, 187.0f / 255.0f, 190.0f / 255.0f,
0.75f);
keyTilesetButtons[i]->
setCustomTexture (CoreData::getInstance ().
getOnServerTexture ());
renderer.renderButton (keyTilesetButtons[i], &fontColor);
}
}
}
renderer.renderScrollBar (&keyTilesetScrollBar);
// Render Map list
renderer.renderLabel (&keyMapScrollBarTitle1);
renderer.renderLabel (&keyMapScrollBarTitle2);
if (keyMapScrollBar.getElementCount () != 0)
{
for (int i = keyMapScrollBar.getVisibleStart ();
i <= keyMapScrollBar.getVisibleEnd (); ++i)
{
string mapNameToRender = keyMapButtons[i]->getText ();
bool alreadyHasMap =
(std::
find (mapFiles.begin (), mapFiles.end (),
mapNameToRender) != mapFiles.end ());
if (keyMapButtons[i]->getText () == selectedMapName)
{
bool lightedOverride = true;
renderer.renderButton (keyMapButtons[i], &WHITE,
&lightedOverride);
}
else if (alreadyHasMap == true)
{
Vec4f buttonColor = WHITE;
buttonColor.w = 0.75f;
bool remoteHasMap =
(mapCacheList.find (keyMapButtons[i]->getText ()) !=
mapCacheList.end ());
if (remoteHasMap)
{
ModInfo & modInfo =
mapCacheList[keyMapButtons[i]->getText ()];
if (modInfo.crc == modInfo.localCRC)
{
keyMapButtons[i]->
setCustomTexture (CoreData::getInstance ().
getOnServerInstalledTexture ());
}
else
{
//printf("modInfo.name=%s modInfo.crc=%s modInfo.localCRC=%s\n",modInfo.name.c_str(),modInfo.crc.c_str(),modInfo.localCRC.c_str());
keyMapButtons[i]->
setCustomTexture (CoreData::getInstance ().
getOnServerDifferentTexture ());
}
}
else
{
keyMapButtons[i]->setCustomTexture (CoreData::getInstance ().
getNotOnServerTexture ());
}
renderer.renderButton (keyMapButtons[i], &buttonColor);
}
else
{
Vec4f fontColor =
Vec4f (200.0f / 255.0f, 187.0f / 255.0f, 190.0f / 255.0f,
0.75f);
keyMapButtons[i]->setCustomTexture (CoreData::getInstance ().
getOnServerTexture ());
renderer.renderButton (keyMapButtons[i], &fontColor);
}
renderer.renderLabel (labelsMap[i]);
}
}
renderer.renderScrollBar (&keyMapScrollBar);
// Render Scenario List
renderer.renderLabel (&keyScenarioScrollBarTitle1);
if (keyScenarioScrollBar.getElementCount () != 0)
{
for (int i = keyScenarioScrollBar.getVisibleStart ();
i <= keyScenarioScrollBar.getVisibleEnd (); ++i)
{
if (i >= (int) keyScenarioButtons.size ())
{
char szBuf[8096] = "";
snprintf (szBuf, 8096,
"i >= keyScenarioButtons.size(), i = %d keyScenarioButtons.size() = %d",
i, (int) keyScenarioButtons.size ());
throw megaglest_runtime_error (szBuf);
}
bool alreadyHasScenario =
(std::
find (scenarioFiles.begin (), scenarioFiles.end (),
keyScenarioButtons[i]->getText ()) !=
scenarioFiles.end ());
if (keyScenarioButtons[i]->getText () == selectedScenarioName)
{
bool lightedOverride = true;
renderer.renderButton (keyScenarioButtons[i], &WHITE,
&lightedOverride);
}
else if (alreadyHasScenario == true)
{
Vec4f buttonColor = WHITE;
buttonColor.w = 0.75f;
bool remoteHasScenario =
(scenarioCacheList.find (keyScenarioButtons[i]->getText ()) !=
scenarioCacheList.end ());
if (remoteHasScenario)
{
ModInfo & modInfo =
scenarioCacheList[keyScenarioButtons[i]->getText ()];
if (modInfo.crc == modInfo.localCRC)
{
keyScenarioButtons[i]->
setCustomTexture (CoreData::getInstance ().
getOnServerInstalledTexture ());
}
else
{
//printf("modInfo.name=%s modInfo.crc=%s modInfo.localCRC=%s\n",modInfo.name.c_str(),modInfo.crc.c_str(),modInfo.localCRC.c_str());
keyScenarioButtons[i]->
setCustomTexture (CoreData::getInstance ().
getOnServerDifferentTexture ());
}
}
else
{
keyScenarioButtons[i]->
setCustomTexture (CoreData::getInstance ().
getNotOnServerTexture ());
}
renderer.renderButton (keyScenarioButtons[i], &buttonColor);
}
else
{
Vec4f fontColor =
Vec4f (200.0f / 255.0f, 187.0f / 255.0f, 190.0f / 255.0f,
0.75f);
keyScenarioButtons[i]->
setCustomTexture (CoreData::getInstance ().
getOnServerTexture ());
renderer.renderButton (keyScenarioButtons[i], &fontColor);
}
}
}
renderer.renderScrollBar (&keyScenarioScrollBar);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL), mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
if (fileFTPProgressList.empty () == false)
{
Lang & lang = Lang::getInstance ();
int xLocation = buttonReturn.getX ();
int yLocation = buttonReturn.getY () - 12;
for (std::map < string, pair < int, string > >::iterator iterMap =
fileFTPProgressList.begin ();
iterMap != fileFTPProgressList.end (); ++iterMap)
{
string progressLabelPrefix =
lang.getString ("ModDownloading") + " " +
extractFileFromDirectoryPath (iterMap->first) + " ";
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf("\nRendering file progress with the following prefix [%s]\n",progressLabelPrefix.c_str());
if (Renderer::renderText3DEnabled)
{
renderer.renderProgressBar3D (iterMap->second.first,
//10,
//yLocation,
xLocation,
yLocation,
CoreData::getInstance ().
getDisplayFontSmall3D (), 185,
progressLabelPrefix, false);
}
else
{
renderer.renderProgressBar (iterMap->second.first,
//10,
//yLocation,
xLocation,
yLocation,
CoreData::getInstance ().
getDisplayFontSmall (), 185,
progressLabelPrefix, false);
}
yLocation -= 14;
}
}
safeMutexFTPProgress.ReleaseLock ();
renderer.renderConsole (&console, consoleNormal, 3);
if (mainMessageBox.getEnabled ())
{
renderer.renderMessageBox (&mainMessageBox);
}
if (modMenuState != mmst_None)
{
if (oldMenuState != modMenuState)
{
Lang & lang = Lang::getInstance ();
if (modMenuState == mmst_Loading)
{
pleaseWaitLabel.setText (lang.
getString
("GettingModlistFromMasterserver"));
}
else if (modMenuState == mmst_CalculatingCRC)
{
pleaseWaitLabel.setText (lang.
getString
("PleaseWaitCalculatingCRC"));
}
oldMenuState = modMenuState;
}
float anim = GraphicComponent::getAnim ();
if (anim < 0.5f)
{
anim = 1.f - anim;
}
Vec4f colorWithAlpha = Vec4f (ORANGE.x, ORANGE.y, ORANGE.z, anim);
renderer.renderLabel (&pleaseWaitLabel, &colorWithAlpha);
}
if (validMapPreview)
{
if (mapPreviewTexture != NULL)
{
renderer.renderTextureQuad (5, 185, 150, 150, mapPreviewTexture,
1.0f);
}
if (enableMapPreview && (mapPreview.hasFileLoaded () == true))
{
int mouseX = mainMenu->getMouseX ();
int mouseY = mainMenu->getMouseY ();
int mouse2dAnim = mainMenu->getMouse2dAnim ();
if (mapPreviewTexture == NULL)
{
renderer.renderMouse2d (mouseX, mouseY, mouse2dAnim);
renderer.renderMapPreview (&mapPreview, true, 10, 350,
&mapPreviewTexture);
}
}
}
}
catch (const std::exception & ex)
{
char szBuf[8096] = "";
snprintf (szBuf, 8096, "In [%s::%s %d] error [%s]\n", __FILE__,
__FUNCTION__, __LINE__, ex.what ());
SystemFlags::OutputDebug (SystemFlags::debugError, szBuf);
throw megaglest_runtime_error (szBuf);
}
}
void MenuStateMods::update ()
{
Chrono chrono;
chrono.start ();
//Lang &lang= Lang::getInstance();
// Tech List
if (keyTechScrollBar.getElementCount () != 0)
{
for (int i = keyTechScrollBar.getVisibleStart ();
i <= keyTechScrollBar.getVisibleEnd (); ++i)
{
if (i >= (int) keyTechButtons.size ())
{
char szBuf[8096] = "";
snprintf (szBuf, 8096,
"i >= keyTechButtons.size(), i = %d, keyTechButtons.size() = %d",
i, (int) keyTechButtons.size ());
throw megaglest_runtime_error (szBuf);
}
keyTechButtons[i]->setY (keyButtonsYBase - keyButtonsLineHeight * (i
-
keyTechScrollBar.
getVisibleStart
()));
labelsTech[i]->setY (keyButtonsYBase -
keyButtonsLineHeight * (i -
keyTechScrollBar.
getVisibleStart ()));
}
}
// Tileset List
if (keyTilesetScrollBar.getElementCount () != 0)
{
for (int i = keyTilesetScrollBar.getVisibleStart ();
i <= keyTilesetScrollBar.getVisibleEnd (); ++i)
{
if (i >= (int) keyTilesetButtons.size ())
{
char szBuf[8096] = "";
snprintf (szBuf, 8096,
"i >= keyTilesetButtons.size(), i = %d, keyTilesetButtons.size() = %d",
i, (int) keyTilesetButtons.size ());
throw megaglest_runtime_error (szBuf);
}
int yPos = keyButtonsYBase - keyButtonsLineHeight *
(i - keyTilesetScrollBar.getVisibleStart ());
keyTilesetButtons[i]->setY (yPos);
}
}
// Map List
if (keyMapScrollBar.getElementCount () != 0)
{
for (int i = keyMapScrollBar.getVisibleStart ();
i <= keyMapScrollBar.getVisibleEnd (); ++i)
{
if (i >= (int) keyMapButtons.size ())
{
char szBuf[8096] = "";
snprintf (szBuf, 8096,
"i >= keyMapButtons.size(), i = %d, keyMapButtons.size() = %d",
i, (int) keyMapButtons.size ());
throw megaglest_runtime_error (szBuf);
}
keyMapButtons[i]->setY (keyButtonsYBase - keyButtonsLineHeight * (i
-
keyMapScrollBar.
getVisibleStart
()));
labelsMap[i]->setY (keyButtonsYBase -
keyButtonsLineHeight * (i -
keyMapScrollBar.
getVisibleStart ()));
}
}
// Scenario List
if (keyScenarioScrollBar.getElementCount () != 0)
{
for (int i = keyScenarioScrollBar.getVisibleStart ();
i <= keyScenarioScrollBar.getVisibleEnd (); ++i)
{
if (i >= (int) keyScenarioButtons.size ())
{
char szBuf[8096] = "";
snprintf (szBuf, 8096,
"i >= keyScenarioButtons.size(), i = %d, keyScenarioButtons.size() = %d",
i, (int) keyScenarioButtons.size ());
throw megaglest_runtime_error (szBuf);
}
int yPos = keyButtonsYBase - keyButtonsLineHeight *
(i - keyScenarioScrollBar.getVisibleStart ());
keyScenarioButtons[i]->setY (yPos);
}
}
console.update ();
}
void MenuStateMods::keyDown (SDL_KeyboardEvent key)
{
Config & configKeys =
Config::getInstance (std::pair < ConfigType,
ConfigType > (cfgMainKeys, cfgUserKeys));
//if(key == configKeys.getCharKey("ShowFullConsole")) {
if (isKeyPressed (configKeys.getSDLKey ("ShowFullConsole"), key) ==
true)
{
showFullConsole = true;
}
}
void MenuStateMods::keyPress (SDL_KeyboardEvent c)
{
}
void MenuStateMods::keyUp (SDL_KeyboardEvent key)
{
Config & configKeys =
Config::getInstance (std::pair < ConfigType,
ConfigType > (cfgMainKeys, cfgUserKeys));
//if(key== configKeys.getCharKey("ShowFullConsole")) {
if (isKeyPressed (configKeys.getSDLKey ("ShowFullConsole"), key) ==
true)
{
showFullConsole = false;
}
}
void MenuStateMods::showMessageBox (const string & text,
const string & header, bool toggle)
{
if (toggle == false)
{
mainMessageBox.setEnabled (false);
}
if (mainMessageBox.getEnabled () == false)
{
mainMessageBox.setText (text);
mainMessageBox.setHeader (header);
mainMessageBox.setEnabled (true);
}
else
{
mainMessageBox.setEnabled (false);
}
}
void MenuStateMods::FTPClient_CallbackEvent (string itemName,
FTP_Client_CallbackType type,
pair < FTP_Client_ResultType,
string > result,
void *userdata)
{
if (SystemFlags::getSystemSettingType (SystemFlags::debugSystem).
enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line %d]\n", __FILE__,
__FUNCTION__, __LINE__);
Lang & lang = Lang::getInstance ();
if (type == ftp_cct_DownloadProgress)
{
FTPClientCallbackInterface::FtpProgressStats * stats =
(FTPClientCallbackInterface::FtpProgressStats *) userdata;
if (stats != NULL)
{
int fileProgress = 0;
if (stats->download_total > 0)
{
fileProgress =
((stats->download_now / stats->download_total) * 100.0);
}
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Got FTP Callback for [%s] current file [%s] fileProgress = %d [now = %f, total = %f]\n",itemName.c_str(),stats->currentFilename.c_str(), fileProgress,stats->download_now,stats->download_total);
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL), mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
pair < int, string > lastProgress = fileFTPProgressList[itemName];
fileFTPProgressList[itemName] =
pair < int, string > (fileProgress, stats->currentFilename);
safeMutexFTPProgress.ReleaseLock ();
}
}
else if (type == ftp_cct_ExtractProgress)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Got FTP extract Callback for [%s] result = %d [%s]\n",
itemName.c_str (), result.first, result.second.c_str ());
//printf("Got FTP extract Callback for [%s] result = %d [%s]\n",itemName.c_str(),result.first,result.second.c_str());
if (userdata == NULL)
{
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("DataMissingExtractDownloadMod").c_str (),
itemName.c_str ());
//printf("%s\n",szBuf);
console.addLine (szBuf, true);
}
else
{
char *szBuf = (char *) userdata;
//printf("%s\n",szBuf);
console.addLine (szBuf);
}
}
else if (type == ftp_cct_File)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Got FTP Callback for [%s] result = %d [%s]\n",
itemName.c_str (), result.first, result.second.c_str ());
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL), mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
fileFTPProgressList.erase (itemName);
safeMutexFTPProgress.ReleaseLock ();
//printf("### downloaded file [%s] result = %d\n",itemName.c_str(),result.first);
if (result.first == ftp_crt_SUCCESS)
{
displayModPreviewImage[itemName] = true;
}
}
else if (type == ftp_cct_Map)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Got FTP Callback for [%s] result = %d [%s]\n",
itemName.c_str (), result.first, result.second.c_str ());
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL), mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
fileFTPProgressList.erase (itemName);
safeMutexFTPProgress.ReleaseLock ();
selectedMapName = "";
buttonInstallMap.setEnabled (true);
if (result.first == ftp_crt_SUCCESS)
{
refreshMaps ();
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModDownloadMapSuccess").c_str (),
itemName.c_str ());
console.addLine (szBuf, true);
}
else
{
curl_version_info_data *curlVersion =
curl_version_info (CURLVERSION_NOW);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModDownloadMapFail").c_str (),
itemName.c_str (), curlVersion->version,
result.second.c_str ());
console.addLine (szBuf, true);
}
}
else if (type == ftp_cct_Tileset)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Got FTP Callback for [%s] result = %d [%s]\n",
itemName.c_str (), result.first, result.second.c_str ());
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL), mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
fileFTPProgressList.erase (itemName);
safeMutexFTPProgress.ReleaseLock (true);
selectedTilesetName = "";
buttonInstallTileset.setEnabled (true);
if (result.first == ftp_crt_SUCCESS)
{
refreshTilesets ();
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModDownloadTilesetSuccess").c_str (),
itemName.c_str ());
console.addLine (szBuf, true);
// END
}
else
{
curl_version_info_data *curlVersion =
curl_version_info (CURLVERSION_NOW);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModDownloadTilesetFail").c_str (),
itemName.c_str (), curlVersion->version,
result.second.c_str ());
console.addLine (szBuf, true);
}
}
else if (type == ftp_cct_Techtree)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Got FTP Callback for [%s] result = %d [%s]\n",
itemName.c_str (), result.first, result.second.c_str ());
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL), mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
fileFTPProgressList.erase (itemName);
safeMutexFTPProgress.ReleaseLock (true);
selectedTechName = "";
buttonInstallTech.setEnabled (true);
if (result.first == ftp_crt_SUCCESS)
{
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModDownloadTechSuccess").c_str (),
itemName.c_str ());
console.addLine (szBuf, true);
// START
// Clear the CRC Cache if it is populated
safeMutexFTPProgress.Lock ();
Checksum::clearFileCache ();
vector < string > paths =
Config::getInstance ().getPathListForType (ptTechs);
string pathSearchString = string ("/") + itemName + string ("/*");
const string filterFileExt = ".xml";
clearFolderTreeContentsCheckSum (paths, pathSearchString,
filterFileExt);
clearFolderTreeContentsCheckSumList (paths, pathSearchString,
filterFileExt);
// Refresh CRC
Config & config = Config::getInstance ();
getFolderTreeContentsCheckSumRecursively (config.
getPathListForType
(ptTechs, ""),
string ("/") + itemName +
string ("/*"), ".xml",
NULL, true);
safeMutexFTPProgress.ReleaseLock ();
refreshTechs ();
// END
}
else
{
curl_version_info_data *curlVersion =
curl_version_info (CURLVERSION_NOW);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModDownloadTechFail").c_str (),
itemName.c_str (), curlVersion->version,
result.second.c_str ());
console.addLine (szBuf, true);
}
}
else if (type == ftp_cct_Scenario)
{
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Got FTP Callback for [%s] result = %d [%s]\n",
itemName.c_str (), result.first, result.second.c_str ());
static string mutexOwnerId =
string (__FILE__) + string ("_") + intToStr (__LINE__);
MutexSafeWrapper
safeMutexFTPProgress ((ftpClientThread !=
NULL ? ftpClientThread->
getProgressMutex () : NULL), mutexOwnerId);
if (ftpClientThread != NULL
&& ftpClientThread->getProgressMutex () != NULL)
ftpClientThread->getProgressMutex ()->setOwnerId (mutexOwnerId);
fileFTPProgressList.erase (itemName);
safeMutexFTPProgress.ReleaseLock (true);
selectedScenarioName = "";
buttonInstallScenario.setEnabled (true);
if (result.first == ftp_crt_SUCCESS)
{
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModDownloadScenarioSuccess").c_str (),
itemName.c_str ());
console.addLine (szBuf, true);
// START
// Clear the CRC Cache if it is populated
//
// Clear the CRC file Cache
safeMutexFTPProgress.Lock ();
Checksum::clearFileCache ();
vector < string > paths =
Config::getInstance ().getPathListForType (ptScenarios);
string pathSearchString = string ("/") + itemName + string ("/*");
const string filterFileExt = ".xml";
clearFolderTreeContentsCheckSum (paths, pathSearchString,
filterFileExt);
clearFolderTreeContentsCheckSumList (paths, pathSearchString,
filterFileExt);
// Refresh CRC
Config & config = Config::getInstance ();
getFolderTreeContentsCheckSumRecursively (config.
getPathListForType
(ptScenarios, ""),
string ("/") + itemName +
string ("/*"), ".xml",
NULL, true);
safeMutexFTPProgress.ReleaseLock ();
refreshScenarios ();
// END
}
else
{
curl_version_info_data *curlVersion =
curl_version_info (CURLVERSION_NOW);
char szBuf[8096] = "";
snprintf (szBuf, 8096,
lang.getString ("ModDownloadScenarioFail").c_str (),
itemName.c_str (), curlVersion->version,
result.second.c_str ());
console.addLine (szBuf, true);
}
}
}
}} //end namespace