首页 | 数据结构 | 文件列表 | 数据字段 | 全局定义

show.c

浏览该文件的文档。
00001 
00025 // START OF FILE
00026 /*****************************************************************************/
00027 #include <sys/types.h>          // mkdir
00028 #include <sys/stat.h>
00029 
00030 #include "internal.h"           // _("get_text")
00031 #include "debug.h"              // gaim_debug
00032 #include "notify.h"             // gaim_notify_error
00033 #include "util.h"               // gaim_url_fetch
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 // return the local cached QQ show file name for uid
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                 }               // if g_file_test
00081         }                       // if io
00082 
00083         g_free(path);
00084         g_free(file);
00085         return file_fullname;
00086 
00087 }                               // _qq_show_get_cache_name
00088 
00089 /*****************************************************************************/
00090 // scale the image to suit my window
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 }                               // qq_show_scale_image
00109 
00110 /*****************************************************************************/
00111 // keep a local copy of QQ show image to speed up loading
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) {      // file error
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 {                // OK, go ahead
00130                 g_io_channel_set_encoding(cache, NULL, NULL);   // binary mode
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         }                       // if err
00139 
00140 }                               // _qq_show_cache_image
00141 
00142 /*****************************************************************************/
00143 // display the image for downloaded data
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);   // finish loading
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         }                       // if pixbuf_src
00169 
00170 }                               // qq_show_render_image
00171 
00172 /*****************************************************************************/
00173 // show the default image (either local cache or default image)
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         }                       // if err
00197 
00198         g_free(file);
00199         return gtk_image_new_from_pixbuf(_qq_show_scale_image(pixbuf_src));
00200 }                               // qq_show_default
00201 
00202 /*****************************************************************************/
00203 // refresh the image
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 }                               // qq_show_get_image
00221 
00222 /*****************************************************************************/

Generated at Mon May 8 15:41:24 2006 for OpenQ by  doxygen 1.4.4