Esempio n. 1
0
        void RunAtStartMenuClick_Reg(object sender, EventArgs ev)
        {
            try
            {
                if (!menu_runatstart_reg.Checked)
                {
                    var isadmin = Taskmaster.IsAdministrator();
                    if (isadmin)
                    {
                        var rv = System.Windows.Forms.MessageBox.Show("Run at start does not support elevated privilege that you have. Is this alright?\n\nIf you absolutely need admin rights, create on logon scheduled task.",
                                                                      System.Windows.Forms.Application.ProductName + " – Run at Start normal privilege problem.",
                                                                      MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, System.Windows.Forms.MessageBoxOptions.DefaultDesktopOnly, false);
                        if (rv == DialogResult.No)
                        {
                            return;
                        }
                    }
                }

                menu_runatstart_reg.Checked = RunAtStartRegRun(!menu_runatstart_reg.Checked);
            }
            catch (Exception ex)
            {
                Logging.Stacktrace(ex);
            }
        }
Esempio n. 2
0
        void RestoreMainWindow(object sender, EventArgs e)
        {
            if (!Atomic.Lock(ref restoremainwindow_lock))
            {
                return;                                                       // already being done
            }
            try
            {
                Taskmaster.ShowMainWindow();

                if (Taskmaster.Trace)
                {
                    Log.Verbose("RestoreMainWindow done!");
                }
            }
            catch (Exception ex)
            {
                Logging.Stacktrace(ex);
                throw;
            }
            finally
            {
                Atomic.Unlock(ref restoremainwindow_lock);
            }
        }
Esempio n. 3
0
 public void SessionEndingEvent(object sender, EventArgs ev)
 {
     // queue exit
     Log.Information("<Session:Ending> Exiting...");
     BeginInvoke(new Action(() => {
         Microsoft.Win32.SystemEvents.SessionEnding -= SessionEndingEvent;
         Taskmaster.UnifiedExit();
     }));
 }
Esempio n. 4
0
        async Task CheckErrors()
        {
            await Task.Delay(0).ConfigureAwait(false);

            // TODO: Maybe make this errors within timeframe instead of total...?
            if (Statistics.FatalErrors >= Settings.FatalErrorThreshold)
            {
                Log.Fatal("<Auto-Doc> Fatal error count too high, exiting.");
                Taskmaster.UnifiedExit();
            }
        }
Esempio n. 5
0
        async Task CheckLogs()
        {
            await Task.Delay(0).ConfigureAwait(false);

            long size = 0;

            var files = System.IO.Directory.GetFiles(logpath, "*", System.IO.SearchOption.AllDirectories);

            foreach (var filename in files)
            {
                var fi = new System.IO.FileInfo(System.IO.Path.Combine(logpath, filename));
                size += fi.Length;
            }

            if (size >= Settings.FatalLogSizeThreshold * 1_000_000)
            {
                Log.Fatal("<Auto-Doc> Log files exceeding allowed size, exiting.");
                Taskmaster.UnifiedExit();
            }
        }
Esempio n. 6
0
        void RunAtStartMenuClick_Sch(object sender, EventArgs ev)
        {
            try
            {
                var isadmin = Taskmaster.IsAdministrator();

                if (!isadmin)
                {
                    var rv = MessageBox.Show("Scheduler can not be modified without admin rights.",
                                             System.Windows.Forms.Application.ProductName + " – run with scheduler at login",
                                             MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1, System.Windows.Forms.MessageBoxOptions.DefaultDesktopOnly, false);
                    return;
                }

                if (!menu_runatstart_sch.Checked)
                {
                    if (isadmin)
                    {
                        var rv = System.Windows.Forms.MessageBox.Show("This will add on-login scheduler to run TM as admin, is this right?",
                                                                      System.Windows.Forms.Application.ProductName + " – run at login with scheduler",
                                                                      MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, System.Windows.Forms.MessageBoxOptions.DefaultDesktopOnly, false);
                        if (rv == DialogResult.No)
                        {
                            return;
                        }
                    }
                }

                menu_runatstart_sch.Checked = RunAtStartScheduler(!menu_runatstart_sch.Checked);

                if (menu_runatstart_sch.Checked && menu_runatstart_reg.Checked)
                {
                    // don't have both enabled
                    RunAtStartMenuClick_Reg(this, null);
                }
            }
            catch (Exception ex)
            {
                Logging.Stacktrace(ex);
            }
        }
