libpurple/purpleattachments.c

Thu, 16 Jan 2025 21:25:32 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 16 Jan 2025 21:25:32 -0600
changeset 43147
835d74e5d22d
parent 43145
dff7cdade009
permissions
-rw-r--r--

Make Purple.Attachment:id a string

Previously we thought we'd use 64bit integers for ids everywhere, but a string
makes everything much more flexible.

Testing Done:
Called in the turtles.

Reviewed at https://reviews.imfreedom.org/r/3760/

43145
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Purple - Internet Messaging Library
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 * This library is free software; you can redistribute it and/or modify it
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * under the terms of the GNU General Public License as published by the Free
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * Software Foundation; either version 2 of the License, or (at your option)
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * any later version.
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 * This library is distributed in the hope that it will be useful, but WITHOUT
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * more details.
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License along with
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
20 * this library; if not, see <https://www.gnu.org/licenses/>.
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #include <gio/gio.h>
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25 #include "purpleattachments.h"
43147
835d74e5d22d Make Purple.Attachment:id a string
Gary Kramlich <grim@reaperworld.com>
parents: 43145
diff changeset
26 #include "util.h"
43145
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28 struct _PurpleAttachments {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 GObject parent;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31 GPtrArray *attachments;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32 };
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
33
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
34 enum {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35 PROP_0,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
36 PROP_ITEM_TYPE,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
37 PROP_N_ITEMS,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
38 N_PROPERTIES,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
39 };
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 static GParamSpec *properties[N_PROPERTIES] = {NULL, };
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42 /******************************************************************************
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 * Helpers
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 *****************************************************************************/
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
45 static gboolean
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
46 purple_attachments_equal(gconstpointer a, gconstpointer b) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 PurpleAttachment *attachment1 = (gpointer)a;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48 PurpleAttachment *attachment2 = (gpointer)b;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50 return purple_attachment_equal(attachment1, attachment2);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53 /******************************************************************************
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54 * GListModel Implementation
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55 *****************************************************************************/
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56 static GType
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57 purple_attachments_get_item_type(G_GNUC_UNUSED GListModel *model) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58 return PURPLE_TYPE_ATTACHMENT;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
59 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61 static guint
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
62 purple_attachments_get_n_items(GListModel *model) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
63 PurpleAttachments *attachments = PURPLE_ATTACHMENTS(model);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65 return attachments->attachments->len;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 static gpointer
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69 purple_attachments_get_item(GListModel *model, guint position) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70 PurpleAttachments *attachments = PURPLE_ATTACHMENTS(model);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71 PurpleAttachment *attachment = NULL;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73 if(position < attachments->attachments->len) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 attachment = g_ptr_array_index(attachments->attachments, position);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76 if(PURPLE_IS_ATTACHMENT(attachment)) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77 g_object_ref(attachment);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
78 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
79 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
80
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
81 return attachment;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
82 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
83
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
84 static void
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
85 purple_attachments_list_model_iface_init(GListModelInterface *iface) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
86 iface->get_item_type = purple_attachments_get_item_type;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
87 iface->get_n_items = purple_attachments_get_n_items;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
88 iface->get_item = purple_attachments_get_item;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
89 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
90
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
91 /******************************************************************************
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
92 * GObject Implementation
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
93 *****************************************************************************/
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
94 G_DEFINE_FINAL_TYPE_WITH_CODE(PurpleAttachments,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
95 purple_attachments,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
96 G_TYPE_OBJECT,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
97 G_IMPLEMENT_INTERFACE(G_TYPE_LIST_MODEL,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
98 purple_attachments_list_model_iface_init))
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
99
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
100 static void
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
101 purple_attachments_finalize(GObject *obj) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
102 PurpleAttachments *attachments = PURPLE_ATTACHMENTS(obj);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
103
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
104 g_clear_pointer(&attachments->attachments, g_ptr_array_unref);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
105
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
106 G_OBJECT_CLASS(purple_attachments_parent_class)->finalize(obj);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
107 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
108
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
109 static void
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
110 purple_attachments_get_property(GObject *obj, guint param_id, GValue *value,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
111 GParamSpec *pspec)
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
112 {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
113 GListModel *model = G_LIST_MODEL(obj);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
114
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
115 switch(param_id) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
116 case PROP_ITEM_TYPE:
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
117 g_value_set_gtype(value, g_list_model_get_item_type(model));
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
118 break;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
119 case PROP_N_ITEMS:
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
120 g_value_set_uint(value, g_list_model_get_n_items(model));
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
121 break;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
122 default:
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
123 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
124 break;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
125 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
126 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
127
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
128 static void
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
129 purple_attachments_init(PurpleAttachments *attachments) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
130 attachments->attachments = g_ptr_array_new_full(0, g_object_unref);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
131 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
132
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
133 static void
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
134 purple_attachments_class_init(PurpleAttachmentsClass *klass) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
135 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
136
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
137 obj_class->finalize = purple_attachments_finalize;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
138 obj_class->get_property = purple_attachments_get_property;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
139
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
140 /**
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
141 * PurpleAttachments:item-type:
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
142 *
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
143 * The type of items. See [vfunc@Gio.ListModel.get_item_type].
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
144 *
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
145 * Since: 3.0
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
146 */
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
147 properties[PROP_ITEM_TYPE] = g_param_spec_gtype(
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
148 "item-type", NULL, NULL,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
149 PURPLE_TYPE_ATTACHMENT,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
150 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
151
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
152 /**
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
153 * PurpleAttachments:n-items:
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
154 *
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
155 * The number of items. See [vfunc@Gio.ListModel.get_n_items].
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
156 *
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
157 * Since: 3.0
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
158 */
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
159 properties[PROP_N_ITEMS] = g_param_spec_uint(
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
160 "n-items", NULL, NULL,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
161 0, G_MAXUINT, 0,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
162 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
163
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
164 g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
165 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
167 /******************************************************************************
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
168 * Public API
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
169 *****************************************************************************/
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
170 gboolean
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
171 purple_attachments_add_attachment(PurpleAttachments *attachments,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
172 PurpleAttachment *attachment)
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173 {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174 GObject *obj = NULL;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
175 gboolean found = FALSE;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176 guint len = 0;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
178 g_return_val_if_fail(PURPLE_IS_ATTACHMENTS(attachments), FALSE);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179 g_return_val_if_fail(PURPLE_IS_ATTACHMENT(attachment), FALSE);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
181 found = g_ptr_array_find_with_equal_func(attachments->attachments,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182 attachment,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
183 purple_attachments_equal,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
184 NULL);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
185
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
186 if(found) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
187 return FALSE;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
188 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
189
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
190 /* Store length before adding to make the math easier to understand. */
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
191 len = attachments->attachments->len;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
192
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
193 g_ptr_array_add(attachments->attachments, g_object_ref(attachment));
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
194
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
195 obj = G_OBJECT(attachments);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
196 g_object_freeze_notify(obj);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
197 g_list_model_items_changed(G_LIST_MODEL(attachments), len, 0, 1);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
198 g_object_notify_by_pspec(obj, properties[PROP_N_ITEMS]);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
199 g_object_thaw_notify(obj);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
200
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
201 return TRUE;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
202 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
203
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
204 PurpleAttachment *
43147
835d74e5d22d Make Purple.Attachment:id a string
Gary Kramlich <grim@reaperworld.com>
parents: 43145
diff changeset
205 purple_attachments_find_with_id(PurpleAttachments *attachments, const char *id)
835d74e5d22d Make Purple.Attachment:id a string
Gary Kramlich <grim@reaperworld.com>
parents: 43145
diff changeset
206 {
43145
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
207 g_return_val_if_fail(PURPLE_IS_ATTACHMENTS(attachments), NULL);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
208
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
209 for(guint i = 0; i < attachments->attachments->len; i++) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
210 PurpleAttachment *attachment = NULL;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
211
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
212 attachment = g_ptr_array_index(attachments->attachments, i);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
213
43147
835d74e5d22d Make Purple.Attachment:id a string
Gary Kramlich <grim@reaperworld.com>
parents: 43145
diff changeset
214 if(purple_strequal(purple_attachment_get_id(attachment), id)) {
43145
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
215 return attachment;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
216 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
217 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
218
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
219 return NULL;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
220 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
221
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
222 PurpleAttachments *
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
223 purple_attachments_new(void) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
224 return g_object_new(PURPLE_TYPE_ATTACHMENTS, NULL);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
225 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
226
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
227 gboolean
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
228 purple_attachments_remove_attachment(PurpleAttachments *attachments,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
229 PurpleAttachment *attachment)
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
230 {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
231 GObject *obj = NULL;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
232 gboolean found = FALSE;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
233 guint index = 0;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
234
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
235 g_return_val_if_fail(PURPLE_IS_ATTACHMENTS(attachments), FALSE);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
236 g_return_val_if_fail(PURPLE_IS_ATTACHMENT(attachment), FALSE);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
237
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
238 found = g_ptr_array_find_with_equal_func(attachments->attachments,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
239 attachment,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
240 purple_attachments_equal,
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
241 &index);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
242 if(!found) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
243 return FALSE;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
244 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
245
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
246 g_ptr_array_remove_index(attachments->attachments, index);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
247
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
248 obj = G_OBJECT(attachments);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
249 g_object_freeze_notify(obj);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
250 g_list_model_items_changed(G_LIST_MODEL(attachments), index, 1, 0);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
251 g_object_notify_by_pspec(obj, properties[PROP_N_ITEMS]);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
252 g_object_thaw_notify(obj);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
253
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
254 return TRUE;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
255 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
256
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
257 void
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
258 purple_attachments_remove_all(PurpleAttachments *attachments) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
259 guint removed = 0;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
260
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
261 g_return_if_fail(PURPLE_IS_ATTACHMENTS(attachments));
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
262
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
263 removed = attachments->attachments->len;
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
264 g_ptr_array_remove_range(attachments->attachments, 0, removed);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
265
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
266 if(removed > 0) {
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
267 GObject *obj = G_OBJECT(attachments);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
268 g_object_freeze_notify(obj);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
269 g_list_model_items_changed(G_LIST_MODEL(attachments), 0, removed, 0);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
270 g_object_notify_by_pspec(obj, properties[PROP_N_ITEMS]);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
271 g_object_thaw_notify(obj);
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
272 }
dff7cdade009 Implement Purple.Attachments
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
273 }

mercurial