/*
This file is part of GNUnet.
Copyright (C) 2020--2021 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
SPDX-License-Identifier: AGPL3.0-or-later
*/
/**
* @author Tobias Frisch
* @file src/messenger/gnunet-service-messenger_member_store.h
* @brief GNUnet MESSENGER service
*/
#ifndef GNUNET_SERVICE_MESSENGER_MEMBER_STORE_H
#define GNUNET_SERVICE_MESSENGER_MEMBER_STORE_H
#include "platform.h"
#include "gnunet_crypto_lib.h"
#include "gnunet_container_lib.h"
#include "gnunet_identity_service.h"
#include "messenger_api_message.h"
struct GNUNET_MESSENGER_SrvRoom;
struct GNUNET_MESSENGER_Member;
struct GNUNET_MESSENGER_MemberSession;
struct GNUNET_MESSENGER_MemberStore
{
struct GNUNET_MESSENGER_SrvRoom *room;
struct GNUNET_CONTAINER_MultiShortmap *members;
};
typedef int (*GNUNET_MESSENGER_MemberIteratorCallback) (
void *cls,
const struct GNUNET_IDENTITY_PublicKey *public_key,
struct GNUNET_MESSENGER_MemberSession *session);
/**
* Initializes a member store as fully empty connected to a room.
*
* @param[out] store Member store
* @param room Room
*/
void
init_member_store (struct GNUNET_MESSENGER_MemberStore *store,
struct GNUNET_MESSENGER_SrvRoom *room);
/**
* Clears a member store, wipes its content and deallocates its memory.
*
* @param[in/out] store Member store
*/
void
clear_member_store (struct GNUNET_MESSENGER_MemberStore *store);
/**
* Returns the used contact store of a given member store.
*
* @param[in/out] store Member store
* @return Contact store
*/
struct GNUNET_MESSENGER_ContactStore*
get_member_contact_store (struct GNUNET_MESSENGER_MemberStore *store);
/**
* Returns the shared secret you need to access a room of the store.
*
* @param[in] store Member store
* @return Shared secret
*/
const struct GNUNET_HashCode*
get_member_store_key (const struct GNUNET_MESSENGER_MemberStore *store);
/**
* Loads members from a directory into a member store.
*
* @param[out] store Member store
* @param[in] directory Path to a directory
*/
void
load_member_store (struct GNUNET_MESSENGER_MemberStore *store,
const char *directory);
/**
* Saves members from a member store into a directory.
*
* @param[in] store Member store
* @param[in] directory Path to a directory
*/
void
save_member_store (struct GNUNET_MESSENGER_MemberStore *store,
const char *directory);
/**
* Returns the member in a store identified by a given id. If the store
* does not contain a member with the given id, NULL gets returned.
*
* @param[in] store Member store
* @param[in] id Member id
* @return Member or NULL
*/
struct GNUNET_MESSENGER_Member*
get_store_member (const struct GNUNET_MESSENGER_MemberStore *store,
const struct GNUNET_ShortHashCode *id);
/**
* Returns the member of a store using a sender id of a given message.
* If the member does not provide a matching session, NULL gets returned.
*
* @param[in/out] store Member store
* @param[in] message Message
* @return Member or NULL
*/
struct GNUNET_MESSENGER_Member*
get_store_member_of (struct GNUNET_MESSENGER_MemberStore *store,
const struct GNUNET_MESSENGER_Message *message);
/**
* Adds a member to a store under a specific id and returns it on success.
*
* @param[in/out] store Member store
* @param[in] id Member id
* @return Member or NULL
*/
struct GNUNET_MESSENGER_Member*
add_store_member (struct GNUNET_MESSENGER_MemberStore *store,
const struct GNUNET_ShortHashCode *id);
/**
* Iterate through all member sessions currently connected to the members of the given
* member store and call the provided iterator callback with a selected closure.
* The function will return the amount of members it iterated through.
*
* @param[in/out] store Member store
* @param[in] it Iterator callback
* @param[in/out] cls Closure
* @return Amount of members iterated through
*/
int
iterate_store_members (struct GNUNET_MESSENGER_MemberStore *store,
GNUNET_MESSENGER_MemberIteratorCallback it,
void* cls);
#endif //GNUNET_SERVICE_MESSENGER_MEMBER_STORE_H