Move MatrixAPI to an interface
This commit is contained in:
parent
bace727576
commit
b6c4c8f26d
@ -55,6 +55,7 @@ AC_PATH_PROG([GLIB_MKENUMS], [glib-mkenums])
|
||||
PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.38])
|
||||
PKG_CHECK_MODULES([GOBJECT], [gobject-2.0 >= 2.38])
|
||||
PKG_CHECK_MODULES([SOUP], [libsoup-2.4])
|
||||
PKG_CHECK_MODULES([JSON], [json-glib-1.0])
|
||||
|
||||
LIBMATRIX_GLIB_LIBS='$(top_builddir)/src/libmatrix-glib-$(MATRIX_GLIB_API_VERSION).la'
|
||||
AC_SUBST(LIBMATRIX_GLIB_LIBS)
|
||||
|
@ -19,9 +19,9 @@
|
||||
<chapter>
|
||||
<title>Matrix Client</title>
|
||||
<xi:include href="xml/matrix-client.xml"/>
|
||||
<xi:include href="xml/matrix-api.xml"/>
|
||||
<xi:include href="xml/matrix-http-api.xml"/>
|
||||
<xi:include href="xml/matrix-version.xml"/>
|
||||
|
||||
<xi:include href="xml/matrix-api.xml"/>
|
||||
</chapter>
|
||||
<chapter id="object-tree">
|
||||
<title>Object Hierarchy</title>
|
||||
|
@ -18,19 +18,55 @@ matrix_client_get_type
|
||||
<SECTION>
|
||||
<FILE>matrix-api</FILE>
|
||||
<TITLE>MatrixAPI</TITLE>
|
||||
MatrixAPICallback
|
||||
matrix_api_ban_user
|
||||
matrix_api_create_room
|
||||
matrix_api_event_stream
|
||||
matrix_api_get_emote_body
|
||||
matrix_api_get_html_body
|
||||
matrix_api_get_text_body
|
||||
matrix_api_get_room_name
|
||||
matrix_api_get_room_state
|
||||
matrix_api_get_room_topic
|
||||
matrix_api_initial_sync
|
||||
matrix_api_invite_user
|
||||
matrix_api_join_room
|
||||
matrix_api_kick_user
|
||||
matrix_api_leave_room
|
||||
matrix_api_login
|
||||
matrix_api_register_account
|
||||
matrix_api_send_emote
|
||||
matrix_api_send_message
|
||||
matrix_api_send_message_event
|
||||
matrix_api_send_state_event
|
||||
matrix_api_set_membership
|
||||
<SUBSECTION Standard>
|
||||
MatrixAPI
|
||||
MatrixAPIClass
|
||||
MATRIX_IS_API
|
||||
MATRIX_IS_API_CLASS
|
||||
MATRIX_API
|
||||
MATRIX_API_CLASS
|
||||
MATRIX_API_GET_CLASS
|
||||
MatrixAPIInterface
|
||||
MATRIX_TYPE_API
|
||||
MATRIX_API
|
||||
MATRIX_IS_API
|
||||
MATRIX_API_GET_IFACE
|
||||
MatrixApiPrivate
|
||||
matrix_api_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>matrix-http-api</FILE>
|
||||
matrix_http_api_get_validate_certificate
|
||||
matrix_http_api_set_validate_certificate
|
||||
<SUBSECTION Standard>
|
||||
MatrixHTTPAPI
|
||||
MatrixHTTPAPIClass
|
||||
MATRIX_TYPE_HTTP_API
|
||||
MATRIX_HTTP_API
|
||||
MATRIX_HTTP_API_CLASS
|
||||
MATRIX_IS_HTTP_API
|
||||
MATRIX_IS_HTTP_API_CLASS
|
||||
MATRIX_HTTP_API_GET_CLASS
|
||||
matrix_http_api_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>matrix-version</FILE>
|
||||
MATRIX_GLIB_MAJOR_VERSION
|
||||
|
@ -5,6 +5,7 @@ lib_LTLIBRARIES = libmatrix-glib-0.0.la
|
||||
INST_H_SRC_FILES = \
|
||||
matrix-client.h \
|
||||
matrix-api.h \
|
||||
matrix-http-api.h \
|
||||
$(NULL)
|
||||
|
||||
INST_H_BUILT_FILES = matrix-version.h
|
||||
@ -13,12 +14,13 @@ libmatrix_glib_0_0_la_SOURCES = \
|
||||
matrix-client.c \
|
||||
matrix-version.c \
|
||||
matrix-api.c \
|
||||
matrix-http-api.c \
|
||||
$(INST_H_SRC_FILES) \
|
||||
$(INST_H_BUILT_FILES) \
|
||||
$(NULL)
|
||||
|
||||
libmatrix_glib_0_0_la_CFLAGS = $(GLIB_CFLAGS) $(GOBJECT_CFLAGS) $(SOUP_CFLAGS)
|
||||
libmatrix_glib_0_0_la_LIBADD = $(GLIB_LIBS) $(GOBJECT_LIBS) $(SOUP_LIBS)
|
||||
libmatrix_glib_0_0_la_CFLAGS = $(GLIB_CFLAGS) $(GOBJECT_CFLAGS) $(SOUP_CFLAGS) $(JSON_CFLAGS)
|
||||
libmatrix_glib_0_0_la_LIBADD = $(GLIB_LIBS) $(GOBJECT_LIBS) $(SOUP_LIBS) $(JSON_LIBS)
|
||||
libmatrix_glib_0_0_la_DEPENDENCIES =
|
||||
|
||||
CLEANFILES =
|
||||
@ -29,7 +31,7 @@ MatrixGlib-$(MATRIX_GLIB_API_VERSION).gir: libmatrix-glib-0.0.la
|
||||
Matrix_@MATRIX_GLIB_API_VERSION_U@_gir_FILES = $(INST_H_SRC_FILES) $(INST_H_BUILT_FILES) $(filter %.c,$(libmatrix_glib_0_0_la_SOURCES))
|
||||
Matrix_@MATRIX_GLIB_API_VERSION_U@_gir_LIBS = libmatrix-glib-0.0.la
|
||||
Matrix_@MATRIX_GLIB_API_VERSION_U@_gir_SCANNERFLAGS = --identifier-prefix=Matrix --symbol-prefix=matrix --warn-all
|
||||
Matrix_@MATRIX_GLIB_API_VERSION_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 Soup-2.4
|
||||
Matrix_@MATRIX_GLIB_API_VERSION_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 Soup-2.4 Json-1.0
|
||||
Matrix_@MATRIX_GLIB_API_VERSION_U@_gir_CFLAGS = -D__MATRIX_GLIB_BUILDING__ -I$(top_srcdir) -I$(srcdir) -I$(builddir)
|
||||
Matrix_@MATRIX_GLIB_API_VERSION_U@_gir_EXPORT_PACKAGES = matrix-glib
|
||||
INTROSPECTION_GIRS = Matrix-$(MATRIX_GLIB_API_VERSION).gir
|
||||
|
617
src/matrix-api.c
617
src/matrix-api.c
@ -18,168 +18,529 @@
|
||||
|
||||
#include "matrix-api.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <libsoup/soup.h>
|
||||
|
||||
/**
|
||||
* SECTION:matrix-api
|
||||
* @short_description: Low level API calls to communicate with a
|
||||
* Matrix.org server
|
||||
* @title: MatrixAPI
|
||||
* @stability: Unstable
|
||||
* @include: matrix-glib/matrix.h
|
||||
* @short_description: An interface for actual API implementations,
|
||||
* like #MatrixHTTPAPI
|
||||
*
|
||||
* This is a class for low level communication with a Matrix.org
|
||||
* server.
|
||||
*/
|
||||
* This interface provides a skeleton for all API functionality for
|
||||
* client communication with a Matrix.org homeserver.
|
||||
**/
|
||||
|
||||
/**
|
||||
* MatrixAPI:
|
||||
*
|
||||
* The MatrixAPI object’s instance definition.
|
||||
* An opaque pointer type.
|
||||
**/
|
||||
|
||||
/**
|
||||
* MatrixAPIInterface:
|
||||
* @login: virtual function for matrix_api_login()
|
||||
* @register_account: virtual_function for
|
||||
* matrix_api_register_account()
|
||||
* @initial_sync: virtual function for matrix_api_initial_sync()
|
||||
* @event_stream: virtual function for matrix_api_event_stream()
|
||||
* @create_room: virtual function for matrix_api_create_room()
|
||||
* @join_room: virtual function for matrix_api_join_room()
|
||||
* @send_state_event: virtual function for
|
||||
* matrix_api_send_state_event()
|
||||
* @send_message_event: virtual function for
|
||||
* matrix_api_send_message_event()
|
||||
* @send_message: virtual function for matrix_api_send_message()
|
||||
* @send_emote: virtual function for matrix_api_send_emote()
|
||||
* @get_room_name: virtual function for matrix_api_get_room_name()
|
||||
* @get_room_topic: virtual function for matrix_api_get_room_topic()
|
||||
* @leave_room: virtual function for matrix_api_leave_room()
|
||||
* @invite_user: virtual function for matrix_api_invite_user()
|
||||
* @kick_user: virtual function for matrix_api_kick_user()
|
||||
* @set_membership: virtual function for matrix_api_set_membership()
|
||||
* @ban_user: virtual function for matrix_api_ban_user()
|
||||
* @get_room_state: virtual function for matrix_api_get_room_state()
|
||||
* @get_text_body: virtual function for matrix_api_get_text_body()
|
||||
* @get_html_body: virtual function for matrix_api_get_html_body()
|
||||
* @get_emote_body: virtual function for matrix_api_get_emote_body()
|
||||
* @_send: virtual function for matrix_api_send()
|
||||
*
|
||||
* The interface vtable for #MatrixAPI
|
||||
*/
|
||||
|
||||
/**
|
||||
* MatrixAPIClass:
|
||||
* @parent_class: the parent class structure (#GObjectClass)
|
||||
* MatrixAPICallback:
|
||||
* @api: A #MatrixAPI implementation
|
||||
* @content: the JSON content of the response, as a #JsonNode
|
||||
* @data: User data specified when calling original request function
|
||||
*
|
||||
* The MatrixAPI object’s class definition.
|
||||
* A callback function to use with API calls.
|
||||
*/
|
||||
|
||||
#define API_ENDPOINT "/_matrix/client/api/v1"
|
||||
|
||||
typedef struct _MatrixAPIPrivate {
|
||||
SoupSession *soup_session;
|
||||
guint txn_id;
|
||||
gchar *url;
|
||||
gchar *token;
|
||||
gboolean validate_cert;
|
||||
} MatrixAPIPrivate;
|
||||
|
||||
enum {
|
||||
PROP_URL = 1,
|
||||
N_PROPERTIES
|
||||
};
|
||||
|
||||
GParamSpec *obj_properties[N_PROPERTIES] = {NULL,};
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE(MatrixAPI, matrix_api, G_TYPE_OBJECT);
|
||||
G_DEFINE_INTERFACE(MatrixAPI, matrix_api, G_TYPE_OBJECT);
|
||||
|
||||
static void
|
||||
matrix_api_finalize(GObject *gobject)
|
||||
matrix_api_default_init(MatrixAPIInterface *iface)
|
||||
{
|
||||
g_signal_handlers_destroy(gobject);
|
||||
G_OBJECT_CLASS(matrix_api_parent_class)->finalize(gobject);
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_api_set_property(GObject *gobject,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
/**
|
||||
* matrix_api_ban_user:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room ID where the user should be banned
|
||||
* @user_id: the user ID to ban
|
||||
* @reason: (allow-none): the reason of the ban
|
||||
*
|
||||
* Ban the specified user from the specified room. An optional reason
|
||||
* can be specified.
|
||||
*/
|
||||
void
|
||||
matrix_api_ban_user(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id,
|
||||
gchar *reason)
|
||||
{
|
||||
MatrixAPI *api = MATRIX_API(gobject);
|
||||
MatrixAPIPrivate *priv = matrix_api_get_instance_private(api);
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_URL:
|
||||
{
|
||||
const gchar *base_url;
|
||||
gchar *last_occurence;
|
||||
|
||||
base_url = g_value_get_string(value);
|
||||
|
||||
if (!g_str_is_ascii(base_url)) {
|
||||
g_warning("URL specified (%s) is not ASCII", base_url);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
last_occurence = g_strrstr(base_url, API_ENDPOINT);
|
||||
|
||||
if ((g_strcmp0(last_occurence, API_ENDPOINT) == 0) ||
|
||||
(g_strcmp0(last_occurence, API_ENDPOINT"/") == 0)) {
|
||||
priv->url = g_strdup(base_url);
|
||||
} else {
|
||||
priv->url = g_strdup_printf(
|
||||
"%s%s%s",
|
||||
base_url,
|
||||
(base_url[strlen(base_url) - 1] == '/') ? "" : "/",
|
||||
API_ENDPOINT);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
|
||||
}
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->ban_user(api, callback, user_data, room_id, user_id, reason);
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_api_get_property(GObject *gobject,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
/**
|
||||
* matrix_api_create_room:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @alias: the alias (name) of the room
|
||||
* @is_public: if %TRUE, the room will be accessible for anyone
|
||||
* @invitees: (allow-none): list of user IDs to invite to the new room
|
||||
*
|
||||
* Create a new room with the given name and invite the users in
|
||||
* @invitees.
|
||||
*/
|
||||
void
|
||||
matrix_api_create_room(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *alias,
|
||||
gboolean is_public,
|
||||
GStrv invitees)
|
||||
{
|
||||
MatrixAPI *api = MATRIX_API(gobject);
|
||||
MatrixAPIPrivate *priv = matrix_api_get_instance_private(api);
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_URL:
|
||||
g_value_set_string(value, priv->url);
|
||||
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
|
||||
}
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->create_room(api, callback, user_data, alias, is_public, invitees);
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_api_class_init(MatrixAPIClass *klass)
|
||||
/**
|
||||
* matrix_api_event_stream:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @from_token: (allow-none): events will be listed from this token
|
||||
* @timeout: timeout of the request
|
||||
*
|
||||
* Get the event stream, optionally beginning from @from_token.
|
||||
*/
|
||||
void
|
||||
matrix_api_event_stream(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *from_token,
|
||||
gulong timeout)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
gobject_class->set_property = matrix_api_set_property;
|
||||
gobject_class->get_property = matrix_api_get_property;
|
||||
gobject_class->finalize = matrix_api_finalize;
|
||||
|
||||
/**
|
||||
* MatrixAPI:url:
|
||||
*
|
||||
* The base URL to use for communication with the Matrix.org
|
||||
* server.
|
||||
*/
|
||||
obj_properties[PROP_URL] = g_param_spec_string(
|
||||
"url", "Server URL",
|
||||
"Matrix.org home server to connect to.",
|
||||
NULL,
|
||||
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties(gobject_class,
|
||||
N_PROPERTIES,
|
||||
obj_properties);
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->event_stream(api, callback, user_data, from_token, timeout);
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_api_init(MatrixAPI *api)
|
||||
/**
|
||||
* matrix_api_get_room_name:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room ID to get a name for
|
||||
*
|
||||
* Get the name (alias) of a room.
|
||||
*/
|
||||
void
|
||||
matrix_api_get_room_name(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id)
|
||||
{
|
||||
MatrixAPIPrivate *priv = matrix_api_get_instance_private(api);
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
priv->txn_id = 0;
|
||||
priv->url = NULL;
|
||||
priv->token = NULL;
|
||||
priv->validate_cert = TRUE;
|
||||
priv->soup_session = soup_session_new_with_options(
|
||||
SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_CONTENT_SNIFFER,
|
||||
NULL);
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->get_room_name(api, callback, user_data, room_id);
|
||||
}
|
||||
|
||||
MatrixAPI *
|
||||
matrix_api_new(const gchar *base_url, const gchar *token)
|
||||
/**
|
||||
* matrix_api_get_room_state:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room ID to get a state for
|
||||
*
|
||||
* Get the state of a room.
|
||||
*/
|
||||
void
|
||||
matrix_api_get_room_state(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id)
|
||||
{
|
||||
return g_object_new(MATRIX_TYPE_API,
|
||||
"base-url", base_url,
|
||||
"token", token,
|
||||
NULL);
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->get_room_state(api, callback, user_data, room_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_get_room_topic:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room ID to get a topic for
|
||||
*
|
||||
* Get the topic of a room.
|
||||
*/
|
||||
void
|
||||
matrix_api_get_room_topic(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->get_room_topic(api, callback, user_data, room_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_initial_sync:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @limit: the maximum number of events to get
|
||||
*
|
||||
* perform an initial sync of events
|
||||
*/
|
||||
void
|
||||
matrix_api_initial_sync(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
guint limit)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->initial_sync(api, callback, user_data, limit);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_invite_user:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room ID to invite the user to
|
||||
* @user_id: the user ID to invite
|
||||
*
|
||||
* Invite a user to a room.
|
||||
*/
|
||||
void
|
||||
matrix_api_invite_user(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->invite_user(api, callback, user_data, room_id, user_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_join_room:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id_or_alias: the room ID or room alias to join to
|
||||
*
|
||||
* Join a room.
|
||||
*/
|
||||
void
|
||||
matrix_api_join_room(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id_or_alias)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->join_room(api, callback, user_data, room_id_or_alias);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_kick_user:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room ID to kick the user from
|
||||
* @user_id: the user to kick
|
||||
* @reason: (allow-none): the reason of kicking
|
||||
*
|
||||
* Kick a user from a room, with an optional reason.
|
||||
*/
|
||||
void
|
||||
matrix_api_kick_user(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id,
|
||||
gchar *reason)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->kick_user(api, callback, user_data, room_id, user_id, reason);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_leave_room:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room ID to kick the user from
|
||||
*
|
||||
* Leave a room
|
||||
*/
|
||||
void
|
||||
matrix_api_leave_room(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->leave_room(api, callback, user_data, room_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_login:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @login_type: the login type to use
|
||||
* @parameters: (allow-none): parameters to pass for the login request
|
||||
*
|
||||
* Attempt to login with type @login_type. Implementations of this
|
||||
* method must set the token property on a successful login.
|
||||
*/
|
||||
void
|
||||
matrix_api_login(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *login_type,
|
||||
GHashTable *parameters)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->login(api, callback, user_data, login_type, parameters);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_register_account:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @login_type: the login type to use
|
||||
* @parameters: (allow-none): parameters to pass for the registration
|
||||
* request
|
||||
*
|
||||
* Attempt to register with type @login_type. Implementations of this
|
||||
* method must set the token property on a successful login.
|
||||
*/
|
||||
void
|
||||
matrix_api_register_account(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *login_type,
|
||||
GHashTable *parameters)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->register_account(api, callback, user_data, login_type, parameters);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_send_emote:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room to send the emote to
|
||||
* @text_content: the emote text to send
|
||||
*
|
||||
* Send an emote to the room.
|
||||
*/
|
||||
void
|
||||
matrix_api_send_emote(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *text_content)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->send_emote(api, callback, user_data, room_id, text_content);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_send_message:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room to send the emote to
|
||||
* @text_content: the emote text to send
|
||||
* @msg_type: the type of the message to be sent
|
||||
*
|
||||
* Send a custom message to the room.
|
||||
*/
|
||||
void
|
||||
matrix_api_send_message(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *text_content,
|
||||
gchar *msg_type)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->send_message(api,
|
||||
callback, user_data,
|
||||
room_id,
|
||||
text_content,
|
||||
msg_type);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_send_message_event:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room to send the emote to
|
||||
* @event_type: the type of the event to send
|
||||
* @content: the content of the event as a #JsonNode
|
||||
* @txn_id: the transaction ID to use
|
||||
*
|
||||
* Send a message event to the room.
|
||||
*/
|
||||
void
|
||||
matrix_api_send_message_event(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *event_type,
|
||||
JsonNode *content,
|
||||
guint txn_id)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->send_message_event(api,
|
||||
callback, user_data,
|
||||
room_id,
|
||||
event_type,
|
||||
content,
|
||||
txn_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_send_state_event:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room to send the emote to
|
||||
* @event_type: the type of the event to send
|
||||
* @content: the content of the event as a #JsonNode
|
||||
* @state_key: the state key to send
|
||||
*
|
||||
* Send a state event to the room
|
||||
*/
|
||||
void
|
||||
matrix_api_send_state_event(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *event_type,
|
||||
JsonNode *content,
|
||||
gchar *state_key)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->send_state_event(api,
|
||||
callback, user_data,
|
||||
room_id,
|
||||
event_type,
|
||||
content,
|
||||
state_key);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_api_set_membership:
|
||||
* @api: a #MatrixAPI implementation
|
||||
* @callback: (scope async): the function to call when the request is
|
||||
* finished
|
||||
* @user_data: user data to pass to the callback function
|
||||
* @room_id: the room to send the emote to
|
||||
* @user_id: the user of whom membership will be set
|
||||
* @membership: the new membership of the user
|
||||
* @reason: (allow-none): the reason of the change
|
||||
*
|
||||
* Set the membership of the user for the given room.
|
||||
*/
|
||||
void
|
||||
matrix_api_set_membership(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id,
|
||||
gchar *membership,
|
||||
gchar *reason)
|
||||
{
|
||||
g_return_if_fail(MATRIX_IS_API(api));
|
||||
|
||||
MATRIX_API_GET_IFACE(api)
|
||||
->set_membership(api,
|
||||
callback, user_data,
|
||||
room_id,
|
||||
user_id,
|
||||
membership,
|
||||
reason);
|
||||
}
|
||||
|
229
src/matrix-api.h
229
src/matrix-api.h
@ -16,80 +16,245 @@
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __MATRIX_API_H__
|
||||
#define __MATRIX_API_H__
|
||||
#ifndef __MATRIX_API_IFACE_H__
|
||||
#define __MATRIX_API_IFACE_H__
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <json-glib/json-glib.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define MATRIX_TYPE_API (matrix_api_get_type())
|
||||
#define MATRIX_API(o) (G_TYPE_CHECK_INSTANCE_CAST((o), MATRIX_TYPE_API, MatrixAPI))
|
||||
#define MATRIX_API_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), MATRIX_TYPE_API, MatrixAPIClass))
|
||||
#define MATRIX_IS_API(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), MATRIX_TYPE_API))
|
||||
#define MATRIX_IS_API_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), MATRIX_TYPE_API))
|
||||
#define MATRIX_API_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), MATRIX_TYPE_API, MatrixAPIClass))
|
||||
#define MATRIX_API_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE((o), MATRIX_TYPE_API, MatrixAPIInterface))
|
||||
|
||||
typedef struct _MatrixAPI MatrixAPI;
|
||||
typedef struct _MatrixAPIClass MatrixAPIClass;
|
||||
typedef struct _MatrixAPIInterface MatrixAPIInterface;
|
||||
typedef struct _MatrixAPI MatrixAPI;
|
||||
|
||||
struct _MatrixAPI {
|
||||
/* Parent instance structure */
|
||||
GObject parent_instance;
|
||||
typedef void (*MatrixAPICallback)(MatrixAPI *api, JsonNode *content, gpointer data);
|
||||
|
||||
/* Instance members */
|
||||
struct _MatrixAPIInterface {
|
||||
/*< private >*/
|
||||
GTypeInterface g_iface;
|
||||
|
||||
/*< public >*/
|
||||
|
||||
void (*register_account)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *login_type,
|
||||
GHashTable *parameters);
|
||||
void (*login)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *login_type,
|
||||
GHashTable *parameters);
|
||||
void (*initial_sync)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
guint limit);
|
||||
void (*event_stream)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *from_token,
|
||||
gulong timeout);
|
||||
void (*create_room)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_alias,
|
||||
gboolean is_public,
|
||||
GStrv invitees);
|
||||
void (*join_room)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id_or_alias);
|
||||
void (*send_state_event)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *event_type,
|
||||
JsonNode *content,
|
||||
gchar *state_key);
|
||||
void (*send_message_event)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *event_type,
|
||||
JsonNode *content,
|
||||
guint txn_id);
|
||||
void (*send_message)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *text_content,
|
||||
gchar *msg_type);
|
||||
void (*send_emote)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *text_content);
|
||||
void (*get_room_name)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id);
|
||||
void (*get_room_topic)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id);
|
||||
void (*leave_room)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id);
|
||||
void (*invite_user)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id);
|
||||
void (*kick_user)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id,
|
||||
gchar *reason);
|
||||
void (*set_membership)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id,
|
||||
gchar *membership,
|
||||
gchar *reason);
|
||||
void (*ban_user)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id,
|
||||
gchar *reason);
|
||||
void (*get_room_state)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id);
|
||||
void (*get_text_body)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *text,
|
||||
gchar *msgtype);
|
||||
void (*get_html_body)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *html,
|
||||
gchar *msgtype);
|
||||
void (*get_emote_body)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *text);
|
||||
void (*_send)(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *method,
|
||||
gchar *path,
|
||||
gchar *content,
|
||||
gchar *query_params,
|
||||
gchar *headers);
|
||||
|
||||
/*< private >*/
|
||||
void *padding[20];
|
||||
};
|
||||
|
||||
struct _MatrixAPIClass {
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
GType matrix_api_get_type(void) G_GNUC_CONST;
|
||||
|
||||
void matrix_api_initial_sync(MatrixAPI *api, guint limit);
|
||||
void matrix_api_set_validate_certificate(MatrixAPI *api, gboolean valid);
|
||||
gboolean matrix_api_get_validate_certificate(MatrixAPI *api);
|
||||
void matrix_api_register(MatrixAPI *api, gchar *login_type, ...);
|
||||
void matrix_api_login(MatrixAPI *api, gchar *login_type, ...);
|
||||
void matrix_api_initial_sync(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
guint limit);
|
||||
void matrix_api_register_account(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *login_type,
|
||||
GHashTable *parameters);
|
||||
void matrix_api_login(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *login_type,
|
||||
GHashTable *parameters);
|
||||
void matrix_api_create_room(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *alias,
|
||||
gboolean is_public,
|
||||
GList *invitees);
|
||||
void matrix_api_join_room(MatrixAPI *api, gchar *room_id_or_alias);
|
||||
void matrix_api_event_stream(MatrixAPI *api, gchar *from_token, gulong timeout);
|
||||
GStrv invitees);
|
||||
void matrix_api_join_room(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id_or_alias);
|
||||
void matrix_api_event_stream(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *from_token,
|
||||
gulong timeout);
|
||||
void matrix_api_send_state_event(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *event_type,
|
||||
JsonNode *content,
|
||||
gchar *state_key);
|
||||
void matrix_api_send_message_event(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *event_type,
|
||||
JsonNode *content,
|
||||
guint txn_id);
|
||||
void matrix_api_send_message(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *text_content,
|
||||
gchar *msg_type);
|
||||
void matrix_api_send_emote(MatrixAPI *api, gchar *room_id, gchar *text_content);
|
||||
void matrix_api_get_room_name(MatrixAPI *api, gchar *room_id);
|
||||
void matrix_api_get_room_topic(MatrixAPI *api, gchar *room_id);
|
||||
void matrix_api_leave_room(MatrixAPI *api, gchar *room_id);
|
||||
void matrix_api_invite_user(MatrixAPI *api, gchar *room_id, gchar *user_id);
|
||||
void matrix_api_send_emote(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *text_content);
|
||||
void matrix_api_get_room_name(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id);
|
||||
void matrix_api_get_room_topic(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id);
|
||||
void matrix_api_leave_room(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id);
|
||||
void matrix_api_invite_user(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id);
|
||||
void matrix_api_kick_user(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id,
|
||||
gchar *reason);
|
||||
void matrix_api_set_membership(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id,
|
||||
gchar *membership,
|
||||
gchar *reason);
|
||||
void matrix_api_ban_user(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id,
|
||||
gchar *user_id,
|
||||
gchar *reason);
|
||||
void matrix_api_get_room_state(MatrixAPI *api, gchar *room_id);
|
||||
void matrix_api_get_room_state(MatrixAPI *api,
|
||||
MatrixAPICallback callback,
|
||||
gpointer user_data,
|
||||
gchar *room_id);
|
||||
void matrix_api_get_text_body(MatrixAPI *api, gchar *text, gchar *msgtype);
|
||||
void matrix_api_get_html_body(MatrixAPI *api, gchar *html, gchar *msgtype);
|
||||
void matrix_api_get_emote_body(MatrixAPI *api, gchar *text);
|
||||
@ -102,4 +267,4 @@ void _send(MatrixAPI *api,
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __MATRIX_API_H__ */
|
||||
#endif /* __MATRIX_API_IFACE_H__ */
|
||||
|
251
src/matrix-http-api.c
Normal file
251
src/matrix-http-api.c
Normal file
@ -0,0 +1,251 @@
|
||||
/*
|
||||
* This file is part of matrix-glib-sdk
|
||||
*
|
||||
* matrix-glib-sdk is free software: you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation, either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* matrix-glib-sdk 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with matrix-glib-sdk. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "matrix-http-api.h"
|
||||
#include "matrix-api.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <libsoup/soup.h>
|
||||
|
||||
/**
|
||||
* SECTION:matrix-http-api
|
||||
* @short_description: Low level API calls to communicate with a
|
||||
* Matrix.org server via HTTP
|
||||
* @title: MatrixHTTPAPI
|
||||
* @stability: Unstable
|
||||
* @include: matrix-glib/matrix.h
|
||||
*
|
||||
* This is a class for low level communication with a Matrix.org
|
||||
* server via HTTP.
|
||||
*/
|
||||
|
||||
/**
|
||||
* MatrixHTTPAPI:
|
||||
*
|
||||
* The MatrixHTTPAPI object’s instance definition.
|
||||
*/
|
||||
|
||||
/**
|
||||
* MatrixHTTPAPIClass:
|
||||
* @parent_class: the parent class structure (#GObjectClass)
|
||||
*
|
||||
* The MatrixHTTPAPI object’s class definition.
|
||||
*/
|
||||
|
||||
#define API_ENDPOINT "/_matrix/client/api/v1"
|
||||
|
||||
typedef struct _MatrixHTTPAPIPrivate {
|
||||
SoupSession *soup_session;
|
||||
guint txn_id;
|
||||
gchar *url;
|
||||
gchar *token;
|
||||
gboolean validate_certificate;
|
||||
} MatrixHTTPAPIPrivate;
|
||||
|
||||
enum {
|
||||
PROP_VALIDATE_CERTIFICATE = 1,
|
||||
PROP_URL,
|
||||
N_PROPERTIES
|
||||
};
|
||||
|
||||
GParamSpec *obj_properties[N_PROPERTIES] = {NULL,};
|
||||
|
||||
static void matrix_http_api_matrix_api_init(MatrixAPIInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE(MatrixHTTPAPI, matrix_http_api, G_TYPE_OBJECT,
|
||||
G_ADD_PRIVATE(MatrixHTTPAPI)
|
||||
G_IMPLEMENT_INTERFACE(MATRIX_TYPE_API, matrix_http_api_matrix_api_init));
|
||||
|
||||
static void
|
||||
matrix_http_api_matrix_api_init(MatrixAPIInterface *iface)
|
||||
{}
|
||||
|
||||
static void
|
||||
matrix_http_api_finalize(GObject *gobject)
|
||||
{
|
||||
g_signal_handlers_destroy(gobject);
|
||||
G_OBJECT_CLASS(matrix_http_api_parent_class)->finalize(gobject);
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_http_api_set_property(GObject *gobject,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MatrixHTTPAPI *api = MATRIX_HTTP_API(gobject);
|
||||
MatrixHTTPAPIPrivate *priv = matrix_http_api_get_instance_private(api);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_VALIDATE_CERTIFICATE:
|
||||
priv->validate_certificate = g_value_get_boolean(value);
|
||||
|
||||
break;
|
||||
|
||||
case PROP_URL:
|
||||
{
|
||||
const gchar *base_url;
|
||||
gchar *last_occurence;
|
||||
|
||||
base_url = g_value_get_string(value);
|
||||
|
||||
if (!g_str_is_ascii(base_url)) {
|
||||
g_warning("URL specified (%s) is not ASCII", base_url);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
last_occurence = g_strrstr(base_url, API_ENDPOINT);
|
||||
|
||||
if ((g_strcmp0(last_occurence, API_ENDPOINT) == 0) ||
|
||||
(g_strcmp0(last_occurence, API_ENDPOINT"/") == 0)) {
|
||||
priv->url = g_strdup(base_url);
|
||||
} else {
|
||||
priv->url = g_strdup_printf(
|
||||
"%s%s%s",
|
||||
base_url,
|
||||
(base_url[strlen(base_url) - 1] == '/') ? "" : "/",
|
||||
API_ENDPOINT);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_http_api_get_property(GObject *gobject,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MatrixHTTPAPI *api = MATRIX_HTTP_API(gobject);
|
||||
MatrixHTTPAPIPrivate *priv = matrix_http_api_get_instance_private(api);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_VALIDATE_CERTIFICATE:
|
||||
g_value_set_boolean(value, priv->validate_certificate);
|
||||
|
||||
break;
|
||||
|
||||
case PROP_URL:
|
||||
g_value_set_string(value, priv->url);
|
||||
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_http_api_class_init(MatrixHTTPAPIClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
|
||||
|
||||
gobject_class->set_property = matrix_http_api_set_property;
|
||||
gobject_class->get_property = matrix_http_api_get_property;
|
||||
gobject_class->finalize = matrix_http_api_finalize;
|
||||
|
||||
/**
|
||||
* MatrixHTTPAPI:validate-certificate:
|
||||
*
|
||||
* Set to %FALSE if you don’t want the SSL/TLS certificates to be
|
||||
* validated.
|
||||
*/
|
||||
obj_properties[PROP_VALIDATE_CERTIFICATE] = g_param_spec_boolean(
|
||||
"validate-certificate",
|
||||
"Validate certificate",
|
||||
"TRUE if server certificates should be validated",
|
||||
TRUE,
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
/**
|
||||
* MatrixHTTPAPI:url:
|
||||
*
|
||||
* The base URL to use for communication with the Matrix.org
|
||||
* server.
|
||||
*/
|
||||
obj_properties[PROP_URL] = g_param_spec_string(
|
||||
"url", "Server URL",
|
||||
"Matrix.org home server to connect to.",
|
||||
NULL,
|
||||
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties(gobject_class,
|
||||
N_PROPERTIES,
|
||||
obj_properties);
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_http_api_init(MatrixHTTPAPI *api)
|
||||
{
|
||||
MatrixHTTPAPIPrivate *priv = matrix_http_api_get_instance_private(api);
|
||||
|
||||
priv->txn_id = 0;
|
||||
priv->url = NULL;
|
||||
priv->token = NULL;
|
||||
priv->validate_certificate = TRUE;
|
||||
priv->soup_session = soup_session_new_with_options(
|
||||
SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_CONTENT_SNIFFER,
|
||||
NULL);
|
||||
}
|
||||
|
||||
MatrixHTTPAPI *
|
||||
matrix_http_api_new(const gchar *base_url, const gchar *token)
|
||||
{
|
||||
return g_object_new(MATRIX_TYPE_HTTP_API,
|
||||
"base-url", base_url,
|
||||
"token", token,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_http_api_set_validate_certificate:
|
||||
* @api: a #MatrixHTTPAPI implementation
|
||||
* @validate_certificate: %TRUE if server certificates should be
|
||||
* validated
|
||||
*
|
||||
* Sets if server certificates should be validated.
|
||||
*/
|
||||
void
|
||||
matrix_http_api_set_validate_certificate(MatrixHTTPAPI *api,
|
||||
gboolean validate_certificate)
|
||||
{
|
||||
MatrixHTTPAPIPrivate *priv = matrix_http_api_get_instance_private(api);
|
||||
|
||||
priv->validate_certificate = validate_certificate;
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_http_api_get_validate_certificate:
|
||||
* @api: a #MatrixHTTPAPI implementation
|
||||
*
|
||||
* Gets the value set by matrix_http_api_set_validate_certificate()
|
||||
*
|
||||
* Returns: %TRUE if the server certificates should be validated
|
||||
*/
|
||||
gboolean
|
||||
matrix_http_api_get_validate_certificate(MatrixHTTPAPI *api)
|
||||
{
|
||||
MatrixHTTPAPIPrivate *priv = matrix_http_api_get_instance_private(api);
|
||||
|
||||
return priv->validate_certificate;
|
||||
}
|
54
src/matrix-http-api.h
Normal file
54
src/matrix-http-api.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* This file is part of matrix-glib-sdk
|
||||
*
|
||||
* matrix-glib-sdk is free software: you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation, either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* matrix-glib-sdk 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with matrix-glib-sdk. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __MATRIX_HTTP_API_H__
|
||||
#define __MATRIX_HTTP_API_H__
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define MATRIX_TYPE_HTTP_API (matrix_http_api_get_type())
|
||||
#define MATRIX_HTTP_API(o) (G_TYPE_CHECK_INSTANCE_CAST((o), MATRIX_TYPE_HTTP_API, MatrixHTTPAPI))
|
||||
#define MATRIX_HTTP_API_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), MATRIX_TYPE_HTTP_API, MatrixHTTPAPIClass))
|
||||
#define MATRIX_IS_HTTP_API(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), MATRIX_TYPE_HTTP_API))
|
||||
#define MATRIX_IS_HTTP_API_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), MATRIX_TYPE_HTTP_API))
|
||||
#define MATRIX_HTTP_API_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), MATRIX_TYPE_HTTP_API, MatrixHTTPAPIClass))
|
||||
|
||||
typedef struct _MatrixHTTPAPI MatrixHTTPAPI;
|
||||
typedef struct _MatrixHTTPAPIClass MatrixHTTPAPIClass;
|
||||
|
||||
struct _MatrixHTTPAPI {
|
||||
/* Parent instance structure */
|
||||
GObject parent_instance;
|
||||
|
||||
/* Instance members */
|
||||
};
|
||||
|
||||
struct _MatrixHTTPAPIClass {
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
GType matrix_http_api_get_type(void) G_GNUC_CONST;
|
||||
void matrix_http_api_set_validate_certificate(MatrixHTTPAPI *api,
|
||||
gboolean validate_certificate);
|
||||
gboolean matrix_http_api_get_validate_certificate(MatrixHTTPAPI *api);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __MATRIX_HTTP_API_H__ */
|
Loading…
Reference in New Issue
Block a user