diff options
-rw-r--r-- | src/messenger/gnunet-service-messenger_member_session.c | 16 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_member_session.h | 1 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_room.c | 37 |
3 files changed, 53 insertions, 1 deletions
diff --git a/src/messenger/gnunet-service-messenger_member_session.c b/src/messenger/gnunet-service-messenger_member_session.c index 636285d93..2e6eae59e 100644 --- a/src/messenger/gnunet-service-messenger_member_session.c +++ b/src/messenger/gnunet-service-messenger_member_session.c | |||
@@ -68,6 +68,7 @@ create_member_session (struct GNUNET_MESSENGER_Member *member, | |||
68 | 68 | ||
69 | init_list_messages(&(session->messages)); | 69 | init_list_messages(&(session->messages)); |
70 | 70 | ||
71 | session->prev = NULL; | ||
71 | session->next = NULL; | 72 | session->next = NULL; |
72 | 73 | ||
73 | session->closed = GNUNET_NO; | 74 | session->closed = GNUNET_NO; |
@@ -222,6 +223,7 @@ switch_member_session (struct GNUNET_MESSENGER_MemberSession *session, | |||
222 | copy_list_messages(&(next->messages), &(session->messages)); | 223 | copy_list_messages(&(next->messages), &(session->messages)); |
223 | 224 | ||
224 | session->next = next; | 225 | session->next = next; |
226 | next->prev = session; | ||
225 | next->next = NULL; | 227 | next->next = NULL; |
226 | 228 | ||
227 | session->closed = GNUNET_YES; | 229 | session->closed = GNUNET_YES; |
@@ -516,6 +518,14 @@ load_member_session (struct GNUNET_MESSENGER_Member *member, const char *directo | |||
516 | goto destroy_config; | 518 | goto destroy_config; |
517 | 519 | ||
518 | session = create_member_session(member, &key); | 520 | session = create_member_session(member, &key); |
521 | |||
522 | unsigned long long numeric_value; | ||
523 | |||
524 | if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, "session", "closed", &numeric_value)) | ||
525 | session->closed = (GNUNET_YES == numeric_value? GNUNET_YES : GNUNET_NO); | ||
526 | |||
527 | if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, "session", "completed", &numeric_value)) | ||
528 | session->completed = (GNUNET_YES == numeric_value? GNUNET_YES : GNUNET_NO); | ||
519 | } | 529 | } |
520 | 530 | ||
521 | destroy_config: | 531 | destroy_config: |
@@ -599,6 +609,9 @@ load_member_session_next (struct GNUNET_MESSENGER_MemberSession *session, const | |||
599 | session->next = get_cycle_safe_next_session( | 609 | session->next = get_cycle_safe_next_session( |
600 | session, member? get_member_session (member, &next_key) : NULL | 610 | session, member? get_member_session (member, &next_key) : NULL |
601 | ); | 611 | ); |
612 | |||
613 | if (session->next) | ||
614 | session->next->prev = session; | ||
602 | } | 615 | } |
603 | 616 | ||
604 | destroy_config: | 617 | destroy_config: |
@@ -688,6 +701,9 @@ save_member_session (struct GNUNET_MESSENGER_MemberSession *session, const char | |||
688 | } | 701 | } |
689 | } | 702 | } |
690 | 703 | ||
704 | GNUNET_CONFIGURATION_set_value_number (cfg, "session", "closed", session->closed); | ||
705 | GNUNET_CONFIGURATION_set_value_number (cfg, "session", "completed", session->completed); | ||
706 | |||
691 | GNUNET_CONFIGURATION_write (cfg, config_file); | 707 | GNUNET_CONFIGURATION_write (cfg, config_file); |
692 | GNUNET_CONFIGURATION_destroy (cfg); | 708 | GNUNET_CONFIGURATION_destroy (cfg); |
693 | 709 | ||
diff --git a/src/messenger/gnunet-service-messenger_member_session.h b/src/messenger/gnunet-service-messenger_member_session.h index dd753be2a..cf4a6bb07 100644 --- a/src/messenger/gnunet-service-messenger_member_session.h +++ b/src/messenger/gnunet-service-messenger_member_session.h | |||
@@ -46,6 +46,7 @@ struct GNUNET_MESSENGER_MemberSession { | |||
46 | struct GNUNET_CONTAINER_MultiHashMap *history; | 46 | struct GNUNET_CONTAINER_MultiHashMap *history; |
47 | struct GNUNET_MESSENGER_ListMessages messages; | 47 | struct GNUNET_MESSENGER_ListMessages messages; |
48 | 48 | ||
49 | struct GNUNET_MESSENGER_MemberSession* prev; | ||
49 | struct GNUNET_MESSENGER_MemberSession* next; | 50 | struct GNUNET_MESSENGER_MemberSession* next; |
50 | 51 | ||
51 | int closed; | 52 | int closed; |
diff --git a/src/messenger/gnunet-service-messenger_room.c b/src/messenger/gnunet-service-messenger_room.c index e0bec7991..027df682c 100644 --- a/src/messenger/gnunet-service-messenger_room.c +++ b/src/messenger/gnunet-service-messenger_room.c | |||
@@ -939,6 +939,9 @@ iterate_update_member_sessions (void *cls, const struct GNUNET_IDENTITY_PublicKe | |||
939 | return GNUNET_YES; | 939 | return GNUNET_YES; |
940 | } | 940 | } |
941 | 941 | ||
942 | static void | ||
943 | remove_room_member_session (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_MemberSession *session); | ||
944 | |||
942 | void | 945 | void |
943 | callback_room_handle_message (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvHandle *handle, | 946 | callback_room_handle_message (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvHandle *handle, |
944 | const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) | 947 | const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) |
@@ -975,7 +978,7 @@ callback_room_handle_message (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUN | |||
975 | { | 978 | { |
976 | struct GNUNET_MESSENGER_MemberSessionCompletion *element = update.head; | 979 | struct GNUNET_MESSENGER_MemberSessionCompletion *element = update.head; |
977 | 980 | ||
978 | remove_member_session (element->session->member, element->session); | 981 | remove_room_member_session (room, element->session); |
979 | 982 | ||
980 | GNUNET_CONTAINER_DLL_remove(update.head, update.tail, element); | 983 | GNUNET_CONTAINER_DLL_remove(update.head, update.tail, element); |
981 | GNUNET_free (element); | 984 | GNUNET_free (element); |
@@ -1087,3 +1090,35 @@ save_room (struct GNUNET_MESSENGER_SrvRoom *room) | |||
1087 | 1090 | ||
1088 | GNUNET_free(room_dir); | 1091 | GNUNET_free(room_dir); |
1089 | } | 1092 | } |
1093 | |||
1094 | static void | ||
1095 | remove_room_member_session (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_MemberSession *session) | ||
1096 | { | ||
1097 | GNUNET_assert ((room) && (session)); | ||
1098 | |||
1099 | remove_member_session (session->member, session); | ||
1100 | |||
1101 | const struct GNUNET_IDENTITY_PublicKey *public_key = get_member_session_public_key(session); | ||
1102 | |||
1103 | struct GNUNET_HashCode hash; | ||
1104 | GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash); | ||
1105 | |||
1106 | char *room_dir; | ||
1107 | get_room_data_subdir (room, &room_dir); | ||
1108 | |||
1109 | char* session_dir; | ||
1110 | GNUNET_asprintf ( | ||
1111 | &session_dir, "%s%s%c%s%c%s%c%s%c", room_dir, | ||
1112 | "members", DIR_SEPARATOR, | ||
1113 | GNUNET_sh2s(get_member_session_id(session)), DIR_SEPARATOR, | ||
1114 | "sessions", DIR_SEPARATOR, | ||
1115 | GNUNET_h2s(&hash), DIR_SEPARATOR | ||
1116 | ); | ||
1117 | |||
1118 | GNUNET_free (room_dir); | ||
1119 | |||
1120 | GNUNET_DISK_directory_remove(session_dir); | ||
1121 | GNUNET_free (session_dir); | ||
1122 | |||
1123 | destroy_member_session(session); | ||
1124 | } | ||