libpurple/purplebadges.c

Sat, 09 Aug 2025 17:37:27 +0800

author
Gong Zhile <gongzl@stu.hebust.edu.cn>
date
Sat, 09 Aug 2025 17:37:27 +0800
branch
bird-header-fix
changeset 43304
2599d35e9750
parent 43202
1c2e548285f3
permissions
-rw-r--r--

Fix the birb header path

The birb header referred would only work with birb provided by wrap casuing
build to fail because of system-installed birb dependency. The commit points
it to the correct path <birb.h>.

See: https://keep.imfreedom.org/birb/birb/file/5bf00c7d7f80/birb/meson.build#l77

42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Purple - Internet Messaging Library
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 * This library is free software; you can redistribute it and/or modify it
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * under the terms of the GNU General Public License as published by the Free
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * Software Foundation; either version 2 of the License, or (at your option)
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * any later version.
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 * This library is distributed in the hope that it will be useful, but WITHOUT
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * more details.
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License along with
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
20 * this library; if not, see <https://www.gnu.org/licenses/>.
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #include <gio/gio.h>
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25 #include "purplebadges.h"
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27 #include "util.h"
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 struct _PurpleBadges {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30 GObject parent;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32 GPtrArray *badges;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
33 };
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
34
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35 enum {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
36 PROP_0,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
37 PROP_ITEM_TYPE,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
38 PROP_N_ITEMS,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
39 N_PROPERTIES,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 };
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41 static GParamSpec *properties[N_PROPERTIES] = {NULL, };
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 /******************************************************************************
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 * GListModel Implementation
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
45 *****************************************************************************/
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
46 static GType
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 purple_badges_get_item_type(G_GNUC_UNUSED GListModel *model) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48 return PURPLE_TYPE_BADGE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 static guint
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52 purple_badges_get_n_items(GListModel *model) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53 PurpleBadges *badges = PURPLE_BADGES(model);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55 return badges->badges->len;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58 static gpointer
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
59 purple_badges_get_item(GListModel *model, guint position) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60 PurpleBadges *badges = PURPLE_BADGES(model);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61 PurpleBadge *badge = NULL;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
62
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
63 if(position < badges->badges->len) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64 badge = g_ptr_array_index(badges->badges, position);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 if(PURPLE_IS_BADGE(badge)) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 g_object_ref(badge);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71 return badge;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 static void
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75 purple_badges_list_model_init(GListModelInterface *iface) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76 iface->get_item_type = purple_badges_get_item_type;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77 iface->get_n_items = purple_badges_get_n_items;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
78 iface->get_item = purple_badges_get_item;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
79 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
80
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
81 /******************************************************************************
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
82 * GObject Implementation
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
83 *****************************************************************************/
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
84 G_DEFINE_FINAL_TYPE_WITH_CODE(PurpleBadges, purple_badges, G_TYPE_OBJECT,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
85 G_IMPLEMENT_INTERFACE(G_TYPE_LIST_MODEL,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
86 purple_badges_list_model_init))
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
87
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
88 static void
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
89 purple_badges_finalize(GObject *obj) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
90 PurpleBadges *badges = PURPLE_BADGES(obj);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
91
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
92 g_clear_pointer(&badges->badges, g_ptr_array_unref);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
93
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
94 G_OBJECT_CLASS(purple_badges_parent_class)->finalize(obj);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
95 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
96
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
97 static void
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
98 purple_badges_get_property(GObject *obj, guint param_id, GValue *value,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
99 GParamSpec *pspec)
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
100 {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
101 GListModel *model = G_LIST_MODEL(obj);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
102
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
103 switch(param_id) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
104 case PROP_ITEM_TYPE:
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
105 g_value_set_gtype(value, g_list_model_get_item_type(model));
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
106 break;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
107 case PROP_N_ITEMS:
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
108 g_value_set_uint(value, g_list_model_get_n_items(model));
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
109 break;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
110 default:
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
111 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
112 break;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
113 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
114 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
115
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
116 static void
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
117 purple_badges_init(PurpleBadges *badges) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
118 badges->badges = g_ptr_array_new_full(0, g_object_unref);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
119 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
120
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
121 static void
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
122 purple_badges_class_init(PurpleBadgesClass *klass) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
123 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
124
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
125 obj_class->finalize = purple_badges_finalize;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
126 obj_class->get_property = purple_badges_get_property;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
127
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
128 /**
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
129 * PurpleBadges:item-type:
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
130 *
42984
818220289e67 Update the gi-docgen subproject and fix some new issues it found
Gary Kramlich <grim@reaperworld.com>
parents: 42918
diff changeset
131 * The type of items. See [vfunc@Gio.ListModel.get_item_type].
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
132 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
133 * Since: 3.0
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
134 */
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
135 properties[PROP_ITEM_TYPE] = g_param_spec_gtype(
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
136 "item-type", NULL, NULL,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
137 PURPLE_TYPE_BADGE,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
138 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
139
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
140 /**
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
141 * PurpleBadges:n-items:
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
142 *
42984
818220289e67 Update the gi-docgen subproject and fix some new issues it found
Gary Kramlich <grim@reaperworld.com>
parents: 42918
diff changeset
143 * The number of items. See [vfunc@Gio.ListModel.get_n_items].
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
144 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
145 * Since: 3.0
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
146 */
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
147 properties[PROP_N_ITEMS] = g_param_spec_uint(
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
148 "n-items", NULL, NULL,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
149 0, G_MAXUINT, 0,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
150 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
151
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
152 g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
153 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
154
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
155 /******************************************************************************
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
156 * Public API
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
157 *****************************************************************************/
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
158 gboolean
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
159 purple_badges_add_badge(PurpleBadges *badges, PurpleBadge *badge) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
160 gboolean found = FALSE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
161 guint len = 0;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
162
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
163 g_return_val_if_fail(PURPLE_IS_BADGES(badges), FALSE);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
164 g_return_val_if_fail(PURPLE_IS_BADGE(badge), FALSE);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
165
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166 found = g_ptr_array_find_with_equal_func(badges->badges, badge,
43202
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43180
diff changeset
167 (GEqualFunc)purple_badge_equal,
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43180
diff changeset
168 NULL);
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
169
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
170 if(found) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
171 return FALSE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
172 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174 /* Store length before adding to make the math easier to understand. */
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
175 len = badges->badges->len;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177 g_ptr_array_add(badges->badges, g_object_ref(badge));
43202
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43180
diff changeset
178 g_ptr_array_sort_values(badges->badges, (GCompareFunc)purple_badge_compare);
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180 g_list_model_items_changed(G_LIST_MODEL(badges), 0, len, len + 1);
43128
1ce3ad90614c Make sure we notify on the n-items property for all objects that have it
Gary Kramlich <grim@reaperworld.com>
parents: 42984
diff changeset
181 g_object_notify_by_pspec(G_OBJECT(badges), properties[PROP_N_ITEMS]);
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
183 return TRUE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
184 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
185
43180
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
186 int
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
187 purple_badges_compare(PurpleBadges *badges1, PurpleBadges *badges2) {
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
188 guint n_badges1 = 0;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
189 guint n_badges2 = 0;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
190 guint n_badges = 0;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
191
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
192 /* NULL checks. */
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
193 if(badges1 == badges2) {
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
194 return 0;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
195 }
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
196
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
197 if(PURPLE_IS_BADGES(badges1) && !PURPLE_IS_BADGES(badges2)) {
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
198 return -1;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
199 }
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
200
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
201 if(PURPLE_IS_BADGES(badges2) && !PURPLE_IS_BADGES(badges1)) {
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
202 return 1;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
203 }
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
204
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
205 n_badges1 = badges1->badges->len;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
206 n_badges2 = badges2->badges->len;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
207
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
208 /* Empty checks. */
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
209 if(n_badges1 > 0 && n_badges2 == 0) {
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
210 return -1;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
211 }
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
212
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
213 if(n_badges1 == 0 && n_badges2 > 0) {
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
214 return 1;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
215 }
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
216
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
217 /* We now have to walk through and compare badges. */
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
218 n_badges = MIN(n_badges1, n_badges2);
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
219 for(guint i = 0; i < n_badges; i++) {
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
220 PurpleBadge *badge1 = g_ptr_array_index(badges1->badges, i);
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
221 PurpleBadge *badge2 = g_ptr_array_index(badges2->badges, i);
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
222 guint result = 0;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
223
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
224 result = purple_badge_compare(badge1, badge2);
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
225 if(result != 0) {
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
226 return result;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
227 }
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
228 }
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
229
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
230 /* All badges were equal so fall back to which one has the most badges. */
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
231 return n_badges2 - n_badges1;
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
232 }
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
233
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
234 PurpleBadges *
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
235 purple_badges_new(void) {
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
236 return g_object_new(PURPLE_TYPE_BADGES, NULL);
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
237 }
cafab5224c86 Implement Purple.Badges.compare
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
238
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
239 gboolean
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
240 purple_badges_remove_badge(PurpleBadges *badges, const char *id) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
241 PurpleBadge *needle = NULL;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
242 gboolean found = FALSE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
243 guint index = 0;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
244
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
245 g_return_val_if_fail(PURPLE_IS_BADGES(badges), FALSE);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
246 g_return_val_if_fail(!purple_strempty(id), FALSE);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
247
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
248 /* We only need the id, but the other values can't be null. */
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
249 needle = purple_badge_new(id, 0, "folder-saved-search-symbolic", "🔍");
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
250
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
251 found = g_ptr_array_find_with_equal_func(badges->badges, needle,
43202
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43180
diff changeset
252 (GEqualFunc)purple_badge_equal,
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43180
diff changeset
253 &index);
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
254 g_clear_object(&needle);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
255
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
256 if(!found) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
257 return FALSE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
258 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
259
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
260 g_ptr_array_remove_index(badges->badges, index);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
261
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
262 g_list_model_items_changed(G_LIST_MODEL(badges), index, 1, 0);
43128
1ce3ad90614c Make sure we notify on the n-items property for all objects that have it
Gary Kramlich <grim@reaperworld.com>
parents: 42984
diff changeset
263 g_object_notify_by_pspec(G_OBJECT(badges), properties[PROP_N_ITEMS]);
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
264
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
265 return TRUE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
266 }

mercurial