gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet] 01/04: MESSENGER: Fix latest hash on client side


From: gnunet
Subject: [gnunet] 01/04: MESSENGER: Fix latest hash on client side
Date: Fri, 17 Nov 2023 00:59:46 +0100

This is an automated email from the git hooks/post-receive script.

thejackimonster pushed a commit to branch master
in repository gnunet.

commit 1208ddb1af5466a74549db2ca2cefb4f0d3d7f10
Author: TheJackiMonster <thejackimonster@gmail.com>
AuthorDate: Thu Nov 16 23:20:03 2023 +0100

    MESSENGER: Fix latest hash on client side
    
    Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
 po/POTFILES.in                                     |   6 --
 src/include/gnunet_messenger_service.h             |   5 +
 src/include/gnunet_protocols.h                     |   2 +
 src/service/messenger/gnunet-service-messenger.c   |  47 ++++++++-
 src/service/messenger/gnunet-service-messenger.h   |   1 +
 .../messenger/gnunet-service-messenger_handle.c    |  27 +++++-
 .../messenger/gnunet-service-messenger_handle.h    |  21 +++-
 .../gnunet-service-messenger_message_send.c        |   2 +-
 .../messenger/gnunet-service-messenger_room.c      |  24 +++--
 .../messenger/gnunet-service-messenger_service.c   |   3 +-
 src/service/messenger/messenger_api.c              | 108 +++++++++++++++++----
 .../messenger/messenger_api_queue_messages.c       |   8 +-
 .../messenger/messenger_api_queue_messages.h       |   7 +-
 src/service/messenger/messenger_api_room.c         |   6 +-
 src/service/messenger/messenger_api_room.h         |   1 +
 15 files changed, 222 insertions(+), 46 deletions(-)

diff --git a/po/POTFILES.in b/po/POTFILES.in
index 82fd70f3c..06cff2846 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -340,10 +340,8 @@ src/service/identity/gnunet-service-identity.c
 src/service/identity/identity_api.c
 src/service/identity/identity_api_lookup.c
 src/service/identity/identity_api_suffix_lookup.c
-src/service/messenger/gnunet-messenger.c
 src/service/messenger/gnunet-service-messenger.c
 src/service/messenger/gnunet-service-messenger_basement.c
-src/service/messenger/gnunet-service-messenger_ego_store.c
 src/service/messenger/gnunet-service-messenger_handle.c
 src/service/messenger/gnunet-service-messenger_list_handles.c
 src/service/messenger/gnunet-service-messenger_list_messages.c
@@ -372,9 +370,6 @@ src/service/messenger/messenger_api_peer_store.c
 src/service/messenger/messenger_api_queue_messages.c
 src/service/messenger/messenger_api_room.c
 src/service/messenger/messenger_api_util.c
-src/service/messenger/plugin_gnsrecord_messenger.c
-src/service/messenger/testing_messenger_barrier.c
-src/service/messenger/testing_messenger_setup.c
 src/service/namecache/gnunet-service-namecache.c
 src/service/namecache/namecache_api.c
 src/service/namestore/gnunet-namestore-fcfsd.c
@@ -500,7 +495,6 @@ src/service/vpn/gnunet-helper-vpn.c
 src/service/vpn/gnunet-service-vpn.c
 src/service/vpn/vpn_api.c
 src/service/zonemaster/gnunet-service-zonemaster.c
-src/util/gnunet_error_codes.c
 src/include/gnunet_json_lib.h
 src/include/gnunet_pq_lib.h
 src/lib/pq/pq.h
diff --git a/src/include/gnunet_messenger_service.h 
b/src/include/gnunet_messenger_service.h
index 0388b7fb2..9e389350a 100644
--- a/src/include/gnunet_messenger_service.h
+++ b/src/include/gnunet_messenger_service.h
@@ -557,6 +557,11 @@ enum GNUNET_MESSENGER_MessageFlags
    * The peer flag. The flag indicates that the message was sent by a peer and 
not a member.
    */
   GNUNET_MESSENGER_FLAG_PEER = 4,
