libgnunetchat

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

gnunet_chat_group_intern.c (2253B)


      1 /*
      2    This file is part of GNUnet.
      3    Copyright (C) 2021--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_group_intern.c
     23  */
     24 
     25 #include "gnunet_chat_context.h"
     26 #include "gnunet_chat_handle.h"
     27 
     28 #include <gnunet/gnunet_messenger_service.h>
     29 
     30 #define GNUNET_UNUSED __attribute__ ((unused))
     31 
     32 void
     33 search_group_by_topic(void *cls,
     34                       const struct GNUNET_PeerIdentity *door,
     35                       GNUNET_UNUSED const struct GNUNET_PeerIdentity *get_path,
     36                       GNUNET_UNUSED unsigned int get_path_length,
     37                       GNUNET_UNUSED const struct GNUNET_PeerIdentity *put_path,
     38                       GNUNET_UNUSED unsigned int put_path_length)
     39 {
     40   struct GNUNET_CHAT_Group *group = cls;
     41 
     42   GNUNET_assert(
     43     (group) &&
     44 		(group->handle) &&
     45 		(group->handle->cfg) &&
     46 		(group->handle->messenger) &&
     47 		(group->context) &&
     48 		(group->context->room)
     49   );
     50 
     51   struct GNUNET_PeerIdentity peer;
     52   GNUNET_CRYPTO_get_peer_identity(group->handle->cfg, &peer);
     53 
     54   if (0 == GNUNET_memcmp(&peer, door))
     55     return;
     56 
     57   union GNUNET_MESSENGER_RoomKey key;
     58   GNUNET_memcpy(
     59     &(key.hash),
     60     GNUNET_MESSENGER_room_get_key(group->context->room),
     61     sizeof(key.hash)
     62   );
     63 
     64   if ((GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains(
     65       group->registry, door)) ||
     66       (GNUNET_OK != GNUNET_CONTAINER_multipeermap_put(
     67       group->registry, door, NULL,
     68       GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
     69     return;
     70 
     71   GNUNET_MESSENGER_enter_room(
     72     group->handle->messenger,
     73     door,
     74     &key
     75   );
     76 }