GNUnet 0.22.2
messenger_api_message_control.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2024 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
27
28#include "gnunet_common.h"
35#include "messenger_api_room.h"
36
39{
40 struct GNUNET_MESSENGER_MessageControl *control;
41
43
45 control->room = room;
46
49 GNUNET_NO);
50
51 control->head = NULL;
52 control->tail = NULL;
53
54 return control;
55}
56
57
58void
60{
61 GNUNET_assert (control);
62
63 while (control->head)
64 {
67
68 if (queue->task)
70
71 destroy_message (queue->message);
72
75 }
76
79
81}
82
83
84static void
86 const struct GNUNET_HashCode *sender,
87 const struct GNUNET_HashCode *context,
88 const struct GNUNET_HashCode *hash,
91{
94
95 GNUNET_assert ((control) && (sender) && (context) && (hash) && (message));
96
99 else
101
103 queue->control = control;
104
105 GNUNET_memcpy (&(queue->sender), sender, sizeof (queue->sender));
106 GNUNET_memcpy (&(queue->context), context, sizeof (queue->context));
107 GNUNET_memcpy (&(queue->hash), hash, sizeof (queue->hash));
108
109 queue->message = copy_message (message);
110 queue->flags = flags;
111 queue->task = NULL;
112
114
117 queue,
119}
120
121
122static void
124 struct GNUNET_MESSENGER_Contact *contact,
125 const struct GNUNET_HashCode *hash,
126 const struct GNUNET_MESSENGER_Message *message,
128{
129 GNUNET_assert ((control) && (hash) && (message));
130
132
136
138}
139
140
141static void
143{
145 struct GNUNET_MESSENGER_MessageControl *control;
146 struct GNUNET_MESSENGER_Contact *contact;
148
149 GNUNET_assert (cls);
150
151 queue = cls;
152 control = queue->control;
153
154 queue->task = NULL;
155
156 {
158 struct GNUNET_MESSENGER_ContactStore *store;
159
160 handle = get_room_handle (control->room);
162
163 contact = get_store_contact_raw (
164 store, &(queue->context), &(queue->sender));
165 }
166
167 if (GNUNET_YES == is_peer_message (queue->message))
168 map = control->peer_messages;
169 else
170 map = control->member_messages;
171
173 &(queue->message->header.sender_id),
174 queue);
175
176 GNUNET_CONTAINER_DLL_remove (control->head, control->tail, queue);
177
178 handle_message_control (control,
179 contact,
180 &(queue->hash),
181 queue->message,
182 queue->flags);
183
184 destroy_message (queue->message);
185
187}
188
189
192 const struct GNUNET_ShortHashCode *key,
193 void *value)
194{
196
197 GNUNET_assert ((key) && (value));
198
199 queue = value;
200
201 if (queue->task)
202 return GNUNET_YES;
203
205 return GNUNET_YES;
206}
207
208
209void
211 const struct GNUNET_HashCode *sender,
212 const struct GNUNET_HashCode *context,
213 const struct GNUNET_HashCode *hash,
214 const struct GNUNET_MESSENGER_Message *message,
216{
217 struct GNUNET_MESSENGER_Contact *contact;
219 const struct GNUNET_ShortHashCode *id;
220
221 GNUNET_assert ((control) && (sender) && (context) && (hash) && (message));
222
223 {
225 struct GNUNET_MESSENGER_ContactStore *store;
226
227 handle = get_room_handle (control->room);
229
230 contact = get_store_contact_raw (store, context, sender);
231 }
232
233 if ((! contact) &&
234 (GNUNET_MESSENGER_KIND_JOIN != message->header.kind) &&
236 enqueue_message_control (control, sender, context, hash, message, flags);
237 else
238 handle_message_control (control, contact, hash, message, flags);
239
240 map = NULL;
241 id = &(message->header.sender_id);
242
243 if (GNUNET_YES == is_peer_message (message))
244 map = control->peer_messages;
245
246 switch (message->header.kind)
247 {
249 map = control->member_messages;
250 break;
252 map = control->peer_messages;
253 break;
255 map = control->member_messages;
256 id = &(message->body.id.id);
257 break;
258 default:
259 break;
260 }
261
262 if (! map)
263 return;
264
266 id,
268 NULL);
269}
struct GNUNET_HashCode key
The key used in the DHT.
static pa_context * context
Pulseaudio context.
static struct GNUNET_IDENTITY_Handle * id
Handle to IDENTITY.
static char * value
Value of the record to add/remove.
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition: gnunet-vpn.c:35
static void queue(const char *hostname)
Add hostname to the list of requests to be made.
commonly used definitions; globals in this file are exempt from the rule that the module name ("commo...
API to schedule computations using continuation passing style.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_CONTAINER_MultiShortmap * GNUNET_CONTAINER_multishortmap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multishortmap_put(struct GNUNET_CONTAINER_MultiShortmap *map, const struct GNUNET_ShortHashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
void GNUNET_CONTAINER_multishortmap_destroy(struct GNUNET_CONTAINER_MultiShortmap *map)
Destroy a hash map.
int GNUNET_CONTAINER_multishortmap_get_multiple(struct GNUNET_CONTAINER_MultiShortmap *map, const struct GNUNET_ShortHashCode *key, GNUNET_CONTAINER_ShortmapIterator it, void *it_cls)
Iterate over all entries in the map that match a particular key.
int GNUNET_CONTAINER_multishortmap_remove(struct GNUNET_CONTAINER_MultiShortmap *map, const struct GNUNET_ShortHashCode *key, const void *value)
Remove the given key-value pair from the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE
Allow multiple values with the same key.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_YES
@ GNUNET_NO
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_MESSENGER_MessageFlags
Enum for the different supported flags used by message handling.
@ GNUNET_MESSENGER_KIND_PEER
The peer kind.
@ GNUNET_MESSENGER_KIND_JOIN
The join kind.
@ GNUNET_MESSENGER_KIND_ID
The id kind.
@ GNUNET_MESSENGER_FLAG_RECENT
The recent flag.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:980
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1304
struct GNUNET_MESSENGER_Contact * get_store_contact_raw(struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, const struct GNUNET_HashCode *key_hash)
Returns a contact using the hash of a specific public key.
struct GNUNET_MESSENGER_ContactStore * get_handle_contact_store(struct GNUNET_MESSENGER_Handle *handle)
Returns the used contact store of a given handle.
struct GNUNET_MESSENGER_Message * copy_message(const struct GNUNET_MESSENGER_Message *message)
Creates and allocates a copy of a given message.
enum GNUNET_GenericReturnValue is_peer_message(const struct GNUNET_MESSENGER_Message *message)
Returns whether a specific kind of message can be sent by the service without usage of a clients priv...
const struct GNUNET_ShortHashCode * get_message_discourse(const struct GNUNET_MESSENGER_Message *message)
Returns the discourse hash of a message depending on its kind.
void destroy_message(struct GNUNET_MESSENGER_Message *message)
Destroys a message and frees its memory fully.
static enum GNUNET_GenericReturnValue iterate_message_control(void *cls, const struct GNUNET_ShortHashCode *key, void *value)
struct GNUNET_MESSENGER_MessageControl * create_message_control(struct GNUNET_MESSENGER_Room *room)
Creates and allocates a new message control for a room of the client API.
void destroy_message_control(struct GNUNET_MESSENGER_MessageControl *control)
Destroys a message control and frees its memory fully from the client API.
static void enqueue_message_control(struct GNUNET_MESSENGER_MessageControl *control, const struct GNUNET_HashCode *sender, const struct GNUNET_HashCode *context, const struct GNUNET_HashCode *hash, const struct GNUNET_MESSENGER_Message *message, enum GNUNET_MESSENGER_MessageFlags flags)
static void handle_message_control(struct GNUNET_MESSENGER_MessageControl *control, struct GNUNET_MESSENGER_Contact *contact, const struct GNUNET_HashCode *hash, const struct GNUNET_MESSENGER_Message *message, enum GNUNET_MESSENGER_MessageFlags flags)
void process_message_control(struct GNUNET_MESSENGER_MessageControl *control, const struct GNUNET_HashCode *sender, const struct GNUNET_HashCode *context, const struct GNUNET_HashCode *hash, const struct GNUNET_MESSENGER_Message *message, enum GNUNET_MESSENGER_MessageFlags flags)
Processes a new message with its hash and regarding information about sender, context and message fla...
static void task_message_control(void *cls)
void handle_room_message(struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER_Contact *sender, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash, enum GNUNET_MESSENGER_MessageFlags flags)
Handles a message with a given hash in a room for the client API to update members and its informatio...
void update_room_last_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash)
Updates the last message hash of a room for the client API so that new messages can point to the late...
void callback_room_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash)
Executes the message callback for a given hash in a room.
struct GNUNET_MESSENGER_Handle * get_room_handle(struct GNUNET_MESSENGER_Room *room)
Returns the messenger handle of the room.
static struct GNUNET_CONTAINER_MultiPeerMap * map
Peermap of PeerIdentities to "struct PeerEntry" (for fast lookup).
Definition: peer.c:63
Internal representation of the hash map.
A 512-bit hashcode.
struct GNUNET_MESSENGER_MessageId id
struct GNUNET_MESSENGER_Message * message
struct GNUNET_MESSENGER_MessageControl * control
enum GNUNET_MESSENGER_MessageFlags flags
struct GNUNET_CONTAINER_MultiShortmap * member_messages
struct GNUNET_MESSENGER_MessageControlQueue * head
struct GNUNET_CONTAINER_MultiShortmap * peer_messages
struct GNUNET_MESSENGER_MessageControlQueue * tail
enum GNUNET_MESSENGER_MessageKind kind
The kind of the message.
struct GNUNET_ShortHashCode sender_id
The senders id inside of the room the message was sent in.
struct GNUNET_ShortHashCode id
The new id which will replace the senders id in a room.
struct GNUNET_MESSENGER_MessageHeader header
Header.
struct GNUNET_MESSENGER_MessageBody body
Body.
A 256-bit hashcode.