Subversion Repositories Games.Chess Giants

Rev

Rev 185 | Rev 187 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 185 Rev 186
Line 520... Line 520...
520
 
520
 
521
   return; // finished, string is now single-line
521
   return; // finished, string is now single-line
522
}
522
}
523
 
523
 
524
 
524
 
525
void ConvertTo7BitASCII (char *dest, size_t dest_size_in_bytes, wchar_t *source)
525
size_t ConvertTo7BitASCII (char *dest, size_t dest_size_in_bytes, wchar_t *source)
526
{
526
{
527
   // helper function to quickly convert a wide char string to 7-bit ASCII
527
   // helper function to quickly convert a wide char string to 7-bit ASCII
528
 
528
 
529
   // do the conversion. Use WideCharToMultiByte() preferentially because wcstombs()
529
   // do the conversion. Use WideCharToMultiByte() preferentially because wcstombs()
530
   // stops at the first non-convertible character, whereas the former doesn't.
530
   // stops at the first non-convertible character, whereas the former doesn't.
531
   WideCharToMultiByte (20127, 0, source, -1, dest, dest_size_in_bytes, NULL, NULL); // 20127 is 7-bit US-ASCII code page
531
   return (WideCharToMultiByte (20127, 0, source, -1, dest, dest_size_in_bytes, NULL, NULL) - 1); // 20127 is 7-bit US-ASCII code page, -1 to null-terminate output string
532
   return;
-
 
533
}
532
}
534
 
533
 
535
 
534
 
536
void ConvertToWideChar (wchar_t *dest, size_t dest_size_in_wchars, char *source)
535
size_t ConvertToWideChar (wchar_t *dest, size_t dest_size_in_wchars, char *source)
537
{
536
{
538
   // helper function to quickly convert an ASCII string to wide char
537
   // helper function to quickly convert an ASCII string to wide char
539
 
538
 
540
   size_t converted_count;
539
   size_t converted_count;
541
 
540
 
542
   // do the conversion (WARNING: EXTREMELY COSTY FUNCTION!)
541
   // do the conversion (WARNING: EXTREMELY COSTY FUNCTION!)
543
   mbstowcs_s (&converted_count, dest, dest_size_in_wchars, source, _TRUNCATE);
542
   mbstowcs_s (&converted_count, dest, dest_size_in_wchars, source, _TRUNCATE);
544
   return;
543
   return (converted_count);
545
}
544
}
546
 
545
 
547
 
546
 
548
void MinutesToWideCharString (wchar_t *dest, size_t dest_size_in_wchars, int minutes)
547
void MinutesToWideCharString (wchar_t *dest, size_t dest_size_in_wchars, int minutes)
549
{
548
{
Line 758... Line 757...
758
      return (true); // copy out the width and height and return TRUE
757
      return (true); // copy out the width and height and return TRUE
759
   }
758
   }
760
 
759
 
761
   fclose (fp); // close file now
760
   fclose (fp); // close file now
762
   return (false); // file is probably not a DDS, BMP, PNG, TGA or JPEG image
761
   return (false); // file is probably not a DDS, BMP, PNG, TGA or JPEG image
-
 
762
}
-
 
763
 
-
 
764
 
-
 
765
void GenerateVersionNumber (char *out_string, size_t outstring_maxsize)
-
 
766
{
-
 
767
   // handy helper to generate a version number in the form YYYYMMDD
-
 
768
 
-
 
769
   sprintf_s (out_string, outstring_maxsize, "%c%c%c%c%s%c%c",
-
 
770
              __DATE__[7], __DATE__[8], __DATE__[9], __DATE__[10], // year
-
 
771
              (strncmp (__DATE__, "Jan", 3) == 0 ? "01" :
-
 
772
               (strncmp (__DATE__, "Feb", 3) == 0 ? "02" :
-
 
773
                (strncmp (__DATE__, "Mar", 3) == 0 ? "03" :
-
 
774
                 (strncmp (__DATE__, "Apr", 3) == 0 ? "04" :
-
 
775
                  (strncmp (__DATE__, "May", 3) == 0 ? "05" :
-
 
776
                   (strncmp (__DATE__, "Jun", 3) == 0 ? "06" :
-
 
777
                    (strncmp (__DATE__, "Jul", 3) == 0 ? "07" :
-
 
778
                     (strncmp (__DATE__, "Aug", 3) == 0 ? "08" :
-
 
779
                      (strncmp (__DATE__, "Sep", 3) == 0 ? "09" :
-
 
780
                       (strncmp (__DATE__, "Oct", 3) == 0 ? "10" :
-
 
781
                        (strncmp (__DATE__, "Nov", 3) == 0 ? "11" :
-
 
782
                         (strncmp (__DATE__, "Dec", 3) == 0 ? "12" : "??")))))))))))),
-
 
783
                          (__DATE__[4] == ' ' ? '0' : __DATE__[4]), __DATE__[5]);
-
 
784
 
-
 
785
   return; // finished
763
}
786
}
764
 
