GUI: Enable report button in unknown game dialog

This commit is contained in:
Thierry Crozat 2019-04-28 23:29:22 +01:00
parent c7126c9bc4
commit 623bef19a5
2 changed files with 35 additions and 39 deletions

View file

@ -53,19 +53,10 @@ UnknownGameDialog::UnknownGameDialog(const DetectionResults &detectionResults) :
} else } else
_copyToClipboardButton = nullptr; _copyToClipboardButton = nullptr;
#if 0
// Do not create the button for reporting the game directly to the bugtracker
// for now until we find a proper solution for the problem that a change
// to our bugtracker system might break the URL generation. A possible approach
// for solving this would be to have a ULR under the .scummvm.org (of the type
// https://www.scummvm.org/unknowngame?engine=Foo&description=Bar) that would
// redirect to whatever our bugtracker system is.
//Check if we have support for opening URLs //Check if we have support for opening URLs
if (g_system->hasFeature(OSystem::kFeatureOpenUrl)) { if (g_system->hasFeature(OSystem::kFeatureOpenUrl)) {
_openBugTrackerUrlButton = new ButtonWidget(this, 0, 0, 0, 0, _("Report game"), 0, kOpenBugtrackerURL); _openBugTrackerUrlButton = new ButtonWidget(this, 0, 0, 0, 0, _("Report game"), 0, kOpenBugtrackerURL);
} else } else
#endif
_openBugTrackerUrlButton = nullptr; _openBugTrackerUrlButton = nullptr;
// Use a ScrollContainer for the report in case we have a lot of lines. // Use a ScrollContainer for the report in case we have a lot of lines.
@ -107,13 +98,11 @@ void UnknownGameDialog::rebuild() {
reportTranslated += "\n"; reportTranslated += "\n";
reportTranslated += _("Use the button below to copy the required game information into your clipboard."); reportTranslated += _("Use the button below to copy the required game information into your clipboard.");
} }
#if 0
// Check if we have support for opening URLs and expand the reportTranslated message if needed... // Check if we have support for opening URLs and expand the reportTranslated message if needed...
if (g_system->hasFeature(OSystem::kFeatureOpenUrl)) { if (g_system->hasFeature(OSystem::kFeatureOpenUrl)) {
reportTranslated += "\n"; reportTranslated += "\n";
reportTranslated += _("You can also directly report your game to the Bug Tracker."); reportTranslated += _("You can also directly report your game to the Bug Tracker.");
} }
#endif
// We use a ScrollContainer to display the text, with a 2 * 8 pixels margin to the dialog border, // We use a ScrollContainer to display the text, with a 2 * 8 pixels margin to the dialog border,
// the scrollbar, and 2 * 10 margin for the text in the container. // the scrollbar, and 2 * 10 margin for the text in the container.
@ -167,44 +156,51 @@ void UnknownGameDialog::rebuild() {
} }
} }
void UnknownGameDialog::encodeUrlString(Common::String& string) { Common::String UnknownGameDialog::encodeUrlString(const Common::String& string) {
// First we need to replace the literal % Common::String encoded;
for (uint c = 0 ; c < string.size() ; ++c) { for (uint i = 0 ; i < string.size() ; ++i) {
if (string[c] == '%') { char c = string[i];
string.replace(c, 1, "%25"); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') ||
c += 2; c == '~' || c == '-' || c == '.' || c == '_')
} encoded += c;
} else
// Now replace some other characters that we may have but should not appear literally in the URL encoded += Common::String::format("%%%02X", c);
while (string.contains("\n")) {
Common::replace(string, "\n", "%0A");
}
while (string.contains(" ")) {
Common::replace(string, " ", "%20");
}
while (string.contains("&")) {
Common::replace(string, "&", "%26");
}
while (string.contains("/")) {
Common::replace(string, "/", "%2F");
} }
return encoded;
} }
Common::String UnknownGameDialog::generateBugtrackerURL() { Common::String UnknownGameDialog::generateBugtrackerURL() {
// TODO: Remove the filesystem path from the bugtracker report
Common::String report = _detectionResults.generateUnknownGameReport(false); Common::String report = _detectionResults.generateUnknownGameReport(false);
encodeUrlString(report); // Remove the filesystem path from the bugtracker report.
// The path is on the first line between single quotes. We strip everything except the last level.
int path_start = -1, path_size = 0;
for (int i = 0 ; i < report.size() ; ++i) {
char c = report[i];
if (c == '\'') {
if (path_start == -1)
path_start = i + 1;
else
break;
} else if (path_start != -1 && (c == '/' || c == '\\')) {
path_size = 1 + i - path_start;
} else if (c == '\n') {
path_size = 0;
break;
}
}
if (path_size > 0)
report.erase(path_start, path_size);
report = encodeUrlString(report);
// Pass engine name if there is only one. // Pass engine name if there is only one.
Common::String engineName; Common::String engineName = "unknown";
Common::StringArray engines = _detectionResults.getUnknownGameEngines(); Common::StringArray engines = _detectionResults.getUnknownGameEngines();
if (engines.size() == 1) { if (engines.size() == 1)
engineName = engines.front(); engineName = engines.front();
encodeUrlString(engineName); engineName = encodeUrlString(engineName);
}
return Common::String::format( return Common::String::format(
"https://bugs.scummvm.org/unknowngame?" "https://www.scummvm.org/unknowngame?"
"engine=%s" "engine=%s"
"&description=%s", "&description=%s",
engineName.c_str(), engineName.c_str(),

View file

@ -46,7 +46,7 @@ private:
void reflowLayout() override; void reflowLayout() override;
Common::String generateBugtrackerURL(); Common::String generateBugtrackerURL();
void encodeUrlString(Common::String&); Common::String encodeUrlString(const Common::String&);
const DetectionResults &_detectionResults; const DetectionResults &_detectionResults;
ScrollContainerWidget *_textContainer; ScrollContainerWidget *_textContainer;