Пример #1
0
        private void EnsureStarted(Profile profile)
        {
            if (!started)
            {
                profile.Push("EnsureStarted");

                string pipeName = Guid.NewGuid().ToString();

                // TODO: security - restrict access to child process

                channel = new NamedPipeServerStream(pipeName);

                if (!InProc)
                {
                    remote = new Process();
                    remote.StartInfo.Arguments        = String.Format("-server {0}", pipeName);
                    remote.StartInfo.CreateNoWindow   = true;
                    remote.StartInfo.FileName         = Assembly.GetExecutingAssembly().Location;
                    remote.StartInfo.UseShellExecute  = false;
                    remote.StartInfo.WorkingDirectory = Path.GetTempPath();
                    remote.Start();
                }
                else
                {
#pragma warning disable CS0162 // unreachable
                    simulatedRemote = new Thread(new ThreadStart(
                                                     delegate()
                    {
                        ImageServer.RunServer(pipeName);
                    }));
                    simulatedRemote.Name = "ImageServer - InProc";
                    simulatedRemote.Start();
#pragma warning restore CS0162
                }

                channel.WaitForConnection();

                started = true;

                profile.Pop();
            }
        }
Пример #2
0
        public static void Main(string[] args)
        {
            try
            {
                if ((args.Length >= 1) && String.Equals(args[0], "-waitdebugger"))
                {
                    while (!Debugger.IsAttached)
                    {
                        Thread.Sleep(250);
                    }
                    ShiftArgs(ref args, 1);
                }

                if ((args.Length == 2) && String.Equals(args[0], "-server"))
                {
                    Environment.ExitCode = ImageServer.RunServer(args[1]);
                    return;
                }


                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);


                bool showLogOnStart = false;
                while (args.Length >= 1)
                {
                    switch (args[0])
                    {
                    default:
                        goto Break;

                    case "-profile":
                        ProfileMode = true;
                        ShiftArgs(ref args, 1);
                        break;

                    case "-showlog":
                        showLogOnStart = true;
                        ShiftArgs(ref args, 1);
                        break;

                    case "-swap":
                        EnableSwap = true;
                        ShiftArgs(ref args, 1);
                        break;

                    case "-noswap":
                        EnableSwap = false;
                        ShiftArgs(ref args, 1);
                        break;
                    }
                }
Break:

                if (args.Length == 0)
                {
                    // HACK: based on what WinMerge does - usability is suspect but still much better than FolderBrowserDialog.
                    // See: http://www.codeproject.com/Articles/44914/Select-file-or-folder-from-the-same-dialog
                    using (OpenFileDialog dialog = new OpenFileDialog())
                    {
                        dialog.ValidateNames   = false;
                        dialog.CheckFileExists = false;
                        dialog.CheckPathExists = false;
                        dialog.Title           = "Select a Folder";
                        dialog.FileName        = "Select Folder.";
                        if (dialog.ShowDialog() != DialogResult.OK)
                        {
                            return;
                        }
                        args = new string[] { Path.GetDirectoryName(dialog.FileName) };
                    }
                }

                if (args.Length != 1)
                {
                    MessageBox.Show("Program must take one argument which is the path to a directory containing images to adjust.");
                    return;
                }

                Window     window;
                ImageCache cache = new ImageCache();

                string directory     = Path.GetFullPath(args[0]);
                string scanDirectory = GetScanDirectoryFromTargetDirectory(directory);

                if (!Directory.Exists(directory))
                {
                    MessageBox.Show(String.Format("Specified directory does not exist: \"{0}\"", directory));
                    return;
                }

                XmlDocument settings = new XmlDocument();
                {
                    string settingsPath = Path.Combine(scanDirectory, SettingsFile);
                    if (File.Exists(settingsPath))
                    {
                        settings.Load(settingsPath);
                    }
                }

                GlobalOptions options = new GlobalOptions(settings.CreateNavigator().SelectSingleNode("/*/options"));
                {
                    using (GlobalOptionsDialog dialog = new GlobalOptionsDialog(options, directory))
                    {
                        Application.Run(dialog);
                        if (dialog.DialogResult != DialogResult.OK)
                        {
                            return;
                        }
                    }
                }

                if (showLogOnStart)
                {
                    logWindow = new LoggingWindow();
                    logWindow.Show();
                }

                // scan items
                List <Item> items = new List <Item>();
                foreach (string filePath in Directory.GetFiles(scanDirectory))
                {
                    string fileName = Path.GetFileName(filePath);
                    if (String.Equals(fileName, SettingsFile, StringComparison.OrdinalIgnoreCase))
                    {
                        continue;
                    }

                    bool extUpper = String.Equals(Path.GetExtension(fileName), Path.GetExtension(fileName).ToUpper());
                    //fileName = Path.ChangeExtension(fileName, extUpper ? ".JPG" : ".jpg");

                    Item item = new Item(Path.Combine(directory, fileName), options, cache);
                    items.Add(item);

                    XPathNavigator itemNav = settings.CreateNavigator().SelectSingleNode(String.Format("/*/items/item[file=\"{0}\"]", fileName));
                    if (itemNav != null)
                    {
                        item.ReadXml(itemNav);
                    }
                }

                window = new Window(directory, items, cache, options);
                window.Show();

                window.LastAnalysisTask = BatchAnalyzerQueue.BeginAnalyzeBatch(items);


                Application.Run(window);


                LoggingWindow logw = logWindow;
                if (logw != null)
                {
                    logw.Close();
                }

                window.LastAnalysisTask.Wait(); // allow any unfinished actions to cancel and dispose state

                cache.Dispose();
                SerializationManager.Manager.Dispose();
                ImageClient.Close();
            }
            catch (Exception exception)
            {
                Debugger.Log(0, null, exception.ToString());
                MessageBox.Show(exception.ToString());
            }
        }
