Elinks currently only support GB2312 as Chinese encoding, but GBK and
[elinks.git] / src / mime / dialogs.c
blob68e2373dc89048855288d8fe7bd8c48b549e2821
1 /* Internal MIME types implementation dialogs */
3 #ifdef HAVE_CONFIG_H
4 #include "config.h"
5 #endif
7 #include <string.h>
9 #include "elinks.h"
11 #include "bfu/dialog.h"
12 #include "bfu/menu.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;
29 assert(opt);
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);
37 return opt;
41 static void
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);
50 void
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);
60 if (!opt) {
61 mem_free(extension);
62 return;
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),
69 extension, 2,
70 MSG_BOX_BUTTON(N_("~Yes"), really_del_ext, B_ENTER),
71 MSG_BOX_BUTTON(N_("~No"), NULL, B_ESC));
75 struct extension {
76 unsigned char ext_orig[MAX_STR_LEN];
77 unsigned char ext[MAX_STR_LEN];
78 unsigned char ct[MAX_STR_LEN];
81 static void
82 add_mime_extension(void *data)
84 struct extension *ext = data;
85 struct string name;
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, NULL), ext->ct, MAX_STR_LEN);
94 option_changed(NULL, get_opt_rec(config_options, name.source));
95 done_string(&name);
98 void
99 menu_add_ext(struct terminal *term, void *fcp, void *xxx2)
101 /* [gettext_accelerator_context(menu_add_ext)] */
102 struct extension *new;
103 struct dialog *dlg;
105 #define MIME_WIDGETS_COUNT 4
106 dlg = calloc_dialog(MIME_WIDGETS_COUNT, sizeof(*new));
107 if (!dlg) {
108 mem_free_if(fcp);
109 return;
112 new = (struct extension *) get_dialog_offset(dlg, MIME_WIDGETS_COUNT);
114 if (fcp) {
115 struct option *opt = get_real_opt("mime.extension", fcp);
117 if (opt) {
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);
123 mem_free(fcp);
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),
143 NULL_MENU_ITEM
146 void
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", NULL);
151 struct option *opt;
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);
165 continue;
168 if (!mi) {
169 mi = new_menu(FREE_ANY | NO_INTL);
170 if (!mi) {
171 done_string(&translated);
172 return;
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,
181 fn, translated2, 0);
182 } else {
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);