home · contact · privacy
On world (re-)generation, server sends 'NEW_WORLD', client clears log.
[plomrogue] / src / client / io.c
index 69a0865276e0636799da579518e0145728caba30..45008155098ac03150c1ad53bf6a9ea8f503866c 100644 (file)
@@ -75,18 +75,13 @@ static FILE * changed_worldstate_file(char * path);
  */
 static uint8_t read_worldstate();
 
-/* If "last_server_answer_time" is too old, send a PING to the server; or, if a
- * previous PING has not sparked any answer after a while, abort the client.
+/* Poll server for queue input. If no new input, send ping, or, if ping already
+ * sent but unanswered for some time, abort.
  */
-static void ping_pong_test(time_t last_server_answer_time);
+static void test_and_poll_server();
 
-/* Read server's out file into queue, update "last_server_answer_time" if new
- * stuff is found there.
- */
-static void try_growing_queue(time_t * last_server_answer_time);
-
-/* Read server out file for messages, act on them (i.e. derive log messages). */
-static uint8_t read_outfile();
+/* Read messages from queue, act on them. */
+static uint8_t read_queue();
 
 
 
@@ -209,9 +204,15 @@ static uint8_t read_worldstate()
 
 
 
-static void ping_pong_test(time_t last_server_answer_time)
+static void test_and_poll_server()
 {
+    static time_t last_server_answer_time = 0;
     static uint8_t ping_sent = 0;
+    if (read_file_into_queue(world.file_server_out, &world.queue))
+    {
+        last_server_answer_time = time(0);
+        return;
+    }
     time_t now = time(0);
     if (ping_sent && last_server_answer_time > now - 3)  /* Re-set if last    */
     {                                                    /* ping was answered */
@@ -229,24 +230,21 @@ static void ping_pong_test(time_t last_server_answer_time)
 
 
 
-static void try_growing_queue(time_t * last_server_answer_time)
-{
-    if (read_file_into_queue(world.file_server_out, &world.queue))
-    {
-        * last_server_answer_time = time(0);
-    }
-}
-
-
-
-static uint8_t read_outfile()
+static uint8_t read_queue()
 {
     uint8_t ret = 0;
     char * msg;
     while (NULL != (msg = get_message_from_queue(&world.queue)))
     {
         char * log_prefix = "LOG ";
-        if (!strncmp(msg, log_prefix, strlen(log_prefix)))
+        char * new_world = "NEW_WORLD";
+        if (!strcmp(msg, new_world))
+        {
+            ret = 1;
+            free(world.log);
+            world.log = NULL;
+        }
+        else if (!strncmp(msg, log_prefix, strlen(log_prefix)))
         {
             ret = 1;
             char * log_msg = msg + strlen(log_prefix);
@@ -284,22 +282,20 @@ extern void send(char * msg)
 
 extern char * io_loop()
 {
-    world.halfdelay = 1;         /* Ensures read_worldstate() is only called  */
-    halfdelay(world.halfdelay);  /* 10 times a second during user inactivity. */
+    world.halfdelay = 1;             /* Ensure server is polled only 10 times */
+    halfdelay(world.halfdelay);      /* a second during user inactivity.      */
     uint8_t change_in_client = 0;
     uint16_t last_focused_turn = world.turn;
-    time_t last_server_answer_time = time(0);
     while (1)
     {
-        try_growing_queue(&last_server_answer_time);
-        ping_pong_test(last_server_answer_time);
+        test_and_poll_server();
         if (world.winch)
         {
             reset_windows_on_winch();
             world.winch = 0;
             change_in_client++;
         }
-        if (change_in_client || read_worldstate() || read_outfile())
+        if (change_in_client || read_worldstate() || read_queue())
         {
             if (world.turn != last_focused_turn && world.focus_each_turn)
             {