]> git.street.me.uk Git - andy/viking.git/blobdiff - src/http.c
Fix intermittent problem of map redraw.
[andy/viking.git] / src / http.c
index 311c94f4b8216c127934682696be60be5406ef9b..b8e0dab54531083ce9d2daf65175fbde78bd4203 100644 (file)
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <gtk/gtk.h>
 #include <string.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
 
 #ifdef WINDOWS
-
-#include <io.h>
 #include <winsock.h>
-#define access(a,b) _access(a,b)
-#define close(a) closesocket(a)
-
-char *dirname ( char * dir )
-{
-  char *tmp = dir + strlen(dir) - 1;
-  while ( tmp != dir && *tmp != '\\' )
-    tmp--;
-  *tmp = '\0';
-  return dir;
-}
-
 #else
-
 #include <unistd.h>
-#include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netdb.h>
-
-/* dirname */
-#include <libgen.h>
-
-#endif 
+#endif
 
 #include "http.h"
 
@@ -111,36 +88,14 @@ int http_get_line(int sock, char *buf, int len)
   return 1;
 }
 
-/* makes directory if neccessary */
-int http_download_get_url ( const char *hostname, const char *uri, const char *fn, int already_redirected, int sendhostname )
+int http_download_get_url ( const char *hostname, const char *uri, FILE *f, int already_redirected, int sendhostname )
 {
   static char input_buffer[1024];
   int sock;
   int len;
-  FILE *f, *tmp_f;
+  FILE *tmp_f;
   /* int hnlen = strlen ( hostname ); */
 
-  if ( access ( fn, F_OK ) == 0 )
-  {
-    return -3;
-  } else {
-    if ( errno == ENOENT)
-    {
-      char *tmp = g_strdup ( fn );
-#ifdef WINDOWS
-      mkdir( dirname ( dirname ( tmp ) ) );
-      g_free ( tmp ); tmp = g_strdup ( fn );
-      mkdir( dirname ( tmp ) );
-#else
-      mkdir( dirname ( dirname ( tmp ) ), 0777 );
-      g_free ( tmp ); tmp = g_strdup ( fn );
-      mkdir( dirname ( tmp ), 0777 );
-#endif
-      g_free ( tmp );
-    }
-    if ( ! (f = fopen ( fn, "w+b" )) ) /* immediately open file so other threads won't -- prevents race condition */
-      return -4;
-  }
 #ifdef WINDOWS
   WSADATA usadata;
   WSAStartup ( MAKEWORD(2,2), &usadata );
@@ -149,8 +104,6 @@ int http_download_get_url ( const char *hostname, const char *uri, const char *f
   sock = http_connect ( hostname, 80 );
   if (sock < 0)
   {
-    fclose ( f );
-    remove ( fn );
     return -1;
   }
 
@@ -194,11 +147,9 @@ int http_download_get_url ( const char *hostname, const char *uri, const char *f
         {
           char *newhost = g_strndup ( input_buffer + 17, uri_start - input_buffer - 17 );
           char *newuri = strdup ( uri_start );
-          fclose ( f );
-          remove ( fn );
           close ( sock );
 
-          rv = http_download_get_url ( newhost, newuri, fn, 1, sendhostname );
+          rv = http_download_get_url ( newhost, newuri, f, 1, sendhostname );
 
           free ( newhost );
           free ( newuri );
@@ -207,8 +158,7 @@ int http_download_get_url ( const char *hostname, const char *uri, const char *f
       }
     } while (input_buffer[0] != '\r' );
 
-    fclose ( f );
-    remove ( fn );
+    /* Something went wrong */
     return 1;
   }
 
@@ -216,8 +166,6 @@ int http_download_get_url ( const char *hostname, const char *uri, const char *f
   {
     if ( http_get_line ( sock, input_buffer, 1024 ) == 0 )
     {
-      fclose ( f );
-      remove ( fn );
       close ( sock );
       return -2;
     }
@@ -239,7 +187,6 @@ int http_download_get_url ( const char *hostname, const char *uri, const char *f
     fwrite ( input_buffer, 1, len, f);
   }
   fclose ( tmp_f );
-  fclose ( f );
 
   close ( sock );
 #ifdef WINDOWS
@@ -247,62 +194,3 @@ int http_download_get_url ( const char *hostname, const char *uri, const char *f
 #endif
   return 0;
 }
-
-/* success = 0, -1 = couldn't connect, -2 HTTP error, -3 file exists, -4 couldn't write to file... */
-/* uri: like "/uri.html?whatever" */
-/* only reason for the "wrapper" is so we can do redirects. */
-int a_http_download_get_url ( const char *hostname, const char *uri, const char *fn )
-{
-  return http_download_get_url ( hostname, uri, fn, 0, 1 );
-}
-
-int a_http_download_get_url_nohostname ( const char *hostname, const char *uri, const char *fn )
-{
-  return http_download_get_url ( hostname, uri, fn, 0, 0 );
-}
-
-
-int usgs_hack ( const char *scale_factor, const char *uri, const char *fn )
-{
-  static char input_buffer[1024];
-  int sock;
-  /* int hnlen = strlen ( scale_factor ); */
-
-#ifdef WINDOWS
-  WSADATA usadata;
-  WSAStartup ( MAKEWORD(2,2), &usadata );
-#endif
-
-  sock = http_connect ( scale_factor, 80 );
-  if (sock < 0)
-    return -1;
-
-  send ( sock, "GET /", 5, 0);
-  send ( sock, uri, strlen ( uri ), 0 );
-  send ( sock, " HTTP/1.0\r\n\r\n", 13, 0 );
-
-  /* next, skip through all headers EXCEPT content length.,
-     that is, if it begins with "Content-Length: " (strncasecmp),
-     atoi that line from +16 (+17 ?), read that many bytes directly
-     into file (IF we can open it, else return error) and we're done.
-  */
-
-  /* "HTTP/1.x 200 OK" check */
-  for (;;) {
-    if ( http_get_line ( sock, input_buffer, 1024 ) == 0 )
-      break;
-
-    if ( strncmp(input_buffer, "\t\t\t<img src=\"/g", 15) == 0 && strlen(input_buffer) > 28 )
-    {
-      char *uri = input_buffer + 13;
-      close(sock);
-      uri[strlen(uri)-4] = '\0';
-      return a_http_download_get_url_nohostname ( scale_factor, uri, fn );
-    }
-  }
-  close ( sock );
-#ifdef WINDOWS
-    WSACleanup(); /* they sure make winsock programming easy. */
-#endif
-  return -10;
-}