aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/ChangeLog2
-rw-r--r--calendar/gui/dialogs/cal-attachment.c650
-rw-r--r--calendar/gui/dialogs/cal-attachment.h90
3 files changed, 2 insertions, 740 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 3e6e4f19ee..72479e5485 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -22,6 +22,8 @@
or later, and always on Win32, use the GtkStatusIcon API instead
of EggTrayIcon.
+ * gui/dialogs/cal-attachment.h
+ * gui/dialogs/cal-attachment.c
* gui/dialogs/cal-attachment-bar.h
* gui/dialogs/cal-attachment-bar.c: Remove unused files from CVS.
diff --git a/calendar/gui/dialogs/cal-attachment.c b/calendar/gui/dialogs/cal-attachment.c
deleted file mode 100644
index db97973ad6..0000000000
--- a/calendar/gui/dialogs/cal-attachment.c
+++ /dev/null
@@ -1,650 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * Authors: Harish Krishnaswamy <kharish@novell.com>
- * Copyright 2004 Novell Inc. <www.novell.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-/* Much of this file has been shamelessly copied from the mail attachment
- * handling code, including the fixmes. Modifications/Additions that are
- * specific to the calendar component have been flagged by some comments
- * fwiw */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/stat.h>
-#include <string.h>
-#include <errno.h>
-
-#include <gtk/gtknotebook.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkdialog.h>
-#include <libgnomevfs/gnome-vfs.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "e-util/e-mktemp.h"
-#include "e-util/e-util-private.h"
-#include <camel/camel.h>
-
-#include "comp-editor.h"
-#include "cal-attachment.h"
-
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static GObjectClass *parent_class = NULL;
-
-
-static void
-changed (CalAttachment *attachment)
-{
- g_signal_emit (attachment, signals[CHANGED], 0);
-}
-
-
-/* GtkObject methods. */
-
-static void
-finalise(GObject *object)
-{
- CalAttachment *attachment;
-
- attachment = CAL_ATTACHMENT (object);
-
- if (attachment->is_available_local) {
- camel_object_unref (attachment->body);
- if (attachment->pixbuf_cache != NULL)
- g_object_unref (attachment->pixbuf_cache);
- } else {
- if (attachment->handle)
- gnome_vfs_async_cancel(attachment->handle);
- if (attachment->file_name)
- g_free (attachment->file_name);
- if (attachment->description)
- g_free (attachment->description);
- }
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-/* Signals. */
-
-static void
-real_changed (CalAttachment *cal_attachment)
-{
- g_return_if_fail (E_IS_CAL_ATTACHMENT (cal_attachment));
-}
-
-
-static void
-class_init (CalAttachmentClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = (GObjectClass*) klass;
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
-
- object_class->finalize = finalise;
- klass->changed = real_changed;
-
- signals[CHANGED] = g_signal_new ("changed",
- E_TYPE_CAL_ATTACHMENT,
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CalAttachmentClass, changed),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static void
-init (CalAttachment *cal_attachment)
-{
- cal_attachment->editor_gui = NULL;
- cal_attachment->body = NULL;
- cal_attachment->size = 0;
- cal_attachment->pixbuf_cache = NULL;
- cal_attachment->index = -1;
- cal_attachment->file_name = NULL;
- cal_attachment->description = NULL;
- cal_attachment->disposition = FALSE;
-}
-
-GType
-cal_attachment_get_type (void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof (CalAttachmentClass),
- NULL,
- NULL,
- (GClassInitFunc) class_init,
- NULL,
- NULL,
- sizeof (CalAttachment),
- 0,
- (GInstanceInitFunc) init,
- };
-
- type = g_type_register_static (G_TYPE_OBJECT, "CalAttachment", &info, 0);
- }
-
- return type;
-}
-
-/**
- * cal_attachment_guess_mime_type:
- * @file_name: filename
- * Returns the guessed mime type of the file given by #file_name
- **/
-
-static char *
-cal_attachment_guess_mime_type (const char *file_name)
-{
- GnomeVFSFileInfo *info;
- GnomeVFSResult result;
- char *type = NULL;
-
- info = gnome_vfs_file_info_new ();
- result = gnome_vfs_get_file_info (file_name, info,
- GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
- GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE |
- GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
- if (result == GNOME_VFS_OK)
- type = g_strdup (gnome_vfs_file_info_get_mime_type (info));
-
- gnome_vfs_file_info_unref (info);
-
- return type;
-}
-
-
-/**
- * cal_attachment_new:
- * @file_name: filename to attach
- * @disposition: Content-Disposition of the attachment
- * @ex: exception
- *
- * Return value: the new attachment, or %NULL on error
- **/
-CalAttachment *
-cal_attachment_new (const char *file_name,
- const char *disposition,
- CamelException *ex)
-{
- CalAttachment *new;
- CamelMimePart *part;
- CamelDataWrapper *wrapper;
- CamelStream *stream;
- struct stat statbuf;
- char *mime_type;
- char *filename;
-
- g_return_val_if_fail (file_name != NULL, NULL);
-
- if (stat (file_name, &statbuf) < 0) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: %s"),
- file_name, g_strerror (errno));
- return NULL;
- }
-
- /* return if it's not a regular file */
- if (!S_ISREG (statbuf.st_mode)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: not a regular file"),
- file_name);
- return NULL;
- }
-
- stream = camel_stream_fs_new_with_name (file_name, O_RDONLY, 0);
- if (!stream) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: %s"),
- file_name, g_strerror (errno));
- return NULL;
- }
-
- mime_type = cal_attachment_guess_mime_type (file_name);
- if (mime_type) {
- if (!g_ascii_strcasecmp (mime_type, "message/rfc822")) {
- wrapper = (CamelDataWrapper *) camel_mime_message_new ();
- } else {
- wrapper = camel_data_wrapper_new ();
- }
-
- camel_data_wrapper_construct_from_stream (wrapper, stream);
- camel_data_wrapper_set_mime_type (wrapper, mime_type);
- g_free (mime_type);
- } else {
- wrapper = camel_data_wrapper_new ();
- camel_data_wrapper_construct_from_stream (wrapper, stream);
- camel_data_wrapper_set_mime_type (wrapper, "application/octet-stream");
- }
-
- camel_object_unref (stream);
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper);
- camel_object_unref (wrapper);
-
- camel_mime_part_set_disposition (part, disposition);
- filename = g_path_get_basename (file_name);
- camel_mime_part_set_filename (part, filename);
- g_free (filename);
-
-#if 0
- /* Note: Outlook 2002 is broken with respect to Content-Ids on
- non-multipart/related parts, so as an interoperability
- workaround, don't set a Content-Id on these parts. Fixes
- bug #10032 */
- /* set the Content-Id */
- content_id = camel_header_msgid_generate ();
- camel_mime_part_set_content_id (part, content_id);
- g_free (content_id);
-#endif
-
- new = g_object_new (E_TYPE_CAL_ATTACHMENT, NULL);
- new->editor_gui = NULL;
- new->body = part;
- new->size = statbuf.st_size;
- new->guessed_type = TRUE;
- new->handle = NULL;
- new->is_available_local = TRUE;
-
- return new;
-}
-
-CalAttachment *
-cal_attachment_new_remote_file (const char *file_name,
- const char *disposition,
- CamelException *ex)
-{
- CalAttachment *new;
-
- g_return_val_if_fail (file_name != NULL, NULL);
-
- new = g_object_new (E_TYPE_CAL_ATTACHMENT, NULL);
- new->editor_gui = NULL;
- new->body = NULL;
- new->size = 0;
- new->guessed_type = FALSE;
- new->handle = NULL;
- new->is_available_local = FALSE;
- new->file_name = g_path_get_basename(file_name);
-
- return new;
-}
-
-void
-cal_attachment_build_remote_file (const char *file_name,
- CalAttachment *attachment,
- const char *disposition,
- CamelException *ex)
-{
- CamelMimePart *part;
- CamelDataWrapper *wrapper;
- CamelStream *stream;
- struct stat statbuf;
- char *mime_type;
- char *filename;
-
- g_return_if_fail (file_name != NULL);
-
- if (stat (file_name, &statbuf) < 0) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: %s"),
- file_name, g_strerror (errno));
- return;
- }
-
- /* return if it's not a regular file */
- if (!S_ISREG (statbuf.st_mode)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: not a regular file"),
- file_name);
- return;
- }
-
- stream = camel_stream_fs_new_with_name (file_name, O_RDONLY, 0);
- if (!stream) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: %s"),
- file_name, g_strerror (errno));
- return;
- }
-
- mime_type = cal_attachment_guess_mime_type (file_name);
- if (mime_type) {
- if (!g_ascii_strcasecmp (mime_type, "message/rfc822")) {
- wrapper = (CamelDataWrapper *) camel_mime_message_new ();
- } else {
- wrapper = camel_data_wrapper_new ();
- }
-
- camel_data_wrapper_construct_from_stream (wrapper, stream);
- camel_data_wrapper_set_mime_type (wrapper, mime_type);
- g_free (mime_type);
- } else {
- wrapper = camel_data_wrapper_new ();
- camel_data_wrapper_construct_from_stream (wrapper, stream);
- camel_data_wrapper_set_mime_type (wrapper, "application/octet-stream");
- }
-
- camel_object_unref (stream);
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper);
- camel_object_unref (wrapper);
-
- if (attachment->disposition)
- camel_mime_part_set_disposition (part, "inline");
- else
- camel_mime_part_set_disposition (part, "attachment");
-
- if (!attachment->file_name)
- filename = g_path_get_basename (file_name);
- else
- filename = g_path_get_basename (attachment->file_name);
-
- camel_mime_part_set_filename (part, filename);
- g_free (filename);
-
- if (attachment->description) {
- camel_mime_part_set_description (part, attachment->description);
- g_free (attachment->description);
- attachment->description = NULL;
- }
-
- attachment->editor_gui = NULL;
- attachment->body = part;
- attachment->size = statbuf.st_size;
- attachment->guessed_type = TRUE;
- if (attachment->file_name) {
- g_free (attachment->file_name);
- attachment->file_name = NULL;
- }
-}
-
-/**
- * cal_attachment_new_from_mime_part:
- * @part: a CamelMimePart
- *
- * Return value: a new CalAttachment based on the mime part
- **/
-CalAttachment *
-cal_attachment_new_from_mime_part (CamelMimePart *part)
-{
- CalAttachment *new;
- CamelMimePart *mime_part;
- CamelStream *stream;
-
- g_return_val_if_fail (CAMEL_IS_MIME_PART (part), NULL);
-
- stream = camel_stream_mem_new ();
- if (camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (part), stream) == -1) {
- camel_object_unref (stream);
- return NULL;
- }
-
- camel_stream_reset (stream);
- mime_part = camel_mime_part_new ();
-
- if (camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (mime_part), stream) == -1) {
- camel_object_unref (mime_part);
- camel_object_unref (stream);
- return NULL;
- }
-
- camel_object_unref (stream);
-
- new = g_object_new (E_TYPE_CAL_ATTACHMENT, NULL);
- new->editor_gui = NULL;
- new->body = mime_part;
- new->guessed_type = FALSE;
- new->size = 0;
-
- return new;
-}
-
-
-/* The attachment property dialog. */
-
-typedef struct {
- GtkWidget *dialog;
- GtkEntry *file_name_entry;
- GtkEntry *description_entry;
- GtkEntry *mime_type_entry;
- GtkToggleButton *disposition_checkbox;
- CalAttachment *attachment;
-} DialogData;
-
-static void
-destroy_dialog_data (DialogData *data)
-{
- g_free (data);
-}
-
-/*
- * fixme: I am converting EVERYTHING to/from UTF-8, although mime types
- * are in ASCII. This is not strictly necessary, but we want to be
- * consistent and possibly check for errors somewhere.
- */
-
-static void
-set_entry (GladeXML *xml, const char *widget_name, const char *value)
-{
- GtkEntry *entry;
-
- entry = GTK_ENTRY (glade_xml_get_widget (xml, widget_name));
- if (entry == NULL)
- g_warning ("Entry for `%s' not found.", widget_name);
- else
- gtk_entry_set_text (entry, value ? value : "");
-}
-
-static void
-connect_widget (GladeXML *gui, const char *name, const char *signal_name,
- GCallback func, gpointer data)
-{
- GtkWidget *widget;
-
- widget = glade_xml_get_widget (gui, name);
- g_signal_connect (widget, signal_name, func, data);
-}
-
-static void
-close_cb (GtkWidget *widget, gpointer data)
-{
- CalAttachment *attachment;
- DialogData *dialog_data;
-
- dialog_data = (DialogData *) data;
- attachment = dialog_data->attachment;
-
- gtk_widget_destroy (dialog_data->dialog);
- g_object_unref (attachment->editor_gui);
- attachment->editor_gui = NULL;
-
- g_object_unref (attachment);
-
- destroy_dialog_data (dialog_data);
-}
-
-static void
-ok_cb (GtkWidget *widget, gpointer data)
-{
- DialogData *dialog_data;
- CalAttachment *attachment;
- const char *str;
-
- dialog_data = (DialogData *) data;
- attachment = dialog_data->attachment;
-
- str = gtk_entry_get_text (dialog_data->file_name_entry);
- if (attachment->is_available_local) {
- camel_mime_part_set_filename (attachment->body, str);
- } else {
- if (attachment->file_name)
- g_free (attachment->file_name);
- attachment->file_name = g_strdup (str);
- }
-
- str = gtk_entry_get_text (dialog_data->description_entry);
- if (attachment->is_available_local) {
- camel_mime_part_set_description (attachment->body, str);
- } else {
- if (attachment->description)
- g_free (attachment->description);
- attachment->description = g_strdup (str);
- }
-
- str = gtk_entry_get_text (dialog_data->mime_type_entry);
- if (attachment->is_available_local) {
- camel_mime_part_set_content_type (attachment->body, str);
- camel_data_wrapper_set_mime_type(camel_medium_get_content_object(CAMEL_MEDIUM (attachment->body)), str);
- }
-
- if (attachment->is_available_local) {
- switch (gtk_toggle_button_get_active (dialog_data->disposition_checkbox)) {
- case 0:
- camel_mime_part_set_disposition (attachment->body, "attachment");
- break;
- case 1:
- camel_mime_part_set_disposition (attachment->body, "inline");
- break;
- default:
- /* Hmmmm? */
- break;
- }
- } else {
- attachment->disposition = gtk_toggle_button_get_active (dialog_data->disposition_checkbox);
- }
-
- changed (attachment);
- close_cb (widget, data);
-}
-
-static void
-response_cb (GtkWidget *widget, gint response, gpointer data)
-{
- if (response == GTK_RESPONSE_OK)
- ok_cb (widget, data);
- else
- close_cb (widget, data);
-}
-
-void
-cal_attachment_edit (CalAttachment *attachment, GtkWidget *parent)
-{
- CamelContentType *content_type;
- const char *disposition;
- DialogData *dialog_data;
- GladeXML *editor_gui;
- char *type;
- char *xmlfile;
-
- g_return_if_fail (attachment != NULL);
- g_return_if_fail (E_IS_CAL_ATTACHMENT (attachment));
-
- if (attachment->editor_gui != NULL) {
- GtkWidget *window;
-
- window = glade_xml_get_widget (attachment->editor_gui,
- "dialog");
- gdk_window_show (window->window);
- return;
- }
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "cal-attachment.glade",
- NULL);
- editor_gui = glade_xml_new (gladefile, NULL, NULL);
- g_free (gladefile);
-
- if (editor_gui == NULL) {
- g_warning ("Cannot load `cal-attachment.glade'");
- return;
- }
-
- attachment->editor_gui = editor_gui;
-
- gtk_window_set_transient_for
- (GTK_WINDOW (glade_xml_get_widget (editor_gui, "dialog")),
- GTK_WINDOW (gtk_widget_get_toplevel (parent)));
-
- dialog_data = g_new (DialogData, 1);
- g_object_ref (attachment);
- dialog_data->attachment = attachment;
- dialog_data->dialog = glade_xml_get_widget (editor_gui, "dialog");
- dialog_data->file_name_entry = GTK_ENTRY (
- glade_xml_get_widget (editor_gui, "file_name_entry"));
- dialog_data->description_entry = GTK_ENTRY (
- glade_xml_get_widget (editor_gui, "description_entry"));
- dialog_data->mime_type_entry = GTK_ENTRY (
- glade_xml_get_widget (editor_gui, "mime_type_entry"));
- dialog_data->disposition_checkbox = GTK_TOGGLE_BUTTON (
- glade_xml_get_widget (editor_gui, "disposition_checkbox"));
-
- if (attachment->is_available_local) {
- set_entry (editor_gui, "file_name_entry",
- camel_mime_part_get_filename (attachment->body));
- set_entry (editor_gui, "description_entry",
- camel_mime_part_get_description (attachment->body));
- content_type = camel_mime_part_get_content_type (attachment->body);
- type = camel_content_type_simple (content_type);
- set_entry (editor_gui, "mime_type_entry", type);
- g_free (type);
-
- disposition = camel_mime_part_get_disposition (attachment->body);
- gtk_toggle_button_set_active (dialog_data->disposition_checkbox,
- disposition && !g_ascii_strcasecmp (disposition, "inline"));
- } else {
- set_entry (editor_gui, "file_name_entry",
- attachment->file_name);
- set_entry (editor_gui, "description_entry",
- attachment->description);
- type = cal_attachment_guess_mime_type (attachment->file_name);
- if (type) {
- set_entry (editor_gui, "mime_type_entry", type);
- g_free (type);
- } else {
- set_entry (editor_gui, "mime_type_entry", "");
- }
- gtk_toggle_button_set_active (dialog_data->disposition_checkbox, attachment->disposition);
-
- }
-
- connect_widget (editor_gui, "dialog", "response", (GCallback)response_cb, dialog_data);
-#warning "signal connect while alive"
- /* make sure that when the composer gets hidden/closed that our windows also close */
- parent = gtk_widget_get_toplevel (parent);
- gtk_signal_connect_while_alive (GTK_OBJECT (parent), "destroy", (GCallback)close_cb, dialog_data,
- GTK_OBJECT (dialog_data->dialog));
- gtk_signal_connect_while_alive (GTK_OBJECT (parent), "hide", (GCallback)close_cb, dialog_data,
- GTK_OBJECT (dialog_data->dialog));
-}
diff --git a/calendar/gui/dialogs/cal-attachment.h b/calendar/gui/dialogs/cal-attachment.h
deleted file mode 100644
index c69e0a4173..0000000000
--- a/calendar/gui/dialogs/cal-attachment.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* cal-attachment.h
- *
- * Copyright (C) 2004 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Harish Krishnaswamy
- */
-#ifndef __CAL_ATTACHMENT_H__
-#define __CAL_ATTACHMENT_H__
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <glade/glade-xml.h>
-#include <camel/camel-mime-part.h>
-#include <camel/camel-exception.h>
-#include <libgnomevfs/gnome-vfs.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_CAL_ATTACHMENT (cal_attachment_get_type ())
-#define CAL_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CAL_ATTACHMENT, CalAttachment))
-#define CAL_ATTACHMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CAL_ATTACHMENT, CalAttachmentClass))
-#define E_IS_CAL_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CAL_ATTACHMENT))
-#define E_IS_CAL_ATTACHMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CAL_ATTACHMENT))
-
-typedef struct _CalAttachment CalAttachment;
-typedef struct _CalAttachmentClass CalAttachmentClass;
-
-struct _CalAttachment {
- GObject parent;
-
- GladeXML *editor_gui;
-
- CamelMimePart *body;
- gboolean guessed_type;
- gulong size;
-
- GdkPixbuf *pixbuf_cache;
-
- GnomeVFSAsyncHandle *handle;
- gboolean is_available_local;
- char *file_name;
- char *description;
- gboolean disposition;
- int index;
-};
-
-struct _CalAttachmentClass {
- GObjectClass parent_class;
-
- void (*changed) (CalAttachment *cal_attachment);
-};
-
-struct CalMimeAttach {
- char *filename;
- char *content_type;
- char *description;
- char *encoded_data;
- guint length;
-};
-
-GType cal_attachment_get_type (void);
-CalAttachment *cal_attachment_new (const char *file_name, const char *disposition, CamelException *ex);
-CalAttachment *cal_attachment_new_from_mime_part (CamelMimePart *part);
-CalAttachment * cal_attachment_new_remote_file (const char *file_name, const char *disposition, CamelException *ex);
-void cal_attachment_build_remote_file (const char *filename, CalAttachment *attachment, const char *disposition, CamelException *ex);
-void cal_attachment_edit (CalAttachment *attachment, GtkWidget *parent);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __CAL_ATTACHMENT_H__ */