/* part stolen from gtkutils.c */ static void set_sensitive_if_input_and_noexist (GtkWidget * entry, GtkWidget * dlgbox_rename) { GtkWidget *warn_label; gchar *capture_path_filename = NULL; const gchar *text; warn_label = g_object_get_data (G_OBJECT (dlgbox_rename), "warn-label"); text = purple_escape_filename (gtk_entry_get_text (GTK_ENTRY (entry))); capture_path_filename = g_build_filename (purple_prefs_get_string (PREF_STORE_FOLDER), text, NULL); gtk_dialog_set_response_sensitive (GTK_DIALOG (dlgbox_rename), GTK_RESPONSE_OK, (*text != '\0')); /* warn user if file already exists */ if (g_file_test (capture_path_filename, G_FILE_TEST_EXISTS) && (*text != '\0')) gtk_widget_show (warn_label); else gtk_widget_hide (warn_label); if (capture_path_filename != NULL) g_free (capture_path_filename); }
/* Makes a filename path for a certificate. If id is NULL, * just return the directory */ static gchar * make_certificate_path(const gchar *id) { return g_build_filename(purple_user_dir(), "certificates", "tls", id != NULL ? purple_escape_filename(id) : NULL, NULL); }
END_TEST START_TEST(test_util_escape_filename) { assert_string_equal("foo", purple_escape_filename("foo")); assert_string_equal("@oo", purple_escape_filename("@oo")); assert_string_equal("#oo", purple_escape_filename("#oo")); assert_string_equal("-oo", purple_escape_filename("-oo")); assert_string_equal("_oo", purple_escape_filename("_oo")); assert_string_equal(".oo", purple_escape_filename(".oo")); assert_string_equal("%25oo", purple_escape_filename("%oo")); assert_string_equal("%21oo", purple_escape_filename("!oo")); }
/*------------------------------------------------------------------------ * Save a new splash-screen for later display. * * @param session The MXit session object * @param splashID The ID of the splash-screen * @param data Splash-screen image data (PNG format) * @param datalen Splash-screen image data size */ void splash_update(struct MXitSession* session, const char* splashId, const char* data, unsigned int datalen, gboolean clickable) { char* dir; char* filename; /* Remove the current splash-screen */ splash_remove(session); /* Save the new splash image */ dir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "mxit", purple_user_dir()); purple_build_dir(dir, S_IRUSR | S_IWUSR | S_IXUSR); /* ensure directory exists */ filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.png", dir, purple_escape_filename(splashId)); if (purple_util_write_data_to_file_absolute(filename, data, datalen)) { /* Store new splash-screen ID to settings */ purple_account_set_string(session->acc, MXIT_CONFIG_SPLASHID, splashId); purple_account_set_bool(session->acc, MXIT_CONFIG_SPLASHCLICK, clickable ); } g_free(dir); g_free(filename); }
/*------------------------------------------------------------------------ * Remove the stored splash-screen (if it exists). * * @param session The MXit session object */ void splash_remove(struct MXitSession* session) { const char* splashId = NULL; char* filename; /* Get current splash ID */ splashId = splash_current(session); if (splashId != NULL) { purple_debug_info(MXIT_PLUGIN_ID, "Removing splashId: '%s'\n", splashId); /* Delete stored splash image */ filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "mxit" G_DIR_SEPARATOR_S "%s.png", purple_user_dir(), purple_escape_filename(splashId)); g_unlink(filename); g_free(filename); /* Clear current splash ID from settings */ purple_account_set_string(session->acc, MXIT_CONFIG_SPLASHID, ""); purple_account_set_bool(session->acc, MXIT_CONFIG_SPLASHCLICK, FALSE); } }
/*------------------------------------------------------------------------ * Display the current splash-screen. * * @param session The MXit session object */ void splash_display(struct MXitSession* session) { const char* splashId = NULL; char* filename; gchar* imgdata; gsize imglen; int imgid = -1; /* Get current splash ID */ splashId = splash_current(session); if (splashId == NULL) /* no splash-screen */ return; purple_debug_info(MXIT_PLUGIN_ID, "Display Splash: '%s'\n", splashId); /* Load splash-screen image from file */ filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "mxit" G_DIR_SEPARATOR_S "%s.png", purple_user_dir(), purple_escape_filename(splashId)); if (g_file_get_contents(filename, &imgdata, &imglen, NULL)) { char buf[128]; /* Add splash-image to imagestore */ imgid = purple_imgstore_add_with_id(g_memdup(imgdata, imglen), imglen, NULL); /* Generate and display message */ g_snprintf(buf, sizeof(buf), "<img id=\"%d\">", imgid); /* Open a request-type popup to display the image */ { PurpleRequestFields* fields; PurpleRequestFieldGroup* group; PurpleRequestField* field; fields = purple_request_fields_new(); group = purple_request_field_group_new(NULL); purple_request_fields_add_group(fields, group); field = purple_request_field_image_new("splash", "", imgdata, imglen); /* add splash image */ purple_request_field_group_add_field(group, field); if (splash_clickable(session)) { purple_request_fields(session->con, _("MXit Advertising"), NULL, NULL, fields, _("More Information"), G_CALLBACK(splash_click_ok), _("Close"), NULL, session->acc, NULL, NULL, session->con); } else { purple_request_fields(session->con, _("MXit Advertising"), NULL, NULL, fields, _("Continue"), G_CALLBACK(splash_click_ok), _("Close"), NULL, session->acc, NULL, NULL, session->con); } } /* Release reference to image */ purple_imgstore_unref_by_id(imgid); g_free(imgdata); } g_free(filename); }
static void file_recv_request_cb(PurpleXfer *xfer, gpointer handle) { PurpleAccount *account; PurpleBlistNode *node; const char *pref; char *filename; char *dirname; int accept_setting; account = xfer->account; node = PURPLE_BLIST_NODE(purple_find_buddy(account, xfer->who)); /* If person is on buddy list, use the buddy setting; otherwise, use the stranger setting. */ if (node) { node = purple_blist_node_get_parent(node); g_return_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node)); accept_setting = purple_blist_node_get_int(node, "autoaccept"); } else { accept_setting = purple_prefs_get_int(PREF_STRANGER); } switch (accept_setting) { case FT_ASK: break; case FT_ACCEPT: pref = purple_prefs_get_string(PREF_PATH); if (ensure_path_exists(pref)) { int count = 1; const char *escape; gchar **name_and_ext; const gchar *name; gchar *ext; if (purple_prefs_get_bool(PREF_NEWDIR)) dirname = g_build_filename(pref, purple_normalize(account, xfer->who), NULL); else dirname = g_build_filename(pref, NULL); if (!ensure_path_exists(dirname)) { g_free(dirname); break; } /* Escape filename (if escaping is turned on) */ if (purple_prefs_get_bool(PREF_ESCAPE)) { escape = purple_escape_filename(xfer->filename); } else { escape = xfer->filename; } filename = g_build_filename(dirname, escape, NULL); /* Split at the first dot, to avoid uniquifying "foo.tar.gz" to "foo.tar-2.gz" */ name_and_ext = g_strsplit(escape, ".", 2); name = name_and_ext[0]; g_return_if_fail(name != NULL); if (name_and_ext[1] != NULL) { /* g_strsplit does not include the separator in each chunk. */ ext = g_strdup_printf(".%s", name_and_ext[1]); } else { ext = g_strdup(""); } /* Make sure the file doesn't exist. Do we want some better checking than this? */ /* FIXME: There is a race here: if the newly uniquified file name gets created between * this g_file_test and the transfer starting, the file created in the meantime * will be clobbered. But it's not at all straightforward to fix. */ while (g_file_test(filename, G_FILE_TEST_EXISTS)) { char *file = g_strdup_printf("%s-%d%s", name, count++, ext); g_free(filename); filename = g_build_filename(dirname, file, NULL); g_free(file); } purple_xfer_request_accepted(xfer, filename); g_strfreev(name_and_ext); g_free(ext); g_free(dirname); g_free(filename); } purple_signal_connect(purple_xfers_get_handle(), "file-recv-complete", handle, PURPLE_CALLBACK(auto_accept_complete_cb), xfer); break; case FT_REJECT: xfer->status = PURPLE_XFER_STATUS_CANCEL_LOCAL; break; } }