MegaGlest/source/glest_game/menu/menu_state_mods.cpp

2741 lines
114 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);
}
}
}
bool MenuStateMods::eventMouseWheel( GraphicScrollBar* scrollBar, UserButtons* buttons, int x, int y, int zDelta) {
int result=false;
int overButton=false;
if(scrollBar->getElementCount() !=0) {
for(int i = scrollBar->getVisibleStart(); i <= scrollBar->getVisibleEnd(); ++i) {
if((*buttons)[i]->mouseMove(x, y)) {
overButton=true;
break;
}
}
}
result= scrollBar->eventMouseWheel(x, y, zDelta,overButton);
if(result) layoutButtons(scrollBar,buttons,NULL);
if(scrollBar->getElementCount() !=0) {
for(int i = scrollBar->getVisibleStart(); i <= scrollBar->getVisibleEnd(); ++i) {
(*buttons)[i]->mouseMove(x, y);
}
}
return result;
}
void MenuStateMods::eventMouseWheel(int x, int y, int zDelta) {
bool result = eventMouseWheel(&keyMapScrollBar, &keyMapButtons, x, y, zDelta);
if (!result)
result = eventMouseWheel(&keyTechScrollBar, &keyTechButtons, x, y, zDelta);
if (!result)
result = eventMouseWheel(&keyScenarioScrollBar, &keyScenarioButtons, x, y, zDelta);
if (!result)
result = eventMouseWheel(&keyTilesetScrollBar, &keyTilesetButtons, x, y, zDelta);
}
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::layoutButtons(GraphicScrollBar * scrollBar,UserButtons* buttons, GraphicLabels* labels){
if (scrollBar->getElementCount() != 0) {
for (int i = scrollBar->getVisibleStart();
i <= scrollBar->getVisibleEnd(); ++i) {
if(i >= (int)buttons->size()) {
char szBuf[8096]="";
snprintf(szBuf,8096,"i >= buttons->size(), i = %d, buttons->size() = %d",i,(int)buttons->size());
throw megaglest_runtime_error(szBuf);
}
(*buttons)[i]->setY(keyButtonsYBase - keyButtonsLineHeight * (i - scrollBar->getVisibleStart()));
if (labels != NULL) {
(*labels)[i]->setY(keyButtonsYBase - keyButtonsLineHeight * (i - scrollBar->getVisibleStart()));
}
}
}
}
void MenuStateMods::update() {
Chrono chrono;
chrono.start();
layoutButtons(&keyMapScrollBar, &keyMapButtons, &labelsMap);
layoutButtons(&keyTechScrollBar, &keyTechButtons, &labelsTech);
layoutButtons(&keyTilesetScrollBar, &keyTilesetButtons, NULL);
layoutButtons(&keyScenarioScrollBar, &keyScenarioButtons, NULL);
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