diff options
Diffstat (limited to 'libmediafork/update.c')
-rw-r--r-- | libmediafork/update.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/libmediafork/update.c b/libmediafork/update.c new file mode 100644 index 000000000..c12204fcc --- /dev/null +++ b/libmediafork/update.c @@ -0,0 +1,157 @@ +/* $Id: update.c,v 1.7 2005/03/26 23:04:14 titer Exp $ + + This file is part of the HandBrake source code. + Homepage: <http://handbrake.m0k.org/>. + It may be used under the terms of the GNU General Public License. */ + +#include "mediafork.h" + +#define HB_URL "handbrake.m0k.org" +#define HB_QUERY "GET /LATEST HTTP/1.0\r\nHost: " HB_URL "\r\n\r\n" + +typedef struct +{ + int * build; + char * version; + +} hb_update_t; + +static void UpdateFunc( void * ); + +hb_thread_t * hb_update_init( int * build, char * version ) +{ + hb_update_t * data = calloc( sizeof( hb_update_t ), 1 ); + data->build = build; + data->version = version; + + return hb_thread_init( "update", UpdateFunc, data, + HB_NORMAL_PRIORITY ); +} + +static void UpdateFunc( void * _data ) +{ + hb_update_t * data = (hb_update_t *) _data; + + hb_net_t * net; + int ret; + char buf[1024]; + char * cur, * end, * p; + int size; + int stable, unstable; + char stable_str[16], unstable_str[16]; + int i; + + if( !( net = hb_net_open( HB_URL, 80 ) ) ) + { + goto error; + } + + if( hb_net_send( net, HB_QUERY ) < 0 ) + { + hb_net_close( &net ); + goto error; + } + + size = 0; + memset( buf, 0, 1024 ); + for( ;; ) + { + ret = hb_net_recv( net, &buf[size], sizeof( buf ) - size ); + if( ret < 1 ) + { + hb_net_close( &net ); + break; + } + size += ret; + } + + cur = buf; + end = &buf[sizeof( buf )]; + + /* Make sure we got it */ + cur += 9; + if( size < 15 || strncmp( cur, "200 OK", 6 ) ) + { + /* Something went wrong */ + goto error; + } + cur += 6; + + /* Find the end of the headers and the beginning of the content */ + for( ; &cur[3] < end; cur++ ) + { + if( cur[0] == '\r' && cur[1] == '\n' && + cur[2] == '\r' && cur[3] == '\n' ) + { + cur += 4; + break; + } + } + + if( cur >= end ) + { + goto error; + } + + stable = strtol( cur, &p, 10 ); + if( cur == p ) + { + goto error; + } + cur = p + 1; + memset( stable_str, 0, sizeof( stable_str ) ); + for( i = 0; + i < sizeof( stable_str ) - 1 && cur < end && *cur != '\n'; + i++, cur++ ) + { + stable_str[i] = *cur; + } + + hb_log( "latest stable: %s, build %d", stable_str, stable ); + + cur++; + if( cur >= end ) + { + goto error; + } + + unstable = strtol( cur, &p, 10 ); + if( cur == p ) + { + goto error; + } + cur = p + 1; + memset( unstable_str, 0, sizeof( unstable_str ) ); + for( i = 0; + i < sizeof( unstable_str ) - 1 && cur < end && *cur != '\n'; + i++, cur++ ) + { + unstable_str[i] = *cur; + } + + hb_log( "latest unstable: %s, build %d", unstable_str, unstable ); + + if( HB_BUILD % 100 ) + { + /* We are runnning an unstable build */ + if( unstable > HB_BUILD ) + { + memcpy( data->version, unstable_str, sizeof( unstable_str ) ); + *(data->build) = unstable; + } + } + else + { + /* We are runnning an stable build */ + if( stable > HB_BUILD ) + { + memcpy( data->version, stable_str, sizeof( stable_str ) ); + *(data->build) = stable; + } + } + +error: + free( data ); + return; +} + |