787
 
765
 
788
 
766
void Debug_Init (const wchar_t *logfile_name)
789
void Debug_Init (const wchar_t *logfile_name)
767
{
790
{
Line 850... Line 873...
850
 
873
 
851
bool Debug_SendLogToAuthor (char *reason, bool should_include_description)
874
bool Debug_SendLogToAuthor (char *reason, bool should_include_description)
852
{
875
{
853
   // this function upload the engine history to the remote server for debug purposes.
876
   // this function upload the engine history to the remote server for debug purposes.
854
 
877
 
855
   static wchar_t descriptionfile_pathname[MAX_PATH];
878
   wchar_t descriptionfile_pathname[MAX_PATH];
856
   static char log_buffer[512 * 1024];
-
 
857
   static char log_base64buffer[512 * 1024 * 4 / 3];
-
 
858
   static char description_buffer[512 * 1024];
-
 
859
   static char description_base64buffer[512 * 1024 * 4 / 3];
-
 
860
   static char board_buffer[8 * 5 * 8 * 3];
-
 
861
   static char board_base64buffer[8 * 5 * 8 * 3 * 4 / 3];
-
 
862
   static char http_buffer[1024 * 1024]; // used both for request and reply
-
 
863
   static char user_email[64];
879
   char temp_string[1024];
864
   static char program_version[10];
-
 
865
 
-
 
866
   struct sockaddr_in service;
880
   struct sockaddr_in service;
867
   struct hostent *hostinfo;
881
   struct hostent *hostinfo;
868
   SHELLEXECUTEINFO bugreport_shinfo;
882
   SHELLEXECUTEINFO bugreport_shinfo;
-
 
883
   buffer_t temp_buffer;
-
 
884
   buffer_t description_buffer;
-
 
885
   buffer_t logfile_buffer;
869
   buffer_t bugreport_buffer;
886
   buffer_t board_buffer;
-
 
887
   buffer_t http_buffer; // used for both request and reply
-
 
888
   bool was_successful;
-
 
889
   unsigned char color;
870
   unsigned char part;
890
   unsigned char part;
871
   char *write_ptr;
891
   char *base64buffer; // mallocated
872
   int write_index;
892
   int write_index;
873
   int read_index;
893
   int read_index;
874
   int length;
894
   int length;
875
   SOCKET s;
895
   SOCKET s;
876
   FILE *fp;
-
 
877
   int i;
896
   int i;
878
   int j;
897
   int j;
879
 
898
 
880
   // get a hand on the log file and read its contents
899
   // get a hand on the log file and read its contents
881
   _wfopen_s (&fp, logfile_pathname, L"rb");
900
   Buffer_Initialize (&logfile_buffer);
882
   if (fp != NULL)
901
   if (Buffer_ReadFromFileW (&temp_buffer, logfile_pathname))
883
   {
902
   {
884
      fseek (fp, 0, SEEK_END);
-
 
885
      length = ftell (fp); // get file size
903
      logfile_buffer.data = (char *) malloc (temp_buffer.size); // necessarily less
886
      if (length > sizeof (log_base64buffer) - 1)
-
 
887
         swprintf_s ((wchar_t *) log_base64buffer, WCHAR_SIZEOF (log_base64buffer), L"Log file at \"%s\" too big (> %d bytes).", logfile_pathname, sizeof (log_base64buffer) - 1); // history file too big
-
 
888
      else
-
 
889
      {
-
 
890
         fseek (fp, 0, SEEK_SET);
-
 
891
         fread (log_base64buffer, 1, length, fp);
-
 
892
         log_base64buffer[length] = 0; // terminate buffer ourselves
904
      logfile_buffer.size = ConvertTo7BitASCII (logfile_buffer.data, temp_buffer.size, (wchar_t *) temp_buffer.data);
893
      }
-
 
894
      fclose (fp);
-
 
895
   }
905
   }
896
   else
906
   else
-
 
907
   {
897
      swprintf_s ((wchar_t *) log_base64buffer, WCHAR_SIZEOF (log_base64buffer), L"Couldn't open log file at \"%s\".", logfile_pathname); // couldn't open game history log file
908
      Buffer_AppendCString (&logfile_buffer, "Couldn't open log file at \"");
898
   ConvertTo7BitASCII (log_buffer, sizeof (log_buffer), (wchar_t *) log_base64buffer);
909
      ConvertTo7BitASCII (temp_string, sizeof (temp_string), logfile_pathname); Buffer_AppendCString (&logfile_buffer, temp_string);
-
 
910
      Buffer_AppendCString (&logfile_buffer, "\".\n");
-
 
911
   }
899
 
912
 
900
   // should the user include a problem report ?
913
   // should the user include a problem report ?
-
 
914
   Buffer_Initialize (&description_buffer);
901
   if (should_include_description)
915
   if (should_include_description)
902
   {
916
   {
903
      // have the user describe his problem with Notepad
917
      // have the user describe his problem with Notepad
904
      swprintf_s (descriptionfile_pathname, WCHAR_SIZEOF (descriptionfile_pathname), L"%s\\Chess Giants bug report.txt", app_path);
918
      swprintf_s (descriptionfile_pathname, WCHAR_SIZEOF (descriptionfile_pathname), L"%s\\Chess Giants bug report.txt", app_path);
905
      Buffer_Initialize (&bugreport_buffer);
919
      Buffer_Initialize (&description_buffer);
906
      length = wcslen (LOCALIZE (L"PleaseDescribeTheProblem"));
920
      length = wcslen (LOCALIZE (L"PleaseDescribeTheProblem"));
907
      Buffer_Append (&bugreport_buffer, (char *) LOCALIZE (L"PleaseDescribeTheProblem"), length * sizeof (wchar_t));
921
      Buffer_Append (&description_buffer, (char *) LOCALIZE (L"PleaseDescribeTheProblem"), length * sizeof (wchar_t));
908
      Buffer_Append (&bugreport_buffer, (char *) L"\r\n", 2 * sizeof (wchar_t));
922
      Buffer_Append (&description_buffer, (char *) L"\r\n", 2 * sizeof (wchar_t));
909
      for (write_index = 0; write_index < length; write_index++)
923
      for (write_index = 0; write_index < length; write_index++)
910
         Buffer_Append (&bugreport_buffer, (char *) L"-", sizeof (wchar_t));
924
         Buffer_Append (&description_buffer, (char *) L"-", sizeof (wchar_t));
911
      Buffer_Append (&bugreport_buffer, (char *) L"\r\n", 2 * sizeof (wchar_t));
925
      Buffer_Append (&description_buffer, (char *) L"\r\n", 2 * sizeof (wchar_t));
912
      Buffer_Append (&bugreport_buffer, (char *) L"\r\n=> ", 5 * sizeof (wchar_t));
926
      Buffer_Append (&description_buffer, (char *) L"\r\n=> ", 5 * sizeof (wchar_t));
913
      Buffer_WriteToFileW (&bugreport_buffer, descriptionfile_pathname);
927
      Buffer_WriteToFileW (&description_buffer, descriptionfile_pathname);
914
      memset (&bugreport_shinfo, 0, sizeof (bugreport_shinfo));
928
      memset (&bugreport_shinfo, 0, sizeof (bugreport_shinfo));
915
      bugreport_shinfo.cbSize = sizeof (SHELLEXECUTEINFO);
929
      bugreport_shinfo.cbSize = sizeof (SHELLEXECUTEINFO);
916
      bugreport_shinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
930
      bugreport_shinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
917
      bugreport_shinfo.lpFile = L"notepad.exe";
931
      bugreport_shinfo.lpFile = L"notepad.exe";
918
      bugreport_shinfo.lpParameters = descriptionfile_pathname;
932
      bugreport_shinfo.lpParameters = descriptionfile_pathname;
Line 920... Line 934...
920
      ShellExecuteEx (&bugreport_shinfo);
934
      ShellExecuteEx (&bugreport_shinfo);
921
      WaitForSingleObject (bugreport_shinfo.hProcess, INFINITE);
935
      WaitForSingleObject (bugreport_shinfo.hProcess, INFINITE);
922
      CloseHandle (bugreport_shinfo.hProcess);
936
      CloseHandle (bugreport_shinfo.hProcess);
923
 
937
 
924
      // get a hand on the error description file and read its contents
938
      // get a hand on the error description file and read its contents
925
      _wfopen_s (&fp, descriptionfile_pathname, L"rb");
939
      Buffer_Initialize (&description_buffer);
926
      if (fp != NULL)
940
      if (Buffer_ReadFromFileW (&temp_buffer, descriptionfile_pathname))
927
      {
941
      {
928
         fseek (fp, 0, SEEK_END);
-
 
929
         length = ftell (fp); // get file size
-
 
930
         fseek (fp, 0, SEEK_SET);
-
 
931
         if (length > sizeof (description_base64buffer) - 1)
-
 
932
            return (false); // history file too big, return an error condition
-
 
933
         fread (description_base64buffer, 1, length, fp);
-
 
934
         description_base64buffer[length] = 0; // terminate buffer ourselves
942
         description_buffer.data = (char *) malloc (temp_buffer.size); // necessarily less
935
         fclose (fp);
-
 
936
         _wunlink (descriptionfile_pathname); // as soon as it's read, DELETE the error description file
943
         description_buffer.size = ConvertTo7BitASCII (description_buffer.data, temp_buffer.size, (wchar_t *) temp_buffer.data);
937
      }
944
      }
938
      else
945
      else
-
 
946
      {
939
         swprintf_s ((wchar_t *) description_base64buffer, WCHAR_SIZEOF (description_base64buffer), L"Couldn't open error description file at \"%s\".", descriptionfile_pathname); // couldn't open error description file
947
         Buffer_AppendCString (&description_buffer, "Couldn't open error description file at \"");
940
      ConvertTo7BitASCII (description_buffer, sizeof (description_buffer), (wchar_t *) description_base64buffer);
948
         ConvertTo7BitASCII (temp_string, sizeof (temp_string), descriptionfile_pathname); Buffer_AppendCString (&description_buffer, temp_string);
-
 
949
         Buffer_AppendCString (&description_buffer, "\".\n");
-
 
950
      }
941
   }
951
   }
942
   else
-
 
943
      description_buffer[0] = 0; // no description
-
 
944
 
952
 
945
   // append the program-given reason to the description buffer
953
   // append the program-given reason to the description buffer
946
   strcat_s (description_buffer, sizeof (description_buffer), "\n\nChess Giants reason: ");
954
   Buffer_AppendCharArray (&description_buffer, "\n\nChess Giants reason: ");
947
   strcat_s (description_buffer, sizeof (description_buffer), reason);
955
   Buffer_AppendCString (&description_buffer, reason);
948
 
956
 
949
   // capture and encode the board
957
   // capture and encode the board
-
 
958
   Buffer_Initialize (&board_buffer);
950
   strcpy_s (board_buffer, sizeof (board_buffer), "+---+---+---+---+---+---+---+---+\n");
959
   Buffer_AppendCharArray (&board_buffer, "+---+---+---+---+---+---+---+---+\n");
951
   for (i = 7; i >= 0; i--) // lines are in reverse order in this stupid program of mine >.<
960
   for (i = 7; i >= 0; i--) // lines are in reverse order in this stupid program of mine >.<
952
   {
961
   {
953
      write_ptr = &board_buffer[strlen (board_buffer)];
962
      Buffer_AppendCString (&board_buffer, "|");
954
      *write_ptr = '|'; write_ptr++;
-
 
955
      for (j = 0; j < 8; j++)
963
      for (j = 0; j < 8; j++)
956
      {
964
      {
957
         part = the_board.moves[the_board.move_count - 1].slots[i][j].part;
965
         part = the_board.moves[the_board.move_count - 1].slots[i][j].part;
958
         *write_ptr = ' '; write_ptr++;
966
         color = the_board.moves[the_board.move_count - 1].slots[i][j].color;
959
         if      (part == PART_ROOK)   *write_ptr = 'r';
967
         if      (part == PART_ROOK)   Buffer_AppendCString (&board_buffer, (color == COLOR_WHITE ? " R |" : " r |"));
960
         else if (part == PART_KNIGHT) *write_ptr = 'n';
968
         else if (part == PART_KNIGHT) Buffer_AppendCString (&board_buffer, (color == COLOR_WHITE ? " N |" : " n |"));
961
         else if (part == PART_BISHOP) *write_ptr = 'b';
969
         else if (part == PART_BISHOP) Buffer_AppendCString (&board_buffer, (color == COLOR_WHITE ? " B |" : " b |"));
962
         else if (part == PART_QUEEN)  *write_ptr = 'q';
970
         else if (part == PART_QUEEN)  Buffer_AppendCString (&board_buffer, (color == COLOR_WHITE ? " Q |" : " q |"));
963
         else if (part == PART_KING)   *write_ptr = 'k';
971
         else if (part == PART_KING)   Buffer_AppendCString (&board_buffer, (color == COLOR_WHITE ? " K |" : " k |"));
964
         else if (part == PART_PAWN)   *write_ptr = 'p';
972
         else if (part == PART_PAWN)   Buffer_AppendCString (&board_buffer, (color == COLOR_WHITE ? " P |" : " p |"));
965
         else                          *write_ptr = ' ';
973
         else                          Buffer_AppendCString (&board_buffer, "   |");
966
         if (the_board.moves[the_board.move_count - 1].slots[i][j].color == COLOR_WHITE) *write_ptr = toupper (*write_ptr);
-
 
967
         *write_ptr++;
-
 
968
         *write_ptr = ' '; write_ptr++;
-
 
969
         *write_ptr = '|'; write_ptr++;
-
 
970
      }
974
      }
971
      *write_ptr = '\n'; write_ptr++;
-
 
972
      *write_ptr = 0;
-
 
973
      strcat_s (board_buffer, sizeof (board_buffer), "+---+---+---+---+---+---+---+---+\n");
975
      Buffer_AppendCharArray (&board_buffer, "\n" "+---+---+---+---+---+---+---+---+\n");
974
   }
976
   }
975
 
-
 
976
   // build the program version
-
 
977
   sprintf_s (program_version, sizeof (program_version), "%04d%02d%02d",
-
 
978
                                                         atoi (strrchr (__DATE__, ' ') + 1),
-
 
979
                                                         (__DATE__[0] == 'F' ? 2 : // February
-
 
980
                                                          (__DATE__[0] == 'S' ? 9 : // September
-
 
981
                                                           (__DATE__[0] == 'O' ? 10 : // October
-
 
982
                                                            (__DATE__[0] == 'N' ? 11 : // November
-
 
983
                                                             (__DATE__[0] == 'D' ? 12 : // December
-
 
984
                                                              (__DATE__[1] == 'p' ? 4 : // April
-
 
985
                                                               (__DATE__[0] == 'A' ? 8 : // August
-
 
986
                                                                (__DATE__[2] == 'r' ? 3 : // March
-
 
987
                                                                 (__DATE__[0] == 'M' ? 5 : // May
-
 
988
                                                                  (__DATE__[1] == 'a' ? 1 : // January
-
 
989
                                                                   (__DATE__[2] == 'n' ? 6 : // June
-
 
990
                                                                    (__DATE__[0] == 'J' ? 7 : // July
-
 
991
                                                                     0)))))))))))),
-
 
992
                                                         atoi (strchr (__DATE__, ' ') + 1));
-
 
993
 
977
 
994
   // get our distribution server's IP address from the host name
978
   // get our distribution server's IP address from the host name
995
   hostinfo = gethostbyname ("pmbaty.com");
979
   hostinfo = gethostbyname ("pmbaty.com");
996
   if (hostinfo == NULL)
980
   if (hostinfo == NULL)
997
      return (false); // couldn't resolve hostname, return an error condition
981
      return (false); // couldn't resolve hostname, return an error condition
Line 1011... Line 995...
1011
      closesocket (s); // finished communicating, close TCP socket
995
      closesocket (s); // finished communicating, close TCP socket
1012
      return (false); // couldn't resolve hostname, return an error condition
996
      return (false); // couldn't resolve hostname, return an error condition
1013
   }
997
   }
1014
 
998
 
1015
   // build the HTTP POST query and send it
999
   // build the HTTP POST query and send it
1016
   if (options.registration.user_email[0] != 0)
-
 
1017
      ConvertTo7BitASCII (user_email, sizeof (user_email), options.registration.user_email);
1000
   base64buffer = (char *) malloc ((max (board_buffer.size, max (logfile_buffer.size, description_buffer.size)) * 4 / 3 + 4) * sizeof (char));
1018
   else
-
 
1019
      strcpy_s (user_email, sizeof (user_email), "an+unregistered+user");
1001
   Buffer_Initialize (&http_buffer);
1020
   length = strlen ("registrant=") + strlen (user_email)
1002
   Buffer_AppendCharArray (&http_buffer,  "registrant=");  ConvertTo7BitASCII (temp_string, sizeof (temp_string), (options.registration.user_email[0] != 0 ? options.registration.user_email : L"an+unregistered+user")); Buffer_AppendCString (&http_buffer, temp_string);
1021
          + strlen ("&version=") + strlen (program_version)
1003
   Buffer_AppendCharArray (&http_buffer, "&version=");     GenerateVersionNumber (temp_string, sizeof (temp_string)); Buffer_AppendCString (&http_buffer, temp_string);
1022
          + strlen ("&player1=") + 1
1004
   Buffer_AppendCharArray (&http_buffer, "&player1=");     Buffer_Append (&http_buffer, (the_board.players[COLOR_WHITE].type == PLAYER_INTERNET ? "I" : (the_board.players[COLOR_WHITE].type == PLAYER_COMPUTER ? "C" : "H")), 1);
1023
          + strlen ("&player2=") + 1
1005
   Buffer_AppendCharArray (&http_buffer, "&player2=");     Buffer_Append (&http_buffer, (the_board.players[COLOR_BLACK].type == PLAYER_INTERNET ? "I" : (the_board.players[COLOR_BLACK].type == PLAYER_COMPUTER ? "C" : "H")), 1);
1024
          + strlen ("&board=") + base64_encode (board_base64buffer, board_buffer, strlen (board_buffer))
1006
   Buffer_AppendCharArray (&http_buffer, "&board=");       base64_encode (base64buffer, board_buffer.data, board_buffer.size); Buffer_AppendCString (&http_buffer, base64buffer);
1025
          + strlen ("&log=") + base64_encode (log_base64buffer, log_buffer, strlen (log_buffer))
1007
   Buffer_AppendCharArray (&http_buffer, "&log=");         base64_encode (base64buffer, logfile_buffer.data, logfile_buffer.size); Buffer_AppendCString (&http_buffer, base64buffer);
1026
          + strlen ("&description=") + base64_encode (description_base64buffer, description_buffer, strlen (description_buffer));
1008
   Buffer_AppendCharArray (&http_buffer, "&description="); base64_encode (base64buffer, description_buffer.data, description_buffer.size); Buffer_AppendCString (&http_buffer, base64buffer);
1027
   sprintf_s (http_buffer, sizeof (http_buffer),
1009
   Buffer_Forget (&description_buffer);
1028
              "POST /chess/sendcrash.php HTTP/1.1\r\n"
1010
   Buffer_Forget (&logfile_buffer);
1029
              "Host: pmbaty.com\r\n"
1011
   Buffer_Forget (&board_buffer);
1030
              "Content-Type: application/x-www-form-urlencoded\r\n"
1012
   free (base64buffer);
1031
              "Content-Length: %d\r\n"
1013
   length = http_buffer.size;
1032
              "Connection: close\r\n"
1014
   Buffer_Initialize (&temp_buffer);
1033
              "\r\n"
1015
   Buffer_WriteAt (&temp_buffer, 256, "", 1); // make sure buffer is big enough
1034
              "registrant=%s&version=%s&player1=%c&player2=%c&board=%s&log=%s&description=%s", length,
1016
   temp_buffer.size = sprintf_s (temp_buffer.data, temp_buffer.size,
1035
              user_email, // registrant=
1017
                                 "POST /chess/sendcrash.php HTTP/1.1"                 "\r\n"
1036
              program_version, // &version=
1018
                                 "Host: "         "pmbaty.com"                        "\r\n"
1037
              (the_board.players[COLOR_WHITE].type == PLAYER_INTERNET ? 'I' : (the_board.players[COLOR_WHITE].type == PLAYER_COMPUTER ? 'C' : 'H')), // &player1=
1019
                                 "Content-Type: " "application/x-www-form-urlencoded" "\r\n"
1038
              (the_board.players[COLOR_BLACK].type == PLAYER_INTERNET ? 'I' : (the_board.players[COLOR_BLACK].type == PLAYER_COMPUTER ? 'C' : 'H')), // &player2=
1020
                                 "Content-Length: %d"                                 "\r\n"
1039
              board_base64buffer, // &board=
1021
                                 "Connection: "   "close"                             "\r\n"
1040
              log_base64buffer, // &log=
1022
                                 "\r\n", length);
1041
              description_base64buffer); // &description=
1023
   Buffer_PrependBuffer (&http_buffer, &temp_buffer);
1042
   length = strlen (http_buffer);
1024
   Buffer_Forget (&temp_buffer);
1043
   write_index = send (s, http_buffer, length, 0); // send the HTTP query
1025
   write_index = send (s, http_buffer.data, http_buffer.size, 0); // send the HTTP query
1044
   if (write_index != length)
1026
   if (write_index != http_buffer.size)
1045
   {
1027
   {
1046
      closesocket (s); // finished communicating, close TCP socket
1028
      closesocket (s); // finished communicating, close TCP socket
1047
      return (false); // couldn't resolve hostname, return an error condition
1029
      return (false); // couldn't resolve hostname, return an error condition
1048
   }
1030
   }
1049
 
1031
 
1050
   // read the reply (10 seconds timeout)
1032
   // read the reply (10 seconds timeout)
1051
   http_buffer[0] = 0;
1033
   http_buffer.data[0] = 0;
1052
   read_index = RecvWithTimeout (s, 10.0f, http_buffer, sizeof (http_buffer), 0);
1034
   read_index = RecvWithTimeout (s, 10.0f, http_buffer.data, http_buffer.size, 0);
1053
   if (read_index < 1)
1035
   if (read_index < 1)
1054
   {
1036
   {
1055
      closesocket (s); // finished communicating, close TCP socket
1037
      closesocket (s); // finished communicating, close TCP socket
1056
      return (false); // couldn't resolve hostname, return an error condition
1038
      return (false); // couldn't resolve hostname, return an error condition
1057
   }
1039
   }
1058
 
1040
 
1059
   closesocket (s); // finished communicating, close TCP socket
1041
   closesocket (s); // finished communicating, close TCP socket
1060
 
1042
 
1061
   // terminate recv buffer ourselves
1043
   // terminate recv buffer ourselves and see if the server accepted our post
1062
   http_buffer[read_index] = 0;
1044
   http_buffer.data[read_index] = 0;
1063
 
-
 
1064
   //MessageBoxA (NULL, http_buffer, "HTTP response", MB_OK);
1045
   //MessageBoxA (NULL, http_buffer, "HTTP response", MB_OK);
-
 
1046
   was_successful = (strstr (http_buffer.data, "Success") != NULL);
-
 
1047
   Buffer_Forget (&http_buffer);
-
 
1048
 
1065
   return (strstr (http_buffer, "Success") != NULL); // and return whether the server accepted our post
1049
   return (was_successful); // and return whether the server accepted our post
1066
}
1050
}
1067
 
1051
 
1068
 
1052
 
1069
int RecvWithTimeout (int socket_id, float timeout_in_seconds, char *outbuf, size_t outbuf_size, int flags)
1053
int RecvWithTimeout (int socket_id, float timeout_in_seconds, char *outbuf, size_t outbuf_size, int flags)
1070
{
1054
{