From 41295e4b3379bbca0f14067ca415b7820340cfb6 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Fri, 3 Nov 2017 14:57:19 +0100 Subject: [PATCH] Port MatrixProfile to C --- .gitignore | 1 - src/Makefile.am | 3 +- src/matrix-profile.c | 321 ++++++++++++++++++++++++++++++++++++++++ src/matrix-profile.h | 46 ++++++ src/matrix-profile.vala | 65 -------- vapi/c-api.vapi | 9 ++ 6 files changed, 378 insertions(+), 67 deletions(-) create mode 100644 src/matrix-profile.c create mode 100644 src/matrix-profile.h delete mode 100644 src/matrix-profile.vala diff --git a/.gitignore b/.gitignore index 23acb4b..4be754c 100644 --- a/.gitignore +++ b/.gitignore @@ -91,5 +91,4 @@ Makefile.in /src/matrix-message-audio.c /src/matrix-message-video.c /src/matrix-message-location.c -/src/matrix-profile.c /src/matrix-room.c diff --git a/src/Makefile.am b/src/Makefile.am index a3c8f35..f2fdecc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -58,7 +58,6 @@ libmatrix_glib_0_0_la_VALA_SOURCES = \ matrix-message-audio.vala \ matrix-message-video.vala \ matrix-message-location.vala \ - matrix-profile.vala \ matrix-room.vala \ $(NULL) @@ -115,6 +114,7 @@ bin_PROGRAMS = test-api-client test-client INST_H_SRC_FILES = \ matrix-types.h \ utils.h \ + matrix-profile.h \ $(NULL) INST_H_BUILT_FILES = \ @@ -134,6 +134,7 @@ libmatrix_glib_0_0_la_SOURCES = \ matrix-event-types.c \ matrix-version.c \ matrix-types.c \ + matrix-profile.c \ utils.c \ matrix-enumtypes.c \ $(INST_H_SRC_FILES) \ diff --git a/src/matrix-profile.c b/src/matrix-profile.c new file mode 100644 index 0000000..8dc4f5c --- /dev/null +++ b/src/matrix-profile.c @@ -0,0 +1,321 @@ +/* + * 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 + * . + */ + +#include "matrix-profile.h" +#include +#include + +// List of object properties +enum { + PROP_NONE, + PROP_AGE, + PROP_DISPLAY_NAME, + PROP_AVATAR_URL, + NUM_PROPERTIES +}; + +typedef struct { + GDateTime* last_update; + gchar* display_name; + gchar* _avatar_url; +} MatrixProfilePrivate; + +G_DEFINE_TYPE(MatrixProfile, matrix_profile, G_TYPE_OBJECT); + +static GParamSpec* matrix_profile_properties[NUM_PROPERTIES]; + +MatrixProfile * +matrix_profile_construct(GType object_type) +{ + return (MatrixProfile *)g_object_new(object_type, NULL); +} + +/** + * matrix_profile_new: + * + * Create a new #MatrixProfile object. + * + * Returns: (transfer full): a new #MatrixProfile object + */ +MatrixProfile * +matrix_profile_new (void) +{ + return matrix_profile_construct(MATRIX_TYPE_PROFILE); +} + +/** + * matrix_profile_get_age: + * @profile: a #MatrixProfile + * + * Get the age of the profile. + * + * Returns: the profile age, in seconds + */ +GTimeSpan +matrix_profile_get_age (MatrixProfile *matrix_profile) +{ + GTimeSpan result; + GDateTime* utcnow; + MatrixProfilePrivate *priv = matrix_profile_get_instance_private(matrix_profile); + + if (G_UNLIKELY(matrix_profile == NULL)) { + return (GTimeSpan)0; + } + + utcnow = g_date_time_new_now_utc (); + result = g_date_time_difference (utcnow, priv->last_update); + g_date_time_unref(utcnow); + + return result; +} + +/** + * matrix_profile_get_display_name: + * @profile: a #MatrixProfile + * + * Get the display name from @profile. + * + * The returned value is owned by @profile and should not be modified. + * + * Returns: (transfer none) (nullable): a display name + */ +const gchar* +matrix_profile_get_display_name (MatrixProfile *matrix_profile) +{ + MatrixProfilePrivate *priv = matrix_profile_get_instance_private(matrix_profile); + + if (G_UNLIKELY(matrix_profile == NULL)) { + return NULL; + } + + return priv->display_name; +} + +/** + * matrix_profile_set_display_name: + * @profile: a #MatrixProfile + * @display_name: (transfer none) (nullable): a display name + * + * Set the display name in @profile. + */ +void +matrix_profile_set_display_name (MatrixProfile *matrix_profile, const gchar* display_name) +{ + MatrixProfilePrivate *priv = matrix_profile_get_instance_private(matrix_profile); + + if (G_UNLIKELY(matrix_profile == NULL)) { + return; + } + + g_free(priv->display_name); + priv->display_name = g_strdup (display_name); + + g_date_time_unref(priv->last_update); + priv->last_update = g_date_time_new_now_utc (); + + g_object_notify_by_pspec((GObject *)matrix_profile, + matrix_profile_properties[PROP_DISPLAY_NAME]); +} + +/** + * matrix_profile_get_avatar_url: + * @profile: a #MatrixProfile + * + * Get the avatar URL from @profile. + * + * The returned value is owned by @profile and should not be freed. + * + * Returns: (transfer none) (nullable): an avatar URL + */ +const gchar * +matrix_profile_get_avatar_url (MatrixProfile *matrix_profile) +{ + MatrixProfilePrivate *priv = matrix_profile_get_instance_private(matrix_profile); + + if (G_UNLIKELY(matrix_profile == NULL)) { + return NULL; + } + + return priv->_avatar_url; +} + +/** + * matrix_profile_set_avatar_url: + * @profile: a #MatrixProfile + * @avatar_url: (transfer none) (nullable): the URL to the avatar + * + * Set the avatar URL in @profile. + */ +void +matrix_profile_set_avatar_url (MatrixProfile *matrix_profile, const gchar* avatar_url) +{ + MatrixProfilePrivate *priv = matrix_profile_get_instance_private(matrix_profile); + + if (G_UNLIKELY(matrix_profile == NULL)) { + return; + } + + g_free(priv->_avatar_url); + priv->_avatar_url = g_strdup (avatar_url); + + g_date_time_unref(priv->last_update); + priv->last_update = g_date_time_new_now_utc (); + + g_object_notify_by_pspec ((GObject *)matrix_profile, + matrix_profile_properties[PROP_AVATAR_URL]); +} + +static void +matrix_profile_finalize(GObject *gobject) +{ + MatrixProfile *matrix_profile; + MatrixProfilePrivate *priv; + + matrix_profile = G_TYPE_CHECK_INSTANCE_CAST(gobject, MATRIX_TYPE_PROFILE, MatrixProfile); + priv = matrix_profile_get_instance_private(matrix_profile); + + g_date_time_unref(priv->last_update); + g_free(priv->display_name); + g_free(priv->_avatar_url); + + priv->last_update = NULL; + priv->display_name = NULL; + priv->_avatar_url = NULL; + + G_OBJECT_CLASS (matrix_profile_parent_class)->finalize(gobject); +} + +static void +matrix_profile_get_property (GObject *gobject, guint property_id, GValue *value, GParamSpec *pspec) +{ + MatrixProfile *matrix_profile; + + matrix_profile = G_TYPE_CHECK_INSTANCE_CAST(gobject, MATRIX_TYPE_PROFILE, MatrixProfile); + + switch (property_id) { + case PROP_AGE: + g_value_set_int64 (value, matrix_profile_get_age (matrix_profile)); + + break; + case PROP_DISPLAY_NAME: + g_value_set_string (value, matrix_profile_get_display_name (matrix_profile)); + + break; + case PROP_AVATAR_URL: + g_value_set_string(value, matrix_profile_get_avatar_url (matrix_profile)); + + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, property_id, pspec); + + break; + } +} + +static void +matrix_profile_set_property(GObject *gobject, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + MatrixProfile *matrix_profile; + + matrix_profile = G_TYPE_CHECK_INSTANCE_CAST(gobject, MATRIX_TYPE_PROFILE, MatrixProfile); + + switch (property_id) { + case PROP_DISPLAY_NAME: + matrix_profile_set_display_name(matrix_profile, g_value_get_string(value)); + + break; + case PROP_AVATAR_URL: + matrix_profile_set_avatar_url(matrix_profile, g_value_get_string(value)); + + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, property_id, pspec); + + break; + } +} + +static void +matrix_profile_class_init(MatrixProfileClass *klass) +{ + matrix_profile_parent_class = g_type_class_peek_parent(klass); + + G_OBJECT_CLASS(klass)->get_property = matrix_profile_get_property; + G_OBJECT_CLASS(klass)->set_property = matrix_profile_set_property; + G_OBJECT_CLASS(klass)->finalize = matrix_profile_finalize; + + /** + * MatrixProfile:age: + * + * The age of the profile, in seconds. + */ + matrix_profile_properties[PROP_AGE] = g_param_spec_int64( + "age", "Age", + "Age of the profile", + 0, G_MAXINT64, 0, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE); + g_object_class_install_property( + G_OBJECT_CLASS (klass), + PROP_AGE, + matrix_profile_properties[PROP_AGE]); + + /** + * MatrixProfile:display-name: + * + * The display name of the user in this profile. + */ + matrix_profile_properties[PROP_DISPLAY_NAME] = g_param_spec_string( + "display-name", "display-name", + "The human readable name of the usser", + NULL, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE); + g_object_class_install_property( + G_OBJECT_CLASS(klass), + PROP_DISPLAY_NAME, + matrix_profile_properties[PROP_DISPLAY_NAME]); + + /** + * MatrixProfile:avatar-url: + * + * The avatar URL in this profile. + */ + matrix_profile_properties[PROP_AVATAR_URL] = g_param_spec_string ( + "avatar-url", "avatar-url", + "The URL of the user's avatar", + NULL, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE); + g_object_class_install_property( + G_OBJECT_CLASS (klass), + PROP_AVATAR_URL, + matrix_profile_properties[PROP_AVATAR_URL]); +} + +static void +matrix_profile_init(MatrixProfile *matrix_profile) +{ + MatrixProfilePrivate *priv = matrix_profile_get_instance_private(matrix_profile); + + priv->display_name = NULL; + priv->_avatar_url = NULL; + + matrix_profile_set_display_name(matrix_profile, NULL); + matrix_profile_set_avatar_url(matrix_profile, NULL); +} diff --git a/src/matrix-profile.h b/src/matrix-profile.h new file mode 100644 index 0000000..36a518c --- /dev/null +++ b/src/matrix-profile.h @@ -0,0 +1,46 @@ +/* + * 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 + * . + */ + +#ifndef __MATRIX_GLIB_SDK_PROFILE_H__ +# define __MATRIX_GLIB_SDK_PROFILE_H__ + +# include + +G_BEGIN_DECLS + +# define MATRIX_TYPE_PROFILE matrix_profile_get_type() +G_DECLARE_DERIVABLE_TYPE(MatrixProfile, matrix_profile, MATRIX, PROFILE, GObject); + +struct _MatrixProfileClass { + GObjectClass parent_class; + + /* < private > */ + gpointer padding[12]; +}; + +MatrixProfile *matrix_profile_new(void); +MatrixProfile *matrix_profile_construct(GType object_type); + GTimeSpan matrix_profile_get_age (MatrixProfile *profile); +const gchar *matrix_profile_get_avatar_url(MatrixProfile *profile); +void matrix_profile_set_avatar_url(MatrixProfile *profile, const gchar *avatar_url); +const gchar *matrix_profile_get_display_name(MatrixProfile *profile); +void matrix_profile_set_display_name(MatrixProfile *profile, const gchar *display_name); + +G_END_DECLS + +#endif /* __MATRIX_GLIB_SDK_PROFILE_H__ */ diff --git a/src/matrix-profile.vala b/src/matrix-profile.vala deleted file mode 100644 index ad5957d..0000000 --- a/src/matrix-profile.vala +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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 - * . - */ - -/** - * Object to hold a user's profile - * - * This object is used for both global and room specific profiles. - */ -public class Matrix.Profile : Object { - public TimeSpan age { - get { - return new DateTime.now_utc().difference(_last_update); - } - } - - /** - * The human readable name of the user. - */ - public string? display_name { - get { - return _display_name; - } - - set { - _display_name = value; - _last_update = new DateTime.now_utc(); - } - - default = null; - } - - /** - * The URL of the user's avatar. - */ - public string? avatar_url { - get { - return _avatar_url; - } - set { - _avatar_url = value; - _last_update = new DateTime.now_utc(); - } - - default = null; - } - - private DateTime _last_update; - private string? _display_name = null; - private string? _avatar_url = null; -} diff --git a/vapi/c-api.vapi b/vapi/c-api.vapi index 7ab59b1..1d16f98 100644 --- a/vapi/c-api.vapi +++ b/vapi/c-api.vapi @@ -292,6 +292,15 @@ namespace Matrix { public int _g_enum_nick_to_value(GLib.Type enum_type, string nick) throws Matrix.Error; + [CCode (cheader_filename = "matrix-profile.h")] + public class Profile : GLib.Object { + public GLib.TimeSpan age {get;} + public string? avatar_url {get; set;} + public string? display_name {get; set;} + + public Profile(); + } + /** * The major version number of the Matrix.org GLib SDK. */