/*
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_ego_store.h
* @brief GNUnet MESSENGER service
*/
#ifndef GNUNET_SERVICE_MESSENGER_EGO_STORE_H
#define GNUNET_SERVICE_MESSENGER_EGO_STORE_H
#include "platform.h"
#include "gnunet_container_lib.h"
#include "messenger_api_ego.h"
struct GNUNET_MESSENGER_Ego;
struct GNUNET_MESSENGER_EgoStore;
typedef void
(*GNUNET_MESSENGER_EgoLookupCallback) (void *cls, const char *identifier,
const struct GNUNET_MESSENGER_Ego *ego);
struct GNUNET_MESSENGER_EgoLookup
{
struct GNUNET_MESSENGER_EgoLookup *prev;
struct GNUNET_MESSENGER_EgoLookup *next;
struct GNUNET_IDENTITY_EgoLookup *lookup;
struct GNUNET_MESSENGER_EgoStore *store;
GNUNET_MESSENGER_EgoLookupCallback cb;
void *cls;
char *identifier;
};
struct GNUNET_MESSENGER_EgoOperation
{
struct GNUNET_MESSENGER_EgoOperation *prev;
struct GNUNET_MESSENGER_EgoOperation *next;
struct GNUNET_IDENTITY_Operation *operation;
struct GNUNET_MESSENGER_EgoStore *store;
void *handle;
char *identifier;
};
struct GNUNET_MESSENGER_EgoStore
{
const struct GNUNET_CONFIGURATION_Handle *cfg;
struct GNUNET_IDENTITY_Handle *identity;
struct GNUNET_CONTAINER_MultiHashMap *egos;
struct GNUNET_MESSENGER_EgoLookup *lu_start;
struct GNUNET_MESSENGER_EgoLookup *lu_end;
struct GNUNET_MESSENGER_EgoOperation *op_start;
struct GNUNET_MESSENGER_EgoOperation *op_end;
};
/**
* Initializes an EGO-store as fully empty.
*
* @param[out] store EGO-store
* @param[in] config Configuration handle
*/
void
init_ego_store (struct GNUNET_MESSENGER_EgoStore *store, const struct GNUNET_CONFIGURATION_Handle *config);
/**
* Clears an EGO-store, wipes its content and deallocates its memory.
*
* @param[in/out] store EGO-store
*/
void
clear_ego_store (struct GNUNET_MESSENGER_EgoStore *store);
/**
* Creates a new EGO which will be registered to a store under
* a specific identifier. A given handle will be informed
* about the creation and changes its EGO accordingly.
*
* @param[in/out] store EGO-store
* @param[in] identifier Identifier string
* @param[in/out] handle Handle or NULL
*/
void
create_store_ego (struct GNUNET_MESSENGER_EgoStore *store, const char *identifier,
void *handle);
/**
* Lookups an EGO which was registered to a store under
* a specific identifier.
*
* @param[in/out] store EGO-store
* @param[in] identifier Identifier string
* @param[in] lookup Lookup callback (non-NULL)
* @param[in] cls Closure
*/
void
lookup_store_ego (struct GNUNET_MESSENGER_EgoStore *store, const char *identifier,
GNUNET_MESSENGER_EgoLookupCallback lookup, void *cls);
/**
* Updates the registration of an EGO to a store under
* a specific identifier with a new key.
*
* @param[in/out] store EGO-store
* @param[in] identifier Identifier string
* @param[in] key Private EGO key
* @return Updated EGO
*/
struct GNUNET_MESSENGER_Ego*
update_store_ego (struct GNUNET_MESSENGER_EgoStore *store, const char *identifier,
const struct GNUNET_IDENTITY_PrivateKey *key);
/**
* Updates the location of a registered EGO in a store to
* a different one under a specific new_identifier replacing
* its old one.
*
* @param[in/out] store EGO-store
* @param[in] old_identifier Old identifier string
* @param[in] new_identifier New identifier string
*/
void
rename_store_ego (struct GNUNET_MESSENGER_EgoStore *store, const char *old_identifier,
const char *new_identifier);
#endif //GNUNET_SERVICE_MESSENGER_EGO_STORE_H