aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorGabor X Toth <*@tg-x.net>2014-07-23 16:19:49 +0000
committerGabor X Toth <*@tg-x.net>2014-07-23 16:19:49 +0000
commit3cf8ba0b60f8495892fa76635e9c23555d0a304c (patch)
tree5f27648bdb3cf3409628e4e5edc26f811cbd03a5 /src/util
parent252b5599987b7ba03b879a8c2d1c455ad4c9834a (diff)
downloadgnunet-3cf8ba0b60f8495892fa76635e9c23555d0a304c.tar.gz
gnunet-3cf8ba0b60f8495892fa76635e9c23555d0a304c.zip
social: implement enter/leave/messaging; psyc: improvements and fixes
- social: implement enter/leave, send/receive messages, slicer - psyc, social: add struct GNUNET_PSYC_Message for single-fragment join messages - psyc: add message callback in addition to message part callback - client_manager, social, psyc, multicast: add disconnect callback
Diffstat (limited to 'src/util')
-rw-r--r--src/util/client_manager.c56
1 files changed, 47 insertions, 9 deletions
diff --git a/src/util/client_manager.c b/src/util/client_manager.c
index c415ce845..6ab2c7c6d 100644
--- a/src/util/client_manager.c
+++ b/src/util/client_manager.c
@@ -30,7 +30,7 @@
30#include "platform.h" 30#include "platform.h"
31#include "gnunet_util_lib.h" 31#include "gnunet_util_lib.h"
32 32
33#define LOG(kind,...) GNUNET_log_from (kind, "util",__VA_ARGS__) 33#define LOG(kind,...) GNUNET_log_from (kind, "util-client-mgr", __VA_ARGS__)
34 34
35 35
36/** 36/**
@@ -94,6 +94,16 @@ struct GNUNET_CLIENT_MANAGER_Connection
94 const struct GNUNET_CLIENT_MANAGER_MessageHandler *handlers; 94 const struct GNUNET_CLIENT_MANAGER_MessageHandler *handlers;
95 95
96 /** 96 /**
97 * Disconnect callback.
98 */
99 void (*disconnect_cb)(void *);
100
101 /**
102 * Disconnect closure.
103 */
104 void *disconnect_cls;
105
106 /**
97 * User context value. 107 * User context value.
98 * @see GNUNET_CLIENT_MANAGER_set_user_context() 108 * @see GNUNET_CLIENT_MANAGER_set_user_context()
99 * @see GNUNET_CLIENT_MANAGER_get_user_context() 109 * @see GNUNET_CLIENT_MANAGER_get_user_context()
@@ -125,7 +135,7 @@ struct GNUNET_CLIENT_MANAGER_Connection
125 * #GNUNET_YES if GNUNET_CLIENT_MANAGER_disconnect() was called 135 * #GNUNET_YES if GNUNET_CLIENT_MANAGER_disconnect() was called
126 * and we're transmitting the last messages from the queue. 136 * and we're transmitting the last messages from the queue.
127 */ 137 */
128 uint8_t disconnecting; 138 uint8_t is_disconnecting;
129}; 139};
130 140
131 141
@@ -185,6 +195,15 @@ static void
185transmit_next (struct GNUNET_CLIENT_MANAGER_Connection *mgr); 195transmit_next (struct GNUNET_CLIENT_MANAGER_Connection *mgr);
186 196
187 197
198static void
199schedule_disconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
200{
201 struct GNUNET_CLIENT_MANAGER_Connection *mgr = cls;
202 GNUNET_CLIENT_MANAGER_disconnect (mgr, GNUNET_NO,
203 mgr->disconnect_cb, mgr->disconnect_cls);
204}
205
206
188/** 207/**
189 * Transmit next message to service. 208 * Transmit next message to service.
190 * 209 *
@@ -221,7 +240,14 @@ send_next_message (void *cls, size_t buf_size, void *buf)
221 GNUNET_free (mqi); 240 GNUNET_free (mqi);
222 241
223 if (NULL != mgr->tmit_head) 242 if (NULL != mgr->tmit_head)
243 {
224 transmit_next (mgr); 244 transmit_next (mgr);
245 }
246 else if (GNUNET_YES == mgr->is_disconnecting)
247 {
248 GNUNET_SCHEDULER_add_now (&schedule_disconnect, mgr);
249 return size;
250 }
225 251
226 if (GNUNET_NO == mgr->in_receive) 252 if (GNUNET_NO == mgr->in_receive)
227 { 253 {
@@ -247,8 +273,9 @@ transmit_next (struct GNUNET_CLIENT_MANAGER_Connection *mgr)
247 273
248 if (NULL == mgr->tmit_head) 274 if (NULL == mgr->tmit_head)
249 { 275 {
250 if (GNUNET_YES == mgr->disconnecting) 276 if (GNUNET_YES == mgr->is_disconnecting)
251 GNUNET_CLIENT_MANAGER_disconnect (mgr, GNUNET_NO); 277 GNUNET_CLIENT_MANAGER_disconnect (mgr, GNUNET_NO,
278 mgr->disconnect_cb, mgr->disconnect_cls);
252 return; 279 return;
253 } 280 }
254 281
@@ -269,7 +296,7 @@ transmit_next (struct GNUNET_CLIENT_MANAGER_Connection *mgr)
269 * @param tc Scheduler context. 296 * @param tc Scheduler context.
270 */ 297 */
271static void 298static void
272reconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 299schedule_reconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
273{ 300{
274 struct GNUNET_CLIENT_MANAGER_Connection *mgr = cls; 301 struct GNUNET_CLIENT_MANAGER_Connection *mgr = cls;
275 mgr->reconnect_task = GNUNET_SCHEDULER_NO_TASK; 302 mgr->reconnect_task = GNUNET_SCHEDULER_NO_TASK;
@@ -305,7 +332,7 @@ GNUNET_CLIENT_MANAGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
305 mgr->service_name = service_name; 332 mgr->service_name = service_name;
306 mgr->handlers = handlers; 333 mgr->handlers = handlers;
307 mgr->reconnect_delay = GNUNET_TIME_UNIT_ZERO; 334 mgr->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
308 mgr->reconnect_task = GNUNET_SCHEDULER_add_now (&reconnect, mgr); 335 mgr->reconnect_task = GNUNET_SCHEDULER_add_now (&schedule_reconnect, mgr);
309 return mgr; 336 return mgr;
310} 337}
311 338
@@ -315,17 +342,25 @@ GNUNET_CLIENT_MANAGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
315 * 342 *
316 * @param mgr Client manager connection. 343 * @param mgr Client manager connection.
317 * @param transmit_queue Transmit pending messages in queue before disconnecting. 344 * @param transmit_queue Transmit pending messages in queue before disconnecting.
345 * @param disconnect_cb Function called after disconnected from the service.
346 * @param disconnect_cls Closure for @a disconnect_cb.
318 */ 347 */
319void 348void
320GNUNET_CLIENT_MANAGER_disconnect (struct GNUNET_CLIENT_MANAGER_Connection *mgr, 349GNUNET_CLIENT_MANAGER_disconnect (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
321 int transmit_queue) 350 int transmit_queue,
351 GNUNET_ContinuationCallback disconnect_cb,
352 void *disconnect_cls)
322{ 353{
354 LOG (GNUNET_ERROR_TYPE_DEBUG, "Disconnecting (%d)\n", transmit_queue);
355 mgr->disconnect_cb = disconnect_cb;
356 mgr->disconnect_cls = disconnect_cls;
323 if (NULL != mgr->tmit_head) 357 if (NULL != mgr->tmit_head)
324 { 358 {
325 if (GNUNET_YES == transmit_queue) 359 if (GNUNET_YES == transmit_queue)
326 { 360 {
327 mgr->disconnecting = GNUNET_YES; 361 mgr->is_disconnecting = GNUNET_YES;
328 transmit_next (mgr); 362 transmit_next (mgr);
363 return;
329 } 364 }
330 else 365 else
331 { 366 {
@@ -350,7 +385,10 @@ GNUNET_CLIENT_MANAGER_disconnect (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
350 GNUNET_CLIENT_disconnect (mgr->client); 385 GNUNET_CLIENT_disconnect (mgr->client);
351 mgr->client = NULL; 386 mgr->client = NULL;
352 } 387 }
388 if (NULL != mgr->disconnect_cb)
389 mgr->disconnect_cb (mgr->disconnect_cls);
353 GNUNET_free (mgr); 390 GNUNET_free (mgr);
391 LOG (GNUNET_ERROR_TYPE_DEBUG, "Disconnected.\n");
354} 392}
355 393
356 394
@@ -380,7 +418,7 @@ GNUNET_CLIENT_MANAGER_reconnect (struct GNUNET_CLIENT_MANAGER_Connection *mgr)
380 "Scheduling task to reconnect to service in %s.\n", 418 "Scheduling task to reconnect to service in %s.\n",
381 GNUNET_STRINGS_relative_time_to_string (mgr->reconnect_delay, GNUNET_YES)); 419 GNUNET_STRINGS_relative_time_to_string (mgr->reconnect_delay, GNUNET_YES));
382 mgr->reconnect_task = 420 mgr->reconnect_task =
383 GNUNET_SCHEDULER_add_delayed (mgr->reconnect_delay, &reconnect, mgr); 421 GNUNET_SCHEDULER_add_delayed (mgr->reconnect_delay, &schedule_reconnect, mgr);
384 mgr->reconnect_delay = GNUNET_TIME_STD_BACKOFF (mgr->reconnect_delay); 422 mgr->reconnect_delay = GNUNET_TIME_STD_BACKOFF (mgr->reconnect_delay);
385} 423}
386 424