Autoupdater asks for permission to update + Autoupdater fixes

This commit is contained in:
def 2014-05-17 14:28:50 +02:00
parent ba9259bfdf
commit 42811dc896
8 changed files with 127 additions and 64 deletions

View file

@ -13,6 +13,7 @@ class IAutoUpdate : public IInterface
MACRO_INTERFACE("autoupdate", 0) MACRO_INTERFACE("autoupdate", 0)
public: public:
virtual void CheckUpdates(CMenus *pMenus) = 0; virtual void CheckUpdates(CMenus *pMenus) = 0;
virtual void DoUpdates(CMenus *pMenus) = 0;
virtual bool Updated() = 0; virtual bool Updated() = 0;
virtual bool NeedResetClient() = 0; virtual bool NeedResetClient() = 0;
virtual void ExecuteExit() = 0; virtual void ExecuteExit() = 0;

View file

@ -53,6 +53,7 @@ void CAutoUpdate::Reset()
m_NeedUpdate = false; m_NeedUpdate = false;
m_NeedUpdateBackground = false; m_NeedUpdateBackground = false;
m_NeedUpdateClient = false; m_NeedUpdateClient = false;
m_NeedUpdateServer = false;
m_NeedResetClient = false; m_NeedResetClient = false;
m_Updated = false; m_Updated = false;
m_vFiles.clear(); m_vFiles.clear();
@ -112,8 +113,6 @@ void CAutoUpdate::ExecuteExit()
void CAutoUpdate::CheckUpdates(CMenus *pMenus) void CAutoUpdate::CheckUpdates(CMenus *pMenus)
{ {
char aReadBuf[512]; char aReadBuf[512];
char aBuf[512];
dbg_msg("autoupdate", "Checking for updates"); dbg_msg("autoupdate", "Checking for updates");
if (!GetFile("ddnet.upd", "ddnet.upd")) if (!GetFile("ddnet.upd", "ddnet.upd"))
{ {
@ -123,6 +122,55 @@ void CAutoUpdate::CheckUpdates(CMenus *pMenus)
dbg_msg("autoupdate", "Processing data"); dbg_msg("autoupdate", "Processing data");
Reset();
IOHANDLE updFile = io_open("ddnet.upd", IOFLAG_READ);
if (!updFile)
return;
//read data
std::string ReadData;
char last_version[15];
char cmd;
while (io_read(updFile, aReadBuf, sizeof(aReadBuf)) > 0)
{
for (size_t i=0; i<sizeof(aReadBuf); i++)
{
if (aReadBuf[i]=='\n')
{
if (i>0 && aReadBuf[i-1] == '\r')
ReadData = ReadData.substr(0, -2);
//Parse Command
cmd = ReadData[0];
if (cmd == '#')
{
str_copy(last_version, ReadData.substr(1).c_str(), sizeof(last_version));
if (ReadData.substr(1).compare(GAME_RELEASE_VERSION) != 0)
pMenus->setPopup(CMenus::POPUP_AUTOUPDATE);
else
dbg_msg("autoupdate", "Version match");
io_close(updFile);
return;
}
ReadData.clear();
}
ReadData+=aReadBuf[i];
}
}
io_close(updFile);
}
void CAutoUpdate::DoUpdates(CMenus *pMenus)
{
char aReadBuf[512];
char aBuf[512];
dbg_msg("autoupdate", "Processing data");
Reset(); Reset();
IOHANDLE updFile = io_open("ddnet.upd", IOFLAG_READ); IOHANDLE updFile = io_open("ddnet.upd", IOFLAG_READ);
if (!updFile) if (!updFile)
@ -152,7 +200,7 @@ void CAutoUpdate::CheckUpdates(CMenus *pMenus)
else else
{ {
dbg_msg("autoupdate", "Version match"); dbg_msg("autoupdate", "Version match");
break; goto finish;
} }
str_copy(current_version, ReadData.substr(1).c_str(), sizeof(current_version)); str_copy(current_version, ReadData.substr(1).c_str(), sizeof(current_version));
@ -179,13 +227,12 @@ void CAutoUpdate::CheckUpdates(CMenus *pMenus)
#endif #endif
dbg_msg("autoupdate", "Error downloading new version"); dbg_msg("autoupdate", "Error downloading new version");
} }
if (ReadData.substr(2).compare("UPDATE_SERVER") == 0) if (!m_NeedUpdateServer && ReadData.substr(2).compare("UPDATE_SERVER") == 0)
{ {
str_format(aBuf, sizeof(aBuf), "Updating DDNet Server to %s", last_version); str_format(aBuf, sizeof(aBuf), "Updating DDNet Server to %s", last_version);
pMenus->RenderUpdating(aBuf); pMenus->RenderUpdating(aBuf);
m_NeedUpdateClient = true; m_NeedUpdateServer = true;
m_NeedResetClient = true;
dbg_msg("autoupdate", "Updating server"); dbg_msg("autoupdate", "Updating server");
#if defined(CONF_FAMILY_WINDOWS) #if defined(CONF_FAMILY_WINDOWS)
if (!GetFile("DDNet-Server.exe", "DDNet-Server.exe")) if (!GetFile("DDNet-Server.exe", "DDNet-Server.exe"))
@ -245,7 +292,8 @@ void CAutoUpdate::CheckUpdates(CMenus *pMenus)
if (!m_NeedUpdate) if (!m_NeedUpdate)
break; break;
} }
finish:
if (m_NeedUpdate) if (m_NeedUpdate)
{ {
m_Updated = true; m_Updated = true;
@ -260,7 +308,25 @@ void CAutoUpdate::CheckUpdates(CMenus *pMenus)
dbg_msg("autoupdate", "No updates available"); dbg_msg("autoupdate", "No updates available");
io_close(updFile); io_close(updFile);
remove("ddnet.upd");
if (m_Updated)
{
if (m_NeedUpdateClient)
{
pMenus->setPopup(CMenus::POPUP_QUIT);
return;
}
str_format(aBuf, sizeof(aBuf), "DDNet Client updated successfully");
pMenus->RenderUpdating(aBuf);
thread_sleep(200);
}
else
{
str_format(aBuf, sizeof(aBuf), "No update available");
pMenus->RenderUpdating(aBuf);
thread_sleep(200);
}
} }
bool CAutoUpdate::GetFile(const char *pFile, const char *dst) bool CAutoUpdate::GetFile(const char *pFile, const char *dst)

View file

@ -17,6 +17,7 @@ public:
void Reset(); void Reset();
void CheckUpdates(CMenus *pMenus); void CheckUpdates(CMenus *pMenus);
void DoUpdates(CMenus *pMenus);
bool Updated() { return m_Updated; } bool Updated() { return m_Updated; }
bool NeedResetClient() { return m_NeedResetClient; } bool NeedResetClient() { return m_NeedResetClient; }
void ExecuteExit(); void ExecuteExit();
@ -26,6 +27,7 @@ private:
bool m_NeedUpdate; bool m_NeedUpdate;
bool m_NeedUpdateBackground; bool m_NeedUpdateBackground;
bool m_NeedUpdateClient; bool m_NeedUpdateClient;
bool m_NeedUpdateServer;
bool m_NeedResetClient; bool m_NeedResetClient;
std::list<std::string> m_vFiles; std::list<std::string> m_vFiles;

View file

@ -18,6 +18,7 @@
#include <engine/serverbrowser.h> #include <engine/serverbrowser.h>
#include <engine/storage.h> #include <engine/storage.h>
#include <engine/textrender.h> #include <engine/textrender.h>
#include <engine/autoupdate.h>
#include <engine/shared/config.h> #include <engine/shared/config.h>
#include <game/version.h> #include <game/version.h>
@ -954,6 +955,12 @@ int CMenus::Render()
pButtonText = Localize("Ok"); pButtonText = Localize("Ok");
ExtraAlign = -1; ExtraAlign = -1;
} }
else if(m_Popup == POPUP_AUTOUPDATE)
{
pTitle = Localize("Auto-Update");
pExtraText = Localize("An update to DDNet client is available. Do you want to update now? This may restart the client. If an update fails, make sure the client has permissions to modify files.");
ExtraAlign = -1;
}
CUIRect Box, Part; CUIRect Box, Part;
Box = Screen; Box = Screen;
@ -1005,6 +1012,26 @@ int CMenus::Render()
if(DoButton_Menu(&s_ButtonTryAgain, Localize("Yes"), 0, &Yes) || m_EnterPressed) if(DoButton_Menu(&s_ButtonTryAgain, Localize("Yes"), 0, &Yes) || m_EnterPressed)
Client()->Quit(); Client()->Quit();
} }
else if(m_Popup == POPUP_AUTOUPDATE)
{
CUIRect Yes, No;
Box.HSplitBottom(20.f, &Box, &Part);
Box.HSplitBottom(24.f, &Box, &Part);
// buttons
Part.VMargin(80.0f, &Part);
Part.VSplitMid(&No, &Yes);
Yes.VMargin(20.0f, &Yes);
No.VMargin(20.0f, &No);
static int s_ButtonAbort = 0;
if(DoButton_Menu(&s_ButtonAbort, Localize("No"), 0, &No) || m_EscapePressed)
m_Popup = POPUP_NONE;
static int s_ButtonTryAgain = 0;
if(DoButton_Menu(&s_ButtonTryAgain, Localize("Yes"), 0, &Yes) || m_EnterPressed)
m_pClient->AutoUpdate()->DoUpdates(this);
}
else if(m_Popup == POPUP_PASSWORD) else if(m_Popup == POPUP_PASSWORD)
{ {
CUIRect Label, TextBox, TryAgain, Abort; CUIRect Label, TextBox, TryAgain, Abort;

View file

@ -92,24 +92,6 @@ class CMenus : public CComponent
//static void demolist_listdir_callback(const char *name, int is_dir, void *user); //static void demolist_listdir_callback(const char *name, int is_dir, void *user);
//static void demolist_list_callback(const CUIRect *rect, int index, void *user); //static void demolist_list_callback(const CUIRect *rect, int index, void *user);
enum
{
POPUP_NONE=0,
POPUP_FIRST_LAUNCH,
POPUP_CONNECTING,
POPUP_MESSAGE,
POPUP_DISCONNECTED,
POPUP_PURE,
POPUP_LANGUAGE,
POPUP_COUNTRY,
POPUP_DELETE_DEMO,
POPUP_RENAME_DEMO,
POPUP_REMOVE_FRIEND,
POPUP_SOUNDERROR,
POPUP_PASSWORD,
POPUP_QUIT,
};
enum enum
{ {
PAGE_NEWS=1, PAGE_NEWS=1,
@ -325,6 +307,26 @@ public:
CGhostItem *m_OwnGhost; CGhostItem *m_OwnGhost;
int m_DDRacePage; int m_DDRacePage;
void GhostlistPopulate(); void GhostlistPopulate();
void setPopup(int Popup) { m_Popup = Popup; }
enum
{
POPUP_NONE=0,
POPUP_FIRST_LAUNCH,
POPUP_CONNECTING,
POPUP_MESSAGE,
POPUP_DISCONNECTED,
POPUP_PURE,
POPUP_LANGUAGE,
POPUP_COUNTRY,
POPUP_DELETE_DEMO,
POPUP_RENAME_DEMO,
POPUP_REMOVE_FRIEND,
POPUP_SOUNDERROR,
POPUP_PASSWORD,
POPUP_QUIT,
POPUP_AUTOUPDATE
};
private: private:

View file

@ -1358,23 +1358,6 @@ void CMenus::RenderSettingsDDRace(CUIRect MainView)
str_format(aBuf, sizeof(aBuf), "Checking for an update"); str_format(aBuf, sizeof(aBuf), "Checking for an update");
RenderUpdating(aBuf); RenderUpdating(aBuf);
AutoUpdate()->CheckUpdates(this); AutoUpdate()->CheckUpdates(this);
if (AutoUpdate()->Updated())
{
if (AutoUpdate()->NeedResetClient())
{
Client()->Quit();
return;
}
else
str_format(aBuf, sizeof(aBuf), "DDNet Client updated");
RenderUpdating(aBuf);
}
else
{
str_format(aBuf, sizeof(aBuf), "No update available");
RenderUpdating(aBuf);
}
} }
#endif #endif
} }