+
+  /**
+   * The recent flag. The flag indicates that the message was recently handled 
by the service.
+   */
+  GNUNET_MESSENGER_FLAG_RECENT = 8,
 };
 
 /**
diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h
index 99a1adcf4..0daa37bed 100644
--- a/src/include/gnunet_protocols.h
+++ b/src/include/gnunet_protocols.h
@@ -3580,6 +3580,8 @@ extern "C" {
 
 #define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE 1616
 
+#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SYNC 1617
+
 
/*********************************************************************************/
 
 
/*********************************************************************************/
diff --git a/src/service/messenger/gnunet-service-messenger.c 
b/src/service/messenger/gnunet-service-messenger.c
index a6bc41c78..8e9805ff0 100644
--- a/src/service/messenger/gnunet-service-messenger.c
+++ b/src/service/messenger/gnunet-service-messenger.c
@@ -139,6 +139,10 @@ handle_room_open (void *cls,
 
   if (GNUNET_YES == open_srv_handle_room (msg_client->handle, &(msg->key)))
   {
+    struct GNUNET_HashCode prev;
+    sync_srv_handle_messages(msg_client->handle, &(msg->key), &(msg->previous),
+                             &prev);
+
     const struct GNUNET_ShortHashCode *member_id = get_srv_handle_member_id (
       msg_client->handle, &(msg->key));
 
@@ -149,7 +153,8 @@ handle_room_open (void *cls,
     struct GNUNET_MQ_Envelope *env;
 
     env = GNUNET_MQ_msg (response, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN);
-    GNUNET_memcpy (&(response->key), &(msg->key), sizeof(msg->key));
+    GNUNET_memcpy (&(response->key), &(msg->key), sizeof(response->key));
+    GNUNET_memcpy(&(response->previous), &prev, sizeof(response->previous));
     GNUNET_MQ_send (msg_client->handle->mq, env);
   }
   else
@@ -182,6 +187,10 @@ handle_room_entry (void *cls,
   if (GNUNET_YES == entry_srv_handle_room (msg_client->handle, &(msg->door),
                                            &(msg->key)))
   {
+    struct GNUNET_HashCode prev;
+    sync_srv_handle_messages(msg_client->handle, &(msg->key), &(msg->previous),
+                             &prev);
+
     const struct GNUNET_ShortHashCode *member_id = get_srv_handle_member_id (
       msg_client->handle, &(msg->key));
 
@@ -192,8 +201,9 @@ handle_room_entry (void *cls,
     struct GNUNET_MQ_Envelope *env;
 
     env = GNUNET_MQ_msg (response, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY);
-    GNUNET_memcpy (&(response->door), &(msg->door), sizeof(msg->door));
-    GNUNET_memcpy (&(response->key), &(msg->key), sizeof(msg->key));
+    GNUNET_memcpy (&(response->door), &(msg->door), sizeof(response->door));
+    GNUNET_memcpy (&(response->key), &(msg->key), sizeof(response->key));
+    GNUNET_memcpy(&(response->previous), &prev, sizeof(response->previous));
     GNUNET_MQ_send (msg_client->handle->mq, env);
   }
   else
@@ -223,7 +233,8 @@ handle_room_close (void *cls,
     struct GNUNET_MQ_Envelope *env;
 
     env = GNUNET_MQ_msg (response, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE);
-    GNUNET_memcpy (&(response->key), &(msg->key), sizeof(msg->key));
+    GNUNET_memcpy (&(response->key), &(msg->key), sizeof(response->key));
+    GNUNET_memcpy (&(response->previous), &(msg->previous), 
sizeof(response->previous));
     GNUNET_MQ_send (msg_client->handle->mq, env);
   }
   else
@@ -233,6 +244,30 @@ handle_room_close (void *cls,
   GNUNET_SERVICE_client_continue (msg_client->client);
 }
 
+static void
+handle_room_sync (void *cls,
+                  const struct GNUNET_MESSENGER_RoomMessage *msg)
+{
+  struct GNUNET_MESSENGER_Client *msg_client = cls;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Syncing room: %s\n", GNUNET_h2s (
+                &(msg->key)));
+
+  struct GNUNET_HashCode prev;
+  sync_srv_handle_messages(msg_client->handle, &(msg->key), &(msg->previous),
+                           &prev);
+
+  struct GNUNET_MESSENGER_RoomMessage *response;
+  struct GNUNET_MQ_Envelope *env;
+
+  env = GNUNET_MQ_msg (response, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SYNC);
+  GNUNET_memcpy (&(response->key), &(msg->key), sizeof(response->key));
+  GNUNET_memcpy (&(response->previous), &prev, sizeof(response->previous));
+  GNUNET_MQ_send (msg_client->handle->mq, env);
+
+  GNUNET_SERVICE_client_continue (msg_client->client);
+}
+
 
 static int
 check_send_message (void *cls,
@@ -346,7 +381,7 @@ callback_found_message (void *cls,
   }
 
   notify_srv_handle_message (msg_client->handle, room, &session, message,
-                             hash);
+                             hash, GNUNET_NO);
 }
 
 
@@ -492,4 +527,6 @@ GNUNET_SERVICE_MAIN (
                            GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE,
                            struct
                            GNUNET_MESSENGER_GetMessage, NULL),
+  GNUNET_MQ_hd_fixed_size (room_sync, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SYNC,
+                           struct GNUNET_MESSENGER_RoomMessage, NULL),
   GNUNET_MQ_handler_end ());
