libgnunetchat

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

gnunet_chat_group_intern.c (2235B)


      1 /*
      2    This file is part of GNUnet.
      3    Copyright (C) 2021--2026 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   const struct GNUNET_PeerIdentity *pid = group->handle->pid;
     52 
     53   if ((pid != NULL) && (0 == GNUNET_memcmp(pid, door)))
     54     return;
     55 
     56   union GNUNET_MESSENGER_RoomKey key;
     57   GNUNET_memcpy(
     58     &(key.hash),
     59     GNUNET_MESSENGER_room_get_key(group->context->room),
     60     sizeof(key.hash)
     61   );
     62 
     63   if ((GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains(
     64       group->registry, door)) ||
     65       (GNUNET_OK != GNUNET_CONTAINER_multipeermap_put(
     66       group->registry, door, NULL,
     67       GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
     68     return;
     69 
     70   GNUNET_MESSENGER_enter_room(
     71     group->handle->messenger,
     72     door,
     73     &key
     74   );
     75 }