View file

@ -294,24 +294,6 @@ void CGameClient::OnInit()
str_format(aBuf, sizeof(aBuf), "Checking for updates"); str_format(aBuf, sizeof(aBuf), "Checking for updates");
g_GameClient.m_pMenus->RenderUpdating(aBuf); g_GameClient.m_pMenus->RenderUpdating(aBuf);
AutoUpdate()->CheckUpdates(m_pMenus); AutoUpdate()->CheckUpdates(m_pMenus);
if (AutoUpdate()->Updated())
{
if (AutoUpdate()->NeedResetClient())
{
Client()->Quit();
return;
}
else
{
str_format(aBuf, sizeof(aBuf), "DDNet Client updated successfully");
g_GameClient.m_pMenus->RenderUpdating(aBuf);
}
}
else
{
str_format(aBuf, sizeof(aBuf), "No updates available");
g_GameClient.m_pMenus->RenderUpdating(aBuf);
}
} }
#endif #endif

View file

@ -3,8 +3,8 @@
#ifndef GAME_VERSION_H #ifndef GAME_VERSION_H
#define GAME_VERSION_H #define GAME_VERSION_H
#include "generated/nethash.cpp" #include "generated/nethash.cpp"
#define GAME_VERSION "0.6.2, 3.9" #define GAME_VERSION "0.6.2, 3.8"
#define GAME_NETVERSION "0.6 626fce9a778df4d4" #define GAME_NETVERSION "0.6 626fce9a778df4d4"
static const char GAME_RELEASE_VERSION[8] = "3.9"; static const char GAME_RELEASE_VERSION[8] = "3.8";
#define CLIENT_VERSIONNR 309 #define CLIENT_VERSIONNR 308
#endif #endif