summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libhb/update.c196
1 files changed, 172 insertions, 24 deletions
diff --git a/libhb/update.c b/libhb/update.c
index d19a05417..599d82ece 100644
--- a/libhb/update.c
+++ b/libhb/update.c
@@ -31,29 +31,32 @@ static void UpdateFunc( void * _data )
hb_update_t * data = (hb_update_t *) _data;
- /* New code to handle the hb_query stuff */
- char* hb_query;
+ char * hb_query, * hb_query_two;
+ hb_net_t * net;
+ int ret;
+ char buf[4096];
+ char * cur, * end;
+ int size;
+ int stable, unstable;
+ char stable_str[16], unstable_str[16];
+ int i;
+
+ /* Setup hb_query and hb_query_two with the correct appcast file */
if( HB_BUILD % 100 )
{
- hb_query = "GET /appcast_unstable.xml HTTP/1.0\r\nHost: handbrake.fr\r\n\r\n";
- hb_log("Using http://handbrake.fr/appcast_unstable.xml");
+ hb_log("Using http://handbrake.fr/appcast_unstable.xml (primary)");
+ hb_log("Using http://handbrake.fr/appcast.xml (secondary)");
}
else
{
- hb_query = "GET /appcast.xml HTTP/1.0\r\nHost: handbrake.fr\r\n\r\n";
- hb_log("Using http://handbrake.fr/appcast.xml");
+ hb_log("Using http://handbrake.fr/appcast.xml (primary)");
+ hb_log("Using http://handbrake.fr/appcast_unstable.xml (secondary)");
}
+
+ hb_query = "GET /appcast.xml HTTP/1.0\r\nHost: handbrake.fr\r\n\r\n";
+ hb_query_two = "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;
- int ret;
- char buf[4096];
- char * cur, * end;
- int size;
- int stable;
- char stable_str[16];
- int i;
-
+ /* Grab the data from the web server */
if( !( net = hb_net_open( "handbrake.fr", 80 ) ) )
{
goto error;
@@ -86,7 +89,6 @@ static void UpdateFunc( void * _data )
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;
}
@@ -109,8 +111,6 @@ static void UpdateFunc( void * _data )
goto error;
}
- // Version Checking Here
-
/*
* Find the <cli> tag
* Scan though each character of the buffer until we find that the first 4 characters of "cur" are "<cli"
@@ -123,7 +123,7 @@ static void UpdateFunc( void * _data )
break;
}
- // If the CLI tag has not been found in the first 768 characters, or the end is reached, something bad happened.
+ /* 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 <cli> tag in the expected maximum amount of characters into the file. \n");
@@ -148,6 +148,7 @@ static void UpdateFunc( void * _data )
goto error;
}
+ /* Stable HB_BUILD */
stable = strtol( cur, &cur, 10 );
if( cur >= end )
@@ -172,6 +173,138 @@ static void UpdateFunc( void * _data )
{
stable_str[i] = *cur;
+ /* If the CLI tag has not been found in the first 768 characters, or the end is reached, something bad happened.*/
+ if (( i > 7) || ( cur >= end ))
+ {
+ hb_log("Error: Version number too long, or end of buffer reached. \n");
+ goto error;
+ }
+ }
+
+ if( cur >= end )
+ {
+ goto error;
+ }
+
+ /* HANDLE THE SECOND APPCAST FILE NOW */
+ /* Grab the data from the web server */
+ if( !( net = hb_net_open( "handbrake.fr", 80 ) ) )
+ {
+ goto error;
+ }
+
+ if( hb_net_send( net, hb_query_two ) < 0 )
+ {
+ hb_log("Error: Unable to connect to server");
+ hb_net_close( &net );
+ goto error;
+ }
+
+ size = 0;
+ memset( buf, 0, 4096 );
+ 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 */
+ hb_log("Error: We did not get a 200 OK from the server. \n");
+ 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 )
+ {
+ hb_log("Error: Found the end of the buffer before the end of the HTTP header information! \n");
+ goto error;
+ }
+
+ /*
+ * Find the <cli> tag
+ * Scan though each character of the buffer until we find that the first 4 characters of "cur" are "<cli"
+ */
+ for(i=0 ; &cur[3] < end; i++, cur++ )
+ {
+ if( cur[0] == 'c' && cur[1] == 'l' && cur[2] == 'i' && cur[3] == '>' )
+ {
+ 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 ))
+ {
+ hb_log("Error: Did not find the <cli> tag in the expected maximum amount of characters into the file. \n");
+ goto error;
+ }
+ }
+
+ if( cur >= end )
+ {
+ goto error;
+ }
+
+ /*
+ * Ok, The above code didn't position cur, it only found <cli so we need to shift cur along 3 places.
+ * After which, the next 10 characters are the build number
+ */
+ cur += 3;
+
+ if( cur >= end )
+ {
+ hb_log("Error: Unexpected end of buffer! Could not find the build information. \n");
+ goto error;
+ }
+
+ /* UnStable HB_BUILD */
+ unstable = 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;
+
+ if( cur >= end )
+ {
+ hb_log("Error: Unexpected end of buffer! Could not get version number. \n");
+ goto error;
+ }
+ memset( unstable_str, 0, sizeof( unstable_str ) );
+ for( i = 0; i < sizeof( unstable_str ) - 1 && cur < end && *cur != '"'; i++, cur++ )
+ {
+ unstable_str[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 ))
{
@@ -185,13 +318,28 @@ static void UpdateFunc( void * _data )
goto error;
}
+ /* Print the version information */
hb_log( "latest stable: %s, build %d", stable_str, stable );
+ hb_log( "latest unstable: %s, build %d", unstable_str, unstable );
- // Return the build information
- if( stable > HB_BUILD )
+ /* Return the build information */
+ if( HB_BUILD % 100 )
{
- memcpy( data->version, stable_str, sizeof( stable_str ) );
- *(data->build) = stable;
+ /* 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: