You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

419 lines
11 KiB

/* lutjanus.h - So 24. Jan 07:42:22 CET 2021
*
* vim: expandtab:ts=2:sts=2:sw=2
*
* Copyright (C) 2021 DebXWoody <stefan@devlug.de>
*
* This file is part of liblutjanus.
*
* liblutjanus is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* liblutjanus 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with buteo. If not, see <http://www.gnu.org/licenses/>.
*/
/*!
* \file lutjanus.h
* \brief The lutjanus API.
*
* \mainpage
*
* lutjanus is a C library build common functions and implementation of XEPs
* based on libstrophe.
*
* - Address: \ref address
* - Account: \ref account
* - Roster: \ref roster
*
* \page address XMPP Address
* \brief The XMPP Address
*
* The address (lutjanus_xmpp_adr_t).
*
* \page account XMPP Account
* \brief The XMPP Account
*
* The account ( lutjanus_xmpp_account_t ) holds the libstrophe context and connection.
* The account has got a roster ( lutjanus_roster_t ) which is the
*
* \page roster XMPP Roster
* \brief The XMPP contact list
*
* The roster ( lutjanus_roster_t ) is the contact list of a account.
*
* \copyright Copyright (C) 2021 DebXWoody <stefan@devlug.de>
*/
#ifndef LUTJANUS_H__
#define LUTJANUS_H__
#include <glib.h>
#include <strophe.h>
typedef char* stanza_id_t;
// ----------------------------------------------------------------------------
// XMPP Address
// ----------------------------------------------------------------------------
/*!
* \brief The XMPP address
*
* A lutjanus_xmpp_adr_t is XMPP address with local part, domain part and optionally a resource part.
*
* Create this object via \ref lutjanus_xmpp_adr_new
*
*
* \author DebXWoody <stefan@devlug.de>
* \copyright Copyright (C) 2021 DebXWoody <stefan@devlug.de>
*/
typedef struct _lutjanus_xmpp_adr_t lutjanus_xmpp_adr_t;
/*!
* \brief Creates a new XMPP-Address
* \param local local_part of the address
* \param domain domain_part of the address
* \param resource resource_part of the address or NULL for bare XMPP Addresses
*/
lutjanus_xmpp_adr_t *lutjanus_xmpp_adr_new(GString *local, GString *domain,
GString *resource);
/*!
* \brief Parse XMPP Address String
*
* \param address GString reference with XMPP address
* \return XMPP Address struct
*/
lutjanus_xmpp_adr_t *lutjanus_xmpp_adr_new_parse(const GString *const address);
/*!
* \brief Get the bare XMPP address.
*
* \param address a XMPP address
* \returns new allocated GString with the bare XMPP-Address ( local@domain )
*/
GString *lutjanus_xmpp_adr_get_bare(const lutjanus_xmpp_adr_t *const address);
/*!
* \brief Get the full XMPP address.
*
* \param address a XMPP address
* \returns new allocated GString with the full XMPP-Address (local@domain/resource )
*/
GString *lutjanus_xmpp_adr_get_full(const lutjanus_xmpp_adr_t *const address);
/*!
* \brief Compare full XMPP addresses
*
* \param adr1 XMPP address
* \param adr2 XMPP address
*
* \returns TURE, when the addresses are the same.
*/
gboolean lutjanus_xmpp_adr_compare(const lutjanus_xmpp_adr_t *const adr1,
const lutjanus_xmpp_adr_t *const adr2);
/*!
* \brief Compare bare XMPP addresses
*
* \param adr1 XMPP address
* \param adr2 XMPP address
*
* \returns TURE, when the addresses are the same.
*/
gboolean lutjanus_xmpp_adr_compare_bare(const lutjanus_xmpp_adr_t *const adr1,
const lutjanus_xmpp_adr_t *const adr2);
// ----------------------------------------------------------------------------
// XMPP Account
// ----------------------------------------------------------------------------
/*!
* \brief The XMPP Account.
*
* Create this object via \ref lutjanus_xmpp_account_new.
*/
typedef struct _lutjanus_xmpp_account_t lutjanus_xmpp_account_t;
/*!
* \brief Creates a new XMPP account.
*
* Allocates a lutjanus_xmpp_account_t object and stores the address and libstrophe context.
*
* \param adr The XMPP address of the account.
* \param ctx the libstrophe context
*
*/
lutjanus_xmpp_account_t *lutjanus_xmpp_account_new(lutjanus_xmpp_adr_t* adr, xmpp_ctx_t *ctx);
/*!
* \brief Sets the libstrophe connection
*
* \param account The XMPP address of the account.
* \param conn The connection.
*/
void lutjanus_set_xmpp_connection(lutjanus_xmpp_account_t* account, xmpp_conn_t *conn );
// ----------------------------------------------------------------------------
// XMPP Presence
// ----------------------------------------------------------------------------
/*!
* \brief types of presence
*
* Defined in
* https://tools.ietf.org/html/rfc6121#section-4.7.1
*/
typedef enum {
/*! available */
LUTJANUS_PRESENCE_AVAILABLE = 0,
/*! error */
LUTJANUS_PRESENCE_ERROR = 1,
/*! subscribe */
LUTJANUS_PRESENCE_SUBSCRIBE = 2,
/*! subscribed */
LUTJANUS_PRESENCE_SUBSCRIBED = 3,
/*! unavailable */
LUTJANUS_PRESENCE_UNAVAILABLE = 4,
/*! unsubscribe */
LUTJANUS_PRESENCE_UNSUBSCRIBE = 5,
/*! unsubscribed */
LUTJANUS_PRESENCE_UNSUBSCRIBED = 6
} lutjanus_presence_type_t;
/*!
* \brief Show presence
*
*/
typedef enum {
/*! unknown */
LUTJANUS_PRESENCE_UNKNOWN = 0,
/*! online */
LUTJANUS_PRESENCE_ONLINE = 1,
/*! away */
LUTJANUS_PRESENCE_AWAY = 2,
/*! chat */
LUTJANUS_PRESENCE_CHAT = 3,
/*! dnd */
LUTJANUS_PRESENCE_DND = 4,
/*! extended away */
LUTJANUS_PRESENCE_XA = 5,
} lutjanus_presence_show_t;
/*!
* \brief presence
*
*/
typedef struct _lutjanus_presence_t lutjanus_presence_t;
/*!
* \brief Create a new presence
*
* \param from
* \param type
* \param show
* \param text
*
* \returns new allocated presence.
*/
lutjanus_presence_t *lutjanus_presence_new(lutjanus_xmpp_adr_t *from,
lutjanus_presence_type_t type,
lutjanus_presence_show_t show, GString *text);
lutjanus_xmpp_adr_t * lutjanus_presence_from(lutjanus_presence_t * presence);
// ----------------------------------------------------------------------------
// XMPP Contact
// ----------------------------------------------------------------------------
/*!
* \brief Contact list ( roster )
*/
typedef struct _lutjanus_roster_t lutjanus_roster_t;
/*!
* \brief A contact ( buddy )
*/
typedef struct lutjanus_buddy_t lutjanus_buddy_t;
// ----------------------------------------------------------------------------
// XMPP Message
// ----------------------------------------------------------------------------
/*!
* \brief A message
*/
typedef struct _lutjanus_message_t lutjanus_message_t;
/*!
* \brief Creates a new message
*
* \returns new allocated message.
*/
lutjanus_message_t *lutjanus_xmpp_message_new(lutjanus_xmpp_adr_t* to, GString* text);
lutjanus_xmpp_adr_t * lutjanus_xmpp_message_from(lutjanus_message_t* message);
lutjanus_xmpp_adr_t * lutjanus_xmpp_message_to(lutjanus_message_t* message);
GString* lutjanus_xmpp_message_text(lutjanus_message_t* message);
// ----------------------------------------------------------------------------
// XMPP Groupchat
// ----------------------------------------------------------------------------
/*!
* \brief XMPP Multi User chat (groupchat).
*
*/
typedef struct _lutjanus_groupchat_t lutjanus_groupchat_t;
/*!
* \brief Creates a new XMPP-Address
* \param address Groupchat's XMPP address
* \return new allocated group chat struct
*/
lutjanus_groupchat_t *lutjanus_xmpp_groupchat_new(lutjanus_xmpp_adr_t *const address);
/*!
* \brief Join the groupchat.
* \param account lutjanus conect
* \param groupchat Groupchat
*/
void lutjanus_xmpp_groupchat_join(const lutjanus_xmpp_account_t *const account, const lutjanus_groupchat_t *const groupchat);
/*!
* \brief Gets the XMPP Address of a groupchat
*
* \param groupchat The groupchat
* \returns the Address of the groupchat
*/
lutjanus_xmpp_adr_t * lutjanus_xmpp_groupchat_get_adr(const lutjanus_groupchat_t *const groupchat);
/*!
* \brief Returns the name of the groupchat
*
* \param groupchat The groupchat
* \returns the name of the groupchat
*/
GString *
lutjanus_xmpp_groupchat_get_name(const lutjanus_groupchat_t *const groupchat);
/*!
* \brief Returns the nickname of the account within the groupchat.
*
* \param groupchat The groupchat
* \returns the nickname
*/
GString *
lutjanus_xmpp_groupchat_get_nick(const lutjanus_groupchat_t *const groupchat);
/*!
* \brief Returns a list of messages
*
* \param groupchat The groupchat
* \returns List of pointer to lutjanus_message_t
*/
GList *lutjanus_xmpp_groupchat_messages(const lutjanus_groupchat_t *const groupchat);
/*!
* \brief Returns a list of presences
*
* \param groupchat The groupchat
* \returns List of pointer to lutjanus_presence_t
*/
GList *lutjanus_xmpp_groupchat_presences(const lutjanus_groupchat_t *const groupchat);
/*!
* \brief Handel a incoming message
*
* The message will be stored within the groupchat
*
* \param groupchat The groupchat
* \param message the message
*
*/
void lutjanus_xmpp_groupchat_receive_message(lutjanus_groupchat_t *const groupchat,
lutjanus_message_t *message);
/*!
* \brief Handel a incoming presence
*
* The presence of the buddy will be updated.
*
* \param groupchat The groupchat
* \param presence The presence
*
*/
void lutjanus_xmpp_groupchat_receive_presence(
const lutjanus_groupchat_t *const groupchat, lutjanus_presence_t *presence);
// ----------------------------------------------------------------------------
// Core
// ----------------------------------------------------------------------------
/*!
* \page core lutjanus core
*
* \brief The core framework of lutjanus
*
* The core framework of lutjanus can be used to handle stanzas along with an account.
*
*/
/*!
* \brief lutjanus stanza
*/
typedef struct _lutjanus_xmpp_stanza_t lutjanus_xmpp_stanza_t;
lutjanus_xmpp_stanza_t* lutjanus_create_stanza();
/*!
* \brief lutjanus stanza callback
*
*/
typedef void (*lutjanus_stanza_result_cb_t)(xmpp_stanza_t *stanza, void *const obj, void *const userdata);
/*!
* \brief lutjanus fire stanza and let it manage by the callback
*
*/
void lutjanus_fire_and_handle(lutjanus_xmpp_account_t* account, lutjanus_xmpp_stanza_t* lutjanus_stanza, lutjanus_stanza_result_cb_t callback, void *const userdata);
void lutjanus_create_message(lutjanus_xmpp_stanza_t* lutjanus_stanza, lutjanus_xmpp_account_t* account, lutjanus_message_t* message);
// ----------------------------------------------------------------------------
// XEP-0048 Bookmarks
// ----------------------------------------------------------------------------
typedef struct _lutjanus_bookmark_t lutjanus_bookmark_t;
lutjanus_bookmark_t* lutjanus_create_new_bookmark(lutjanus_xmpp_adr_t *adr, GString* name, gboolean autojoin);
void lutjanus_load_bookmarks(lutjanus_xmpp_account_t* account, lutjanus_stanza_result_cb_t callback, void *const userdata);
void lutjanus_create_bookmarks_callback(xmpp_stanza_t *stanza, void *const obj, void *const userdata);
#endif // LUTJANUS_H__