Beispiel #1
0
        static int Main(string [] args)
        {
            bool          empty   = false;
            Program       program = null;
            ICore         control = null;
            List <string> uris    = new List <string> ();

            Unix.SetProcessName(Defines.PACKAGE);

            // Options and Option parsing
            bool   shutdown   = false;
            bool   view       = false;
            bool   slideshow  = false;
            string import_uri = null;

            program = new Program(Defines.PACKAGE,
                                  Defines.VERSION,
                                  Modules.UI, args);

            FSpot.Global.PhotoDirectory = Preferences.Get <string> (Preferences.STORAGE_PATH);

            for (int i = 0; i < args.Length && !shutdown; i++)
            {
                switch (args [i])
                {
                case "-h":
                case "-?":
                case "-help":
                case "--help":
                case "-usage":
                    Help();
                    return(0);

                case "-shutdown":
                case "--shutdown":
                    Log.Information("Shutting down existing F-Spot server...");
                    shutdown = true;
                    break;

                case "-b":
                case "-basedir":
                case "--basedir":
                    if (i + 1 == args.Length || args[i + 1].StartsWith("-"))
                    {
                        Log.Error("f-spot: -basedir option takes one argument");
                        return(1);
                    }
                    FSpot.Global.BaseDirectory = args [++i];
                    Log.InformationFormat("BaseDirectory is now {0}", FSpot.Global.BaseDirectory);
                    break;

                case "-p":
                case "-photodir":
                case "--photodir":
                    if (i + 1 == args.Length || args[i + 1].StartsWith("-"))
                    {
                        Log.Error("f-spot: -photodir option takes one argument");
                        return(1);
                    }
                    FSpot.Global.PhotoDirectory = System.IO.Path.GetFullPath(args [++i]);
                    Log.InformationFormat("PhotoDirectory is now {0}", FSpot.Global.PhotoDirectory);
                    break;

                case "-i":
                case "-import":
                case "--import":
                    if (i + 1 == args.Length)
                    {
                        Log.Error("f-spot: -import option takes one argument");
                        return(1);
                    }
                    import_uri = args [++i];
                    break;

                case "-slideshow":
                case "--slideshow":
                    slideshow = true;
                    break;

                case "-v":
                case "-view":
                case "--view":
                    if (i + 1 == args.Length || args[i + 1].StartsWith("-"))
                    {
                        Log.Error("f-spot: -view option takes (at least) one argument");
                        return(1);
                    }
                    view = true;
                    while (!(i + 1 == args.Length) && !args[i + 1].StartsWith("-"))
                    {
                        uris.Add(args [++i]);
                    }
//				if (!System.IO.Directory.Exists (args[i+1]) && !System.IO.File.Exists (args[i+1])) {
//					Log.Error ("f-spot: -view argument must be an existing file or directory");
//					return 1;
//				}
                    break;

                case "-versions":
                case "--versions":
                    Versions();
                    return(0);

                case "-V":
                case "-version":
                case "--version":
                    Version();
                    return(0);

                case "--debug":
                    Log.Debugging = true;
                    // Debug GdkPixbuf critical warnings
                    GLib.LogFunc logFunc = new GLib.LogFunc(GLib.Log.PrintTraceLogFunction);
                    GLib.Log.SetLogHandler("GdkPixbuf", GLib.LogLevelFlags.Critical, logFunc);

                    // Debug Gtk critical warnings
                    GLib.Log.SetLogHandler("Gtk", GLib.LogLevelFlags.Critical, logFunc);

                    break;

                case "--uninstalled":
                case "--gdb":
                    break;

                default:
                    if (args [i].StartsWith("--profile"))
                    {
                        break;
                    }
                    if (args [i].StartsWith("--trace"))
                    {
                        break;
                    }
                    Log.DebugFormat("Unparsed argument >>{0}<<", args [i]);
                    Help();
                    return(1);
                }
            }

            // Validate command line options
            if ((import_uri != null && (view || shutdown || slideshow)) ||
                (view && (shutdown || slideshow)) ||
                (shutdown && slideshow))
            {
                Log.Error("Can't mix -import, -view, -shutdown or -slideshow");
                return(1);
            }

            if (slideshow == true)
            {
                Catalog.Init("f-spot", Defines.LOCALE_DIR);

                Core core = new Core();
                core.ShowSlides(null);
                program.Run();
                Log.Debug("done");
                return(0);
            }

            try {
                uint timer = Log.InformationTimerStart("Initializing DBus");
                try {
                    NDesk.DBus.BusG.Init();
                } catch (Exception e) {
                    throw new ApplicationException("F-Spot cannot find the Dbus session bus.  Make sure dbus is configured properly or start a new session for f-spot using \"dbus-launch f-spot\"", e);
                }
                Log.DebugTimerPrint(timer, "DBusInitialization took {0}");
                uint ma_timer = Log.InformationTimerStart("Initializing Mono.Addins");
                AddinManager.Initialize(FSpot.Global.BaseDirectory);
                AddinManager.Registry.Update(null);
                SetupService setupService = new SetupService(AddinManager.Registry);
                string       maj_version  = String.Join(".", Defines.VERSION.Split('.'), 0, 3);
                foreach (AddinRepository repo in setupService.Repositories.GetRepositories())
                {
                    if (repo.Url.StartsWith("http://addins.f-spot.org/") && !repo.Url.StartsWith("http://addins.f-spot.org/" + maj_version))
                    {
                        Log.InformationFormat("Unregistering {0}", repo.Url);
                        setupService.Repositories.RemoveRepository(repo.Url);
                    }
                }
                setupService.Repositories.RegisterRepository(null, "http://addins.f-spot.org/" + maj_version, false);
                Log.DebugTimerPrint(ma_timer, "Mono.Addins Initialization took {0}");



                bool create      = true;
                int  retry_count = 0;
                while (control == null)
                {
                    try {
                        control = Core.FindInstance();
                        Log.InformationFormat("Found active FSpot server: {0}", control);
                        program = null;
                    } catch (System.Exception) {
                        if (!shutdown)
                        {
                            Log.Information("Starting new FSpot server");
                        }
                    }

                    Core core = null;
                    try {
                        if (control == null && create)
                        {
                            create = false;
                            Gnome.Vfs.Vfs.Initialize();

                            if (File.Exists(Preferences.Get <string> (Preferences.GTK_RC)))
                            {
#if GTK_2_12_2
                                if (!File.Exists(Path.Combine(Global.BaseDirectory, "gtkrc")))
                                {
                                    (File.Create(Path.Combine(Global.BaseDirectory, "gtkrc"))).Dispose();
                                }
                                Gtk.Rc.AddDefaultFile(Path.Combine(Global.BaseDirectory, "gtkrc"));
                                Global.DefaultRcFiles = Gtk.Rc.DefaultFiles;
#endif
                                Gtk.Rc.AddDefaultFile(Preferences.Get <string> (Preferences.GTK_RC));
                            }

                            Catalog.Init("f-spot", Defines.LOCALE_DIR);
                            try {
                                Gtk.Window.DefaultIconList = new Gdk.Pixbuf [] {
                                    GtkUtil.TryLoadIcon(FSpot.Global.IconTheme, "f-spot", 16, (Gtk.IconLookupFlags) 0),
                                    GtkUtil.TryLoadIcon(FSpot.Global.IconTheme, "f-spot", 22, (Gtk.IconLookupFlags) 0),
                                    GtkUtil.TryLoadIcon(FSpot.Global.IconTheme, "f-spot", 32, (Gtk.IconLookupFlags) 0),
                                    GtkUtil.TryLoadIcon(FSpot.Global.IconTheme, "f-spot", 48, (Gtk.IconLookupFlags) 0)
                                };
                            } catch {}

                            core = new Core(view);
                            core.RegisterServer();

                            empty   = view || Core.Database.Empty;
                            control = core;
                        }
                    } catch (System.Exception e) {
                        System.Console.WriteLine("XXXXX{1}{0}{1}XXXXX", e, Environment.NewLine);
                        control = null;

                        if (core != null)
                        {
                            core.UnregisterServer();
                        }

                        // if there is a problem with the DB, so is no way we can survive
                        if (e is DbException)
                        {
                            throw;
                        }
                    }
                    if (control == null)
                    {
                        Log.Warning("Can't get a connection to the dbus. Trying again...");
                        if (++retry_count > 5)
                        {
                            Log.Error("Sorry, couldn't start F-Spot");
                            return(1);
                        }
                    }
                }


                UriList list = new UriList();

                if (shutdown)
                {
                    try {
                        control.Shutdown();
                    } catch (System.Exception) {
                        // trap errors
                    }
                    System.Environment.Exit(0);
                }

                if (import_uri != null)
                {
                    control.Import(import_uri);
                }

                if (view)
                {
                    foreach (string s in uris)
                    {
                        list.AddUnknown(s);
                    }
                    if (list.Count == 0)
                    {
                        Help();
                        return(1);
                    }
                    control.View(list.ToString());
                }

                if (empty && import_uri == null && !view)
                {
                    control.Import(null);
                }

                if (import_uri != null || !view)
                {
                    control.Organize();
                    Gdk.Global.NotifyStartupComplete();
                    foreach (ServiceNode service in AddinManager.GetExtensionNodes("/FSpot/Services"))
                    {
                        service.Initialize();
                        service.Start();
                    }
                }

#if GSD_2_24
                Log.Information("Hack for gnome-settings-daemon engaged");
                int max_age, max_size;
                if (Preferences.TryGet <int> (Preferences.GSD_THUMBS_MAX_AGE, out max_age))
                {
                    if (max_age < 0)
                    {
                        Log.Debug("maximum_age check already disabled, good");
                    }
                    else if (max_age == 0)
                    {
                        Log.Warning("maximum_age is 0 (tin-hat mode), not overriding");
                    }
                    else if (max_age < 180)
                    {
                        Log.Debug("Setting maximum_age to a saner value");
                        Preferences.Set(Preferences.GSD_THUMBS_MAX_AGE, 180);
                    }
                }

                if (Preferences.TryGet <int> (Preferences.GSD_THUMBS_MAX_SIZE, out max_size))
                {
                    int count = Core.Database.Photos.Count("photos");
                    // average thumbs are taking 70K, so this will push the threshold
                    //if f-spot takes more than 70% of the thumbs space
                    int size = count / 10;
                    if (max_size < 0)
                    {
                        Log.Debug("maximum_size check already disabled, good");
                    }
                    else if (max_size == 0)
                    {
                        Log.Warning("maximum_size is 0 (tin-hat mode), not overriding");
                    }
                    else if (max_size < size)
                    {
                        Log.DebugFormat("Setting maximum_size to a saner value ({0}MB), according to your db size", size);
                        Preferences.Set(Preferences.GSD_THUMBS_MAX_SIZE, size);
                    }
                }
#endif
                if (program != null)
                {
                    program.Run();
                }

                Log.Information("exiting");
            } catch (System.Exception e) {
                Log.Exception(e);
                ExceptionDialog dlg = new ExceptionDialog(e);
                dlg.Run();
                dlg.Destroy();
                System.Environment.Exit(1);
            }
            return(0);
        }
