/*
This file is part of GNUnet.
Copyright (C) 2021--2022 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
*/
/*
The development of this code was supported by the NLnet foundation as part
of the NGI Assure initative to have a more free and secure internet.
*/
/*
* @author Tobias Frisch
* @file gnunet_chat_lib.h
*/
#ifndef GNUNET_CHAT_LIB_H_
#define GNUNET_CHAT_LIB_H_
/**
* @defgroup gnunet_chat GNUnet Chat library
*/
/**@{*/
#include
#include
#include
#include
/**
* @def GNUNET_CHAT_VERSION The major and minor version should be identical to
* the #GNUNET_MESSENGER_VERSION of the GNUnet Messenger
* service while the patch version is independent.
*/
#define GNUNET_CHAT_VERSION 0x000000010000L
#define GNUNET_CHAT_VERSION_MAJOR ((GNUNET_CHAT_VERSION >> 32L) & 0xFFFFL)
#define GNUNET_CHAT_VERSION_MINOR ((GNUNET_CHAT_VERSION >> 16L) & 0xFFFFL)
#define GNUNET_CHAT_VERSION_PATCH ((GNUNET_CHAT_VERSION >> 0L) & 0xFFFFL)
#define GNUNET_CHAT_URI_PREFIX "gnunet://chat/"
/**
* Enum for the different kinds of messages.
*/
enum GNUNET_CHAT_MessageKind
{
/**
* The kind to inform that something went wrong.
*/
GNUNET_CHAT_KIND_WARNING = 1, /**< GNUNET_CHAT_KIND_WARNING */
/**
* The kind to inform that the list of accounts was refreshed.
*/
GNUNET_CHAT_KIND_REFRESH = 2, /**< GNUNET_CHAT_KIND_REFRESH */
/**
* The kind to inform that the application can be used.
*/
GNUNET_CHAT_KIND_LOGIN = 3, /**< GNUNET_CHAT_KIND_LOGIN */
/**
* The kind to inform that a context was updated.
*/
GNUNET_CHAT_KIND_UPDATE = 4, /**< GNUNET_CHAT_KIND_UPDATE */
/**
* The kind to inform that a contact has joined a chat.
*/
GNUNET_CHAT_KIND_JOIN = 5, /**< GNUNET_CHAT_KIND_JOIN */
/**
* The kind to inform that a contact has left a chat.
*/
GNUNET_CHAT_KIND_LEAVE = 6, /**< GNUNET_CHAT_KIND_LEAVE */
/**
* The kind to inform that a contact has changed.
*/
GNUNET_CHAT_KIND_CONTACT = 7, /**< GNUNET_CHAT_KIND_CONTACT */
/**
* The kind to describe an invitation to a different chat.
*/
GNUNET_CHAT_KIND_INVITATION = 8, /**< GNUNET_CHAT_KIND_INVITATION */
/**
* The kind to describe a text message.
*/
GNUNET_CHAT_KIND_TEXT = 9, /**< GNUNET_CHAT_KIND_TEXT */
/**
* The kind to describe a shared file.
*/
GNUNET_CHAT_KIND_FILE = 10, /**< GNUNET_CHAT_KIND_FILE */
/**
* The kind to describe a whispered message.
*/
GNUNET_CHAT_KIND_WHISPER = 11, /**< GNUNET_CHAT_KIND_WHISPER */
/**
* The kind to inform about a deletion of a previous message.
*/
GNUNET_CHAT_KIND_DELETION = 12, /**< GNUNET_CHAT_KIND_DELETION */
/**
* An unknown kind of message.
*/
GNUNET_CHAT_KIND_UNKNOWN = 0 /**< GNUNET_CHAT_KIND_UNKNOWN */
};
/**
* Struct of a chat handle.
*/
struct GNUNET_CHAT_Handle;
/**
* Struct of a chat account.
*/
struct GNUNET_CHAT_Account;
/**
* Struct of a chat URI.
*/
struct GNUNET_CHAT_Uri;
/**
* Struct of a chat lobby.
*/
struct GNUNET_CHAT_Lobby;
/**
* Struct of a chat contact.
*/
struct GNUNET_CHAT_Contact;
/**
* Struct of a chat group.
*/
struct GNUNET_CHAT_Group;
/**
* Struct of a chat context.
*/
struct GNUNET_CHAT_Context;
/**
* Struct of a chat message.
*/
struct GNUNET_CHAT_Message;
/**
* Struct of a chat file.
*/
struct GNUNET_CHAT_File;
/**
* Struct of a chat invitation.
*/
struct GNUNET_CHAT_Invitation;
/**
* Iterator over chat accounts of a specific chat handle.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_iterate_accounts
* @param[in] handle Chat handle
* @param[in,out] account Chat account
* @return #GNUNET_YES if we should continue to iterate, #GNUNET_NO otherwise.
*/
typedef int
(*GNUNET_CHAT_AccountCallback) (void *cls,
const struct GNUNET_CHAT_Handle *handle,
struct GNUNET_CHAT_Account *account);
/**
* Method called when a lobby is opened to share with others via a chat URI.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_lobby_open
* @param[in] uri Chat URI of the lobby or NULL on error
*/
typedef void
(*GNUNET_CHAT_LobbyCallback) (void *cls,
const struct GNUNET_CHAT_Uri *uri);
/**
* Iterator over chat contacts of a specific chat handle.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_iterate_contacts
* @param[in,out] handle Chat handle
* @param[in,out] contact Chat contact
* @return #GNUNET_YES if we should continue to iterate, #GNUNET_NO otherwise.
*/
typedef int
(*GNUNET_CHAT_ContactCallback) (void *cls,
struct GNUNET_CHAT_Handle *handle,
struct GNUNET_CHAT_Contact *contact);
/**
* Iterator over chat groups of a specific chat handle.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_iterate_groups
* @param[in,out] handle Chat handle
* @param[in,out] group Chat group
* @return #GNUNET_YES if we should continue to iterate, #GNUNET_NO otherwise.
*/
typedef int
(*GNUNET_CHAT_GroupCallback) (void *cls,
struct GNUNET_CHAT_Handle *handle,
struct GNUNET_CHAT_Group *group);
/**
* Iterator over chat contacts in a specific chat group.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_group_iterate_contacts
* @param[in,out] group Chat group
* @param[in,out] contact Chat contact
* @return #GNUNET_YES if we should continue to iterate, #GNUNET_NO otherwise.
*/
typedef int
(*GNUNET_CHAT_GroupContactCallback) (void *cls,
const struct GNUNET_CHAT_Group *group,
struct GNUNET_CHAT_Contact *contact);
/**
* Iterator over chat messages in a specific chat context.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_context_iterate_messages
* @param[in,out] context Chat context or NULL
* @param[in] message Chat message
* @return #GNUNET_YES if we should continue to iterate, #GNUNET_NO otherwise.
*/
typedef int
(*GNUNET_CHAT_ContextMessageCallback) (void *cls,
struct GNUNET_CHAT_Context *context,
const struct GNUNET_CHAT_Message *message);
/**
* Iterator over chat files in a specific chat context.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_context_iterate_files
* @param[in,out] context Chat context
* @param[in,out] file Chat file
* @return #GNUNET_YES if we should continue to iterate, #GNUNET_NO otherwise.
*/
typedef int
(*GNUNET_CHAT_ContextFileCallback) (void *cls,
struct GNUNET_CHAT_Context *context,
struct GNUNET_CHAT_File *file);
/**
* Iterator over chat contacts in a chat to check whether they received a
* specific message or not.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_message_get_read_receipt
* @param[in] message Chat message
* @param[in] contact Chat contact
* @param[in] read_receipt #GNUNET_YES if the message was received by the contact,
* #GNUNET_NO otherwise
* @return #GNUNET_YES if we should continue to iterate, #GNUNET_NO otherwise.
*/
typedef int
(*GNUNET_CHAT_MessageReadReceiptCallback) (void *cls,
const struct GNUNET_CHAT_Message *message,
const struct GNUNET_CHAT_Contact *contact,
int read_receipt);
/**
* Method called during an upload of a specific file in a chat to share it.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_context_send_file
* @param[in] file Chat file
* @param[in] completed Amount of the file being uploaded (in bytes)
* @param[in] size Full size of the uploading file (in bytes)
*/
typedef void
(*GNUNET_CHAT_FileUploadCallback) (void *cls,
const struct GNUNET_CHAT_File *file,
uint64_t completed,
uint64_t size);
/**
* Method called during a download of a specific file in a chat which was shared.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_file_start_download
* @param[in] file Chat file
* @param[in] completed Amount of the file being downloaded (in bytes)
* @param[in] size Full size of the downloading file (in bytes)
*/
typedef void
(*GNUNET_CHAT_FileDownloadCallback) (void *cls,
const struct GNUNET_CHAT_File *file,
uint64_t completed,
uint64_t size);
/**
* Method called during an unindexing of a specific file in a chat which was
* uploaded before.
*
* @param[in,out] cls Closure from #GNUNET_CHAT_file_unindex
* @param[in,out] file Chat file
* @param[in] completed Amount of the file being unindexed (in bytes)
* @param[in] size Full size of the unindexing file (in bytes)
*/
typedef void
(*GNUNET_CHAT_FileUnindexCallback) (void *cls,
struct GNUNET_CHAT_File *file,
uint64_t completed,
uint64_t size);
/**
* Start a chat handle with a certain configuration.
*
* A custom callback for warnings and message events can be provided optionally
* together with their respective closures.
*
* @param[in] cfg Configuration
* @param[in] msg_cb Callback for message events (optional)
* @param[in,out] msg_cls Closure for message events (optional)
* @return Chat handle
*/
struct GNUNET_CHAT_Handle*
GNUNET_CHAT_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
GNUNET_CHAT_ContextMessageCallback msg_cb,
void *msg_cls);
/**
* Stops a chat handle closing all its remaining resources and frees the
* regarding memory.
*
* @param[in,out] handle Chat handle
*/
void
GNUNET_CHAT_stop (struct GNUNET_CHAT_Handle *handle);
/**
* Creates a new chat account to use with a given chat handle under a
* unique name.
*
* If a specific name is already in use of another chat accounts, the function
* will fail and return #GNUNET_NO.
*
* @param[in,out] handle Chat handle
* @param[in] name Account name
* @return #GNUNET_OK on success, #GNUNET_NO on failure and otherwise #GNUNET_SYSERR
*/
int
GNUNET_CHAT_account_create (struct GNUNET_CHAT_Handle *handle,
const char* name);
/**
* Deletes an existing chat account of a given chat handle under a
* unique name.
*
* @param[in,out] handle Chat handle
* @param[in] name Account name
* @return #GNUNET_OK on success, otherwise #GNUNET_SYSERR
*/
int
GNUNET_CHAT_account_delete(struct GNUNET_CHAT_Handle *handle,
const char* name);
/**
* Iterates through the accounts of a given chat handle with a selected
* callback and custom closure.
*
* @param[in] handle Chat handle
* @param[in] callback Callback for account iteration (optional)
* @param[in,out] cls Closure for account iteration (optional)
* @return Amount of accounts iterated or #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_iterate_accounts (const struct GNUNET_CHAT_Handle *handle,
GNUNET_CHAT_AccountCallback callback,
void *cls);
/**
* Connects a chat handle to a selected chat account.
*
* @param[in] account Chat account
*/
void
GNUNET_CHAT_connect (struct GNUNET_CHAT_Handle *handle,
const struct GNUNET_CHAT_Account *account);
/**
* Disconnects a chat handle from the current chat account.
*
* @param[in,out] handle Chat handle
*/
void
GNUNET_CHAT_disconnect (struct GNUNET_CHAT_Handle *handle);
/**
* Returns the connected account of a chat handle for related
* communication or NULL if no account is set yet.
*
* @param handle Chat handle
* @return Account used by the handle or NULL
*/
const struct GNUNET_CHAT_Account*
GNUNET_CHAT_get_connected (const struct GNUNET_CHAT_Handle *handle);
/**
* Updates a chat handle to renew the used ego to sign sent messages in active
* chats.
*
* Updating the chat handle should only be used if necessary because the usage
* can require renewed exchanging of GNS entries.
*
* @param[in,out] handle Chat handle
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_update (struct GNUNET_CHAT_Handle *handle);
/**
* Updates the name of a chat handle for related communication.
*
* @param[in,out] handle Chat handle
* @param[in] name New name or NULL
* @return #GNUNET_YES on success, #GNUNET_NO on failure and #GNUNET_SYSERR if handle is NULL
*/
int
GNUNET_CHAT_set_name (struct GNUNET_CHAT_Handle *handle,
const char *name);
/**
* Returns the name of a chat handle for related communication or NULL if no
* name is set.
*
* @param[in] handle Chat handle
* @return Name used by the handle or NULL
*/
const char*
GNUNET_CHAT_get_name (const struct GNUNET_CHAT_Handle *handle);
/**
* Returns the public key of the used ego to verify signatures of sent messages.
*
* @param[in] handle Chat handle
* @return Public key of the handles ego or NULL
*/
const char*
GNUNET_CHAT_get_key (const struct GNUNET_CHAT_Handle *handle);
/**
* Convert an UTF-8 String to a chat URI which will be newly allocated.
*
* @param[in] uri UTF-8 string to parse
* @param[out] emsg Where to store the parser error message (if any)
* @return NULL on error
*/
struct GNUNET_CHAT_Uri*
GNUNET_CHAT_uri_parse (const char *uri,
char **emsg);
/**
* Convert a chat URI to a UTF-8 String.
*
* @param[in] uri Chat URI
* @return The UTF-8 string representing the URI
*/
char*
GNUNET_CHAT_uri_to_string (const struct GNUNET_CHAT_Uri *uri);
/**
* Free an allocated chat URI.
*
* @param[in,out] uri Chat URI
*/
void
GNUNET_CHAT_uri_destroy (struct GNUNET_CHAT_Uri *uri);
/**
* Opens an empty chat lobby which will expire after a custom delay.
*
* @param[in,out] handle Chat handle
* @param[in] delay Expiration delay
* @param[in] callback Callback for the lobby opening
* @param[in,out] cls Closure for the lobby opening (optional)
* @return Chat lobby
*/
struct GNUNET_CHAT_Lobby*
GNUNET_CHAT_lobby_open (struct GNUNET_CHAT_Handle *handle,
struct GNUNET_TIME_Relative delay,
GNUNET_CHAT_LobbyCallback callback,
void *cls);
/**
* Closes a chat lobby overriding the expiration to be now.
*
* @param[in,out] lobby Chat lobby
*/
void
GNUNET_CHAT_lobby_close (struct GNUNET_CHAT_Lobby *lobby);
/**
* Joins an open lobby via URI with a given chat handle if it can still
* be resolved (depends on connection and expiration of the lobby).
*
* @param[in,out] handle Chat handle
* @param[in] uri Chat URI
*/
void
GNUNET_CHAT_lobby_join (struct GNUNET_CHAT_Handle *handle,
const struct GNUNET_CHAT_Uri *uri);
/**
* Sets a custom user pointer to a given chat handle so it can
* be accessed in all handle related callbacks.
*
* @param[in,out] handle Chat handle
* @param[in] user_pointer Custom user pointer
*/
void
GNUNET_CHAT_set_user_pointer (struct GNUNET_CHAT_Handle *handle,
void *user_pointer);
/**
* Returns the custom user pointer of a given chat handle or NULL if it
* was not set any.
*
* @param[in] handle Chat handle
* @return Custom user pointer or NULL
*/
void*
GNUNET_CHAT_get_user_pointer (const struct GNUNET_CHAT_Handle *handle);
/**
* Iterates through the contacts of a given chat handle with a selected
* callback and custom closure.
*
* @param[in,out] handle Chat handle
* @param[in] callback Callback for contact iteration (optional)
* @param[in,out] cls Closure for contact iteration (optional)
* @return Amount of contacts iterated or #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_iterate_contacts (struct GNUNET_CHAT_Handle *handle,
GNUNET_CHAT_ContactCallback callback,
void *cls);
/**
* Returns the provided name of a given account or NULL on failure.
*
* @param[in] account Chat account
* @return Name or NULL
*/
const char*
GNUNET_CHAT_account_get_name (const struct GNUNET_CHAT_Account *account);
/**
* Sets a custom user pointer to a given chat account so it can
* be accessed in account related callbacks.
*
* @param[in,out] account Chat account
* @param[in] user_pointer Custom user pointer
*/
void
GNUNET_CHAT_account_set_user_pointer (struct GNUNET_CHAT_Account *account,
void *user_pointer);
/**
* Returns the custom user pointer of a given contact or NULL if it was
* not set any.
*
* @param[in] account Chat account
* @return Custom user pointer or NULL
*/
void*
GNUNET_CHAT_account_get_user_pointer (const struct GNUNET_CHAT_Account *account);
/**
* Creates a new group chat to use with a given chat handle with an
* optional public topic.
*
* If a specific topic is used, the created group will be publically
* available to join for others searching for the used topic. Otherwise the
* group will be private using a randomly generated key and others can only
* join the chat via a private invitation.
*
* @param[in,out] handle Chat handle
* @param[in] topic Public topic (optional)
* @return New group chat
*/
struct GNUNET_CHAT_Group*
GNUNET_CHAT_group_create (struct GNUNET_CHAT_Handle *handle,
const char* topic);
/**
* Iterates through the groups of a given chat handle with a selected
* callback and custom closure.
*
* @param[in,out] handle Chat handle
* @param[in] callback Callback for group iteration (optional)
* @param[in,out] cls Closure for group iteration (optional)
* @return Amount of groups iterated or #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_iterate_groups (struct GNUNET_CHAT_Handle *handle,
GNUNET_CHAT_GroupCallback callback,
void *cls);
/**
* Leaves the private chat with a specific contact and frees the
* regarding memory of the contact if there remains no common chat with it.
*
* @param[in,out] contact Cntact
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_contact_delete (struct GNUNET_CHAT_Contact *contact);
/**
* Overrides the name of a given contact with a custom nick name
* which will be only used locally.
*
* @param[in,out] contact Contact
* @param[in] name Custom nick name
*/
void
GNUNET_CHAT_contact_set_name (struct GNUNET_CHAT_Contact *contact,
const char *name);
/**
* Returns the provided name of a given contact or its custom nick name
* if it was overriden.
*
* @param[in] contact Contact
* @return Name or custom nick name
*/
const char*
GNUNET_CHAT_contact_get_name (const struct GNUNET_CHAT_Contact *contact);
/**
* Returns the public key of the used ego by a specific contact to
* verify signatures of sent messages.
*
* @param[in] contact Contact
* @return Public key of the contacts ego or NULL
*/
const char*
GNUNET_CHAT_contact_get_key (const struct GNUNET_CHAT_Contact *contact);
/**
* Returns the chat context for a private chat with a given contact.
*
* @param[in,out] contact Contact
* @return Chat context
*/
struct GNUNET_CHAT_Context*
GNUNET_CHAT_contact_get_context (struct GNUNET_CHAT_Contact *contact);
/**
* Sets a custom user pointer to a given contact so it can be
* accessed in contact related callbacks.
*
* @param[in,out] contact Contact
* @param[in] user_pointer Custom user pointer
*/
void
GNUNET_CHAT_contact_set_user_pointer (struct GNUNET_CHAT_Contact *contact,
void *user_pointer);
/**
* Returns the custom user pointer of a given contact or NULL if it was
* not set any.
*
* @param[in] contact Contact
* @return Custom user pointer or NULL
*/
void*
GNUNET_CHAT_contact_get_user_pointer (const struct GNUNET_CHAT_Contact *contact);
/**
* Returns if a given contact is owned by the current account and whether
* it has sent messages with.
*
* @param[in] contact Contact
* @return GNUNET_YES if the contact is owned, otherwise GNUNET_NO
* and GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_contact_is_owned (const struct GNUNET_CHAT_Contact *contact);
/**
* Leaves a specific group chat and frees its memory if it is not shared
* with other groups or contacts.
*
* @param[in,out] group Group
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_group_leave (struct GNUNET_CHAT_Group *group);
/**
* Sets the name of a given group to a custom nick name
* which will be only used locally.
*
* @param[in,out] group Group
* @param[in] name Custom nick name
*/
void
GNUNET_CHAT_group_set_name (struct GNUNET_CHAT_Group *group,
const char *name);
/**
* Returns the custom nick name of a given group if it was overriden.
*
* @param[in] group Group
* @return Custom nick name or NULL
*/
const char*
GNUNET_CHAT_group_get_name (const struct GNUNET_CHAT_Group *group);
/**
* Sets a custom user pointer to a given group so it can be
* accessed in group related callbacks.
*
* @param[in,out] group Group
* @param[in] user_pointer Custom user pointer
*/
void
GNUNET_CHAT_group_set_user_pointer (struct GNUNET_CHAT_Group *group,
void *user_pointer);
/**
* Returns the custom user pointer of a given group or NULL if it was
* not set any.
*
* @param[in] group Group
* @return Custom user pointer or NULL
*/
void*
GNUNET_CHAT_group_get_user_pointer (const struct GNUNET_CHAT_Group *group);
/**
* Invites a specific contact to a given group via a privately
* sent invitation.
*
* @param[in,out] group Group
* @param[in,out] contact Contact
*/
void
GNUNET_CHAT_group_invite_contact (const struct GNUNET_CHAT_Group *group,
struct GNUNET_CHAT_Contact *contact);
/**
* Iterates through the contacts of a given group with a selected
* callback and custom closure.
*
* @param[in,out] group Group
* @param[in] callback Callback for contact iteration (optional)
* @param[in,out] cls Closure for contact iteration (optional)
* @return Amount of contacts iterated or #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_group_iterate_contacts (const struct GNUNET_CHAT_Group *group,
GNUNET_CHAT_GroupContactCallback callback,
void *cls);
/**
* Sets a custom user pointer to a given member relative to a
* group so it can be accessed in member related callbacks.
*
* @param[in,out] group Chat group
* @param[in] member Contact
* @param[in] user_pointer Custom user pointer
*/
void
GNUNET_CHAT_member_set_user_pointer (struct GNUNET_CHAT_Group *group,
const struct GNUNET_CHAT_Contact *member,
void *user_pointer);
/**
* Returns the custom user pointer of a given member relative to a
* group or NULL if it was not set any.
*
* @param[in] group Chat group
* @param[in] member Contact
* @return Custom user pointer or NULL
*/
void*
GNUNET_CHAT_member_get_user_pointer (const struct GNUNET_CHAT_Group *group,
const struct GNUNET_CHAT_Contact *member);
/**
* Returns the chat context for a chat with a given group.
*
* @param[in,out] group Group
* @return Chat context
*/
struct GNUNET_CHAT_Context*
GNUNET_CHAT_group_get_context (struct GNUNET_CHAT_Group *group);
/**
* Returns the current status of a given context whether it is usable
* or not to communicate with other contacts.
*
* @param[in] context Context
* @return #GNUNET_OK if usable, #GNUNET_NO if the context has been requested,
* #GNUNET_SYSERR otherwise.
*/
int
GNUNET_CHAT_context_get_status (const struct GNUNET_CHAT_Context *context);
/**
* Requests a context to get established between all required contacts.
* The current status of this request can be tracked via
* #GNUNET_CHAT_context_get_status() and will only change through the
* receivement of new messages.
*
* @param[in,out] context Context
*/
void
GNUNET_CHAT_context_request (struct GNUNET_CHAT_Context *context);
/**
* Returns the chat contact which uses a given context.
*
* @param[in] context Context
* @return Chat contact
*/
struct GNUNET_CHAT_Contact*
GNUNET_CHAT_context_get_contact (struct GNUNET_CHAT_Context *context);
/**
* Returns the chat group which uses a given context.
*
* @param[in] context Context
* @return Chat group
*/
struct GNUNET_CHAT_Group*
GNUNET_CHAT_context_get_group (struct GNUNET_CHAT_Context *context);
/**
* Sets a custom user pointer to a given chat context so it can
* be accessed in chat context related callbacks.
*
* @param[in,out] context Chat context
* @param[in] user_pointer Custom user pointer
*/
void
GNUNET_CHAT_context_set_user_pointer (struct GNUNET_CHAT_Context *context,
void *user_pointer);
/**
* Returns the custom user pointer of a given chat context or NULL if it
* was not set any.
*
* @param[in] context Chat context
* @return Custom user pointer or NULL
*/
void*
GNUNET_CHAT_context_get_user_pointer (const struct GNUNET_CHAT_Context *context);
/**
* Sends a selected text into a given chat context.
*
* @param[in,out] context Chat context
* @param[in] text Text
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_context_send_text (struct GNUNET_CHAT_Context *context,
const char *text);
/**
* Sends a read receipt depending on a selected message into a given
* chat context.
*
* @param[in,out] context Chat context
* @param[in] message Message (optional)
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_context_send_read_receipt (struct GNUNET_CHAT_Context *context,
const struct GNUNET_CHAT_Message *message);
/**
* Uploads a local file specified via its path using symmetric encryption
* and shares the regarding information to download and decrypt it in a given
* chat context.
*
* @param[in,out] context Chat context
* @param[in] path Local file path
* @param[in] callback Callback for file uploading (optional)
* @param[in,out] cls Closure for file uploading (optional)
* @return The file handle on success, NULL on failure
*/
struct GNUNET_CHAT_File*
GNUNET_CHAT_context_send_file (struct GNUNET_CHAT_Context *context,
const char *path,
GNUNET_CHAT_FileUploadCallback callback,
void *cls);
/**
* Shares the information to download and decrypt a specific file from
* another chat in a given chat context.
*
* @param[in,out] context Chat context
* @param[in] file File handle
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_context_share_file (struct GNUNET_CHAT_Context *context,
const struct GNUNET_CHAT_File *file);
/**
* Iterates through the contacts of a given chat context with a selected
* callback and custom closure.
*
* @param[in,out] context Chat context
* @param[in] callback Callback for contact iteration (optional)
* @param[in,out] cls Closure for contact iteration (optional)
* @return Amount of contacts iterated or #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_context_iterate_messages (struct GNUNET_CHAT_Context *context,
GNUNET_CHAT_ContextMessageCallback callback,
void *cls);
/**
* Iterates through the files of a given chat context with a selected
* callback and custom closure.
*
* @param[in,out] context Chat context
* @param[in] callback Callback for file iteration (optional)
* @param[in,out] cls Closure for file iteration (optional)
* @return Amount of files iterated or #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_context_iterate_files (struct GNUNET_CHAT_Context *context,
GNUNET_CHAT_ContextFileCallback callback,
void *cls);
/**
* Returns the kind of a given message to determine its content and
* related usage.
*
* @param[in] message Message
* @return The kind of message
*/
enum GNUNET_CHAT_MessageKind
GNUNET_CHAT_message_get_kind (const struct GNUNET_CHAT_Message *message);
/**
* Returns the timestamp of a given message in absolute measure.
*
* @param[in] message Message
* @return The timestamp of message
*/
struct GNUNET_TIME_Absolute
GNUNET_CHAT_message_get_timestamp (const struct GNUNET_CHAT_Message *message);
/**
* Returns the contact of the sender from a given message.
*
* @param[in] message Message
* @return Contact of the messages sender
*/
struct GNUNET_CHAT_Contact*
GNUNET_CHAT_message_get_sender (const struct GNUNET_CHAT_Message *message);
/**
* Returns #GNUNET_YES if the message was sent by the related chat handle,
* otherwise it returns #GNUNET_NO.
*
* @param[in] message Message
* @return #GNUNET_YES if the message was sent, otherwise #GNUNET_NO
*/
int
GNUNET_CHAT_message_is_sent (const struct GNUNET_CHAT_Message *message);
/**
* Returns #GNUNET_YES if the message was received privately encrypted by the
* related chat handle, otherwise it returns #GNUNET_NO.
*
* @param[in] message Message
* @return #GNUNET_YES if the message was privately received,
* otherwise #GNUNET_NO
*/
int
GNUNET_CHAT_message_is_private (const struct GNUNET_CHAT_Message *message);
/**
* Iterates through the contacts of the context related to a given chat
* message to check whether it was received by each of the contacts.
*
* @param[in] message Message
* @param[in] callback Callback for contact iteration (optional)
* @param[in,out] cls Closure for contact iteration (optional)
* @return Amount of contacts iterated or #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_message_get_read_receipt (const struct GNUNET_CHAT_Message *message,
GNUNET_CHAT_MessageReadReceiptCallback callback,
void *cls);
/**
* Returns the text of a given message if its kind is
* #GNUNET_CHAT_KIND_TEXT or #GNUNET_CHAT_KIND_WARNING,
* otherwise it returns NULL.
*
* @param[in] message Message
* @return The text of message or NULL
*/
const char*
GNUNET_CHAT_message_get_text (const struct GNUNET_CHAT_Message *message);
/**
* Returns the file handle of a given message if its kind is
* #GNUNET_CHAT_KIND_FILE, otherwise it returns NULL.
*
* @param[in] message Message
* @return The file handle of message or NULL
*/
struct GNUNET_CHAT_File*
GNUNET_CHAT_message_get_file (const struct GNUNET_CHAT_Message *message);
/**
* Returns the invitation of a given message if its kind is
* #GNUNET_CHAT_KIND_INVITATION, otherwise it returns NULL.
*
* @param[in] message Message
* @return The invitation of message or NULL
*/
struct GNUNET_CHAT_Invitation*
GNUNET_CHAT_message_get_invitation (const struct GNUNET_CHAT_Message *message);
/**
* Returns the target message of an operation represented by a given
* message if its kind is #GNUNET_CHAT_KIND_DELETION, otherwise it
* returns NULL.
*
* @param[in] message Message
* @return The target of message or NULL
*/
const struct GNUNET_CHAT_Message*
GNUNET_CHAT_message_get_target (const struct GNUNET_CHAT_Message *message);
/**
* Deletes a given message with a specific relative delay.
*
* @param[in] message Message
* @param[in] delay Relative delay
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_message_delete (const struct GNUNET_CHAT_Message *message,
struct GNUNET_TIME_Relative delay);
/**
* Returns the name of a given file handle.
*
* @param[in] file File handle
* @return The file name of file
*/
const char*
GNUNET_CHAT_file_get_name (const struct GNUNET_CHAT_File *file);
/**
* Returns the hash of a given file handle.
*
* @param[in] file File handle
* @return The hash of file
*/
const struct GNUNET_HashCode*
GNUNET_CHAT_file_get_hash (const struct GNUNET_CHAT_File *file);
/**
* Returns the actual file size of a given file handle.
*
* @param[in] file File handle
* @return The file size of file
*/
uint64_t
GNUNET_CHAT_file_get_size (const struct GNUNET_CHAT_File *file);
/**
* Returns the local file size of a given file handle.
*
* This can be less than the actual size of the file once its download
* has been completed!
*
* @param[in] file File handle
* @return The local file size of file
*/
uint64_t
GNUNET_CHAT_file_get_local_size (const struct GNUNET_CHAT_File *file);
/**
* Returns if a given file handle is currently uploading.
*
* @param[in] file File handle
* @return #GNUNET_YES during active upload, #GNUNET_NO otherwise
*/
int
GNUNET_CHAT_file_is_uploading (const struct GNUNET_CHAT_File *file);
/**
* Returns the temporary file name of the decrypted file preview
* of a given file handle.
*
* This can only be used when the file handle is ready to preview!
* @see GNUNET_CHAT_file_is_ready()
*
* @param[in,out] file File handle
* @return The temporary file name or NULL on error
*/
const char*
GNUNET_CHAT_file_open_preview (struct GNUNET_CHAT_File *file);
/**
* Deletes the temporary decrypted file preview of a given file
* handle.
*
* This can only be used when the file handle is ready to preview!
* @see GNUNET_CHAT_file_is_ready()
*
* @param[out] file File handle
*/
void
GNUNET_CHAT_file_close_preview (struct GNUNET_CHAT_File *file);
/**
* Sets a custom user pointer to a given file handle so it can
* be accessed in file related callbacks.
*
* @param[in,out] file File handle
* @param[in] user_pointer Custom user pointer
*/
void
GNUNET_CHAT_file_set_user_pointer (struct GNUNET_CHAT_File *file,
void *user_pointer);
/**
* Returns the custom user pointer of a given file handle or NULL if it
* was not set any.
*
* @param[in] file File handle
* @return Custom user pointer
*/
void*
GNUNET_CHAT_file_get_user_pointer (const struct GNUNET_CHAT_File *file);
/**
* Returns if a given file handle is currently downloading.
*
* @param[in] file File handle
* @return #GNUNET_YES during active download, #GNUNET_NO otherwise
*/
int
GNUNET_CHAT_file_is_downloading (const struct GNUNET_CHAT_File *file);
/**
* Starts downloading a file from a given file handle and sets up a
* selected callback and custom closure for its progress.
*
* @param[in,out] file File handle
* @param[in] callback Callback for file downloading (optional)
* @param[in,out] cls Closure for file downloading (optional)
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_file_start_download (struct GNUNET_CHAT_File *file,
GNUNET_CHAT_FileDownloadCallback callback,
void *cls);
/**
* Pause downloading a file from a given file handle.
*
* @param[in,out] file File handle
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_file_pause_download (struct GNUNET_CHAT_File *file);
/**
* Resume downloading a file from a given file handle.
*
* @param[in,out] file File handle
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_file_resume_download (struct GNUNET_CHAT_File *file);
/**
* Stops downloading a file from a given file handle.
*
* @param[in,out] file File handle
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_file_stop_download (struct GNUNET_CHAT_File *file);
/**
* Returns if a given file handle is currently unindexing.
*
* @param[in] file File handle
* @return #GNUNET_YES during active unindexing, #GNUNET_NO otherwise
*/
int
GNUNET_CHAT_file_is_unindexing (const struct GNUNET_CHAT_File *file);
/**
* Unindexes an uploaded file from a given file handle with a selected
* callback and a custom closure.
*
* @param[in,out] file File handle
* @param[in] callback Callback for file unindexing (optional)
* @param[in,out] cls Closure for file unindexing (optional)
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
GNUNET_CHAT_file_unindex (struct GNUNET_CHAT_File *file,
GNUNET_CHAT_FileUnindexCallback callback,
void *cls);
/**
* Accepts a given chat invitation to enter another chat.
*
* @param[in,out] invitation Chat invitation
*/
void
GNUNET_CHAT_invitation_accept (struct GNUNET_CHAT_Invitation *invitation);
/**@}*/
#endif /* GNUNET_CHAT_LIB_H_ */