2011-02-28 20:59:32 +03:00
/* XChat-WDK
* Copyright ( c ) 2010 - 2011 Berke Viktor .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
2011-08-11 10:12:35 +04:00
*
2011-02-28 20:59:32 +03:00
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR " AS IS " AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# include <windows.h>
# include <wininet.h>
# include "xchat-plugin.h"
static xchat_plugin * ph ; /* plugin handle */
2011-11-27 14:17:22 +04:00
/* we need this to store the result of the initial update check since the return value is preserved for XCHAT_EAT */
static int update_available ;
2011-02-28 20:59:32 +03:00
static char *
check_version ( )
{
HINTERNET hINet , hFile ;
hINet = InternetOpen ( " Update Checker " , INTERNET_OPEN_TYPE_PRECONFIG , NULL , NULL , 0 ) ;
if ( ! hINet )
{
return " Unknown " ;
}
2011-08-09 16:42:40 +04:00
hFile = InternetOpenUrl ( hINet , " http://xchat-wdk.googlecode.com/git/version.txt?r=wdk " , NULL , 0 , INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD , 0 ) ;
2011-02-28 20:59:32 +03:00
if ( hFile )
{
static char buffer [ 1024 ] ;
DWORD dwRead ;
while ( InternetReadFile ( hFile , buffer , 1023 , & dwRead ) )
{
if ( dwRead = = 0 )
{
break ;
}
buffer [ dwRead ] = 0 ;
}
InternetCloseHandle ( hFile ) ;
return buffer ;
}
InternetCloseHandle ( hINet ) ;
return " Unknown " ;
}
2011-11-26 00:44:08 +04:00
static int
2011-02-28 20:59:32 +03:00
print_version ( )
{
char * version = check_version ( ) ;
if ( strcmp ( version , xchat_get_info ( ph , " wdk_version " ) ) = = 0 )
{
xchat_printf ( ph , " You have the latest version of XChat-WDK installed! \n " ) ;
2011-11-27 14:17:22 +04:00
update_available = 0 ;
2011-02-28 20:59:32 +03:00
}
else if ( strcmp ( version , " Unknown " ) = = 0 )
{
xchat_printf ( ph , " Unable to check for XChat-WDK updates! \n " ) ;
2011-11-27 14:17:22 +04:00
update_available = 0 ;
2011-02-28 20:59:32 +03:00
}
else
{
2011-11-23 05:57:45 +04:00
# ifdef _WIN64 /* use this approach, the wProcessorArchitecture method always returns 0 (=x86) for some reason */
xchat_printf ( ph , " An XChat-WDK update is available! You can download it from here: \n http://xchat-wdk.googlecode.com/files/XChat-WDK%%20%s%%20x64.exe \n " , version ) ;
# else
xchat_printf ( ph , " An XChat-WDK update is available! You can download it from here: \n http://xchat-wdk.googlecode.com/files/XChat-WDK%%20%s%%20x86.exe \n " , version ) ;
# endif
2011-11-27 14:17:22 +04:00
update_available = 1 ;
2011-02-28 20:59:32 +03:00
}
2011-11-27 14:17:22 +04:00
return XCHAT_EAT_XCHAT ;
2011-02-28 20:59:32 +03:00
}
2011-11-26 00:44:08 +04:00
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 , xchat_get_info ( ph , " wdk_version " ) ) = = 0 ) & & ! ( strcmp ( version , " Unknown " ) = = 0 ) )
{
# ifdef _WIN64 /* use this approach, the wProcessorArchitecture method always returns 0 (=x86) for plugins for some reason */
xchat_printf ( ph , " An XChat-WDK update is available! You can download it from here: \n http://xchat-wdk.googlecode.com/files/XChat-WDK%%20%s%%20x64.exe \n " , version ) ;
# else
xchat_printf ( ph , " An XChat-WDK update is available! You can download it from here: \n http://xchat-wdk.googlecode.com/files/XChat-WDK%%20%s%%20x86.exe \n " , version ) ;
# endif
/* print update url once, then stop the timer */
return 0 ;
}
/* keep checking */
return 1 ;
}
2011-02-28 20:59:32 +03:00
int
xchat_plugin_init ( xchat_plugin * plugin_handle , char * * plugin_name , char * * plugin_desc , char * * plugin_version , char * arg )
{
ph = plugin_handle ;
* plugin_name = " Update Checker " ;
* plugin_desc = " Plugin for checking for XChat-WDK updates " ;
2011-11-26 00:44:08 +04:00
* plugin_version = " 2.0 " ;
2011-02-28 20:59:32 +03:00
xchat_hook_command ( ph , " UPDCHK " , XCHAT_PRI_NORM , print_version , 0 , 0 ) ;
xchat_command ( ph , " MENU -ietc \\ download.png ADD \" Help/Check for Updates \" \" UPDCHK \" " ) ;
2011-11-26 00:44:08 +04:00
xchat_printf ( ph , " %s plugin loaded \n " , * plugin_name ) ;
/* only start the timer if there's no update available during startup */
2011-11-27 14:17:22 +04:00
if ( ! update_available )
2011-11-26 00:44:08 +04:00
{
/* check for updates every 6 hours */
xchat_hook_timer ( ph , 21600000 , print_version_quiet , NULL ) ;
}
2011-02-28 20:59:32 +03:00
return 1 ; /* return 1 for success */
}
int
xchat_plugin_deinit ( void )
{
xchat_command ( ph , " MENU DEL \" Help/Check for updates \" " ) ;
xchat_print ( ph , " Update Checker plugin unloaded \n " ) ;
return 1 ;
}