diff --git a/src/service/messenger/gnunet-service-messenger.h 
b/src/service/messenger/gnunet-service-messenger.h
index a3e683ecd..2c673d5f0 100644
--- a/src/service/messenger/gnunet-service-messenger.h
+++ b/src/service/messenger/gnunet-service-messenger.h
@@ -81,6 +81,7 @@ struct GNUNET_MESSENGER_RoomMessage
 
   struct GNUNET_PeerIdentity door;
   struct GNUNET_HashCode key;
+  struct GNUNET_HashCode previous;
 };
 
 /**
diff --git a/src/service/messenger/gnunet-service-messenger_handle.c 
b/src/service/messenger/gnunet-service-messenger_handle.c
index 84b89f431..f5d918636 100644
--- a/src/service/messenger/gnunet-service-messenger_handle.c
+++ b/src/service/messenger/gnunet-service-messenger_handle.c
@@ -342,6 +342,27 @@ close_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle 
*handle,
 }
 
 
+void
+sync_srv_handle_messages (struct GNUNET_MESSENGER_SrvHandle *handle,
+                          const struct GNUNET_HashCode *key,
+                          const struct GNUNET_HashCode *prev,
+                          struct GNUNET_HashCode *hash)
+{
+  GNUNET_assert ((handle) && (key) && (prev) && (hash));
+
+  struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (handle->service, 
key);
+
+  if ((! room) || (! get_srv_handle_member_id (handle, key)))
+  {
+    GNUNET_memcpy (hash, prev, sizeof(*hash));
+    return;
+  }
+
+  merge_srv_room_last_messages (room, handle);
+  get_message_state_chain_hash (&(room->state), hash);
+}
+
+
 int
 send_srv_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle,
                          const struct GNUNET_HashCode *key,
@@ -435,7 +456,8 @@ notify_srv_handle_message (struct 
GNUNET_MESSENGER_SrvHandle *handle,
                            struct GNUNET_MESSENGER_SrvRoom *room,
                            const struct GNUNET_MESSENGER_SenderSession 
*session,
                            const struct GNUNET_MESSENGER_Message *message,
-                           const struct GNUNET_HashCode *hash)
+                           const struct GNUNET_HashCode *hash,
+                           enum GNUNET_GenericReturnValue recent)
 {
   GNUNET_assert ((handle) && (room) && (session) && (message) && (hash));
 
@@ -490,6 +512,9 @@ notify_srv_handle_message (struct 
GNUNET_MESSENGER_SrvHandle *handle,
   else if (get_handle_member_session (handle, room, key) == session->member)
     msg->flags |= (uint32_t) GNUNET_MESSENGER_FLAG_SENT;
 
+  if (GNUNET_YES == recent)
+    msg->flags |= (uint32_t) GNUNET_MESSENGER_FLAG_RECENT;
+
   char *buffer = ((char*) msg) + sizeof(*msg);
   encode_message (message, length, buffer, GNUNET_YES);
 
diff --git a/src/service/messenger/gnunet-service-messenger_handle.h 
b/src/service/messenger/gnunet-service-messenger_handle.h
index 4963d9247..77539a32e 100644
--- a/src/service/messenger/gnunet-service-messenger_handle.h
+++ b/src/service/messenger/gnunet-service-messenger_handle.h
@@ -167,6 +167,23 @@ int
 close_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle,
                        const struct GNUNET_HashCode *key);
 
+/**
+ * Returns the latest merged hash from a room of a given <i>handle</i> using a 
specific <i>key</i>
+ * and the handles own latest known <i>hash</i> of a message. If the room does 
not contain other
+ * messages being accessible to the handle and older than the provided hash, 
the function returns
+ * the originally provided hash as fallback.
+ *
+ * @param[in,out] handle Handle
+ * @param[in] key Key of a room
+ * @param[in] prev Known hash of a message
+ * @param[out] hash Hash of the latest merged message in a room available to 
the handle
+ */
+void
+sync_srv_handle_messages (struct GNUNET_MESSENGER_SrvHandle *handle,
+                          const struct GNUNET_HashCode *key,
+                          const struct GNUNET_HashCode *prev,
+                          struct GNUNET_HashCode *hash);
+
 /**
  * Sends a <i>message</i> from a given <i>handle</i> to the room using a 
specific <i>key</i>.
  *
@@ -188,13 +205,15 @@ send_srv_handle_message (struct 
GNUNET_MESSENGER_SrvHandle *handle,
  * @param[in] session Sender session
  * @param[in] message Message
  * @param[in] hash Hash of message
+ * @param[in] recent Whether the message was recently handled
  */
 void
 notify_srv_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle,
                            struct GNUNET_MESSENGER_SrvRoom *room,
                            const struct GNUNET_MESSENGER_SenderSession 
