gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] branch master updated (6661c03ce -> 2dfa93626)


From: gnunet
Subject: [gnunet] branch master updated (6661c03ce -> 2dfa93626)
Date: Fri, 17 Nov 2023 00:59:45 +0100

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

thejackimonster pushed a change to branch master
in repository gnunet.

    from 6661c03ce -minor cleanup
     new 1208ddb1a MESSENGER: Fix latest hash on client side
     new dd96dc544 MESSENGER: Wait for leave message to close room
     new 70de9fb2c MESSENGER: Fix handle id initialization and add local 
contact id
     new 2dfa93626 MESSENGER: Uncrustify code

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 po/POTFILES.in                                     |   6 -
 src/include/gnunet_messenger_service.h             |  14 +++
 src/include/gnunet_protocols.h                     |   2 +
 src/service/messenger/gnunet-service-messenger.c   |  51 +++++++-
 src/service/messenger/gnunet-service-messenger.h   |   1 +
 .../messenger/gnunet-service-messenger_handle.c    | 102 +++++-----------
 .../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   |  76 +++++++++++-
 src/service/messenger/messenger_api.c              | 128 +++++++++++++++++----
 src/service/messenger/messenger_api_contact.c      |  13 ++-
 src/service/messenger/messenger_api_contact.h      |  14 ++-
 .../messenger/messenger_api_contact_store.c        |   6 +-
 .../messenger/messenger_api_contact_store.h        |   2 +
 src/service/messenger/messenger_api_message.c      |  66 +++++------
 .../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 +
 20 files changed, 390 insertions(+), 160 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..dbe2d6ced 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,
 };
 
 /**
@@ -778,6 +783,15 @@ GNUNET_MESSENGER_contact_get_name (const struct
 const struct GNUNET_CRYPTO_PublicKey*
 GNUNET_MESSENGER_contact_get_key (const struct GNUNET_MESSENGER_Contact 
*contact);
 
+/**
+ * Get the locally unique id of the <i>contact</i>.
+ *
+ * @param[in] contact Contact handle
+ * @return Locally unique contact id or zero
+ */
+size_t
+GNUNET_MESSENGER_contact_get_id (const struct GNUNET_MESSENGER_Contact 
*contact);
+
 /**
  * Send a <i>message</i> into a <i>room</i>. If you opened the <i>room</i> all 
entered members will receive the
  * <i>message</i>. If you entered the <i>room</i> through a <b>door</b> all so 
entered <b>doors</b> will receive the
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..b1521f4f8 100644
--- a/src/service/messenger/gnunet-service-messenger.c
+++ b/src/service/messenger/gnunet-service-messenger.c
@@ -114,7 +114,7 @@ initialize_handle_via_key (struct 
GNUNET_MESSENGER_SrvHandle *handle,
                   "Initialization failed while reading invalid key!\n");
   }
   else
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Initialization is missing key!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Initialization is missing key!\n");
 }
 
 
@@ -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,9 @@ 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
@@ -234,6 +246,31 @@ handle_room_close (void *cls,
 }
 
 
+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,
                     const struct GNUNET_MESSENGER_SendMessage *msg)
@@ -346,7 +383,7 @@ callback_found_message (void *cls,
   }
 
   notify_srv_handle_message (msg_client->handle, room, &session, message,
-                             hash);
+                             hash, GNUNET_NO);
 }
 
 
@@ -492,4 +529,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..4f15ad2f3 100644
--- a/src/service/messenger/gnunet-service-messenger_handle.c
+++ b/src/service/messenger/gnunet-service-messenger_handle.c
@@ -213,84 +213,12 @@ change_srv_handle_member_id (struct 
GNUNET_MESSENGER_SrvHandle *handle,
 }
 
 
-struct RoomInitializationClosure
-{
-  struct GNUNET_MESSENGER_SrvHandle *handle;
-  const struct GNUNET_HashCode *key;
-  const struct GNUNET_CRYPTO_PublicKey *pubkey;
-};
-
-static int
-find_member_session_in_room (void *cls,
-                             const struct GNUNET_CRYPTO_PublicKey *public_key,
-                             struct GNUNET_MESSENGER_MemberSession *session)
-{
-  struct RoomInitializationClosure *init = cls;
-
-  if (! public_key)
-    return GNUNET_YES;
-
-  const struct GNUNET_CRYPTO_PublicKey *pubkey = get_srv_handle_key (
-    init->handle);
-
-  if (0 != GNUNET_memcmp (pubkey, public_key))
-    return GNUNET_YES;
-
-  const struct GNUNET_ShortHashCode *id = get_member_session_id (session);
-
-  if (! id)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Initialitation: Missing member id!");
-    return GNUNET_NO;
-  }
-
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-              "Initialitation: Matching member found (%s)!\n",
-              GNUNET_sh2s (id));
-
-  change_srv_handle_member_id (init->handle, init->key, id);
-  return GNUNET_NO;
-}
-
-
-static void
-initialize_srv_handle_via_matching_member (struct
-                                           GNUNET_MESSENGER_SrvHandle *handle,
-                                           const struct GNUNET_HashCode *key)
-{
-  struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (handle->service,
-                                                            key);
-  if (! room)
-    return;
-
-  struct GNUNET_MESSENGER_MemberStore *store = get_srv_room_member_store 
(room);
-  if (! store)
-    return;
-
-  const struct GNUNET_CRYPTO_PublicKey *pubkey = get_srv_handle_key (handle);
-  if ((! pubkey) || (0 == GNUNET_memcmp (pubkey, get_anonymous_public_key ())))
-    return;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Initialize member id of handle via matching member in room!\n");
-
-  struct RoomInitializationClosure init;
-  init.handle = handle;
-  init.key = key;
-  init.pubkey = pubkey;
-
-  iterate_store_members (store, find_member_session_in_room, &init);
-}
-
-
 int
 open_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle,
                       const struct GNUNET_HashCode *key)
 {
   GNUNET_assert ((handle) && (key));
 
-  initialize_srv_handle_via_matching_member (handle, key);
-
   if ((! get_srv_handle_member_id (handle, key)) && (GNUNET_YES !=
                                                      create_handle_member_id (
                                                        handle, key)))
@@ -307,8 +235,6 @@ entry_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle 
*handle,
 {
   GNUNET_assert ((handle) && (door) && (key));
 
-  initialize_srv_handle_via_matching_member (handle, key);
-
   if ((! get_srv_handle_member_id (handle, key)) && (GNUNET_YES !=
                                                      create_handle_member_id (
                                                        handle, key)))
@@ -342,6 +268,28 @@ 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 +383,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 +439,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..49e202a5a 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..964707112 100644
--- a/src/service/messenger/gnunet-service-messenger_service.c
+++ b/src/service/messenger/gnunet-service-messenger_service.c
@@ -228,6 +228,72 @@ get_service_room (const struct GNUNET_MESSENGER_Service 
*service,
 }
 
 
+struct HandleInitializationClosure
+{
+  struct GNUNET_MESSENGER_SrvHandle *handle;
+  struct GNUNET_MESSENGER_SrvRoom *room;
+  const struct GNUNET_CRYPTO_PublicKey *pubkey;
+};
+
+static int
+find_member_session_in_room (void *cls,
+                             const struct GNUNET_CRYPTO_PublicKey *public_key,
+                             struct GNUNET_MESSENGER_MemberSession *session)
+{
+  struct HandleInitializationClosure *init = cls;
+
+  if (! public_key)
+    return GNUNET_YES;
+
+  const struct GNUNET_CRYPTO_PublicKey *pubkey = get_srv_handle_key (
+    init->handle);
+
+  if (0 != GNUNET_memcmp (pubkey, public_key))
+    return GNUNET_YES;
+
+  const struct GNUNET_ShortHashCode *id = get_member_session_id (session);
+
+  if (! id)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Initialitation: Missing member id!");
+    return GNUNET_NO;
+  }
+
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Initialitation: Matching member found (%s)!\n",
+              GNUNET_sh2s (id));
+
+  change_srv_handle_member_id (init->handle, get_srv_room_key (init->room), 
id);
+  return GNUNET_NO;
+}
+
+
+static void
+initialize_service_handle (struct GNUNET_MESSENGER_SrvHandle *handle,
+                           struct GNUNET_MESSENGER_SrvRoom *room)
+{
+  GNUNET_assert ((handle) && (room));
+
+  struct GNUNET_MESSENGER_MemberStore *store = get_srv_room_member_store 
(room);
+  if (! store)
+    return;
+
+  const struct GNUNET_CRYPTO_PublicKey *pubkey = get_srv_handle_key (handle);
+  if ((! pubkey) || (0 == GNUNET_memcmp (pubkey, get_anonymous_public_key ())))
+    return;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Initialize member id of handle via matching member in room!\n");
+
+  struct HandleInitializationClosure init;
+  init.handle = handle;
+  init.room = room;
+  init.pubkey = pubkey;
+
+  iterate_store_members (store, find_member_session_in_room, &init);
+}
+
+
 int
 open_service_room (struct GNUNET_MESSENGER_Service *service,
                    struct GNUNET_MESSENGER_SrvHandle *handle,
@@ -238,9 +304,13 @@ open_service_room (struct GNUNET_MESSENGER_Service 
*service,
   struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (service, key);
 
   if (room)
+  {
+    initialize_service_handle (handle, room);
     return open_srv_room (room, handle);
+  }
 
   room = create_srv_room (handle, key);
+  initialize_service_handle (handle, room);
 
   if ((GNUNET_YES == open_srv_room (room, handle)) &&
       (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (service->rooms,
@@ -265,6 +335,8 @@ entry_service_room (struct GNUNET_MESSENGER_Service 
*service,
 
   if (room)
   {
+    initialize_service_handle (handle, room);
+
     if (GNUNET_YES == enter_srv_room_at (room, handle, door))
       return GNUNET_YES;
     else
@@ -272,6 +344,7 @@ entry_service_room (struct GNUNET_MESSENGER_Service 
*service,
   }
 
   room = create_srv_room (handle, key);
+  initialize_service_handle (handle, room);
 
   if ((GNUNET_YES == enter_srv_room_at (room, handle, door)) &&
       (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (service->rooms,
@@ -348,7 +421,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..216dc313c 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,8 @@ 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 +417,8 @@ 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 +440,33 @@ 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 +587,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 ()
   };
 
@@ -627,6 +690,9 @@ send_message_to_room (struct GNUNET_MESSENGER_Room *room,
   GNUNET_memcpy (&(room->last_message), &hash, sizeof(room->last_message));
 
   GNUNET_MQ_send (room->handle->mq, env);
+
+  if (GNUNET_MESSENGER_KIND_LEAVE == message->header.kind)
+    send_close_room (room->handle, room);
 }
 
 
@@ -635,14 +701,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);
 }
 
 
@@ -852,8 +931,6 @@ GNUNET_MESSENGER_close_room (struct GNUNET_MESSENGER_Room 
*room)
     enqueue_message_to_room (room, message);
     destroy_message (message);
   }
-
-  send_close_room (room->handle, room);
 }
 
 
@@ -954,6 +1031,17 @@ GNUNET_MESSENGER_contact_get_key (const struct
 }
 
 
+size_t
+GNUNET_MESSENGER_contact_get_id (const struct
+                                 GNUNET_MESSENGER_Contact *contact)
+{
+  if (! contact)
+    return 0;
+
+  return get_contact_id (contact);
+}
+
+
 void
 GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room,
                                struct GNUNET_MESSENGER_Message *message,
diff --git a/src/service/messenger/messenger_api_contact.c 
b/src/service/messenger/messenger_api_contact.c
index 848a27b8f..47733fe07 100644
--- a/src/service/messenger/messenger_api_contact.c
+++ b/src/service/messenger/messenger_api_contact.c
@@ -27,7 +27,8 @@
 #include "messenger_api_contact.h"
 
 struct GNUNET_MESSENGER_Contact*
-create_contact (const struct GNUNET_CRYPTO_PublicKey *key)
+create_contact (const struct GNUNET_CRYPTO_PublicKey *key,
+                size_t unique_id)
 {
   GNUNET_assert (key);
 
@@ -36,6 +37,7 @@ create_contact (const struct GNUNET_CRYPTO_PublicKey *key)
 
   contact->name = NULL;
   contact->rc = 0;
+  contact->id = unique_id;
 
   GNUNET_memcpy (&(contact->public_key), key, sizeof(contact->public_key));
 
@@ -107,6 +109,15 @@ decrease_contact_rc (struct GNUNET_MESSENGER_Contact 
*contact)
 }
 
 
+size_t
+get_contact_id (const struct GNUNET_MESSENGER_Contact *contact)
+{
+  GNUNET_assert (contact);
+
+  return contact->id;
+}
+
+
 void
 get_context_from_member (const struct GNUNET_HashCode *key,
                          const struct GNUNET_ShortHashCode *id,
diff --git a/src/service/messenger/messenger_api_contact.h 
b/src/service/messenger/messenger_api_contact.h
index 4463aa746..b2e3fc364 100644
--- a/src/service/messenger/messenger_api_contact.h
+++ b/src/service/messenger/messenger_api_contact.h
@@ -34,6 +34,7 @@ struct GNUNET_MESSENGER_Contact
 {
   char *name;
   size_t rc;
+  size_t id;
 
   struct GNUNET_CRYPTO_PublicKey public_key;
 };
@@ -42,10 +43,12 @@ struct GNUNET_MESSENGER_Contact
  * Creates and allocates a new contact with a given public <i>key</i> from an 
EGO.
  *
  * @param[in] key Public key
+ * @param[in] unique_id Locally unique identifier
  * @return New contact
  */
 struct GNUNET_MESSENGER_Contact*
