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); }
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); } }