2011-02-28 20:59:32 +03:00
/* XChat-WDK
* Copyright ( c ) 2010 - 2011 Berke Viktor .
*
2011-11-29 05:04:08 +04: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 10:12:35 +04:00
*
2011-11-29 05:04:08 +04: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 20:59:32 +03:00
*/
# include <windows.h>
# include <wininet.h>
# include "xchat-plugin.h"
static xchat_plugin * ph ; /* plugin handle */
2011-12-02 04:05:59 +04:00
static const char name [ ] = " Update Checker " ;
static const char desc [ ] = " Check for XChat-WDK updates automatically " ;
2012-02-04 20:41:02 +04:00
static const char version [ ] = " 2.1 " ;
2011-02-28 20:59:32 +03:00
static char *
check_version ( )
{
2012-02-09 00:52:27 +04:00
#if 0
2011-02-28 20:59:32 +03:00
HINTERNET hINet , hFile ;
hINet = InternetOpen ( " Update Checker " , INTERNET_OPEN_TYPE_PRECONFIG , NULL , NULL , 0 ) ;
2012-02-04 23:24:30 +04:00
2011-02-28 20:59:32 +03:00
if ( ! hINet )
{
return " Unknown " ;
}
2012-02-04 23:24:30 +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 ) ;
2012-02-04 23:24:30 +04:00
InternetCloseHandle ( hINet ) ;
2011-02-28 20:59:32 +03:00
return buffer ;
}
2012-02-04 23:24:30 +04:00
2011-02-28 20:59:32 +03:00
InternetCloseHandle ( hINet ) ;
return " Unknown " ;
2012-02-09 00:52:27 +04:00
# endif
2012-02-04 23:24:30 +04:00
/* Google Code's messing up with requests, use HTTP/1.0 as suggested. More info:
http : //code.google.com/p/support/issues/detail?id=6095
Of course it would be still too simple , coz IE will override settings , so
you have to disable HTTP / 1.1 manually and globally . More info :
http : //support.microsoft.com/kb/258425
So this code ' s basically useless since disabling HTTP / 1.1 will work with the
above code too .
2012-02-09 00:52:27 +04:00
Update : a Connection : close header seems to disable chunked encoding .
2012-02-04 23:24:30 +04:00
*/
2012-02-04 20:41:02 +04:00
HINTERNET hOpen , hConnect , hResource ;
2012-02-09 00:52:27 +04:00
hOpen = InternetOpen ( TEXT ( " Update Checker " ) ,
2012-02-04 20:41:02 +04:00
INTERNET_OPEN_TYPE_PRECONFIG ,
NULL ,
NULL ,
0 ) ;
if ( ! hOpen )
{
return " Unknown " ;
}
hConnect = InternetConnect ( hOpen ,
2012-02-09 00:52:27 +04:00
TEXT ( " xchat-wdk.googlecode.com " ) ,
2012-02-04 20:41:02 +04:00
INTERNET_INVALID_PORT_NUMBER ,
NULL ,
NULL ,
INTERNET_SERVICE_HTTP ,
0 ,
0 ) ;
if ( ! hConnect )
{
InternetCloseHandle ( hOpen ) ;
return " Unknown " ;
}
hResource = HttpOpenRequest ( hConnect ,
2012-02-09 00:52:27 +04:00
TEXT ( " GET " ) ,
TEXT ( " /git/version.txt?r=wdk " ) ,
TEXT ( " HTTP/1.0 " ) ,
2012-02-04 20:41:02 +04:00
NULL ,
NULL ,
INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_AUTH ,
0 ) ;
if ( ! hResource )
{
InternetCloseHandle ( hConnect ) ;
InternetCloseHandle ( hOpen ) ;
return " Unknown " ;
}
else
{
2012-02-09 00:52:27 +04:00
static char buffer [ 1024 ] ;
DWORD dwRead ;
HttpAddRequestHeaders ( hResource , TEXT ( " Connection: close \r \n " ) , - 1L , HTTP_ADDREQ_FLAG_ADD ) ; /* workaround for GC bug */
2012-02-04 20:41:02 +04:00
HttpSendRequest ( hResource , NULL , 0 , NULL , 0 ) ;
while ( InternetReadFile ( hResource , buffer , 1023 , & dwRead ) )
{
if ( dwRead = = 0 )
{
break ;
}
buffer [ dwRead ] = 0 ;
}
InternetCloseHandle ( hResource ) ;
InternetCloseHandle ( hConnect ) ;
InternetCloseHandle ( hOpen ) ;
return buffer ;
}
2011-02-28 20:59:32 +03:00
}
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 " ) ;
}
else if ( strcmp ( version , " Unknown " ) = = 0 )
{
xchat_printf ( ph , " Unable to check for XChat-WDK updates! \n " ) ;
}
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-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 ;
2011-12-02 04:05:59 +04:00
* plugin_name = name ;
* plugin_desc = desc ;
* plugin_version = version ;
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-12-02 04:05:59 +04:00
xchat_printf ( ph , " %s plugin loaded \n " , name ) ;
2011-11-26 00:44:08 +04:00
/* only start the timer if there's no update available during startup */
2011-12-02 15:21:33 +04:00
if ( print_version_quiet ( NULL ) )
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 \" " ) ;
2011-12-02 04:05:59 +04:00
xchat_printf ( ph , " %s plugin unloaded \n " , name ) ;
2011-02-28 20:59:32 +03:00
return 1 ;
}