-create_contact (const struct GNUNET_CRYPTO_PublicKey *key);
+create_contact (const struct GNUNET_CRYPTO_PublicKey *key,
+                size_t unique_id);
 
 /**
  * Destroys a contact and frees its memory fully.
@@ -101,6 +104,15 @@ increase_contact_rc (struct GNUNET_MESSENGER_Contact 
*contact);
 int
 decrease_contact_rc (struct GNUNET_MESSENGER_Contact *contact);
 
+/**
+ * Returns the locally unique identifier of a given <i>contact</i>.
+ *
+ * @param[in] contact contact Contact
+ * @return Locally unique identifier of contact
+ */
+size_t
+get_contact_id (const struct GNUNET_MESSENGER_Contact *contact);
+
 /**
  * Calculates the context <i>hash</i> of a member in a room and returns it.
  *
diff --git a/src/service/messenger/messenger_api_contact_store.c 
b/src/service/messenger/messenger_api_contact_store.c
index 8bcfb24ff..7583a8b07 100644
--- a/src/service/messenger/messenger_api_contact_store.c
+++ b/src/service/messenger/messenger_api_contact_store.c
@@ -36,6 +36,8 @@ init_contact_store (struct GNUNET_MESSENGER_ContactStore 
*store)
 
   store->anonymous = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
   store->contacts = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+
+  store->counter = 0;
 }
 
 
@@ -126,7 +128,7 @@ get_store_contact (struct GNUNET_MESSENGER_ContactStore 
*store,
     if (0 != GNUNET_memcmp (pubkey, get_contact_key (contact)))
     {
       char *str = GNUNET_CRYPTO_public_key_to_string (get_contact_key (
-                                                          contact));
+                                                        contact));
       GNUNET_log (GNUNET_ERROR_TYPE_INVALID,
                   "Contact in store uses wrong key: %s\n", str);
       GNUNET_free (str);
@@ -136,7 +138,7 @@ get_store_contact (struct GNUNET_MESSENGER_ContactStore 
*store,
     return contact;
   }
 
-  contact = create_contact (pubkey);
+  contact = create_contact (pubkey, ++(store->counter));
 
   if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (map, &hash, contact,
                                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
diff --git a/src/service/messenger/messenger_api_contact_store.h 
b/src/service/messenger/messenger_api_contact_store.h
index 03912e985..4520e0a47 100644
--- a/src/service/messenger/messenger_api_contact_store.h
+++ b/src/service/messenger/messenger_api_contact_store.h
@@ -36,6 +36,8 @@ struct GNUNET_MESSENGER_ContactStore
 {
   struct GNUNET_CONTAINER_MultiHashMap *anonymous;
   struct GNUNET_CONTAINER_MultiHashMap *contacts;
+
+  size_t counter;
 };
 
 /**
diff --git a/src/service/messenger/messenger_api_message.c 
b/src/service/messenger/messenger_api_message.c
index f77d171f6..3ccbbd378 100644
--- a/src/service/messenger/messenger_api_message.c
+++ b/src/service/messenger/messenger_api_message.c
@@ -390,32 +390,32 @@ calc_padded_length (uint16_t length)
 #define min(x, y) (x < y? x : y)
 
 #define encode_step_ext(dst, offset, src, size) do { \
-  GNUNET_memcpy (dst + offset, src, size);           \
-  offset += size;                                    \
+          GNUNET_memcpy (dst + offset, src, size);           \
+          offset += size;                                    \
 } while (0)
 
 #define encode_step(dst, offset, src) do {          \
-  encode_step_ext (dst, offset, src, sizeof(*src)); \
+          encode_step_ext (dst, offset, src, sizeof(*src)); \
 } while (0)
 
 #define encode_step_key(dst, offset, src, length) do {        \
-  ssize_t result = GNUNET_CRYPTO_write_public_key_to_buffer ( \
-    src, dst + offset, length - offset                        \
-  );                                                          \
-  if (result < 0)                                             \
-    GNUNET_break (0);                                         \
-  else                                                        \
-    offset += result;                                         \
+          ssize_t result = GNUNET_CRYPTO_write_public_key_to_buffer ( \
+            src, dst + offset, length - offset                        \
+            );                                                          \
+          if (result < 0)                                             \
+          GNUNET_break (0);                                         \
+          else                                                        \
+          offset += result;                                         \
 } while (0)
 
 #define encode_step_signature(dst, offset, src, length) do { \
-  ssize_t result = GNUNET_CRYPTO_write_signature_to_buffer ( \
-    src, dst + offset, length - offset                       \
-  );                                                         \
-  if (result < 0)                                            \
-    GNUNET_break (0);                                        \
-  else                                                       \
-    offset += result;                                        \
+          ssize_t result = GNUNET_CRYPTO_write_signature_to_buffer ( \
+            src, dst + offset, length - offset                       \
+            );                                                         \
+          if (result < 0)                                            \
+          GNUNET_break (0);                                        \
+          else                                                       \
+          offset += result;                                        \
 } while (0)
 
 static void
@@ -564,30 +564,30 @@ encode_short_message (const struct 
GNUNET_MESSENGER_ShortMessage *message,
 
 
 #define decode_step_ext(src, offset, dst, size) do { \
-  GNUNET_memcpy (dst, src + offset, size);           \
-  offset += size;                                    \
+          GNUNET_memcpy (dst, src + offset, size);           \
+          offset += size;                                    \
 } while (0)
 
 #define decode_step(src, offset, dst) do {          \
-  decode_step_ext (src, offset, dst, sizeof(*dst)); \
+          decode_step_ext (src, offset, dst, sizeof(*dst)); \
 } while (0)
 
 #define decode_step_malloc(src, offset, dst, size, zero) do { \
-  dst = GNUNET_malloc (size + zero);                          \
-  if (zero) dst[size] = 0;                                    \
-    decode_step_ext (src, offset, dst, size);                 \
+          dst = GNUNET_malloc (size + zero);                          \
+          if (zero) dst[size] = 0;                                    \
+          decode_step_ext (src, offset, dst, size);                 \
 } while (0)
 
 #define decode_step_key(src, offset, dst, length) do {   \
-  enum GNUNET_GenericReturnValue result;                 \
-  size_t read;                                           \
-  result = GNUNET_CRYPTO_read_public_key_from_buffer (   \
-    src + offset, length - offset, dst, &read            \
-  );                                                     \
-  if (GNUNET_SYSERR == result)                           \
-    GNUNET_break (0);                                    \
-  else                                                   \
-    offset += read;                                      \
+          enum GNUNET_GenericReturnValue result;                 \
+          size_t read;                                           \
+          result = GNUNET_CRYPTO_read_public_key_from_buffer (   \
+            src + offset, length - offset, dst, &read            \
+            );                                                     \
+          if (GNUNET_SYSERR == result)                           \
+          GNUNET_break (0);                                    \
+          else                                                   \
+          offset += read;                                      \
 } while (0)
 
 static uint16_t
@@ -698,7 +698,7 @@ decode_message (struct GNUNET_MESSENGER_Message *message,
   {
     ssize_t result = GNUNET_CRYPTO_read_signature_from_buffer (
       &(message->header.signature), buffer, length - offset
-    );
+      );
 
     if (result < 0)
       return GNUNET_NO;
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]