aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gnunet/gnunet_chat_lib.h34
-rw-r--r--src/gnunet_chat_contact.c32
-rw-r--r--src/gnunet_chat_contact.h31
-rw-r--r--src/gnunet_chat_handle_intern.c3
-rw-r--r--src/gnunet_chat_lib.c68
-rw-r--r--src/gnunet_chat_lib_intern.c7
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
810GNUNET_CHAT_contact_is_blocked (const struct GNUNET_CHAT_Contact *contact); 810GNUNET_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 */
819void
820GNUNET_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 */
830void
831GNUNET_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 */
842enum GNUNET_GenericReturnValue
843GNUNET_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
121void 121void
@@ -167,8 +167,9 @@ contact_find_context (const struct GNUNET_CHAT_Contact *contact)
167} 167}
168 168
169enum GNUNET_GenericReturnValue 169enum GNUNET_GenericReturnValue
170contact_is_blocked (const struct GNUNET_CHAT_Contact *contact, 170contact_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
240void 241void
241contact_unblock (struct GNUNET_CHAT_Contact *contact, 242contact_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
282void 284void
283contact_block (struct GNUNET_CHAT_Contact *contact, 285contact_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
330void 338void
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*
104contact_find_context (const struct GNUNET_CHAT_Contact *contact); 104contact_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 */
114enum GNUNET_GenericReturnValue 115enum GNUNET_GenericReturnValue
115contact_is_blocked (const struct GNUNET_CHAT_Contact *contact, 116contact_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 */
125void 127void
126contact_unblock (struct GNUNET_CHAT_Contact *contact, 128contact_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 */
136void 140void
137contact_block (struct GNUNET_CHAT_Contact *contact, 141contact_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
963clear_dependencies: 960clear_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
980void
981GNUNET_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
1002void
1003GNUNET_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
1024enum GNUNET_GenericReturnValue
1025GNUNET_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
163typedef void 163typedef 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
167struct GNUNET_CHAT_ContactIterateContexts 168struct 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