2011-02-28 12:59:32 -05:00
/* XChat-WDK
* Copyright ( c ) 2010 - 2011 Berke Viktor .
*
2011-11-28 20:04:08 -05:00
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
2011-08-11 02:12:35 -04:00
*
2011-11-28 20:04:08 -05:00
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
2011-02-28 12:59:32 -05:00
*/
# include <windows.h>
# include <wininet.h>
# include "xchat-plugin.h"
static xchat_plugin * ph ; /* plugin handle */
2011-12-01 19:05:59 -05:00
static const char name [ ] = " Update Checker " ;
static const char desc [ ] = " Check for XChat-WDK updates automatically " ;
static const char version [ ] = " 2.0 " ;
2011-02-28 12:59:32 -05:00
2011-11-27 05:17:22 -05: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 12:59:32 -05: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 08: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 12:59:32 -05: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-25 15:44:08 -05:00
static int
2011-02-28 12:59:32 -05: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 05:17:22 -05:00
update_available = 0 ;
2011-02-28 12:59:32 -05:00
}
else if ( strcmp ( version , " Unknown " ) = = 0 )
{
xchat_printf ( ph , " Unable to check for XChat-WDK updates! \n " ) ;
2011-11-27 05:17:22 -05:00
update_available = 0 ;
2011-02-28 12:59:32 -05:00
}
else
{
2011-11-22 20:57:45 -05: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 05:17:22 -05:00
update_available = 1 ;
2011-02-28 12:59:32 -05:00
}
2011-11-27 05:17:22 -05:00
return XCHAT_EAT_XCHAT ;
2011-02-28 12:59:32 -05:00
}
2011-11-25 15:44:08 -05: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 12:59:32 -05:00
int
xchat_plugin_init ( xchat_plugin * plugin_handle , char * * plugin_name , char * * plugin_desc , char * * plugin_version , char * arg )
{
ph = plugin_handle ;
2011-12-01 19:05:59 -05:00
* plugin_name = name ;
* plugin_desc = desc ;
* plugin_version = version ;
2011-02-28 12:59:32 -05: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-12-01 19:05:59 -05:00
xchat_printf ( ph , " %s plugin loaded \n " , name ) ;
2011-11-25 15:44:08 -05:00
/* only start the timer if there's no update available during startup */
2011-11-27 05:17:22 -05:00
if ( ! update_available )
2011-11-25 15:44:08 -05:00
{
/* check for updates every 6 hours */
xchat_hook_timer ( ph , 21600000 , print_version_quiet , NULL ) ;
}
2011-02-28 12:59:32 -05:00
return 1 ; /* return 1 for success */
}
int
xchat_plugin_deinit ( void )
{
xchat_command ( ph , " MENU DEL \" Help/Check for updates \" " ) ;
2011-12-01 19:05:59 -05:00
xchat_printf ( ph , " %s plugin unloaded \n " , name ) ;
2011-02-28 12:59:32 -05:00
return 1 ;
}