Beispiel #2
0
        public static void Main(string [] args)
        {
            bool    empty   = false;
            Program program = null;
            ICore   control = null;

            SetProcessName(Defines.PACKAGE);

            try {
                FSpotOptions options = new FSpotOptions();
                options.ProcessArgs(args);

                if (!options.Validate())
                {
                    options.DoHelp();
                    return;
                }

                if (options.basedir != null)
                {
                    FSpot.Global.BaseDirectory = options.basedir;
                    System.Console.WriteLine("BaseDirectory is now {0}", FSpot.Global.BaseDirectory);
                }

                if (options.photodir != null)
                {
                    FSpot.Global.PhotoDirectory = System.IO.Path.GetFullPath(options.photodir);
                    System.Console.WriteLine("PhotoDirectory is now {0}", FSpot.Global.PhotoDirectory);
                }

                if (options.slideshow)
                {
                    Catalog.Init("f-spot", Defines.LOCALE_DIR);

                    program = new Program(Defines.PACKAGE,
                                          Defines.VERSION,
                                          Modules.UI, args);
                    Core core = new Core();
                    core.ShowSlides(null);
                    program.Run();
                    System.Console.WriteLine("done");
                    return;
                }

                try {
                    NDesk.DBus.BusG.Init();
                } catch (Exception e) {
                    throw new ApplicationException("F-Spot cannot find the Dbus session bus.  Make sure dbus is configured properly or start a new session for f-spot using \"dbus-launch f-spot\"", e);
                }

                /*
                 * FIXME we need to inialize gobject before making the dbus calls, we'll go
                 * ahead and do it like this for now.
                 */
                program = new Program(Defines.PACKAGE,
                                      Defines.VERSION,
                                      Modules.UI, args);

                Console.WriteLine("Initializing Mono.Addins");
                Mono.Addins.AddinManager.Initialize(FSpot.Global.BaseDirectory);
                Mono.Addins.AddinManager.Registry.Update(null);

                bool create = true;
                while (control == null)
                {
                    try {
                        control = Core.FindInstance();
                        System.Console.WriteLine("Found active FSpot server: {0}", control);
                        program = null;
                    } catch (System.Exception) {
                        if (!options.shutdown)
                        {
                            System.Console.WriteLine("Starting new FSpot server");
                        }
                    }

                    Core core = null;
                    try {
                        if (control == null && create)
                        {
                            create = false;
                            Gnome.Vfs.Vfs.Initialize();
                            StockIcons.Initialize();

                            Catalog.Init("f-spot", Defines.LOCALE_DIR);
                            Gtk.Window.DefaultIconList = new Gdk.Pixbuf [] { PixbufUtils.LoadFromAssembly("f-spot-16.png"),
                                                                             PixbufUtils.LoadFromAssembly("f-spot-22.png"),
                                                                             PixbufUtils.LoadFromAssembly("f-spot-32.png"),
                                                                             PixbufUtils.LoadFromAssembly("f-spot-48.png") };
                            core = new Core(options.view);
                            core.RegisterServer();

                            // FIXME: Error checking is non-existant here...

                            empty   = options.view || Core.Database.Empty;
                            control = core;
                        }
                    } catch (System.Exception e) {
                        System.Console.WriteLine("XXXXX{1}{0}{1}XXXXX", e, Environment.NewLine);
                        control = null;

                        if (core != null)
                        {
                            core.UnregisterServer();
                        }
                    }
                    if (control == null)
                    {
                        System.Console.WriteLine("Can't get a connection to the dbus. Trying again...");
                    }
                }


                UriList list = new UriList();

                if (options.shutdown)
                {
                    try {
                        control.Shutdown();
                    } catch (System.Exception) {
                        // trap errors
                    }
                    System.Environment.Exit(0);
                }

                if (options.import != null)
                {
                    control.Import(options.import);
                }

                if (options.view)
                {
                    foreach (string s in options.Uris)
                    {
                        list.AddUnknown(s);
                    }
                    if (list.Count > 0)
                    {
                        control.View(list.ToString());
                    }
                }

                if (empty && options.import == null && !options.view)
                {
                    control.Import(null);
                }

                if (options.import != null || !options.view)
                {
                    control.Organize();
                    Gdk.Global.NotifyStartupComplete();
                }

                if (program != null)
                {
                    program.Run();
                }

                System.Console.WriteLine("exiting");
            } catch (System.Exception e) {
                Console.Error.WriteLine(e);
                Gtk.Application.Init();
                ExceptionDialog dlg = new ExceptionDialog(e);
                dlg.Run();
                dlg.Destroy();
                System.Environment.Exit(1);
            }
        }