Esempio n. 7
0
        public async void EnsureVisible()
        {
            if (!Atomic.Lock(ref ensuringvisibility))
            {
                return;
            }

            try
            {
                Enable();

                int attempts = 0;
                while (!Tray.Visible)
                {
                    Log.Debug("<Tray> Not visible, fixing...");

                    RefreshVisibility();

                    await Task.Delay(15 * 1000).ConfigureAwait(true);

                    if (++attempts >= 5)
                    {
                        Log.Fatal("<Tray> Failure to become visible after 5 attempts. Exiting to avoid ghost status.");
                        Taskmaster.UnifiedExit();
                    }
                }
            }
            catch (Exception ex)
            {
                Logging.Stacktrace(ex);
            }
            finally
            {
                Atomic.Unlock(ref ensuringvisibility);
            }
        }
Esempio n. 8
0
        // ctor, constructor
        /// <exception cref="InitFailure">When initialization fails in a way that can not be continued from.</exception>
        public MicManager()
        {
            System.Diagnostics.Debug.Assert(Taskmaster.IsMainThread(), "Requires main thread");

            // Target = Maximum; // superfluous; CLEANUP

            var stats = Taskmaster.Config.Load(statfile);

            // there should be easier way for this, right?
            Corrections = (stats.Config.Contains("Statistics") && stats.Config["Statistics"].Contains("Corrections")) ? stats.Config["Statistics"]["Corrections"].IntValue : 0;

            // DEVICES

            // find control interface
            // FIXME: Deal with multiple recording devices.
            var waveInDeviceNumber = IntPtr.Zero;             // 0 is default or first?

            NAudio.Mixer.MixerLine mixerLine = null;
            try
            {
                mixerLine = new NAudio.Mixer.MixerLine(waveInDeviceNumber, 0, NAudio.Mixer.MixerFlags.WaveIn);
            }
            catch (NAudio.MmException ex)
            {
                Log.Fatal("<Microphone> Default device not found.");
                throw new InitFailure("Failed to get default microphone device.", ex);
            }

            Control = (NAudio.Mixer.UnsignedMixerControl)mixerLine.Controls.FirstOrDefault(
                (control) => control.ControlType == NAudio.Mixer.MixerControlType.Volume
                );

            if (Control == null)
            {
                Log.Error("<Microphone> No volume control acquired!");
                throw new InitFailure("Mic monitor control not acquired.");
            }

            _volume = Control.Percent;

            // get default communications device
            var mm_enum = new NAudio.CoreAudioApi.MMDeviceEnumerator();

            m_dev = mm_enum?.GetDefaultAudioEndpoint(NAudio.CoreAudioApi.DataFlow.Capture, NAudio.CoreAudioApi.Role.Communications);
            if (m_dev != null)
            {
                m_dev.AudioEndpointVolume.OnVolumeNotification += VolumeChangedHandler;
            }
            mm_enum = null;             // unnecessary?

            if (m_dev == null)
            {
                Log.Error("<Microphone> No communications device found!");
                throw new InitFailure("No communications device found");
            }

            var mvol = "Microphone volume";

            var corecfg = Taskmaster.Config.Load(Taskmaster.coreconfig);

            var save       = false || !corecfg.Config["Media"].Contains(mvol);
            var defaultvol = corecfg.Config["Media"].GetSetDefault(mvol, 100d).DoubleValue;

            if (save)
            {
                corecfg.MarkDirty();
            }

            var fname = "Microphone.Devices.ini";
            var vname = "Volume";

            var devcfg  = Taskmaster.Config.Load(fname);
            var guid    = (m_dev.ID.Split('}'))[1].Substring(2);
            var devname = m_dev.DeviceFriendlyName;
            var unset   = !(devcfg.Config[guid].Contains(vname));
            var devvol  = devcfg.Config[guid].GetSetDefault(vname, defaultvol).DoubleValue;

            devcfg.Config[guid]["Name"].StringValue = devname;
            if (unset)
            {
                devcfg.Save();
            }

            Target = devvol.Constrain(0, 100);
            Log.Information("<Microphone> Default device: {Device} (volume: {TargetVolume:N1}%)", m_dev.FriendlyName, Target);
            Volume = Target;

            Log.Information("<Microphone> Component loaded.");
        }
