Esempio n. 1
0
        private Dictionary <string, Action> GetInstanceCommandActions(Bookmark bookmark)
        {
            Action <VagrantProcess> useProcess = process =>
            {
                _mainApplication.Dispatcher.Invoke(() =>
                {
                    bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Loading;
                });

                bookmark.VagrantInstance.CurrentProcess = process;

                _menu.StartWorkingAnimation();

                process.Start();
                process.Exited += (sender, args) =>
                {
                    bookmark.VagrantInstance.CurrentProcess = null;

                    if (_applicationData.Bookmarks.Select(b => b.VagrantInstance).Count(i => i.CurrentProcess != null) == 0)
                    {
                        _menu.StopWorkingAnimation();
                    }
                };

                try
                {
                    process.BeginOutputReadLine();
                }
                catch (Exception)
                {
                }

                process.WaitForExit();
            };

            Action <Action> initWorker = work =>
            {
                using (var worker = new BackgroundWorker())
                {
                    worker.DoWork += (sender, args) =>
                    {
                        work.Invoke();
                    };
                    worker.RunWorkerAsync();
                }
            };

            return(new Dictionary <string, Action>
            {
                {
                    "Status", (() => initWorker(() =>
                    {
                        using (var process = new VagrantStatusProcess(bookmark.VagrantInstance))
                        {
                            process.Success += state => _mainApplication.Dispatcher.Invoke(() =>
                            {
                                bookmark.VagrantInstance.CurrentState = state;
                                _menu.ShowMessageBalloon(bookmark.Name + " current state: " +
                                                         bookmark.VagrantInstance.CurrentState);
                            });

                            useProcess(process);
                        }
                    }))
                },
                {
                    "SSH", (() => initWorker(() =>
                    {
                        using (var process = new VagrantSshProcess(bookmark.VagrantInstance))
                        {
                            process.Start();
                        }
                    }))
                },
                {
                    "Up", (() => initWorker(() =>
                    {
                        using (var process = new VagrantUpProcess(bookmark.VagrantInstance))
                        {
                            process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() =>
                            {
                                bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Running;
                                _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command +
                                                         " complete." + Environment.NewLine + Environment.NewLine +
                                                         "Current state: " +
                                                         bookmark.VagrantInstance.CurrentState);
                            });

                            useProcess(process);
                        }
                    }))
                },
                {
                    "Reload", (() => initWorker(() =>
                    {
                        using (var process = new VagrantReloadProcess(bookmark.VagrantInstance))
                        {
                            process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() =>
                            {
                                bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Running;
                                _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command +
                                                         " complete." + Environment.NewLine + Environment.NewLine +
                                                         "Current state: " +
                                                         bookmark.VagrantInstance.CurrentState);
                            });

                            useProcess(process);
                        }
                    }))
                },
                {
                    "Suspend", (() => initWorker(() =>
                    {
                        using (var process = new VagrantSuspendProcess(bookmark.VagrantInstance))
                        {
                            process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() =>
                            {
                                bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Saved;
                                _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command +
                                                         " complete." + Environment.NewLine + Environment.NewLine +
                                                         "Current state: " +
                                                         bookmark.VagrantInstance.CurrentState);
                            });

                            useProcess(process);
                        }
                    }))
                },
                {
                    "Resume", (() => initWorker(() =>
                    {
                        using (var process = new VagrantResumeProcess(bookmark.VagrantInstance))
                        {
                            process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() =>
                            {
                                bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Running;
                                _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command +
                                                         " complete." + Environment.NewLine + Environment.NewLine +
                                                         "Current state: " +
                                                         bookmark.VagrantInstance.CurrentState);
                            });

                            useProcess(process);
                        }
                    }))
                },
                {
                    "Halt", (() => initWorker(() =>
                    {
                        using (var process = new VagrantHaltProcess(bookmark.VagrantInstance))
                        {
                            process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() =>
                            {
                                bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Poweroff;
                                _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command +
                                                         " complete." + Environment.NewLine + Environment.NewLine +
                                                         "Current state: " +
                                                         bookmark.VagrantInstance.CurrentState);
                            });

                            useProcess(process);
                        }
                    }))
                },
                {
                    "Destroy", (() => initWorker(() =>
                    {
                        using (var process = new VagrantDestroyProcess(bookmark.VagrantInstance))
                        {
                            //TODO: this state isn't accurate
                            process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() =>
                            {
                                bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Poweroff;
                                _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command +
                                                         " complete." + Environment.NewLine + Environment.NewLine +
                                                         "Current state: " +
                                                         bookmark.VagrantInstance.CurrentState);
                            });

                            useProcess(process);
                        }
                    }))
                }
            });
        }
Esempio n. 2
0
        private void RebuildList()
        {
            _menu.Reset();

            //add each bookmark to the menu
            foreach (var bookmark in _applicationData.Bookmarks)
            {
                _menu.AddBookmarkSubmenu(bookmark, GetInstanceCommandActions(bookmark));
            }

            //refresh the status of each underlying vagrant instance
            if (_applicationData.Bookmarks.Count > 0)
            {
                _menu.StartWorkingAnimation();
            }

            foreach (var instance in _applicationData.Bookmarks.Select(b => b.VagrantInstance).Distinct(new VagrantInstanceEqualityComparer()))
            {
                var process = new VagrantStatusProcess(instance);

                var bookmarks =
                    _applicationData.Bookmarks.Where(
                        b => new VagrantInstanceEqualityComparer().Equals(b.VagrantInstance, instance)).ToList();

                foreach (var bookmark in bookmarks)
                {
                    bookmark.VagrantInstance.CurrentProcess = process;
                }

                using (var worker = new BackgroundWorker())
                {
                    worker.DoWork += (sender, args) =>
                    {
                        process.Success += state =>
                        {
                            _mainApplication.Dispatcher.Invoke(() => instance.CurrentState = state);

                            foreach (var bookmark in bookmarks)
                            {
                                bookmark.VagrantInstance.CurrentProcess = null;
                            }

                            if (
                                _applicationData.Bookmarks.Select(b => b.VagrantInstance)
                                .Count(i => i.CurrentProcess != null) == 0)
                            {
                                _menu.StopWorkingAnimation();
                            }

                            process.Dispose();
                        };
                        process.Start();
                        try
                        {
                            process.BeginOutputReadLine();
                        }
                        catch (Exception)
                        {
                        }

                        process.WaitForExit();
                    };
                    worker.RunWorkerAsync();
                }
            }
        }