diff options
-rw-r--r-- | include/gnunet/gnunet_chat_lib.h | 34 | ||||
-rw-r--r-- | src/gnunet_chat_contact.c | 32 | ||||
-rw-r--r-- | src/gnunet_chat_contact.h | 31 | ||||
-rw-r--r-- | src/gnunet_chat_handle_intern.c | 3 | ||||
-rw-r--r-- | src/gnunet_chat_lib.c | 68 | ||||
-rw-r--r-- | src/gnunet_chat_lib_intern.c | 7 |
6 files changed, 140 insertions, 35 deletions
diff --git a/include/gnunet/gnunet_chat_lib.h b/include/gnunet/gnunet_chat_lib.h index 0348579..35f9ec6 100644 --- a/include/gnunet/gnunet_chat_lib.h +++ b/include/gnunet/gnunet_chat_lib.h | |||
@@ -810,6 +810,40 @@ enum GNUNET_GenericReturnValue | |||
810 | GNUNET_CHAT_contact_is_blocked (const struct GNUNET_CHAT_Contact *contact); | 810 | GNUNET_CHAT_contact_is_blocked (const struct GNUNET_CHAT_Contact *contact); |
811 | 811 | ||
812 | /** | 812 | /** |
813 | * Tags a given <i>contact</i> by the current account with a specific | ||
814 | * <i>tag</i>. | ||
815 | * | ||
816 | * @param[in,out] contact Contact | ||
817 | * @param[in] tag Tag | ||
818 | */ | ||
819 | void | ||
820 | GNUNET_CHAT_contact_tag (struct GNUNET_CHAT_Contact *contact, | ||
821 | const char *tag); | ||
822 | |||
823 | /** | ||
824 | * Untags a given <i>contact</i> by the current account with a specific | ||
825 | * <i>tag</i>. | ||
826 | * | ||
827 | * @param[in,out] contact Contact | ||
828 | * @param[in] tag Tag | ||
829 | */ | ||
830 | void | ||
831 | GNUNET_CHAT_contact_untag (struct GNUNET_CHAT_Contact *contact, | ||
832 | const char *tag); | ||
833 | |||
834 | /** | ||
835 | * Returns if a given <i>contact</i> is tagged by the current account with | ||
836 | * a specific <i>tag</i>. | ||
837 | * | ||
838 | * @param[in] contact Contact | ||
839 | * @return #GNUNET_YES if the contact is tagged, #GNUNET_SYSERR on failure and | ||
840 | * #GNUNET_NO otherwise | ||
841 | */ | ||
842 | enum GNUNET_GenericReturnValue | ||
843 | GNUNET_CHAT_contact_is_tagged (const struct GNUNET_CHAT_Contact *contact, | ||
844 | const char *tag); | ||
845 | |||
846 | /** | ||
813 | * Iterates through the tickets of a given <i>contact</i> with a selected | 847 | * Iterates through the tickets of a given <i>contact</i> with a selected |
814 | * callback and custom closure. | 848 | * callback and custom closure. |
815 | * | 849 | * |
diff --git a/src/gnunet_chat_contact.c b/src/gnunet_chat_contact.c index 5e4b632..6fc6571 100644 --- a/src/gnunet_chat_contact.c +++ b/src/gnunet_chat_contact.c | |||
@@ -77,8 +77,8 @@ contact_update_join (struct GNUNET_CHAT_Contact *contact, | |||
77 | if (!(context->room)) | 77 | if (!(context->room)) |
78 | return; | 78 | return; |
79 | 79 | ||
80 | const enum GNUNET_GenericReturnValue blocked = contact_is_blocked( | 80 | const enum GNUNET_GenericReturnValue blocked = contact_is_tagged( |
81 | contact, context | 81 | contact, context, NULL |
82 | ); | 82 | ); |
83 | 83 | ||
84 | const struct GNUNET_HashCode *key = GNUNET_MESSENGER_room_get_key( | 84 | const struct GNUNET_HashCode *key = GNUNET_MESSENGER_room_get_key( |
@@ -109,13 +109,13 @@ contact_update_join (struct GNUNET_CHAT_Contact *contact, | |||
109 | return; | 109 | return; |
110 | 110 | ||
111 | if (GNUNET_YES == blocked) | 111 | if (GNUNET_YES == blocked) |
112 | contact_unblock(contact, context); | 112 | contact_untag(contact, context, NULL); |
113 | 113 | ||
114 | GNUNET_memcpy(current, hash, | 114 | GNUNET_memcpy(current, hash, |
115 | sizeof(struct GNUNET_HashCode)); | 115 | sizeof(struct GNUNET_HashCode)); |
116 | 116 | ||
117 | if (GNUNET_YES == blocked) | 117 | if (GNUNET_YES == blocked) |
118 | contact_block(contact, context); | 118 | contact_tag(contact, context, NULL); |
119 | } | 119 | } |
120 | 120 | ||
121 | void | 121 | void |
@@ -167,8 +167,9 @@ contact_find_context (const struct GNUNET_CHAT_Contact *contact) | |||
167 | } | 167 | } |
168 | 168 | ||
169 | enum GNUNET_GenericReturnValue | 169 | enum GNUNET_GenericReturnValue |
170 | contact_is_blocked (const struct GNUNET_CHAT_Contact *contact, | 170 | contact_is_tagged (const struct GNUNET_CHAT_Contact *contact, |
171 | const struct GNUNET_CHAT_Context *context) | 171 | const struct GNUNET_CHAT_Context *context, |
172 | const char *tag) | ||
172 | { | 173 | { |
173 | GNUNET_assert( | 174 | GNUNET_assert( |
174 | (contact) && | 175 | (contact) && |
@@ -218,7 +219,7 @@ skip_context_search: | |||
218 | if (! hash) | 219 | if (! hash) |
219 | return (general == GNUNET_YES? | 220 | return (general == GNUNET_YES? |
220 | GNUNET_NO : | 221 | GNUNET_NO : |
221 | contact_is_blocked(contact, NULL) | 222 | contact_is_tagged(contact, NULL, tag) |
222 | ); | 223 | ); |
223 | 224 | ||
224 | struct GNUNET_CHAT_ContactFindJoin find; | 225 | struct GNUNET_CHAT_ContactFindJoin find; |
@@ -238,8 +239,9 @@ skip_context_search: | |||
238 | } | 239 | } |
239 | 240 | ||
240 | void | 241 | void |
241 | contact_unblock (struct GNUNET_CHAT_Contact *contact, | 242 | contact_untag (struct GNUNET_CHAT_Contact *contact, |
242 | struct GNUNET_CHAT_Context *context) | 243 | struct GNUNET_CHAT_Context *context, |
244 | const char *tag) | ||
243 | { | 245 | { |
244 | GNUNET_assert( | 246 | GNUNET_assert( |
245 | (contact) && | 247 | (contact) && |
@@ -280,8 +282,9 @@ contact_unblock (struct GNUNET_CHAT_Contact *contact, | |||
280 | } | 282 | } |
281 | 283 | ||
282 | void | 284 | void |
283 | contact_block (struct GNUNET_CHAT_Contact *contact, | 285 | contact_tag (struct GNUNET_CHAT_Contact *contact, |
284 | struct GNUNET_CHAT_Context *context) | 286 | struct GNUNET_CHAT_Context *context, |
287 | const char *tag) | ||
285 | { | 288 | { |
286 | GNUNET_assert( | 289 | GNUNET_assert( |
287 | (contact) && | 290 | (contact) && |
@@ -314,17 +317,22 @@ contact_block (struct GNUNET_CHAT_Contact *contact, | |||
314 | if ((find.hash) || (! context->room)) | 317 | if ((find.hash) || (! context->room)) |
315 | return; | 318 | return; |
316 | 319 | ||
320 | char *tag_value = tag? GNUNET_strdup(tag) : NULL; | ||
321 | |||
317 | struct GNUNET_MESSENGER_Message msg; | 322 | struct GNUNET_MESSENGER_Message msg; |
318 | msg.header.kind = GNUNET_MESSENGER_KIND_TAG; | 323 | msg.header.kind = GNUNET_MESSENGER_KIND_TAG; |
319 | GNUNET_memcpy(&(msg.body.tag.hash), hash, | 324 | GNUNET_memcpy(&(msg.body.tag.hash), hash, |
320 | sizeof(struct GNUNET_HashCode)); | 325 | sizeof(struct GNUNET_HashCode)); |
321 | msg.body.tag.tag = NULL; | 326 | msg.body.tag.tag = tag_value; |
322 | 327 | ||
323 | GNUNET_MESSENGER_send_message( | 328 | GNUNET_MESSENGER_send_message( |
324 | context->room, | 329 | context->room, |
325 | &msg, | 330 | &msg, |
326 | contact->member | 331 | contact->member |
327 | ); | 332 | ); |
333 | |||
334 | if (tag_value) | ||
335 | GNUNET_free(tag_value); | ||
328 | } | 336 | } |
329 | 337 | ||
330 | void | 338 | void |
diff --git a/src/gnunet_chat_contact.h b/src/gnunet_chat_contact.h index 66ffe07..01ba688 100644 --- a/src/gnunet_chat_contact.h +++ b/src/gnunet_chat_contact.h | |||
@@ -104,38 +104,43 @@ struct GNUNET_CHAT_Context* | |||
104 | contact_find_context (const struct GNUNET_CHAT_Contact *contact); | 104 | contact_find_context (const struct GNUNET_CHAT_Contact *contact); |
105 | 105 | ||
106 | /** | 106 | /** |
107 | * Returns whether a chat <i>contact</i> is blocked in | 107 | * Returns whether a chat <i>contact</i> is tagged in |
108 | * a given chat <i>context</i>. | 108 | * a given chat <i>context</i> with a specific <i>tag</i>. |
109 | * | 109 | * |
110 | * @param[in] contact Chat contact | 110 | * @param[in] contact Chat contact |
111 | * @param[in] context Chat context or NULL (optional) | 111 | * @param[in] context Chat context or NULL (optional) |
112 | * @return #GNUNET_YES if blocked, otherwise #GNUNET_NO | 112 | * @param[in] tag Tag or NULL |
113 | * @return #GNUNET_YES if tagged, otherwise #GNUNET_NO | ||
113 | */ | 114 | */ |
114 | enum GNUNET_GenericReturnValue | 115 | enum GNUNET_GenericReturnValue |
115 | contact_is_blocked (const struct GNUNET_CHAT_Contact *contact, | 116 | contact_is_tagged (const struct GNUNET_CHAT_Contact *contact, |
116 | const struct GNUNET_CHAT_Context *context); | 117 | const struct GNUNET_CHAT_Context *context, |
118 | const char *tag); | ||
117 | 119 | ||
118 | /** | 120 | /** |
119 | * Unblocks a given chat <i>contact</i> in | 121 | * Untags a given chat <i>contact</i> in |
120 | * a given chat <i>context</i>. | 122 | * a given chat <i>context</i> from a specific <i>tag</i>. |
121 | * | 123 | * |
122 | * @param[in,out] contact Chat contact | 124 | * @param[in,out] contact Chat contact |
123 | * @param[in,out] context Chat context | 125 | * @param[in,out] context Chat context |
124 | */ | 126 | */ |
125 | void | 127 | void |
126 | contact_unblock (struct GNUNET_CHAT_Contact *contact, | 128 | contact_untag (struct GNUNET_CHAT_Contact *contact, |
127 | struct GNUNET_CHAT_Context *context); | 129 | struct GNUNET_CHAT_Context *context, |
130 | const char *tag); | ||
128 | 131 | ||
129 | /** | 132 | /** |
130 | * Blocks a given chat <i>contact</i> in | 133 | * Tags a given chat <i>contact</i> in |
131 | * a given chat <i>context</i>. | 134 | * a given chat <i>context</i> with a specific <i>tag</i>. |
132 | * | 135 | * |
133 | * @param[in,out] contact Chat contact | 136 | * @param[in,out] contact Chat contact |
134 | * @param[in,out] context Chat context | 137 | * @param[in,out] context Chat context |
138 | * @param[in] tag Tag or NULL | ||
135 | */ | 139 | */ |
136 | void | 140 | void |
137 | contact_block (struct GNUNET_CHAT_Contact *contact, | 141 | contact_tag (struct GNUNET_CHAT_Contact *contact, |
138 | struct GNUNET_CHAT_Context *context); | 142 | struct GNUNET_CHAT_Context *context, |
143 | const char *tag); | ||
139 | 144 | ||
140 | /** | 145 | /** |
141 | * Destroys a chat <i>contact</i> and frees its memory. | 146 | * Destroys a chat <i>contact</i> and frees its memory. |
diff --git a/src/gnunet_chat_handle_intern.c b/src/gnunet_chat_handle_intern.c index 441a1b7..b44a05a 100644 --- a/src/gnunet_chat_handle_intern.c +++ b/src/gnunet_chat_handle_intern.c | |||
@@ -955,9 +955,6 @@ on_handle_message_callback(void *cls) | |||
955 | break; | 955 | break; |
956 | } | 956 | } |
957 | 957 | ||
958 | if (GNUNET_YES == contact_is_blocked(contact, context)) | ||
959 | goto clear_dependencies; | ||
960 | |||
961 | handle->msg_cb(handle->msg_cls, context, message); | 958 | handle->msg_cb(handle->msg_cls, context, message); |
962 | 959 | ||
963 | clear_dependencies: | 960 | clear_dependencies: |
diff --git a/src/gnunet_chat_lib.c b/src/gnunet_chat_lib.c index 3e97d3e..794b170 100644 --- a/src/gnunet_chat_lib.c +++ b/src/gnunet_chat_lib.c | |||
@@ -948,11 +948,12 @@ GNUNET_CHAT_contact_set_blocked (struct GNUNET_CHAT_Contact *contact, | |||
948 | 948 | ||
949 | struct GNUNET_CHAT_ContactIterateContexts it; | 949 | struct GNUNET_CHAT_ContactIterateContexts it; |
950 | it.contact = contact; | 950 | it.contact = contact; |
951 | it.tag = NULL; | ||
951 | 952 | ||
952 | if (GNUNET_NO == blocked) | 953 | if (GNUNET_NO == blocked) |
953 | it.cb = contact_unblock; | 954 | it.cb = contact_untag; |
954 | else if (GNUNET_YES == blocked) | 955 | else if (GNUNET_YES == blocked) |
955 | it.cb = contact_block; | 956 | it.cb = contact_tag; |
956 | else | 957 | else |
957 | return; | 958 | return; |
958 | 959 | ||
@@ -972,7 +973,64 @@ GNUNET_CHAT_contact_is_blocked (const struct GNUNET_CHAT_Contact *contact) | |||
972 | if (!contact) | 973 | if (!contact) |
973 | return GNUNET_SYSERR; | 974 | return GNUNET_SYSERR; |
974 | 975 | ||
975 | return contact_is_blocked(contact, NULL); | 976 | return contact_is_tagged(contact, NULL, NULL); |
977 | } | ||
978 | |||
979 | |||
980 | void | ||
981 | GNUNET_CHAT_contact_tag (struct GNUNET_CHAT_Contact *contact, | ||
982 | const char *tag) | ||
983 | { | ||
984 | GNUNET_CHAT_VERSION_ASSERT(); | ||
985 | |||
986 | if ((!contact) || (!tag) || (!tag[0])) | ||
987 | return; | ||
988 | |||
989 | struct GNUNET_CHAT_ContactIterateContexts it; | ||
990 | it.contact = contact; | ||
991 | it.tag = tag; | ||
992 | it.cb = contact_tag; | ||
993 | |||
994 | GNUNET_CONTAINER_multihashmap_iterate( | ||
995 | contact->joined, | ||
996 | it_contact_iterate_contexts, | ||
997 | &it | ||
998 | ); | ||
999 | } | ||
1000 | |||
1001 | |||
1002 | void | ||
1003 | GNUNET_CHAT_contact_untag (struct GNUNET_CHAT_Contact *contact, | ||
1004 | const char *tag) | ||
1005 | { | ||
1006 | GNUNET_CHAT_VERSION_ASSERT(); | ||
1007 | |||
1008 | if ((!contact) || (!tag) || (!tag[0])) | ||
1009 | return; | ||
1010 | |||
1011 | struct GNUNET_CHAT_ContactIterateContexts it; | ||
1012 | it.contact = contact; | ||
1013 | it.tag = tag; | ||
1014 | it.cb = contact_untag; | ||
1015 | |||
1016 | GNUNET_CONTAINER_multihashmap_iterate( | ||
1017 | contact->joined, | ||
1018 | it_contact_iterate_contexts, | ||
1019 | &it | ||
1020 | ); | ||
1021 | } | ||
1022 | |||
1023 | |||
1024 | enum GNUNET_GenericReturnValue | ||
1025 | GNUNET_CHAT_contact_is_tagged (const struct GNUNET_CHAT_Contact *contact, | ||
1026 | const char *tag) | ||
1027 | { | ||
1028 | GNUNET_CHAT_VERSION_ASSERT(); | ||
1029 | |||
1030 | if ((!contact) || (!tag) || (!tag[0])) | ||
1031 | return GNUNET_SYSERR; | ||
1032 | |||
1033 | return contact_is_tagged(contact, NULL, tag); | ||
976 | } | 1034 | } |
977 | 1035 | ||
978 | 1036 | ||
@@ -1623,7 +1681,7 @@ GNUNET_CHAT_message_get_sender (const struct GNUNET_CHAT_Message *message) | |||
1623 | { | 1681 | { |
1624 | GNUNET_CHAT_VERSION_ASSERT(); | 1682 | GNUNET_CHAT_VERSION_ASSERT(); |
1625 | 1683 | ||
1626 | if ((!message) || (GNUNET_CHAT_FLAG_NONE != message->flag) || | 1684 | if ((!message) || (GNUNET_YES != message_has_msg(message)) || |
1627 | (!(message->context)) || (!(message->context->room))) | 1685 | (!(message->context)) || (!(message->context->room))) |
1628 | return NULL; | 1686 | return NULL; |
1629 | 1687 | ||
@@ -1643,7 +1701,7 @@ GNUNET_CHAT_message_get_recipient (const struct GNUNET_CHAT_Message *message) | |||
1643 | { | 1701 | { |
1644 | GNUNET_CHAT_VERSION_ASSERT(); | 1702 | GNUNET_CHAT_VERSION_ASSERT(); |
1645 | 1703 | ||
1646 | if ((!message) || (GNUNET_CHAT_FLAG_NONE != message->flag) || | 1704 | if ((!message) || (GNUNET_YES != message_has_msg(message)) || |
1647 | (!(message->context)) || (!(message->context->room))) | 1705 | (!(message->context)) || (!(message->context->room))) |
1648 | return NULL; | 1706 | return NULL; |
1649 | 1707 | ||
diff --git a/src/gnunet_chat_lib_intern.c b/src/gnunet_chat_lib_intern.c index bd2a24c..3959104 100644 --- a/src/gnunet_chat_lib_intern.c +++ b/src/gnunet_chat_lib_intern.c | |||
@@ -162,11 +162,14 @@ it_handle_iterate_groups (void *cls, | |||
162 | 162 | ||
163 | typedef void | 163 | typedef void |
164 | (*GNUNET_CHAT_ContactIterateContextCallback) (struct GNUNET_CHAT_Contact *contact, | 164 | (*GNUNET_CHAT_ContactIterateContextCallback) (struct GNUNET_CHAT_Contact *contact, |
165 | struct GNUNET_CHAT_Context *context); | 165 | struct GNUNET_CHAT_Context *context, |
166 | const char *tag); | ||
166 | 167 | ||
167 | struct GNUNET_CHAT_ContactIterateContexts | 168 | struct GNUNET_CHAT_ContactIterateContexts |
168 | { | 169 | { |
169 | struct GNUNET_CHAT_Contact *contact; | 170 | struct GNUNET_CHAT_Contact *contact; |
171 | const char *tag; | ||
172 | |||
170 | GNUNET_CHAT_ContactIterateContextCallback cb; | 173 | GNUNET_CHAT_ContactIterateContextCallback cb; |
171 | }; | 174 | }; |
172 | 175 | ||
@@ -189,7 +192,7 @@ it_contact_iterate_contexts (void *cls, | |||
189 | if (! context) | 192 | if (! context) |
190 | return GNUNET_YES; | 193 | return GNUNET_YES; |
191 | 194 | ||
192 | it->cb(it->contact, context); | 195 | it->cb(it->contact, context, it->tag); |
193 | return GNUNET_YES; | 196 | return GNUNET_YES; |
194 | } | 197 | } |
195 | 198 | ||