home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Atomic_Tanks / Atomic-Tanks-5.1.exe / src / update.cpp < prev    next >
C/C++ Source or Header  |  2009-11-06  |  3KB  |  106 lines

  1. #ifdef NETWORK
  2. #ifdef THREADS
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <pthread.h>
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <netdb.h>
  12. #include <unistd.h>
  13.  
  14. #include "update.h"
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21. char *Check_For_Update(char *server_name, char *remote_file, char *host_name, char *current_version)
  22. {
  23.     struct update_data *my_update;
  24.     pthread_t update_thread;
  25.  
  26.     my_update = (struct update_data *) calloc(1, sizeof(struct update_data));
  27.     if (!my_update)
  28.        return NULL;
  29.     my_update->server_name = server_name;
  30.     my_update->remote_file = remote_file;
  31.     my_update->host_name = host_name;
  32.     my_update->current_version = current_version;
  33.     my_update->update_string = (char *) calloc(UPDATE_STR_LENGTH, sizeof(char));
  34.     if (! my_update->update_string)
  35.        return NULL;
  36.  
  37.     pthread_create( &update_thread, NULL, Get_Latest_Version, (void *) my_update);
  38.     return my_update->update_string;
  39. }
  40.  
  41.  
  42.  
  43. void *Get_Latest_Version(void *new_data)
  44. {
  45.   struct update_data *my_data = (struct update_data *) new_data;
  46.    // set up socket
  47.    int socket_num, port_number = 80;
  48.    struct sockaddr_in server_address;
  49.    struct hostent *server;
  50.    char buffer[1024];
  51.    char *found = NULL;
  52.    int got_bytes;
  53.    double this_version, web_version;
  54.  
  55.  
  56.    socket_num = socket(AF_INET, SOCK_STREAM, 0);
  57.    if (socket_num < 0)
  58.       pthread_exit(NULL);
  59.    server = gethostbyname(my_data->server_name);
  60.    if (! server)
  61.       pthread_exit(NULL);
  62.    bzero((char *) &server_address, sizeof(server_address));
  63.    server_address.sin_family = AF_INET;
  64.    bcopy((char *) server->h_addr,
  65.          (char *) &server_address.sin_addr.s_addr,
  66.          server->h_length);
  67.    server_address.sin_port = htons(port_number);
  68.  
  69.    // try to connect
  70.    if ( connect(socket_num, (sockaddr *)&server_address, sizeof(server_address)) < 0)
  71.       pthread_exit(NULL);
  72.  
  73.  
  74.    // get HTTP data
  75.    snprintf(buffer, 1024, "GET /%s HTTP/1.1\nHost: %s\n\n", my_data->remote_file, my_data->host_name);
  76.    write(socket_num, buffer, strlen(buffer));
  77.    got_bytes = read(socket_num, buffer, 1024);
  78.  
  79.    // search for version number in return data
  80.    if (got_bytes > 1)
  81.       found = strstr(buffer, "Version: ");
  82.    while ( (got_bytes > 1) && (! found) )
  83.    {
  84.       got_bytes = read(socket_num, buffer, 1024);
  85.       if (got_bytes > 1)
  86.          found = strstr(buffer, "Version: ");
  87.    }
  88.  
  89.    // compare version number
  90.    if (found)
  91.    {
  92.       found += 9;
  93.       found[5] = '\0';
  94.       sscanf(found, "%lf", &web_version);
  95.       sscanf(my_data->current_version, "%lf", &this_version);
  96.       if (web_version > this_version)
  97.          sprintf(my_data->update_string, "A new version, %2.1lf, is ready for download.", web_version);
  98.    }
  99.  
  100.    close(socket_num);
  101.    pthread_exit(NULL);
  102. }
  103.  
  104. #endif
  105. #endif
  106.