Integrate static packaing into the CVS HEAD; make it even default.
[captive.git] / src / install / acquire / main.c
index 5983c1e..23e9421 100644 (file)
 #include <libgnomevfs/gnome-vfs-init.h>
 #include "ui-line.h"
 #include "microsoftcom.h"
+#include <libgnomevfs/gnome-vfs-uri.h>
+#include "diskscan.h"
+#include "moduriload.h"
+#include <libgnome/gnome-program.h>
+#include <libgnomeui/gnome-ui-init.h>
+#include <setjmp.h>
+#include "ui-gnome.h"
 
 #include <captive/macros.h>
-
-
-#include "captivemodid.h"
-#include <glib/glist.h>
-#include "moduriload.h"
-#include "diskscan.h"
+#include <captive/client.h>
 
 
 int optarg_verbose;
@@ -48,6 +50,7 @@ int optarg_dry;
 static int optarg_microsoft_com;
 static int optarg_scan_disks;
 static int optarg_scan_disks_quick;
+static int optarg_text;
 static char *optarg_modid_path=G_STRINGIFY(SYSCONFDIR) "/w32-mod-id.captivemodid.xml";
 static GList *optarg_scan_path_list;   /* of (char *) */
 
@@ -68,6 +71,8 @@ static const struct poptOption popt_table[]={
                        argDescrip: (argDescripP), \
                }
 
+               BUG_ACQUIRE_POPT(0  ,"text"            ,POPT_ARG_NONE  ,&optarg_text   ,0,
+                               N_("Disable Gnome UI; --text must be first argument"),NULL),
                BUG_ACQUIRE_POPT('v',"verbose"         ,POPT_ARG_NONE  ,&optarg_verbose,0,N_("Display additional debug information"),NULL),
                BUG_ACQUIRE_POPT('n',"dry"             ,POPT_ARG_NONE  ,&optarg_dry    ,0,N_("No modifications, no files written"),NULL),
                BUG_ACQUIRE_POPT(0  ,"modid-path"      ,POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,&optarg_modid_path,0,
@@ -81,10 +86,14 @@ static const struct poptOption popt_table[]={
                                N_("Download from microsoft.com; Legal: You may need to have valid Microsoft Windows XP license."),NULL),
 
 #undef BUG_ACQUIRE_POPT
-               POPT_AUTOHELP
                POPT_TABLEEND
                };
 
+static const struct poptOption popt_table_autohelp[]={
+               { NULL,'\0',POPT_ARG_INCLUDE_TABLE,(struct poptOption *)&popt_table,0,PACKAGE },
+               POPT_AUTOHELP
+               POPT_TABLEEND
+               };
 
 /* poptCallbackType captive_popt_callback */
 static void acquire_popt_callback
@@ -100,12 +109,15 @@ static void acquire_popt_callback
 
 void (*ui_interactive)(void);
 
-static gboolean ui_search_is_aborted_dummy(void)
+static gboolean ui_progress_dummy(GnomeVFSURI *uri)
 {
+       /* 'uri' may be NULL */
+
        return FALSE;   /* not aborted */
 }
 
-gboolean (*ui_search_is_aborted)(void)=ui_search_is_aborted_dummy;
+gboolean (*ui_progress)(GnomeVFSURI *uri)=ui_progress_dummy;
+void (*ui_progress_bar)(gint done,gint length);
 
 static GList *mod_uri_list_local;
 static void mod_uri_list_local_init(void)
@@ -138,12 +150,12 @@ void scan_disks(void)
 
 void microsoft_com(void)
 {
-       g_list_foreach(mod_uri_microsoftcom_list(),(GFunc)mod_uri_load,NULL);
+       g_list_foreach(mod_uri_microsoftcom_list(),(GFunc)mod_uri_load_base_reporting,NULL);
 }
 
 static void scan_batch(void)
 {
-       g_list_foreach(optarg_scan_path_list,(GFunc)mod_uri_load,NULL);
+       g_list_foreach(optarg_scan_path_list,(GFunc)mod_uri_load_base_reporting,NULL);
 
        if (optarg_scan_disks_quick)
                scan_disks_quick();
@@ -153,11 +165,32 @@ static void scan_batch(void)
                microsoft_com();
 }
 
