mirror of
https://github.com/glest/glest-source.git
synced 2025-02-24 19:52:25 +01:00
2747 lines
114 KiB
C++
2747 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;
|
|
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 = 10;
|
|
keyTechScrollBarTitle1.registerGraphicComponent(containerName,"keyTechScrollBarTitle1");
|
|
keyTechScrollBarTitle1.init(techInfoXPos,scrollListsYPos + 25,labelWidth,20);
|
|
keyTechScrollBarTitle1.setText(lang.getString("TechTitle1"));
|
|
keyTechScrollBarTitle1.setFont(CoreData::getInstance().getMenuFontBig());
|
|
keyTechScrollBarTitle1.setFont3D(CoreData::getInstance().getMenuFontBig3D());
|
|
keyTechScrollBarTitle2.registerGraphicComponent(containerName,"keyTechScrollBarTitle2");
|
|
keyTechScrollBarTitle2.init(techInfoXPos + 200,scrollListsYPos + 25,labelWidth,20);
|
|
keyTechScrollBarTitle2.setText(lang.getString("TechTitle2"));
|
|
keyTechScrollBarTitle2.setFont(CoreData::getInstance().getMenuFontNormal());
|
|
keyTechScrollBarTitle2.setFont3D(CoreData::getInstance().getMenuFontNormal3D());
|
|
|
|
mapInfoXPos = 270;
|
|
keyMapScrollBarTitle1.registerGraphicComponent(containerName,"keyMapScrollBarTitle1");
|
|
keyMapScrollBarTitle1.init(mapInfoXPos,scrollListsYPos + 25,labelWidth,20);
|
|
keyMapScrollBarTitle1.setText(lang.getString("MapTitle1"));
|
|
keyMapScrollBarTitle1.setFont(CoreData::getInstance().getMenuFontBig());
|
|
keyMapScrollBarTitle1.setFont3D(CoreData::getInstance().getMenuFontBig3D());
|
|
keyMapScrollBarTitle2.registerGraphicComponent(containerName,"keyMapScrollBarTitle2");
|
|
keyMapScrollBarTitle2.init(mapInfoXPos + 200,scrollListsYPos + 25,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,scrollListsYPos + 25,labelWidth,20);
|
|
keyTilesetScrollBarTitle1.setText(lang.getString("TilesetTitle1"));
|
|
keyTilesetScrollBarTitle1.setFont(CoreData::getInstance().getMenuFontBig());
|
|
keyTilesetScrollBarTitle1.setFont3D(CoreData::getInstance().getMenuFontBig3D());
|
|
|
|
|
|
scenarioInfoXPos = 760;
|
|
keyScenarioScrollBarTitle1.registerGraphicComponent(containerName,"keyScenarioScrollBarTitle1");
|
|
keyScenarioScrollBarTitle1.init(scenarioInfoXPos,scrollListsYPos + 25,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(50,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(techInfoXPos, legendButtonY, 200);
|
|
buttonInstalled.setText(lang.getString("ModInstalled"));
|
|
buttonInstalled.setUseCustomTexture(true);
|
|
buttonInstalled.setCustomTexture(CoreData::getInstance().getOnServerInstalledTexture());
|
|
buttonInstalled.setEnabled(false);
|
|
|
|
buttonAvailable.registerGraphicComponent(containerName,"buttonAvailable");
|
|
buttonAvailable.init(tilesetInfoXPos, legendButtonY, 200);
|
|
buttonAvailable.setUseCustomTexture(true);
|
|
buttonAvailable.setCustomTexture(CoreData::getInstance().getOnServerTexture());
|
|
buttonAvailable.setText(lang.getString("ModAvailable"));
|
|
|
|
buttonOnlyLocal.registerGraphicComponent(containerName,"buttonOnlyLocal");
|
|
buttonOnlyLocal.init(mapInfoXPos, legendButtonY, 200);
|
|
buttonOnlyLocal.setUseCustomTexture(true);
|
|
buttonOnlyLocal.setCustomTexture(CoreData::getInstance().getNotOnServerTexture());
|
|
buttonOnlyLocal.setText(lang.getString("ModOnlyLocal"));
|
|
|
|
buttonConflict.registerGraphicComponent(containerName,"buttonConflict");
|
|
buttonConflict.init(scenarioInfoXPos, legendButtonY, 200);
|
|
buttonConflict.setUseCustomTexture(true);
|
|
buttonConflict.setCustomTexture(CoreData::getInstance().getOnServerDifferentTexture());
|
|
buttonConflict.setText(lang.getString("ModHasConflict"));
|
|
|
|
|
|
buttonInstallTech.registerGraphicComponent(containerName,"buttonInstallTech");
|
|
buttonInstallTech.init(techInfoXPos + 40, buttonLineUpY, 125);
|
|
buttonInstallTech.setText(lang.getString("Install"));
|
|
buttonRemoveTech.registerGraphicComponent(containerName,"buttonRemoveTech");
|
|
buttonRemoveTech.init(techInfoXPos + 40, buttonLineDownY, 125);
|
|
buttonRemoveTech.setText(lang.getString("Remove"));
|
|
|
|
buttonInstallTileset.registerGraphicComponent(containerName,"buttonInstallTileset");
|
|
buttonInstallTileset.init(tilesetInfoXPos + 20, buttonLineUpY, 125);
|
|
buttonInstallTileset.setText(lang.getString("Install"));
|
|
buttonRemoveTileset.registerGraphicComponent(containerName,"buttonRemoveTileset");
|
|
buttonRemoveTileset.init(tilesetInfoXPos + 20, buttonLineDownY, 125);
|
|
buttonRemoveTileset.setText(lang.getString("Remove"));
|
|
|
|
buttonInstallMap.registerGraphicComponent(containerName,"buttonInstallMap");
|
|
buttonInstallMap.init(mapInfoXPos + 40, buttonLineUpY, 125);
|
|
buttonInstallMap.setText(lang.getString("Install"));
|
|
buttonRemoveMap.registerGraphicComponent(containerName,"buttonRemoveMap");
|
|
buttonRemoveMap.init(mapInfoXPos + 40, buttonLineDownY, 125);
|
|
buttonRemoveMap.setText(lang.getString("Remove"));
|
|
|
|
buttonInstallScenario.registerGraphicComponent(containerName,"buttonInstallScenario");
|
|
buttonInstallScenario.init(scenarioInfoXPos + 20, buttonLineUpY, 125);
|
|
buttonInstallScenario.setText(lang.getString("Install"));
|
|
buttonRemoveScenario.registerGraphicComponent(containerName,"buttonRemoveScenario");
|
|
buttonRemoveScenario.init(scenarioInfoXPos + 20, 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 + keyButtonsWidth,scrollListsYPos-listBoxLength+keyButtonsLineHeight,false,200,20);
|
|
keyTilesetScrollBar.setLength(listBoxLength);
|
|
keyTilesetScrollBar.setElementCount(0);
|
|
keyTilesetScrollBar.setVisibleSize(keyButtonsToRender);
|
|
keyTilesetScrollBar.setVisibleStart(0);
|
|
|
|
keyTechScrollBar.init(techInfoXPos + keyButtonsWidth + labelWidth + 20,scrollListsYPos-listBoxLength+keyButtonsLineHeight,false,200,20);
|
|
keyTechScrollBar.setLength(listBoxLength);
|
|
keyTechScrollBar.setElementCount(0);
|
|
keyTechScrollBar.setVisibleSize(keyButtonsToRender);
|
|
keyTechScrollBar.setVisibleStart(0);
|
|
|
|
keyMapScrollBar.init(mapInfoXPos + keyButtonsWidth + labelWidth + 20,scrollListsYPos-listBoxLength+keyButtonsLineHeight,false,200,20);
|
|
keyMapScrollBar.setLength(listBoxLength);
|
|
keyMapScrollBar.setElementCount(0);
|
|
keyMapScrollBar.setVisibleSize(keyButtonsToRender);
|
|
keyMapScrollBar.setVisibleStart(0);
|
|
|
|
keyScenarioScrollBar.init(scenarioInfoXPos + keyButtonsWidth,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");
|
|
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, keyButtonsWidth,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, keyButtonsWidth,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, keyButtonsWidth,keyButtonsHeight);
|
|
button->setText(modinfo.name);
|
|
button->setUseCustomTexture(true);
|
|
button->setCustomTexture(CoreData::getInstance().getCustomTexture());
|
|
|
|
keyTechButtons.push_back(button);
|
|
GraphicLabel *label=new GraphicLabel();
|
|
label->init(techInfoXPos + keyButtonsWidth+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, keyButtonsWidth,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 + keyButtonsWidth+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, keyButtonsWidth,keyButtonsHeight);
|
|
button->setText(modinfo.name);
|
|
button->setUseCustomTexture(true);
|
|
button->setCustomTexture(CoreData::getInstance().getCustomTexture());
|
|
keyMapButtons.push_back(button);
|
|
|
|
GraphicLabel *label=new GraphicLabel();
|
|
label->init(mapInfoXPos + keyButtonsWidth + 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, keyButtonsWidth,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 + keyButtonsWidth + 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, keyButtonsWidth,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, keyButtonsWidth,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 + keyButtonsWidth,scrollListsYPos-listBoxLength+keyButtonsLineHeight,false,200,20);
|
|
keyTilesetScrollBar.setLength(listBoxLength);
|
|
keyTilesetScrollBar.setElementCount((int)keyTilesetButtons.size());
|
|
keyTilesetScrollBar.setVisibleSize(keyButtonsToRender);
|
|
keyTilesetScrollBar.setVisibleStart(0);
|
|
|
|
keyTechScrollBar.init(techInfoXPos + keyButtonsWidth + 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 + keyButtonsWidth + 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 + keyButtonsWidth,scrollListsYPos-listBoxLength+keyButtonsLineHeight,false,200,20);
|
|
keyScenarioScrollBar.setLength(listBoxLength);
|
|
keyScenarioScrollBar.setElementCount((int)keyScenarioButtons.size());
|
|
keyScenarioScrollBar.setVisibleSize(keyButtonsToRender);
|
|
keyScenarioScrollBar.setVisibleStart(0);
|
|
|
|
modMenuState=mmst_None;
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
|
|
if(modHttpServerThread != NULL) {
|
|
modHttpServerThread->signalQuit();
|
|
}
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
}
|
|
|
|
MapInfo MenuStateMods::loadMapInfo(string file) {
|
|
try{
|
|
Lang &lang= Lang::getInstance();
|
|
// Not painting properly so this is on hold
|
|
MapPreview::loadMapInfo(file, &mapInfo, lang.getString("MaxPlayers"),lang.getString("Size"),true);
|
|
}
|
|
catch(exception &e) {
|
|
SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s] loading map [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what(),file.c_str());
|
|
throw megaglest_runtime_error("Error loading map file: [" + file + "] msg: " + e.what());
|
|
}
|
|
|
|
return mapInfo;
|
|
}
|
|
|
|
void MenuStateMods::getTechsLocalList() {
|
|
Config &config = Config::getInstance();
|
|
vector<string> results;
|
|
findDirs(config.getPathListForType(ptTechs), results);
|
|
techTreeFiles = results;
|
|
|
|
techTreeFilesUserData.clear();
|
|
if(config.getPathListForType(ptTechs).size() > 1) {
|
|
string path = config.getPathListForType(ptTechs)[1];
|
|
endPathWithSlash(path);
|
|
findDirs(path, techTreeFilesUserData, false, false);
|
|
}
|
|
}
|
|
|
|
string MenuStateMods::refreshTechModInfo(string techInfo) {
|
|
std::vector<std::string> techInfoList;
|
|
Tokenize(techInfo,techInfoList,"|");
|
|
if(techInfoList.size() >= 6) {
|
|
Config &config = Config::getInstance();
|
|
ModInfo modinfo;
|
|
modinfo.name = techInfoList[0];
|
|
modinfo.count = techInfoList[1];
|
|
modinfo.crc = techInfoList[2];
|
|
modinfo.description = techInfoList[3];
|
|
modinfo.url = techInfoList[4];
|
|
modinfo.imageUrl = techInfoList[5];
|
|
modinfo.type = mt_Techtree;
|
|
|
|
string itemPath = config.getPathListForType(ptTechs,"")[1] + "/" + modinfo.name + string("/*");
|
|
if(itemPath.empty() == false) {
|
|
bool forceRefresh = (mapCRCUpdateList.find(itemPath) == mapCRCUpdateList.end());
|
|
uint32 crc = getFolderTreeContentsCheckSumRecursively(itemPath, ".xml", NULL,forceRefresh);
|
|
if(crc == 0) {
|
|
itemPath = config.getPathListForType(ptTechs,"")[0] + "/" + modinfo.name + string("/*");
|
|
if(itemPath.empty() == false) {
|
|
forceRefresh = (mapCRCUpdateList.find(itemPath) == mapCRCUpdateList.end());
|
|
crc = getFolderTreeContentsCheckSumRecursively(itemPath, ".xml", NULL,forceRefresh);
|
|
}
|
|
}
|
|
modinfo.localCRC=uIntToStr(crc);
|
|
//printf("itemPath='%s' remote crc:'%s' local crc:'%s' crc='%d' \n",itemPath.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str(),crc);
|
|
}
|
|
else {
|
|
modinfo.localCRC="";
|
|
}
|
|
techCacheList[modinfo.name] = modinfo;
|
|
return modinfo.name;
|
|
}
|
|
return "";
|
|
}
|
|
|
|
void MenuStateMods::refreshTechs() {
|
|
getTechsLocalList();
|
|
for(int i=0; i < (int)techListRemote.size(); i++) {
|
|
refreshTechModInfo(techListRemote[i]);
|
|
}
|
|
}
|
|
|
|
void MenuStateMods::getTilesetsLocalList() {
|
|
Config &config = Config::getInstance();
|
|
vector<string> results;
|
|
findDirs(config.getPathListForType(ptTilesets), results);
|
|
tilesetFiles = results;
|
|
|
|
tilesetFilesUserData.clear();
|
|
if(config.getPathListForType(ptTilesets).size() > 1) {
|
|
string path = config.getPathListForType(ptTilesets)[1];
|
|
endPathWithSlash(path);
|
|
findDirs(path, tilesetFilesUserData, false, false);
|
|
}
|
|
}
|
|
|
|
string MenuStateMods::refreshTilesetModInfo(string tilesetInfo) {
|
|
std::vector<std::string> tilesetInfoList;
|
|
Tokenize(tilesetInfo,tilesetInfoList,"|");
|
|
if(tilesetInfoList.size() >= 5) {
|
|
Config &config = Config::getInstance();
|
|
ModInfo modinfo;
|
|
modinfo.name = tilesetInfoList[0];
|
|
modinfo.crc = tilesetInfoList[1];
|
|
modinfo.description = tilesetInfoList[2];
|
|
modinfo.url = tilesetInfoList[3];
|
|
modinfo.imageUrl = tilesetInfoList[4];
|
|
modinfo.type = mt_Tileset;
|
|
|
|
string itemPath = config.getPathListForType(ptTilesets,"")[1] + "/" + modinfo.name + string("/*");
|
|
if(itemPath.empty() == false) {
|
|
bool forceRefresh = (mapCRCUpdateList.find(itemPath) == mapCRCUpdateList.end());
|
|
uint32 crc = getFolderTreeContentsCheckSumRecursively(itemPath, ".xml", NULL,forceRefresh);
|
|
if(crc == 0) {
|
|
itemPath = config.getPathListForType(ptTilesets,"")[0] + "/" + modinfo.name + string("/*");
|
|
if(itemPath.empty() == false) {
|
|
forceRefresh = (mapCRCUpdateList.find(itemPath) == mapCRCUpdateList.end());
|
|
crc=getFolderTreeContentsCheckSumRecursively(itemPath, ".xml", NULL,forceRefresh);
|
|
}
|
|
}
|
|
modinfo.localCRC=uIntToStr(crc);
|
|
//printf("itemPath='%s' remote crc:'%s' local crc:'%s' crc='%d' \n",itemPath.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str(),crc);
|
|
|
|
//printf("#1 refreshTilesetModInfo name [%s] modInfo.crc [%s] modInfo.localCRC [%s]\n",modinfo.name.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str());
|
|
}
|
|
else {
|
|
modinfo.localCRC="";
|
|
|
|
//printf("#2 refreshTilesetModInfo name [%s] modInfo.crc [%s] modInfo.localCRC [%s]\n",modinfo.name.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str());
|
|
}
|
|
|
|
tilesetCacheList[modinfo.name] = modinfo;
|
|
return modinfo.name;
|
|
}
|
|
return "";
|
|
}
|
|
|
|
void MenuStateMods::refreshTilesets() {
|
|
getTilesetsLocalList();
|
|
for(int i=0; i < (int)tilesetListRemote.size(); i++) {
|
|
refreshTilesetModInfo(tilesetListRemote[i]);
|
|
}
|
|
}
|
|
|
|
void MenuStateMods::getMapsLocalList() {
|
|
|
|
/*
|
|
Config &config = Config::getInstance();
|
|
vector<string> results;
|
|
set<string> allMaps;
|
|
findAll(config.getPathListForType(ptMaps), "*.gbm", results, false, false);
|
|
copy(results.begin(), results.end(), std::inserter(allMaps, allMaps.begin()));
|
|
results.clear();
|
|
findAll(config.getPathListForType(ptMaps), "*.mgm", results, false, false);
|
|
copy(results.begin(), results.end(), std::inserter(allMaps, allMaps.begin()));
|
|
results.clear();
|
|
|
|
copy(allMaps.begin(), allMaps.end(), std::back_inserter(results));
|
|
mapFiles = results;
|
|
|
|
mapFilesUserData.clear();
|
|
if(config.getPathListForType(ptMaps).size() > 1) {
|
|
string path = config.getPathListForType(ptMaps)[1];
|
|
endPathWithSlash(path);
|
|
|
|
vector<string> results2;
|
|
set<string> allMaps2;
|
|
findAll(path + "*.gbm", results2, false, false);
|
|
copy(results2.begin(), results2.end(), std::inserter(allMaps2, allMaps2.begin()));
|
|
|
|
results2.clear();
|
|
findAll(path + "*.mgm", results2, false, false);
|
|
copy(results2.begin(), results2.end(), std::inserter(allMaps2, allMaps2.begin()));
|
|
|
|
results2.clear();
|
|
copy(allMaps2.begin(), allMaps2.end(), std::back_inserter(results2));
|
|
mapFilesUserData = results2;
|
|
//printf("\n\nMap path [%s] mapFilesUserData.size() = %d\n\n\n",path.c_str(),mapFilesUserData.size());
|
|
}
|
|
*/
|
|
|
|
Config &config = Config::getInstance();
|
|
string scenarioDir = "";
|
|
vector<string> pathList = config.getPathListForType(ptMaps,scenarioDir);
|
|
vector<string> invalidMapList;
|
|
vector<string> allMaps = MapPreview::findAllValidMaps(pathList,scenarioDir,false,false,&invalidMapList);
|
|
if (allMaps.empty()) {
|
|
throw megaglest_runtime_error("No maps were found!");
|
|
}
|
|
vector<string> results;
|
|
copy(allMaps.begin(), allMaps.end(), std::back_inserter(results));
|
|
mapFiles = results;
|
|
|
|
mapFilesUserData = MapPreview::findAllValidMaps(pathList,scenarioDir,true,false,&invalidMapList);
|
|
}
|
|
|
|
string MenuStateMods::refreshMapModInfo(string mapInfo) {
|
|
std::vector<std::string> mapInfoList;
|
|
Tokenize(mapInfo,mapInfoList,"|");
|
|
if(mapInfoList.size() >= 6) {
|
|
//Config &config = Config::getInstance();
|
|
ModInfo modinfo;
|
|
modinfo.name = mapInfoList[0];
|
|
modinfo.count = mapInfoList[1];
|
|
modinfo.crc = mapInfoList[2];
|
|
modinfo.description = mapInfoList[3];
|
|
modinfo.url = mapInfoList[4];
|
|
modinfo.imageUrl = mapInfoList[5];
|
|
modinfo.type = mt_Map;
|
|
modinfo.localCRC=getMapCRC(modinfo.name);
|
|
mapCacheList[modinfo.name] = modinfo;
|
|
return modinfo.name;
|
|
}
|
|
return "";
|
|
}
|
|
|
|
string MenuStateMods::getMapCRC(string mapName) {
|
|
Config &config = Config::getInstance();
|
|
vector<string> mappaths=config.getPathListForType(ptMaps,"");
|
|
string result="";
|
|
if(mappaths.empty() == false) {
|
|
Checksum checksum;
|
|
string itemPath = mappaths[1] + "/" + mapName;
|
|
if (fileExists(itemPath)){
|
|
checksum.addFile(itemPath);
|
|
uint32 crc=checksum.getSum();
|
|
result=uIntToStr(crc);
|
|
//printf("itemPath='%s' modinfo.name='%s' remote crc:'%s' local crc:'%s' crc='%d' \n",itemPath.c_str(),modinfo.name.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str(),crc);
|
|
}
|
|
else {
|
|
itemPath = mappaths[0] + "/" + mapName;
|
|
if (fileExists(itemPath)){
|
|
checksum.addFile(itemPath);
|
|
uint32 crc=checksum.getSum();
|
|
result=uIntToStr(crc);
|
|
//printf("itemPath='%s' modinfo.name='%s' remote crc:'%s' local crc:'%s' crc='%d' \n",itemPath.c_str(),modinfo.name.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str(),crc);
|
|
}
|
|
else {
|
|
result="";
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
result="";
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void MenuStateMods::refreshMaps() {
|
|
getMapsLocalList();
|
|
for(int i=0; i < (int)mapListRemote.size(); i++) {
|
|
refreshMapModInfo(mapListRemote[i]);
|
|
}
|
|
}
|
|
|
|
void MenuStateMods::getScenariosLocalList() {
|
|
Config &config = Config::getInstance();
|
|
vector<string> results;
|
|
findDirs(config.getPathListForType(ptScenarios), results);
|
|
scenarioFiles = results;
|
|
|
|
scenarioFilesUserData.clear();
|
|
if(config.getPathListForType(ptScenarios).size() > 1) {
|
|
string path = config.getPathListForType(ptScenarios)[1];
|
|
endPathWithSlash(path);
|
|
findDirs(path, scenarioFilesUserData, false, false);
|
|
}
|
|
}
|
|
|
|
string MenuStateMods::refreshScenarioModInfo(string scenarioInfo) {
|
|
std::vector<std::string> scenarioInfoList;
|
|
Tokenize(scenarioInfo,scenarioInfoList,"|");
|
|
if(scenarioInfoList.size() >= 5) {
|
|
Config &config = Config::getInstance();
|
|
ModInfo modinfo;
|
|
modinfo.name = scenarioInfoList[0];
|
|
modinfo.crc = scenarioInfoList[1];
|
|
modinfo.description = scenarioInfoList[2];
|
|
modinfo.url = scenarioInfoList[3];
|
|
modinfo.imageUrl = scenarioInfoList[4];
|
|
modinfo.type = mt_Scenario;
|
|
|
|
string itemPath = config.getPathListForType(ptScenarios,"")[1] + "/" + modinfo.name + string("/*");
|
|
if(itemPath.empty() == false) {
|
|
bool forceRefresh = (mapCRCUpdateList.find(itemPath) == mapCRCUpdateList.end());
|
|
uint32 crc = getFolderTreeContentsCheckSumRecursively(itemPath, ".xml", NULL,forceRefresh);
|
|
if(crc == 0) {
|
|
itemPath = config.getPathListForType(ptScenarios,"")[0] + "/" + modinfo.name + string("/*");
|
|
if(itemPath.empty() == false) {
|
|
forceRefresh = (mapCRCUpdateList.find(itemPath) == mapCRCUpdateList.end());
|
|
crc = getFolderTreeContentsCheckSumRecursively(itemPath, ".xml", NULL,forceRefresh);
|
|
}
|
|
}
|
|
modinfo.localCRC=uIntToStr(crc);
|
|
//printf(" itemPath='%s' remote crc:'%s' local crc:'%s' crc='%d' \n",itemPath.c_str(),modinfo.crc.c_str(),modinfo.localCRC.c_str(),crc);
|
|
}
|
|
else {
|
|
modinfo.localCRC="";
|
|
}
|
|
scenarioCacheList[modinfo.name] = modinfo;
|
|
return modinfo.name;
|
|
}
|
|
return "";
|
|
}
|
|
|
|
void MenuStateMods::refreshScenarios() {
|
|
getScenariosLocalList();
|
|
for(int i=0; i < (int)scenarioListRemote.size(); i++) {
|
|
refreshScenarioModInfo(scenarioListRemote[i]);
|
|
}
|
|
}
|
|
|
|
|
|
void MenuStateMods::cleanUp() {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
if(modHttpServerThread != NULL) {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
modHttpServerThread->signalQuit();
|
|
//modHttpServerThread->setThreadOwnerValid(false);
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
if( modHttpServerThread->canShutdown(true) == true &&
|
|
modHttpServerThread->shutdownAndWait() == true) {
|
|
delete modHttpServerThread;
|
|
}
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
modHttpServerThread = NULL;
|
|
}
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
|
|
if(ftpClientThread != NULL) {
|
|
ftpClientThread->setCallBackObject(NULL);
|
|
ftpClientThread->signalQuit();
|
|
sleep(0);
|
|
if(ftpClientThread->canShutdown(true) == true &&
|
|
ftpClientThread->shutdownAndWait() == true) {
|
|
delete ftpClientThread;
|
|
}
|
|
else {
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,"In [%s::%s %d] Error cannot shutdown ftpClientThread\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
|
|
//SystemFlags::OutputDebug(SystemFlags::debugError,szBuf);
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("%s",szBuf);
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s",szBuf);
|
|
|
|
//publishToMasterserverThread->cleanup();
|
|
}
|
|
ftpClientThread = NULL;
|
|
|
|
// ftpClientThread->signalQuit();
|
|
// ftpClientThread->setCallBackObject(NULL);
|
|
// if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
// if( ftpClientThread->shutdownAndWait() == true) {
|
|
// if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
// delete ftpClientThread;
|
|
// }
|
|
// ftpClientThread = NULL;
|
|
// if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
}
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
|
|
clearUserButtons();
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
cleanupPreviewTexture();
|
|
cleanupMapPreviewTexture();
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
}
|
|
|
|
MenuStateMods::~MenuStateMods() {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
|
|
cleanUp();
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
}
|
|
|
|
void MenuStateMods::clearUserButtons() {
|
|
// Techs
|
|
while(!keyTechButtons.empty()) {
|
|
delete keyTechButtons.back();
|
|
keyTechButtons.pop_back();
|
|
}
|
|
keyTechScrollBar.setElementCount(0);
|
|
|
|
while(!labelsTech.empty()) {
|
|
delete labelsTech.back();
|
|
labelsTech.pop_back();
|
|
}
|
|
|
|
// Tilesets
|
|
while(!keyTilesetButtons.empty()) {
|
|
delete keyTilesetButtons.back();
|
|
keyTilesetButtons.pop_back();
|
|
}
|
|
keyTilesetScrollBar.setElementCount(0);
|
|
|
|
// Maps
|
|
while(!keyMapButtons.empty()) {
|
|
delete keyMapButtons.back();
|
|
keyMapButtons.pop_back();
|
|
}
|
|
while(!labelsMap.empty()) {
|
|
delete labelsMap.back();
|
|
labelsMap.pop_back();
|
|
}
|
|
keyMapScrollBar.setElementCount(0);
|
|
|
|
// Scenarios
|
|
while(!keyScenarioButtons.empty()) {
|
|
delete keyScenarioButtons.back();
|
|
keyScenarioButtons.pop_back();
|
|
}
|
|
keyScenarioScrollBar.setElementCount(0);
|
|
}
|
|
|
|
void MenuStateMods::mouseClick(int x, int y, MouseButton mouseButton) {
|
|
|
|
CoreData &coreData= CoreData::getInstance();
|
|
SoundRenderer &soundRenderer= SoundRenderer::getInstance();
|
|
Lang &lang= Lang::getInstance();
|
|
|
|
if(buttonReturn.mouseClick(x,y)) {
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
|
|
soundRenderer.playFx(coreData.getClickSoundA());
|
|
|
|
if(fileFTPProgressList.empty() == false) {
|
|
mainMessageBoxState = ftpmsg_Quit;
|
|
mainMessageBox.init(lang.getString("Yes"),lang.getString("No"),450);
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModDownloadInProgressCancelQuestion").c_str(),fileFTPProgressList.size());
|
|
showMessageBox(szBuf, lang.getString("Question"), true);
|
|
}
|
|
else {
|
|
cleanUp();
|
|
mainMenu->setState(new MenuStateRoot(program, mainMenu));
|
|
return;
|
|
}
|
|
}
|
|
else if(mainMessageBox.getEnabled()) {
|
|
int button= 0;
|
|
if(mainMessageBox.mouseClick(x, y, button)) {
|
|
soundRenderer.playFx(coreData.getClickSoundA());
|
|
mainMessageBox.setEnabled(false);
|
|
mainMessageBox.init(lang.getString("Yes"),lang.getString("No"),450);
|
|
if(button == 0) {
|
|
if(mainMessageBoxState == ftpmsg_Quit) {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMenu->setState(new MenuStateRoot(program, mainMenu));
|
|
return;
|
|
}
|
|
else if(mainMessageBoxState == ftpmsg_GetMap ||
|
|
mainMessageBoxState == ftpmsg_ReplaceMap) {
|
|
bool getItemAfterRemoval = (mainMessageBoxState == ftpmsg_ReplaceMap);
|
|
mainMessageBoxState = ftpmsg_None;
|
|
|
|
Config &config = Config::getInstance();
|
|
vector<string> mapPaths = config.getPathListForType(ptMaps);
|
|
if(mapPaths.size() > 1) {
|
|
string removeMap = mapPaths[1];
|
|
endPathWithSlash(removeMap);
|
|
removeMap += selectedMapName;
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Removing Map [%s]\n",removeMap.c_str());
|
|
removeFile(removeMap);
|
|
|
|
bool remoteHasMap = (mapCacheList.find(selectedMapName) != mapCacheList.end());
|
|
if(remoteHasMap == false) {
|
|
for(unsigned int i = 0; i < keyMapButtons.size(); ++i) {
|
|
GraphicButton *button = keyMapButtons[i];
|
|
if(button != NULL && button->getText() == selectedMapName) {
|
|
delete button;
|
|
keyMapButtons.erase(keyMapButtons.begin() + i);
|
|
labelsMap.erase(labelsMap.begin() + i);
|
|
keyMapScrollBar.setElementCount((int)keyMapButtons.size());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(getItemAfterRemoval == false) {
|
|
selectedMapName = "";
|
|
}
|
|
refreshMaps();
|
|
Checksum::clearFileCache();
|
|
|
|
if(getItemAfterRemoval == true) {
|
|
string mapName = selectedMapName;
|
|
string mapURL = mapCacheList[mapName].url;
|
|
if(ftpClientThread != NULL) ftpClientThread->addMapToRequests(mapName,mapURL);
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList[mapName] = pair<int,string>(0,"");
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
buttonInstallMap.setEnabled(false);
|
|
}
|
|
}
|
|
}
|
|
else if(mainMessageBoxState == ftpmsg_GetTileset ||
|
|
mainMessageBoxState == ftpmsg_ReplaceTileset) {
|
|
bool getItemAfterRemoval = (mainMessageBoxState == ftpmsg_ReplaceTileset);
|
|
mainMessageBoxState = ftpmsg_None;
|
|
|
|
Config &config = Config::getInstance();
|
|
vector<string> tilesetPaths = config.getPathListForType(ptTilesets);
|
|
if(tilesetPaths.size() > 1) {
|
|
string removeTileset = tilesetPaths[1];
|
|
endPathWithSlash(removeTileset);
|
|
removeTileset += selectedTilesetName;
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Removing Tileset [%s]\n",removeTileset.c_str());
|
|
removeFolder(removeTileset);
|
|
|
|
bool remoteHasTileset = (tilesetCacheList.find(selectedTilesetName) != tilesetCacheList.end());
|
|
if(remoteHasTileset == false) {
|
|
//printf("\n\n\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ remote DOES NOT have removed tileset [%s]\n\n\n",selectedTilesetName.c_str());
|
|
|
|
for(unsigned int i = 0; i < keyTilesetButtons.size(); ++i) {
|
|
GraphicButton *button = keyTilesetButtons[i];
|
|
if(button != NULL && button->getText() == selectedTilesetName) {
|
|
delete button;
|
|
keyTilesetButtons.erase(keyTilesetButtons.begin() + i);
|
|
keyTilesetScrollBar.setElementCount((int)keyTilesetButtons.size());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
Checksum::clearFileCache();
|
|
vector<string> paths = Config::getInstance().getPathListForType(ptTilesets);
|
|
string pathSearchString = string("/") + selectedTilesetName + string("/*");
|
|
const string filterFileExt = ".xml";
|
|
clearFolderTreeContentsCheckSum(paths, pathSearchString, filterFileExt);
|
|
clearFolderTreeContentsCheckSumList(paths, pathSearchString, filterFileExt);
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
|
|
if(getItemAfterRemoval == false) {
|
|
selectedTilesetName = "";
|
|
}
|
|
refreshTilesets();
|
|
}
|
|
|
|
if(getItemAfterRemoval == true) {
|
|
string tilesetName = selectedTilesetName;
|
|
string tilesetURL = tilesetCacheList[tilesetName].url;
|
|
if(ftpClientThread != NULL) ftpClientThread->addTilesetToRequests(tilesetName,tilesetURL);
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList[tilesetName] = pair<int,string>(0,"");
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
buttonInstallTileset.setEnabled(false);
|
|
}
|
|
}
|
|
else if(mainMessageBoxState == ftpmsg_GetTechtree ||
|
|
mainMessageBoxState == ftpmsg_ReplaceTechtree) {
|
|
bool getItemAfterRemoval = (mainMessageBoxState == ftpmsg_ReplaceTechtree);
|
|
mainMessageBoxState = ftpmsg_None;
|
|
|
|
Config &config = Config::getInstance();
|
|
vector<string> techPaths = config.getPathListForType(ptTechs);
|
|
if(techPaths.size() > 1) {
|
|
string removeTech = techPaths[1];
|
|
endPathWithSlash(removeTech);
|
|
removeTech+= selectedTechName;
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Removing Techtree [%s]\n",removeTech.c_str());
|
|
removeFolder(removeTech);
|
|
|
|
bool remoteHasTech = (techCacheList.find(selectedTechName) != techCacheList.end());
|
|
if(remoteHasTech == false) {
|
|
for(unsigned int i = 0; i < keyTechButtons.size(); ++i) {
|
|
GraphicButton *button = keyTechButtons[i];
|
|
if(button != NULL && button->getText() == selectedTechName) {
|
|
delete button;
|
|
keyTechButtons.erase(keyTechButtons.begin() + i);
|
|
labelsTech.erase(labelsTech.begin() + i);
|
|
keyTechScrollBar.setElementCount((int)keyTechButtons.size());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
// Clear the CRC file Cache
|
|
Checksum::clearFileCache();
|
|
vector<string> paths = Config::getInstance().getPathListForType(ptTechs);
|
|
string pathSearchString = string("/") + selectedTechName + string("/*");
|
|
const string filterFileExt = ".xml";
|
|
clearFolderTreeContentsCheckSum(paths, pathSearchString, filterFileExt);
|
|
clearFolderTreeContentsCheckSumList(paths, pathSearchString, filterFileExt);
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
|
|
if(getItemAfterRemoval == false) {
|
|
selectedTechName = "";
|
|
}
|
|
refreshTechs();
|
|
}
|
|
|
|
if(getItemAfterRemoval == true) {
|
|
string techName = selectedTechName;
|
|
string techURL = techCacheList[techName].url;
|
|
if(ftpClientThread != NULL) ftpClientThread->addTechtreeToRequests(techName,techURL);
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList[techName] = pair<int,string>(0,"");
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
buttonInstallTech.setEnabled(false);
|
|
}
|
|
}
|
|
else if(mainMessageBoxState == ftpmsg_GetScenario ||
|
|
mainMessageBoxState == ftpmsg_ReplaceScenario) {
|
|
bool getItemAfterRemoval = (mainMessageBoxState == ftpmsg_ReplaceScenario);
|
|
mainMessageBoxState = ftpmsg_None;
|
|
|
|
Config &config = Config::getInstance();
|
|
vector<string> scenarioPaths = config.getPathListForType(ptScenarios);
|
|
if(scenarioPaths.size() > 1) {
|
|
string removeScenario = scenarioPaths[1];
|
|
endPathWithSlash(removeScenario);
|
|
removeScenario += selectedScenarioName;
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Removing Scenario [%s]\n",removeScenario.c_str());
|
|
removeFolder(removeScenario);
|
|
|
|
bool remoteHasScenario = (scenarioCacheList.find(selectedScenarioName) != scenarioCacheList.end());
|
|
if(remoteHasScenario == false) {
|
|
for(unsigned int i = 0; i < keyScenarioButtons.size(); ++i) {
|
|
GraphicButton *button = keyScenarioButtons[i];
|
|
if(button != NULL && button->getText() == selectedScenarioName) {
|
|
delete button;
|
|
keyScenarioButtons.erase(keyScenarioButtons.begin() + i);
|
|
keyScenarioScrollBar.setElementCount((int)keyScenarioButtons.size());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
Checksum::clearFileCache();
|
|
vector<string> paths = Config::getInstance().getPathListForType(ptScenarios);
|
|
string pathSearchString = string("/") + selectedScenarioName + string("/*");
|
|
const string filterFileExt = ".xml";
|
|
clearFolderTreeContentsCheckSum(paths, pathSearchString, filterFileExt);
|
|
clearFolderTreeContentsCheckSumList(paths, pathSearchString, filterFileExt);
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
|
|
if(getItemAfterRemoval == false) {
|
|
selectedScenarioName = "";
|
|
}
|
|
refreshScenarios();
|
|
}
|
|
|
|
if(getItemAfterRemoval == true) {
|
|
string scenarioName = selectedScenarioName;
|
|
string scenarioURL = scenarioCacheList[scenarioName].url;
|
|
if(ftpClientThread != NULL) ftpClientThread->addScenarioToRequests(scenarioName,scenarioURL);
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList[scenarioName] = pair<int,string>(0,"");
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
buttonInstallScenario.setEnabled(false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(keyTechScrollBar.mouseClick(x, y)) {
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
soundRenderer.playFx(coreData.getClickSoundA());
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
}
|
|
else if(keyTilesetScrollBar.mouseClick(x, y)) {
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
soundRenderer.playFx(coreData.getClickSoundA());
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
}
|
|
else if(keyMapScrollBar.mouseClick(x, y)) {
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
soundRenderer.playFx(coreData.getClickSoundA());
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
}
|
|
else if(keyScenarioScrollBar.mouseClick(x, y)) {
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
soundRenderer.playFx(coreData.getClickSoundA());
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
}
|
|
else if(buttonInstallTech.mouseClick(x, y) && buttonInstallTech.getEnabled()) {
|
|
soundRenderer.playFx(coreData.getClickSoundB());
|
|
if(selectedTechName != "") {
|
|
bool alreadyHasTech = (std::find(techTreeFiles.begin(),techTreeFiles.end(),selectedTechName) != techTreeFiles.end());
|
|
if(alreadyHasTech == true) {
|
|
bool remoteHasTech = (techCacheList.find(selectedTechName) != techCacheList.end());
|
|
if(remoteHasTech == true){
|
|
ModInfo &modInfo = techCacheList[selectedTechName];
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d] remote CRC [%s]\n",__FILE__,__FUNCTION__,__LINE__,modInfo.crc.c_str());
|
|
|
|
Config &config = Config::getInstance();
|
|
string itemPath = config.getPathListForType(ptTechs,"")[1] + "/" + selectedTechName + string("/*");
|
|
bool forceRefresh = (mapCRCUpdateList.find(itemPath) == mapCRCUpdateList.end());
|
|
if( strToUInt(modInfo.crc) != 0 &&
|
|
strToUInt(modInfo.crc) != getFolderTreeContentsCheckSumRecursively(itemPath, ".xml", NULL,forceRefresh)) {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d] local CRC [%u]\n",__FILE__,__FUNCTION__,__LINE__,getFolderTreeContentsCheckSumRecursively(itemPath, ".xml", NULL));
|
|
|
|
mainMessageBoxState = ftpmsg_ReplaceTechtree;
|
|
mainMessageBox.init(lang.getString("Yes"),lang.getString("No"),450);
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModLocalRemoteMismatch").c_str(),selectedTechName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModTechAlreadyInstalled").c_str(),selectedTechName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
mapCRCUpdateList[itemPath] = true;
|
|
}
|
|
}
|
|
else {
|
|
string techName = selectedTechName;
|
|
string techURL = techCacheList[techName].url;
|
|
if(ftpClientThread != NULL) ftpClientThread->addTechtreeToRequests(techName,techURL);
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList[techName] = pair<int,string>(0,"");
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
buttonInstallTech.setEnabled(false);
|
|
}
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
showMessageBox(lang.getString("ModSelectTechToInstall"), lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
else if(buttonRemoveTech.mouseClick(x, y) && buttonRemoveTech.getEnabled()) {
|
|
soundRenderer.playFx(coreData.getClickSoundB());
|
|
if(selectedTechName != "") {
|
|
bool alreadyHasTech = (std::find(techTreeFiles.begin(),techTreeFiles.end(),selectedTechName) != techTreeFiles.end());
|
|
if(alreadyHasTech == true) {
|
|
mainMessageBoxState = ftpmsg_GetTechtree;
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModRemoveTechConfirm").c_str(),selectedTechName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Question"), true);
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModCannotRemoveTechNotInstalled").c_str(),selectedTechName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
|
|
showMessageBox(lang.getString("ModSelectTechToRemove"), lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
|
|
else if(buttonInstallTileset.mouseClick(x, y) && buttonInstallTileset.getEnabled()) {
|
|
soundRenderer.playFx(coreData.getClickSoundB());
|
|
if(selectedTilesetName != "") {
|
|
bool alreadyHasTileset = (std::find(tilesetFiles.begin(),tilesetFiles.end(),selectedTilesetName) != tilesetFiles.end());
|
|
if(alreadyHasTileset == true) {
|
|
bool remoteHasTileset = (tilesetCacheList.find(selectedTilesetName) != tilesetCacheList.end());
|
|
if(remoteHasTileset){
|
|
ModInfo &modInfo = tilesetCacheList[selectedTilesetName];
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d] remote CRC [%s]\n",__FILE__,__FUNCTION__,__LINE__,modInfo.crc.c_str());
|
|
|
|
Config &config = Config::getInstance();
|
|
string itemPath = config.getPathListForType(ptTilesets,"")[1] + "/" + selectedTilesetName + string("/*");
|
|
bool forceRefresh = (mapCRCUpdateList.find(itemPath) == mapCRCUpdateList.end());
|
|
|
|
if( strToUInt(modInfo.crc) != 0 &&
|
|
strToUInt(modInfo.crc) != getFolderTreeContentsCheckSumRecursively(itemPath, ".xml", NULL,forceRefresh)) {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d] local CRC [%u] [%s]\n",__FILE__,__FUNCTION__,__LINE__,getFolderTreeContentsCheckSumRecursively(itemPath, ".xml", NULL),itemPath.c_str());
|
|
|
|
mainMessageBoxState = ftpmsg_ReplaceTileset;
|
|
mainMessageBox.init(lang.getString("Yes"),lang.getString("No"),450);
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModLocalRemoteMismatch").c_str(),selectedTilesetName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModTilesetAlreadyInstalled").c_str(),selectedTilesetName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
string tilesetName = selectedTilesetName;
|
|
string tilesetURL = tilesetCacheList[tilesetName].url;
|
|
if(ftpClientThread != NULL) ftpClientThread->addTilesetToRequests(tilesetName,tilesetURL);
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList[tilesetName] = pair<int,string>(0,"");
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
buttonInstallTileset.setEnabled(false);
|
|
}
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
showMessageBox(lang.getString("ModSelectTilesetToInstall"), lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
else if(buttonRemoveTileset.mouseClick(x, y) && buttonRemoveTileset.getEnabled()) {
|
|
soundRenderer.playFx(coreData.getClickSoundB());
|
|
if(selectedTilesetName != "") {
|
|
bool alreadyHasTileset = (std::find(tilesetFiles.begin(),tilesetFiles.end(),selectedTilesetName) != tilesetFiles.end());
|
|
if(alreadyHasTileset == true) {
|
|
mainMessageBoxState = ftpmsg_GetTileset;
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModRemoveTilesetConfirm").c_str(),selectedTilesetName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Question"), true);
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModCannotRemoveTilesetNotInstalled").c_str(),selectedTilesetName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
showMessageBox(lang.getString("ModSelectTilesetToRemove"), lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
|
|
else if(buttonInstallMap.mouseClick(x, y) && buttonInstallMap.getEnabled()) {
|
|
soundRenderer.playFx(coreData.getClickSoundB());
|
|
if(selectedMapName != "") {
|
|
bool alreadyHasMap = (std::find(mapFiles.begin(),mapFiles.end(),selectedMapName) != mapFiles.end());
|
|
if(alreadyHasMap == true) {
|
|
bool remoteHasMap = (mapCacheList.find(selectedMapName) != mapCacheList.end());
|
|
if(remoteHasMap){
|
|
ModInfo &modInfo = mapCacheList[selectedMapName];
|
|
if( modInfo.crc != modInfo.localCRC ) {
|
|
mainMessageBoxState = ftpmsg_ReplaceMap;
|
|
mainMessageBox.init(lang.getString("Yes"),lang.getString("No"),450);
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModLocalRemoteMismatch").c_str(),selectedMapName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModMapAlreadyInstalled").c_str(),selectedMapName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
string mapName = selectedMapName;
|
|
string mapURL = mapCacheList[mapName].url;
|
|
if(ftpClientThread != NULL) ftpClientThread->addMapToRequests(mapName,mapURL);
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList[mapName] = pair<int,string>(0,"");
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
buttonInstallMap.setEnabled(false);
|
|
}
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
showMessageBox(lang.getString("ModSelectMapToInstall"), lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
else if(buttonRemoveMap.mouseClick(x, y) && buttonRemoveMap.getEnabled()) {
|
|
soundRenderer.playFx(coreData.getClickSoundB());
|
|
if(selectedMapName != "") {
|
|
bool alreadyHasMap = (std::find(mapFiles.begin(),mapFiles.end(),selectedMapName) != mapFiles.end());
|
|
if(alreadyHasMap == true) {
|
|
mainMessageBoxState = ftpmsg_GetMap;
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModRemoveMapConfirm").c_str(),selectedMapName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Question"), true);
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModCannotRemoveMapNotInstalled").c_str(),selectedMapName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
showMessageBox(lang.getString("ModSelectMapToRemove"), lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
|
|
else if(buttonInstallScenario.mouseClick(x, y) && buttonInstallScenario.getEnabled()) {
|
|
soundRenderer.playFx(coreData.getClickSoundB());
|
|
if(selectedScenarioName != "") {
|
|
bool alreadyHasScenario = (std::find(scenarioFiles.begin(),scenarioFiles.end(),selectedScenarioName) != scenarioFiles.end());
|
|
if(alreadyHasScenario == true) {
|
|
bool remoteHasScenario = (scenarioCacheList.find(selectedScenarioName) != scenarioCacheList.end());
|
|
if(remoteHasScenario){
|
|
ModInfo &modInfo = scenarioCacheList[selectedScenarioName];
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d] remote CRC [%s]\n",__FILE__,__FUNCTION__,__LINE__,modInfo.crc.c_str());
|
|
|
|
Config &config = Config::getInstance();
|
|
string itemPath = config.getPathListForType(ptScenarios,"")[1] + "/" + selectedScenarioName + string("/*");
|
|
bool forceRefresh = (mapCRCUpdateList.find(itemPath) == mapCRCUpdateList.end());
|
|
|
|
if( strToUInt(modInfo.crc) != 0 &&
|
|
strToUInt(modInfo.crc) != getFolderTreeContentsCheckSumRecursively(itemPath, "", NULL,forceRefresh)) {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d] local CRC [%u]\n",__FILE__,__FUNCTION__,__LINE__,getFolderTreeContentsCheckSumRecursively(itemPath, "", NULL));
|
|
|
|
mainMessageBoxState = ftpmsg_ReplaceScenario;
|
|
mainMessageBox.init(lang.getString("Yes"),lang.getString("No"),450);
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModLocalRemoteMismatch").c_str(),selectedScenarioName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModScenarioAlreadyInstalled").c_str(),selectedScenarioName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
string scenarioName = selectedScenarioName;
|
|
string scenarioURL = scenarioCacheList[scenarioName].url;
|
|
|
|
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d] adding file to download [%s]\n",__FILE__,__FUNCTION__,__LINE__,scenarioURL.c_str());
|
|
if(ftpClientThread != NULL) ftpClientThread->addScenarioToRequests(scenarioName,scenarioURL);
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList[scenarioName] = pair<int,string>(0,"");
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
buttonInstallScenario.setEnabled(false);
|
|
}
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
showMessageBox(lang.getString("ModSelectScenarioToInstall"), lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
else if(buttonRemoveScenario.mouseClick(x, y) && buttonRemoveScenario.getEnabled()) {
|
|
soundRenderer.playFx(coreData.getClickSoundB());
|
|
if(selectedScenarioName != "") {
|
|
bool alreadyHasScenario = (std::find(scenarioFiles.begin(),scenarioFiles.end(),selectedScenarioName) != scenarioFiles.end());
|
|
if(alreadyHasScenario == true) {
|
|
mainMessageBoxState = ftpmsg_GetScenario;
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModRemoveScenarioConfirm").c_str(),selectedScenarioName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Question"), true);
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModCannotRemoveScenarioNotInstalled").c_str(),selectedScenarioName.c_str());
|
|
showMessageBox(szBuf, lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
else {
|
|
mainMessageBoxState = ftpmsg_None;
|
|
mainMessageBox.init(lang.getString("Ok"),450);
|
|
showMessageBox(lang.getString("ModSelectScenarioToRemove"), lang.getString("Notice"), true);
|
|
}
|
|
}
|
|
|
|
else {
|
|
if(keyMapScrollBar.getElementCount() != 0) {
|
|
for (int i = keyMapScrollBar.getVisibleStart();
|
|
i <= keyMapScrollBar.getVisibleEnd(); ++i) {
|
|
if(keyMapButtons[i]->mouseClick(x, y) && keyMapButtons[i]->getEnabled()) {
|
|
string mapName = keyMapButtons[i]->getText();
|
|
selectedTechName = "";
|
|
selectedTilesetName = "";
|
|
selectedMapName = "";
|
|
selectedScenarioName = "";
|
|
if(mapName != "") {
|
|
selectedMapName = mapName;
|
|
bool remoteHasMap = (mapCacheList.find(mapName) != mapCacheList.end());
|
|
if(remoteHasMap) {
|
|
showRemoteDesription(&mapCacheList[selectedMapName]);
|
|
if(mapCacheList[selectedMapName].localCRC!=""){
|
|
loadMapPreview(mapName);
|
|
}
|
|
}
|
|
else {
|
|
showLocalDescription(mapName);
|
|
loadMapPreview(mapName);
|
|
}
|
|
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if(keyTechScrollBar.getElementCount() != 0) {
|
|
for (int i = keyTechScrollBar.getVisibleStart();
|
|
i <= keyTechScrollBar.getVisibleEnd(); ++i) {
|
|
if(keyTechButtons[i]->mouseClick(x, y) && keyTechButtons[i]->getEnabled()) {
|
|
string techName = keyTechButtons[i]->getText();
|
|
selectedTechName = "";
|
|
selectedTilesetName = "";
|
|
selectedMapName = "";
|
|
selectedScenarioName = "";
|
|
if(techName != "") {
|
|
selectedTechName = techName;
|
|
bool remoteHasTech = (techCacheList.find(techName) != techCacheList.end());
|
|
if(remoteHasTech) {
|
|
showRemoteDesription(&techCacheList[techName]);
|
|
}
|
|
else {
|
|
showLocalDescription(techName);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if(keyTilesetScrollBar.getElementCount() != 0) {
|
|
for (int i = keyTilesetScrollBar.getVisibleStart();
|
|
i <= keyTilesetScrollBar.getVisibleEnd(); ++i) {
|
|
if(keyTilesetButtons[i]->mouseClick(x, y) && keyTilesetButtons[i]->getEnabled()) {
|
|
string tilesetName = keyTilesetButtons[i]->getText();
|
|
selectedTechName = "";
|
|
selectedTilesetName = "";
|
|
selectedMapName = "";
|
|
selectedScenarioName = "";
|
|
if(tilesetName != "") {
|
|
selectedTilesetName = tilesetName;
|
|
bool remoteHasTileset = (tilesetCacheList.find(tilesetName) != tilesetCacheList.end());
|
|
if(remoteHasTileset) {
|
|
showRemoteDesription(&tilesetCacheList[tilesetName]);
|
|
}
|
|
else {
|
|
showLocalDescription(tilesetName);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if(keyScenarioScrollBar.getElementCount() != 0) {
|
|
for (int i = keyScenarioScrollBar.getVisibleStart();
|
|
i <= keyScenarioScrollBar.getVisibleEnd(); ++i) {
|
|
if(keyScenarioButtons[i]->mouseClick(x, y) && keyScenarioButtons[i]->getEnabled()) {
|
|
string scenarioName = keyScenarioButtons[i]->getText();
|
|
selectedTechName = "";
|
|
selectedTilesetName = "";
|
|
selectedMapName = "";
|
|
selectedScenarioName = "";
|
|
if(scenarioName != "") {
|
|
selectedScenarioName = scenarioName;
|
|
bool remoteHasScenario = (scenarioCacheList.find(scenarioName) != scenarioCacheList.end());
|
|
if(remoteHasScenario) {
|
|
showRemoteDesription(&scenarioCacheList[scenarioName]);
|
|
}
|
|
else {
|
|
showLocalDescription(scenarioName);
|
|
}
|
|
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
}
|
|
|
|
string MenuStateMods::getPreviewImageFileForMod(const ModInfo *modInfo) {
|
|
string fileName = "";
|
|
if(modInfo->imageUrl != "") {
|
|
Config &config = Config::getInstance();
|
|
string userData = config.getString("UserData_Root","");
|
|
if(userData != "") {
|
|
endPathWithSlash(userData);
|
|
}
|
|
string tempPath = userData + "temp/";
|
|
if(isdir(tempPath.c_str()) == false) {
|
|
createDirectoryPaths(tempPath);
|
|
}
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("### tempPath [%s] isdir = %d\n",tempPath.c_str(),isdir(tempPath.c_str()));
|
|
|
|
if(isdir(tempPath.c_str()) == true) {
|
|
fileName = tempPath;
|
|
switch(modInfo->type) {
|
|
case mt_Map:
|
|
fileName += "map_";
|
|
break;
|
|
case mt_Tileset:
|
|
fileName += "tileset_";
|
|
break;
|
|
case mt_Techtree:
|
|
fileName += "tech_";
|
|
break;
|
|
case mt_Scenario:
|
|
fileName += "scenario_";
|
|
break;
|
|
}
|
|
fileName += extractFileFromDirectoryPath(modInfo->imageUrl);
|
|
}
|
|
}
|
|
return fileName;
|
|
}
|
|
|
|
|
|
void MenuStateMods::showLocalDescription(string name) {
|
|
Lang &lang= Lang::getInstance();
|
|
modInfoSelected=NULL;
|
|
cleanupPreviewTexture();
|
|
validMapPreview=false;
|
|
cleanupMapPreviewTexture();
|
|
modDescrLabel.setText(lang.getString("ModOnlyLocal")+":\n'"+name+"'");
|
|
}
|
|
|
|
void MenuStateMods::loadMapPreview(string mapName) {
|
|
Config &config = Config::getInstance();
|
|
cleanupMapPreviewTexture();
|
|
vector<string> mapPaths = config.getPathListForType(ptMaps);
|
|
string &mapPath = mapPaths[1];
|
|
endPathWithSlash(mapPath);
|
|
mapPath += mapName;
|
|
MapInfo mapInfo = loadMapInfo(mapPath);
|
|
if(enableMapPreview == true) {
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
|
|
|
|
mapPreview.loadFromFile(mapPath.c_str());
|
|
|
|
//printf("Loading map preview MAP\n");
|
|
cleanupMapPreviewTexture();
|
|
validMapPreview=true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void MenuStateMods::showRemoteDesription(ModInfo *modInfo) {
|
|
//displayModPreviewImage = false;
|
|
modInfoSelected = modInfo;
|
|
validMapPreview=false;
|
|
cleanupMapPreviewTexture();
|
|
|
|
string modText = modInfo->description;
|
|
replaceAll(modText, "\\n", "\n");
|
|
modDescrLabel.setText(modText);
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("### modInfo->imageUrl [%s]\n",modInfo->imageUrl.c_str());
|
|
|
|
if(modInfo->imageUrl != "") {
|
|
cleanupPreviewTexture();
|
|
string tempImage = getPreviewImageFileForMod(modInfo);
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("### tempImage [%s] exists [%d]\n",tempImage.c_str(),fileExists(tempImage));
|
|
|
|
if(tempImage != "" && fileExists(tempImage) == false) {
|
|
if(ftpClientThread != NULL) ftpClientThread->addFileToRequests(tempImage,modInfo->imageUrl);
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList[tempImage] = pair<int,string>(0,"");
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
|
|
}
|
|
else {
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
if(fileFTPProgressList.find(tempImage) == fileFTPProgressList.end()) {
|
|
//displayModPreviewImage = true;
|
|
displayModPreviewImage[tempImage] = true;
|
|
}
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
}
|
|
}
|
|
}
|
|
|
|
void MenuStateMods::mouseUp(int x, int y, const MouseButton mouseButton){
|
|
if (mouseButton == mbLeft) {
|
|
keyTechScrollBar.mouseUp(x, y);
|
|
keyTilesetScrollBar.mouseUp(x, y);
|
|
keyMapScrollBar.mouseUp(x, y);
|
|
keyScenarioScrollBar.mouseUp(x, y);
|
|
}
|
|
}
|
|
|
|
void MenuStateMods::mouseMove(int x, int y, const MouseState *ms) {
|
|
buttonReturn.mouseMove(x, y);
|
|
|
|
if (mainMessageBox.getEnabled()) {
|
|
mainMessageBox.mouseMove(x, y);
|
|
}
|
|
|
|
buttonInstallTech.mouseMove(x, y);
|
|
buttonRemoveTech.mouseMove(x, y);
|
|
buttonInstallTileset.mouseMove(x, y);
|
|
buttonRemoveTileset.mouseMove(x, y);
|
|
buttonInstallMap.mouseMove(x, y);
|
|
buttonRemoveMap.mouseMove(x, y);
|
|
buttonInstallScenario.mouseMove(x, y);
|
|
buttonRemoveScenario.mouseMove(x, y);
|
|
|
|
if (ms->get(mbLeft)) {
|
|
keyMapScrollBar.mouseDown(x, y);
|
|
keyTechScrollBar.mouseDown(x, y);
|
|
keyTilesetScrollBar.mouseDown(x, y);
|
|
keyScenarioScrollBar.mouseDown(x, y);
|
|
}
|
|
else {
|
|
keyMapScrollBar.mouseMove(x, y);
|
|
keyTechScrollBar.mouseMove(x, y);
|
|
keyTilesetScrollBar.mouseMove(x, y);
|
|
keyScenarioScrollBar.mouseMove(x, y);
|
|
}
|
|
|
|
if(keyMapScrollBar.getElementCount() !=0) {
|
|
for(int i = keyMapScrollBar.getVisibleStart(); i <= keyMapScrollBar.getVisibleEnd(); ++i) {
|
|
keyMapButtons[i]->mouseMove(x, y);
|
|
}
|
|
}
|
|
if(keyTechScrollBar.getElementCount() !=0) {
|
|
for(int i = keyTechScrollBar.getVisibleStart(); i <= keyTechScrollBar.getVisibleEnd(); ++i) {
|
|
keyTechButtons[i]->mouseMove(x, y);
|
|
}
|
|
}
|
|
if(keyTilesetScrollBar.getElementCount() !=0) {
|
|
for(int i = keyTilesetScrollBar.getVisibleStart(); i <= keyTilesetScrollBar.getVisibleEnd(); ++i) {
|
|
keyTilesetButtons[i]->mouseMove(x, y);
|
|
}
|
|
}
|
|
if(keyScenarioScrollBar.getElementCount() !=0) {
|
|
for(int i = keyScenarioScrollBar.getVisibleStart(); i <= keyScenarioScrollBar.getVisibleEnd(); ++i) {
|
|
keyScenarioButtons[i]->mouseMove(x, y);
|
|
}
|
|
}
|
|
}
|
|
|
|
void MenuStateMods::cleanupPreviewTexture() {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d] scenarioLogoTexture [%p]\n",__FILE__,__FUNCTION__,__LINE__,modPreviewImage);
|
|
|
|
if(modPreviewImage != NULL) {
|
|
Renderer::getInstance().endTexture(rsGlobal, modPreviewImage, false);
|
|
}
|
|
modPreviewImage = NULL;
|
|
}
|
|
|
|
void MenuStateMods::cleanupMapPreviewTexture() {
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
|
|
|
|
//printf("CLEANUP map preview texture\n");
|
|
if(mapPreviewTexture != NULL) {
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
|
|
|
|
mapPreviewTexture->end();
|
|
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
|
|
delete mapPreviewTexture;
|
|
mapPreviewTexture = NULL;
|
|
}
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
|
|
}
|
|
|
|
|
|
void MenuStateMods::render() {
|
|
try {
|
|
Renderer &renderer= Renderer::getInstance();
|
|
|
|
renderer.renderLine(&lineHorizontal);
|
|
renderer.renderLine(&lineVertical);
|
|
renderer.renderLine(&lineReturn);
|
|
renderer.renderLine(&lineVerticalReturn);
|
|
renderer.renderButton(&buttonReturn);
|
|
|
|
renderer.renderButton(&buttonInstallTech);
|
|
renderer.renderButton(&buttonRemoveTech);
|
|
renderer.renderButton(&buttonInstallTileset);
|
|
renderer.renderButton(&buttonRemoveTileset);
|
|
renderer.renderButton(&buttonInstallMap);
|
|
renderer.renderButton(&buttonRemoveMap);
|
|
renderer.renderButton(&buttonInstallScenario);
|
|
renderer.renderButton(&buttonRemoveScenario);
|
|
|
|
renderer.renderButton(&buttonInstalled);
|
|
renderer.renderButton(&buttonAvailable);
|
|
renderer.renderButton(&buttonConflict);
|
|
renderer.renderButton(&buttonOnlyLocal);
|
|
|
|
renderer.renderLabel(&modDescrLabel);
|
|
if(modInfoSelected!=NULL){
|
|
string tempImage = getPreviewImageFileForMod(modInfoSelected);
|
|
if(displayModPreviewImage.find(tempImage) != displayModPreviewImage.end() &&
|
|
displayModPreviewImage[tempImage] == true) {
|
|
if(modPreviewImage == NULL) {
|
|
string tempImage = getPreviewImageFileForMod(modInfoSelected);
|
|
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("### Render tempImage [%s] fileExists(tempImage) = %d\n",tempImage.c_str(),fileExists(tempImage));
|
|
|
|
if(tempImage != "" && fileExists(tempImage) == true) {
|
|
cleanupPreviewTexture();
|
|
modPreviewImage = Renderer::findTexture(tempImage);
|
|
}
|
|
}
|
|
if(modPreviewImage != NULL) {
|
|
renderer.renderTextureQuad(508,90,485,325,modPreviewImage,1.0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Render Tech List
|
|
renderer.renderLabel(&keyTechScrollBarTitle1);
|
|
renderer.renderLabel(&keyTechScrollBarTitle2);
|
|
if(keyTechScrollBar.getElementCount() != 0) {
|
|
for(int i = keyTechScrollBar.getVisibleStart();
|
|
i <= keyTechScrollBar.getVisibleEnd(); ++i) {
|
|
bool alreadyHasTech = (std::find(techTreeFiles.begin(),techTreeFiles.end(),keyTechButtons[i]->getText()) != techTreeFiles.end());
|
|
if(keyTechButtons[i]->getText() == selectedTechName) {
|
|
bool lightedOverride = true;
|
|
renderer.renderButton(keyTechButtons[i],&WHITE,&lightedOverride);
|
|
}
|
|
else if(alreadyHasTech == true) {
|
|
Vec4f buttonColor = WHITE;
|
|
buttonColor.w = 0.75f;
|
|
bool remoteHasTech = (techCacheList.find(keyTechButtons[i]->getText()) != techCacheList.end());
|
|
if(remoteHasTech)
|
|
{
|
|
ModInfo &modInfo = techCacheList[keyTechButtons[i]->getText()];
|
|
if( modInfo.crc==modInfo.localCRC) {
|
|
keyTechButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerInstalledTexture());
|
|
}
|
|
else {
|
|
//printf("modInfo.name=%s modInfo.crc=%s modInfo.localCRC=%s\n",modInfo.name.c_str(),modInfo.crc.c_str(),modInfo.localCRC.c_str());
|
|
keyTechButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerDifferentTexture());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
keyTechButtons[i]->setCustomTexture(CoreData::getInstance().getNotOnServerTexture());
|
|
}
|
|
renderer.renderButton(keyTechButtons[i],&buttonColor);
|
|
}
|
|
else {
|
|
Vec4f fontColor=Vec4f(200.0f/255.0f, 187.0f/255.0f, 190.0f/255.0f, 0.75f);
|
|
//Vec4f fontColor=Vec4f(1.0f, 0.0f, 0.0f, 0.75f);
|
|
keyTechButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerTexture());
|
|
renderer.renderButton(keyTechButtons[i],&fontColor);
|
|
}
|
|
renderer.renderLabel(labelsTech[i]);
|
|
}
|
|
}
|
|
renderer.renderScrollBar(&keyTechScrollBar);
|
|
|
|
// Render Tileset List
|
|
renderer.renderLabel(&keyTilesetScrollBarTitle1);
|
|
if(keyTilesetScrollBar.getElementCount() != 0) {
|
|
for(int i = keyTilesetScrollBar.getVisibleStart();
|
|
i <= keyTilesetScrollBar.getVisibleEnd(); ++i) {
|
|
bool alreadyHasTileset = (std::find(tilesetFiles.begin(),tilesetFiles.end(),keyTilesetButtons[i]->getText()) != tilesetFiles.end());
|
|
if(keyTilesetButtons[i]->getText() == selectedTilesetName) {
|
|
bool lightedOverride = true;
|
|
renderer.renderButton(keyTilesetButtons[i],&WHITE,&lightedOverride);
|
|
}
|
|
else if(alreadyHasTileset == true) {
|
|
Vec4f buttonColor = WHITE;
|
|
buttonColor.w = 0.75f;
|
|
bool remoteHasTileset= (tilesetCacheList.find(keyTilesetButtons[i]->getText()) != tilesetCacheList.end());
|
|
if(remoteHasTileset)
|
|
{
|
|
ModInfo &modInfo = tilesetCacheList[keyTilesetButtons[i]->getText()];
|
|
|
|
if( modInfo.crc==modInfo.localCRC) {
|
|
keyTilesetButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerInstalledTexture());
|
|
}
|
|
else {
|
|
//printf("modInfo.name=%s modInfo.crc=%s modInfo.localCRC=%s\n",modInfo.name.c_str(),modInfo.crc.c_str(),modInfo.localCRC.c_str());
|
|
//printf("name [%s] modInfo.crc [%s] modInfo.localCRC [%s]\n",modInfo.name.c_str(),modInfo.crc.c_str(),modInfo.localCRC.c_str());
|
|
|
|
keyTilesetButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerDifferentTexture());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
keyTilesetButtons[i]->setCustomTexture(CoreData::getInstance().getNotOnServerTexture());
|
|
}
|
|
renderer.renderButton(keyTilesetButtons[i],&buttonColor);
|
|
}
|
|
else {
|
|
Vec4f fontColor=Vec4f(200.0f/255.0f, 187.0f/255.0f, 190.0f/255.0f, 0.75f);
|
|
keyTilesetButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerTexture());
|
|
renderer.renderButton(keyTilesetButtons[i],&fontColor);
|
|
}
|
|
}
|
|
}
|
|
renderer.renderScrollBar(&keyTilesetScrollBar);
|
|
|
|
// Render Map list
|
|
renderer.renderLabel(&keyMapScrollBarTitle1);
|
|
renderer.renderLabel(&keyMapScrollBarTitle2);
|
|
if(keyMapScrollBar.getElementCount() != 0) {
|
|
for(int i = keyMapScrollBar.getVisibleStart();
|
|
i <= keyMapScrollBar.getVisibleEnd(); ++i) {
|
|
string mapNameToRender = keyMapButtons[i]->getText();
|
|
bool alreadyHasMap = (std::find(mapFiles.begin(),mapFiles.end(),mapNameToRender) != mapFiles.end());
|
|
if(keyMapButtons[i]->getText() == selectedMapName) {
|
|
bool lightedOverride = true;
|
|
renderer.renderButton(keyMapButtons[i],&WHITE,&lightedOverride);
|
|
}
|
|
else if(alreadyHasMap == true) {
|
|
Vec4f buttonColor = WHITE;
|
|
buttonColor.w = 0.75f;
|
|
bool remoteHasMap = (mapCacheList.find(keyMapButtons[i]->getText()) != mapCacheList.end());
|
|
if(remoteHasMap)
|
|
{
|
|
ModInfo &modInfo = mapCacheList[keyMapButtons[i]->getText()];
|
|
if( modInfo.crc==modInfo.localCRC) {
|
|
keyMapButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerInstalledTexture());
|
|
}
|
|
else {
|
|
//printf("modInfo.name=%s modInfo.crc=%s modInfo.localCRC=%s\n",modInfo.name.c_str(),modInfo.crc.c_str(),modInfo.localCRC.c_str());
|
|
keyMapButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerDifferentTexture());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
keyMapButtons[i]->setCustomTexture(CoreData::getInstance().getNotOnServerTexture());
|
|
}
|
|
renderer.renderButton(keyMapButtons[i],&buttonColor);
|
|
}
|
|
else {
|
|
Vec4f fontColor=Vec4f(200.0f/255.0f, 187.0f/255.0f, 190.0f/255.0f, 0.75f);
|
|
keyMapButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerTexture());
|
|
renderer.renderButton(keyMapButtons[i],&fontColor);
|
|
}
|
|
renderer.renderLabel(labelsMap[i]);
|
|
}
|
|
}
|
|
renderer.renderScrollBar(&keyMapScrollBar);
|
|
|
|
// Render Scenario List
|
|
renderer.renderLabel(&keyScenarioScrollBarTitle1);
|
|
if(keyScenarioScrollBar.getElementCount() != 0) {
|
|
for(int i = keyScenarioScrollBar.getVisibleStart();
|
|
i <= keyScenarioScrollBar.getVisibleEnd(); ++i) {
|
|
if(i >= (int)keyScenarioButtons.size()) {
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,"i >= keyScenarioButtons.size(), i = %d keyScenarioButtons.size() = %d",i,(int)keyScenarioButtons.size());
|
|
throw megaglest_runtime_error(szBuf);
|
|
}
|
|
bool alreadyHasScenario = (std::find(scenarioFiles.begin(),scenarioFiles.end(),keyScenarioButtons[i]->getText()) != scenarioFiles.end());
|
|
|
|
if(keyScenarioButtons[i]->getText() == selectedScenarioName) {
|
|
bool lightedOverride = true;
|
|
renderer.renderButton(keyScenarioButtons[i],&WHITE,&lightedOverride);
|
|
}
|
|
else if(alreadyHasScenario == true) {
|
|
Vec4f buttonColor = WHITE;
|
|
buttonColor.w = 0.75f;
|
|
bool remoteHasScenario= (scenarioCacheList.find(keyScenarioButtons[i]->getText()) != scenarioCacheList.end());
|
|
if(remoteHasScenario)
|
|
{
|
|
ModInfo &modInfo = scenarioCacheList[keyScenarioButtons[i]->getText()];
|
|
if( modInfo.crc==modInfo.localCRC) {
|
|
keyScenarioButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerInstalledTexture());
|
|
}
|
|
else {
|
|
//printf("modInfo.name=%s modInfo.crc=%s modInfo.localCRC=%s\n",modInfo.name.c_str(),modInfo.crc.c_str(),modInfo.localCRC.c_str());
|
|
keyScenarioButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerDifferentTexture());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
keyScenarioButtons[i]->setCustomTexture(CoreData::getInstance().getNotOnServerTexture());
|
|
}
|
|
renderer.renderButton(keyScenarioButtons[i],&buttonColor);
|
|
}
|
|
else {
|
|
Vec4f fontColor=Vec4f(200.0f/255.0f, 187.0f/255.0f, 190.0f/255.0f, 0.75f);
|
|
keyScenarioButtons[i]->setCustomTexture(CoreData::getInstance().getOnServerTexture());
|
|
renderer.renderButton(keyScenarioButtons[i],&fontColor);
|
|
}
|
|
}
|
|
}
|
|
renderer.renderScrollBar(&keyScenarioScrollBar);
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
if(fileFTPProgressList.empty() == false) {
|
|
Lang &lang= Lang::getInstance();
|
|
int xLocation = buttonReturn.getX();
|
|
int yLocation = buttonReturn.getY() - 12;
|
|
for(std::map<string,pair<int,string> >::iterator iterMap = fileFTPProgressList.begin();
|
|
iterMap != fileFTPProgressList.end(); ++iterMap) {
|
|
|
|
string progressLabelPrefix = lang.getString("ModDownloading") + " " + extractFileFromDirectoryPath(iterMap->first) + " ";
|
|
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf("\nRendering file progress with the following prefix [%s]\n",progressLabelPrefix.c_str());
|
|
|
|
if(Renderer::renderText3DEnabled) {
|
|
renderer.renderProgressBar3D(
|
|
iterMap->second.first,
|
|
//10,
|
|
//yLocation,
|
|
xLocation,
|
|
yLocation,
|
|
CoreData::getInstance().getDisplayFontSmall3D(),
|
|
185,progressLabelPrefix,false);
|
|
}
|
|
else {
|
|
renderer.renderProgressBar(
|
|
iterMap->second.first,
|
|
//10,
|
|
//yLocation,
|
|
xLocation,
|
|
yLocation,
|
|
CoreData::getInstance().getDisplayFontSmall(),
|
|
185,progressLabelPrefix,false);
|
|
}
|
|
|
|
yLocation -= 14;
|
|
}
|
|
}
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
|
|
renderer.renderConsole(&console,showFullConsole,true,3);
|
|
|
|
if(mainMessageBox.getEnabled()) {
|
|
renderer.renderMessageBox(&mainMessageBox);
|
|
}
|
|
|
|
if(modMenuState!=mmst_None) {
|
|
if(oldMenuState!=modMenuState)
|
|
{
|
|
Lang &lang= Lang::getInstance();
|
|
if(modMenuState== mmst_Loading){
|
|
pleaseWaitLabel.setText(lang.getString("GettingModlistFromMasterserver"));
|
|
}
|
|
else if(modMenuState== mmst_CalculatingCRC){
|
|
pleaseWaitLabel.setText(lang.getString("PleaseWaitCalculatingCRC"));
|
|
}
|
|
oldMenuState=modMenuState;
|
|
}
|
|
float anim= GraphicComponent::getAnim();
|
|
if(anim < 0.5f) {
|
|
anim = 1.f - anim;
|
|
}
|
|
Vec4f colorWithAlpha = Vec4f(ORANGE.x,ORANGE.y,ORANGE.z,anim);
|
|
renderer.renderLabel(&pleaseWaitLabel,&colorWithAlpha);
|
|
}
|
|
if(validMapPreview){
|
|
if(mapPreviewTexture != NULL) {
|
|
renderer.renderTextureQuad(5,185,150,150,mapPreviewTexture,1.0f);
|
|
}
|
|
if(enableMapPreview && (mapPreview.hasFileLoaded() == true)) {
|
|
|
|
int mouseX = mainMenu->getMouseX();
|
|
int mouseY = mainMenu->getMouseY();
|
|
int mouse2dAnim = mainMenu->getMouse2dAnim();
|
|
|
|
if(mapPreviewTexture == NULL) {
|
|
renderer.renderMouse2d(mouseX, mouseY, mouse2dAnim);
|
|
renderer.renderMapPreview(&mapPreview, true, 10, 350, &mapPreviewTexture);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
catch(const std::exception &ex) {
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,"In [%s::%s %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what());
|
|
SystemFlags::OutputDebug(SystemFlags::debugError,szBuf);
|
|
throw megaglest_runtime_error(szBuf);
|
|
}
|
|
}
|
|
|
|
void MenuStateMods::update() {
|
|
Chrono chrono;
|
|
chrono.start();
|
|
|
|
//Lang &lang= Lang::getInstance();
|
|
|
|
// Tech List
|
|
if (keyTechScrollBar.getElementCount() != 0) {
|
|
for (int i = keyTechScrollBar.getVisibleStart();
|
|
i <= keyTechScrollBar.getVisibleEnd(); ++i) {
|
|
if(i >= (int)keyTechButtons.size()) {
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,"i >= keyTechButtons.size(), i = %d, keyTechButtons.size() = %d",i,(int)keyTechButtons.size());
|
|
throw megaglest_runtime_error(szBuf);
|
|
}
|
|
|
|
keyTechButtons[i]->setY(keyButtonsYBase - keyButtonsLineHeight * (i
|
|
- keyTechScrollBar.getVisibleStart()));
|
|
labelsTech[i]->setY(keyButtonsYBase - keyButtonsLineHeight * (i
|
|
- keyTechScrollBar.getVisibleStart()));
|
|
}
|
|
}
|
|
|
|
// Tileset List
|
|
if (keyTilesetScrollBar.getElementCount() != 0) {
|
|
for (int i = keyTilesetScrollBar.getVisibleStart();
|
|
i <= keyTilesetScrollBar.getVisibleEnd(); ++i) {
|
|
if(i >= (int)keyTilesetButtons.size()) {
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,"i >= keyTilesetButtons.size(), i = %d, keyTilesetButtons.size() = %d",i,(int)keyTilesetButtons.size());
|
|
throw megaglest_runtime_error(szBuf);
|
|
}
|
|
|
|
int yPos = keyButtonsYBase - keyButtonsLineHeight *
|
|
(i - keyTilesetScrollBar.getVisibleStart());
|
|
keyTilesetButtons[i]->setY(yPos);
|
|
}
|
|
}
|
|
|
|
// Map List
|
|
if (keyMapScrollBar.getElementCount() != 0) {
|
|
for (int i = keyMapScrollBar.getVisibleStart();
|
|
i <= keyMapScrollBar.getVisibleEnd(); ++i) {
|
|
if(i >= (int)keyMapButtons.size()) {
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,"i >= keyMapButtons.size(), i = %d, keyMapButtons.size() = %d",i,(int)keyMapButtons.size());
|
|
throw megaglest_runtime_error(szBuf);
|
|
}
|
|
|
|
keyMapButtons[i]->setY(keyButtonsYBase - keyButtonsLineHeight * (i
|
|
- keyMapScrollBar.getVisibleStart()));
|
|
labelsMap[i]->setY(keyButtonsYBase - keyButtonsLineHeight * (i
|
|
- keyMapScrollBar.getVisibleStart()));
|
|
}
|
|
}
|
|
|
|
// Scenario List
|
|
if (keyScenarioScrollBar.getElementCount() != 0) {
|
|
for (int i = keyScenarioScrollBar.getVisibleStart();
|
|
i <= keyScenarioScrollBar.getVisibleEnd(); ++i) {
|
|
if(i >= (int)keyScenarioButtons.size()) {
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,"i >= keyScenarioButtons.size(), i = %d, keyScenarioButtons.size() = %d",i,(int)keyScenarioButtons.size());
|
|
throw megaglest_runtime_error(szBuf);
|
|
}
|
|
|
|
int yPos = keyButtonsYBase - keyButtonsLineHeight *
|
|
(i - keyScenarioScrollBar.getVisibleStart());
|
|
keyScenarioButtons[i]->setY(yPos);
|
|
}
|
|
}
|
|
|
|
console.update();
|
|
}
|
|
|
|
void MenuStateMods::keyDown(SDL_KeyboardEvent key) {
|
|
Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
|
|
//if(key == configKeys.getCharKey("ShowFullConsole")) {
|
|
if(isKeyPressed(configKeys.getSDLKey("ShowFullConsole"),key) == true) {
|
|
showFullConsole= true;
|
|
}
|
|
}
|
|
|
|
void MenuStateMods::keyPress(SDL_KeyboardEvent c) {
|
|
}
|
|
|
|
void MenuStateMods::keyUp(SDL_KeyboardEvent key) {
|
|
Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
|
|
//if(key== configKeys.getCharKey("ShowFullConsole")) {
|
|
if(isKeyPressed(configKeys.getSDLKey("ShowFullConsole"),key) == true) {
|
|
showFullConsole= false;
|
|
}
|
|
}
|
|
|
|
void MenuStateMods::showMessageBox(const string &text, const string &header, bool toggle) {
|
|
if(toggle == false) {
|
|
mainMessageBox.setEnabled(false);
|
|
}
|
|
|
|
if(mainMessageBox.getEnabled() == false) {
|
|
mainMessageBox.setText(text);
|
|
mainMessageBox.setHeader(header);
|
|
mainMessageBox.setEnabled(true);
|
|
}
|
|
else{
|
|
mainMessageBox.setEnabled(false);
|
|
}
|
|
}
|
|
|
|
void MenuStateMods::FTPClient_CallbackEvent(string itemName,
|
|
FTP_Client_CallbackType type, pair<FTP_Client_ResultType,string> result,void *userdata) {
|
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
|
|
Lang &lang= Lang::getInstance();
|
|
if(type == ftp_cct_DownloadProgress) {
|
|
FTPClientCallbackInterface::FtpProgressStats *stats = (FTPClientCallbackInterface::FtpProgressStats *)userdata;
|
|
if(stats != NULL) {
|
|
int fileProgress = 0;
|
|
if(stats->download_total > 0) {
|
|
fileProgress = ((stats->download_now / stats->download_total) * 100.0);
|
|
}
|
|
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Got FTP Callback for [%s] current file [%s] fileProgress = %d [now = %f, total = %f]\n",itemName.c_str(),stats->currentFilename.c_str(), fileProgress,stats->download_now,stats->download_total);
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
pair<int,string> lastProgress = fileFTPProgressList[itemName];
|
|
fileFTPProgressList[itemName] = pair<int,string>(fileProgress,stats->currentFilename);
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
}
|
|
}
|
|
else if(type == ftp_cct_ExtractProgress) {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Got FTP extract Callback for [%s] result = %d [%s]\n",itemName.c_str(),result.first,result.second.c_str());
|
|
//printf("Got FTP extract Callback for [%s] result = %d [%s]\n",itemName.c_str(),result.first,result.second.c_str());
|
|
|
|
if(userdata == NULL) {
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("DataMissingExtractDownloadMod").c_str(),itemName.c_str());
|
|
//printf("%s\n",szBuf);
|
|
console.addLine(szBuf,true);
|
|
}
|
|
else {
|
|
char *szBuf = (char *)userdata;
|
|
//printf("%s\n",szBuf);
|
|
console.addLine(szBuf);
|
|
}
|
|
}
|
|
else if(type == ftp_cct_File) {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Got FTP Callback for [%s] result = %d [%s]\n",itemName.c_str(),result.first,result.second.c_str());
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList.erase(itemName);
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
|
|
//printf("### downloaded file [%s] result = %d\n",itemName.c_str(),result.first);
|
|
|
|
if(result.first == ftp_crt_SUCCESS) {
|
|
displayModPreviewImage[itemName] = true;
|
|
}
|
|
}
|
|
|
|
else if(type == ftp_cct_Map) {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Got FTP Callback for [%s] result = %d [%s]\n",itemName.c_str(),result.first,result.second.c_str());
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList.erase(itemName);
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
selectedMapName = "";
|
|
buttonInstallMap.setEnabled(true);
|
|
|
|
if(result.first == ftp_crt_SUCCESS) {
|
|
refreshMaps();
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModDownloadMapSuccess").c_str(),itemName.c_str());
|
|
console.addLine(szBuf,true);
|
|
}
|
|
else {
|
|
curl_version_info_data *curlVersion= curl_version_info(CURLVERSION_NOW);
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModDownloadMapFail").c_str(),itemName.c_str(),curlVersion->version,result.second.c_str());
|
|
console.addLine(szBuf,true);
|
|
}
|
|
}
|
|
else if(type == ftp_cct_Tileset) {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Got FTP Callback for [%s] result = %d [%s]\n",itemName.c_str(),result.first,result.second.c_str());
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList.erase(itemName);
|
|
safeMutexFTPProgress.ReleaseLock(true);
|
|
|
|
selectedTilesetName = "";
|
|
buttonInstallTileset.setEnabled(true);
|
|
|
|
if(result.first == ftp_crt_SUCCESS) {
|
|
refreshTilesets();
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModDownloadTilesetSuccess").c_str(),itemName.c_str());
|
|
console.addLine(szBuf,true);
|
|
// END
|
|
}
|
|
else {
|
|
curl_version_info_data *curlVersion= curl_version_info(CURLVERSION_NOW);
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModDownloadTilesetFail").c_str(),itemName.c_str(),curlVersion->version,result.second.c_str());
|
|
console.addLine(szBuf,true);
|
|
}
|
|
}
|
|
else if(type == ftp_cct_Techtree) {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Got FTP Callback for [%s] result = %d [%s]\n",itemName.c_str(),result.first,result.second.c_str());
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList.erase(itemName);
|
|
safeMutexFTPProgress.ReleaseLock(true);
|
|
|
|
selectedTechName = "";
|
|
buttonInstallTech.setEnabled(true);
|
|
|
|
if(result.first == ftp_crt_SUCCESS) {
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModDownloadTechSuccess").c_str(),itemName.c_str());
|
|
console.addLine(szBuf,true);
|
|
|
|
// START
|
|
// Clear the CRC Cache if it is populated
|
|
safeMutexFTPProgress.Lock();
|
|
Checksum::clearFileCache();
|
|
|
|
vector<string> paths = Config::getInstance().getPathListForType(ptTechs);
|
|
string pathSearchString = string("/") + itemName + string("/*");
|
|
const string filterFileExt = ".xml";
|
|
clearFolderTreeContentsCheckSum(paths, pathSearchString, filterFileExt);
|
|
clearFolderTreeContentsCheckSumList(paths, pathSearchString, filterFileExt);
|
|
|
|
// Refresh CRC
|
|
Config &config = Config::getInstance();
|
|
getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), string("/") + itemName + string("/*"), ".xml", NULL, true);
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
|
|
refreshTechs();
|
|
// END
|
|
}
|
|
else {
|
|
curl_version_info_data *curlVersion= curl_version_info(CURLVERSION_NOW);
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModDownloadTechFail").c_str(),itemName.c_str(),curlVersion->version,result.second.c_str());
|
|
console.addLine(szBuf,true);
|
|
}
|
|
}
|
|
else if(type == ftp_cct_Scenario) {
|
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Got FTP Callback for [%s] result = %d [%s]\n",itemName.c_str(),result.first,result.second.c_str());
|
|
|
|
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
|
|
MutexSafeWrapper safeMutexFTPProgress((ftpClientThread != NULL ? ftpClientThread->getProgressMutex() : NULL),mutexOwnerId);
|
|
if(ftpClientThread != NULL && ftpClientThread->getProgressMutex() != NULL) ftpClientThread->getProgressMutex()->setOwnerId(mutexOwnerId);
|
|
fileFTPProgressList.erase(itemName);
|
|
safeMutexFTPProgress.ReleaseLock(true);
|
|
|
|
selectedScenarioName = "";
|
|
buttonInstallScenario.setEnabled(true);
|
|
|
|
if(result.first == ftp_crt_SUCCESS) {
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModDownloadScenarioSuccess").c_str(),itemName.c_str());
|
|
console.addLine(szBuf,true);
|
|
|
|
// START
|
|
// Clear the CRC Cache if it is populated
|
|
//
|
|
// Clear the CRC file Cache
|
|
safeMutexFTPProgress.Lock();
|
|
Checksum::clearFileCache();
|
|
|
|
vector<string> paths = Config::getInstance().getPathListForType(ptScenarios);
|
|
string pathSearchString = string("/") + itemName + string("/*");
|
|
const string filterFileExt = ".xml";
|
|
clearFolderTreeContentsCheckSum(paths, pathSearchString, filterFileExt);
|
|
clearFolderTreeContentsCheckSumList(paths, pathSearchString, filterFileExt);
|
|
|
|
// Refresh CRC
|
|
Config &config = Config::getInstance();
|
|
getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptScenarios,""), string("/") + itemName + string("/*"), ".xml", NULL, true);
|
|
safeMutexFTPProgress.ReleaseLock();
|
|
|
|
refreshScenarios();
|
|
// END
|
|
}
|
|
else {
|
|
curl_version_info_data *curlVersion= curl_version_info(CURLVERSION_NOW);
|
|
|
|
char szBuf[8096]="";
|
|
snprintf(szBuf,8096,lang.getString("ModDownloadScenarioFail").c_str(),itemName.c_str(),curlVersion->version,result.second.c_str());
|
|
console.addLine(szBuf,true);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}}//end namespace
|