gnunet_chat_lobby.c (3212B)
1 /* 2 This file is part of GNUnet. 3 Copyright (C) 2022--2025 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 */ 20 /* 21 * @author Tobias Frisch 22 * @file gnunet_chat_lobby.c 23 */ 24 25 #include "gnunet_chat_lobby.h" 26 27 #include "gnunet_chat_handle.h" 28 #include "gnunet_chat_lobby_intern.c" 29 #include <gnunet/gnunet_messenger_service.h> 30 31 struct GNUNET_CHAT_Lobby* 32 lobby_create (struct GNUNET_CHAT_Handle *handle) 33 { 34 GNUNET_assert(handle); 35 36 struct GNUNET_CHAT_Lobby *lobby = GNUNET_new(struct GNUNET_CHAT_Lobby); 37 38 lobby->handle = handle; 39 lobby->destruction = NULL; 40 lobby->context = NULL; 41 lobby->uri = NULL; 42 43 lobby->op = NULL; 44 lobby->query = NULL; 45 46 lobby->expiration = GNUNET_TIME_absolute_get_forever_(); 47 lobby->callback = NULL; 48 lobby->cls = NULL; 49 50 return lobby; 51 } 52 53 void 54 lobby_destroy (struct GNUNET_CHAT_Lobby *lobby) 55 { 56 GNUNET_assert(lobby); 57 58 if (lobby->destruction) 59 GNUNET_SCHEDULER_cancel(lobby->destruction); 60 61 if ((!(lobby->op)) && (!(lobby->query))) 62 goto skip_deletion; 63 64 handle_delete_lobby(lobby->handle, lobby); 65 66 skip_deletion: 67 if (lobby->op) 68 GNUNET_IDENTITY_cancel(lobby->op); 69 70 if (lobby->query) 71 GNUNET_NAMESTORE_cancel(lobby->query); 72 73 if (lobby->uri) 74 uri_destroy(lobby->uri); 75 76 GNUNET_free(lobby); 77 } 78 79 void 80 lobby_open (struct GNUNET_CHAT_Lobby *lobby, 81 struct GNUNET_TIME_Relative delay, 82 GNUNET_CHAT_LobbyCallback callback, 83 void *cls) 84 { 85 GNUNET_assert(lobby); 86 87 char *name; 88 89 lobby->expiration = GNUNET_TIME_relative_to_absolute(delay); 90 lobby->callback = callback; 91 lobby->cls = cls; 92 93 if (lobby->op) 94 { 95 GNUNET_IDENTITY_cancel(lobby->op); 96 goto open_zone; 97 } 98 99 union GNUNET_MESSENGER_RoomKey key; 100 GNUNET_MESSENGER_create_room_key( 101 &key, 102 NULL, 103 GNUNET_NO, 104 GNUNET_NO, 105 GNUNET_NO 106 ); 107 108 struct GNUNET_MESSENGER_Room *room = GNUNET_MESSENGER_open_room( 109 lobby->handle->messenger, 110 &key 111 ); 112 113 if (!room) 114 return; 115 116 lobby->context = context_create_from_room(lobby->handle, room); 117 118 if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put( 119 lobby->handle->contexts, &(key.hash), lobby->context, 120 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) 121 { 122 context_destroy(lobby->context); 123 lobby->context = NULL; 124 125 GNUNET_MESSENGER_close_room(room); 126 return; 127 } 128 129 open_zone: 130 util_lobby_name(&(key.hash), &name); 131 132 lobby->op = GNUNET_IDENTITY_create( 133 lobby->handle->identity, 134 name, 135 NULL, 136 GNUNET_PUBLIC_KEY_TYPE_EDDSA, 137 cont_lobby_identity_create, 138 lobby 139 ); 140 141 GNUNET_free(name); 142 }