X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;ds=sidebyside;f=libhb%2Fupdate.c;h=9f725237bcfb55527396b4a5eee6186a0eec7407;hb=9972486f44c586225d98967441dcd3f3fd920636;hp=51019e26d091f916917561fc9133112d21a82503;hpb=a70ea1b495ab14915590b8cbd7867f80925f253a;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/update.c b/libhb/update.c index 51019e26..9f725237 100644 --- a/libhb/update.c +++ b/libhb/update.c @@ -7,7 +7,6 @@ #include "hb.h" static void UpdateFunc( void * ); -static int find_file( ); typedef struct { @@ -26,46 +25,62 @@ hb_thread_t * hb_update_init( int * build, char * version ) HB_NORMAL_PRIORITY ); } -/* - * Find out which appcast we want to use, and return appcast.xml or NULL - */ -static int find_file ( void ) -{ - return ( strstr( APPCAST_URL, "appcast.xml" ) != NULL ); -} static void UpdateFunc( void * _data ) { hb_update_t * data = (hb_update_t *) _data; - - /* New code to handle the hb_query stuff */ - int file = find_file(); - char* hb_query; - if (file != NULL) - { - hb_query = "GET /appcast.xml HTTP/1.0\r\nHost: handbrake.fr\r\n\r\n"; - }else { - hb_query = "GET /appcast_unstable.xml HTTP/1.0\r\nHost: handbrake.fr\r\n\r\n"; - } - - // ####################### Grab the data from the web server ########################## - hb_net_t * net; + + char* const url = HB_PROJECT_URL_APPCAST; + char* const urlz = url + strlen( HB_PROJECT_URL_APPCAST ); /* marks null-term */ + char url_host[64]; + char url_path[128]; + char query[256]; + + hb_net_t * net; int ret; char buf[4096]; char * cur, * end; int size; - int stable; - char stable_str[16]; + int i_vers; + char s_vers[32]; /* must be no larger than hb_handle_s.version */ int i; - if( !( net = hb_net_open( "handbrake.fr", 80 ) ) ) + /* Setup hb_query and hb_query_two with the correct appcast file */ + hb_log( "Using %s", url ); + + /* extract host part */ + cur = strstr( HB_PROJECT_URL_APPCAST, "//" ); + if( !cur || cur+2 > urlz ) + goto error; + cur += 2; + + end = strstr( cur, "/" ); + if( !end || end > urlz ) + goto error; + + memset( url_host, 0, sizeof(url_host) ); + strncpy( url_host, cur, (end-cur) ); + + /* extract path part */ + memset( url_path, 0, sizeof(url_path) ); + strncpy( url_path, end, (urlz-end) ); + + if( !strlen( url_path )) + goto error; + + memset( query, 0, sizeof(query) ); + snprintf( query, sizeof(query), "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", url_path, url_host ); + + /* Grab the data from the web server */ + if( !( net = hb_net_open( url_host, 80 ) ) ) { goto error; } - if( hb_net_send( net, hb_query ) < 0 ) + if( hb_net_send( net, query ) < 0 ) { + hb_log("Error: Unable to connect to server"); hb_net_close( &net ); goto error; } @@ -86,13 +101,11 @@ static void UpdateFunc( void * _data ) cur = buf; end = &buf[sizeof( buf )]; - - /* Make sure we got it */ cur += 9; if( size < 15 || strncmp( cur, "200 OK", 6 ) ) { - /* Something went wrong */ + hb_log("Error: We did not get a 200 OK from the server. \n"); goto error; } cur += 6; @@ -110,91 +123,93 @@ static void UpdateFunc( void * _data ) if( cur >= end ) { + hb_log("Error: Found the end of the buffer before the end of the HTTP header information! \n"); goto error; } - // ####################### Version Checking Here ########################## - - /* - * Find the tag - * Scan though each character of the buffer until we find that the first 4 characters of "cur" are " tag + * Scan though each character of the buffer until we find that the first 4 characters of "cur" are "' ) - { + { cur += 1; break; - - } + } - // If the CLI tag has not been found in the first 768 characters, or the end is reached, something bad happened. - if (( i > 768) || ( cur >= end )) - { - goto error; - } - } + /* If the CLI tag has not been found in the first 768 characters, or the end is reached, something bad happened.*/ + if (( i > 768) || ( cur >= end )) + { + hb_log("Error: Did not find the tag in the expected maximum amount of characters into the file. \n"); + goto error; + } + } - if( cur >= end ) + if( cur >= end ) { goto error; } - /* - * Ok, The above code didn't position cur, it only found = end ) + if( cur >= end ) { + hb_log("Error: Unexpected end of buffer! Could not find the build information. \n"); goto error; } - stable = strtol( cur, &cur, 10 ); - - if( cur >= end ) + /* Stable HB_PROJECT_BUILD */ + i_vers = strtol( cur, &cur, 10 ); + + if( cur >= end ) { + hb_log("Error: Unexpected end of buffer! \n"); goto error; } - /* - * The Version number is 2 places after the build, so shift cur, 2 places. - * Get all the characters in cur until the point where " is found. - */ - cur += 2; + /* + * The Version number is 2 places after the build, so shift cur, 2 places. + * Get all the characters in cur until the point where " is found. + */ + cur += 2; - if( cur >= end ) + if( cur >= end ) { + hb_log("Error: Unexpected end of buffer! Could not get version number. \n"); goto error; } - memset( stable_str, 0, sizeof( stable_str ) ); - for( i = 0; i < sizeof( stable_str ) - 1 && cur < end && *cur != '"'; i++, cur++ ) - { - stable_str[i] = *cur; + memset( s_vers, 0, sizeof( s_vers ) ); + for( i = 0; i < sizeof( s_vers ) - 1 && cur < end && *cur != '"'; i++, cur++ ) + { + s_vers[i] = *cur; - // If the version number is longer than 7 characters, or the end is reached, something has gone wrong. - if (( i > 7) || ( cur >= end )) - { - goto error; - } - } - - if( cur >= end ) + /* If the CLI tag has not been found in the first 768 characters, or the end is reached, something bad happened.*/ + if (( cur >= end )) + { + hb_log("Error: Version number too long, or end of buffer reached. \n"); + goto error; + } + } + + if( cur >= end ) { goto error; } - - hb_log( "latest stable: %s, build %d", stable_str, stable ); - - // END OF STABLE INFO ################################################### + /* Print the version information */ + hb_log( "latest: %s, build %d", s_vers, i_vers ); - if( stable > HB_BUILD ) + /* Return the build information */ + if( i_vers > HB_PROJECT_BUILD ) { - memcpy( data->version, stable_str, sizeof( stable_str ) ); - *(data->build) = stable; + memcpy( data->version, s_vers, sizeof(s_vers) ); + *(data->build) = i_vers; } error: