コード例 #1
0
        static int Main(string[] args)
        {
            if (_pipeProxy != null)
            {
                Log.WriteSystemEventLog("MCEBuddy engine app already running, cannot start another instance.", EventLogEntryType.Error);
                return(-1); // We can't start engine's
            }

            if (!AppProcess.HaveAdministrativeRights())
            {
                Log.WriteSystemEventLog("Start MCEBuddy engine app with Administrative rights.", EventLogEntryType.Information);
                AppProcess.StartAppWithAdministrativeRights(Application.ExecutablePath); // Engine needs Admin rights for firewall and binding
                return(-2);                                                              // Exit, the process will restart with admin rights
            }

            // Capture the Window close event if the user manually closes it
            _controlHandler = new HandlerRoutine(ConsoleCloseCheck); // Setup a static object otherwise on some systems it crashes with null pointer exception due to garbage collection
            SetConsoleCtrlHandler(_controlHandler, true);

            // Now that we are running, first Stop the the Windows Service otherwise we don't be able to start (stop before starting the GUI to prevent closure)
            Log.WriteSystemEventLog("Trying to stop MCEBuddy engine service.", EventLogEntryType.Information);
            WindowsService.StopService(GlobalDefs.MCEBUDDY_SERVICE_NAME, 10000);

            //Start MCEBuddy GUI with Normal user rights (just incase this is running admin rights
            try
            {
                if (AppProcess.HaveAdministrativeRights())
                {
                    AppProcess.StartAppWithMediumPrivilegeFromUISession(Path.Combine(GlobalDefs.AppPath, "MCEBuddy.GUI.exe"), "", false);
                }
                else // Normal user
                {
                    Process Proc = new Process();
                    Proc.StartInfo.FileName       = Path.Combine(GlobalDefs.AppPath, "MCEBuddy.GUI.exe");
                    Proc.StartInfo.CreateNoWindow = false;
                    Proc.StartInfo.WindowStyle    = ProcessWindowStyle.Normal;
                    Proc.Start();
                }
            }
            catch (Exception e)
            {
                // Sometimes the DLL does not work or is missing or running on wrong windows version, catch it and log it
                Log.WriteSystemEventLog("MCEBuddy engine app: Unable to start MCEBuddy GUI. Error ->\r\n" + e.ToString(), EventLogEntryType.Warning);
            }

            Log.WriteSystemEventLog("Starting MCEBuddy engine app.", EventLogEntryType.Information);
            MCEBuddyConf.GlobalMCEConfig = new MCEBuddyConf(GlobalDefs.ConfigFile); // Read the settings for global objects

            MCEBuddyConf.CheckDefaultJobPaths();                                    // Update paths before we start the engine to it is read

            _host = new ServiceHost(typeof(Core));
            TimeSpan timeoutPeriod = GlobalDefs.PIPE_TIMEOUT;

            // Create a binding for network SOAP WEB SERVICES
            string serverString = GlobalDefs.MCEBUDDY_WEB_SOAP_PIPE;

            serverString = serverString.Replace(GlobalDefs.MCEBUDDY_SERVER_PORT, MCEBuddyConf.GlobalMCEConfig.GeneralOptions.localServerPort.ToString()); // Update the Server Port with that from the config file
            BasicHttpBinding ntb = new BasicHttpBinding(GlobalDefs.MCEBUDDY_PIPE_SECURITY);

            ntb.OpenTimeout            = ntb.CloseTimeout = ntb.SendTimeout = ntb.ReceiveTimeout = timeoutPeriod;
            ntb.TransferMode           = TransferMode.Buffered;
            ntb.MaxReceivedMessageSize = ntb.MaxBufferPoolSize = ntb.MaxBufferSize = Int32.MaxValue;
            ntb.ReaderQuotas           = XmlDictionaryReaderQuotas.Max;
            ServiceEndpoint soapEndpoint = _host.AddServiceEndpoint(typeof(ICore), ntb, serverString);

            // Increase the max objects allowed in serialization channel otherwise we lose the connection when there more than 5K objects in the queue
            foreach (OperationDescription operation in soapEndpoint.Contract.Operations)
            {
                DataContractSerializerOperationBehavior dataContractBehavior = operation.Behaviors[typeof(DataContractSerializerOperationBehavior)] as DataContractSerializerOperationBehavior;

                if (dataContractBehavior != null)
                {
                    dataContractBehavior.MaxItemsInObjectGraph = Int32.MaxValue;
                }
            }

            // Create a binding for local NAMED PIPES
            NetNamedPipeBinding npb = new NetNamedPipeBinding();

            npb.OpenTimeout            = npb.CloseTimeout = npb.SendTimeout = npb.ReceiveTimeout = timeoutPeriod;
            npb.TransferMode           = TransferMode.Buffered;
            npb.MaxReceivedMessageSize = npb.MaxBufferPoolSize = npb.MaxBufferSize = Int32.MaxValue;
            npb.ReaderQuotas           = XmlDictionaryReaderQuotas.Max;
            ServiceEndpoint namedPipeEndpoint = _host.AddServiceEndpoint(typeof(ICore), npb, GlobalDefs.MCEBUDDY_LOCAL_NAMED_PIPE);

            // Increase the max objects allowed in serialization channel otherwise we lose the connection when there more than 5K objects in the queue
            foreach (OperationDescription operation in namedPipeEndpoint.Contract.Operations)
            {
                DataContractSerializerOperationBehavior dataContractBehavior = operation.Behaviors[typeof(DataContractSerializerOperationBehavior)] as DataContractSerializerOperationBehavior;

                if (dataContractBehavior != null)
                {
                    dataContractBehavior.MaxItemsInObjectGraph = Int32.MaxValue;
                }
            }

            _host.CloseTimeout = GlobalDefs.PIPE_TIMEOUT;
            _host.Open();

            _pipeProxy = MCEBuddyEngineConnect.ConnectToLocalEngine();
            if (MCEBuddyConf.GlobalMCEConfig.GeneralOptions.engineRunning)
            {
                _pipeProxy.Start();
            }

            // Now that we are up and running
            SystemEvents.PowerModeChanged += OnPowerChange; // Register for power event changes

            ConsoleKeyInfo cki;

            Console.Title        = "MCEBuddy 2.x Service Started, Press ESC to stop";
            Console.WindowHeight = 15;
            Console.WindowWidth  = 80;
            int  lastNumJobs = 0;
            bool Shutdown    = false;

            while (!Shutdown)
            {
                if (_forceClosed)
                {
                    return(1); // Someone forced the closure, the handler will clean up. Exit now
                }
                if (Console.KeyAvailable)
                {
                    cki = Console.ReadKey(true);
                    if (cki.Key == ConsoleKey.Escape)
                    {
                        Log.WriteSystemEventLog("MCEBuddy engine app received user shutdown request.", EventLogEntryType.Information);
                        Shutdown = true;
                    }
                }

                try
                {
                    for (int i = 0, numJobs = _pipeProxy.NumConversionJobs(); i < numJobs; i++)
                    {
                        if (lastNumJobs != numJobs) // The number of conversion jobs has changed
                        {
                            Console.Clear();        // Clear the screen
                        }
                        string outputStr = "";
                        outputStr = "Job" + i.ToString();
                        JobStatus status = _pipeProxy.GetJobStatus(i);
                        if (status != null)
                        {
                            outputStr += " " + status.CurrentAction;
                            if (status.PercentageComplete > 0)
                            {
                                outputStr += " " + status.PercentageComplete.ToString("#0.0", CultureInfo.InvariantCulture) + "%";
                            }
                            else if (-1 == status.PercentageComplete)
                            {
                                outputStr += " Working..."; //some processes like ReMuxSupp don't update perc
                            }
                            if (!String.IsNullOrEmpty(status.ETA))
                            {
                                outputStr += " ETA=" + status.ETA;
                            }

                            if (!String.IsNullOrEmpty(status.SourceFile))
                            {
                                outputStr += " " + Path.GetFileName(status.SourceFile);
                            }
                        }
                        else
                        {
                            outputStr += " Idle";
                        }
                        if (outputStr.Length > 78)
                        {
                            outputStr = outputStr.Substring(0, 78);
                        }
                        Console.SetCursorPosition(0, i);
                        Console.Write(outputStr.PadRight(78));
                        lastNumJobs = _pipeProxy.NumConversionJobs();
                    }
                }
                catch (Exception) //while debugging catch Proxy Faulted state and reset it
                {
                    if (_forceClosed)
                    {
                        return(1);
                    }

                    if (Shutdown)
                    {
                        break; // we are done here
                    }
                    _pipeProxy = MCEBuddyEngineConnect.ConnectToLocalEngine();
                }

                System.Threading.Thread.Sleep(GlobalDefs.LOCAL_ENGINE_POLL_PERIOD);
            }

            ConsoleCloseCheck(ControlSignalType.CTRL_CLOSE_EVENT); // Gracefully shutdown the engine and restart the windows service

            return(0);                                             // All good
        }