Port MatrixFilter to C
This commit is contained in:
parent
96e36f49e1
commit
80dad1b03a
@ -18,7 +18,9 @@
|
||||
|
||||
#include <gobject/gvaluecollector.h>
|
||||
#include "matrix-c-compacts.h"
|
||||
#include "matrix-enumtypes.h"
|
||||
#include "matrix-types.h"
|
||||
#include "utils.h"
|
||||
|
||||
static JsonNode * matrix_json_compact_get_json_node_impl(MatrixJsonCompact *matrix_json_compact,
|
||||
GError **error);
|
||||
@ -1000,3 +1002,292 @@ matrix_room_filter_init(MatrixRoomFilter *matrix_room_filter)
|
||||
priv->_state = NULL;
|
||||
priv->_timeline = NULL;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
gchar **_event_fields;
|
||||
guint _event_fields_len;
|
||||
MatrixEventFormat _event_format;
|
||||
MatrixFilterRules *_presence_filter;
|
||||
MatrixRoomFilter*_room_filter;
|
||||
} MatrixFilterPrivate;
|
||||
|
||||
/**
|
||||
* MatrixFilter:
|
||||
*
|
||||
* Class to hold a message filter, eg. to be used with matrix_api_sync().
|
||||
*/
|
||||
G_DEFINE_TYPE_WITH_PRIVATE(MatrixFilter, matrix_filter, MATRIX_TYPE_JSON_COMPACT);
|
||||
|
||||
static JsonNode *
|
||||
matrix_filter_get_json_node(MatrixJsonCompact *matrix_json_compact, GError **error)
|
||||
{
|
||||
MatrixFilterPrivate *priv;
|
||||
JsonBuilder *builder;
|
||||
JsonNode *node;
|
||||
GError *inner_error = NULL;
|
||||
|
||||
g_return_val_if_fail(matrix_json_compact != NULL, NULL);
|
||||
|
||||
priv = matrix_filter_get_instance_private(MATRIX_FILTER(matrix_json_compact));
|
||||
|
||||
builder = json_builder_new();
|
||||
|
||||
json_builder_begin_object(builder);
|
||||
|
||||
json_builder_set_member_name(builder, "event_fields");
|
||||
json_builder_begin_array(builder);
|
||||
|
||||
for (guint i = 0; i < priv->_event_fields_len; i++) {
|
||||
json_builder_add_string_value(builder, priv->_event_fields[i]);
|
||||
}
|
||||
|
||||
json_builder_end_array(builder);
|
||||
|
||||
json_builder_set_member_name(builder, "event_format");
|
||||
json_builder_add_string_value(builder, _matrix_g_enum_to_string(MATRIX_TYPE_EVENT_FORMAT, priv->_event_format, TRUE));
|
||||
|
||||
json_builder_set_member_name(builder, "presence");
|
||||
node = matrix_json_compact_get_json_node(MATRIX_JSON_COMPACT(priv->_presence_filter), &inner_error);
|
||||
|
||||
if (inner_error != NULL) {
|
||||
g_propagate_error(error, inner_error);
|
||||
g_object_unref(builder);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
json_builder_add_value(builder, node);
|
||||
|
||||
json_builder_set_member_name(builder, "room");
|
||||
node = matrix_json_compact_get_json_node(MATRIX_JSON_COMPACT(priv->_room_filter), &inner_error);
|
||||
|
||||
if (inner_error != NULL) {
|
||||
g_propagate_error(error, inner_error);
|
||||
g_object_unref(builder);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
json_builder_add_value(builder, node);
|
||||
|
||||
json_builder_end_object(builder);
|
||||
|
||||
node = json_builder_get_root(builder);
|
||||
|
||||
g_object_unref(builder);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_filter_new:
|
||||
*
|
||||
* Create a new #MatrixFilter object.
|
||||
*
|
||||
* Returns: (transfer full): a new #MatrixFilter object
|
||||
*/
|
||||
MatrixFilter *
|
||||
matrix_filter_new(void)
|
||||
{
|
||||
return (MatrixFilter *)matrix_json_compact_construct(MATRIX_TYPE_FILTER);
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_filter_get_event_fields:
|
||||
* @filter: a #MatrixFilter object
|
||||
* @n_event_fields: (nullable): placeholder for the length of the result, or %NULL to ignore
|
||||
*
|
||||
* Get the fields to be included in the filtered events.
|
||||
*
|
||||
* The returned value is owned by @filter and should not be freed.
|
||||
*
|
||||
* Returns: (transfer none): the list of fields to include
|
||||
*/
|
||||
gchar **
|
||||
matrix_filter_get_event_fields(MatrixFilter *matrix_filter, int *n_event_fields)
|
||||
{
|
||||
MatrixFilterPrivate *priv;
|
||||
|
||||
g_return_val_if_fail(matrix_filter != NULL, NULL);
|
||||
|
||||
priv = matrix_filter_get_instance_private(matrix_filter);
|
||||
|
||||
if (n_event_fields != NULL) {
|
||||
*n_event_fields = priv->_event_fields_len;
|
||||
}
|
||||
|
||||
return priv->_event_fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_filter_set_event_fields:
|
||||
* @filter: a #MatrixFilter object
|
||||
* @event_fields: (transfer none) (nullable): a list of event field names
|
||||
* @n_event_fields: the number of elements in @event_fields
|
||||
*
|
||||
* Set the event fields to be included in the filtered events.
|
||||
*/
|
||||
void
|
||||
matrix_filter_set_event_fields(MatrixFilter *matrix_filter, gchar **event_fields, int n_event_fields)
|
||||
{
|
||||
MatrixFilterPrivate *priv;
|
||||
|
||||
g_return_if_fail(matrix_filter != NULL);
|
||||
|
||||
priv = matrix_filter_get_instance_private(matrix_filter);
|
||||
|
||||
free_str_array(priv->_event_fields, priv->_event_fields_len);
|
||||
priv->_event_fields = copy_str_array(event_fields, n_event_fields);
|
||||
priv->_event_fields_len = n_event_fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_filter_get_event_format:
|
||||
* @filter: a #MatrixFilter object
|
||||
*
|
||||
* Get the format that will be used to represent the filtered events.
|
||||
*
|
||||
* Returns: a #MatrixEventFormat value
|
||||
*/
|
||||
MatrixEventFormat
|
||||
matrix_filter_get_event_format(MatrixFilter *matrix_filter)
|
||||
{
|
||||
MatrixFilterPrivate *priv;
|
||||
|
||||
g_return_val_if_fail(matrix_filter != NULL, 0);
|
||||
|
||||
priv = matrix_filter_get_instance_private(matrix_filter);
|
||||
|
||||
return priv->_event_format;
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_filter_set_event_format:
|
||||
* @filter: a #MatrixFilter object
|
||||
* @event_format: the event format to use
|
||||
*
|
||||
* Set the desired event format for the filtered events (eg. for used with matrix_api_sync())
|
||||
*/
|
||||
void
|
||||
matrix_filter_set_event_format(MatrixFilter *matrix_filter, MatrixEventFormat event_format)
|
||||
{
|
||||
MatrixFilterPrivate *priv;
|
||||
|
||||
g_return_if_fail(matrix_filter != NULL);
|
||||
|
||||
priv = matrix_filter_get_instance_private(matrix_filter);
|
||||
|
||||
priv->_event_format = event_format;
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_filter_get_presence_filter:
|
||||
* @filter: a #MatrixFilter object
|
||||
*
|
||||
* Get the filtering ruleset for presence events.
|
||||
*
|
||||
* The returned value is owned by @filter and should not be freed.
|
||||
*
|
||||
* Returns: (transfer none) (nullable): a #MatrixFilterRules object
|
||||
*/
|
||||
MatrixFilterRules *
|
||||
matrix_filter_get_presence_filter(MatrixFilter *matrix_filter)
|
||||
{
|
||||
MatrixFilterPrivate *priv;
|
||||
|
||||
g_return_val_if_fail(matrix_filter != NULL, NULL);
|
||||
|
||||
priv = matrix_filter_get_instance_private(matrix_filter);
|
||||
|
||||
return priv->_presence_filter;
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_filter_set_presence_filter:
|
||||
* @filter: a #MatrixFilter object
|
||||
* @presence_filter: (transfer none): a #MatrixFilterRules object to be applied to presence events
|
||||
*
|
||||
* Set a filtering ruleset for presence events.
|
||||
*/
|
||||
void
|
||||
matrix_filter_set_presence_filter(MatrixFilter *matrix_filter, MatrixFilterRules *presence_filter)
|
||||
{
|
||||
MatrixFilterPrivate *priv;
|
||||
|
||||
g_return_if_fail(matrix_filter != NULL);
|
||||
|
||||
priv = matrix_filter_get_instance_private(matrix_filter);
|
||||
|
||||
matrix_json_compact_unref(MATRIX_JSON_COMPACT(priv->_presence_filter));
|
||||
priv->_presence_filter = (MatrixFilterRules *)matrix_json_compact_ref(MATRIX_JSON_COMPACT(presence_filter));
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_filter_get_room_filter:
|
||||
* @filter: a #MatrixFilter object
|
||||
*
|
||||
* Get the filtering ruleset to be applied to room events.
|
||||
*
|
||||
* The returned value is owned by @filter and should not be freed.
|
||||
*
|
||||
* Returns: (transfer none) (nullable): a #MatrixRoomFilter object
|
||||
*/
|
||||
MatrixRoomFilter *
|
||||
matrix_filter_get_room_filter(MatrixFilter *matrix_filter)
|
||||
{
|
||||
MatrixFilterPrivate *priv;
|
||||
|
||||
g_return_val_if_fail(matrix_filter != NULL, NULL);
|
||||
|
||||
priv = matrix_filter_get_instance_private(matrix_filter);
|
||||
|
||||
return priv->_room_filter;
|
||||
}
|
||||
|
||||
/**
|
||||
* matrix_filter_set_room_filter:
|
||||
* @filter: a #MatrixFilter object
|
||||
* @room_filter: a #MatrixRoomFilter to be applied to room events
|
||||
*
|
||||
* Set the filtering ruleset for room events.
|
||||
*/
|
||||
void
|
||||
matrix_filter_set_room_filter(MatrixFilter *matrix_filter, MatrixRoomFilter *room_filter)
|
||||
{
|
||||
MatrixFilterPrivate *priv;
|
||||
|
||||
g_return_if_fail(matrix_filter != NULL);
|
||||
|
||||
priv = matrix_filter_get_instance_private(matrix_filter);
|
||||
|
||||
matrix_json_compact_unref(MATRIX_JSON_COMPACT(priv->_room_filter));
|
||||
priv->_room_filter = (MatrixRoomFilter *)matrix_json_compact_ref(MATRIX_JSON_COMPACT(room_filter));
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_filter_finalize(MatrixJsonCompact *matrix_json_compact)
|
||||
{
|
||||
MatrixFilterPrivate *priv = matrix_filter_get_instance_private(MATRIX_FILTER(matrix_json_compact));
|
||||
|
||||
priv->_event_fields = (free_str_array(priv->_event_fields, priv->_event_fields_len), NULL);
|
||||
matrix_json_compact_unref(MATRIX_JSON_COMPACT(priv->_presence_filter));
|
||||
matrix_json_compact_unref(MATRIX_JSON_COMPACT(priv->_room_filter));
|
||||
|
||||
MATRIX_JSON_COMPACT_CLASS(matrix_filter_parent_class)->finalize(matrix_json_compact);
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_filter_class_init(MatrixFilterClass *klass)
|
||||
{
|
||||
((MatrixJsonCompactClass *)klass)->finalize = matrix_filter_finalize;
|
||||
((MatrixJsonCompactClass *)klass)->get_json_node = matrix_filter_get_json_node;
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_filter_init(MatrixFilter *matrix_filter)
|
||||
{
|
||||
MatrixFilterPrivate *priv = matrix_filter_get_instance_private(matrix_filter);
|
||||
|
||||
priv->_event_format = MATRIX_EVENT_FORMAT_CLIENT;
|
||||
priv->_presence_filter = NULL;
|
||||
priv->_room_filter = NULL;
|
||||
}
|
||||
|
@ -99,6 +99,23 @@ void matrix_room_filter_set_state(MatrixRoomFilter *room_filter, MatrixFilterRul
|
||||
MatrixFilterRules *matrix_room_filter_get_timeline(MatrixRoomFilter *room_filter);
|
||||
void matrix_room_filter_set_timeline(MatrixRoomFilter *room_filter, MatrixFilterRules *timeline_rules);
|
||||
|
||||
# define MATRIX_TYPE_FILTER matrix_filter_get_type()
|
||||
G_DECLARE_DERIVABLE_TYPE(MatrixFilter, matrix_filter, MATRIX, FILTER, MatrixJsonCompact)
|
||||
|
||||
struct _MatrixFilterClass {
|
||||
MatrixJsonCompactClass parent_class;
|
||||
};
|
||||
|
||||
MatrixFilter *matrix_filter_new(void);
|
||||
gchar **matrix_filter_get_event_fields(MatrixFilter *filter, int *n_event_fields);
|
||||
void matrix_filter_set_event_fields(MatrixFilter *filter, gchar **event_fields, int n_event_fields);
|
||||
MatrixEventFormat matrix_filter_get_event_format(MatrixFilter *filter);
|
||||
void matrix_filter_set_event_format(MatrixFilter *filter, MatrixEventFormat event_format);
|
||||
MatrixFilterRules *matrix_filter_get_presence_filter(MatrixFilter *filter);
|
||||
void matrix_filter_set_presence_filter(MatrixFilter *filter, MatrixFilterRules *presence_filter);
|
||||
MatrixRoomFilter *matrix_filter_get_room_filter(MatrixFilter *filter);
|
||||
void matrix_filter_set_room_filter(MatrixFilter *filter, MatrixRoomFilter *room_filter);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __MATRIX_GLIB_SDK_COMPACTS_H__ */
|
||||
|
@ -17,71 +17,6 @@
|
||||
*/
|
||||
|
||||
namespace Matrix {
|
||||
|
||||
/**
|
||||
* Class to hold a filter.
|
||||
*/
|
||||
public class Filter : JsonCompact {
|
||||
/**
|
||||
* The event fields to include in the filtered events.
|
||||
*/
|
||||
public string[] event_fields { get; set; }
|
||||
|
||||
/**
|
||||
* The desired event format for the filtered events (e.g. for
|
||||
* matrix_api_sync())
|
||||
*/
|
||||
public EventFormat event_format {
|
||||
get; set;
|
||||
default = Matrix.EventFormat.CLIENT;
|
||||
}
|
||||
|
||||
/**
|
||||
* A filtering ruleset for presence events.
|
||||
*/
|
||||
public FilterRules? presence_filter { get; set; default = null; }
|
||||
|
||||
/**
|
||||
* A filtering ruleset for room events.
|
||||
*/
|
||||
public RoomFilter? room_filter { get; set; default = null; }
|
||||
|
||||
/**
|
||||
* Get the filter as a JSON node.
|
||||
*/
|
||||
public override Json.Node?
|
||||
get_json_node()
|
||||
throws Matrix.Error
|
||||
{
|
||||
var builder = new Json.Builder();
|
||||
|
||||
builder.begin_object();
|
||||
|
||||
builder.set_member_name("event_fields");
|
||||
builder.begin_array();
|
||||
|
||||
foreach (var entry in event_fields) {
|
||||
builder.add_string_value(entry);
|
||||
}
|
||||
|
||||
builder.end_array();
|
||||
|
||||
builder.set_member_name("event_format");
|
||||
builder.add_string_value(
|
||||
_g_enum_value_to_nick(typeof(EventFormat), event_format));
|
||||
|
||||
builder.set_member_name("presence");
|
||||
builder.add_value(presence_filter.get_json_node());
|
||||
|
||||
builder.set_member_name("room");
|
||||
builder.add_value(room_filter.get_json_node());
|
||||
|
||||
builder.end_object();
|
||||
|
||||
return builder.get_root();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class to hold 3rd party credential related data.
|
||||
*/
|
||||
|
@ -320,6 +320,16 @@ namespace Matrix {
|
||||
throws Matrix.Error;
|
||||
}
|
||||
|
||||
[CCode (cheader_filename = "matrix-c-compacts.h")]
|
||||
public class Filter : JsonCompact {
|
||||
public string[] event_fields { get; set; }
|
||||
public EventFormat event_format { get; set; default = Matrix.EventFormat.CLIENT; }
|
||||
public FilterRules? presence_filter { get; set; default = null; }
|
||||
public RoomFilter? room_filter { get; set; default = null; }
|
||||
public override Json.Node? get_json_node()
|
||||
throws Matrix.Error;
|
||||
}
|
||||
|
||||
/* Utilities */
|
||||
[CCode (cheader_filename = "utils.h", cname = "_matrix_g_enum_to_string")]
|
||||
public string? _g_enum_value_to_nick(GLib.Type enum_type, int value, bool convert_dashes = true);
|
||||
|
Loading…
Reference in New Issue
Block a user