static BalsaMimeWidget * balsa_mime_widget_new_unknown(BalsaMessage * bm, LibBalsaMessageBody * mime_body, const gchar * content_type) { GtkWidget *hbox; GtkWidget *button = NULL; gchar *msg; GtkWidget *msg_label; gchar *content_desc; BalsaMimeWidget *mw; gchar *use_content_type; g_return_val_if_fail(mime_body, NULL); mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL); mw->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE); gtk_container_set_border_width(GTK_CONTAINER(mw->widget), BMW_CONTAINER_BORDER); if (mime_body->filename) { msg = g_strdup_printf(_("File name: %s"), mime_body->filename); gtk_box_pack_start(GTK_BOX(mw->widget), gtk_label_new(msg), FALSE, FALSE, 0); g_free(msg); } /* guess content_type if not specified or if generic app/octet-stream */ /* on local mailboxes only, to avoid possibly long downloads */ if ((content_type == NULL || g_ascii_strcasecmp(content_type, "application/octet-stream") == 0) && LIBBALSA_IS_MAILBOX_LOCAL(mime_body->message->mailbox)) { GError *err = NULL; gpointer buffer; GMimeStream *stream = libbalsa_message_body_get_stream(mime_body, &err); if(!stream) { libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("Error reading message part: %s"), err ? err->message : "Unknown error"); g_clear_error(&err); use_content_type = g_strdup(content_type); } else { ssize_t length = 1024 /* g_mime_stream_length(stream) */ ; ssize_t size; buffer = g_malloc(length); libbalsa_mime_stream_shared_lock(stream); size = g_mime_stream_read(stream, buffer, length); libbalsa_mime_stream_shared_unlock(stream); g_object_unref(stream); use_content_type = libbalsa_vfs_content_type_of_buffer(buffer, size); if (g_ascii_strncasecmp(use_content_type, "text", 4) == 0 && (libbalsa_text_attr_string(buffer) & LIBBALSA_TEXT_HI_BIT)) { /* Hmmm...better stick with application/octet-stream. */ g_free(use_content_type); use_content_type = g_strdup("application/octet-stream"); } g_free(buffer); } } else use_content_type = g_strdup(content_type); content_desc = libbalsa_vfs_content_description(use_content_type); if (content_desc) { msg = g_strdup_printf(_("Type: %s (%s)"), content_desc, use_content_type); g_free(content_desc); } else msg = g_strdup_printf(_("Content Type: %s"), use_content_type); msg_label = gtk_label_new(msg); g_free(msg); gtk_label_set_ellipsize(GTK_LABEL(msg_label), PANGO_ELLIPSIZE_END); gtk_box_pack_start(GTK_BOX(mw->widget), msg_label, FALSE, FALSE, 0); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BMW_HBOX_SPACE); gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE); if ((button = libbalsa_vfs_mime_button(mime_body, use_content_type, G_CALLBACK(balsa_mime_widget_ctx_menu_cb), (gpointer) mime_body))) gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); else gtk_box_pack_start(GTK_BOX(mw->widget), gtk_label_new(_("No open or view action " "defined for this content type")), FALSE, FALSE, 0); g_free(use_content_type); button = gtk_button_new_with_mnemonic(_("S_ave part")); gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(balsa_mime_widget_ctx_menu_save), (gpointer) mime_body); gtk_box_pack_start(GTK_BOX(mw->widget), hbox, FALSE, FALSE, 0); return mw; }
GList * balsa_print_object_default(GList * list, GtkPrintContext * context, LibBalsaMessageBody * body, BalsaPrintSetup * psetup) { BalsaPrintObjectDefault *pod; BalsaPrintObject *po; gchar *conttype; PangoFontDescription *header_font; PangoLayout *test_layout; PangoTabArray *tabs; GString *desc_buf; gdouble c_max_height; gchar *part_desc; pod = g_object_new(BALSA_TYPE_PRINT_OBJECT_DEFAULT, NULL); g_assert(pod != NULL); po = BALSA_PRINT_OBJECT(pod); /* create the part */ po->depth = psetup->curr_depth; po->c_width = psetup->c_width - 2 * psetup->curr_depth * C_LABEL_SEP; /* get a pixbuf according to the mime type */ conttype = libbalsa_message_body_get_mime_type(body); pod->pixbuf = libbalsa_icon_finder(NULL, conttype, NULL, NULL, GTK_ICON_SIZE_DND); pod->c_image_width = gdk_pixbuf_get_width(pod->pixbuf); pod->c_image_height = gdk_pixbuf_get_height(pod->pixbuf); /* create a layout for calculating the maximum label width */ header_font = pango_font_description_from_string(balsa_app.print_header_font); test_layout = gtk_print_context_create_pango_layout(context); pango_layout_set_font_description(test_layout, header_font); pango_font_description_free(header_font); desc_buf = g_string_new(""); /* add type and filename (if available) */ pod->p_label_width = p_string_width_from_layout(test_layout, _("Type:")); if ((part_desc = libbalsa_vfs_content_description(conttype))) g_string_append_printf(desc_buf, "%s\t%s (%s)", _("Type:"), part_desc, conttype); else g_string_append_printf(desc_buf, "%s\t%s", _("Type:"), conttype); g_free(part_desc); g_free(conttype); if (body->filename) { gint p_fnwidth = p_string_width_from_layout(test_layout, _("File name:")); if (p_fnwidth > pod->p_label_width) pod->p_label_width = p_fnwidth; g_string_append_printf(desc_buf, "\n%s\t%s", _("File name:"), body->filename); } /* add a small space between label and value */ pod->p_label_width += C_TO_P(C_LABEL_SEP); /* configure the layout so we can calculate the text height */ pango_layout_set_indent(test_layout, -pod->p_label_width); tabs = pango_tab_array_new_with_positions(1, FALSE, PANGO_TAB_LEFT, pod->p_label_width); pango_layout_set_tabs(test_layout, tabs); pango_tab_array_free(tabs); pango_layout_set_width(test_layout, C_TO_P(po->c_width - 4 * C_LABEL_SEP - pod->c_image_width)); pango_layout_set_alignment(test_layout, PANGO_ALIGN_LEFT); pod->c_text_height = P_TO_C(p_string_height_from_layout(test_layout, desc_buf->str)); pod->description = g_string_free(desc_buf, FALSE); /* check if we should move to the next page */ c_max_height = MAX(pod->c_text_height, pod->c_image_height); if (psetup->c_y_pos + c_max_height > psetup->c_height) { psetup->c_y_pos = 0; psetup->page_count++; } /* remember the extent */ po->on_page = psetup->page_count - 1; po->c_at_x = psetup->c_x0 + po->depth * C_LABEL_SEP; po->c_at_y = psetup->c_y0 + psetup->c_y_pos; po->c_width = psetup->c_width - 2 * po->depth * C_LABEL_SEP; po->c_height = c_max_height; /* adjust the y position */ psetup->c_y_pos += c_max_height; return g_list_append(list, po); }