diff options
Diffstat (limited to 'glib/demo/attachments.c')
-rw-r--r-- | glib/demo/attachments.c | 538 |
1 files changed, 235 insertions, 303 deletions
diff --git a/glib/demo/attachments.c b/glib/demo/attachments.c index 6fe7edae..43760965 100644 --- a/glib/demo/attachments.c +++ b/glib/demo/attachments.c @@ -21,333 +21,265 @@ #include "attachments.h" #include "utils.h" -enum { - ATTACHMENTS_NAME_COLUMN, - ATTACHMENTS_DESCRIPTION_COLUMN, - ATTACHMENTS_SIZE_COLUMN, - ATTACHMENTS_CTIME_COLUMN, - ATTACHMENTS_MTIME_COLUMN, - ATTACHMENTS_ATTACHMENT_COLUMN, - N_COLUMNS +enum +{ + ATTACHMENTS_NAME_COLUMN, + ATTACHMENTS_DESCRIPTION_COLUMN, + ATTACHMENTS_SIZE_COLUMN, + ATTACHMENTS_CTIME_COLUMN, + ATTACHMENTS_MTIME_COLUMN, + ATTACHMENTS_ATTACHMENT_COLUMN, + N_COLUMNS }; -static void -pgd_attachments_fill_model (GtkListStore *model, - PopplerDocument *document) +static void pgd_attachments_fill_model(GtkListStore *model, PopplerDocument *document) { - GList *list, *l; - - list = poppler_document_get_attachments (document); - - for (l = list; l && l->data; l = g_list_next (l)) { - PopplerAttachment *attachment = POPPLER_ATTACHMENT (l->data); - GtkTreeIter iter; - gchar *size; - gchar *ctime, *mtime; - - size = g_strdup_printf ("%" G_GSIZE_FORMAT, attachment->size); - ctime = pgd_format_date (attachment->ctime); - mtime = pgd_format_date (attachment->mtime); - - gtk_list_store_append (model, &iter); - gtk_list_store_set (model, &iter, - ATTACHMENTS_NAME_COLUMN, - attachment->name ? attachment->name : "Unknown", - ATTACHMENTS_DESCRIPTION_COLUMN, - attachment->description ? attachment->description : "Unknown", - ATTACHMENTS_SIZE_COLUMN, - size ? size : "Unknown", - ATTACHMENTS_CTIME_COLUMN, - ctime ? ctime : "Unknown", - ATTACHMENTS_MTIME_COLUMN, - mtime ? mtime : "Unknown", - ATTACHMENTS_ATTACHMENT_COLUMN, attachment, - -1); - - g_free (size); - g_free (ctime); - g_free (mtime); - - g_object_unref (attachment); - } - - g_list_free (list); + GList *list, *l; + + list = poppler_document_get_attachments(document); + + for (l = list; l && l->data; l = g_list_next(l)) { + PopplerAttachment *attachment = POPPLER_ATTACHMENT(l->data); + GtkTreeIter iter; + gchar *size; + GDateTime *ctime, *mtime; + gchar *ctime_str, *mtime_str; + const gchar *name; + const gchar *description; + + name = poppler_attachment_get_name(attachment); + description = poppler_attachment_get_description(attachment); + size = g_strdup_printf("%" G_GSIZE_FORMAT, poppler_attachment_get_size(attachment)); + ctime = poppler_attachment_get_ctime(attachment); + ctime_str = ctime ? g_date_time_format(ctime, "%c") : NULL; + mtime = poppler_attachment_get_mtime(attachment); + mtime_str = mtime ? g_date_time_format(mtime, "%c") : NULL; + + gtk_list_store_append(model, &iter); + gtk_list_store_set(model, &iter, ATTACHMENTS_NAME_COLUMN, name ? name : "Unknown", ATTACHMENTS_DESCRIPTION_COLUMN, description ? description : "Unknown", ATTACHMENTS_SIZE_COLUMN, size ? size : "Unknown", ATTACHMENTS_CTIME_COLUMN, + ctime_str ? ctime_str : "Unknown", ATTACHMENTS_MTIME_COLUMN, mtime_str ? mtime_str : "Unknown", ATTACHMENTS_ATTACHMENT_COLUMN, attachment, -1); + + g_free(size); + g_free(ctime_str); + g_free(mtime_str); + + g_object_unref(attachment); + } + + g_list_free(list); } -static GtkWidget * -pgd_attachments_create_list (GtkTreeModel *model) +static GtkWidget *pgd_attachments_create_list(GtkTreeModel *model) { - GtkWidget *treeview; - GtkCellRenderer *renderer; - - treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), TRUE); - gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); - - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), - 0, "Name", - renderer, - "text", ATTACHMENTS_NAME_COLUMN, - NULL); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), - 1, "Description", - renderer, - "text", ATTACHMENTS_DESCRIPTION_COLUMN, - NULL); - g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); - g_object_set (G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 1)), - "expand", TRUE, NULL); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), - 2, "Size", - renderer, - "text", ATTACHMENTS_SIZE_COLUMN, - NULL); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), - 3, "Creation Date", - renderer, - "text", ATTACHMENTS_CTIME_COLUMN, - NULL); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), - 4, "Modification Date", - renderer, - "text", ATTACHMENTS_MTIME_COLUMN, - NULL); - return treeview; + GtkWidget *treeview; + GtkCellRenderer *renderer; + + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 0, "Name", renderer, "text", ATTACHMENTS_NAME_COLUMN, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 1, "Description", renderer, "text", ATTACHMENTS_DESCRIPTION_COLUMN, NULL); + g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); + g_object_set(G_OBJECT(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), 1)), "expand", TRUE, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 2, "Size", renderer, "text", ATTACHMENTS_SIZE_COLUMN, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 3, "Creation Date", renderer, "text", ATTACHMENTS_CTIME_COLUMN, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 4, "Modification Date", renderer, "text", ATTACHMENTS_MTIME_COLUMN, NULL); + return treeview; } -static void -pgd_attachments_save_dialog_response (GtkFileChooser *file_chooser, - gint response, - PopplerAttachment *attachment) +static void pgd_attachments_save_dialog_response(GtkFileChooser *file_chooser, gint response, PopplerAttachment *attachment) { - gchar *filename; - GError *error = NULL; - - if (response != GTK_RESPONSE_ACCEPT) { - g_object_unref (attachment); - gtk_widget_destroy (GTK_WIDGET (file_chooser)); - return; - } - - filename = gtk_file_chooser_get_filename (file_chooser); - if (!poppler_attachment_save (attachment, filename, &error)) { - g_warning ("%s", error->message); - g_error_free (error); - } - g_free (filename); - g_object_unref (attachment); - gtk_widget_destroy (GTK_WIDGET (file_chooser)); + gchar *filename; + GError *error = NULL; + + if (response != GTK_RESPONSE_ACCEPT) { + g_object_unref(attachment); + gtk_widget_destroy(GTK_WIDGET(file_chooser)); + return; + } + + filename = gtk_file_chooser_get_filename(file_chooser); + if (!poppler_attachment_save(attachment, filename, &error)) { + g_warning("%s", error->message); + g_error_free(error); + } + g_free(filename); + g_object_unref(attachment); + gtk_widget_destroy(GTK_WIDGET(file_chooser)); } -static void -pgd_attachments_save_button_clicked (GtkButton *button, - GtkTreeView *treeview) +static void pgd_attachments_save_button_clicked(GtkButton *button, GtkTreeView *treeview) { - GtkTreeSelection *selection; - GtkTreeModel *model; - GtkTreeIter iter; - GtkWidget *file_chooser; - PopplerAttachment *attachment; - - selection = gtk_tree_view_get_selection (treeview); - if (!gtk_tree_selection_get_selected (selection, &model, &iter)) - return; - - gtk_tree_model_get (model, &iter, - ATTACHMENTS_ATTACHMENT_COLUMN, &attachment, - -1); - - if (!attachment) - return; - - file_chooser = gtk_file_chooser_dialog_new ("Save attachment", - GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))), - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL); - gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (file_chooser), attachment->name); - g_signal_connect (G_OBJECT (file_chooser), "response", - G_CALLBACK (pgd_attachments_save_dialog_response), - (gpointer) attachment); - gtk_widget_show (file_chooser); - + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + GtkWidget *file_chooser; + PopplerAttachment *attachment; + + selection = gtk_tree_view_get_selection(treeview); + if (!gtk_tree_selection_get_selected(selection, &model, &iter)) { + return; + } + + gtk_tree_model_get(model, &iter, ATTACHMENTS_ATTACHMENT_COLUMN, &attachment, -1); + + if (!attachment) { + return; + } + + file_chooser = gtk_file_chooser_dialog_new("Save attachment", GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(treeview))), GTK_FILE_CHOOSER_ACTION_SAVE, "_Cancel", GTK_RESPONSE_CANCEL, "_Save", GTK_RESPONSE_ACCEPT, NULL); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(file_chooser), poppler_attachment_get_name(attachment)); + g_signal_connect(G_OBJECT(file_chooser), "response", G_CALLBACK(pgd_attachments_save_dialog_response), (gpointer)attachment); + gtk_widget_show(file_chooser); } -static gboolean -attachment_save_callback (const gchar *buf, - gsize count, - gpointer data, - GError **error) +static gboolean attachment_save_callback(const gchar *buf, gsize count, gpointer data, GError **error) { - GChecksum *cs = (GChecksum *)data; + GChecksum *cs = (GChecksum *)data; - g_checksum_update (cs, (guchar *) buf, count); + g_checksum_update(cs, (guchar *)buf, count); - return TRUE; + return TRUE; } -static void -message_dialog_run (GtkWindow *parent, - const gchar *message) +static void message_dialog_run(GtkWindow *parent, const gchar *message) { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (parent, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_INFO, - GTK_BUTTONS_CLOSE, - "%s", message); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); + GtkWidget *dialog; + + dialog = gtk_message_dialog_new(parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "%s", message); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); } -static void -pgd_attachments_validate_button_clicked (GtkButton *button, - GtkTreeView *treeview) +static void pgd_attachments_validate_button_clicked(GtkButton *button, GtkTreeView *treeview) { - GtkTreeSelection *selection; - GtkTreeModel *model; - GtkTreeIter iter; - GChecksum *cs; - guint8 *digest; - gsize digest_len; - PopplerAttachment *attachment; - gboolean valid = TRUE; - - selection = gtk_tree_view_get_selection (treeview); - if (!gtk_tree_selection_get_selected (selection, &model, &iter)) - return; - - gtk_tree_model_get (model, &iter, - ATTACHMENTS_ATTACHMENT_COLUMN, &attachment, - -1); - - if (!attachment) - return; - - if (attachment->checksum->len == 0) { - message_dialog_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))), - "Impossible to validate attachment: checksum is not available"); - g_object_unref (attachment); - - return; - } - - cs = g_checksum_new (G_CHECKSUM_MD5); - poppler_attachment_save_to_callback (attachment, attachment_save_callback, - (gpointer)cs, NULL); - digest_len = g_checksum_type_get_length (G_CHECKSUM_MD5); - digest = (guint8 *) g_malloc (digest_len); - g_checksum_get_digest (cs, digest, &digest_len); - g_checksum_free (cs); - - if (attachment->checksum->len == digest_len) { - gint i; - - for (i = 0; i < digest_len; i++) { - if ((guint8)attachment->checksum->str[i] != digest[i]) { - valid = FALSE; - break; - } - } - } - - if (valid) { - message_dialog_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))), - "Attachment is valid"); - } else { - message_dialog_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))), - "Attachment is not valid: the checksum does not match"); - } - - g_free (digest); - g_object_unref (attachment); + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + const GString *checksum; + GChecksum *cs; + guint8 *digest; + gsize digest_len; + PopplerAttachment *attachment; + gboolean valid = TRUE; + + selection = gtk_tree_view_get_selection(treeview); + if (!gtk_tree_selection_get_selected(selection, &model, &iter)) { + return; + } + + gtk_tree_model_get(model, &iter, ATTACHMENTS_ATTACHMENT_COLUMN, &attachment, -1); + + if (!attachment) { + return; + } + + checksum = poppler_attachment_get_checksum(attachment); + + if (checksum->len == 0) { + message_dialog_run(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(treeview))), "Impossible to validate attachment: checksum is not available"); + g_object_unref(attachment); + + return; + } + + cs = g_checksum_new(G_CHECKSUM_MD5); + poppler_attachment_save_to_callback(attachment, attachment_save_callback, (gpointer)cs, NULL); + digest_len = g_checksum_type_get_length(G_CHECKSUM_MD5); + digest = (guint8 *)g_malloc(digest_len); + g_checksum_get_digest(cs, digest, &digest_len); + g_checksum_free(cs); + + if (checksum->len == digest_len) { + gint i; + + for (i = 0; i < digest_len; i++) { + if ((guint8)checksum->str[i] != digest[i]) { + valid = FALSE; + break; + } + } + } + + if (valid) { + message_dialog_run(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(treeview))), "Attachment is valid"); + } else { + message_dialog_run(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(treeview))), "Attachment is not valid: the checksum does not match"); + } + + g_free(digest); + g_object_unref(attachment); } -GtkWidget * -pgd_attachments_create_widget (PopplerDocument *document) +GtkWidget *pgd_attachments_create_widget(PopplerDocument *document) { - GtkWidget *vbox; - GtkWidget *treeview; - GtkListStore *model; - GtkWidget *swindow; - GtkWidget *hbox, *button; - gboolean has_attachments; - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); - - swindow = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - has_attachments = poppler_document_has_attachments (document); - if (has_attachments) { - model = gtk_list_store_new (N_COLUMNS, - G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_OBJECT); - pgd_attachments_fill_model (model, document); - treeview = pgd_attachments_create_list (GTK_TREE_MODEL (model)); - } else { - GtkCellRenderer *renderer; - GtkTreeIter iter; - gchar *markup; - - model = gtk_list_store_new (1, G_TYPE_STRING); - gtk_list_store_append (model, &iter); - markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>", - "The document doesn't contain attachments"); - gtk_list_store_set (model, &iter, 0, markup, -1); - g_free (markup); - - treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); - - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), - 0, "Name", - renderer, - "markup", 0, - NULL); - } - g_object_unref (model); - - gtk_container_add (GTK_CONTAINER (swindow), treeview); - gtk_widget_show (treeview); - - gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0); - gtk_widget_show (swindow); - - if (!has_attachments) - return vbox; - - hbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); - gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD); - - button = gtk_button_new_with_label ("Save"); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (pgd_attachments_save_button_clicked), - (gpointer)treeview); - - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show (button); - - button = gtk_button_new_with_label ("Validate"); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (pgd_attachments_validate_button_clicked), - (gpointer)treeview); - - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show (button); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6); - gtk_widget_show (hbox); - - return vbox; + GtkWidget *vbox; + GtkWidget *treeview; + GtkListStore *model; + GtkWidget *swindow; + GtkWidget *hbox, *button; + gboolean has_attachments; + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12); + + swindow = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + has_attachments = poppler_document_has_attachments(document); + if (has_attachments) { + model = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_OBJECT); + pgd_attachments_fill_model(model, document); + treeview = pgd_attachments_create_list(GTK_TREE_MODEL(model)); + } else { + GtkCellRenderer *renderer; + GtkTreeIter iter; + gchar *markup; + + model = gtk_list_store_new(1, G_TYPE_STRING); + gtk_list_store_append(model, &iter); + markup = g_strdup_printf("<span size=\"larger\" style=\"italic\">%s</span>", "The document doesn't contain attachments"); + gtk_list_store_set(model, &iter, 0, markup, -1); + g_free(markup); + + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 0, "Name", renderer, "markup", 0, NULL); + } + g_object_unref(model); + + gtk_container_add(GTK_CONTAINER(swindow), treeview); + gtk_widget_show(treeview); + + gtk_box_pack_start(GTK_BOX(vbox), swindow, TRUE, TRUE, 0); + gtk_widget_show(swindow); + + if (!has_attachments) { + return vbox; + } + + hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); + gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_SPREAD); + + button = gtk_button_new_with_label("Save"); + g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(pgd_attachments_save_button_clicked), (gpointer)treeview); + + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + button = gtk_button_new_with_label("Validate"); + g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(pgd_attachments_validate_button_clicked), (gpointer)treeview); + + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 6); + gtk_widget_show(hbox); + + return vbox; } |