Added some threading for URL calls for new masterserver game play

This commit is contained in:
Mark Vejvoda 2010-05-13 06:43:56 +00:00
parent 55d7c6eebc
commit 57d0420b76
7 changed files with 134 additions and 55 deletions

View File

@ -53,6 +53,7 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b
Config &config = Config::getInstance();
needToSetChangedGameSettings = false;
needToRepublishToMasterserver = false;
lastSetChangedGameSettings = time(NULL);
lastMasterserverPublishing = time(NULL);
@ -211,6 +212,15 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b
//chatManager.init(&console, world.getThisTeamIndex());
chatManager.init(&console, -1);
publishToMasterserverThread = new SimpleTaskThread(this,0,100);
publishToMasterserverThread->start();
}
MenuStateCustomGame::~MenuStateCustomGame() {
BaseThread::shutdownAndWait(publishToMasterserverThread);
delete publishToMasterserverThread;
publishToMasterserverThread = NULL;
}
void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){
@ -223,6 +233,17 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
soundRenderer.playFx(coreData.getClickSoundA());
/*
if( listBoxPublishServer.getEditable() &&
listBoxPublishServer.getSelectedItemIndex() == 0) {
needToRepublishToMasterserver = true;
lastMasterserverPublishing = 0;
publishToMasterserver();
simpleTask();
}
*/
mainMenu->setState(new MenuStateNewGame(program, mainMenu));
}
else if(buttonPlayNow.mouseClick(x,y) && buttonPlayNow.getEnabled()) {
@ -253,6 +274,14 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){
bool bOkToStart = serverInterface->launchGame(&gameSettings);
if(bOkToStart == true)
{
if( listBoxPublishServer.getEditable() &&
listBoxPublishServer.getSelectedItemIndex() == 0) {
needToRepublishToMasterserver = true;
lastMasterserverPublishing = 0;
publishToMasterserver();
simpleTask();
}
program->setState(new Game(program, &gameSettings));
}
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
@ -264,38 +293,45 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){
labelMapInfo.setText(mapInfo.desc);
updateControlers();
updateNetworkSlots();
needToRepublishToMasterserver = true;
if(hasNetworkGameSettings() == true)
{
needToSetChangedGameSettings = true;
lastSetChangedGameSettings = time(NULL);;
lastSetChangedGameSettings = time(NULL);
}
}
else if (listBoxFogOfWar.mouseClick(x, y)) {
if(hasNetworkGameSettings() == true)
{
needToSetChangedGameSettings = true;
lastSetChangedGameSettings = time(NULL);;
}
}
else if(listBoxTileset.mouseClick(x, y)){
needToRepublishToMasterserver = true;
if(hasNetworkGameSettings() == true)
{
needToSetChangedGameSettings = true;
lastSetChangedGameSettings = time(NULL);;
lastSetChangedGameSettings = time(NULL);
}
}
else if(listBoxTileset.mouseClick(x, y)){
needToRepublishToMasterserver = true;
if(hasNetworkGameSettings() == true)
{
needToSetChangedGameSettings = true;
lastSetChangedGameSettings = time(NULL);
}
}
else if(listBoxTechTree.mouseClick(x, y)){
reloadFactions();
needToRepublishToMasterserver = true;
if(hasNetworkGameSettings() == true)
{
needToSetChangedGameSettings = true;
lastSetChangedGameSettings = time(NULL);;
lastSetChangedGameSettings = time(NULL);
}
}
else if(listBoxPublishServer.mouseClick(x, y)&&listBoxPublishServer.getEditable()){
needToRepublishToMasterserver = true;
soundRenderer.playFx(coreData.getClickSoundC());
}
else
@ -331,6 +367,7 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){
}
updateNetworkSlots();
needToRepublishToMasterserver = true;
if(hasNetworkGameSettings() == true)
{
needToSetChangedGameSettings = true;
@ -338,6 +375,7 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){
}
}
else if(listBoxFactions[i].mouseClick(x, y)){
needToRepublishToMasterserver = true;
if(hasNetworkGameSettings() == true)
{
@ -347,6 +385,8 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){
}
else if(listBoxTeams[i].mouseClick(x, y))
{
needToRepublishToMasterserver = true;
if(hasNetworkGameSettings() == true)
{
needToSetChangedGameSettings = true;
@ -606,15 +646,14 @@ void MenuStateCustomGame::update()
listBoxPublishServer.setSelectedItemIndex(1);
listBoxPublishServer.setEditable(false);
}
if(listBoxPublishServer.getEditable() && listBoxPublishServer.getSelectedItemIndex()==0 && (difftime(time(NULL),lastMasterserverPublishing) >= 15) ){
if(listBoxPublishServer.getEditable() &&
listBoxPublishServer.getSelectedItemIndex() == 0 &&
needToRepublishToMasterserver == true) {
// give it to me baby, aha aha ...
lastMasterserverPublishing = time(NULL);
publishToMasterserver();
}
if(difftime(time(NULL),lastSetChangedGameSettings) >= 2)
{
GameSettings gameSettings;
@ -651,14 +690,14 @@ void MenuStateCustomGame::publishToMasterserver()
GameSettings gameSettings;
loadGameSettings(&gameSettings);
string serverinfo="";
for(int i= 0; i<mapInfo.players; ++i)
for(int i= 0; i < mapInfo.players; ++i)
{
if(listBoxControls[i].getSelectedItemIndex() != ctClosed)
{
slotCountUsed++;
}
if(listBoxControls[i].getSelectedItemIndex() == ctNetwork)
{
slotCountHumans++;
@ -675,38 +714,36 @@ void MenuStateCustomGame::publishToMasterserver()
}
}
//?status=waiting&system=linux&info=titus
serverinfo+="glestVersion="+escapeURL(glestVersionString)+"&";
serverinfo+="platform="+escapeURL(getPlatformNameString())+"&";
serverinfo+="binaryCompileDate="+escapeURL(getCompileDateTime())+"&";
serverinfo += "glestVersion=" + SystemFlags::escapeURL(glestVersionString) + "&";
serverinfo += "platform=" + SystemFlags::escapeURL(getPlatformNameString()) + "&";
serverinfo += "binaryCompileDate=" + SystemFlags::escapeURL(getCompileDateTime()) + "&";
//game info:
serverinfo+="serverTitle="+escapeURL(Config::getInstance().getString("NetPlayerName")+"'s game")+"&";
serverinfo += "serverTitle=" + SystemFlags::escapeURL(Config::getInstance().getString("NetPlayerName") + "'s game") + "&";
//ip is automatically set
//game setup info:
serverinfo+="tech="+escapeURL(listBoxTechTree.getSelectedItem())+"&";
serverinfo+="map="+escapeURL(listBoxMap.getSelectedItem())+"&";
serverinfo+="tileset="+escapeURL(listBoxTileset.getSelectedItem())+"&";
serverinfo+="activeSlots="+intToStr(slotCountUsed)+"&";
serverinfo+="networkSlots="+intToStr(slotCountHumans)+"&";
serverinfo+="connectedClients="+intToStr(slotCountConnectedPlayers);
string request = Config::getInstance().getString("Masterserver")+"addServerInfo.php?"+serverinfo;
printf("the request is:\n%s\n",request.c_str());
std::string serverInfo = SystemFlags::getHTTP(request);
serverinfo += "tech=" + SystemFlags::escapeURL(listBoxTechTree.getSelectedItem()) + "&";
serverinfo += "map=" + SystemFlags::escapeURL(listBoxMap.getSelectedItem()) + "&";
serverinfo += "tileset=" + SystemFlags::escapeURL(listBoxTileset.getSelectedItem()) + "&";
serverinfo += "activeSlots=" + intToStr(slotCountUsed) + "&";
serverinfo += "networkSlots=" + intToStr(slotCountHumans) + "&";
serverinfo += "connectedClients=" + intToStr(slotCountConnectedPlayers);
publishToServerInfo = serverinfo;
}
string MenuStateCustomGame::escapeURL(string in)
{
char *escaped=curl_easy_escape(SystemFlags::curl_handle,in.c_str(),0);
if(escaped==NULL)
abort();
string out=escaped;
curl_free(escaped);
return out;
void MenuStateCustomGame::simpleTask() {
if( needToRepublishToMasterserver == true &&
difftime(time(NULL),lastMasterserverPublishing) >= 5) {
needToRepublishToMasterserver = false;
lastMasterserverPublishing = time(NULL);
string request = Config::getInstance().getString("Masterserver") + "addServerInfo.php?" + publishToServerInfo;
printf("the request is:\n%s\n",request.c_str());
std::string serverInfo = SystemFlags::getHTTP(request);
}
}
void MenuStateCustomGame::loadGameSettings(GameSettings *gameSettings)

View File

@ -14,6 +14,7 @@
#include "main_menu.h"
#include "chat_manager.h"
#include "simple_threads.h"
namespace Glest{ namespace Game{
@ -21,7 +22,7 @@ namespace Glest{ namespace Game{
// class MenuStateCustomGame
// ===============================
class MenuStateCustomGame: public MenuState{
class MenuStateCustomGame : public MenuState, public SimpleTaskCallbackInterface {
private:
GraphicButton buttonReturn;
GraphicButton buttonPlayNow;
@ -54,12 +55,16 @@ private:
bool needToSetChangedGameSettings;
time_t lastSetChangedGameSettings;
time_t lastMasterserverPublishing;
bool needToRepublishToMasterserver;
string publishToServerInfo;
SimpleTaskThread *publishToMasterserverThread;
Console console;
ChatManager chatManager;
public:
MenuStateCustomGame(Program *program, MainMenu *mainMenu, bool openNetworkSlots= false);
~MenuStateCustomGame();
void mouseClick(int x, int y, MouseButton mouseButton);
void mouseMove(int x, int y, const MouseState *mouseState);
@ -69,6 +74,8 @@ public:
virtual void keyDown(char key);
virtual void keyPress(char c);
virtual void simpleTask();
private:
bool hasNetworkGameSettings();
@ -79,7 +86,6 @@ private:
void closeUnusedSlots();
void updateNetworkSlots();
void publishToMasterserver();
string escapeURL(string in);
};
}}//end namespace

View File

@ -142,7 +142,11 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen
NetworkManager::getInstance().end();
NetworkManager::getInstance().init(nrClient);
updateServerInfo();
//updateServerInfo();
needUpdateFromServer = true;
updateFromMasterserverThread = new SimpleTaskThread(this,0,100);
updateFromMasterserverThread->start();
}
MenuStateMasterserver::~MenuStateMasterserver() {
@ -174,7 +178,8 @@ void MenuStateMasterserver::mouseClick(int x, int y, MouseButton mouseButton){
}
else if(buttonRefresh.mouseClick(x, y)){
soundRenderer.playFx(coreData.getClickSoundB());
updateServerInfo();
//updateServerInfo();
needUpdateFromServer = true;
}
else if(buttonReturn.mouseClick(x, y)){
soundRenderer.playFx(coreData.getClickSoundB());
@ -222,7 +227,14 @@ void MenuStateMasterserver::render(){
void MenuStateMasterserver::update(){
}
void MenuStateMasterserver::simpleTask() {
if(needUpdateFromServer == true) {
updateServerInfo();
}
}
void MenuStateMasterserver::updateServerInfo() {
needUpdateFromServer = false;
//MasterServerInfos masterServerInfos;
clearServerLines();

View File

@ -14,6 +14,7 @@
#include "main_menu.h"
#include "masterserver_info.h"
#include "simple_threads.h"
namespace Glest{ namespace Game{
@ -63,7 +64,7 @@ public:
typedef vector<ServerLine*> ServerLines;
typedef vector<MasterServerInfo*> MasterServerInfos;
class MenuStateMasterserver: public MenuState{
class MenuStateMasterserver : public MenuState, public SimpleTaskCallbackInterface {
private:
GraphicButton buttonRefresh;
GraphicButton buttonReturn;
@ -73,6 +74,8 @@ private:
GraphicMessageBox mainMessageBox;
int mainMessageBoxState;
bool needUpdateFromServer;
SimpleTaskThread *updateFromMasterserverThread;
public:
MenuStateMasterserver(Program *program, MainMenu *mainMenu);
@ -83,6 +86,8 @@ public:
void update();
void render();
virtual void simpleTask();
private:
void showMessageBox(const string &text, const string &header, bool toggle);
void connectToServer(string ipString);

View File

@ -348,11 +348,17 @@ void ConnectionSlot::update(bool checkForNewClients)
}
default:
{
//throw runtime_error("Unexpected message in connection slot: " + intToStr(networkMessageType));
string sErr = "Unexpected message in connection slot: " + intToStr(networkMessageType);
//sendTextMessage(sErr,-1);
DisplayErrorMessage(sErr);
return;
if(gotIntro == true) {
//throw runtime_error("Unexpected message in connection slot: " + intToStr(networkMessageType));
string sErr = "Unexpected message in connection slot: " + intToStr(networkMessageType);
//sendTextMessage(sErr,-1);
DisplayErrorMessage(sErr);
return;
}
else {
SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] got invalid message type before intro, disconnecting socket.\n",__FILE__,__FUNCTION__,__LINE__);
close();
}
}
}

View File

@ -115,6 +115,7 @@ public:
static SystemFlagsType & getSystemSettingType(DebugType type) { return debugLogFileList[type]; }
static size_t httpWriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data);
static std::string getHTTP(std::string URL);
static std::string escapeURL(std::string URL);
// Let the macro call into this when require.. NEVER call it automatically.
static void handleDebug(DebugType type, const char *fmt, ...);

View File

@ -68,6 +68,18 @@ size_t SystemFlags::httpWriteMemoryCallback(void *ptr, size_t size, size_t nmemb
return realsize;
}
std::string SystemFlags::escapeURL(std::string URL)
{
string result = URL;
char *escaped=curl_easy_escape(SystemFlags::curl_handle,URL.c_str(),0);
if(escaped != NULL) {
result = escaped;
curl_free(escaped);
}
return result;
}
std::string SystemFlags::getHTTP(std::string URL) {
curl_easy_setopt(SystemFlags::curl_handle, CURLOPT_URL, URL.c_str());