+static jmp_buf gnome_init_atexit_jmpbuf;
+static gboolean gnome_init_atexit_disable;
+
+static void gnome_init_atexit_handler(void)
+{
+       if (gnome_init_atexit_disable)
+               return;
+
+       longjmp(gnome_init_atexit_jmpbuf,1);
+       g_assert_not_reached();
+       _exit(EXIT_FAILURE);
+}
+
+gboolean gnome_init_g_log_handler_hit;
+static void gnome_init_g_log_handler(const gchar *log_domain,GLogLevelFlags log_level,const gchar *message,gpointer user_data)
+{
+       gnome_init_g_log_handler_hit=TRUE;
+       g_log_default_handler(log_domain,log_level,message,user_data);
+}
+
 int main(int argc,char **argv)
 {
 poptContext context;
 int errint;
 gboolean is_interactive;
+gboolean no_gnome;
 
 #if 0
        g_log_set_always_fatal(~(0
@@ -167,37 +200,72 @@ gboolean is_interactive;
                        ));
 #endif
 
-       /* Initialize the i18n stuff */
-       setlocale(LC_ALL,"");
-       bindtextdomain(PACKAGE,LOCALEDIR);
-       textdomain(PACKAGE);
+       captive_standalone_init();
 
        if (!gnome_vfs_init())
                g_error(_("GnomeVFS failed to initialize"));
 
-       context=poptGetContext(
-                       PACKAGE,        /* name */
-                       argc,(/*en-const*/const char **)argv,   /* argc,argv */
-                       popt_table,     /* options */
-                       POPT_CONTEXT_POSIXMEHARDER);    /* flags; && !POPT_CONTEXT_KEEP_FIRST */
-       if (context==NULL) {
-               g_assert_not_reached(); /* argument recognization args_error */
-               return EXIT_FAILURE;
-               }
-       errint=poptReadDefaultConfig(context,
-                       TRUE);  /* useEnv */
-       if (errint!=0) {
-               g_assert_not_reached(); /* argument recognization args_error */
-               return EXIT_FAILURE;
+       if (argv[1] && !strcmp(argv[1],"--text"))
+               optarg_text=1;
+
+       no_gnome=(optarg_text || !getenv("DISPLAY") || !*getenv("DISPLAY"));
+
+       if (no_gnome) {
+               context=poptGetContext(
+                               PACKAGE,        /* name */
+                               argc,(/*en-const*/const char **)argv,   /* argc,argv */
+                               popt_table_autohelp,    /* options */
+                               POPT_CONTEXT_POSIXMEHARDER);    /* flags; && !POPT_CONTEXT_KEEP_FIRST */
+               if (context==NULL) {
+                       g_assert_not_reached(); /* argument recognization args_error */
+                       return EXIT_FAILURE;
+                       }
+               errint=poptReadDefaultConfig(context,
+                               TRUE);  /* useEnv */
+               if (errint!=0) {
+                       g_assert_not_reached(); /* argument recognization args_error */
+                       return EXIT_FAILURE;
+                       }
+               errint=poptGetNextOpt(context);
+               if (errint!=-1) {
+                       g_assert_not_reached(); /* some non-callbacked argument reached */
+                       return EXIT_FAILURE;
+                       }
+               if (poptPeekArg(context)) {
+                       g_error(_("No arguments expected"));
+                       return EXIT_FAILURE;
+                       }
                }
-       errint=poptGetNextOpt(context);
-       if (errint!=-1) {
-               g_assert_not_reached(); /* some non-callbacked argument reached */
-               return EXIT_FAILURE;
-               }
-       if (poptPeekArg(context)) {
-               g_error(_("No arguments expected"));
-               return EXIT_FAILURE;
+       else {
+GnomeProgram *gnome_program;
+guint handler_id;
+
+               captive_standalone_gnome_init();
+               gnome_init_atexit_disable=FALSE;
+               g_atexit(gnome_init_atexit_handler);
+               gnome_init_g_log_handler_hit=FALSE;
+               handler_id=g_log_set_handler(
+                               "Gtk",  /* log_domain */
+                               G_LOG_LEVEL_WARNING,    /* log_levels */
+                               gnome_init_g_log_handler,       /* log_func */
+                               NULL);  /* user_data */
+               if (!setjmp(gnome_init_atexit_jmpbuf))
+                       gnome_program=gnome_program_init(PACKAGE,VERSION,LIBGNOMEUI_MODULE,argc,argv,
+                                       GNOME_PARAM_POPT_TABLE,popt_table,
+                                       GNOME_PARAM_POPT_FLAGS,(int)POPT_CONTEXT_POSIXMEHARDER,
+                                       NULL);
+               else {
+                       no_gnome=TRUE;
+                       /* No message: (captive-install-acquire:3693): Gtk-WARNING **: cannot open display:
+                        * was reported, probably only '--help' message was shown.
+                        */
+                       if (!gnome_init_g_log_handler_hit)
+                               exit(EXIT_SUCCESS);
+                       }
+               gnome_init_atexit_disable=TRUE;
+               g_log_remove_handler(
+                               "Gtk",  /* log_domain */
+                               handler_id);    /* handler_id */
                }
 
        is_interactive=(1
@@ -207,30 +275,20 @@ gboolean is_interactive;
                        && ! optarg_microsoft_com);
 
        /* Initialize UI here to catch all GLog errors below. */
-       if (!ui_line_init())
+       if (is_interactive
+                       && (no_gnome || !ui_gnome_init())
+                       && !ui_line_init())
                g_error(_("No UI interface could be initialized"));
 
        if (!captivemodid_load(optarg_modid_path) && !captivemodid_load("./w32-mod-id.captivemodid.xml"))
                g_error(_("Unable to load modid database: %s"),optarg_modid_path);
 
-{
-void (*acquire_module_available_notify_orig)(struct module_available *module_available);
-void (*acquire_module_all_modules_found_notify_orig)(void);
-
-       acquire_module_available_notify_orig=acquire_module_available_notify;
-       acquire_module_available_notify=NULL;
-       acquire_module_all_modules_found_notify_orig=acquire_module_all_modules_found_notify;
-       acquire_module_all_modules_found_notify=NULL;
-       mod_uri_load(gnome_vfs_uri_new("file://" G_STRINGIFY(VARLIBCAPTIVEDIR)));
-       acquire_module_available_notify=acquire_module_available_notify_orig;
-       acquire_module_all_modules_found_notify=acquire_module_all_modules_found_notify_orig;
-       }
+       mod_uri_load_base_reporting(gnome_vfs_uri_new("file://" G_STRINGIFY(VARLIBCAPTIVEDIR)));
 
        if (!is_interactive)
                scan_batch();
-       else if (!(*ui_search_is_aborted)()) {
+       else
                (*ui_interactive)();
-               }
 
        gnome_vfs_shutdown();