13870
|
1 /**
|
|
2 * The QQ2003C protocol plugin
|
|
3 *
|
|
4 * for gaim
|
|
5 *
|
|
6 * Copyright (C) 2004 Puzzlebird
|
|
7 *
|
|
8 * This program is free software; you can redistribute it and/or modify
|
|
9 * it under the terms of the GNU General Public License as published by
|
|
10 * the Free Software Foundation; either version 2 of the License, or
|
|
11 * (at your option) any later version.
|
|
12 *
|
|
13 * This program is distributed in the hope that it will be useful,
|
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16 * GNU General Public License for more details.
|
|
17 *
|
|
18 * You should have received a copy of the GNU General Public License
|
|
19 * along with this program; if not, write to the Free Software
|
|
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
21 *
|
|
22 * This code is based on qq_show.c, kindly contributed by herryouly@linuxsir
|
|
23 */
|
|
24
|
|
25 // START OF FILE
|
|
26 /*****************************************************************************/
|
|
27 #include <sys/types.h> // mkdir
|
|
28 #include <sys/stat.h>
|
|
29
|
|
30 #include "internal.h" // _("get_text")
|
|
31 #include "debug.h" // gaim_debug
|
|
32 #include "notify.h" // gaim_notify_error
|
|
33 #include "util.h" // gaim_url_fetch
|
|
34
|
|
35 #include "show.h"
|
|
36
|
|
37 #define QQ_SHOW_SERVER "http://qqshow-user.tencent.com"
|
|
38 #define QQ_SHOW_IMAGE "10/00/00.gif"
|
|
39
|
|
40 #define QQ_SHOW_CACHE_DIR "qqshow"
|
|
41 #define QQ_SHOW_DEFAULT_IMAGE "qqshow_default.gif"
|
|
42
|
|
43 #define QQ_SHOW_DEST_X 0
|
|
44 #define QQ_SHOW_DEST_Y 0
|
|
45 #define QQ_SHOW_DEST_WIDTH 120
|
|
46 #define QQ_SHOW_DEST_HEIGHT 180
|
|
47 #define QQ_SHOW_OFFSET_X -10
|
|
48 #define QQ_SHOW_OFFSET_Y -35
|
|
49 #define QQ_SHOW_SCALE_X 0.68
|
|
50 #define QQ_SHOW_SCALE_Y 0.68
|
|
51
|
|
52 enum {
|
|
53 QQ_SHOW_READ,
|
|
54 QQ_SHOW_WRITE,
|
|
55 };
|
|
56
|
|
57 /*****************************************************************************/
|
|
58 // return the local cached QQ show file name for uid
|
|
59 static gchar *_qq_show_get_cache_name(guint32 uid, gint io)
|
|
60 {
|
|
61 gchar *path, *file, *file_fullname;
|
|
62
|
|
63 g_return_val_if_fail(uid > 0, NULL);
|
|
64
|
|
65 path = g_build_filename(gaim_user_dir(), QQ_SHOW_CACHE_DIR, NULL);
|
|
66 if (!g_file_test(path, G_FILE_TEST_EXISTS))
|
|
67 g_mkdir(path, 0700);
|
|
68
|
|
69 file = g_strdup_printf("%d.gif", uid);
|
|
70 file_fullname = g_build_filename(path, file, NULL);
|
|
71
|
|
72 if (io == QQ_SHOW_READ) {
|
|
73 if (!g_file_test(file_fullname, G_FILE_TEST_EXISTS)) {
|
|
74 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "No cached QQ show image for buddy %d\n", uid);
|
|
75 g_free(file_fullname);
|
|
76 file_fullname =
|
|
77 g_build_filename(gaim_prefs_get_string
|
|
78 ("/plugins/prpl/qq/datadir"),
|
|
79 "pixmaps", "gaim", "status", "default", QQ_SHOW_DEFAULT_IMAGE, NULL);
|
|
80 } // if g_file_test
|
|
81 } // if io
|
|
82
|
|
83 g_free(path);
|
|
84 g_free(file);
|
|
85 return file_fullname;
|
|
86
|
|
87 } // _qq_show_get_cache_name
|
|
88
|
|
89 /*****************************************************************************/
|
|
90 // scale the image to suit my window
|
|
91 static GdkPixbuf *_qq_show_scale_image(GdkPixbuf * pixbuf_src)
|
|
92 {
|
|
93 GdkPixbuf *pixbuf_dst;
|
|
94
|
|
95 pixbuf_dst = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8,
|
|
96 QQ_SHOW_DEST_WIDTH * QQ_SHOW_SCALE_X, QQ_SHOW_DEST_HEIGHT * QQ_SHOW_SCALE_Y);
|
|
97
|
|
98 gdk_pixbuf_scale(pixbuf_src, pixbuf_dst,
|
|
99 QQ_SHOW_DEST_X * QQ_SHOW_SCALE_X,
|
|
100 QQ_SHOW_DEST_Y * QQ_SHOW_SCALE_Y,
|
|
101 QQ_SHOW_DEST_WIDTH * QQ_SHOW_SCALE_X,
|
|
102 QQ_SHOW_DEST_HEIGHT * QQ_SHOW_SCALE_Y,
|
|
103 QQ_SHOW_OFFSET_X * QQ_SHOW_SCALE_X,
|
|
104 QQ_SHOW_OFFSET_Y * QQ_SHOW_SCALE_Y, QQ_SHOW_SCALE_X, QQ_SHOW_SCALE_Y, GDK_INTERP_BILINEAR);
|
|
105
|
|
106 g_object_unref(G_OBJECT(pixbuf_src));
|
|
107 return pixbuf_dst;
|
|
108 } // qq_show_scale_image
|
|
109
|
|
110 /*****************************************************************************/
|
|
111 // keep a local copy of QQ show image to speed up loading
|
|
112 static void _qq_show_cache_image(const gchar * url_ret, size_t len, guint32 uid)
|
|
113 {
|
|
114
|
|
115 GError *err;
|
|
116 GIOChannel *cache;
|
|
117 gchar *file;
|
|
118
|
|
119 g_return_if_fail(uid > 0);
|
|
120
|
|
121 err = NULL;
|
|
122 file = _qq_show_get_cache_name(uid, QQ_SHOW_WRITE);
|
|
123 cache = g_io_channel_new_file(file, "w", &err);
|
|
124
|
|
125 if (err != NULL) { // file error
|
|
126 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Error with QQ show file: %s\n", err->message);
|
|
127 g_error_free(err);
|
|
128 return;
|
|
129 } else { // OK, go ahead
|
|
130 g_io_channel_set_encoding(cache, NULL, NULL); // binary mode
|
|
131 g_io_channel_write_chars(cache, url_ret, len, NULL, &err);
|
|
132 if (err != NULL) {
|
|
133 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Fail cache QQ show for %d: %s\n", uid, err->message);
|
|
134 g_error_free(err);
|
|
135 } else
|
|
136 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Cache QQ show for %d, done\n", uid);
|
|
137 g_io_channel_shutdown(cache, TRUE, NULL);
|
|
138 } // if err
|
|
139
|
|
140 } // _qq_show_cache_image
|
|
141
|
|
142 /*****************************************************************************/
|
|
143 // display the image for downloaded data
|
|
144 static void qq_show_render_image(void *data, const gchar * url_ret, size_t len)
|
|
145 {
|
|
146 guint32 uid;
|
|
147 GdkPixbufLoader *pixbuf_loader;
|
|
148 GdkPixbuf *pixbuf_src, *pixbuf_dst;
|
|
149 GtkWidget *qq_show;
|
|
150
|
|
151 g_return_if_fail(data != NULL && url_ret != NULL && len > 0);
|
|
152
|
|
153 qq_show = (GtkWidget *) data;
|
|
154
|
|
155 pixbuf_loader = gdk_pixbuf_loader_new();
|
|
156 gdk_pixbuf_loader_write(pixbuf_loader, url_ret, len, NULL);
|
|
157 gdk_pixbuf_loader_close(pixbuf_loader, NULL); // finish loading
|
|
158
|
|
159 pixbuf_src = gdk_pixbuf_loader_get_pixbuf(pixbuf_loader);
|
|
160
|
|
161 if (pixbuf_src != NULL) {
|
|
162 uid = (guint32) g_object_get_data(G_OBJECT(qq_show), "user_data");
|
|
163 _qq_show_cache_image(url_ret, len, uid);
|
|
164 pixbuf_dst = _qq_show_scale_image(pixbuf_src);
|
|
165 gtk_image_set_from_pixbuf(GTK_IMAGE(qq_show), pixbuf_dst);
|
|
166 } else {
|
|
167 gaim_notify_error(NULL, NULL, _("Fail getting QQ show image"), NULL);
|
|
168 } // if pixbuf_src
|
|
169
|
|
170 } // qq_show_render_image
|
|
171
|
|
172 /*****************************************************************************/
|
|
173 // show the default image (either local cache or default image)
|
|
174 GtkWidget *qq_show_default(contact_info * info)
|
|
175 {
|
|
176 guint32 uid;
|
|
177 GdkPixbuf *pixbuf_src;
|
|
178 GError *err;
|
|
179 gchar *file;
|
|
180
|
|
181 g_return_val_if_fail(info != NULL, NULL);
|
|
182
|
|
183 uid = strtol(info->uid, NULL, 10);
|
|
184 g_return_val_if_fail(uid != 0, NULL);
|
|
185
|
|
186 file = _qq_show_get_cache_name(uid, QQ_SHOW_READ);
|
|
187 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Load QQ show image: %s\n", file);
|
|
188
|
|
189 err = NULL;
|
|
190 pixbuf_src = gdk_pixbuf_new_from_file(file, &err);
|
|
191
|
|
192 if (err != NULL) {
|
|
193 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Fail loaing QQ show: %s\n", err->message);
|
|
194 g_free(file);
|
|
195 return NULL;
|
|
196 } // if err
|
|
197
|
|
198 g_free(file);
|
|
199 return gtk_image_new_from_pixbuf(_qq_show_scale_image(pixbuf_src));
|
|
200 } // qq_show_default
|
|
201
|
|
202 /*****************************************************************************/
|
|
203 // refresh the image
|
|
204 void qq_show_get_image(GtkWidget * event_box, GdkEventButton * event, gpointer data)
|
|
205 {
|
|
206 gchar *url;
|
|
207 gint uid;
|
|
208 GtkWidget *qq_show;
|
|
209
|
|
210 qq_show = (GtkWidget *) data;
|
|
211 g_return_if_fail(qq_show != NULL);
|
|
212
|
|
213 uid = (gint) g_object_get_data(G_OBJECT(qq_show), "user_data");
|
|
214 g_return_if_fail(uid != 0);
|
|
215
|
|
216 url = g_strdup_printf("%s/%d/%s", QQ_SHOW_SERVER, uid, QQ_SHOW_IMAGE);
|
|
217 gaim_url_fetch(url, FALSE, NULL, TRUE, qq_show_render_image, qq_show);
|
|
218
|
|
219 g_free(url);
|
|
220 } // qq_show_get_image
|
|
221
|
|
222 /*****************************************************************************/
|