From b6877ccf5c7676a7b7c64797d38cf8833692e1ae Mon Sep 17 00:00:00 2001 From: TingPing Date: Tue, 29 Jul 2014 18:48:56 -0400 Subject: [PATCH] win32: Use WinSparkle for handling updates Fixes #1282 --- plugins/upd/upd.c | 236 ++------------------------------- plugins/upd/upd.vcxproj | 14 +- src/fe-gtk/hexchat.rc.tt | 1 + win32/copy/copy.vcxproj | 2 + win32/hexchat.props | 2 + win32/installer/hexchat.iss.tt | 1 + 6 files changed, 26 insertions(+), 230 deletions(-) diff --git a/plugins/upd/upd.c b/plugins/upd/upd.c index 6fcf3be9..c9011c04 100644 --- a/plugins/upd/upd.c +++ b/plugins/upd/upd.c @@ -20,260 +20,50 @@ * THE SOFTWARE. */ -#include -#include - -#include +#include #include "hexchat-plugin.h" -#define DEFAULT_DELAY 30 /* 30 seconds */ -#define DEFAULT_FREQ 360 /* 6 hours */ -#define DOWNLOAD_URL "http://dl.hexchat.net/hexchat" +#define APPCAST_URL "https://dl.hexchat.net/appcast.xml" static hexchat_plugin *ph; /* plugin handle */ static char name[] = "Update Checker"; static char desc[] = "Check for HexChat updates automatically"; -static char version[] = "4.0"; -static const char upd_help[] = "Update Checker Usage:\n /UPDCHK, check for HexChat updates\n /UPDCHK SET delay|freq, set startup delay or check frequency\n"; - -static char* -check_version () -{ - HINTERNET hOpen, hConnect, hResource; - - hOpen = InternetOpen (TEXT ("Update Checker"), - INTERNET_OPEN_TYPE_PRECONFIG, - NULL, - NULL, - 0); - if (!hOpen) - { - return "Unknown"; - } - - hConnect = InternetConnect (hOpen, - TEXT ("raw.github.com"), - INTERNET_DEFAULT_HTTPS_PORT, - NULL, - NULL, - INTERNET_SERVICE_HTTP, - 0, - 0); - if (!hConnect) - { - InternetCloseHandle (hOpen); - return "Unknown"; - } - - hResource = HttpOpenRequest (hConnect, - TEXT ("GET"), - TEXT ("/hexchat/hexchat/master/win32/version.txt"), - TEXT ("HTTP/1.0"), - NULL, - NULL, - INTERNET_FLAG_SECURE | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_AUTH, - 0); - if (!hResource) - { - InternetCloseHandle (hConnect); - InternetCloseHandle (hOpen); - return "Unknown"; - } - else - { - static char buffer[1024]; - char infobuffer[32]; - int statuscode; - - DWORD dwRead; - DWORD infolen = sizeof(infobuffer); - - HttpAddRequestHeaders (hResource, TEXT ("Connection: close\r\n"), -1L, HTTP_ADDREQ_FLAG_ADD); /* workaround for GC bug */ - HttpSendRequest (hResource, NULL, 0, NULL, 0); - - while (InternetReadFile (hResource, buffer, 1023, &dwRead)) - { - if (dwRead == 0) - { - break; - } - buffer[dwRead] = 0; - } - - HttpQueryInfo(hResource, - HTTP_QUERY_STATUS_CODE, - &infobuffer, - &infolen, - NULL); - - InternetCloseHandle (hResource); - InternetCloseHandle (hConnect); - InternetCloseHandle (hOpen); - - statuscode = atoi(infobuffer); - if (statuscode == 200) - return buffer; - else - return "Unknown"; - } -} +static char version[] = "5.0"; +static const char upd_help[] = "Update Checker Usage:\n /UPDCHK, check for HexChat updates\n"; static int -print_version (char *word[], char *word_eol[], void *userdata) +check_cmd (char *word[], char *word_eol[], void *userdata) { - char *version; - int prevbuf; - int convbuf; + win_sparkle_check_update_with_ui (); - if (!g_ascii_strcasecmp ("HELP", word[2])) - { - hexchat_printf (ph, "%s", upd_help); - return HEXCHAT_EAT_HEXCHAT; - } - else if (!g_ascii_strcasecmp ("SET", word[2])) - { - if (!g_ascii_strcasecmp ("", word_eol[4])) - { - hexchat_printf (ph, "%s\tEnter a value!\n", name); - return HEXCHAT_EAT_HEXCHAT; - } - if (!g_ascii_strcasecmp ("delay", word[3])) - { - convbuf = atoi (word[4]); /* don't use word_eol, numbers must not contain spaces */ - - if (convbuf > 0 && convbuf < INT_MAX) - { - prevbuf = hexchat_pluginpref_get_int (ph, "delay"); - hexchat_pluginpref_set_int (ph, "delay", convbuf); - hexchat_printf (ph, "%s\tUpdate check startup delay is set to %d seconds (from %d).\n", name, convbuf, prevbuf); - } - else - { - hexchat_printf (ph, "%s\tInvalid input!\n", name); - } - } - else if (!g_ascii_strcasecmp ("freq", word[3])) - { - convbuf = atoi (word[4]); /* don't use word_eol, numbers must not contain spaces */ - - if (convbuf > 0 && convbuf < INT_MAX) - { - prevbuf = hexchat_pluginpref_get_int (ph, "freq"); - hexchat_pluginpref_set_int (ph, "freq", convbuf); - hexchat_printf (ph, "%s\tUpdate check frequency is set to %d minutes (from %d).\n", name, convbuf, prevbuf); - } - else - { - hexchat_printf (ph, "%s\tInvalid input!\n", name); - } - } - else - { - hexchat_printf (ph, "%s\tInvalid variable name! Use 'delay' or 'freq'!\n", name); - return HEXCHAT_EAT_HEXCHAT; - } - - return HEXCHAT_EAT_HEXCHAT; - } - else if (!g_ascii_strcasecmp ("", word[2])) - { - version = check_version (); - - if (strcmp (version, hexchat_get_info (ph, "version")) == 0) - { - hexchat_printf (ph, "%s\tYou have the latest version of HexChat installed!\n", name); - } - else if (strcmp (version, "Unknown") == 0) - { - hexchat_printf (ph, "%s\tUnable to check for HexChat updates!\n", name); - } - else - { -#ifdef _WIN64 /* use this approach, the wProcessorArchitecture method always returns 0 (=x86) for some reason */ - hexchat_printf (ph, "%s:\tA HexChat update is available! You can download it from here:\n%s/HexChat%%20%s%%20x64.exe\n", name, DOWNLOAD_URL, version); -#else - hexchat_printf (ph, "%s:\tA HexChat update is available! You can download it from here:\n%s/HexChat%%20%s%%20x86.exe\n", name, DOWNLOAD_URL, version); -#endif - } - return HEXCHAT_EAT_HEXCHAT; - } - else - { - hexchat_printf (ph, "%s", upd_help); - return HEXCHAT_EAT_HEXCHAT; - } -} - -static int -print_version_quiet (void *userdata) -{ - char *version = check_version (); - - /* if it's not the current version AND not network error */ - if (!(strcmp (version, hexchat_get_info (ph, "version")) == 0) && !(strcmp (version, "Unknown") == 0)) - { -#ifdef _WIN64 /* use this approach, the wProcessorArchitecture method always returns 0 (=x86) for plugins for some reason */ - hexchat_printf (ph, "%s\tA HexChat update is available! You can download it from here:\n%s/HexChat%%20%s%%20x64.exe\n", name, DOWNLOAD_URL, version); -#else - hexchat_printf (ph, "%s\tA HexChat update is available! You can download it from here:\n%s/HexChat%%20%s%%20x86.exe\n", name, DOWNLOAD_URL, version); -#endif - /* print update url once, then stop the timer */ - return 0; - } - /* keep checking */ - return 1; -} - -static int -delayed_check (void *userdata) -{ - int freq = hexchat_pluginpref_get_int (ph, "freq"); - - /* only start the timer if there's no update available during startup */ - if (print_version_quiet (NULL)) - { - /* check for updates, every 6 hours by default */ - hexchat_hook_timer (ph, freq * 1000 * 60, print_version_quiet, NULL); - } - - return 0; /* run delayed_check() only once */ + return HEXCHAT_EAT_ALL; } int hexchat_plugin_init (hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg) { - int delay; ph = plugin_handle; *plugin_name = name; *plugin_desc = desc; *plugin_version = version; - /* these are required for the very first run */ - delay = hexchat_pluginpref_get_int (ph, "delay"); - if (delay == -1) - { - delay = DEFAULT_DELAY; - hexchat_pluginpref_set_int (ph, "delay", DEFAULT_DELAY); - } + win_sparkle_set_appcast_url (APPCAST_URL); + win_sparkle_init (); - if (hexchat_pluginpref_get_int (ph, "freq") == -1) - { - hexchat_pluginpref_set_int (ph, "freq", DEFAULT_FREQ); - } - - hexchat_hook_command (ph, "UPDCHK", HEXCHAT_PRI_NORM, print_version, upd_help, NULL); - hexchat_hook_timer (ph, delay * 1000, delayed_check, NULL); + hexchat_hook_command (ph, "UPDCHK", HEXCHAT_PRI_NORM, check_cmd, upd_help, NULL); hexchat_command (ph, "MENU -ishare\\download.png ADD \"Help/Check for Updates\" \"UPDCHK\""); hexchat_printf (ph, "%s plugin loaded\n", name); - return 1; /* return 1 for success */ + return 1; } int hexchat_plugin_deinit (void) { + win_sparkle_cleanup (); + hexchat_command (ph, "MENU DEL \"Help/Check for updates\""); hexchat_printf (ph, "%s plugin unloaded\n", name); return 1; diff --git a/plugins/upd/upd.vcxproj b/plugins/upd/upd.vcxproj index 0a9a980e..e39a2887 100644 --- a/plugins/upd/upd.vcxproj +++ b/plugins/upd/upd.vcxproj @@ -29,24 +29,24 @@ - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPD_EXPORTS;%(PreprocessorDefinitions) - ..\..\src\common;$(Glib);%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;UPD_EXPORTS;%(PreprocessorDefinitions) + ..\..\src\common;$(WinSparklePath);%(AdditionalIncludeDirectories) upd.def - $(DepLibs);%(AdditionalDependencies) - $(DepsRoot)\lib;%(AdditionalLibraryDirectories) + $(DepLibs);WinSparkle.lib;%(AdditionalDependencies) + $(DepsRoot)\lib;$(WinSparklePath);%(AdditionalLibraryDirectories) WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;UPD_EXPORTS;%(PreprocessorDefinitions) - ..\..\src\common;$(Glib);%(AdditionalIncludeDirectories) + ..\..\src\common;$(WinSparklePath);%(AdditionalIncludeDirectories) upd.def - $(DepLibs);%(AdditionalDependencies) - $(DepsRoot)\lib;%(AdditionalLibraryDirectories) + $(DepLibs);WinSparkle.lib;%(AdditionalDependencies) + $(DepsRoot)\lib;$(WinSparklePath);%(AdditionalLibraryDirectories) diff --git a/src/fe-gtk/hexchat.rc.tt b/src/fe-gtk/hexchat.rc.tt index d4f554b2..35b0e6aa 100644 --- a/src/fe-gtk/hexchat.rc.tt +++ b/src/fe-gtk/hexchat.rc.tt @@ -15,6 +15,7 @@ VS_VERSION_INFO VERSIONINFO BEGIN VALUE "FileDescription", "HexChat IRC Client" + VALUE "CompanyName", "HexChat" VALUE "ProductName", "HexChat" VALUE "ProductVersion", PACKAGE_VERSION VALUE "FileVersion", PACKAGE_VERSION diff --git a/win32/copy/copy.vcxproj b/win32/copy/copy.vcxproj index a0c0a39d..557ca702 100644 --- a/win32/copy/copy.vcxproj +++ b/win32/copy/copy.vcxproj @@ -51,6 +51,7 @@ + @@ -72,6 +73,7 @@ + diff --git a/win32/hexchat.props b/win32/hexchat.props index 8d0a71c6..e35378cb 100644 --- a/win32/hexchat.props +++ b/win32/hexchat.props @@ -10,6 +10,7 @@ c:\mozilla-build\perl-5.20 c:\mozilla-build\python-2.7 c:\mozilla-build\python-3.4 + c:\mozilla-build\WinSparkle @@ -19,6 +20,7 @@ $(YourDepsPath)\$(PlatformName) $(YourGendefPath) $(YourMsgfmtPath) + $(YourWinSparklePath)\$(PlatformName) $(YourPerlPath)\$(PlatformName) perl520 $(YourPython2Path)\$(PlatformName) diff --git a/win32/installer/hexchat.iss.tt b/win32/installer/hexchat.iss.tt index aa9be8a4..5ee9a0ae 100644 --- a/win32/installer/hexchat.iss.tt +++ b/win32/installer/hexchat.iss.tt @@ -162,6 +162,7 @@ Source: "share\music.png"; DestDir: "{app}\share"; Flags: ignoreversion; Compone Source: "plugins\hcmpcinfo.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\mpcinfo Source: "share\download.png"; DestDir: "{app}\share"; Flags: ignoreversion; Components: plugins\upd Source: "plugins\hcupd.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\upd +Source: "WinSparkle.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: plugins\upd Source: "plugins\hcwinamp.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\winamp Source: "share\system.png"; DestDir: "{app}\share"; Flags: ignoreversion; Components: plugins\sysinfo Source: "plugins\hcsysinfo.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\sysinfo