libgnunetchat

library for GNUnet Messenger
Log | Files | Refs | README | LICENSE

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 }