--- a/talkatu/talkatuactiongroup.c Tue Jul 21 20:49:33 2020 -0500
+++ b/talkatu/talkatuactiongroup.c Tue Jul 21 20:57:01 2020 -0500
@@ -24,6 +24,7 @@
#include "talkatu/talkatulinkdialog.h"
#include "talkatu/talkatumarkup.h"
#include "talkatu/talkatumessage.h"
+#include "talkatu/talkatusimpleattachment.h" #include "talkatu/talkatutag.h"
@@ -407,7 +408,8 @@
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
content_type = g_content_type_guess(filename, NULL, 0, NULL);
- attachment = talkatu_attachment_new(G_GUINT64_CONSTANT(0), content_type);
+ attachment = talkatu_simple_attachment_new(G_GUINT64_CONSTANT(0), talkatu_attachment_set_local_uri(attachment, filename);
--- a/talkatu/talkatuattachment.c Tue Jul 21 20:49:33 2020 -0500
+++ b/talkatu/talkatuattachment.c Tue Jul 21 20:57:01 2020 -0500
@@ -42,164 +42,75 @@
* regular file but only images will be previewed based on their actual
-struct _TalkatuAttachment {
- gboolean preview_ready;
-G_DEFINE_TYPE(TalkatuAttachment, talkatu_attachment, G_TYPE_OBJECT);
-static GParamSpec *properties[N_PROPERTIES];
-/******************************************************************************
- *****************************************************************************/
-talkatu_attachment_set_content_type(TalkatuAttachment *attachment,
- const gchar *content_type)
- if(attachment->content_type == content_type) {
- g_clear_pointer(&attachment->content_type, g_free);
- attachment->content_type = g_strdup(content_type);
- g_object_notify_by_pspec(G_OBJECT(attachment),
- properties[PROP_CONTENT_TYPE]);
+G_DEFINE_INTERFACE(TalkatuAttachment, talkatu_attachment, G_TYPE_INVALID); /******************************************************************************
*****************************************************************************/
-talkatu_attachment_get_property(GObject *obj, guint prop_id, GValue *value, GParamSpec *pspec) {
- TalkatuAttachment *attachment = TALKATU_ATTACHMENT(obj);
- g_value_set_uint64(value, talkatu_attachment_get_id(attachment));
- case PROP_CONTENT_TYPE:
- g_value_set_string(value, talkatu_attachment_get_content_type(attachment));
- g_value_set_string(value, talkatu_attachment_get_local_uri(attachment));
- g_value_set_string(value, talkatu_attachment_get_remote_uri(attachment));
- g_value_set_uint64(value, talkatu_attachment_get_size(attachment));
- G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, prop_id, pspec);
-talkatu_attachment_set_property(GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) {
- TalkatuAttachment *attachment = TALKATU_ATTACHMENT(obj);
+talkatu_attachment_default_init(TalkatuAttachmentInterface *iface) { + GParamSpec *pspec = NULL;
- talkatu_attachment_set_id(attachment, g_value_get_uint64(value));
- case PROP_CONTENT_TYPE:
- talkatu_attachment_set_content_type(attachment, g_value_get_string(value));
- talkatu_attachment_set_local_uri(attachment, g_value_get_string(value));
- talkatu_attachment_set_remote_uri(attachment, g_value_get_string(value));
- talkatu_attachment_set_size(attachment, g_value_get_uint64(value));
- G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, prop_id, pspec);
-talkatu_attachment_finalize(GObject *obj) {
- TalkatuAttachment *attachment = TALKATU_ATTACHMENT(obj);
- g_clear_pointer(&attachment->content_type, g_free);
- g_clear_pointer(&attachment->local_uri, g_free);
- g_clear_pointer(&attachment->remote_uri, g_free);
- g_clear_object(&attachment->preview);
- G_OBJECT_CLASS(talkatu_attachment_parent_class)->finalize(obj);
-talkatu_attachment_init(TalkatuAttachment *attachment) {
-talkatu_attachment_class_init(TalkatuAttachmentClass *klass) {
- GObjectClass *obj_class = G_OBJECT_CLASS(klass);
- obj_class->get_property = talkatu_attachment_get_property;
- obj_class->set_property = talkatu_attachment_set_property;
- obj_class->finalize = talkatu_attachment_finalize;
- /* add our properties */
- properties[PROP_ID] = g_param_spec_uint64(
+ * TalkatuAttachment::id: + * The identifier of the attachment. + pspec = g_param_spec_uint64( "id", "id", "The identifier of the attachment",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS
+ g_object_interface_install_property(iface, pspec); - properties[PROP_CONTENT_TYPE] = g_param_spec_string(
+ * TalkatuAttachment::content-type: + * The content type of the attachment. + pspec = g_param_spec_string( "content-type", "content-type", "The content type of the attachment",
"application/octet-stream",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS
+ g_object_interface_install_property(iface, pspec); - properties[PROP_LOCAL_URI] = g_param_spec_string(
+ * TalkatuAttachment::local-uri: + * The local URI of the attachment. + pspec = g_param_spec_string( "local-uri", "local-uri", "The local URI of the attachment",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS
+ g_object_interface_install_property(iface, pspec); - properties[PROP_REMOTE_URI] = g_param_spec_string(
+ * TalkatuAttachment::remote-uri: + * The remote URI of the attachment. + pspec = g_param_spec_string( "remote-uri", "remote-uri", "The remote URI of the attachment",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS
+ g_object_interface_install_property(iface, pspec); - properties[PROP_SIZE] = g_param_spec_uint64(
+ * TalkatuAttachment::size: + * The size of the attachment. + pspec = g_param_spec_uint64( "size", "size", "The file size of the attachment in bytes",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS
- g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
+ g_object_interface_install_property(iface, pspec); /******************************************************************************
@@ -237,9 +148,13 @@
talkatu_attachment_get_id(TalkatuAttachment *attachment) {
g_return_val_if_fail(TALKATU_IS_ATTACHMENT(attachment), 0);
+ g_object_get(G_OBJECT(attachment), "id", &ret, NULL); @@ -254,9 +169,13 @@
talkatu_attachment_get_hash_key(TalkatuAttachment *attachment) {
+ TalkatuAttachmentInterface *iface = NULL; g_return_val_if_fail(TALKATU_IS_ATTACHMENT(attachment), NULL);
- return &attachment->id;
+ iface = TALKATU_ATTACHMENT_GET_IFACE(attachment); + return iface->get_hash_key(attachment); @@ -270,13 +189,7 @@
talkatu_attachment_set_id(TalkatuAttachment *attachment, guint64 id) {
g_return_if_fail(TALKATU_IS_ATTACHMENT(attachment));
- if(attachment->id == id) {
- g_object_notify_by_pspec(G_OBJECT(attachment), properties[PROP_ID]);
+ g_object_set(G_OBJECT(attachment), "id", id, NULL); @@ -287,11 +200,15 @@
* Returns: The content type of @attachment.
talkatu_attachment_get_content_type(TalkatuAttachment *attachment) {
+ gchar *content_type = NULL; g_return_val_if_fail(TALKATU_IS_ATTACHMENT(attachment), NULL);
- return attachment->content_type;
+ g_object_get(G_OBJECT(attachment), "content-type", &content_type, NULL); @@ -300,13 +217,17 @@
* Gets the local URI if any for @attachment.
- * Returns: (nullable): The local URI for @attachment.
+ * Returns: The local URI for @attachment.
talkatu_attachment_get_local_uri(TalkatuAttachment *attachment) {
+ gchar *local_uri = NULL; g_return_val_if_fail(TALKATU_IS_ATTACHMENT(attachment), NULL);
- return attachment->local_uri;
+ g_object_get(G_OBJECT(attachment), "local-uri", &local_uri, NULL); @@ -322,25 +243,7 @@
g_return_if_fail(TALKATU_IS_ATTACHMENT(attachment));
- if(attachment->local_uri == local_uri) {
- g_free(attachment->local_uri);
- if(local_uri != NULL) {
- gchar *scheme = g_uri_parse_scheme(local_uri);
- attachment->local_uri = g_filename_to_uri(local_uri, NULL, NULL);
- attachment->local_uri = g_strdup(local_uri);
- attachment->local_uri = NULL;
- g_object_notify_by_pspec(G_OBJECT(attachment), properties[PROP_LOCAL_URI]);
+ g_object_set(G_OBJECT(attachment), "local-uri", local_uri, NULL); @@ -351,11 +254,15 @@
* Returns: (nullable): The remote URI for @attachment.
talkatu_attachment_get_remote_uri(TalkatuAttachment *attachment) {
+ gchar *remote_uri = NULL; g_return_val_if_fail(TALKATU_IS_ATTACHMENT(attachment), NULL);
- return attachment->remote_uri;
+ g_object_get(G_OBJECT(attachment), "remote-uri", &remote_uri, NULL); @@ -371,14 +278,7 @@
g_return_if_fail(TALKATU_IS_ATTACHMENT(attachment));
- if(attachment->remote_uri == remote_uri) {
- g_free(attachment->remote_uri);
- attachment->remote_uri = g_strdup(remote_uri);
- g_object_notify_by_pspec(G_OBJECT(attachment), properties[PROP_REMOTE_URI]);
+ g_object_set(G_OBJECT(attachment), "remote-uri", remote_uri, NULL); @@ -391,9 +291,13 @@
talkatu_attachment_get_size(TalkatuAttachment *attachment) {
g_return_val_if_fail(TALKATU_IS_ATTACHMENT(attachment), 0);
- return attachment->size;
+ g_object_get(G_OBJECT(attachment), "size", &size, NULL); @@ -407,9 +311,7 @@
talkatu_attachment_set_size(TalkatuAttachment *attachment, guint64 size) {
g_return_if_fail(TALKATU_IS_ATTACHMENT(attachment));
- attachment->size = size;
- g_object_notify_by_pspec(G_OBJECT(attachment), properties[PROP_SIZE]);
+ g_object_set(G_OBJECT(attachment), "size", size, NULL); @@ -423,14 +325,26 @@
talkatu_attachment_get_filename(TalkatuAttachment *attachment) {
+ gchar *remote_uri = NULL, *local_uri = NULL; g_return_val_if_fail(TALKATU_IS_ATTACHMENT(attachment), NULL);
- if(attachment->remote_uri != NULL && attachment->remote_uri[0] != '\0') {
- return g_path_get_basename(attachment->remote_uri);
+ remote_uri = talkatu_attachment_get_remote_uri(attachment); + if(remote_uri != NULL && remote_uri[0] != '\0') { + gchar *ret = g_path_get_basename(remote_uri); - if(attachment->local_uri != NULL && attachment->local_uri[0] != '\0') {
- return g_path_get_basename(attachment->local_uri);
+ local_uri = talkatu_attachment_get_local_uri(attachment); + if(local_uri != NULL && local_uri[0] != '\0') { + gchar *ret = g_path_get_basename(local_uri); return g_strdup("unknown");
@@ -446,26 +360,37 @@
talkatu_attachment_get_preview(TalkatuAttachment *attachment) {
+ gchar *content_type = NULL; const gchar *name = "text-x-generic-template";
g_return_val_if_fail(TALKATU_IS_ATTACHMENT(attachment), NULL);
- if(g_str_has_prefix(attachment->content_type, "image/")) {
- if(attachment->local_uri != NULL) {
- GFile *file = g_file_new_for_uri(attachment->local_uri);
+ content_type = talkatu_attachment_get_content_type(attachment); + if(content_type == NULL) { + return g_themed_icon_new(name); + if(g_str_has_prefix(content_type, "image/")) { + gchar *local_uri = talkatu_attachment_get_local_uri(attachment); + if(local_uri != NULL) { + GFile *file = g_file_new_for_uri(local_uri); GIcon *icon = g_file_icon_new(file);
g_object_unref(G_OBJECT(file));
name = "image-x-generic";
- } else if(g_str_has_prefix(attachment->content_type, "text/")) {
+ } else if(g_str_has_prefix(content_type, "text/")) { - } else if(g_str_has_prefix(attachment->content_type, "audio/")) {
+ } else if(g_str_has_prefix(content_type, "audio/")) { name = "audio-x-generic";
return g_themed_icon_new(name);
--- a/talkatu/talkatuattachment.h Tue Jul 21 20:49:33 2020 -0500
+++ b/talkatu/talkatuattachment.h Tue Jul 21 20:57:01 2020 -0500
@@ -23,28 +23,37 @@
#ifndef TALKATU_ATTACHMENT_H
#define TALKATU_ATTACHMENT_H
-#include <gdk-pixbuf/gdk-pixbuf.h>
#define TALKATU_TYPE_ATTACHMENT (talkatu_attachment_get_type())
-G_DECLARE_FINAL_TYPE(TalkatuAttachment, talkatu_attachment, TALKATU, ATTACHMENT, GObject)
+G_DECLARE_INTERFACE(TalkatuAttachment, talkatu_attachment, TALKATU, ATTACHMENT, GObject) +struct _TalkatuAttachmentInterface { + guint64 *(*get_hash_key)(TalkatuAttachment *attachment); typedef void (*TalkatuAttachmentForeachFunc)(TalkatuAttachment *attachment, gpointer data);
-TalkatuAttachment *talkatu_attachment_new(guint64 id, const gchar *content_type);
guint64 talkatu_attachment_get_id(TalkatuAttachment *attachment);
guint64 *talkatu_attachment_get_hash_key(TalkatuAttachment *attachment);
void talkatu_attachment_set_id(TalkatuAttachment *attachment, guint64 id);
-const gchar *talkatu_attachment_get_content_type(TalkatuAttachment *attachment);
+gchar *talkatu_attachment_get_content_type(TalkatuAttachment *attachment); -const gchar *talkatu_attachment_get_local_uri(TalkatuAttachment *attachment);
+gchar *talkatu_attachment_get_local_uri(TalkatuAttachment *attachment); void talkatu_attachment_set_local_uri(TalkatuAttachment *attachment, const gchar *local_uri);
-const gchar *talkatu_attachment_get_remote_uri(TalkatuAttachment *attachment);
+gchar *talkatu_attachment_get_remote_uri(TalkatuAttachment *attachment); void talkatu_attachment_set_remote_uri(TalkatuAttachment *attachment, const gchar *remote_uri);
gsize talkatu_attachment_get_size(TalkatuAttachment *attachment);
--- a/talkatu/talkatuattachmentdialog.c Tue Jul 21 20:49:33 2020 -0500
+++ b/talkatu/talkatuattachmentdialog.c Tue Jul 21 20:57:01 2020 -0500
@@ -166,7 +166,7 @@
properties[PROP_ATTACHMENT] = g_param_spec_object(
"attachment", "attachment",
"The attachment that this dialog is customizing",
- TALKATU_TYPE_ATTACHMENT,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
properties[PROP_COMMENT] = g_param_spec_string(
--- a/talkatu/talkatuattachmentpreview.c Tue Jul 21 20:49:33 2020 -0500
+++ b/talkatu/talkatuattachmentpreview.c Tue Jul 21 20:57:01 2020 -0500
@@ -161,7 +161,7 @@
properties[PROP_ATTACHMENT] = g_param_spec_object(
"attachment", "attachment",
"The attachment that this preview is customizing",
- TALKATU_TYPE_ATTACHMENT,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
--- a/talkatu/talkatuinput.c Tue Jul 21 20:49:33 2020 -0500
+++ b/talkatu/talkatuinput.c Tue Jul 21 20:57:01 2020 -0500
@@ -24,11 +24,11 @@
#include "talkatu/talkatuinput.h"
#include "talkatu/talkatuactiongroup.h"
-#include "talkatu/talkatuattachment.h"
#include "talkatu/talkatuattachmentdialog.h"
#include "talkatu/talkatuenums.h"
#include "talkatu/talkatumarkup.h"
#include "talkatu/talkatumessage.h"
+#include "talkatu/talkatusimpleattachment.h" @@ -506,7 +506,7 @@
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(input));
comment = talkatu_markup_get_html(buffer, NULL);
- attachment = talkatu_attachment_new(G_GUINT64_CONSTANT(0), "image/png");
+ attachment = talkatu_simple_attachment_new(G_GUINT64_CONSTANT(0), "image/png"); filename = g_file_get_uri(file);
talkatu_attachment_set_local_uri(attachment, filename);