00001
00025
00026
00027 #include <sys/types.h>
00028 #include <sys/stat.h>
00029
00030 #include "internal.h"
00031 #include "debug.h"
00032 #include "notify.h"
00033 #include "util.h"
00034
00035 #include "show.h"
00036
00037 #define QQ_SHOW_SERVER "http://qqshow-user.tencent.com"
00038 #define QQ_SHOW_IMAGE "10/00/00.gif"
00039
00040 #define QQ_SHOW_CACHE_DIR "qqshow"
00041 #define QQ_SHOW_DEFAULT_IMAGE "qqshow_default.gif"
00042
00043 #define QQ_SHOW_DEST_X 0
00044 #define QQ_SHOW_DEST_Y 0
00045 #define QQ_SHOW_DEST_WIDTH 120
00046 #define QQ_SHOW_DEST_HEIGHT 180
00047 #define QQ_SHOW_OFFSET_X -10
00048 #define QQ_SHOW_OFFSET_Y -35
00049 #define QQ_SHOW_SCALE_X 0.68
00050 #define QQ_SHOW_SCALE_Y 0.68
00051
00052 enum {
00053 QQ_SHOW_READ,
00054 QQ_SHOW_WRITE,
00055 };
00056
00057
00058
00059 gchar *_qq_show_get_cache_name(guint32 uid, gint io)
00060 {
00061 gchar *path, *file, *file_fullname;
00062
00063 g_return_val_if_fail(uid > 0, NULL);
00064
00065 path = g_build_filename(gaim_user_dir(), QQ_SHOW_CACHE_DIR, NULL);
00066 if (!g_file_test(path, G_FILE_TEST_EXISTS))
00067 g_mkdir(path, 0700);
00068
00069 file = g_strdup_printf("%d.gif", uid);
00070 file_fullname = g_build_filename(path, file, NULL);
00071
00072 if (io == QQ_SHOW_READ) {
00073 if (!g_file_test(file_fullname, G_FILE_TEST_EXISTS)) {
00074 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "No cached QQ show image for buddy %d\n", uid);
00075 g_free(file_fullname);
00076 file_fullname =
00077 g_build_filename(gaim_prefs_get_string
00078 ("/plugins/prpl/qq/datadir"),
00079 "pixmaps", "gaim", "status", "default", QQ_SHOW_DEFAULT_IMAGE, NULL);
00080 }
00081 }
00082
00083 g_free(path);
00084 g_free(file);
00085 return file_fullname;
00086
00087 }
00088
00089
00090
00091 GdkPixbuf *_qq_show_scale_image(GdkPixbuf * pixbuf_src)
00092 {
00093 GdkPixbuf *pixbuf_dst;
00094
00095 pixbuf_dst = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8,
00096 QQ_SHOW_DEST_WIDTH * QQ_SHOW_SCALE_X, QQ_SHOW_DEST_HEIGHT * QQ_SHOW_SCALE_Y);
00097
00098 gdk_pixbuf_scale(pixbuf_src, pixbuf_dst,
00099 QQ_SHOW_DEST_X * QQ_SHOW_SCALE_X,
00100 QQ_SHOW_DEST_Y * QQ_SHOW_SCALE_Y,
00101 QQ_SHOW_DEST_WIDTH * QQ_SHOW_SCALE_X,
00102 QQ_SHOW_DEST_HEIGHT * QQ_SHOW_SCALE_Y,
00103 QQ_SHOW_OFFSET_X * QQ_SHOW_SCALE_X,
00104 QQ_SHOW_OFFSET_Y * QQ_SHOW_SCALE_Y, QQ_SHOW_SCALE_X, QQ_SHOW_SCALE_Y, GDK_INTERP_BILINEAR);
00105
00106 g_object_unref(G_OBJECT(pixbuf_src));
00107 return pixbuf_dst;
00108 }
00109
00110
00111
00112 void _qq_show_cache_image(const gchar * url_ret, size_t len, guint32 uid)
00113 {
00114
00115 GError *err;
00116 GIOChannel *cache;
00117 gchar *file;
00118
00119 g_return_if_fail(uid > 0);
00120
00121 err = NULL;
00122 file = _qq_show_get_cache_name(uid, QQ_SHOW_WRITE);
00123 cache = g_io_channel_new_file(file, "w", &err);
00124
00125 if (err != NULL) {
00126 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Error with QQ show file: %s\n", err->message);
00127 g_error_free(err);
00128 return;
00129 } else {
00130 g_io_channel_set_encoding(cache, NULL, NULL);
00131 g_io_channel_write_chars(cache, url_ret, len, NULL, &err);
00132 if (err != NULL) {
00133 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Fail cache QQ show for %d: %s\n", uid, err->message);
00134 g_error_free(err);
00135 } else
00136 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Cache QQ show for %d, done\n", uid);
00137 g_io_channel_shutdown(cache, TRUE, NULL);
00138 }
00139
00140 }
00141
00142
00143
00144 void qq_show_render_image(void *data, const gchar * url_ret, size_t len)
00145 {
00146 guint32 uid;
00147 GdkPixbufLoader *pixbuf_loader;
00148 GdkPixbuf *pixbuf_src, *pixbuf_dst;
00149 GtkWidget *qq_show;
00150
00151 g_return_if_fail(data != NULL && url_ret != NULL && len > 0);
00152
00153 qq_show = (GtkWidget *) data;
00154
00155 pixbuf_loader = gdk_pixbuf_loader_new();
00156 gdk_pixbuf_loader_write(pixbuf_loader, url_ret, len, NULL);
00157 gdk_pixbuf_loader_close(pixbuf_loader, NULL);
00158
00159 pixbuf_src = gdk_pixbuf_loader_get_pixbuf(pixbuf_loader);
00160
00161 if (pixbuf_src != NULL) {
00162 uid = (guint32) g_object_get_data(G_OBJECT(qq_show), "user_data");
00163 _qq_show_cache_image(url_ret, len, uid);
00164 pixbuf_dst = _qq_show_scale_image(pixbuf_src);
00165 gtk_image_set_from_pixbuf(GTK_IMAGE(qq_show), pixbuf_dst);
00166 } else {
00167 gaim_notify_error(NULL, NULL, _("Fail getting QQ show image"), NULL);
00168 }
00169
00170 }
00171
00172
00173
00174 GtkWidget *qq_show_default(contact_info * info)
00175 {
00176 guint32 uid;
00177 GdkPixbuf *pixbuf_src;
00178 GError *err;
00179 gchar *file;
00180
00181 g_return_val_if_fail(info != NULL, NULL);
00182
00183 uid = strtol(info->uid, NULL, 10);
00184 g_return_val_if_fail(uid != 0, NULL);
00185
00186 file = _qq_show_get_cache_name(uid, QQ_SHOW_READ);
00187 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Load QQ show image: %s\n", file);
00188
00189 err = NULL;
00190 pixbuf_src = gdk_pixbuf_new_from_file(file, &err);
00191
00192 if (err != NULL) {
00193 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Fail loaing QQ show: %s\n", err->message);
00194 g_free(file);
00195 return NULL;
00196 }
00197
00198 g_free(file);
00199 return gtk_image_new_from_pixbuf(_qq_show_scale_image(pixbuf_src));
00200 }
00201
00202
00203
00204 void qq_show_get_image(GtkWidget * event_box, GdkEventButton * event, gpointer data)
00205 {
00206 gchar *url;
00207 gint uid;
00208 GtkWidget *qq_show;
00209
00210 qq_show = (GtkWidget *) data;
00211 g_return_if_fail(qq_show != NULL);
00212
00213 uid = (gint) g_object_get_data(G_OBJECT(qq_show), "user_data");
00214 g_return_if_fail(uid != 0);
00215
00216 url = g_strdup_printf("%s/%d/%s", QQ_SHOW_SERVER, uid, QQ_SHOW_IMAGE);
00217 gaim_url_fetch(url, FALSE, NULL, TRUE, qq_show_render_image, qq_show);
00218
00219 g_free(url);
00220 }
00221
00222