diff options
author | Gabor X Toth <*@tg-x.net> | 2014-07-23 16:19:49 +0000 |
---|---|---|
committer | Gabor X Toth <*@tg-x.net> | 2014-07-23 16:19:49 +0000 |
commit | 3cf8ba0b60f8495892fa76635e9c23555d0a304c (patch) | |
tree | 5f27648bdb3cf3409628e4e5edc26f811cbd03a5 /src/util | |
parent | 252b5599987b7ba03b879a8c2d1c455ad4c9834a (diff) | |
download | gnunet-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.c | 56 |
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 | |||
185 | transmit_next (struct GNUNET_CLIENT_MANAGER_Connection *mgr); | 195 | transmit_next (struct GNUNET_CLIENT_MANAGER_Connection *mgr); |
186 | 196 | ||
187 | 197 | ||
198 | static void | ||
199 | schedule_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 | */ |
271 | static void | 298 | static void |
272 | reconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | 299 | schedule_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 | */ |
319 | void | 348 | void |
320 | GNUNET_CLIENT_MANAGER_disconnect (struct GNUNET_CLIENT_MANAGER_Connection *mgr, | 349 | GNUNET_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 | ||