aboutsummaryrefslogtreecommitdiff
path: root/src/messenger/messenger_api_handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/messenger/messenger_api_handle.c')
-rw-r--r--src/messenger/messenger_api_handle.c99
1 files changed, 41 insertions, 58 deletions
diff --git a/src/messenger/messenger_api_handle.c b/src/messenger/messenger_api_handle.c
index 20ef77254..ab57f82cc 100644
--- a/src/messenger/messenger_api_handle.c
+++ b/src/messenger/messenger_api_handle.c
@@ -1,6 +1,6 @@
1/* 1/*
2 This file is part of GNUnet. 2 This file is part of GNUnet.
3 Copyright (C) 2020 GNUnet e.V. 3 Copyright (C) 2020--2021 GNUnet e.V.
4 4
5 GNUnet is free software: you can redistribute it and/or modify it 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 6 under the terms of the GNU Affero General Public License as published
@@ -25,10 +25,14 @@
25 25
26#include "messenger_api_handle.h" 26#include "messenger_api_handle.h"
27 27
28#include "messenger_api_util.h"
29
28struct GNUNET_MESSENGER_Handle* 30struct GNUNET_MESSENGER_Handle*
29create_handle (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_MESSENGER_IdentityCallback identity_callback, 31create_handle (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_MESSENGER_IdentityCallback identity_callback,
30 void *identity_cls, GNUNET_MESSENGER_MessageCallback msg_callback, void *msg_cls) 32 void *identity_cls, GNUNET_MESSENGER_MessageCallback msg_callback, void *msg_cls)
31{ 33{
34 GNUNET_assert(cfg);
35
32 struct GNUNET_MESSENGER_Handle *handle = GNUNET_new(struct GNUNET_MESSENGER_Handle); 36 struct GNUNET_MESSENGER_Handle *handle = GNUNET_new(struct GNUNET_MESSENGER_Handle);
33 37
34 handle->cfg = cfg; 38 handle->cfg = cfg;
@@ -47,7 +51,8 @@ create_handle (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_MESSENGER_I
47 handle->reconnect_task = NULL; 51 handle->reconnect_task = NULL;
48 52
49 handle->rooms = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO); 53 handle->rooms = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
50 handle->contacts = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO); 54
55 init_contact_store(get_handle_contact_store(handle));
51 56
52 return handle; 57 return handle;
53} 58}
@@ -62,19 +67,11 @@ iterate_destroy_room (void *cls, const struct GNUNET_HashCode *key, void *value)
62 return GNUNET_YES; 67 return GNUNET_YES;
63} 68}
64 69
65static int
66iterate_destroy_contact (void *cls, const struct GNUNET_HashCode *key, void *value)
67{
68 struct GNUNET_MESSENGER_Contact *contact = value;
69
70 destroy_contact (contact);
71
72 return GNUNET_YES;
73}
74
75void 70void
76destroy_handle (struct GNUNET_MESSENGER_Handle *handle) 71destroy_handle (struct GNUNET_MESSENGER_Handle *handle)
77{ 72{
73 GNUNET_assert(handle);
74
78 if (handle->reconnect_task) 75 if (handle->reconnect_task)
79 GNUNET_SCHEDULER_cancel (handle->reconnect_task); 76 GNUNET_SCHEDULER_cancel (handle->reconnect_task);
80 77
@@ -94,12 +91,7 @@ destroy_handle (struct GNUNET_MESSENGER_Handle *handle)
94 GNUNET_CONTAINER_multihashmap_destroy (handle->rooms); 91 GNUNET_CONTAINER_multihashmap_destroy (handle->rooms);
95 } 92 }
96 93
97 if (handle->contacts) 94 clear_contact_store(get_handle_contact_store(handle));
98 {
99 GNUNET_CONTAINER_multihashmap_iterate (handle->contacts, iterate_destroy_contact, NULL);
100
101 GNUNET_CONTAINER_multihashmap_destroy (handle->contacts);
102 }
103 95
104 GNUNET_free(handle->name); 96 GNUNET_free(handle->name);
105} 97}
@@ -107,21 +99,27 @@ destroy_handle (struct GNUNET_MESSENGER_Handle *handle)
107void 99void
108set_handle_name (struct GNUNET_MESSENGER_Handle *handle, const char *name) 100set_handle_name (struct GNUNET_MESSENGER_Handle *handle, const char *name)
109{ 101{
102 GNUNET_assert(handle);
103
110 if (handle->name) 104 if (handle->name)
111 GNUNET_free(handle->name); 105 GNUNET_free(handle->name);
112 106
113 handle->name = name? GNUNET_strdup(name) : NULL; 107 handle->name = name ? GNUNET_strdup(name) : NULL;
114} 108}
115 109
116const char* 110const char*
117get_handle_name (const struct GNUNET_MESSENGER_Handle *handle) 111get_handle_name (const struct GNUNET_MESSENGER_Handle *handle)
118{ 112{
113 GNUNET_assert(handle);
114
119 return handle->name; 115 return handle->name;
120} 116}
121 117
122void 118void
123set_handle_key (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_IDENTITY_PublicKey *pubkey) 119set_handle_key (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_IDENTITY_PublicKey *pubkey)
124{ 120{
121 GNUNET_assert(handle);
122
125 if (!handle->pubkey) 123 if (!handle->pubkey)
126 handle->pubkey = GNUNET_new(struct GNUNET_IDENTITY_PublicKey); 124 handle->pubkey = GNUNET_new(struct GNUNET_IDENTITY_PublicKey);
127 125
@@ -131,62 +129,43 @@ set_handle_key (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_IDEN
131const struct GNUNET_IDENTITY_PublicKey* 129const struct GNUNET_IDENTITY_PublicKey*
132get_handle_key (const struct GNUNET_MESSENGER_Handle *handle) 130get_handle_key (const struct GNUNET_MESSENGER_Handle *handle)
133{ 131{
134 if (!handle->pubkey) 132 GNUNET_assert(handle);
135 {
136 struct GNUNET_IDENTITY_Ego *anonymous = GNUNET_IDENTITY_ego_get_anonymous ();
137 static struct GNUNET_IDENTITY_PublicKey pubkey;
138 133
139 GNUNET_IDENTITY_ego_get_public_key (anonymous, &pubkey); 134 if (handle->pubkey)
140 135 return handle->pubkey;
141 return &pubkey;
142 }
143 136
144 return handle->pubkey; 137 return get_anonymous_public_key ();
145} 138}
146 139
147struct GNUNET_MESSENGER_Contact* 140struct GNUNET_MESSENGER_ContactStore*
148get_handle_contact_by_pubkey (const struct GNUNET_MESSENGER_Handle *handle, 141get_handle_contact_store (struct GNUNET_MESSENGER_Handle *handle)
149 const struct GNUNET_IDENTITY_PublicKey *pubkey)
150{ 142{
151 struct GNUNET_HashCode hash; 143 GNUNET_assert(handle);
152
153 GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
154
155 struct GNUNET_MESSENGER_Contact *contact = GNUNET_CONTAINER_multihashmap_get (handle->contacts, &hash);
156
157 if (contact)
158 return contact;
159
160 contact = create_contact (pubkey);
161
162 if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (handle->contacts, &hash, contact,
163 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
164 return contact;
165 144
166 destroy_contact (contact); 145 return &(handle->contact_store);
167 return NULL;
168} 146}
169 147
170void 148struct GNUNET_MESSENGER_Contact*
171swap_handle_contact_by_pubkey (struct GNUNET_MESSENGER_Handle *handle, struct GNUNET_MESSENGER_Contact *contact, 149get_handle_contact (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_HashCode *key)
172 const struct GNUNET_IDENTITY_PublicKey *pubkey)
173{ 150{
174 const struct GNUNET_HashCode *hash = get_contact_id_from_key (contact); 151 GNUNET_assert((handle) && (key));
175 152
176 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (handle->contacts, hash, contact)) 153 struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (handle->rooms, key);
177 {
178 GNUNET_memcpy(&(contact->public_key), pubkey, sizeof(*pubkey));
179 154
180 hash = get_contact_id_from_key (contact); 155 if ((!room) || (!(room->contact_id)))
156 return NULL;
181 157
182 GNUNET_CONTAINER_multihashmap_put (handle->contacts, hash, contact, 158 struct GNUNET_HashCode context;
183 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); 159 get_context_from_member (key, room->contact_id, &context);
184 } 160
161 return get_store_contact(get_handle_contact_store(handle), &context, get_handle_key(handle));
185} 162}
186 163
187void 164void
188open_handle_room (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_HashCode *key) 165open_handle_room (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_HashCode *key)
189{ 166{
167 GNUNET_assert((handle) && (key));
168
190 struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (handle->rooms, key); 169 struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (handle->rooms, key);
191 170
192 if (room) 171 if (room)
@@ -197,6 +176,8 @@ void
197entry_handle_room_at (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_PeerIdentity *door, 176entry_handle_room_at (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_PeerIdentity *door,
198 const struct GNUNET_HashCode *key) 177 const struct GNUNET_HashCode *key)
199{ 178{
179 GNUNET_assert((handle) && (door) && (key));
180
200 struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (handle->rooms, key); 181 struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (handle->rooms, key);
201 182
202 if (room) 183 if (room)
@@ -206,6 +187,8 @@ entry_handle_room_at (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNE
206void 187void
207close_handle_room (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_HashCode *key) 188close_handle_room (struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_HashCode *key)
208{ 189{
190 GNUNET_assert((handle) && (key));
191
209 struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (handle->rooms, key); 192 struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (handle->rooms, key);
210 193
211 if ((room) && (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (handle->rooms, key, room))) 194 if ((room) && (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (handle->rooms, key, room)))