2 * Drivers acquiring installation utility
3 * Copyright (C) 2003 Jan Kratochvil <project-captive@jankratochvil.net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; exactly version 2 of June 1991 is required
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "ui-line.h" /* self */
23 #include <glib/gmessages.h>
24 #include "moduriload.h"
30 #ifdef HAVE_LIBREADLINE
31 #include <readline/readline.h>
32 #ifdef HAVE_READLINE_HISTORY_H
33 #include <readline/history.h>
34 #endif /* HAVE_READLINE_HISTORY_H */
35 #endif /* HAVE_LIBREADLINE */
37 #include <captive/macros.h>
38 #include <captive/captivemodid.h>
40 static void print_ui_line_module_available(struct module_available *module_available)
44 g_return_if_fail(module_available!=NULL);
45 g_return_if_fail(module_available->module!=NULL);
47 if (G_MININT==(priority_best=captive_captivemodid_module_type_best_priority_lookup(
48 captivemodid,module_available->module->type)))
49 printf(_("Found best available \"%s\": %s\n"),module_available->module->type,module_available->module->id);
51 printf(_("Found although not best \"%s\" (pri=%d; best=%d): %s\n"),
52 module_available->module->type,module_available->module->priority,priority_best,
53 module_available->module->id);
56 static void ui_line_module_available_notify(struct module_available *module_available)
58 g_return_if_fail(module_available!=NULL);
60 print_ui_line_module_available(module_available);
61 printf(_("at URI: %s\n"),module_available->uri_text);
64 static gboolean all_modules_found=FALSE;
66 static void ui_line_all_modules_found_notify(void)
68 puts(_("All modules found in their best known versions."));
69 all_modules_found=TRUE;
72 static gboolean aborted=FALSE;
73 static time_t search_start_time;
74 static gboolean abort_msg_printed=FALSE;
76 static gboolean ui_line_progress(GnomeVFSURI *uri)
79 struct timeval timeval;
80 static int stdin_isatty=-1;
82 /* 'uri' may be NULL */
86 if (all_modules_found)
89 if (!search_start_time)
90 search_start_time=time(NULL);
91 if (!abort_msg_printed && time(NULL)>=search_start_time+2) {
92 puts(_("Searching... Hit ENTER to abort."));
93 abort_msg_printed=TRUE;
97 stdin_isatty=isatty(0);
103 if (1==select(1,&readfds,NULL,NULL,&timeval)) {
106 puts(_("*** OPERATION ABORTED ***"));
114 static void ui_line_progress_reset(void)
118 abort_msg_printed=FALSE;
121 static char *line_read(const gchar *prompt)
123 #ifdef HAVE_LIBREADLINE
125 #else /* HAVE_LIBREADLINE */
127 #endif /* HAVE_LIBREADLINE */
129 g_return_val_if_fail(prompt!=NULL,NULL);
131 ui_line_progress_reset();
133 #ifdef HAVE_LIBREADLINE
134 line=readline(prompt);
135 #ifdef HAVE_ADD_HISTORY
138 #endif /* HAVE_ADD_HISTORY */
139 #else /* HAVE_LIBREADLINE */
140 fputs(prompt,stdout); fflush(stdout);
141 line=fgets(line,sizeof(line),stdin);
142 #endif /* HAVE_LIBREADLINE */
145 #ifndef HAVE_LIBREADLINE
146 if (line && (s=strchr(line,'\n')))
148 #endif /* HAVE_LIBREADLINE */
153 /* FIXME: HACK: Encode module essentiality to '.captivemodid.xml'. */
154 struct print_modules_available_foreach_param {
156 gboolean ntoskrnl_exe_found;
157 gboolean ntfs_sys_found;
160 static void print_modules_available_foreach
161 (const xmlChar *type /* key */,struct module_available *module_available /* value */,
162 struct print_modules_available_foreach_param *param /* user_data */)
164 g_return_if_fail(type!=NULL);
165 g_return_if_fail(module_available!=NULL);
166 g_return_if_fail(module_available->module!=NULL);
167 g_return_if_fail(!strcmp((const char *)type,(const char *)module_available->module->type));
168 g_return_if_fail(param!=NULL);
171 print_ui_line_module_available(module_available);
173 /**/ if (!strcmp((const char *)type,"ntoskrnl.exe"))
174 param->ntoskrnl_exe_found=TRUE;
175 else if (!strcmp((const char *)type,"ntfs.sys"))
176 param->ntfs_sys_found=TRUE;
179 /* Returns: TRUE if essential modules were found at any priority. */
180 static gboolean print_modules_available(void)
182 struct print_modules_available_foreach_param param;
184 static gboolean first_time=TRUE;
187 param.do_print=!first_time;
188 param.ntoskrnl_exe_found=FALSE;
189 param.ntfs_sys_found=FALSE;
190 if (module_available_hash)
191 g_hash_table_foreach(module_available_hash,(GHFunc)print_modules_available_foreach,¶m);
192 r=param.ntoskrnl_exe_found && param.ntfs_sys_found;
194 if (!param.ntoskrnl_exe_found)
195 printf(_("Still needed essential module: %s\n"),"ntoskrnl.exe");
196 if (!param.ntfs_sys_found)
197 printf(_("Still needed essential module: %s\n"),"ntfs.sys");
200 "Essential modules (\"ntoskrnl.exe\" and \"ntfs.sys\") are available.\n"
201 "You may still want to get their better version and/or more modules."));
209 static gboolean ui_line_interactive_ask(const gchar *prompt)
212 gboolean essentials_available;
214 if (all_modules_found)
217 essentials_available=print_modules_available();
220 line=line_read(captive_printf_alloca(_("Enter 'y' for YES, 'n' to NO%s [hit ENTER for YES]: "),
221 (!essentials_available ? "" : _(", 'd' if DONE"))));
224 if (!strncasecmp(line,_("yes"),strlen(line))) {
228 if (!strncasecmp(line,_("no"),strlen(line))) {
232 if (!strncasecmp(line,_("done"),strlen(line))) {
234 puts(final_text(all_modules_found));
242 static void ui_line_interactive(void)
244 #ifndef HAVE_LIBREADLINE
245 puts(_("Line editing not available, please recompile with readline library installed"));
246 #endif /* HAVE_LIBREADLINE */
248 if (ui_line_interactive_ask(_("Quickly scan your local disks to find needed drivers?")))
250 while (!all_modules_found) {
253 if (ui_line_interactive_ask(_(
254 "Detection of language localized MS-Windows drivers is missing."
255 " You may need to copy localized ntfs.sys and ntoskrnl.exe to /var/lib/captive/ by cp(1) command;"
256 " contact me for their proper identification, please.\n"
257 "Fully scan all directories of your local disks?")))
260 if (!all_modules_found)
262 print_modules_available();
263 puts(_("Do you want to enter your custom search path and/or files? You can also enter web URL."));
264 line=line_read(_("Enter pathname or URL [hit ENTER to skip it]: "));
268 if (!(uri=gnome_vfs_uri_new(line)))
269 printf(_("Error paring URI: %s"),line);
271 mod_uri_load_base_reporting(uri);
272 gnome_vfs_uri_unref(uri);
280 } while (!all_modules_found && line);
282 if (ui_line_interactive_ask(_(
283 "You can download the best available version of needed drivers from Microsoft. They can be found in Microsoft Windows XP Service Pack 2 Checked Build.\n"
284 "URL: http://msdn.microsoft.com/security/productinfo/xpsp2\n"
285 "Legal: In some countries you need to have valid Microsoft Windows XP license to use it.\n"
286 "It is needed to download approx 61MB of data right now out of the 307MB file size. You can also download the file separately and load it in the previous screen if some problems occur.\n")))
288 if (!all_modules_found)
289 puts(_("\nWe tried all available drivers acquiration methods - the options will start again."));
292 puts(final_text(all_modules_found));
295 gboolean ui_line_init(void)
297 acquire_module_available_notify=ui_line_module_available_notify;
298 acquire_module_all_modules_found_notify=ui_line_all_modules_found_notify;
299 ui_progress=ui_line_progress;
300 ui_interactive=ui_line_interactive;
301 /* 'captive_captivemodid_module_best_priority_notify' left NULL. */