aboutsummaryrefslogtreecommitdiff
path: root/src/messenger/gnunet-service-messenger_message_recv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/messenger/gnunet-service-messenger_message_recv.c')
-rw-r--r--src/messenger/gnunet-service-messenger_message_recv.c71
1 files changed, 54 insertions, 17 deletions
diff --git a/src/messenger/gnunet-service-messenger_message_recv.c b/src/messenger/gnunet-service-messenger_message_recv.c
index 8aab805d2..b2a5052d2 100644
--- a/src/messenger/gnunet-service-messenger_message_recv.c
+++ b/src/messenger/gnunet-service-messenger_message_recv.c
@@ -27,18 +27,46 @@
27 27
28#include "gnunet-service-messenger_operation.h" 28#include "gnunet-service-messenger_operation.h"
29 29
30static void
31forward_about_members (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel,
32 struct GNUNET_MESSENGER_MemberSession *session, struct GNUNET_CONTAINER_MultiHashMap *map)
33{
34 if (session->prev)
35 forward_about_members (room, tunnel, session->prev, map);
36
37 struct GNUNET_MESSENGER_MessageStore *message_store = get_room_message_store(room);
38 struct GNUNET_MESSENGER_ListMessage *element;
39
40 for (element = session->messages.head; element; element = element->next)
41 {
42 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(map, &(element->hash)))
43 continue;
44
45 if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(map, &(element->hash), NULL,
46 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
47 GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Forwarding of session message could be duplicated!\n");
48
49 const struct GNUNET_MESSENGER_Message *message = get_store_message(message_store, &(element->hash));
50
51 if (message)
52 forward_tunnel_message(tunnel, message, &(element->hash));
53 }
54}
55
30static int 56static int
31iterate_forward_members (void *cls, const struct GNUNET_IDENTITY_PublicKey *public_key, 57iterate_forward_members (void *cls, const struct GNUNET_IDENTITY_PublicKey *public_key,
32 struct GNUNET_MESSENGER_MemberSession *session) 58 struct GNUNET_MESSENGER_MemberSession *session)
33{ 59{
34 struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls; 60 struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
35 struct GNUNET_MESSENGER_SrvRoom *room = tunnel->room;
36 61
37 struct GNUNET_MESSENGER_ListMessage *element; 62 if (GNUNET_YES == is_member_session_completed(session))
63 return GNUNET_YES;
38 64
39 for (element = session->messages.head; element; element = element->next) 65 struct GNUNET_CONTAINER_MultiHashMap *map = GNUNET_CONTAINER_multihashmap_create(4, GNUNET_NO);
40 forward_tunnel_message(tunnel, get_room_message(room, NULL, &(element->hash), GNUNET_NO), &(element->hash));
41 66
67 forward_about_members (tunnel->room, tunnel, session, map);
68
69 GNUNET_CONTAINER_multihashmap_destroy(map);
42 return GNUNET_YES; 70 return GNUNET_YES;
43} 71}
44 72
@@ -97,32 +125,40 @@ recv_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGE
97 return GNUNET_YES; 125 return GNUNET_YES;
98} 126}
99 127
100int 128static void
101recv_message_request (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, 129callback_found_message (void *cls, struct GNUNET_MESSENGER_SrvRoom *room,
102 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) 130 const struct GNUNET_MESSENGER_Message *message,
131 const struct GNUNET_HashCode *hash)
103{ 132{
104 const struct GNUNET_MESSENGER_Message *msg = get_room_message ( 133 struct GNUNET_MESSENGER_SrvTunnel *tunnel = tunnel;
105 room, NULL, &(message->body.request.hash), GNUNET_NO
106 );
107 134
108 if (!msg) 135 if (!message)
109 { 136 {
110 struct GNUNET_MESSENGER_OperationStore *operation_store = get_room_operation_store(room); 137 struct GNUNET_MESSENGER_OperationStore *operation_store = get_room_operation_store(room);
111 138
112 use_store_operation( 139 use_store_operation(
113 operation_store, 140 operation_store,
114 &(message->body.request.hash), 141 hash,
115 GNUNET_MESSENGER_OP_REQUEST, 142 GNUNET_MESSENGER_OP_REQUEST,
116 GNUNET_MESSENGER_REQUEST_DELAY 143 GNUNET_MESSENGER_REQUEST_DELAY
117 ); 144 );
118
119 return GNUNET_YES;
120 } 145 }
146 else
147 forward_tunnel_message (tunnel, message, hash);
148}
121 149
150/*
151 * Function returns GNUNET_NO to drop forwarding the request.
152 * It will only be forwarded if it can't be answered!
153 */
154int
155recv_message_request (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel,
156 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
157{
122 struct GNUNET_MESSENGER_MemberStore *member_store = get_room_member_store(room); 158 struct GNUNET_MESSENGER_MemberStore *member_store = get_room_member_store(room);
123 struct GNUNET_MESSENGER_Member *member = get_store_member_of(member_store, message); 159 struct GNUNET_MESSENGER_Member *member = get_store_member_of(member_store, message);
124 160
125 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Callback for message (%s)\n", GNUNET_h2s (hash)); 161 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Request for message (%s)\n", GNUNET_h2s (hash));
126 162
127 if (!member) 163 if (!member)
128 return GNUNET_NO; 164 return GNUNET_NO;
@@ -132,7 +168,8 @@ recv_message_request (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSE
132 if ((!session) || (GNUNET_YES != check_member_session_history(session, hash, GNUNET_NO))) 168 if ((!session) || (GNUNET_YES != check_member_session_history(session, hash, GNUNET_NO)))
133 return GNUNET_NO; 169 return GNUNET_NO;
134 170
135 forward_tunnel_message (tunnel, msg, &(message->body.request.hash)); 171 if (GNUNET_NO == request_room_message(room, &(message->body.request.hash), session, callback_found_message, tunnel))
172 return GNUNET_YES;
136 173
137 return GNUNET_NO; 174 return GNUNET_NO;
138} 175}