Skip to content

Commit

Permalink
support alternate update servers, and optional changelogs
Browse files Browse the repository at this point in the history
  • Loading branch information
jacob1 committed Sep 26, 2015
1 parent cf5ec57 commit 908f60d
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 59 deletions.
118 changes: 74 additions & 44 deletions src/client/Client.cpp
Expand Up @@ -70,6 +70,8 @@ void writeUserPreferences(const char * prefData);
Client::Client():
messageOfTheDay(""),
versionCheckRequest(NULL),
alternateVersionCheckRequest(NULL),
usingAltUpdateServer(false),
updateAvailable(false),
authUser(0, "")
{
Expand Down Expand Up @@ -135,7 +137,6 @@ Client::Client():

void Client::Initialise(std::string proxyString)
{

if(GetPrefBool("version.update", false)==true)
{
SetPref("version.update", false);
Expand Down Expand Up @@ -175,6 +176,12 @@ void Client::Initialise(std::string proxyString)
delete[] id;
delete[] session;
}

#ifdef UPDATESERVER
// use an alternate update server
alternateVersionCheckRequest = http_async_req_start(NULL, "http://" UPDATESERVER "/Startup.json", NULL, 0, 0);
usingAltUpdateServer = true;
#endif
}

bool Client::IsFirstRun()
Expand Down Expand Up @@ -737,14 +744,26 @@ void Client::Tick()
{
//Check thumbnail queue
RequestBroker::Ref().FlushThumbQueue();
if (versionCheckRequest)
{
if (CheckUpdate(versionCheckRequest, true))
versionCheckRequest = NULL;
}
if (alternateVersionCheckRequest)
{
if (CheckUpdate(alternateVersionCheckRequest, false))
alternateVersionCheckRequest = NULL;
}
}

bool Client::CheckUpdate(void *updateRequest, bool checkSession)
{
//Check status on version check request
if (versionCheckRequest && http_async_req_status(versionCheckRequest))
if (http_async_req_status(updateRequest))
{
int status;
int dataLength;
char * data = http_async_req_stop(versionCheckRequest, &status, &dataLength);
versionCheckRequest = NULL;
char * data = http_async_req_stop(updateRequest, &status, &dataLength);

if (status != 200)
{
Expand All @@ -760,10 +779,13 @@ void Client::Tick()
json::Reader::Read(objDocument, dataStream);

//Check session
json::Boolean sessionStatus = objDocument["Session"];
if(!sessionStatus.Value())
if (checkSession)
{
SetAuthUser(User(0, ""));
json::Boolean sessionStatus = objDocument["Session"];
if(!sessionStatus.Value())
{
SetAuthUser(User(0, ""));
}
}

//Notifications from server
Expand All @@ -779,55 +801,61 @@ void Client::Tick()


//MOTD
json::String messageOfTheDay = objDocument["MessageOfTheDay"];
this->messageOfTheDay = messageOfTheDay.Value();
notifyMessageOfTheDay();
if (!usingAltUpdateServer || !checkSession)
{
json::String messageOfTheDay = objDocument["MessageOfTheDay"];
this->messageOfTheDay = messageOfTheDay.Value();
notifyMessageOfTheDay();

#ifndef IGNORE_UPDATES
//Check for updates
json::Object versions = objDocument["Updates"];
//Check for updates
json::Object versions = objDocument["Updates"];
#if !defined(BETA) && !defined(SNAPSHOT)
json::Object stableVersion = versions["Stable"];
json::Number stableMajor = stableVersion["Major"];
json::Number stableMinor = stableVersion["Minor"];
json::Number stableBuild = stableVersion["Build"];
json::String stableFile = stableVersion["File"];
if (stableMajor.Value()>SAVE_VERSION || (stableMinor.Value()>MINOR_VERSION && stableMajor.Value()==SAVE_VERSION) || stableBuild.Value()>BUILD_NUM)
{
updateAvailable = true;
updateInfo = UpdateInfo(stableMajor.Value(), stableMinor.Value(), stableBuild.Value(), stableFile.Value(), UpdateInfo::Stable);
}
json::Object stableVersion = versions["Stable"];
json::Number stableMajor = stableVersion["Major"];
json::Number stableMinor = stableVersion["Minor"];
json::Number stableBuild = stableVersion["Build"];
json::String stableFile = stableVersion["File"];
json::String changelog = stableVersion["Changelog"];
if (stableMajor.Value()>SAVE_VERSION || (stableMinor.Value()>MINOR_VERSION && stableMajor.Value()==SAVE_VERSION) || stableBuild.Value()>BUILD_NUM)
{
updateAvailable = true;
updateInfo = UpdateInfo(stableMajor.Value(), stableMinor.Value(), stableBuild.Value(), stableFile.Value(), changelog.Value(), UpdateInfo::Stable);
}
#endif

#ifdef BETA
json::Object betaVersion = versions["Beta"];
json::Number betaMajor = betaVersion["Major"];
json::Number betaMinor = betaVersion["Minor"];
json::Number betaBuild = betaVersion["Build"];
json::String betaFile = betaVersion["File"];
if (betaMajor.Value()>SAVE_VERSION || (betaMinor.Value()>MINOR_VERSION && betaMajor.Value()==SAVE_VERSION) || betaBuild.Value()>BUILD_NUM)
{
updateAvailable = true;
updateInfo = UpdateInfo(betaMajor.Value(), betaMinor.Value(), betaBuild.Value(), betaFile.Value(), UpdateInfo::Beta);
}
json::Object betaVersion = versions["Beta"];
json::Number betaMajor = betaVersion["Major"];
json::Number betaMinor = betaVersion["Minor"];
json::Number betaBuild = betaVersion["Build"];
json::String betaFile = betaVersion["File"];
json::String changelog = stableVersion["Changelog"];
if (betaMajor.Value()>SAVE_VERSION || (betaMinor.Value()>MINOR_VERSION && betaMajor.Value()==SAVE_VERSION) || betaBuild.Value()>BUILD_NUM)
{
updateAvailable = true;
updateInfo = UpdateInfo(betaMajor.Value(), betaMinor.Value(), betaBuild.Value(), betaFile.Value(), changelog.Value(), UpdateInfo::Beta);
}
#endif

#ifdef SNAPSHOT
json::Object snapshotVersion = versions["Snapshot"];
json::Number snapshotSnapshot = snapshotVersion["Snapshot"];
json::String snapshotFile = snapshotVersion["File"];
if (snapshotSnapshot.Value() > SNAPSHOT_ID)
{
updateAvailable = true;
updateInfo = UpdateInfo(snapshotSnapshot.Value(), snapshotFile.Value(), UpdateInfo::Snapshot);
}
json::Object snapshotVersion = versions["Snapshot"];
json::Number snapshotSnapshot = snapshotVersion["Snapshot"];
json::String snapshotFile = snapshotVersion["File"];
json::String changelog = stableVersion["Changelog"];
if (snapshotSnapshot.Value() > SNAPSHOT_ID)
{
updateAvailable = true;
updateInfo = UpdateInfo(snapshotSnapshot.Value(), snapshotFile.Value(), changelog.Value(), UpdateInfo::Snapshot);
}
#endif

if(updateAvailable)
{
notifyUpdateAvailable();
}
if(updateAvailable)
{
notifyUpdateAvailable();
}
#endif
}
}
catch (json::Exception &e)
{
Expand All @@ -836,7 +864,9 @@ void Client::Tick()

free(data);
}
return true;
}
return false;
}

UpdateInfo Client::GetUpdateInfo()
Expand Down
10 changes: 7 additions & 3 deletions src/client/Client.h
Expand Up @@ -35,14 +35,15 @@ class UpdateInfo
public:
enum BuildType { Stable, Beta, Snapshot };
std::string File;
std::string Changelog;
int Major;
int Minor;
int Build;
int Time;
BuildType Type;
UpdateInfo() : File(""), Major(0), Minor(0), Build(0), Time(0), Type(Stable) {}
UpdateInfo(int major, int minor, int build, std::string file, BuildType type) : File(file), Major(major), Minor(minor), Build(build), Time(0), Type(type) {}
UpdateInfo(int time, std::string file, BuildType type) : File(file), Major(0), Minor(0), Build(0), Time(time), Type(type) {}
UpdateInfo() : File(""), Changelog(""), Major(0), Minor(0), Build(0), Time(0), Type(Stable) {}
UpdateInfo(int major, int minor, int build, std::string file, std::string changelog, BuildType type) : File(file), Changelog(changelog), Major(major), Minor(minor), Build(build), Time(0), Type(type) {}
UpdateInfo(int time, std::string file, std::string changelog, BuildType type) : File(file), Changelog(changelog), Major(0), Minor(0), Build(0), Time(time), Type(type) {}
};