*session,
                            const struct GNUNET_MESSENGER_Message *message,
-                           const struct GNUNET_HashCode *hash);
+                           const struct GNUNET_HashCode *hash,
+                           enum GNUNET_GenericReturnValue recent);
 
 /**
  * Notifies the handle that a new member id needs to be used.
diff --git a/src/service/messenger/gnunet-service-messenger_message_send.c 
b/src/service/messenger/gnunet-service-messenger_message_send.c
index a616355eb..fbb8215c2 100644
--- a/src/service/messenger/gnunet-service-messenger_message_send.c
+++ b/src/service/messenger/gnunet-service-messenger_message_send.c
@@ -80,7 +80,7 @@ notify_about_members (struct GNUNET_MESSENGER_MemberNotify 
*notify,
     sender.member = session;
 
     notify_srv_handle_message (notify->handle, notify->room, &sender, message,
-                               &(element->hash));
+                               &(element->hash), GNUNET_NO);
   }
 }
 
diff --git a/src/service/messenger/gnunet-service-messenger_room.c 
b/src/service/messenger/gnunet-service-messenger_room.c
index f08bfb402..7a7c9262a 100644
--- a/src/service/messenger/gnunet-service-messenger_room.c
+++ b/src/service/messenger/gnunet-service-messenger_room.c
@@ -238,7 +238,8 @@ callback_room_connect (void *cls,
 static int
 join_room (struct GNUNET_MESSENGER_SrvRoom *room,
            struct GNUNET_MESSENGER_SrvHandle *handle,
-           struct GNUNET_MESSENGER_Member *member)
+           struct GNUNET_MESSENGER_Member *member,
+           const struct GNUNET_ShortHashCode *id)
 {
   GNUNET_assert ((room) && (handle) && (member));
 
@@ -252,7 +253,13 @@ join_room (struct GNUNET_MESSENGER_SrvRoom *room,
                                                 member_id))
     return GNUNET_NO;
 
-  notify_srv_handle_member_id (handle, room, member_id, GNUNET_YES);
+  enum GNUNET_GenericReturnValue reset;
+  if ((!id) || (0 != GNUNET_memcmp(id, member_id)))
+    reset = GNUNET_YES;
+  else
+    reset = GNUNET_NO;
+
+  notify_srv_handle_member_id (handle, room, member_id, reset);
   return GNUNET_YES;
 }
 
@@ -269,7 +276,7 @@ join_room_locally (struct GNUNET_MESSENGER_SrvRoom *room,
   struct GNUNET_MESSENGER_Member *member = add_store_member (member_store,
                                                              member_id);
 
-  if (GNUNET_NO == join_room (room, handle, member))
+  if (GNUNET_NO == join_room (room, handle, member, member_id))
     return GNUNET_NO;
 
   return GNUNET_YES;
@@ -329,7 +336,8 @@ open_srv_room (struct GNUNET_MESSENGER_SrvRoom *room,
   struct GNUNET_MESSENGER_Member *member = add_store_member (member_store,
                                                              member_id);
 
-  if ((GNUNET_NO == join_room (room, handle, member)) && (room->port))
+  if ((GNUNET_NO == join_room (room, handle, member, member_id)) &&
+      (room->port))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                 "You could not join the room, therefore it keeps closed!\n");
@@ -507,10 +515,6 @@ send_srv_room_message (struct GNUNET_MESSENGER_SrvRoom 
*room,
   if (! message)
     return GNUNET_NO;
 
-  if (GNUNET_YES == is_message_session_bound (message))
-    merge_srv_room_last_messages (room, handle);
-
-
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Sending message from handle in room: %s (%s)\n",
               GNUNET_h2s (&(room->key)),
@@ -626,6 +630,10 @@ merge_srv_room_last_messages (struct 
GNUNET_MESSENGER_SrvRoom *room,
   if (! handle)
     return;
 
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Merging messages by handle in room: %s\n",
+              GNUNET_h2s (&(room->key)));
+
   const struct GNUNET_HashCode *hash;
 
 merge_next:
diff --git a/src/service/messenger/gnunet-service-messenger_service.c 
b/src/service/messenger/gnunet-service-messenger_service.c
index b72bbd201..63d487db9 100644
--- a/src/service/messenger/gnunet-service-messenger_service.c
+++ b/src/service/messenger/gnunet-service-messenger_service.c
@@ -348,7 +348,8 @@ handle_service_message (struct GNUNET_MESSENGER_Service 
*service,
 
   while (element)
   {
-    notify_srv_handle_message (element->handle, room, session, message, hash);
+    notify_srv_handle_message (element->handle, room, session, message, hash,
+                               GNUNET_YES);
     element = element->next;
   }
 }
diff --git a/src/service/messenger/messenger_api.c 
b/src/service/messenger/messenger_api.c
index a5b2d7687..c922e8b78 100644
--- a/src/service/messenger/messenger_api.c
+++ b/src/service/messenger/messenger_api.c
@@ -86,6 +86,7 @@ handle_room_open (void *cls,
   struct GNUNET_MESSENGER_Handle *handle = cls;
 
   const struct GNUNET_HashCode *key = &(msg->key);
+  const struct GNUNET_HashCode *prev = &(msg->previous);
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Opened room: %s\n", GNUNET_h2s (key));
 
@@ -93,8 +94,12 @@ handle_room_open (void *cls,
 
   struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
 
-  if (room)
-    dequeue_messages_from_room (room);
+  if (! room)
+    return;
+
+  GNUNET_memcpy(&(room->last_message), prev, sizeof(room->last_message));
+
+  dequeue_messages_from_room (room);
 }
 
 
@@ -106,6 +111,7 @@ handle_room_entry (void *cls,
 
   const struct GNUNET_PeerIdentity *door = &(msg->door);
   const struct GNUNET_HashCode *key = &(msg->key);
+  const struct GNUNET_HashCode *prev = &(msg->previous);
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Entered room: %s\n", GNUNET_h2s (key));
 
@@ -113,8 +119,12 @@ handle_room_entry (void *cls,
 
   struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
 
-  if (room)
-    dequeue_messages_from_room (room);
+  if (! room)
+    return;
+
+  GNUNET_memcpy(&(room->last_message), prev, sizeof(room->last_message));
+
+  dequeue_messages_from_room (room);
 }
 
 
@@ -125,11 +135,12 @@ handle_room_close (void *cls,
   struct GNUNET_MESSENGER_Handle *handle = cls;
 
   const struct GNUNET_HashCode *key = &(msg->key);
+  const struct GNUNET_HashCode *prev = &(msg->previous);
 
   struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
 
   if (room)
-    dequeue_messages_from_room (room);
+    GNUNET_memcpy(&(room->last_message), prev, sizeof(room->last_message));
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Closed room: %s\n", GNUNET_h2s (key));
 
@@ -137,6 +148,28 @@ handle_room_close (void *cls,
 }
 
 
+static void
+handle_room_sync (void *cls,
+                  const struct GNUNET_MESSENGER_RoomMessage *msg)
+{
+  struct GNUNET_MESSENGER_Handle *handle = cls;
+
+  const struct GNUNET_HashCode *key = &(msg->key);
+  const struct GNUNET_HashCode *prev = &(msg->previous);
+
+  struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
+
+  if (!room)
+    return;
+
+  GNUNET_memcpy(&(room->last_message), prev, sizeof(room->last_message));
+
+  room->wait_for_sync = GNUNET_NO;
+
+  dequeue_messages_from_room (room);
+}
+
+
 static void
 enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room,
                          struct GNUNET_MESSENGER_Message *message);
@@ -164,18 +197,13 @@ handle_member_id (void *cls,
   }
 
   struct GNUNET_MESSENGER_Message *message;
-  switch (reset)
+  if ((! get_room_sender_id (room)) || (GNUNET_YES == reset))
   {
-  case GNUNET_YES:
     set_room_sender_id (room, id);
     message = create_message_join (get_handle_key (handle));
-    break;
-  case GNUNET_NO:
-    message = create_message_id (id);
-    break;
-  default:
-    break;
   }
+  else
+    message = create_message_id (id);
 
   if (! message)
     return;
@@ -356,6 +384,7 @@ send_open_room (struct GNUNET_MESSENGER_Handle *handle,
   env = GNUNET_MQ_msg_extra (msg, len > 0 ? len : 0,
                              GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN);
   GNUNET_memcpy (&(msg->key), &(room->key), sizeof(msg->key));
+  GNUNET_memcpy(&(msg->previous), &(room->last_message), 
sizeof(msg->previous));
 
   char *msg_buffer = ((char*) msg) + sizeof(*msg);
 
@@ -387,6 +416,7 @@ send_enter_room (struct GNUNET_MESSENGER_Handle *handle,
                              GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY);
   GNUNET_memcpy (&(msg->door), door, sizeof(*door));
   GNUNET_memcpy (&(msg->key), &(room->key), sizeof(msg->key));
+  GNUNET_memcpy(&(msg->previous), &(room->last_message), 
sizeof(msg->previous));
 
   char *msg_buffer = ((char*) msg) + sizeof(*msg);
 
@@ -408,7 +438,31 @@ send_close_room (struct GNUNET_MESSENGER_Handle *handle,
               GNUNET_h2s (&(room->key)));
 
   env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE);
+
   GNUNET_memcpy (&(msg->key), &(room->key), sizeof(msg->key));
+  GNUNET_memcpy(&(msg->previous), &(room->last_message), 
sizeof(msg->previous));
+
+  GNUNET_MQ_send (handle->mq, env);
+}
+
+
+static void
+send_sync_room (struct GNUNET_MESSENGER_Handle *handle,
+                struct GNUNET_MESSENGER_Room *room)
+{
+  struct GNUNET_MESSENGER_RoomMessage *msg;
+  struct GNUNET_MQ_Envelope *env;
+
+  room->wait_for_sync = GNUNET_YES;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sync room (%s)!\n",
+              GNUNET_h2s (&(room->key)));
+
+  env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SYNC);
+
+  GNUNET_memcpy (&(msg->key), &(room->key), sizeof(msg->key));
+  GNUNET_memcpy(&(msg->previous), &(room->last_message), 
sizeof(msg->previous));
+
   GNUNET_MQ_send (handle->mq, env);
 }
 
@@ -529,6 +583,11 @@ reconnect (struct GNUNET_MESSENGER_Handle *handle)
       GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE,
       struct GNUNET_MESSENGER_GetMessage, handle
       ),
+    GNUNET_MQ_hd_fixed_size (
+      room_sync,
+      GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SYNC,
+      struct GNUNET_MESSENGER_RoomMessage, handle
+      ),
     GNUNET_MQ_handler_end ()
   };
 
@@ -635,14 +694,27 @@ enqueue_message_to_room (struct GNUNET_MESSENGER_Room 
*room,
                          struct GNUNET_MESSENGER_Message *message)
 {
   const struct GNUNET_CRYPTO_PrivateKey *key = get_handle_key (room->handle);
+  enum GNUNET_GenericReturnValue priority;
 
-  if (GNUNET_YES == is_room_available (room))
+  switch (message->header.kind)
   {
-    send_message_to_room (room, message, key);
-    dequeue_messages_from_room (room);
+  case GNUNET_MESSENGER_KIND_JOIN:
+    priority = GNUNET_YES;
+    break;
+  default:
+    priority = GNUNET_NO;
+    break;
   }
-  else
-    enqueue_to_messages (&(room->queue), key, message);
+
+  enqueue_to_messages (&(room->queue), key, message, priority);
+
+  if (GNUNET_YES != is_room_available (room))
+    return;
+
+  if (GNUNET_YES == is_message_session_bound (message))
+    send_sync_room (room->handle, room);
+  else if (GNUNET_YES != room->wait_for_sync)
+    dequeue_messages_from_room (room);
 }
 
 
diff --git a/src/service/messenger/messenger_api_queue_messages.c 
b/src/service/messenger/messenger_api_queue_messages.c
index f6a69366c..cda5e5629 100644
--- a/src/service/messenger/messenger_api_queue_messages.c
+++ b/src/service/messenger/messenger_api_queue_messages.c
@@ -60,7 +60,8 @@ clear_queue_messages (struct GNUNET_MESSENGER_QueueMessages 
*messages)
 void
 enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
                      const struct GNUNET_CRYPTO_PrivateKey *sender,
-                     const struct GNUNET_MESSENGER_Message *message)
+                     const struct GNUNET_MESSENGER_Message *message,
+                     enum GNUNET_GenericReturnValue priority)
 {
   GNUNET_assert ((messages) && (message));
 
@@ -81,7 +82,10 @@ enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages 
*messages,
     return;
   }
 
-  GNUNET_CONTAINER_DLL_insert_tail (messages->head, messages->tail, element);
+  if (GNUNET_YES == priority)
+    GNUNET_CONTAINER_DLL_insert (messages->head, messages->tail, element);
+  else
+    GNUNET_CONTAINER_DLL_insert_tail (messages->head, messages->tail, element);
 }
 
 
diff --git a/src/service/messenger/messenger_api_queue_messages.h 
b/src/service/messenger/messenger_api_queue_messages.h
index e0b6010fa..5ba204153 100644
--- a/src/service/messenger/messenger_api_queue_messages.h
+++ b/src/service/messenger/messenger_api_queue_messages.h
@@ -64,16 +64,19 @@ void
 clear_queue_messages (struct GNUNET_MESSENGER_QueueMessages *messages);
 
 /**
- * Adds a specific <i>message</i> to the end of the queue.
+ * Adds a specific <i>message</i> to the end or the beginning of
+ * the queue depending on its <i>priority</i>.
  *
  * @param[in,out] messages Queue of messages
  * @param[in] sender Private sender key
  * @param[in] message Message
+ * @param[in] priority Whether the message has priority
  */
 void
 enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
                      const struct GNUNET_CRYPTO_PrivateKey *sender,
