matrix-glib-sdk/src/matrix-room.c

1630 lines
46 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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-room.h"
#include "matrix-enumtypes.h"
/**
* SECTION:matrix-room
* @short_description: class to hold room data
*
*/
#define MATRIX_ROOM_TYPE_MEMBER_DATA (matrix_room_member_data_get_type ())
enum {
PROP_0,
PROP_ROOM_ID,
PROP_ALIASES,
PROP_AVATAR_URL,
PROP_AVATAR_THUMBNAIL_URL,
PROP_CANONICAL_ALIAS,
PROP_CREATOR,
PROP_FEDERATE,
PROP_GUEST_ACCESS,
PROP_HISTORY_VISIBILITY,
PROP_JOIN_RULES,
PROP_NAME,
PROP_DEFAULT_POWER_LEVEL,
PROP_DEFAULT_EVENT_LEVEL,
PROP_DEFAULT_STATE_LEVEL,
PROP_BAN_LEVEL,
PROP_KICK_LEVEL,
PROP_REDACT_LEVEL,
PROP_INVITE_LEVEL,
PROP_TOPIC,
PROP_TYPING_USERS,
PROP_AVATAR_INFO,
PROP_AVATAR_THUMBNAIL_INFO,
NUM_PROPERTIES
};
static GParamSpec *matrix_room_properties[NUM_PROPERTIES];
typedef struct {
MatrixProfile* profile;
gboolean thirdparty;
} MatrixRoomMemberData;
MatrixRoomMemberData *
matrix_room_member_data_new(void)
{
return g_new0(MatrixRoomMemberData, 1);
}
void
matrix_room_member_data_free(MatrixRoomMemberData *member_data)
{
g_return_if_fail(member_data != NULL);
g_object_unref(member_data->profile);
g_free(member_data);
}
typedef struct {
gchar *room_id;
gchar **aliases;
gint aliases_len;
gchar *avatar_url;
MatrixImageInfo *avatar_info;
gchar *avatar_thumbnail_url;
MatrixImageInfo *avatar_thumbnail_info;
gchar *canonical_alias;
gchar *creator;
gboolean federate;
MatrixGuestAccess guest_access;
MatrixHistoryVisibility history_visibility;
MatrixJoinRules join_rules;
gchar *name;
gint default_power_level;
gint default_event_level;
gint default_state_level;
gint ban_level;
gint kick_level;
gint redact_level;
gint invite_level;
gchar *topic;
gchar **typing_users;
gint typing_users_len;
GHashTable* event_levels;
GHashTable* user_levels;
GHashTable* members;
} MatrixRoomPrivate;
/**
* MatrixRoom:
*
* The #MatrixRoom class is there to hold different parameters of a room like its known aliases,
* its members, etc.
*/
G_DEFINE_TYPE_WITH_PRIVATE(MatrixRoom, matrix_room, G_TYPE_OBJECT);
/**
* matrix_room_new:
* @room_id: a room ID
*
* Create a new #MatrixRoom object.
*
* Returns: (transfer full): a new #MatrixRoom object
*/
MatrixRoom *
matrix_room_new(const gchar *room_id)
{
g_return_val_if_fail(room_id != NULL, NULL);
return (MatrixRoom *)g_object_new(MATRIX_TYPE_ROOM,
"room-id", room_id,
NULL);
}
/**
* matrix_room_add_member:
* @room: a #MatrixRoom
* @user_id: the Matrix ID of the user to add
* @profile: a #MatrixProfile
* @third_party: if true, the member is marked as a pending 3rd party invitation
* @error: a #GError, or %NULL to ignore errors
*
* Add a member to the room member list. If a member with the same @user_id exists, @error is
* set to #MATRIX_ERROR_ALREADY_EXISTS.
*/
void
matrix_room_add_member(MatrixRoom *matrix_room, const gchar *user_id, MatrixProfile *profile, gboolean third_party, GError **error)
{
MatrixRoomPrivate *priv;
MatrixRoomMemberData *data = NULL;
g_return_if_fail(matrix_room != NULL);
g_return_if_fail(user_id != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if ((data = g_hash_table_lookup(priv->members, user_id)) != NULL) {
g_set_error(error, MATRIX_ERROR, MATRIX_ERROR_ALREADY_EXISTS,
"User already exists in that room");
return;
}
data = matrix_room_member_data_new();
if (profile == NULL) {
data->profile = matrix_profile_new();
} else {
data->profile = profile;
}
data->thirdparty = third_party;
g_hash_table_insert(priv->members, g_strdup(user_id), data);
}
/**
* matrix_room_get_or_add_member:
* @room: a #MatrixRoom
* @user_id: the Matrix ID of the user to add
* @third_party: if %TRUE, the member is marked as a pending 3rd party invitation
* @error: a #GError, or %NULL to ignore errors
*
* Gets the profile of the room member specified in @user_id. If that user is not added to the
* room yet, it gets added with an empty profile and that profile is returned.
*
* Returns: (transfer none): the #MatrixProfile of the user
*/
MatrixProfile *
matrix_room_get_or_add_member(MatrixRoom *matrix_room, const gchar *user_id, gboolean third_party, GError **error)
{
MatrixProfile *profile;
GError *inner_error = NULL;
g_return_val_if_fail(matrix_room != NULL, NULL);
g_return_val_if_fail(user_id != NULL, NULL);
profile = matrix_room_get_member(matrix_room, user_id, NULL, &inner_error);
if (inner_error == NULL) {
return profile;
}
if ((inner_error->domain != MATRIX_ERROR) || (inner_error->code == MATRIX_ERROR_NOT_FOUND)) {
g_propagate_error(error, inner_error);
return NULL;
}
g_clear_error(&inner_error);
matrix_room_add_member(matrix_room, user_id, NULL, third_party, &inner_error);
if (inner_error != NULL) {
g_propagate_error(error, inner_error);
return NULL;
}
profile = matrix_room_get_member(matrix_room, user_id, &third_party, &inner_error);
if (inner_error != NULL) {
g_propagate_error(error, inner_error);
return NULL;
}
return profile;
}
/**
* matrix_room_get_member:
* @room: a #MatrixRoom
* @user_id: the Matrix ID of the user to find
* @third_party: gets a true value if the member is actually a pending 3rd party invitation
* @error: (nullable): a #GError, or %NULL to ignore errors
*
* Gets the profile of the room member specified in @user_id. If that user is not added to
* the room yet, @error is set to #MATRIX_ERROR_NOT_FOUND.
*
* Returns: (transfer none): the profile of the user
*/
MatrixProfile *
matrix_room_get_member(MatrixRoom *matrix_room, const gchar *user_id, gboolean *third_party, GError **error)
{
MatrixRoomMemberData *data;
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
g_return_val_if_fail(user_id != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
if ((data = g_hash_table_lookup(priv->members, user_id)) == NULL) {
g_set_error(error, MATRIX_ERROR, MATRIX_ERROR_NOT_FOUND,
"No such room member");
return NULL;
}
if (third_party != NULL) {
*third_party = data->thirdparty;
}
return data->profile;
}
/**
* matrix_room_remove_member:
* @room: a #MatrixRoom
* @user_id: a Matrix ID
* @error: (nullable): a #GError, or %NULL to ignore errors
*
* Removes @user_id from the member list.
*/
void
matrix_room_remove_member(MatrixRoom *matrix_room, const gchar *user_id, GError **error)
{
MatrixRoomMemberData *data;
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
g_return_if_fail(user_id != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if ((data = g_hash_table_lookup(priv->members, user_id)) == NULL) {
g_set_error(error, MATRIX_ERROR, MATRIX_ERROR_NOT_FOUND,
"No such room member");
return;
}
g_hash_table_remove(priv->members, user_id);
}
/**
* matrix_room_clear_user_levels:
* @room: a #MatrixRoom
*
* Clear the stored individual user levels. This should be called eg. when receiving a new
* `m.room.power_levels` event.
*/
void
matrix_room_clear_user_levels(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
g_hash_table_remove_all(priv->user_levels);
}
/**
* matrix_room_set_user_level:
* @room: a #MatrixRoom
* @user_id: a fully qualified Matrix ID
* @level: the new power level
*
* Set an individual power level for a user.
*/
void
matrix_room_set_user_level(MatrixRoom *matrix_room, const gchar *user_id, gint level)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
g_return_if_fail(user_id != NULL);
priv = matrix_room_get_instance_private(matrix_room);
g_hash_table_insert (priv->user_levels, g_strdup(user_id), GINT_TO_POINTER(level));
}
/**
* matrix_room_get_user_level:
* @room: a #MatrixRoom
* @user_id: a fully qualified Matrix ID
*
* Get the power level of a user. If the user doesnt have an individually set power level,
* the default value is returned.
*
* Returns: the level of the user.
*/
gint
matrix_room_get_user_level(MatrixRoom *matrix_room, const gchar *user_id)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
g_return_val_if_fail(user_id != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
gpointer level = NULL;
if (!g_hash_table_lookup_extended(priv->user_levels, user_id, NULL, &level)) {
return priv->default_power_level;
}
return GPOINTER_TO_INT(level);
}
/**
* matrix_room_clear_event_levels:
* @room: a #MatrixRoom
*
* Clear the stored event level requirements. This should be called eg. when receiving a new
* `m.room.power_levels` event.
*/
void
matrix_room_clear_event_levels(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
g_hash_table_remove_all(priv->event_levels);
}
/**
* matrix_room_set_event_level:
* @room: a #MatrixRoom
* @event_type: the event type to restrict
* @level: the desired level for the event type
*
* Set the required level to send an event of type @event_type.
*/
void
matrix_room_set_event_level(MatrixRoom *matrix_room, const gchar *event_type, gint level)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
g_return_if_fail (event_type != NULL);
priv = matrix_room_get_instance_private(matrix_room);
g_hash_table_insert(priv->event_levels, g_strdup(event_type), GINT_TO_POINTER(level));
}
/**
* matrix_room_get_event_level:
* @room: a #MatrixRoom
* @event_type: the event type to query
* @error: (nullable): a #GError, or %NULL to ignore errors
*
* Get the required level to send an event of type @event_type. If there is no level
* requirement set for this event type, this function returns %NULL as there is no way to
* decide if #MatrixRoom:default-state-level or #MatrixRoom:default-event-level should be used.
*
* Returns: the level required to send a specific event
*/
gint
matrix_room_get_event_level(MatrixRoom *matrix_room, const gchar *event_type, GError **error)
{
MatrixRoomPrivate *priv;
gpointer level;
g_return_val_if_fail(matrix_room != NULL, 0);
g_return_val_if_fail(event_type != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
if (!g_hash_table_lookup_extended(priv->event_levels, event_type, NULL, &level)) {
g_set_error(error, MATRIX_ERROR, MATRIX_ERROR_NOT_FOUND, "No level set for this event type");
return 0;
}
return GPOINTER_TO_INT(level);
}
const gchar *
matrix_room_get_room_id(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
return priv->room_id;
}
static void
matrix_room_set_room_id(MatrixRoom *matrix_room, const gchar *room_id)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (g_strcmp0(room_id, priv->room_id) != 0) {
g_free(priv->room_id);
priv->room_id = g_strdup(room_id);
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_ROOM_ID]);
}
}
/**
* matrix_room_get_aliases:
* @room: a #MatrixRoom
* @n_aliases: (nullable): a placeholder for the length of the list
*
* Returns: (transfer none): the list of room aliases
*/
gchar **
matrix_room_get_aliases(MatrixRoom *matrix_room, int *n_aliases)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (n_aliases != NULL) {
*n_aliases = priv->aliases_len;
}
return priv->aliases;
}
/**
* matrix_room_set_aliases:
* @room: a #MatrixRoom
* @aliases: a list of aliases to assign to @room
* @n_aliases: the length of @aliases
*/
void
matrix_room_set_aliases(MatrixRoom *matrix_room, const gchar **aliases, int n_aliases)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
for (gint i = 0; i < priv->aliases_len; i++) {
g_free(priv->aliases[i]);
}
g_free(priv->aliases);
priv->aliases = g_new(gchar *, n_aliases);
for (gint i = 0; i < n_aliases; i++) {
priv->aliases[i] = g_strdup(aliases[i]);
}
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_ALIASES]);
}
const gchar *
matrix_room_get_avatar_url(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
return priv->avatar_url;
}
void
matrix_room_set_avatar_url(MatrixRoom *matrix_room, const gchar *avatar_url)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (g_strcmp0(avatar_url, priv->avatar_url) != 0) {
g_free(priv->avatar_url);
priv->avatar_url = g_strdup(avatar_url);
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_AVATAR_URL]);
}
}
MatrixImageInfo *
matrix_room_get_avatar_info(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
return priv->avatar_info;
}
void
matrix_room_set_avatar_info(MatrixRoom *matrix_room, MatrixImageInfo *avatar_info)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->avatar_info != avatar_info) {
matrix_image_info_unref(priv->avatar_info);
priv->avatar_info = matrix_image_info_ref(avatar_info);
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_AVATAR_INFO]);
}
}
const gchar *
matrix_room_get_avatar_thumbnail_url(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
return priv->avatar_thumbnail_url;
}
void
matrix_room_set_avatar_thumbnail_url(MatrixRoom *matrix_room, const gchar *avatar_thumbnail_url)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (g_strcmp0(avatar_thumbnail_url, priv->avatar_thumbnail_url) != 0) {
g_free(priv->avatar_thumbnail_url);
priv->avatar_thumbnail_url = g_strdup(avatar_thumbnail_url);
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_AVATAR_THUMBNAIL_URL]);
}
}
MatrixImageInfo *
matrix_room_get_avatar_thumbnail_info(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
return priv->avatar_thumbnail_info;
}
void
matrix_room_set_avatar_thumbnail_info(MatrixRoom *matrix_room, MatrixImageInfo *avatar_thumbnail_info)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->avatar_thumbnail_info != avatar_thumbnail_info) {
matrix_image_info_unref(priv->avatar_thumbnail_info);
priv->avatar_thumbnail_info = matrix_image_info_ref(avatar_thumbnail_info);
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_AVATAR_THUMBNAIL_INFO]);
}
}
const gchar *
matrix_room_get_canonical_alias(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
return priv->canonical_alias;
}
void
matrix_room_set_canonical_alias(MatrixRoom *matrix_room, const gchar *canonical_alias)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (g_strcmp0(canonical_alias, priv->canonical_alias) != 0) {
g_free(priv->canonical_alias);
priv->canonical_alias = g_strdup(canonical_alias);
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_CANONICAL_ALIAS]);
}
}
const gchar *
matrix_room_get_creator(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
return priv->creator;
}
void
matrix_room_set_creator(MatrixRoom *matrix_room, const gchar *creator)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (g_strcmp0(creator, priv->creator) != 0) {
g_free(priv->creator);
priv->creator = g_strdup(creator);
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_CREATOR]);
}
}
gboolean
matrix_room_get_federate(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, FALSE);
priv = matrix_room_get_instance_private(matrix_room);
return priv->federate;
}
void
matrix_room_set_federate(MatrixRoom *matrix_room, gboolean federate)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->federate != federate) {
priv->federate = federate;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_FEDERATE]);
}
}
MatrixGuestAccess
matrix_room_get_guest_access(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
return priv->guest_access;
}
void
matrix_room_set_guest_access(MatrixRoom *matrix_room, MatrixGuestAccess guest_access)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->guest_access != guest_access) {
priv->guest_access = guest_access;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_GUEST_ACCESS]);
}
}
MatrixHistoryVisibility
matrix_room_get_history_visibility(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
return priv->history_visibility;
}
void
matrix_room_set_history_visibility(MatrixRoom *matrix_room, MatrixHistoryVisibility history_visibility)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->history_visibility != history_visibility) {
priv->history_visibility = history_visibility;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_HISTORY_VISIBILITY]);
}
}
MatrixJoinRules
matrix_room_get_join_rules(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
return priv->join_rules;
}
void
matrix_room_set_join_rules(MatrixRoom *matrix_room, MatrixJoinRules join_rules)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->join_rules != join_rules) {
priv->join_rules = join_rules;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_JOIN_RULES]);
}
}
const gchar *
matrix_room_get_name(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
return priv->name;
}
void
matrix_room_set_name(MatrixRoom *matrix_room, const gchar *name)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (g_strcmp0(name, priv->name) != 0) {
g_free(priv->name);
priv->name = g_strdup(name);
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_NAME]);
}
}
gint
matrix_room_get_default_power_level(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
return priv->default_power_level;
}
void
matrix_room_set_default_power_level(MatrixRoom *matrix_room, gint default_power_level)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->default_power_level != default_power_level) {
priv->default_power_level = default_power_level;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_DEFAULT_POWER_LEVEL]);
}
}
gint
matrix_room_get_default_event_level(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
return priv->default_event_level;
}
void
matrix_room_set_default_event_level(MatrixRoom *matrix_room, gint default_event_level)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->default_event_level != default_event_level) {
priv->default_event_level = default_event_level;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_DEFAULT_EVENT_LEVEL]);
}
}
gint
matrix_room_get_default_state_level(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
return priv->default_state_level;
}
void
matrix_room_set_default_state_level(MatrixRoom *matrix_room, gint defaul_state_level)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->default_state_level != defaul_state_level) {
priv->default_state_level = defaul_state_level;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_DEFAULT_STATE_LEVEL]);
}
}
gint
matrix_room_get_ban_level(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
return priv->ban_level;
}
void
matrix_room_set_ban_level(MatrixRoom *matrix_room, gint ban_level)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->ban_level != ban_level) {
priv->ban_level = ban_level;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_BAN_LEVEL]);
}
}
gint
matrix_room_get_kick_level(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
return priv->kick_level;
}
void
matrix_room_set_kick_level(MatrixRoom *matrix_room, gint kick_level)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->kick_level != kick_level) {
priv->kick_level = kick_level;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_KICK_LEVEL]);
}
}
gint
matrix_room_get_redact_level(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
return priv->redact_level;
}
void
matrix_room_set_redact_level(MatrixRoom *matrix_room, gint redact_level)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->redact_level != redact_level) {
priv->redact_level = redact_level;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_REDACT_LEVEL]);
}
}
gint
matrix_room_get_invite_level(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, 0);
priv = matrix_room_get_instance_private(matrix_room);
return priv->invite_level;
}
void
matrix_room_set_invite_level(MatrixRoom *matrix_room, gint invite_level)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (priv->invite_level != invite_level) {
priv->invite_level = invite_level;
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_INVITE_LEVEL]);
}
}
const gchar *
matrix_room_get_topic(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
return priv->topic;
}
void
matrix_room_set_topic(MatrixRoom *matrix_room, const gchar *topic)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (g_strcmp0(topic, priv->topic) != 0) {
g_free(priv->topic);
priv->topic = g_strdup(topic);
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_TOPIC]);
}
}
/**
* matrix_room_get_typing_users:
* @room: a #MatrixRoom
* @n_typing_users: (nullable): placeholder for the length of the returned list
*
* Returns: (transfer none): the list of typing users in @room
*/
gchar **
matrix_room_get_typing_users(MatrixRoom *matrix_room, int *n_typing_users)
{
MatrixRoomPrivate *priv;
g_return_val_if_fail(matrix_room != NULL, NULL);
priv = matrix_room_get_instance_private(matrix_room);
if (n_typing_users != NULL) {
*n_typing_users = priv->typing_users_len;
}
return priv->typing_users;
}
void
matrix_room_set_typing_users(MatrixRoom *matrix_room, gchar **typing_users, int n_typing_users)
{
MatrixRoomPrivate *priv;
g_return_if_fail(matrix_room != NULL);
priv = matrix_room_get_instance_private(matrix_room);
for (gint i = 0; i < priv->typing_users_len; i++) {
g_free(priv->typing_users[i]);
}
g_free(priv->typing_users);
priv->typing_users = g_new(gchar *, n_typing_users);
for (gint i = 0; i < n_typing_users; i++) {
priv->typing_users[i] = g_strdup(typing_users[i]);
}
g_object_notify_by_pspec((GObject *)matrix_room, matrix_room_properties[PROP_TYPING_USERS]);
}
static void
matrix_room_finalize(GObject *gobject)
{
MatrixRoomPrivate *priv = matrix_room_get_instance_private(MATRIX_ROOM(gobject));
g_free(priv->room_id);
for (gint i = 0; i < priv->aliases_len; i++) {
g_free(priv->aliases[i]);
}
g_free(priv->aliases);
g_free(priv->avatar_url);
matrix_image_info_unref(priv->avatar_info);
g_free(priv->avatar_thumbnail_url);
matrix_image_info_unref(priv->avatar_thumbnail_info);
g_free(priv->canonical_alias);
g_free(priv->creator);
g_free(priv->name);
g_free(priv->topic);
for (gint i = 0; i < priv->typing_users_len; i++) {
g_free(priv->typing_users[i]);
}
g_free(priv->typing_users);
g_hash_table_unref(priv->event_levels);
g_hash_table_unref(priv->user_levels);
g_hash_table_unref(priv->members);
G_OBJECT_CLASS(matrix_room_parent_class)->finalize(gobject);
}
static void
matrix_room_get_property(GObject *gobject, guint property_id, GValue *value, GParamSpec *pspec)
{
MatrixRoom *matrix_room = MATRIX_ROOM(gobject);
switch (property_id) {
case PROP_ROOM_ID:
g_value_set_string(value, matrix_room_get_room_id(matrix_room));
break;
case PROP_ALIASES:
g_value_set_boxed(value, matrix_room_get_aliases(matrix_room, NULL));
break;
case PROP_AVATAR_URL:
g_value_set_string(value, matrix_room_get_avatar_url(matrix_room));
break;
case PROP_AVATAR_THUMBNAIL_URL:
g_value_set_string(value, matrix_room_get_avatar_thumbnail_url(matrix_room));
break;
case PROP_CANONICAL_ALIAS:
g_value_set_string(value, matrix_room_get_canonical_alias(matrix_room));
break;
case PROP_CREATOR:
g_value_set_string(value, matrix_room_get_creator(matrix_room));
break;
case PROP_FEDERATE:
g_value_set_boolean(value, matrix_room_get_federate(matrix_room));
break;
case PROP_GUEST_ACCESS:
g_value_set_enum(value, matrix_room_get_guest_access(matrix_room));
break;
case PROP_HISTORY_VISIBILITY:
g_value_set_enum(value, matrix_room_get_history_visibility(matrix_room));
break;
case PROP_JOIN_RULES:
g_value_set_enum(value, matrix_room_get_join_rules(matrix_room));
break;
case PROP_NAME:
g_value_set_string(value, matrix_room_get_name(matrix_room));
break;
case PROP_DEFAULT_POWER_LEVEL:
g_value_set_int(value, matrix_room_get_default_power_level(matrix_room));
break;
case PROP_DEFAULT_EVENT_LEVEL:
g_value_set_int(value, matrix_room_get_default_event_level(matrix_room));
break;
case PROP_DEFAULT_STATE_LEVEL:
g_value_set_int(value, matrix_room_get_default_state_level(matrix_room));
break;
case PROP_BAN_LEVEL:
g_value_set_int(value, matrix_room_get_ban_level(matrix_room));
break;
case PROP_KICK_LEVEL:
g_value_set_int(value, matrix_room_get_kick_level(matrix_room));
break;
case PROP_REDACT_LEVEL:
g_value_set_int(value, matrix_room_get_redact_level(matrix_room));
break;
case PROP_INVITE_LEVEL:
g_value_set_int(value, matrix_room_get_invite_level(matrix_room));
break;
case PROP_TOPIC:
g_value_set_string(value, matrix_room_get_topic(matrix_room));
break;
case PROP_TYPING_USERS:
g_value_set_boxed(value, matrix_room_get_typing_users(matrix_room, NULL));
break;
case PROP_AVATAR_INFO:
g_value_set_boxed(value, matrix_room_get_avatar_info(matrix_room));
break;
case PROP_AVATAR_THUMBNAIL_INFO:
g_value_set_boxed(value, matrix_room_get_avatar_thumbnail_info(matrix_room));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, property_id, pspec);
break;
}
}
static void
matrix_room_set_property(GObject *gobject, guint property_id, const GValue *value, GParamSpec *pspec)
{
MatrixRoom * matrix_room = MATRIX_ROOM(gobject);
switch (property_id) {
case PROP_ROOM_ID:
matrix_room_set_room_id(matrix_room, g_value_get_string(value));
break;
case PROP_ALIASES:
{
gpointer boxed = g_value_get_boxed(value);
matrix_room_set_aliases(matrix_room, boxed, (boxed == NULL) ? 0 : g_strv_length(boxed));
break;
}
case PROP_AVATAR_URL:
matrix_room_set_avatar_url(matrix_room, g_value_get_string(value));
break;
case PROP_AVATAR_THUMBNAIL_URL:
matrix_room_set_avatar_thumbnail_url(matrix_room, g_value_get_string(value));
break;
case PROP_CANONICAL_ALIAS:
matrix_room_set_canonical_alias(matrix_room, g_value_get_string(value));
break;
case PROP_CREATOR:
matrix_room_set_creator(matrix_room, g_value_get_string(value));
break;
case PROP_FEDERATE:
matrix_room_set_federate(matrix_room, g_value_get_boolean(value));
break;
case PROP_GUEST_ACCESS:
matrix_room_set_guest_access(matrix_room, g_value_get_enum(value));
break;
case PROP_HISTORY_VISIBILITY:
matrix_room_set_history_visibility(matrix_room, g_value_get_enum(value));
break;
case PROP_JOIN_RULES:
matrix_room_set_join_rules(matrix_room, g_value_get_enum (value));
break;
case PROP_NAME:
matrix_room_set_name(matrix_room, g_value_get_string(value));
break;
case PROP_DEFAULT_POWER_LEVEL:
matrix_room_set_default_power_level(matrix_room, g_value_get_int(value));
break;
case PROP_DEFAULT_EVENT_LEVEL:
matrix_room_set_default_event_level(matrix_room, g_value_get_int(value));
break;
case PROP_DEFAULT_STATE_LEVEL:
matrix_room_set_default_state_level(matrix_room, g_value_get_int(value));
break;
case PROP_BAN_LEVEL:
matrix_room_set_ban_level(matrix_room, g_value_get_int(value));
break;
case PROP_KICK_LEVEL:
matrix_room_set_kick_level(matrix_room, g_value_get_int(value));
break;
case PROP_REDACT_LEVEL:
matrix_room_set_redact_level(matrix_room, g_value_get_int(value));
break;
case PROP_INVITE_LEVEL:
matrix_room_set_invite_level(matrix_room, g_value_get_int(value));
break;
case PROP_TOPIC:
matrix_room_set_topic(matrix_room, g_value_get_string(value));
break;
case PROP_TYPING_USERS:
{
gpointer boxed = g_value_get_boxed(value);
matrix_room_set_typing_users(matrix_room, boxed, (boxed == NULL) ? 0 : g_strv_length(boxed));
break;
}
case PROP_AVATAR_INFO:
matrix_room_set_avatar_info(matrix_room, g_value_get_boxed(value));
break;
case PROP_AVATAR_THUMBNAIL_INFO:
matrix_room_set_avatar_thumbnail_info(matrix_room, g_value_get_boxed(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, property_id, pspec);
break;
}
}
static void
matrix_room_class_init(MatrixRoomClass *klass)
{
G_OBJECT_CLASS(klass)->get_property = matrix_room_get_property;
G_OBJECT_CLASS(klass)->set_property = matrix_room_set_property;
G_OBJECT_CLASS(klass)->finalize = matrix_room_finalize;
/**
* MatrixRoom:room-id:
*
* The ID of the room this object belongs to.
*/
matrix_room_properties[PROP_ROOM_ID] = g_param_spec_string(
"room-id", "room-id", "room-id",
NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_ROOM_ID, matrix_room_properties[PROP_ROOM_ID]);
/**
* MatrixRoom:aliases:
*
* All the known room aliases.
*/
matrix_room_properties[PROP_ALIASES] = g_param_spec_boxed(
"aliases", "aliases", "aliases",
G_TYPE_STRV,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_ALIASES, matrix_room_properties[PROP_ALIASES]);
/**
* MatrixRoom:avatar-url:
*
* The URL of the rooms avatar.
*/
matrix_room_properties[PROP_AVATAR_URL] = g_param_spec_string(
"avatar-url", "avatar-url", "avatar-url",
NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_AVATAR_URL, matrix_room_properties[PROP_AVATAR_URL]);
/**
* MatrixRoom:avatar-thumbnail-url:
*
* The URL of the room avatars thumbnail.
*/
matrix_room_properties[PROP_AVATAR_THUMBNAIL_URL] = g_param_spec_string(
"avatar-thumbnail-url", "avatar-thumbnail-url", "avatar-thumbnail-url",
NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_AVATAR_THUMBNAIL_URL, matrix_room_properties[PROP_AVATAR_THUMBNAIL_URL]);
/**
* MatrixRoom:canonical-alias:
*
* The canonical alias of the room.
*/
matrix_room_properties[PROP_CANONICAL_ALIAS] = g_param_spec_string(
"canonical-alias", "canonical-alias", "canonical-alias",
NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_CANONICAL_ALIAS, matrix_room_properties[PROP_CANONICAL_ALIAS]);
/**
* MatrixRoom:creator:
*
* The Matrix ID of the rooms creator.
*/
matrix_room_properties[PROP_CREATOR] = g_param_spec_string(
"creator", "creator", "creator",
NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_CREATOR, matrix_room_properties[PROP_CREATOR]);
/**
* MatrixRoom:federate:
*
* If %FALSE, the room is not federated.
*/
matrix_room_properties[PROP_FEDERATE] = g_param_spec_boolean(
"federate", "federate", "federate",
FALSE,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_FEDERATE, matrix_room_properties[PROP_FEDERATE]);
/**
* MatrixRoom:guest-access:
*
* Wether guests are allowed to join the room.
*/
matrix_room_properties[PROP_GUEST_ACCESS] = g_param_spec_enum(
"guest-access", "guest-access", "guest-access",
MATRIX_TYPE_GUEST_ACCESS, MATRIX_GUEST_ACCESS_UNKNOWN,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_GUEST_ACCESS, matrix_room_properties[PROP_GUEST_ACCESS]);
/**
* MatrixRoom:history-visibility:
* This value controls the visibility of the rooms history.
*/
matrix_room_properties[PROP_HISTORY_VISIBILITY] = g_param_spec_enum(
"history-visibility", "history-visibility", "history-visibility",
MATRIX_TYPE_HISTORY_VISIBILITY, MATRIX_HISTORY_VISIBILITY_UNKNOWN,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_HISTORY_VISIBILITY, matrix_room_properties[PROP_HISTORY_VISIBILITY]);
/**
* MatrixRoom:join-rules:
*
* Controls who can join the room.
*/
matrix_room_properties[PROP_JOIN_RULES] = g_param_spec_enum(
"join-rules", "join-rules", "join-rules",
MATRIX_TYPE_JOIN_RULES, MATRIX_JOIN_RULES_UNKNOWN,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_JOIN_RULES, matrix_room_properties[PROP_JOIN_RULES]);
/**
* MatrixRoom:name:
*
* The rooms name.
*/
matrix_room_properties[PROP_NAME] = g_param_spec_string(
"name", "name", "name",
NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_NAME, matrix_room_properties[PROP_NAME]);
/**
* MatrixRoom:default-power-level:
*
* The default power level users get upon joining the room.
*/
matrix_room_properties[PROP_DEFAULT_POWER_LEVEL] = g_param_spec_int(
"default-power-level", "default-power-level", "default-power-level",
G_MININT, G_MAXINT, 0,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_DEFAULT_POWER_LEVEL, matrix_room_properties[PROP_DEFAULT_POWER_LEVEL]);
/**
* MatrixRoom:default-event-level:
*
* The power level required to send non-state events to the room. This gets applied if
* the event type doesnt have an explicit level requirement (see
* matrix_room_set_event_level() and matrix_room_get_event_level() for more information).
*/
matrix_room_properties[PROP_DEFAULT_EVENT_LEVEL] = g_param_spec_int(
"default-event-level", "default-event-level", "default-event-level",
G_MININT, G_MAXINT, 0,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_DEFAULT_EVENT_LEVEL, matrix_room_properties[PROP_DEFAULT_EVENT_LEVEL]);
/**
* MatrixRoom:default-state-level:
*
* The power level required to send state events to the room. This get applied if the
* event type doesnt have an explicit level requirement (see matrix_room_set_event_level()
* and matrix_room_get_event_level() for more information).
*/
matrix_room_properties[PROP_DEFAULT_STATE_LEVEL] = g_param_spec_int(
"default-state-level", "default-state-level", "default-state-level",
G_MININT, G_MAXINT, 10,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_DEFAULT_STATE_LEVEL, matrix_room_properties[PROP_DEFAULT_STATE_LEVEL]);
/**
* MatrixRoom:ban-level:
*
* The power level required to ban other users from the room.
*/
matrix_room_properties[PROP_BAN_LEVEL] = g_param_spec_int(
"ban-level", "ban-level", "ban-level",
G_MININT, G_MAXINT, 5,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_BAN_LEVEL, matrix_room_properties[PROP_BAN_LEVEL]);
/**
* MatrixRoom:kick-level:
*
* The power level required to kick other users from the room.
*/
matrix_room_properties[PROP_KICK_LEVEL] = g_param_spec_int(
"kick-level", "kick-level", "kick-level",
G_MININT, G_MAXINT, 5,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_KICK_LEVEL, matrix_room_properties[PROP_KICK_LEVEL]);
/**
* MatrixRoom:redact-level:
*
* The power level required to redact events in the room.
*/
matrix_room_properties[PROP_REDACT_LEVEL] = g_param_spec_int(
"redact-level", "redact-level", "redact-level",
G_MININT, G_MAXINT, 20,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_REDACT_LEVEL, matrix_room_properties[PROP_REDACT_LEVEL]);
/**
* MatrixRoom:invite-level:
*
* The power level required to invite users to the room.
*/
matrix_room_properties[PROP_INVITE_LEVEL] = g_param_spec_int(
"invite-level", "invite-level", "invite-level",
G_MININT, G_MAXINT, 0,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_INVITE_LEVEL, matrix_room_properties[PROP_INVITE_LEVEL]);
/**
* MatrixRoom:topic:
*
* The rooms topic.
*/
matrix_room_properties[PROP_TOPIC] = g_param_spec_string(
"topic", "topic", "topic",
NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_TOPIC, matrix_room_properties[PROP_TOPIC]);
/**
* MatrixRoom:typing-users:
*
* The users currently typing in the room.
*/
matrix_room_properties[PROP_TYPING_USERS] = g_param_spec_boxed(
"typing-users", "typing-users", "typing-users",
G_TYPE_STRV,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_TYPING_USERS, matrix_room_properties[PROP_TYPING_USERS]);
/**
* MatrixRoom:avatar-info:
*
* A #MatrixImageInfo describing #MatrixRoom:avatar-url.
*/
matrix_room_properties[PROP_AVATAR_INFO] = g_param_spec_boxed(
"avatar-info", "avatar-info", "avatar-info",
MATRIX_TYPE_IMAGE_INFO,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_AVATAR_INFO, matrix_room_properties[PROP_AVATAR_INFO]);
/**
* MatrixRoom:avatar-thumbnail-info:
*
* A #MatrixImageInfo describing #MatrixRoom:avatar-thumbnail-url:
*/
matrix_room_properties[PROP_AVATAR_THUMBNAIL_INFO] = g_param_spec_boxed(
"avatar-thumbnail-info", "avatar-thumbnail-info", "avatar-thumbnail-info",
MATRIX_TYPE_IMAGE_INFO,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_AVATAR_THUMBNAIL_INFO, matrix_room_properties[PROP_AVATAR_THUMBNAIL_INFO]);
}
static void
matrix_room_init(MatrixRoom *matrix_room)
{
MatrixRoomPrivate *priv = matrix_room_get_instance_private(matrix_room);
priv->avatar_url = NULL;
priv->avatar_info = NULL;
priv->avatar_thumbnail_url = NULL;
priv->avatar_thumbnail_info = NULL;
priv->canonical_alias = NULL;
priv->creator = NULL;
priv->federate = FALSE;
priv->guest_access = MATRIX_GUEST_ACCESS_UNKNOWN;
priv->history_visibility = MATRIX_HISTORY_VISIBILITY_UNKNOWN;
priv->join_rules = MATRIX_JOIN_RULES_UNKNOWN;
priv->name = NULL;
priv->default_power_level = 0;
priv->default_event_level = 0;
priv->default_state_level = 10;
priv->ban_level = 5;
priv->kick_level = 5;
priv->redact_level = 20;
priv->invite_level = 0;
priv->topic = NULL;
priv->event_levels = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
priv->user_levels = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
priv->members = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)matrix_room_member_data_free);
}