static char * gaim_log_get_log_dir(GaimLogType type, const char *name, GaimAccount *account) { GaimPlugin *prpl; GaimPluginProtocolInfo *prpl_info; const char *prpl_name; char *acct_name; const char *target; char *dir; prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); if (!prpl) return NULL; prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); prpl_name = prpl_info->list_icon(account, NULL); acct_name = g_strdup(gaim_escape_filename(gaim_normalize(account, gaim_account_get_username(account)))); if (type == GAIM_LOG_CHAT) { char *temp = g_strdup_printf("%s.chat", gaim_normalize(account, name)); target = gaim_escape_filename(temp); g_free(temp); } else if(type == GAIM_LOG_SYSTEM) { target = ".system"; } else { target = gaim_escape_filename(gaim_normalize(account, name)); } dir = g_build_filename(gaim_user_dir(), "logs", prpl_name, acct_name, target, NULL); g_free(acct_name); return dir; }
GdkPixbuf *lookup_cached_thumbnail(GaimAccount * account, const char *fullname) { GDir *gdir = NULL; GError *err = NULL; GdkPixbuf *pixbuf = NULL; const char *filename = NULL; char *dirname = NULL; char *path = NULL; const char *name = gaim_normalize(account, fullname); dirname = g_build_filename(gaim_user_dir(), "icons", "gaym", name, NULL); if (dirname) { gdir = g_dir_open(dirname, 0, &err); if (gdir) { filename = g_dir_read_name(gdir); // don't free filename: // owned by glib. if (filename) { path = g_build_filename(dirname, filename, NULL); if (path) pixbuf = gdk_pixbuf_new_from_file(path, &err); g_free(path); } g_dir_close(gdir); } g_free(dirname); } return pixbuf; }
void gaim_buddy_icons_init() { account_cache = g_hash_table_new_full( g_direct_hash, g_direct_equal, NULL, (GFreeFunc)g_hash_table_destroy); cache_dir = g_build_filename(gaim_user_dir(), "icons", NULL); }
static void init_plugin(GaimPlugin *plugin) { char *dirname; dirname = g_build_filename(gaim_user_dir(), "autoaccept", NULL); gaim_prefs_add_none(PREF_PREFIX); gaim_prefs_add_string(PREF_PATH, dirname); gaim_prefs_add_bool(PREF_STRANGER, TRUE); gaim_prefs_add_bool(PREF_NOTIFY, TRUE); g_free(dirname); }
void gaym_fetch_thumbnail_cb(void *user_data, const char *pic_data, size_t len) { if (!user_data) return; struct gaym_fetch_thumbnail_data *d = user_data; if (!pic_data) { return; } if (len && !g_strrstr_len(pic_data, len, "Server Error")) { char *dir = g_build_filename(gaim_user_dir(), "icons", "gaym", d->who, NULL); char *filename = g_strdup(d->filename); char *path = g_build_filename(dir, filename, NULL); gaim_debug_misc("gayminfo", "dir: %s\n", dir); gaim_debug_misc("gayminfo", "filename: %s\n", filename); gaim_debug_misc("gayminfo", "path: %s\n", path); if (!g_file_test(dir, G_FILE_TEST_EXISTS)) gaim_build_dir(dir, S_IRUSR | S_IWUSR | S_IXUSR); if (path && !g_file_test(path, G_FILE_TEST_EXISTS)) { FILE *file; if ((file = g_fopen(path, "wb"))) { fwrite(pic_data, 1, len, file); fclose(file); } else { gaim_debug_misc("fetch_thumbnail_cb", "Couldn't write file\n"); } g_free(filename); g_free(path); g_free(dir); } } if (GAIM_CONNECTION_IS_VALID(d->gc) && len) { gaim_signal_emit(gaim_accounts_get_handle(), "info-updated", d->gc, NULL, d->who); if (gaim_find_conversation_with_account(d->who, d->gc->account)) { //gaim_buddy_icons_set_for_user(gaim_connection_get_account // (d->gc), d->who, // (void *) pic_data, len); } } else { gaim_debug_error("gaym", "Fetching buddy icon failed.\n"); } g_free(d->who); g_free(d); }
void fetch_thumbnail_cb(void *user_data, const char *pic_data, size_t len) { if (!user_data) return; struct fetch_thumbnail_data *d = user_data; if (!pic_data) { return; } if (len && !g_strrstr_len(pic_data, len, "Server Error")) { char *dir; if ((dir = g_build_filename(gaim_user_dir(), "icons", "gaym", NULL)) != NULL) { d->pic_data = pic_data; d->pic_data_len = len; gaim_build_dir(dir, S_IRUSR | S_IWUSR | S_IXUSR); char *filename = g_strdup_printf("%s.jpg", d->who); char *path = g_build_filename(dir, filename, NULL); FILE *file; if ((file = g_fopen(path, "wb"))) { fwrite(pic_data, 1, len, file); fclose(file); } else { gaim_debug_misc("chaticon", "Couldn't write file\n"); } g_free(filename); g_free(path); g_free(dir); } } else { d->pic_data = 0; d->pic_data_len = 0; } g_hash_table_foreach_remove(pending_updates, (GHRFunc) check_for_update, d); g_free(d); }
int main(int argc, char *argv[]) #endif { int opt_acct = 0, opt_help = 0, opt_version = 0, opt_login = 0, opt_nologin = 0, dologin_ret = -1; char *opt_user_arg = NULL, *opt_login_arg = NULL; char *opt_session_arg = NULL, *opt_config_dir_arg = NULL; #ifdef ENABLE_HILDON char *plugin_search_paths[4]; #else char *plugin_search_paths[3]; #endif #if HAVE_SIGNAL_H int sig_indx; /* for setting up signal catching */ sigset_t sigset; void (*prev_sig_disp)(); #endif int opt, opt_user = 0; int i; gboolean gui_check; gchar *gaimrc, *accountsxml; struct option long_options[] = { {"acct", no_argument, NULL, 'a'}, /*{"away", optional_argument, NULL, 'w'}, */ {"help", no_argument, NULL, 'h'}, /*{"login", optional_argument, NULL, 'l'}, */ {"loginwin", no_argument, NULL, 'n'}, {"user", required_argument, NULL, 'u'}, {"config", required_argument, NULL, 'c'}, {"debug", no_argument, NULL, 'd'}, {"version", no_argument, NULL, 'v'}, {"session", required_argument, NULL, 's'}, {0, 0, 0, 0} }; #ifdef DEBUG opt_debug = 1; #endif #ifndef _WIN32 br_set_locate_fallback_func(gaim_find_binary_location, argv[0]); #endif #ifdef ENABLE_NLS bindtextdomain(PACKAGE, LOCALEDIR); bind_textdomain_codeset(PACKAGE, "UTF-8"); textdomain(PACKAGE); #endif #if HAVE_SIGNAL_H /* Let's not violate any PLA's!!!! */ /* jseymour: whatever the fsck that means */ /* Robot101: for some reason things like gdm like to block * * useful signals like SIGCHLD, so we unblock all the ones we * * declare a handler for. thanks JSeymour and Vann. */ if (sigemptyset(&sigset)) { char errmsg[BUFSIZ]; snprintf(errmsg, BUFSIZ, "Warning: couldn't initialise empty signal set"); perror(errmsg); } for(sig_indx = 0; catch_sig_list[sig_indx] != -1; ++sig_indx) { if((prev_sig_disp = signal(catch_sig_list[sig_indx], sighandler)) == SIG_ERR) { char errmsg[BUFSIZ]; snprintf(errmsg, BUFSIZ, "Warning: couldn't set signal %d for catching", catch_sig_list[sig_indx]); perror(errmsg); } if(sigaddset(&sigset, catch_sig_list[sig_indx])) { char errmsg[BUFSIZ]; snprintf(errmsg, BUFSIZ, "Warning: couldn't include signal %d for unblocking", catch_sig_list[sig_indx]); perror(errmsg); } } for(sig_indx = 0; ignore_sig_list[sig_indx] != -1; ++sig_indx) { if((prev_sig_disp = signal(ignore_sig_list[sig_indx], SIG_IGN)) == SIG_ERR) { char errmsg[BUFSIZ]; snprintf(errmsg, BUFSIZ, "Warning: couldn't set signal %d to ignore", ignore_sig_list[sig_indx]); perror(errmsg); } } if (sigprocmask(SIG_UNBLOCK, &sigset, NULL)) { char errmsg[BUFSIZ]; snprintf(errmsg, BUFSIZ, "Warning: couldn't unblock signals"); perror(errmsg); } #endif for (i = 0; i < argc; i++) { /* --login option */ if (strstr(argv[i], "--l") == argv[i]) { char *equals; opt_login = 1; if ((equals = strchr(argv[i], '=')) != NULL) { /* --login=NAME */ opt_login_arg = g_strdup(equals + 1); if (strlen(opt_login_arg) == 0) { g_free(opt_login_arg); opt_login_arg = NULL; } } else if (i + 1 < argc && argv[i + 1][0] != '-') { /* --login NAME */ opt_login_arg = g_strdup(argv[i + 1]); strcpy(argv[i + 1], " "); } strcpy(argv[i], " "); } /* -l option */ else if (strstr(argv[i], "-l") == argv[i]) { opt_login = 1; if (strlen(argv[i]) > 2) { /* -lNAME */ opt_login_arg = g_strdup(argv[i] + 2); } else if (i + 1 < argc && argv[i + 1][0] != '-') { /* -l NAME */ opt_login_arg = g_strdup(argv[i + 1]); strcpy(argv[i + 1], " "); } strcpy(argv[i], " "); } /* --away option */ else if (strstr(argv[i], "--aw") == argv[i]) { char *equals; opt_away = 1; if ((equals = strchr(argv[i], '=')) != NULL) { /* --away=MESG */ opt_away_arg = g_strdup(equals + 1); if (strlen(opt_away_arg) == 0) { g_free(opt_away_arg); opt_away_arg = NULL; } } else if (i + 1 < argc && argv[i + 1][0] != '-') { /* --away MESG */ opt_away_arg = g_strdup(argv[i + 1]); strcpy(argv[i + 1], " "); } strcpy(argv[i], " "); } /* -w option */ else if (strstr(argv[i], "-w") == argv[i]) { opt_away = 1; if (strlen(argv[i]) > 2) { /* -wMESG */ opt_away_arg = g_strdup(argv[i] + 2); } else if (i + 1 < argc && argv[i + 1][0] != '-') { /* -w MESG */ opt_away_arg = g_strdup(argv[i + 1]); strcpy(argv[i + 1], " "); } strcpy(argv[i], " "); } } /* if (opt_login) { printf ("--login given with arg %s\n", opt_login_arg ? opt_login_arg : "NULL"); exit(0); } */ gui_check = gtk_init_check(&argc, &argv); /* scan command-line options */ opterr = 1; while ((opt = getopt_long(argc, argv, #ifndef _WIN32 "adhu:c:vns:", #else "adhu:c:vn", #endif long_options, NULL)) != -1) { switch (opt) { case 'u': /* set user */ opt_user = 1; opt_user_arg = g_strdup(optarg); break; case 'a': /* account editor */ opt_acct = 1; break; case 'd': /* debug */ opt_debug = 1; break; case 'c': /* use specified config dir */ set_gaim_user_dir(optarg); opt_config_dir_arg = g_strdup(optarg); break; case 's': /* use existing session ID */ opt_session_arg = g_strdup(optarg); break; case 'v': /* version */ opt_version = 1; break; case 'h': /* help */ opt_help = 1; break; case 'n': /* don't autologin */ opt_nologin = 1; break; case '?': default: show_usage(1, argv[0]); return 0; break; } } /* show help message */ if (opt_help) { show_usage(0, argv[0]); return 0; } /* show version message */ if (opt_version) { printf("Gaim %s\n",VERSION); return 0; } if (!gui_check) { char *display = gdk_get_display(); g_warning("cannot open display: %s", display ? display : "unset"); g_free(display); return 1; } #ifdef _WIN32 wgaim_init(hint); #endif gaim_core_set_ui_ops(gaim_gtk_core_get_ui_ops()); gaim_eventloop_set_ui_ops(gaim_gtk_eventloop_get_ui_ops()); #ifdef ENABLE_HILDON app = hildon_app_new(); hildon_app_set_two_part_title(HILDON_APP(app), TRUE); hildon_app_set_title(HILDON_APP(app), _("Gaim")); hildon_app_set_autoregistration(HILDON_APP(app), TRUE); /* I will catch the key events here to change views */ g_signal_connect(G_OBJECT(app), "key_press_event", G_CALLBACK(app_key_press_cb), app); g_signal_connect(G_OBJECT(app), "key_press_event", G_CALLBACK(app_key_press_cb), app); g_signal_connect(G_OBJECT(app), "delete_event", G_CALLBACK(app_delete_event_proxy), app); gtk_widget_show_all( GTK_WIDGET( app ) ); /* register with osso initialize */ context = osso_initialize("org.maemo." PACKAGE, PACKAGE_VERSION, FALSE, NULL); osso_application_set_top_cb(context, osso_top_callback, (gpointer)app); #endif if (!gaim_core_init(GAIM_GTK_UI)) { fprintf(stderr, "Initialization of the Gaim core failed. Dumping core.\n" "Please report this!\n"); abort(); } plugin_search_paths[0] = g_strdup(LIBDIR); plugin_search_paths[1] = gaim_user_dir(); plugin_search_paths[2] = g_build_filename(gaim_user_dir(), "plugins", NULL); #ifdef ENABLE_HILDON plugin_search_paths[3] = g_strdup("/var/lib/install/etc/gaim/plugins"); #endif gaim_plugins_set_search_paths(sizeof(plugin_search_paths) / sizeof(*plugin_search_paths), plugin_search_paths); g_free(plugin_search_paths[0]); g_free(plugin_search_paths[2]); gaim_plugins_probe(NULL); /* XXX - Remove this check. Maybe in 2005. --KingAnt, 25 Jul 2004 */ gaimrc = g_build_filename(gaim_home_dir(), ".gaimrc", NULL); accountsxml = g_build_filename(gaim_user_dir(), "accounts.xml", NULL); if (g_file_test(gaimrc, G_FILE_TEST_EXISTS) && !g_file_test(accountsxml, G_FILE_TEST_EXISTS)) { gaim_notify_error(NULL, NULL, _("Unable to load preferences"), _("Gaim was not able to load your preferences because they are stored in an old format that is no longer used. Please reconfigure your settings using the Preferences window.")); } g_free(gaimrc); g_free(accountsxml); gaim_accounts_load(); gaim_set_blist(gaim_blist_new()); gaim_blist_load(); gaim_prefs_load(); gaim_prefs_update_old(); gaim_gtk_prefs_update_old(); /* load plugins we had when we quit */ gaim_plugins_load_saved("/gaim/gtk/plugins/loaded"); gaim_pounces_load(); gaim_status_load(); ui_main(); #ifdef USE_SM session_init(argv[0], opt_session_arg, opt_config_dir_arg); #endif if (opt_session_arg != NULL) { g_free(opt_session_arg); opt_session_arg = NULL; } if (opt_config_dir_arg != NULL) { g_free(opt_config_dir_arg); opt_config_dir_arg = NULL; } /* set the default username */ if (opt_user_arg != NULL) { set_first_user(opt_user_arg); g_free(opt_user_arg); opt_user_arg = NULL; } #ifndef GAIM_SMALL_SCREEN if (gaim_prefs_get_bool("/gaim/gtk/debug/enabled")) gaim_gtk_debug_window_show(); #endif /* deal with --login */ if (opt_login) { dologin_ret = dologin_named(opt_login_arg); if (opt_login_arg != NULL) { g_free(opt_login_arg); opt_login_arg = NULL; } } if (!opt_acct && !opt_nologin) gaim_accounts_auto_login(GAIM_GTK_UI); if (opt_acct) { gaim_gtk_accounts_window_show(); } else if ((dologin_ret == -1) && !gaim_connections_get_all()) show_login(); #ifdef HAVE_STARTUP_NOTIFICATION startup_notification_complete(); #endif gtk_main(); gaim_sound_shutdown(); #ifdef _WIN32 wgaim_cleanup(); #endif #ifdef ENABLE_HILDON gtk_widget_destroy(app); #endif return 0; }
void gaym_buddy_status(struct gaym_conn *gaym, char *name, gboolean online, char *info) { char *bio = NULL; char *thumbnail = NULL; char *stats = NULL; char *url = NULL; struct gaym_fetch_thumbnail_data *data; gboolean gaymuser=FALSE; if (!gaym || !gaym->account || !gaym->buddies || !name) { return; } if (info) { #ifdef GAYM_TOKEN gaymuser = gaym_stats_find_gaym_token(info); #endif bio = gaym_bio_strdup(info); if (bio) { bio = g_strstrip(bio); } thumbnail = gaym_thumbnail_strdup(info); if (thumbnail) { thumbnail = g_strstrip(thumbnail); } stats = gaym_stats_strdup(info); if (stats) { stats = g_strstrip(stats); } } GaimConnection *gc = gaim_account_get_connection(gaym->account); if (!gc) { return; } struct gaym_buddy *ib = g_hash_table_lookup(gaym->buddies, name); char *normalized = g_strdup(gaim_normalize(gaym->account, name)); if (thumbnail) { gboolean do_fetch = 1; GError *err = NULL; if (!ib || gaim_utf8_strcasecmp(thumbnail, ib->thumbnail)) { char *dirname = g_build_filename(gaim_user_dir(), "icons", "gaym", gaim_normalize(gaym->account, name), NULL); GDir *gdir = g_dir_open(dirname, 0, &err); if (gdir) { const char *filename; while ((filename = g_dir_read_name(gdir))) /* don't free filename: owned by glib.*/ { char *thumbnail_base = g_path_get_basename(thumbnail); gaim_debug_misc("gaym", "compared %s and %s\n", thumbnail_base, filename); if (!gaim_utf8_strcasecmp(thumbnail_base, filename)) { do_fetch = 0; break; } g_free(thumbnail_base); } g_dir_close(gdir); } if (do_fetch) { gaim_debug_misc("gaym", "********************************************\n"); gaim_debug_misc("gaym", "*****************FETCH**********************\n"); gaim_debug_misc("gaym", "********************************************\n"); char *hashurl = NULL; hashurl = g_hash_table_lookup(gaym->confighash, "mini-profile-panel.thumbnail-prefix"); g_return_if_fail(hashurl != NULL); data = g_new0(struct gaym_fetch_thumbnail_data, 1); data->gc = gaim_account_get_connection(gaym->account); data->who = g_strdup(gaim_normalize(gaym->account, name)); data->filename = g_strdup(g_strrstr(thumbnail, "/")); gaim_debug_misc("gayminfo", "Found filename: %s\n", data->filename); url = g_strdup_printf("%s%s", hashurl, thumbnail); gaim_url_fetch(url, FALSE, "Mozilla/4.0", FALSE, gaym_fetch_thumbnail_cb, data); g_free(url); } } }
static void changed_cb(GtkTreeSelection * selection, gpointer conv) { g_return_if_fail(selection != NULL); g_return_if_fail(conv != NULL); GaimConversation *c = (GaimConversation *) conv; GaymBuddy *cm; struct gaym_conn *gaym = c->account->gc->proto_data; GtkTreeIter iter; GtkTreeModel *model; gchar *name; if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return; gtk_tree_model_get(model, &iter, CHAT_USERS_NAME_COLUMN, &name, -1); /* Remove the current icon stuff */ GaymChatIcon *icon_data = g_hash_table_lookup(icons, c); if (icon_data->event != NULL) gtk_widget_destroy(icon_data->event); icon_data->event = NULL; char *dir = g_build_filename(gaim_user_dir(), "icons", "gaym", NULL); char *filename = g_strdup_printf("%s.jpg", name); char *path = NULL; FILE *file; struct stat st; struct fetch_thumbnail_data *data = g_new0(struct fetch_thumbnail_data, 1); path = g_build_filename(dir, filename, NULL); if (path && !g_stat(path, &st)) { if (file = g_fopen(path, "rb")) { data->pic_data = g_malloc(st.st_size); data->who = name; data->pic_data_len = st.st_size; data->from_file = TRUE; fread(data->pic_data, 1, st.st_size, file); fclose(file); } g_free(dir); g_free(filename); g_free(path); gaym_gtkconv_update_thumbnail(c, data); fetch_thumbnail_cb(data, data->pic_data, data->pic_data_len); return; } // Get GaymBuddy struct for the thumbnail URL. cm = g_hash_table_lookup(gaym->channel_members, name); if (!cm) return; // Fetch thumbnail. char *hashurl = g_hash_table_lookup(gaym->confighash, "mini-profile-panel.thumbnail-prefix"); data = g_new0(struct fetch_thumbnail_data, 1); data->who = name; data->from_file = FALSE; char *url = g_strdup_printf("%s%s", hashurl, cm->thumbnail); gaim_url_fetch(url, FALSE, "Mozilla/4.0", FALSE, fetch_thumbnail_cb, data); // Add entry to hash table for tracking. g_hash_table_replace(pending_updates, c, name); }
void gaim_pounces_sync(void) { FILE *fp; struct stat st; const char *user_dir = gaim_user_dir(); char *filename; char *filename_real; if (!pounces_loaded) { gaim_debug(GAIM_DEBUG_WARNING, "pounces", "Writing pounces to disk.\n"); schedule_pounces_save(); return; } if (user_dir == NULL) return; gaim_debug(GAIM_DEBUG_INFO, "pounces", "Writing pounces to disk.\n"); fp = g_fopen(user_dir, "r"); if (fp == NULL) g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); else fclose(fp); filename = g_build_filename(user_dir, "pounces.xml.save", NULL); if ((fp = g_fopen(filename, "w")) != NULL) { GList *l; fprintf(fp, "<?xml version='1.0' encoding='UTF-8' ?>\n\n"); fprintf(fp, "<pounces version='1.0'>\n"); for (l = gaim_pounces_get_all(); l != NULL; l = l->next) gaim_pounces_write(fp, l->data); fprintf(fp, "</pounces>\n"); fclose(fp); chmod(filename, S_IRUSR | S_IWUSR); } else { gaim_debug(GAIM_DEBUG_ERROR, "pounces", "Unable to write %s\n", filename); g_free(filename); return; } if (g_stat(filename, &st) || (st.st_size == 0)) { gaim_debug_error("pounces", "Failed to save pounces\n"); g_unlink(filename); g_free(filename); return; } filename_real = g_build_filename(user_dir, "pounces.xml", NULL); if (g_rename(filename, filename_real) < 0) { gaim_debug(GAIM_DEBUG_ERROR, "pounces", "Error renaming %s to %s\n", filename, filename_real); } g_free(filename); g_free(filename_real); }
gboolean gaim_pounces_load(void) { gchar *filename = g_build_filename(gaim_user_dir(), "pounces.xml", NULL); gchar *contents = NULL; gsize length; GMarkupParseContext *context; GError *error = NULL; PounceParserData *parser_data; if (filename == NULL) { pounces_loaded = TRUE; return FALSE; } if (!g_file_get_contents(filename, &contents, &length, &error)) { gaim_debug(GAIM_DEBUG_ERROR, "pounces", "Error reading pounces: %s\n", error->message); g_free(filename); g_error_free(error); pounces_loaded = TRUE; return FALSE; } parser_data = g_new0(PounceParserData, 1); context = g_markup_parse_context_new(&pounces_parser, 0, parser_data, free_parser_data); if (!g_markup_parse_context_parse(context, contents, length, NULL)) { g_markup_parse_context_free(context); g_free(contents); g_free(filename); pounces_loaded = TRUE; return FALSE; } if (!g_markup_parse_context_end_parse(context, NULL)) { gaim_debug(GAIM_DEBUG_ERROR, "pounces", "Error parsing %s\n", filename); g_markup_parse_context_free(context); g_free(contents); g_free(filename); pounces_loaded = TRUE; return FALSE; } g_markup_parse_context_free(context); g_free(contents); g_free(filename); pounces_loaded = TRUE; return TRUE; }