public static void Main(string[] args) { Thread.CurrentThread.Name = "MPMain"; if (args.Length > 0) { foreach (string arg in args) { if (arg == "/fullscreen") { _fullscreenOverride = true; } if (arg == "/windowed") { _windowedOverride = true; } if (arg.StartsWith("/fullscreen=")) { string argValue = arg.Remove(0, 12); // remove /?= from the argument _fullscreenOverride |= argValue != "no"; _windowedOverride |= argValue.Equals("no"); } if (arg == "/crashtest") { _mpCrashed = true; } if (arg.StartsWith("/screen=")) { GUIGraphicsContext._useScreenSelector = true; string screenarg = arg.Remove(0, 8); // remove /?= from the argument if (!int.TryParse(screenarg, out _screenNumberOverride)) { _screenNumberOverride = -1; } } if (arg.StartsWith("/skin=")) { string skinOverrideArg = arg.Remove(0, 6); // remove /?= from the argument _strSkinOverride = skinOverrideArg; } if (arg.StartsWith("/config=")) { _alternateConfig = arg.Remove(0, 8); // remove /?= from the argument if (!Path.IsPathRooted(_alternateConfig)) { _alternateConfig = Config.GetFile(Config.Dir.Config, _alternateConfig); } } if (arg.StartsWith("/safelist=")) { _safePluginsList = arg.Remove(0, 10); // remove /?= from the argument } #if !DEBUG _avoidVersionChecking = false; if (arg.ToLowerInvariant() == "/avoidversioncheck") { _avoidVersionChecking = true; Log.Warn("Version check is disabled by command line switch \"/avoidVersionCheck\""); } #endif } } if (string.IsNullOrEmpty(_alternateConfig)) { Log.BackupLogFiles(); } else { if (File.Exists(_alternateConfig)) { try { MPSettings.ConfigPathName = _alternateConfig; Log.BackupLogFiles(); Log.Info("Using alternate configuration file: {0}", MPSettings.ConfigPathName); } catch (Exception ex) { Log.BackupLogFiles(); Log.Error("Failed to change to alternate configuration file:"); Log.Error(ex); } } else { Log.BackupLogFiles(); Log.Info("Alternative configuration file was specified but the file was not found: '{0}'", _alternateConfig); Log.Info("Using default configuration file instead."); } } if (!Config.DirsFileUpdateDetected) { //check if mediaportal has been configured FileInfo fi = new FileInfo(MPSettings.ConfigPathName); if (!File.Exists(MPSettings.ConfigPathName) || (fi.Length < 10000)) { //no, then start configuration.exe in wizard form Log.Info("MediaPortal.xml not found. Launching configuration tool and exiting..."); try { Process.Start(Config.GetFile(Config.Dir.Base, "configuration.exe"), @"/wizard"); } catch {} // no exception logging needed, since MP is now closed return; } bool autoHideTaskbar = true; bool watchdogEnabled = true; bool restartOnError = false; int restartDelay = 10; using (Settings xmlreader = new MPSettings()) { string MPThreadPriority = xmlreader.GetValueAsString("general", "ThreadPriority", "Normal"); if (MPThreadPriority == "AboveNormal") { Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.AboveNormal; } else if (MPThreadPriority == "High") { Thread.CurrentThread.Priority = ThreadPriority.Highest; Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High; } else if (MPThreadPriority == "BelowNormal") { Thread.CurrentThread.Priority = ThreadPriority.BelowNormal; Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal; } autoHideTaskbar = xmlreader.GetValueAsBool("general", "hidetaskbar", false); _startupDelay = xmlreader.GetValueAsBool("general", "delay startup", false) ? xmlreader.GetValueAsInt("general", "delay", 0) : 0; _waitForTvServer = xmlreader.GetValueAsBool("general", "wait for tvserver", false); watchdogEnabled = xmlreader.GetValueAsBool("general", "watchdogEnabled", true); restartOnError = xmlreader.GetValueAsBool("general", "restartOnError", false); restartDelay = xmlreader.GetValueAsInt("general", "restart delay", 10); GUIGraphicsContext._useScreenSelector |= xmlreader.GetValueAsBool("screenselector", "usescreenselector", false); } #if !DEBUG AddExceptionHandler(); if (watchdogEnabled) { //StreamWriter sw = new StreamWriter(Application.StartupPath + "\\mediaportal.running", false); // BAV: fixing mantis bug 1216: Watcher process uses a wrong folder for integrity file using (StreamWriter sw = new StreamWriter(Config.GetFile(Config.Dir.Config, "mediaportal.running"), false)) { sw.WriteLine("running"); sw.Close(); } Log.Info("Main: Starting MPWatchDog"); string cmdargs = "-watchdog"; if (restartOnError) { cmdargs += " -restartMP " + restartDelay.ToString(); } Process mpWatchDog = new Process(); mpWatchDog.StartInfo.ErrorDialog = true; mpWatchDog.StartInfo.UseShellExecute = true; mpWatchDog.StartInfo.WorkingDirectory = Application.StartupPath; mpWatchDog.StartInfo.FileName = "WatchDog.exe"; mpWatchDog.StartInfo.Arguments = cmdargs; mpWatchDog.Start(); } #endif //Log MediaPortal version build and operating system level FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(Application.ExecutablePath); Log.Info("Main: MediaPortal v" + versionInfo.FileVersion + " is starting up on " + OSInfo.OSInfo.GetOSDisplayVersion()); #if DEBUG Log.Info("Debug build: " + Application.ProductVersion); #else Log.Info("Build: " + Application.ProductVersion); #endif //Check for unsupported operating systems OSPrerequisites.OSPrerequisites.OsCheck(false); //Log last install of WindowsUpdate patches string LastSuccessTime = "NEVER !!!"; UIntPtr res = UIntPtr.Zero; int options = Convert.ToInt32(Reg.RegistryRights.ReadKey); if (OSInfo.OSInfo.Xp64OrLater()) { options = options | Convert.ToInt32(Reg.RegWow64Options.KEY_WOW64_64KEY); } UIntPtr rKey = new UIntPtr(Convert.ToUInt32(Reg.RegistryRoot.HKLM)); int lastError = 0; int retval = Reg.RegOpenKeyEx(rKey, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\Results\\Install", 0, options, out res); if (retval == 0) { uint tKey; uint lKey = 100; System.Text.StringBuilder sKey = new System.Text.StringBuilder((int)lKey); retval = Reg.RegQueryValueEx(res, "LastSuccessTime", 0, out tKey, sKey, ref lKey); if (retval == 0) { LastSuccessTime = sKey.ToString(); } else { lastError = Marshal.GetLastWin32Error(); Log.Debug("RegQueryValueEx retval=<{0}>, lastError=<{1}>", retval, lastError); } } else { lastError = Marshal.GetLastWin32Error(); Log.Debug("RegOpenKeyEx retval=<{0}>, lastError=<{1}>", retval, lastError); } Log.Info("Main: Last install from WindowsUpdate is dated {0}", LastSuccessTime); //Disable "ghosting" for WindowsVista and up if (OSInfo.OSInfo.VistaOrLater()) { Log.Debug("Disabling process window ghosting"); NativeMethods.DisableProcessWindowsGhosting(); } //Start MediaPortal Log.Info("Main: Using Directories:"); foreach (Config.Dir option in Enum.GetValues(typeof (Config.Dir))) { Log.Info("{0} - {1}", option, Config.GetFolder(option)); } FileInfo mpFi = new FileInfo(Assembly.GetExecutingAssembly().Location); Log.Info("Main: Assembly creation time: {0} (UTC)", mpFi.LastWriteTimeUtc.ToUniversalTime()); using (ProcessLock processLock = new ProcessLock(mpMutex)) { if (processLock.AlreadyExists) { Log.Warn("Main: MediaPortal is already running"); Win32API.ActivatePreviousInstance(); } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Set current directory string applicationPath = Application.ExecutablePath; applicationPath = Path.GetFullPath(applicationPath); applicationPath = Path.GetDirectoryName(applicationPath); Directory.SetCurrentDirectory(applicationPath); Log.Info("Main: Set current directory to: {0}", applicationPath); //Localization strings for new splashscreen and for MediaPortal itself LoadLanguageString(); // Initialize the skin and theme prior to beginning the splash screen thread. This provides for the splash screen to be used in a theme. string strSkin = ""; try { using (Settings xmlreader = new MPSettings()) { strSkin = _strSkinOverride.Length > 0 ? _strSkinOverride : xmlreader.GetValueAsString("skin", "name", "Default"); } } catch (Exception) { strSkin = "Default"; } Config.SkinName = strSkin; GUIGraphicsContext.Skin = strSkin; SkinSettings.Load(); // Send a message that the skin has changed. GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_SKIN_CHANGED, 0, 0, 0, 0, 0, null); GUIGraphicsContext.SendMessage(msg); Log.Info("Main: Skin is {0} using theme {1}", strSkin, GUIThemeManager.CurrentTheme); #if !DEBUG string version = ConfigurationManager.AppSettings["version"]; //ClientApplicationInfo clientInfo = ClientApplicationInfo.Deserialize("MediaPortal.exe.config"); splashScreen = new SplashScreen(); splashScreen.Version = version; splashScreen.Run(); //clientInfo=null; #endif Application.DoEvents(); if (_waitForTvServer) { Log.Debug("Main: Wait for TV service requested. Checking if installed..."); ServiceController ctrl = null; try { ctrl = new ServiceController("TVService"); string name = ctrl.ServiceName; } catch (Exception) { ctrl = null; Log.Debug("Main: TV service not installed - proceeding..."); } if (ctrl != null) { Log.Debug("Main: TV service found. Checking status..."); if (splashScreen != null) { splashScreen.SetInformation(GUILocalizeStrings.Get(60)); // Waiting for startup of TV service... } if (ctrl.Status == ServiceControllerStatus.StartPending || ctrl.Status == ServiceControllerStatus.Stopped) { if (ctrl.Status == ServiceControllerStatus.StartPending) { Log.Info("Main: TV service start is pending. Waiting..."); } if (ctrl.Status == ServiceControllerStatus.Stopped) { Log.Info("Main: TV service is stopped, so we try start it..."); try { ctrl.Start(); } catch (Exception) { Log.Info("TvService seems to be already starting up."); } } try { ctrl.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 45)); } catch (Exception) {} if (ctrl.Status == ServiceControllerStatus.Running) { Log.Info("Main: The TV service has started successfully."); } else { Log.Info("Main: Startup of the TV service failed - current status: {0}", ctrl.Status.ToString()); } } Log.Info("Main: TV service is in status {0} - proceeding...", ctrl.Status.ToString()); ctrl.Close(); } } Application.DoEvents(); if (_startupDelay > 0) { Log.Info("Main: Waiting {0} second(s) before startup", _startupDelay); for (int i = _startupDelay; i > 0; i--) { if (splashScreen != null) { splashScreen.SetInformation(String.Format(GUILocalizeStrings.Get(61), i.ToString())); // Waiting {0} second(s) before startup... } Application.DoEvents(); Thread.Sleep(1000); } } Log.Debug("Main: Checking prerequisites"); try { // CHECK if DirectX 9.0c if installed Log.Debug("Main: Verifying DirectX 9"); if (!DirectXCheck.IsInstalled()) { string strLine = "Please install a newer DirectX 9.0c redist!\r\n"; strLine = strLine + "MediaPortal cannot run without DirectX 9.0c redist (August 2008)\r\n"; strLine = strLine + "http://install.team-mediaportal.com/DirectX"; #if !DEBUG if (splashScreen != null) { splashScreen.Stop(); splashScreen = null; } #endif MessageBox.Show(strLine, "MediaPortal", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Application.DoEvents(); // CHECK if Windows MediaPlayer 11 is installed string WMP_Main_Ver = "11"; Log.Debug("Main: Verifying Windows Media Player"); Version aParamVersion; if (FilterChecker.CheckFileVersion(Environment.SystemDirectory + "\\wmp.dll", WMP_Main_Ver + ".0.0000.0000", out aParamVersion)) { Log.Info("Main: Windows Media Player version {0} installed", aParamVersion); } else { #if !DEBUG if (splashScreen != null) { splashScreen.Stop(); splashScreen = null; } #endif string strLine = "Please install Windows Media Player " + WMP_Main_Ver + "\r\n"; strLine = strLine + "MediaPortal cannot run without Windows Media Player " + WMP_Main_Ver; MessageBox.Show(strLine, "MediaPortal", MessageBoxButtons.OK, MessageBoxIcon.Error); //return; } #if !DEBUG // Check TvPlugin version string MpExe = Assembly.GetExecutingAssembly().Location; string tvPlugin = Config.GetFolder(Config.Dir.Plugins) + "\\Windows\\TvPlugin.dll"; if (File.Exists(tvPlugin) && !_avoidVersionChecking) { string tvPluginVersion = FileVersionInfo.GetVersionInfo(tvPlugin).ProductVersion; string MpVersion = FileVersionInfo.GetVersionInfo(MpExe).ProductVersion; if (MpVersion != tvPluginVersion) { string strLine = "TvPlugin and MediaPortal don't have the same version.\r\n"; strLine += "Please update the older component to the same version as the newer one.\r\n"; strLine += "MediaPortal Version: " + MpVersion + "\r\n"; strLine += "TvPlugin Version: " + tvPluginVersion; if (splashScreen != null) { splashScreen.Stop(); splashScreen = null; } MessageBox.Show(strLine, "MediaPortal", MessageBoxButtons.OK, MessageBoxIcon.Error); Log.Info(strLine); return; } } #endif } catch (Exception) {} //following crashes on some pc's, dunno why //Log.Info(" Stop any known recording processes"); //Utils.KillExternalTVProcesses(); #if !DEBUG try { #endif Application.DoEvents(); if (splashScreen != null) { splashScreen.SetInformation(GUILocalizeStrings.Get(62)); // Initializing DirectX... } MediaPortalApp app = new MediaPortalApp(); Log.Debug("Main: Initializing DirectX"); if (app.CreateGraphicsSample()) { IMessageFilter filter = new ThreadMessageFilter(app); Application.AddMessageFilter(filter); // Initialize Input Devices if (splashScreen != null) { splashScreen.SetInformation(GUILocalizeStrings.Get(63)); // Initializing input devices... } InputDevices.Init(); try { //app.PreRun(); Log.Info("Main: Running"); GUIGraphicsContext.BlankScreen = false; Application.Run(app); app.Focus(); Debug.WriteLine("after Application.Run"); } //#if !DEBUG catch (Exception ex) { Log.Error(ex); Log.Error("MediaPortal stopped due to an exception {0} {1} {2}", ex.Message, ex.Source, ex.StackTrace); _mpCrashed = true; } //#endif finally { Application.RemoveMessageFilter(filter); } app.OnExit(); } #if !DEBUG } catch (Exception ex) { Log.Error(ex); Log.Error("MediaPortal stopped due to an exception {0} {1} {2}", ex.Message, ex.Source, ex.StackTrace); _mpCrashed = true; } #endif #if !DEBUG if (splashScreen != null) { splashScreen.Stop(); splashScreen = null; } #endif Settings.SaveCache(); if (autoHideTaskbar) { // only re-show the startbar if MP is the one that has hidden it. Win32API.EnableStartBar(true); Win32API.ShowStartBar(true); } if (useRestartOptions) { Log.Info("Main: Exiting Windows - {0}", restartOptions); if (File.Exists(Config.GetFile(Config.Dir.Config, "mediaportal.running"))) { File.Delete(Config.GetFile(Config.Dir.Config, "mediaportal.running")); } WindowsController.ExitWindows(restartOptions, false); } else { if (!_mpCrashed) { if (File.Exists(Config.GetFile(Config.Dir.Config, "mediaportal.running"))) { File.Delete(Config.GetFile(Config.Dir.Config, "mediaportal.running")); } } } } } else { string msg = "The file MediaPortalDirs.xml has been changed by a recent update in the MediaPortal application directory.\n\n"; msg += "You have to open the file "; msg += Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Team MediaPortal\MediaPortalDirs.xml"; msg += " with an editor, update it with all changes and SAVE it at least once to start up MediaPortal successfully after this update.\n\n"; msg += "If you are not using windows user profiles for MediaPortal's configuration management, "; msg += "just delete the whole directory mentioned above and reconfigure MediaPortal."; string msg2 = "\n\n\nDo you want to open your local file now?"; Log.Error(msg); #if !DEBUG if (splashScreen != null) { splashScreen.Stop(); splashScreen = null; } #endif DialogResult result = MessageBox.Show(msg + msg2, "MediaPortal - Update Conflict", MessageBoxButtons.YesNo, MessageBoxIcon.Stop); try { if (result == DialogResult.Yes) { Process.Start("notepad.exe", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Team MediaPortal\MediaPortalDirs.xml"); } } catch (Exception) { MessageBox.Show( "Error opening file " + Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Team MediaPortal\MediaPortalDirs.xml using notepad.exe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } Environment.Exit(0); }
public static void Main(string[] args) { Thread.CurrentThread.Name = "MPMain"; #if !DEBUG // TODO: work on the handlers to take over more Watchdog capabilities, current use for Area51 builds as needed only //AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; //Application.ThreadException += OnThreadException; #endif SkinOverride = string.Empty; WindowedOverride = false; FullscreenOverride = false; ScreenNumberOverride = -1; if (args.Length > 0) { foreach (string arg in args) { if (arg == "/fullscreen") { FullscreenOverride = true; } if (arg == "/windowed") { WindowedOverride = true; } if (arg.StartsWith("/fullscreen=")) { string argValue = arg.Remove(0, 12); // remove /?= from the argument FullscreenOverride |= argValue != "no"; WindowedOverride |= argValue.Equals("no"); } if (arg == "/crashtest") { _mpCrashed = true; } if (arg.StartsWith("/screen=")) { string screenarg = arg.Remove(0, 8); // remove /?= from the argument if (!int.TryParse(screenarg, out ScreenNumberOverride)) { ScreenNumberOverride = -1; } } if (arg.StartsWith("/skin=")) { string skinOverrideArg = arg.Remove(0, 6); // remove /?= from the argument SkinOverride = skinOverrideArg; } if (arg.StartsWith("/config=")) { _alternateConfig = arg.Remove(0, 8); // remove /?= from the argument if (!Path.IsPathRooted(_alternateConfig)) { _alternateConfig = Config.GetFile(Config.Dir.Config, _alternateConfig); } } if (arg.StartsWith("/safelist=")) { _safePluginsList = arg.Remove(0, 10); // remove /?= from the argument } #if !DEBUG _avoidVersionChecking = arg.ToLowerInvariant() == "/avoidversioncheck"; #endif } } // check if MediaPotal is already running using (var processLock = new ProcessLock(MPMutex)) { if (processLock.AlreadyExists) { Log.Warn("Main: MediaPortal is already running"); Win32API.ActivatePreviousInstance(); } } if (string.IsNullOrEmpty(_alternateConfig)) { Log.BackupLogFiles(); } else { if (File.Exists(_alternateConfig)) { try { MPSettings.ConfigPathName = _alternateConfig; Log.BackupLogFiles(); Log.Info("Using alternate configuration file: {0}", MPSettings.ConfigPathName); } catch (Exception ex) { Log.BackupLogFiles(); Log.Error("Failed to change to alternate configuration file:"); Log.Error(ex); } } else { Log.BackupLogFiles(); Log.Info("Alternative configuration file was specified but the file was not found: '{0}'", _alternateConfig); Log.Info("Using default configuration file instead."); } } if (!Config.DirsFileUpdateDetected) { // check if Mediaportal has been configured var fi = new FileInfo(MPSettings.ConfigPathName); if (!File.Exists(MPSettings.ConfigPathName) || (fi.Length < 10000)) { // no, then start configuration.exe in wizard form Log.Info("MediaPortal.xml not found. Launching configuration tool and exiting..."); try { Process.Start(Config.GetFile(Config.Dir.Base, "configuration.exe"), @"/wizard"); } // ReSharper disable EmptyGeneralCatchClause catch {} // no exception logging needed, since MP is now closed // ReSharper restore EmptyGeneralCatchClause return; } // TODO: check if config is valid. If you create a config file > 10000 bytes full of spaces MP will crash as Utils.dll does nearly no error checking using (Settings xmlreader = new MPSettings()) { string threadPriority = xmlreader.GetValueAsString("general", "ThreadPriority", "Normal"); switch (threadPriority) { case "AboveNormal": Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.AboveNormal; break; case "High": Thread.CurrentThread.Priority = ThreadPriority.Highest; Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High; break; case "BelowNormal": Thread.CurrentThread.Priority = ThreadPriority.BelowNormal; Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal; break; } _startupDelay = xmlreader.GetValueAsBool("general", "delay startup", false) ? xmlreader.GetValueAsInt("general", "delay", 0): 0; _waitForTvServer = xmlreader.GetValueAsBool("general", "wait for tvserver", false); } #if !DEBUG bool watchdogEnabled; bool restartOnError; int restartDelay; using (Settings xmlreader = new MPSettings()) { watchdogEnabled = xmlreader.GetValueAsBool("general", "watchdogEnabled", true); restartOnError = xmlreader.GetValueAsBool("general", "restartOnError", false); restartDelay = xmlreader.GetValueAsInt("general", "restart delay", 10); } AddExceptionHandler(); if (watchdogEnabled) { using (var sw = new StreamWriter(Config.GetFile(Config.Dir.Config, "mediaportal.running"), false)) { sw.WriteLine("running"); sw.Close(); } Log.Info("Main: Starting MPWatchDog"); string cmdargs = "-watchdog"; if (restartOnError) { cmdargs += " -restartMP " + restartDelay.ToString(CultureInfo.InvariantCulture); } var mpWatchDog = new Process { StartInfo = { ErrorDialog = true, UseShellExecute = true, WorkingDirectory = Application.StartupPath, FileName = "WatchDog.exe", Arguments = cmdargs } }; mpWatchDog.Start(); } #endif // Log MediaPortal version build and operating system level FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(Application.ExecutablePath); Log.Info("Main: MediaPortal v" + versionInfo.FileVersion + " is starting up on " + OSInfo.OSInfo.GetOSDisplayVersion()); #if DEBUG Log.Info("Debug Build: " + Application.ProductVersion); #else Log.Info("Build: " + Application.ProductVersion); #endif // setting minimum worker threads int minWorker, minIOC; ThreadPool.GetMinThreads(out minWorker, out minIOC); ThreadPool.SetMinThreads(minWorker * 2, minIOC * 1); ThreadPool.GetMinThreads(out minWorker, out minIOC); Log.Info("Main: Minimum number of worker threads to {0}/{1}", minWorker, minIOC); // Check for unsupported operating systems OSPrerequisites.OSPrerequisites.OsCheck(false); // Log last install of WindowsUpdate patches string lastSuccessTime = "NEVER !!!"; UIntPtr res; int options = Convert.ToInt32(Reg.RegistryRights.ReadKey); if (OSInfo.OSInfo.Xp64OrLater()) { options = options | Convert.ToInt32(Reg.RegWow64Options.KEY_WOW64_64KEY); } var rKey = new UIntPtr(Convert.ToUInt32(Reg.RegistryRoot.HKLM)); int lastError; int retval = Reg.RegOpenKeyEx(rKey, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\Results\\Install", 0, options, out res); if (retval == 0) { uint tKey; uint lKey = 100; var sKey = new StringBuilder((int)lKey); retval = Reg.RegQueryValueEx(res, "LastSuccessTime", 0, out tKey, sKey, ref lKey); if (retval == 0) { lastSuccessTime = sKey.ToString(); } else { lastError = Marshal.GetLastWin32Error(); Log.Debug("RegQueryValueEx retval=<{0}>, lastError=<{1}>", retval, lastError); } } else { lastError = Marshal.GetLastWin32Error(); Log.Debug("RegOpenKeyEx retval=<{0}>, lastError=<{1}>", retval, lastError); } Log.Info("Main: Last install from WindowsUpdate is dated {0}", lastSuccessTime); Log.Debug("Disabling process window ghosting"); DisableProcessWindowsGhosting(); // Start MediaPortal Log.Info("Main: Using Directories:"); foreach (Config.Dir option in Enum.GetValues(typeof (Config.Dir))) { Log.Info("{0} - {1}", option, Config.GetFolder(option)); } var mpFi = new FileInfo(Assembly.GetExecutingAssembly().Location); Log.Info("Main: Assembly creation time: {0} (UTC)", mpFi.LastWriteTimeUtc.ToUniversalTime()); #pragma warning disable 168 using (var processLock = new ProcessLock(MPMutex)) #pragma warning restore 168 { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // Set current directory string applicationPath = Application.ExecutablePath; applicationPath = Path.GetFullPath(applicationPath); applicationPath = Path.GetDirectoryName(applicationPath); if (!String.IsNullOrEmpty(applicationPath)) { Directory.SetCurrentDirectory(applicationPath); Log.Info("Main: Set current directory to: {0}", applicationPath); } else { Log.Error("Main: Cannot set current directory to {0}", applicationPath); } // log about available displays foreach (var screen in Screen.AllScreens) { Log.Debug("Display: {0} - IsPrimary: {1} - BitsPerPixel: {2} - Bounds: {3}x{4} @ {5},{6} - WorkingArea: {7}x{8} @ {9},{10}", GetCleanDisplayName(screen), screen.Primary, screen.BitsPerPixel, screen.Bounds.Width, screen.Bounds.Height, screen.Bounds.X, screen.Bounds.Y, screen.WorkingArea.Width, screen.WorkingArea.Height, screen.WorkingArea.X, screen.WorkingArea.Y); } // log information about available adapters var enumeration = new D3DEnumeration(); enumeration.Enumerate(); foreach (GraphicsAdapterInfo ai in enumeration.AdapterInfoList) { Log.Debug("Adapter #{0}: {1} - Driver: {2} ({3}) - DeviceName: {4}", ai.AdapterOrdinal, ai.AdapterDetails.Description, ai.AdapterDetails.DriverName, ai.AdapterDetails.DriverVersion, ai.AdapterDetails.DeviceName); } // Localization strings for new splash screen and for MediaPortal itself LoadLanguageString(); // Initialize the skin and theme prior to beginning the splash screen thread. This provides for the splash screen to be used in a theme. string skin; try { using (Settings xmlreader = new MPSettings()) { skin = string.IsNullOrEmpty(SkinOverride) ? xmlreader.GetValueAsString("skin", "name", "Default") : SkinOverride; } } catch (Exception) { skin = "Default"; } Config.SkinName = skin; GUIGraphicsContext.Skin = skin; SkinSettings.Load(); // Send a message that the skin has changed. var msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_SKIN_CHANGED, 0, 0, 0, 0, 0, null); GUIGraphicsContext.SendMessage(msg); Log.Info("Main: Skin is {0} using theme {1}", skin, GUIThemeManager.CurrentTheme); // Start Splash Screen string version = ConfigurationManager.AppSettings["version"]; SplashScreen = new SplashScreen {Version = version}; #if !DEBUG SplashScreen.Run(); #endif Application.DoEvents(); // process message queue if (_waitForTvServer) { Log.Debug("Main: Wait for TV service requested"); ServiceController ctrl; try { ctrl = new ServiceController("TVService"); } catch (Exception) { ctrl = null; Log.Debug("Main: Create ServiceController for TV service failed - proceeding..."); } if (ctrl != null) { //Sanity check for existance of TV service ServiceControllerStatus status = ServiceControllerStatus.Stopped; try { status = ctrl.Status; } catch (Exception) { Log.Debug("Main: Failed to retrieve TV service status"); ctrl.Close(); ctrl = null; } } if (ctrl != null) { Log.Debug("Main: TV service found. Checking status..."); UpdateSplashScreenMessage(GUILocalizeStrings.Get(60)); // Waiting for startup of TV service... if (ctrl.Status == ServiceControllerStatus.StartPending || ctrl.Status == ServiceControllerStatus.Stopped) { if (ctrl.Status == ServiceControllerStatus.StartPending) { Log.Info("Main: TV service start is pending. Waiting..."); } if (ctrl.Status == ServiceControllerStatus.Stopped) { Log.Info("Main: TV service is stopped, so we try start it..."); try { ctrl.Start(); } catch (Exception) { Log.Info("TvService seems to be already starting up."); } } try { ctrl.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 45)); } // ReSharper disable EmptyGeneralCatchClause catch (Exception) {} // ReSharper restore EmptyGeneralCatchClause if (ctrl.Status == ServiceControllerStatus.Running) { Log.Info("Main: The TV service has started successfully."); } else { Log.Info("Main: Startup of the TV service failed - current status: {0}", ctrl.Status.ToString()); } } Log.Info("Main: TV service is in status {0} - proceeding...", ctrl.Status.ToString()); ctrl.Close(); } } Application.DoEvents(); // process message queue if (_startupDelay > 0) { Log.Info("Main: Waiting {0} second(s) before startup", _startupDelay); for (int i = _startupDelay; i > 0; i--) { UpdateSplashScreenMessage(String.Format(GUILocalizeStrings.Get(61), i.ToString(CultureInfo.InvariantCulture))); Thread.Sleep(1000); Application.DoEvents(); } } Log.Debug("Main: Checking prerequisites"); try { // check if DirectX 9.0c if installed Log.Debug("Main: Verifying DirectX 9"); if (!DirectXCheck.IsInstalled()) { DisableSplashScreen(); string strLine = "Please install a newer DirectX 9.0c redist!\r\n"; strLine = strLine + "MediaPortal cannot run without DirectX 9.0c redist (August 2008)\r\n"; strLine = strLine + "http://install.team-mediaportal.com/DirectX"; // ReSharper disable LocalizableElement MessageBox.Show(strLine, "MediaPortal", MessageBoxButtons.OK, MessageBoxIcon.Error); // ReSharper restore LocalizableElement return; } Application.DoEvents(); // process message queue #if !DEBUG // Check TvPlugin version string mpExe = Assembly.GetExecutingAssembly().Location; string tvPlugin = Config.GetFolder(Config.Dir.Plugins) + "\\Windows\\TvPlugin.dll"; if (File.Exists(tvPlugin) && !_avoidVersionChecking) { string tvPluginVersion = FileVersionInfo.GetVersionInfo(tvPlugin).ProductVersion; string mpVersion = FileVersionInfo.GetVersionInfo(mpExe).ProductVersion; if (mpVersion != tvPluginVersion) { string strLine = "TvPlugin and MediaPortal don't have the same version.\r\n"; strLine += "Please update the older component to the same version as the newer one.\r\n"; strLine += "MediaPortal Version: " + mpVersion + "\r\n"; strLine += "TvPlugin Version: " + tvPluginVersion; DisableSplashScreen(); // ReSharper disable LocalizableElement MessageBox.Show(strLine, "MediaPortal", MessageBoxButtons.OK, MessageBoxIcon.Error); // ReSharper restore LocalizableElement Log.Info(strLine); return; } } #endif } // ReSharper disable EmptyGeneralCatchClause catch (Exception) {} // ReSharper restore EmptyGeneralCatchClause Application.DoEvents(); // process message queue try { UpdateSplashScreenMessage(GUILocalizeStrings.Get(62)); Log.Debug("Main: Initializing DirectX"); var app = new MediaPortalApp(); if (app.Init()) { try { Log.Info("Main: Running"); GUIGraphicsContext.BlankScreen = false; Application.Run(app); app.Focus(); } catch (Exception ex) { Log.Error(ex); Log.Error("MediaPortal stopped due to an exception {0} {1} {2}", ex.Message, ex.Source, ex.StackTrace); _mpCrashed = true; } app.OnExit(); } } catch (Exception ex) { Log.Error(ex); Log.Error("MediaPortal stopped due to an exception {0} {1} {2}", ex.Message, ex.Source, ex.StackTrace); _mpCrashed = true; } DisableSplashScreen(); Settings.SaveCache(); // only re-show the task bar if MP is the one that has hidden it. using (Settings xmlreader = new MPSettings()) { if (xmlreader.GetValueAsBool("general", "hidetaskbar", false)) { HideTaskBar(false); } } if (_useRestartOptions) { Log.Info("Main: Exiting Windows - {0}", _restartOptions); if (File.Exists(Config.GetFile(Config.Dir.Config, "mediaportal.running"))) { File.Delete(Config.GetFile(Config.Dir.Config, "mediaportal.running")); } WindowsController.ExitWindows(_restartOptions, false); } else { if (!_mpCrashed && File.Exists(Config.GetFile(Config.Dir.Config, "mediaportal.running"))) { File.Delete(Config.GetFile(Config.Dir.Config, "mediaportal.running")); } } } } else { DisableSplashScreen(); string msg = "The file MediaPortalDirs.xml has been changed by a recent update in the MediaPortal application directory.\n\n"; msg += "You have to open the file "; msg += Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Team MediaPortal\MediaPortalDirs.xml"; msg += " with an editor, update it with all changes and SAVE it at least once to start up MediaPortal successfully after this update.\n\n"; msg += "If you are not using windows user profiles for MediaPortal's configuration management, "; msg += "just delete the whole directory mentioned above and reconfigure MediaPortal."; msg += "\n\n\n"; msg += "Do you want to open your local file now?"; Log.Error(msg); // ReSharper disable LocalizableElement DialogResult result = MessageBox.Show(msg, "MediaPortal - Update Conflict", MessageBoxButtons.YesNo, MessageBoxIcon.Stop); // ReSharper restore LocalizableElement try { if (result == DialogResult.Yes) { Process.Start("notepad.exe", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Team MediaPortal\MediaPortalDirs.xml"); } } catch (Exception) { // ReSharper disable LocalizableElement MessageBox.Show( "Error opening file " + Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Team MediaPortal\MediaPortalDirs.xml using notepad.exe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // ReSharper restore LocalizableElement } } Environment.Exit(0); }
/// <summary> /// /// </summary> public void Start() { // If the application GUI shouldn't be loaded if (_preventGUILaunch) return; using (ProcessLock processLock = new ProcessLock(configMutex)) { if (processLock.AlreadyExists) { Log.Warn("Main: Configuration is already running"); Win32API.ActivatePreviousInstance(); } // Check for a MediaPortal Instance running and don't allow Configuration to start using (ProcessLock mpLock = new ProcessLock(mpMutex)) { if (mpLock.AlreadyExists) { DialogResult dialogResult = MessageBox.Show( "MediaPortal has to be closed for configuration.\nClose MediaPortal and start Configuration?", "MediaPortal", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (dialogResult == DialogResult.Yes) { Util.Utils.KillProcess("Watchdog"); Util.Utils.KillProcess("MediaPortal"); Log.Info("MediaPortal closed, continue running Configuration."); } else { Log.Warn("Main: MediaPortal is running - start of Configuration aborted"); return; } } } string MpConfig = Assembly.GetExecutingAssembly().Location; #if !DEBUG // Check TvPlugin version string tvPlugin = Config.GetFolder(Config.Dir.Plugins) + "\\Windows\\TvPlugin.dll"; if (File.Exists(tvPlugin) && !_avoidVersionChecking) { string tvPluginVersion = FileVersionInfo.GetVersionInfo(tvPlugin).ProductVersion; string CfgVersion = FileVersionInfo.GetVersionInfo(MpConfig).ProductVersion; if (CfgVersion != tvPluginVersion) { string strLine = "TvPlugin and MediaPortal don't have the same version.\r\n"; strLine += "Please update the older component to the same version as the newer one.\r\n"; strLine += "MpConfig Version: " + CfgVersion + "\r\n"; strLine += "TvPlugin Version: " + tvPluginVersion; MessageBox.Show(strLine, "MediaPortal", MessageBoxButtons.OK, MessageBoxIcon.Error); Log.Info(strLine); return; } } #endif FileInfo mpFi = new FileInfo(MpConfig); Log.Info("Assembly creation time: {0} (UTC)", mpFi.LastWriteTimeUtc.ToUniversalTime()); Form applicationForm = null; Thumbs.CreateFolders(); switch (startupMode) { case StartupMode.Normal: Log.Info("Create new standard setup"); applicationForm = new SettingsForm(_debugOptions); break; } if (applicationForm != null) { Log.Info("start application"); Application.Run(applicationForm); } } }