OSDN Git Service

Fix a hang in sync
[handbrake-jp/handbrake-jp-git.git] / libhb / update.c
index 6b0d7af..9f72523 100644 (file)
@@ -30,170 +30,55 @@ static void UpdateFunc( void * _data )
 {
 
     hb_update_t * data = (hb_update_t *) _data;
-       
-       char     * hb_query, * hb_query_two;
+
+    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, unstable;
-    char       stable_str[16], unstable_str[16];
+    int        i_vers;
+    char       s_vers[32]; /* must be no larger than hb_handle_s.version */
     int        i;
-       
+
     /* Setup hb_query and hb_query_two with the correct appcast file */
-    if( HB_PROJECT_BUILD % 100 )
-    {  
-        hb_log("Using http://handbrake.fr/appcast_unstable.xml (primary)");
-        hb_log("Using http://handbrake.fr/appcast.xml (secondary)");
-    }
-       else 
-       {
-        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";
+    hb_log( "Using %s", url );
 
-       /* Grab the data from the web server */
-    if( !( net = hb_net_open( "handbrake.fr", 80 ) ) )
-    {
+    /* extract host part */
+    cur = strstr( HB_PROJECT_URL_APPCAST, "//" );
+    if( !cur || cur+2 > urlz )
         goto error;
-    }
+    cur += 2;
 
-    if( hb_net_send( net, hb_query ) < 0 )
-    {
-        hb_log("Error: Unable to connect to server");
-        hb_net_close( &net );
+    end = strstr( cur, "/" );
+    if( !end || end > urlz )
         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;
-    }
+    memset( url_host, 0, sizeof(url_host) );
+    strncpy( url_host, cur, (end-cur) );
 
-    cur = buf;
-    end = &buf[sizeof( buf )];
-       
-    /* Make sure we got it */
-    cur += 9;
-    if( size < 15 || strncmp( cur, "200 OK", 6 ) )
-    {
-        hb_log("Error: We did not get a 200 OK from the server. \n");
+    /* extract path part */
+    memset( url_path, 0, sizeof(url_path) );
+    strncpy( url_path, end, (urlz-end) );
+
+    if( !strlen( url_path ))
         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;
-        }
-    }
+    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 );
 
-    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;
-    }
-       
-       /* Stable HB_PROJECT_BUILD */
-    stable = 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( stable_str, 0, sizeof( stable_str ) );
-    for( i = 0;   i < sizeof( stable_str ) - 1 && cur < end && *cur != '"'; i++, cur++ )
-    {
-        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 ) ) )
+    if( !( net = hb_net_open( url_host, 80 ) ) )
     {
         goto error;
     }
-       
-       if( hb_net_send( net, hb_query_two ) < 0 )
+
+    if( hb_net_send( net, query ) < 0 )
     {
         hb_log("Error: Unable to connect to server");
         hb_net_close( &net );
@@ -220,7 +105,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;
     }
@@ -255,7 +139,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");
@@ -280,12 +164,12 @@ static void UpdateFunc( void * _data )
         goto error;
     }
        
-       /* UnStable HB_PROJECT_BUILD */
-    unstable = strtol( cur, &cur, 10 );
-               
+    /* Stable HB_PROJECT_BUILD */
+    i_vers = strtol( cur, &cur, 10 );
+
     if( cur >= end )
     {
-     hb_log("Error: Unexpected end of buffer! \n");
+        hb_log("Error: Unexpected end of buffer! \n");
         goto error;
     }
        
@@ -300,46 +184,32 @@ static void UpdateFunc( void * _data )
         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++ )
+    memset( s_vers, 0, sizeof( s_vers ) );
+    for( i = 0;   i < sizeof( s_vers ) - 1 && cur < end && *cur != '"'; i++, cur++ )
     {
-        unstable_str[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 ))
+        /* 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;
     }
-       
+
     /* Print the version information */
-    hb_log( "latest stable: %s, build %d", stable_str, stable );
-       hb_log( "latest unstable: %s, build %d", unstable_str, unstable );
-       
+    hb_log( "latest: %s, build %d", s_vers, i_vers );
+
     /* Return the build information */
-       if( HB_PROJECT_BUILD % 100 )
-    {
-        /* We are runnning an unstable build */
-        if( unstable > HB_PROJECT_BUILD )
-        {
-            memcpy( data->version, unstable_str, sizeof( unstable_str ) );
-            *(data->build) = unstable;
-        }
-    }
-    else
+    if( i_vers > HB_PROJECT_BUILD )
     {
-        /* We are runnning an stable build */
-        if( stable > 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: