libpurple/smiley-remote.c

Fri, 04 Apr 2014 21:09:16 +0200

author
Tomasz Wasilczyk <twasilczyk@pidgin.im>
date
Fri, 04 Apr 2014 21:09:16 +0200
changeset 35755
d91c44b4a8e6
parent 35753
222e69060b4a
child 35775
128a065f1a27
permissions
-rw-r--r--

Remote smileys: correctly handle failed smileys

35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1 /* purple
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2 *
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3 * Purple is the legal property of its developers, whose names are too numerous
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
4 * to list here. Please refer to the COPYRIGHT file distributed with this
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
5 * source distribution.
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
6 *
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
7 * This program is free software; you can redistribute it and/or modify
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
10 * (at your option) any later version.
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
11 *
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful,
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
15 * GNU General Public License for more details.
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
16 *
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
20 */
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
21
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
22 #include "internal.h"
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
23 #include "glibcompat.h"
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
24
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
25 #include "debug.h"
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
26 #include "smiley.h"
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
27 #include "smiley-remote.h"
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
28
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
29 #define PURPLE_REMOTE_SMILEY_GET_PRIVATE(obj) \
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
30 (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_REMOTE_SMILEY, PurpleRemoteSmileyPrivate))
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
31
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
32 typedef struct {
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
33 GString *contents;
35749
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
34 PurpleStoredImage *image; /* it's not the same as in parent */
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
35
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
36 gboolean failed;
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
37 } PurpleRemoteSmileyPrivate;
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
38
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
39 enum
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
40 {
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
41 PROP_0,
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
42 PROP_FAILED,
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
43 PROP_LAST
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
44 };
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
45
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
46 enum
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
47 {
35753
222e69060b4a Remote smileys: display them even on the first time
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35749
diff changeset
48 SIG_FAILED,
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
49 SIG_LAST
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
50 };
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
51
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
52 static GObjectClass *parent_class;
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
53
35753
222e69060b4a Remote smileys: display them even on the first time
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35749
diff changeset
54 static guint signals[SIG_LAST];
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
55 static GParamSpec *properties[PROP_LAST];
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
56
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
57 /******************************************************************************
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
58 * API implementation
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
59 ******************************************************************************/
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
60
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
61 void
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
62 purple_remote_smiley_write(PurpleRemoteSmiley *smiley, const guchar *data,
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
63 gsize size)
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
64 {
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
65 PurpleRemoteSmileyPrivate *priv =
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
66 PURPLE_REMOTE_SMILEY_GET_PRIVATE(smiley);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
67
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
68 g_return_if_fail(priv != NULL);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
69 g_return_if_fail(!priv->failed);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
70 g_return_if_fail(!purple_smiley_is_ready(PURPLE_SMILEY(smiley)));
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
71 g_return_if_fail(data != NULL || size == 0);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
72
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
73 if (size == 0)
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
74 return;
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
75
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
76 g_string_append_len(priv->contents, (const gchar*)data, size);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
77 }
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
78
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
79 void
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
80 purple_remote_smiley_close(PurpleRemoteSmiley *smiley)
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
81 {
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
82 PurpleRemoteSmileyPrivate *priv =
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
83 PURPLE_REMOTE_SMILEY_GET_PRIVATE(smiley);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
84
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
85 g_return_if_fail(priv != NULL);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
86 g_return_if_fail(!priv->failed);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
87 g_return_if_fail(!purple_smiley_is_ready(PURPLE_SMILEY(smiley)));
35749
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
88 g_return_if_fail(priv->contents != NULL);
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
89 g_return_if_fail(priv->image == NULL);
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
90
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
91 if (priv->contents->len == 0) {
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
92 purple_debug_error("smiley-remote", "Smiley is empty");
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
93 purple_remote_smiley_failed(smiley);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
94 return;
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
95 }
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
96
35749
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
97 priv->image = purple_imgstore_new(priv->contents->str,
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
98 priv->contents->len, NULL);
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
99 g_return_if_fail(priv->image != NULL);
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
100 g_string_free(priv->contents, FALSE);
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
101 priv->contents = NULL;
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
102
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
103 g_object_set(smiley, "is-ready", TRUE, NULL);
35753
222e69060b4a Remote smileys: display them even on the first time
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35749
diff changeset
104 g_signal_emit_by_name(smiley, "ready");
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
105 }
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
106
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
107 void
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
108 purple_remote_smiley_failed(PurpleRemoteSmiley *smiley)
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
109 {
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
110 PurpleRemoteSmileyPrivate *priv =
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
111 PURPLE_REMOTE_SMILEY_GET_PRIVATE(smiley);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
112
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
113 g_return_if_fail(priv != NULL);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
114 g_return_if_fail(!purple_smiley_is_ready(PURPLE_SMILEY(smiley)));
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
115
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
116 if (priv->failed)
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
117 return;
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
118
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
119 priv->failed = TRUE;
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
120 g_object_notify_by_pspec(G_OBJECT(smiley), properties[PROP_FAILED]);
35753
222e69060b4a Remote smileys: display them even on the first time
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35749
diff changeset
121 g_signal_emit(smiley, signals[SIG_FAILED], 0);
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
122 }
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
123
35749
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
124 static PurpleStoredImage *
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
125 purple_remote_smiley_get_image_impl(PurpleSmiley *smiley)
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
126 {
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
127 PurpleRemoteSmileyPrivate *priv =
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
128 PURPLE_REMOTE_SMILEY_GET_PRIVATE(smiley);
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
129
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
130 g_return_val_if_fail(priv != NULL, FALSE);
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
131
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
132 if (purple_smiley_get_path(smiley))
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
133 return PURPLE_SMILEY_CLASS(parent_class)->get_image(smiley);
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
134
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
135 if (!priv->image) {
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
136 purple_debug_error("smiley-remote",
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
137 "Remote smiley is not ready yet");
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
138 return NULL;
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
139 }
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
140
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
141 return priv->image;
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
142 }
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
143
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
144 /******************************************************************************
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
145 * Object stuff
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
146 ******************************************************************************/
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
147
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
148 static void
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
149 purple_remote_smiley_init(GTypeInstance *instance, gpointer klass)
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
150 {
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
151 PurpleRemoteSmiley *smiley = PURPLE_REMOTE_SMILEY(instance);
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
152 PurpleRemoteSmileyPrivate *priv =
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
153 PURPLE_REMOTE_SMILEY_GET_PRIVATE(smiley);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
154
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
155 priv->contents = g_string_new(NULL);
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
156 priv->failed = FALSE;
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
157 }
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
158
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
159 static void
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
160 purple_remote_smiley_finalize(GObject *obj)
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
161 {
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
162 PurpleRemoteSmiley *smiley = PURPLE_REMOTE_SMILEY(obj);
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
163 PurpleRemoteSmileyPrivate *priv =
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
164 PURPLE_REMOTE_SMILEY_GET_PRIVATE(smiley);
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
165
35749
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
166 if (priv->contents)
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
167 g_string_free(priv->contents, TRUE);
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
168 if (priv->image)
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
169 purple_imgstore_unref(priv->image);
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
170
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
171 G_OBJECT_CLASS(parent_class)->finalize(obj);
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
172 }
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
173
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
174 static void
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
175 purple_remote_smiley_get_property(GObject *object, guint par_id, GValue *value,
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
176 GParamSpec *pspec)
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
177 {
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
178 PurpleRemoteSmiley *remote_smiley = PURPLE_REMOTE_SMILEY(object);
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
179 PurpleRemoteSmileyPrivate *priv = PURPLE_REMOTE_SMILEY_GET_PRIVATE(remote_smiley);
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
180
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
181 switch (par_id) {
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
182 case PROP_FAILED:
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
183 g_value_set_boolean(value, priv->failed);
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
184 break;
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
185 default:
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
186 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, par_id, pspec);
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
187 break;
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
188 }
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
189 }
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
190
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
191 static void
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
192 purple_remote_smiley_class_init(PurpleRemoteSmileyClass *klass)
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
193 {
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
194 GObjectClass *gobj_class = G_OBJECT_CLASS(klass);
35749
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
195 PurpleSmileyClass *ps_class = PURPLE_SMILEY_CLASS(klass);
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
196
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
197 parent_class = g_type_class_peek_parent(klass);
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
198
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
199 g_type_class_add_private(klass, sizeof(PurpleRemoteSmileyPrivate));
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
200
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
201 gobj_class->finalize = purple_remote_smiley_finalize;
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
202
35749
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
203 ps_class->get_image = purple_remote_smiley_get_image_impl;
d71c41a54bb3 Smileys: implement get_image interface
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35746
diff changeset
204
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
205 gobj_class->get_property = purple_remote_smiley_get_property;
35755
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
206
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
207 properties[PROP_FAILED] = g_param_spec_boolean("failed", "Failed",
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
208 "The remote host has failed to send the smiley", FALSE,
d91c44b4a8e6 Remote smileys: correctly handle failed smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35753
diff changeset
209 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
210
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
211 g_object_class_install_properties(gobj_class, PROP_LAST, properties);
35753
222e69060b4a Remote smileys: display them even on the first time
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35749
diff changeset
212
222e69060b4a Remote smileys: display them even on the first time
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35749
diff changeset
213 signals[SIG_FAILED] = g_signal_new("failed", G_OBJECT_CLASS_TYPE(klass),
222e69060b4a Remote smileys: display them even on the first time
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35749
diff changeset
214 0, 0, NULL, NULL,
222e69060b4a Remote smileys: display them even on the first time
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35749
diff changeset
215 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
216 }
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
217
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
218 GType
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
219 purple_remote_smiley_get_type(void)
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
220 {
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
221 static GType type = 0;
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
222
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
223 if (G_UNLIKELY(type == 0)) {
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
224 static const GTypeInfo info = {
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
225 .class_size = sizeof(PurpleRemoteSmileyClass),
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
226 .class_init = (GClassInitFunc)purple_remote_smiley_class_init,
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
227 .instance_size = sizeof(PurpleRemoteSmiley),
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
228 .instance_init = purple_remote_smiley_init,
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
229 };
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
230
35746
e4a656378516 Remote smileys: partial implementation with XMPP
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35744
diff changeset
231 type = g_type_register_static(PURPLE_TYPE_SMILEY,
35744
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
232 "PurpleRemoteSmiley", &info, 0);
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
233 }
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
234
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
235 return type;
34964f8d43fe Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
236 }

mercurial