Пример #3
0
        public static void Main(string[] args)
        {
            try
            {
                if ((args.Length >= 1) && String.Equals(args[0], "-waitdebugger"))
                {
                    while (!Debugger.IsAttached)
                    {
                        Thread.Sleep(250);
                    }
                    ShiftArgs(ref args, 1);
                }

                if ((args.Length == 2) && String.Equals(args[0], "-server"))
                {
                    Environment.ExitCode = ImageServer.RunServer(args[1]);
                    return;
                }


                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);


                bool showLogOnStart = false;
                while (args.Length >= 1)
                {
                    switch (args[0])
                    {
                    default:
                        goto Break;

                    case "-profile":
                        ProfileMode = true;
                        ShiftArgs(ref args, 1);
                        break;

                    case "-showlog":
                        showLogOnStart = true;
                        ShiftArgs(ref args, 1);
                        break;

                    case "-swap":
                        EnableSwap = true;
                        ShiftArgs(ref args, 1);
                        break;

                    case "-noswap":
                        EnableSwap = false;
                        ShiftArgs(ref args, 1);
                        break;
                    }
                }
Break:

                if (args.Length == 0)
                {
                    // HACK: based on what WinMerge does - usability is suspect but still much better than FolderBrowserDialog.
                    // See: http://www.codeproject.com/Articles/44914/Select-file-or-folder-from-the-same-dialog
                    using (OpenFileDialog dialog = new OpenFileDialog())
                    {
                        dialog.ValidateNames   = false;
                        dialog.CheckFileExists = false;
                        dialog.CheckPathExists = false;
                        dialog.Title           = "Select a Folder";
                        dialog.FileName        = "Select Folder.";
                        if (dialog.ShowDialog() != DialogResult.OK)
                        {
                            return;
                        }
                        args = new string[] { Path.GetDirectoryName(dialog.FileName) };
                    }
                }

                if (args.Length != 1)
                {
                    MessageBox.Show("Program must take one argument which is the path to a directory containing images to adjust.");
                    return;
                }

                Window     window = null;
                ImageCache cache  = new ImageCache();

                string directory     = Path.GetFullPath(args[0]);
                string scanDirectory = GetScanDirectoryFromTargetDirectory(directory);

                if (!Directory.Exists(directory))
                {
                    MessageBox.Show(String.Format("Specified directory does not exist: \"{0}\"", directory));
                    return;
                }

                // load xml file
                XPathNavigator settingsNav;
                {
                    XmlDocument settings     = new XmlDocument();
                    string      settingsPath = Path.Combine(scanDirectory, SettingsFile);
                    if (File.Exists(settingsPath))
                    {
                        settings.Load(settingsPath);
                    }
                    settingsNav = settings.CreateNavigator();
                }

                GlobalOptions options = new GlobalOptions(settingsNav.SelectSingleNode("/*/options"));
                {
                    using (GlobalOptionsDialog dialog = new GlobalOptionsDialog(options, directory))
                    {
                        Application.Run(dialog);
                        if (dialog.DialogResult != DialogResult.OK)
                        {
                            return;
                        }
                    }
                }

                if (showLogOnStart)
                {
                    logWindow = new LoggingWindow();
                    logWindow.Show();
                }

                // read saved items from xml
                List <Item> items = new List <Item>();
                Dictionary <string, bool> filesWithItems = new Dictionary <string, bool>();
                foreach (XPathNavigator itemNav in settingsNav.Select("/*/items/item"))
                {
                    string fileName = itemNav.SelectSingleNode("file").Value;
                    string filePath = Path.Combine(directory, fileName);
                    if (File.Exists(filePath)) // drop item records for which file no longer exists
                    {
                        Item item = new Item(Path.Combine(directory, fileName), options, cache);
                        item.ReadXml(itemNav);

                        items.Add(item);

                        filesWithItems[fileName.ToLowerInvariant()] = false;
                    }
                }

                // add new records for any files that don't have a record
                foreach (string filePath in Directory.GetFiles(scanDirectory))
                {
                    string fileName = Path.GetFileName(filePath);
                    if (String.Equals(fileName, SettingsFile, StringComparison.OrdinalIgnoreCase))
                    {
                        continue;
                    }

                    if (!filesWithItems.ContainsKey(fileName.ToLowerInvariant()))
                    {
                        Item item = new Item(Path.Combine(directory, fileName), options, cache);
                        items.Add(item);

                        item.SettingsNav = settingsNav; // no match; try after hash has been computed
                    }
                }

                // timestamp actions
                if (options.Timestamps.HasValue)
                {
                    Parallel.ForEach(
                        items,
                        GetProcessorConstrainedParallelOptions2(CancellationToken.None),
                        delegate(Item item)
                    {
                        if (options.Timestamps.Value)
                        {
                            if (!options.TimestampsOverwriteExisting)
                            {
                                DateTime existingTimestamp;
                                if (TryParseFilenameTimestamp(Path.GetFileName(item.TargetPath), out existingTimestamp))
                                {
                                    return;
                                }
                            }

                            DateTime fsCreated, fsModified, exifCreated;
                            bool found = TryGetTimestamps(
                                item.SourcePath,
                                out fsCreated,
                                out fsModified,
                                out exifCreated);

                            string created  = fsCreated.ToString("s").Replace("T", ".");
                            string modified = fsModified.ToString("s").Replace("T", ".");
                            string exif     = found ? exifCreated.ToString("s").Replace("T", ".") : "<no data>";

                            string newName = StripFilenameTimestamp(Path.GetFileName(item.TargetPath));
                            string text    = FormatFilenameTimestamp(
                                found
                                        ? exifCreated
                                        : (!options.TimestampsExifMissingModifiedInsteadOfCreated ? fsCreated : fsModified));
                            newName = String.Concat(text, " ", newName);

                            item.RenamedFileName = newName;
                        }
                        else
                        {
                            item.RenamedFileName = StripFilenameTimestamp(Path.GetFileName(item.TargetPath));
                        }
                    });

                    // ensure no duplicate names
                    Dictionary <string, bool> usedName = new Dictionary <string, bool>();
                    foreach (Item item in items)
                    {
                        if (usedName.ContainsKey(item.RenamedFileName))
                        {
                            int suffix = 0;
                            while (true)
                            {
                                string newName = String.Concat(Path.GetFileNameWithoutExtension(item.RenamedFileName), "-", ++suffix, Path.GetExtension(item.RenamedFileName));
                                if (!usedName.ContainsKey(newName))
                                {
                                    item.RenamedFileName = newName;
                                    break;
                                }
                            }
                        }
                        usedName.Add(item.RenamedFileName, false);
                    }
                }

                if (items.Count != 0)
                {
                    window = new Window(directory, items, cache, options);
                    window.Show();

                    window.LastAnalysisTask = BatchAnalyzerQueue.BeginAnalyzeBatch(items);

                    Application.Run(window);
                }
                else
                {
                    MessageBox.Show(String.Format("The specified folder \"{0}\" contains no images.", scanDirectory));
                }

                LoggingWindow logw = logWindow;
                if (logw != null)
                {
                    logw.Close();
                }

                if (window != null)
                {
                    window.LastAnalysisTask.Wait(); // allow any unfinished actions to cancel and dispose state
                }

                cache.Dispose();
                SerializationManager.Manager.Dispose();
                ImageClient.Close();
            }
            catch (Exception exception)
            {
                Debugger.Log(0, null, exception.ToString());
                MessageBox.Show(exception.ToString());
            }
        }