summary refs log tree commit diff stats
path: root/plugins
diff options
context:
space:
mode:
authorTingPing <tingping@fedoraproject.org>2014-07-29 18:48:56 -0400
committerTingPing <tingping@fedoraproject.org>2015-02-12 19:11:46 -0500
commitb6877ccf5c7676a7b7c64797d38cf8833692e1ae (patch)
treedad866544853a7d2c494350d3f1f6a500157270a /plugins
parent7063406d6caf42f61d87e42db6ce46df9e64ffef (diff)
win32: Use WinSparkle for handling updates
Fixes #1282
Diffstat (limited to 'plugins')
-rw-r--r--plugins/upd/upd.c236
-rw-r--r--plugins/upd/upd.vcxproj14
2 files changed, 20 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 <windows.h>
-#include <wininet.h>
-
-#include <glib.h>
+#include <winsparkle.h>
 
 #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 int
-print_version (char *word[], char *word_eol[], void *userdata)
-{
-	char *version;
-	int prevbuf;
-	int convbuf;
-
-	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 char version[] = "5.0";
+static const char upd_help[] = "Update Checker Usage:\n  /UPDCHK, check for HexChat updates\n";
 
 static int
-delayed_check (void *userdata)
+check_cmd (char *word[], char *word_eol[], void *userdata)
 {
-	int freq = hexchat_pluginpref_get_int (ph, "freq");
+	win_sparkle_check_update_with_ui ();
 
-	/* 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);
-	}
-
-	if (hexchat_pluginpref_get_int (ph, "freq") == -1)
-	{
-		hexchat_pluginpref_set_int (ph, "freq", DEFAULT_FREQ);
-	}
+	win_sparkle_set_appcast_url (APPCAST_URL);
+	win_sparkle_init ();
 
-	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 @@
   </PropertyGroup>

   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

     <ClCompile>

-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;UPD_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>..\..\src\common;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;UPD_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>..\..\src\common;$(WinSparklePath);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ClCompile>

     <Link>

       <ModuleDefinitionFile>upd.def</ModuleDefinitionFile>

-      <AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>

-      <AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

+      <AdditionalDependencies>$(DepLibs);WinSparkle.lib;%(AdditionalDependencies)</AdditionalDependencies>

+      <AdditionalLibraryDirectories>$(DepsRoot)\lib;$(WinSparklePath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

     </Link>

   </ItemDefinitionGroup>

   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

     <ClCompile>

       <PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;UPD_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>..\..\src\common;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <AdditionalIncludeDirectories>..\..\src\common;$(WinSparklePath);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

     </ClCompile>

     <Link>

       <ModuleDefinitionFile>upd.def</ModuleDefinitionFile>

-      <AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>

-      <AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

+      <AdditionalDependencies>$(DepLibs);WinSparkle.lib;%(AdditionalDependencies)</AdditionalDependencies>

+      <AdditionalLibraryDirectories>$(DepsRoot)\lib;$(WinSparklePath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

     </Link>

   </ItemDefinitionGroup>

   <ItemGroup>