class RequestListener;
Expand All @@ -53,6 +54,8 @@ class Client: public Singleton<Client> {
std::vector<std::pair<std::string, std::string> > serverNotifications;

void * versionCheckRequest;
void * alternateVersionCheckRequest;
bool usingAltUpdateServer;
bool updateAvailable;
UpdateInfo updateInfo;

Expand Down Expand Up @@ -165,6 +168,7 @@ class Client: public Singleton<Client> {
}
RequestStatus ParseServerReturn(char *result, int status, bool json);
void Tick();
bool CheckUpdate(void *updateRequest, bool checkSession);
void Shutdown();

//Force flushing preferences to file on disk.
Expand Down
28 changes: 17 additions & 11 deletions src/gui/game/GameController.cpp
Expand Up @@ -1531,24 +1531,30 @@ void GameController::NotifyUpdateAvailable(Client * sender)

virtual void Action()
{
std::string currentVersion, newVersion;
UpdateInfo info = Client::Ref().GetUpdateInfo();
std::stringstream updateMessage;
updateMessage << "Are you sure you want to run the updater? Please save any changes before updating.\n\nCurrent version:\n ";

#ifdef BETA
currentVersion = MTOS(SAVE_VERSION) "." MTOS(MINOR_VERSION) " Beta, Build " MTOS(BUILD_NUM);
updateMessage << SAVE_VERSION << "." << MINOR_VERSION << " Beta, Build " << BUILD_NUM;
#elif defined(SNAPSHOT)
currentVersion = "Snapshot " MTOS(SNAPSHOT_ID);
updateMessage << "Snapshot " << SNAPSHOT_ID;
#else
currentVersion = MTOS(SAVE_VERSION) "." MTOS(MINOR_VERSION) " Stable, Build " MTOS(BUILD_NUM);
updateMessage << SAVE_VERSION << "." << MINOR_VERSION << " Stable, Build " << BUILD_NUM;
#endif

UpdateInfo info = Client::Ref().GetUpdateInfo();
if(info.Type == UpdateInfo::Beta)
newVersion = format::NumberToString<int>(info.Major) + " " + format::NumberToString<int>(info.Minor) + " Beta, Build " + format::NumberToString<int>(info.Build);
else if(info.Type == UpdateInfo::Snapshot)
newVersion = "Snapshot " + format::NumberToString<int>(info.Time);
updateMessage << "\nNew version:\n ";
if (info.Type == UpdateInfo::Beta)
updateMessage << info.Major << " " << info.Minor << " Beta, Build " << info.Build;
else if (info.Type == UpdateInfo::Snapshot)
updateMessage << "Snapshot " << info.Time;
else if(info.Type == UpdateInfo::Stable)
newVersion = format::NumberToString<int>(info.Major) + " " + format::NumberToString<int>(info.Minor) + " Stable, Build " + format::NumberToString<int>(info.Build);
updateMessage << info.Major << " " << info.Minor << " Stable, Build " << info.Build;

if (info.Changelog.length())
updateMessage << "\n\nChangelog:\n" << info.Changelog;

new ConfirmPrompt("Run Updater", "Are you sure you want to run the updater, please save any changes before updating.\n\nCurrent version:\n " + currentVersion + "\nNew version:\n " + newVersion, new UpdateConfirmation(c));
new ConfirmPrompt("Run Updater", updateMessage.str(), new UpdateConfirmation(c));
}
};