Esempio n. 9
0
        public TrayAccess()
        {
            // BUILD UI
            Tray = new NotifyIcon
            {
                Text = System.Windows.Forms.Application.ProductName + "!",                                                   // Tooltip so people know WTF I am.
                Icon = System.Drawing.Icon.ExtractAssociatedIcon(System.Reflection.Assembly.GetExecutingAssembly().Location) // is this really the best way?
            };
            Tray.BalloonTipText = Tray.Text;
            Tray.Disposed      += (object sender, EventArgs e) => { Tray = null; };

            if (Taskmaster.Trace)
            {
                Log.Verbose("Generating tray icon.");
            }

            ms = new ContextMenuStrip();
            menu_windowopen = new ToolStripMenuItem("Open", null, RestoreMainWindow);
            menu_rescan     = new ToolStripMenuItem("Rescan", null, (o, s) =>
            {
                menu_rescan.Enabled = false;
                RescanRequest?.Invoke(this, null);
                menu_rescan.Enabled = true;
            });
            menu_configuration = new ToolStripMenuItem("Configuration");
            var menu_configuration_autopower = new ToolStripMenuItem("Power auto-adjust", null, ShowPowerConfig);
            var menu_configuration_folder    = new ToolStripMenuItem("Open in file manager", null, ShowConfigRequest);

            menu_configuration.DropDownItems.Add(menu_configuration_autopower);
            menu_configuration.DropDownItems.Add(new ToolStripSeparator());
            menu_configuration.DropDownItems.Add(menu_configuration_folder);

            menu_runatstart_reg = new ToolStripMenuItem("Run at start (RegRun)", null, RunAtStartMenuClick_Reg);
            menu_runatstart_sch = new ToolStripMenuItem("Schedule at login (Admin)", null, RunAtStartMenuClick_Sch);

            bool runatstartreg = RunAtStartRegRun(enabled: false, dryrun: true);
            bool runatstartsch = RunAtStartScheduler(enabled: false, dryrun: true);

            menu_runatstart_reg.Checked = runatstartreg;
            menu_runatstart_sch.Checked = runatstartsch;
            Log.Information("<Core> Run-at-start – Registry: {Enabled}, Scheduler: {Found}",
                            (runatstartreg ? "Enabled" : "Disabled"), (runatstartsch ? "Found" : "Missing"));

            if (Taskmaster.PowerManagerEnabled)
            {
                power_auto              = new ToolStripMenuItem("Auto", null, SetAutoPower);
                power_auto.Checked      = false;
                power_auto.CheckOnClick = true;
                power_auto.Enabled      = false;

                power_highperf = new ToolStripMenuItem(PowerManager.GetModeName(PowerInfo.PowerMode.HighPerformance), null, (s, e) => { ResetPower(PowerInfo.PowerMode.HighPerformance); });
                power_balanced = new ToolStripMenuItem(PowerManager.GetModeName(PowerInfo.PowerMode.Balanced), null, (s, e) => { ResetPower(PowerInfo.PowerMode.Balanced); });
                power_saving   = new ToolStripMenuItem(PowerManager.GetModeName(PowerInfo.PowerMode.PowerSaver), null, (s, e) => { ResetPower(PowerInfo.PowerMode.PowerSaver); });
                power_manual   = new ToolStripMenuItem("Manual override", null, SetManualPower)
                {
                    CheckOnClick = true
                };
            }

            ToolStripMenuItem menu_restart = null;

            menu_restart = new ToolStripMenuItem("Restart", null, (o, s) =>
            {
                menu_restart.Enabled = false;
                Taskmaster.ConfirmExit(restart: true);
                menu_restart.Enabled = true;
            });
            menu_exit = new ToolStripMenuItem("Exit", null, (o, s) =>
            {
                menu_restart.Enabled = false;
                Taskmaster.ConfirmExit(restart: false);
                menu_restart.Enabled = true;
            });
            ms.Items.Add(menu_windowopen);
            ms.Items.Add(new ToolStripSeparator());
            ms.Items.Add(menu_rescan);
            ms.Items.Add(new ToolStripSeparator());
            ms.Items.Add(menu_configuration);
            ms.Items.Add(menu_runatstart_reg);
            ms.Items.Add(menu_runatstart_sch);
            if (Taskmaster.PowerManagerEnabled)
            {
                ms.Items.Add(new ToolStripSeparator());
                var plab = new ToolStripLabel("--- Power Plan ---");
                plab.ForeColor = System.Drawing.SystemColors.GrayText;
                ms.Items.Add(plab);
                ms.Items.Add(power_auto);
                ms.Items.Add(power_highperf);
                ms.Items.Add(power_balanced);
                ms.Items.Add(power_saving);
                ms.Items.Add(power_manual);
            }

            ms.Items.Add(new ToolStripSeparator());
            ms.Items.Add(menu_restart);
            ms.Items.Add(menu_exit);
            Tray.ContextMenuStrip = ms;

            if (Taskmaster.Trace)
            {
                Log.Verbose("Tray menu ready");
            }

            if (!RegisterExplorerExit())
            {
                throw new InitFailure("<Tray> Explorer registeriong failed; not running?");
            }

            ms.Enabled = false;

            // Tray.Click += RestoreMainWindow;
            Tray.MouseClick += ShowWindow;

            // TODO: Toast Notifications

            if (Tray.Icon == null)
            {
                Log.Fatal("<Tray> Icon missing, setting system default.");
                Tray.Icon = System.Drawing.SystemIcons.Application;
            }

            Microsoft.Win32.SystemEvents.SessionEnding += SessionEndingEvent;             // depends on messagepump

            if (Taskmaster.Trace)
            {
                Log.Verbose("<Tray> Initialized");
            }
        }