/audio/

yle="color:#3a3935; font-weight:bold">create_transport (struct service_type *st); static void stype_menuitem_activate (GtkObject *menuitem, GtkObject *table); static void create_service_page (GtkWidget *vbox, const char *label_text, GList *services, GtkWidget *(*create_service)(struct service_type *), char **urlp); static void create_source_page (GtkWidget *vbox, GList *sources, char **urlp); static void create_transport_page (GtkWidget *vbox, GList *transports, char **urlp); static GList *add_service (GList *services, CamelProviderType type, CamelProvider *prov); static GdkImlibImage *load_image (const char *name); static void prepare_first (GnomeDruidPage *page, GnomeDruid *druid, gpointer user_data); static void cancel (GnomeDruid *druid, gpointer window); static void finish (GnomeDruidPage *page, gpointer arg1, gpointer window); static void on_cmdIdentityAdd_clicked (GtkWidget *widget, gpointer user_data); static void on_cmdIdentityEdit_clicked (GtkWidget *widget, gpointer user_data); static void on_cmdIdentityDelete_clicked (GtkWidget *widget, gpointer user_data); static void on_cmdSourcesAdd_clicked (GtkWidget *widget, gpointer user_data); static void on_cmdSourcesEdit_clicked (GtkWidget *widget, gpointer user_data); static void on_cmdSourcesDelete_clicked (GtkWidget *widget, gpointer user_data); static void on_cmdCamelServicesOK_clicked (GtkButton *button, gpointer user_data); static void on_cmdCamelServicesCancel_clicked (GtkButton *button, gpointer user_data); /* HTML Helpers */ static void html_size_req (GtkWidget *widget, GtkRequisition *requisition) { requisition->height = GTK_LAYOUT (widget)->height; } /* Returns a GtkHTML which is already inside a GtkScrolledWindow. If * @white is TRUE, the GtkScrolledWindow will be inside a GtkFrame. */ static GtkWidget * html_new (gboolean white) { GtkWidget *html, *scrolled, *frame; GtkStyle *style; html = gtk_html_new (); GTK_LAYOUT (html)->height = 0; gtk_signal_connect (GTK_OBJECT (html), "size_request", GTK_SIGNAL_FUNC (html_size_req), NULL); gtk_html_set_editable (GTK_HTML (html), FALSE); style = gtk_rc_get_style (html); if (style) { gtk_html_set_default_background_color (GTK_HTML (html), white ? &style->white : &style->bg[0]); } gtk_widget_set_sensitive (html, FALSE); scrolled = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_NEVER, GTK_POLICY_NEVER); gtk_container_add (GTK_CONTAINER (scrolled), html); if (white) { frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); gtk_container_add (GTK_CONTAINER (frame), scrolled); gtk_widget_show_all (frame); } else gtk_widget_show_all (scrolled); return html; } static void put_html (GtkHTML *html, char *text) { GtkHTMLStream *handle; text = e_text_to_html (text, E_TEXT_TO_HTML_CONVERT_NL); handle = gtk_html_begin (html); gtk_html_write (html, handle, "<HTML><BODY>", 12); gtk_html_write (html, handle, text, strlen (text)); gtk_html_write (html, handle, "</BODY></HTML>", 14); g_free (text); gtk_html_end (html, handle, GTK_HTML_STREAM_OK); } /* Error helper */ static void error_dialog (GtkWidget *parent_finder, const char *fmt, ...) { GtkWidget *parent, *dialog; char *msg; va_list ap; parent = gtk_widget_get_ancestor (parent_finder, GTK_TYPE_WINDOW); va_start (ap, fmt); msg = g_strdup_vprintf (fmt, ap); va_end (ap); dialog = gnome_error_dialog_parented (msg, GTK_WINDOW (parent)); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); g_free (msg); } /* Identity page */ static void identity_note_doneness (GtkObject *page, gpointer user_data) { GtkWidget *exit_button; GtkEntry *entry; char *data; if (!(exit_button = gtk_object_get_data (page, "exit_button"))) exit_button = gtk_object_get_data (page, "ok_button"); entry = gtk_object_get_data (page, "name"); data = gtk_entry_get_text (entry); if (data && *data) { entry = gtk_object_get_data (page, "addr"); data = gtk_entry_get_text (entry); } gtk_widget_set_sensitive (exit_button, data && *data); } static void prepare_identity (GnomeDruidPage *page, gpointer arg1, gpointer user_data) { identity_note_doneness (user_data, NULL); } static gboolean identity_next (GnomeDruidPage *page, gpointer arg1, gpointer user_data) { GtkObject *box = user_data; GtkEntry *addr = gtk_object_get_data (box, "addr"); char *data, *at; /* FIXME: we need more sanity checking than this. */ data = gtk_entry_get_text (addr); at = strchr (data, '@'); if (!at || !strchr (at + 1, '.')) { error_dialog (GTK_WIDGET (page), "Email address must be " "of the form \"user@domain\"."); return TRUE; } g_free (username); username = g_strndup (data, at - data); return FALSE; } static void destroy_identity (GtkObject *table, gpointer idrecp) { struct identity_record *idrec = idrecp; GtkWidget *entry; entry = gtk_object_get_data (table, "name"); idrec->name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); entry = gtk_object_get_data (table, "addr"); idrec->address = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); entry = gtk_object_get_data (table, "org"); idrec->organization = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); entry = gtk_object_get_data (table, "sig"); idrec->sigfile = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); } static void create_identity_page (GtkWidget *vbox, struct identity_record *idrec) { GtkWidget *html, *table; GtkWidget *name, *addr, *org, *sig; GtkWidget *name_entry, *addr_entry, *org_entry, *sig_entry; GtkWidget *hsep; char *user; struct passwd *pw = NULL; html = html_new (FALSE); put_html (GTK_HTML (html), _("Enter your name and email address to be used in " "outgoing mail. You may also, optionally, enter the " "name of your organization, and the name of a file " "to read your signature from.")); gtk_box_pack_start (GTK_BOX (vbox), html->parent, FALSE, TRUE, 0); table = gtk_table_new (5, 2, FALSE); gtk_widget_set_name (table, "table"); gtk_table_set_row_spacings (GTK_TABLE (table), 10); gtk_table_set_col_spacings (GTK_TABLE (table), 6); gtk_container_set_border_width (GTK_CONTAINER (table), 8); gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0); gtk_signal_connect (GTK_OBJECT (vbox), "destroy", GTK_SIGNAL_FUNC (destroy_identity), idrec); name = gtk_label_new (_("Full name:")); gtk_table_attach (GTK_TABLE (table), name, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); gtk_misc_set_alignment (GTK_MISC (name), 1, 0.5); name_entry = gtk_entry_new (); gtk_table_attach (GTK_TABLE (table), name_entry, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_object_set_data (GTK_OBJECT (vbox), "name", name_entry); if (!idrec || !idrec->name) { user = getenv ("USER"); if (user) pw = getpwnam (user); else pw = getpwuid (getuid ()); } if ((idrec && idrec->name) || (pw && pw->pw_gecos && *pw->pw_gecos)) { char *name; if (idrec && idrec->name) name = g_strdup (idrec->name); else name = g_strndup (pw->pw_gecos, strcspn (pw->pw_gecos, ",")); gtk_entry_set_text (GTK_ENTRY (name_entry), name); g_free (name); } addr = gtk_label_new (_("Email address:")); gtk_table_attach (GTK_TABLE (table), addr, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); gtk_misc_set_alignment (GTK_MISC (addr), 1, 0.5); addr_entry = gtk_entry_new (); if (idrec && idrec->address) gtk_entry_set_text (GTK_ENTRY (addr_entry), idrec->address); gtk_table_attach (GTK_TABLE (table), addr_entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_object_set_data (GTK_OBJECT (vbox), "addr", addr_entry); gtk_signal_connect_object (GTK_OBJECT (name_entry), "changed", GTK_SIGNAL_FUNC (identity_note_doneness), GTK_OBJECT (vbox)); gtk_signal_connect_object (GTK_OBJECT (addr_entry), "changed", GTK_SIGNAL_FUNC (identity_note_doneness), GTK_OBJECT (vbox)); hsep = gtk_hseparator_new (); gtk_table_attach (GTK_TABLE (table), hsep, 0, 2, 2, 3, GTK_FILL, 0, 0, 8); org = gtk_label_new (_("Organization:")); gtk_table_attach (GTK_TABLE (table), org, 0, 1, 3, 4, GTK_FILL, 0, 0, 0); gtk_misc_set_alignment (GTK_MISC (org), 1, 0.5); org_entry = gtk_entry_new (); if (idrec && idrec->organization) gtk_entry_set_text (GTK_ENTRY (org_entry), idrec->organization); gtk_table_attach (GTK_TABLE (table), org_entry, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_object_set_data (GTK_OBJECT (vbox), "org", org_entry); sig = gtk_label_new (_("Signature file:")); gtk_table_attach (GTK_TABLE (table), sig, 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0); gtk_misc_set_alignment (GTK_MISC (sig), 1, 0); sig_entry = gnome_file_entry_new (NULL, _("Signature File")); if (idrec && idrec->sigfile) gtk_entry_set_text (GTK_ENTRY (sig_entry), idrec->sigfile); gtk_table_attach (GTK_TABLE (table), sig_entry, 1, 2, 4, 5, GTK_FILL, 0, 0, 0); gnome_file_entry_set_default_path (GNOME_FILE_ENTRY (sig_entry), g_get_home_dir ()); gtk_object_set_data (GTK_OBJECT (vbox), "sig", gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (sig_entry))); gtk_widget_show_all (table); } /* Source/Transport pages */ static void service_note_doneness (GtkObject *page, gpointer user_data) { GtkObject *box; GtkWidget *button; GtkEntry *entry; char *data; gboolean sensitive = TRUE; entry = gtk_object_get_data (page, "server_entry"); if (entry) { data = gtk_entry_get_text (entry); if (!data || !*data) sensitive = FALSE; } if (sensitive) { entry = gtk_object_get_data (page, "user_entry"); if (entry) { data = gtk_entry_get_text (entry); if (!data || !*data) sensitive = FALSE; } } if (sensitive) { entry = gtk_object_get_data (page, "path_entry"); if (entry) { data = gtk_entry_get_text (entry); if (!data || !*data) sensitive = FALSE; } } button = gtk_object_get_data (page, "autodetect"); if (button) gtk_widget_set_sensitive (button, sensitive); box = gtk_object_get_data (page, "box"); if (!(button = gtk_object_get_data (box, "exit_button"))) button = gtk_object_get_data (box, "ok_button"); if (button) gtk_widget_set_sensitive (button, sensitive); } static void prepare_service (GnomeDruidPage *page, gpointer arg1, gpointer user_data) { GtkObject *box = user_data; GtkNotebook *notebook = gtk_object_get_data (box, "notebook"); GtkWidget *table; GtkEntry *entry; table = gtk_notebook_get_nth_page (notebook, gtk_notebook_get_current_page (notebook)); if (username) { char *data = NULL; entry = gtk_object_get_data (GTK_OBJECT (table), "user_entry"); if (entry) { data = gtk_entry_get_text (entry); if (!data || !*data) gtk_entry_set_text (entry, username); } } service_note_doneness (GTK_OBJECT (table), NULL); } static void auth_menuitem_activate (GtkObject *menuitem, GtkHTML *html) { CamelServiceAuthType *authtype; authtype = gtk_object_get_data (menuitem, "authtype"); put_html (html, authtype->description); } static void fill_auth_menu (GtkOptionMenu *optionmenu, GtkHTML *html, GList *authtypes) { CamelServiceAuthType *authtype; GtkWidget *menu, *item, *firstitem = NULL; menu = gtk_menu_new (); gtk_option_menu_set_menu (optionmenu, menu); for (; authtypes; authtypes = authtypes->next) { authtype = authtypes->data; item = gtk_menu_item_new_with_label (_(authtype->name)); if (!firstitem) firstitem = item; gtk_menu_append (GTK_MENU (menu), item); gtk_object_set_data (GTK_OBJECT (item), "authtype", authtype); gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (auth_menuitem_activate), html); } gtk_widget_show_all (menu); gtk_option_menu_set_history (optionmenu, 0); if (firstitem) auth_menuitem_activate (GTK_OBJECT (firstitem), html); } static char * get_service_url (GtkObject *table) { CamelURL *url; GtkEditable *editable; GtkOptionMenu *auth_optionmenu; char *url_str; url = g_new0 (CamelURL, 1); url->protocol = g_strdup (gtk_object_get_data (table, "protocol")); editable = gtk_object_get_data (table, "user_entry"); if (editable) url->user = gtk_editable_get_chars (editable, 0, -1); editable = gtk_object_get_data (table, "server_entry"); if (editable) url->host = gtk_editable_get_chars (editable, 0, -1); editable = gtk_object_get_data (table, "path_entry"); if (editable) url->path = gtk_editable_get_chars (editable, 0, -1); auth_optionmenu = gtk_object_get_data (table, "auth_optionmenu"); if (auth_optionmenu) { GtkWidget *menu, *item; CamelServiceAuthType *authtype; menu = gtk_option_menu_get_menu (auth_optionmenu); if (menu) { item = gtk_menu_get_active (GTK_MENU (menu)); authtype = gtk_object_get_data (GTK_OBJECT (item), "authtype"); if (*authtype->authproto) url->authmech = g_strdup (authtype->authproto); } } url_str = camel_url_to_string (url, FALSE); camel_url_free (url); return url_str; } static void set_service_url (GtkObject *table, char *url_str) { CamelURL *url; GtkEditable *editable;