Expand Down
12 changes: 11 additions & 1 deletion src/gui/update/UpdateActivity.cpp
Expand Up @@ -44,7 +44,7 @@ class UpdateDownloadTask : public Task
{
free(data);
errorStream << "Server responded with Status " << status;
notifyError("Could not download update");
notifyError("Could not download update: " + errorStream.str());
return false;
}
if (!data)
Expand Down Expand Up @@ -118,7 +118,11 @@ class UpdateDownloadTask : public Task

UpdateActivity::UpdateActivity() {
std::stringstream file;
#ifdef UPDATESERVER
file << "http://" << UPDATESERVER << Client::Ref().GetUpdateInfo().File;
#else
file << "http://" << SERVER << Client::Ref().GetUpdateInfo().File;
#endif
updateDownloadTask = new UpdateDownloadTask(file.str(), this);
updateWindow = new TaskWindow("Downloading update...", updateDownloadTask, true);
}
Expand Down Expand Up @@ -148,13 +152,19 @@ void UpdateActivity::NotifyError(Task * sender)
virtual void ConfirmCallback(ConfirmPrompt::DialogueResult result) {
if (result == ConfirmPrompt::ResultOkay)
{
#ifndef UPDATESERVER
Platform::OpenURI("http://powdertoy.co.uk/Download.html");
#endif
}
a->Exit();
}
virtual ~ErrorMessageCallback() { }
};
#ifdef UPDATESERVER
new ConfirmPrompt("Autoupdate failed", "Please go online to manually download a newer version.\nError: " + sender->GetError(), new ErrorMessageCallback(this));
#else
new ConfirmPrompt("Autoupdate failed", "Please visit the website to download a newer version.\nError: " + sender->GetError(), new ErrorMessageCallback(this));
#endif
}


Expand Down

0 comments on commit 908f60d

Please sign in to comment.