1 /* Internal MIME types implementation dialogs */
11 #include "bfu/dialog.h"
13 #include "config/options.h"
14 #include "mime/dialogs.h"
15 #include "intl/gettext/libintl.h"
16 #include "terminal/terminal.h"
17 #include "util/color.h"
18 #include "util/conv.h"
19 #include "util/memory.h"
20 #include "util/string.h"
23 static struct option
*
24 get_real_opt(unsigned char *base
, unsigned char *id
)
26 struct option
*opt
= get_opt_rec_real(config_options
, base
);
27 struct string translated
;
31 if (init_string(&translated
)
32 && add_optname_to_string(&translated
, id
, strlen(id
)))
33 opt
= get_opt_rec_real(opt
, translated
.source
);
35 done_string(&translated
);
42 really_del_ext(void *fcp
)
44 struct option
*opt
= get_real_opt("mime.extension",
45 (unsigned char *) fcp
);
47 if (opt
) delete_option(opt
);
51 menu_del_ext(struct terminal
*term
, void *fcp
, void *xxx2
)
53 /* [gettext_accelerator_context(menu_del_ext)] */
54 struct option
*opt
= NULL
;
55 unsigned char *extension
= fcp
;
57 if (!extension
) return;
59 opt
= get_real_opt("mime.extension", extension
);
65 msg_box(term
, getml(extension
, (void *) NULL
), MSGBOX_FREE_TEXT
,
66 N_("Delete extension"), ALIGN_CENTER
,
67 msg_text(term
, N_("Delete extension %s -> %s?"),
68 extension
, opt
->value
.string
),
70 MSG_BOX_BUTTON(N_("~Yes"), really_del_ext
, B_ENTER
),
71 MSG_BOX_BUTTON(N_("~No"), NULL
, B_ESC
));
76 unsigned char ext_orig
[MAX_STR_LEN
];
77 unsigned char ext
[MAX_STR_LEN
];
78 unsigned char ct
[MAX_STR_LEN
];
82 add_mime_extension(void *data
)
84 struct extension
*ext
= data
;
87 if (!ext
|| !init_string(&name
)) return;
89 add_to_string(&name
, "mime.extension.");
90 add_optname_to_string(&name
, ext
->ext
, strlen(ext
->ext
));
92 really_del_ext(ext
->ext_orig
); /* ..or rename ;) */
93 safe_strncpy(get_opt_str(name
.source
), ext
->ct
, MAX_STR_LEN
);
94 option_changed(NULL
, get_opt_rec(config_options
, name
.source
));
99 menu_add_ext(struct terminal
*term
, void *fcp
, void *xxx2
)
101 /* [gettext_accelerator_context(menu_add_ext)] */
102 struct extension
*new;
105 #define MIME_WIDGETS_COUNT 4
106 dlg
= calloc_dialog(MIME_WIDGETS_COUNT
, sizeof(*new));
112 new = (struct extension
*) get_dialog_offset(dlg
, MIME_WIDGETS_COUNT
);
115 struct option
*opt
= get_real_opt("mime.extension", fcp
);
118 safe_strncpy(new->ext
, fcp
, MAX_STR_LEN
);
119 safe_strncpy(new->ct
, opt
->value
.string
, MAX_STR_LEN
);
120 safe_strncpy(new->ext_orig
, fcp
, MAX_STR_LEN
);
126 dlg
->title
= _("Extension", term
);
127 dlg
->layouter
= generic_dialog_layouter
;
129 add_dlg_field(dlg
, _("Extension(s)", term
), 0, 0, check_nonempty
, MAX_STR_LEN
, new->ext
, NULL
);
130 add_dlg_field(dlg
, _("Content-Type", term
), 0, 0, check_nonempty
, MAX_STR_LEN
, new->ct
, NULL
);
132 add_dlg_ok_button(dlg
, _("~OK", term
), B_ENTER
, add_mime_extension
, new);
133 add_dlg_button(dlg
, _("~Cancel", term
), B_ESC
, cancel_dialog
, NULL
);
135 add_dlg_end(dlg
, MIME_WIDGETS_COUNT
);
137 do_dialog(term
, dlg
, getml(dlg
, (void *) NULL
));
141 static struct menu_item mi_no_ext
[] = {
142 INIT_MENU_ITEM(N_("No extensions"), NULL
, ACT_MAIN_NONE
, NULL
, NULL
, NO_SELECT
),
147 menu_list_ext(struct terminal
*term
, void *fn_
, void *xxx
)
149 menu_func_T fn
= fn_
;
150 LIST_OF(struct option
) *opt_tree
= get_opt_tree("mime.extension");
152 struct menu_item
*mi
= NULL
;
154 foreachback (opt
, *opt_tree
) {
155 struct string translated
;
156 unsigned char *translated2
;
157 unsigned char *optptr2
;
159 if (!strcmp(opt
->name
, "_template_")) continue;
161 if (!init_string(&translated
)
162 || !add_real_optname_to_string(&translated
, opt
->name
,
163 strlen(opt
->name
))) {
164 done_string(&translated
);
169 mi
= new_menu(FREE_ANY
| NO_INTL
);
171 done_string(&translated
);
176 translated2
= memacpy(translated
.source
, translated
.length
);
177 optptr2
= stracpy(opt
->value
.string
);
179 if (translated2
&& optptr2
) {
180 add_to_menu(&mi
, translated
.source
, optptr2
, ACT_MAIN_NONE
,
183 mem_free_if(optptr2
);
184 mem_free_if(translated2
);
185 done_string(&translated
);
189 if (!mi
) mi
= mi_no_ext
;
190 do_menu(term
, mi
, NULL
, 0);