-                     const struct GNUNET_MESSENGER_Message *message);
+                     const struct GNUNET_MESSENGER_Message *message,
+                     enum GNUNET_GenericReturnValue priority);
 
 /**
  * Remove the message from the front of the queue and returns it.
diff --git a/src/service/messenger/messenger_api_room.c 
b/src/service/messenger/messenger_api_room.c
index 2c8b27bf8..1aca8a7d5 100644
--- a/src/service/messenger/messenger_api_room.c
+++ b/src/service/messenger/messenger_api_room.c
@@ -44,6 +44,8 @@ create_room (struct GNUNET_MESSENGER_Handle *handle,
 
   room->opened = GNUNET_NO;
   room->use_handle_name = GNUNET_YES;
+  room->wait_for_sync = GNUNET_NO;
+
   room->sender_id = NULL;
 
   init_list_tunnels (&(room->entries));
@@ -404,7 +406,9 @@ handle_room_message (struct GNUNET_MESSENGER_Room *room,
     GNUNET_free (entry);
   }
 
-  GNUNET_memcpy (&(room->last_message), hash, sizeof(room->last_message));
+  if (flags & GNUNET_MESSENGER_FLAG_RECENT)
+    GNUNET_memcpy (&(room->last_message), hash, sizeof(room->last_message));
+
   return sender;
 }
 
diff --git a/src/service/messenger/messenger_api_room.h 
b/src/service/messenger/messenger_api_room.h
index c9d36a410..2504a51dd 100644
--- a/src/service/messenger/messenger_api_room.h
+++ b/src/service/messenger/messenger_api_room.h
@@ -51,6 +51,7 @@ struct GNUNET_MESSENGER_Room
 
   enum GNUNET_GenericReturnValue opened;
   enum GNUNET_GenericReturnValue use_handle_name;
+  enum GNUNET_GenericReturnValue wait_for_sync;
 
   struct GNUNET_ShortHashCode *sender_id;
 

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]