[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.