public HomeController(RepositoryModel repositoryModel, IManifestProvider manifestProvider) { _repositoryModel = repositoryModel; _manifestProvider = manifestProvider; }
/// <summary> /// Compares the new manifest against the installed files to determine if updates are available /// </summary> /// <param name="manifestProvider">Reference to the manifest provider</param> /// <returns><c>True</c> if files were updated</returns> public static bool CheckForUpdates( IManifestProvider manifestProvider ) { bool wereFilesUpdated = false; const string FileName = "updatemanifest.xml"; const int NeverUpdate = -1; List<Version> installedVersions = new List<Version>(); List<Version> availableVersions = new List<Version>(); XDocument oldDoc = XDocument.Load( FileName ); ParseXmlToList( installedVersions, oldDoc ); // Check if updates are disabled. Return false if they are. if ( installedVersions.FirstOrDefault( s => s.ManifestVersion == NeverUpdate ) != null ) { return false; } try { // Move the current executables out of the way so they can be updated RenameExecutingExecutables(); // Check what's available on the server string manifestContent = manifestProvider.ManifestContent; XDocument newDoc = XDocument.Parse( manifestContent ); ParseXmlToList( availableVersions, newDoc ); // Apply the updates in order IEnumerable<Version> sortedList = availableVersions.OrderBy( s => s.ManifestVersion ).Where( s => s.ManifestVersion > installedVersions.Max( r => r.ManifestVersion ) ); foreach ( Version version in sortedList ) { // Let the exception go if the path is malformed int index = version.PayloadUrl.LastIndexOf( '/' ); FileInfo installFile = new FileInfo( version.PayloadUrl.Substring( index + 1 ) ); manifestProvider.DownloadUpdateArchive( new Uri( version.PayloadUrl ), installFile ); using ( ZipFile zipFile = new ZipFile( installFile.FullName ) ) { zipFile.ExtractAll( ".", ExtractExistingFileAction.OverwriteSilently ); } installFile.Delete(); wereFilesUpdated = true; } // Save the manifest for the next version check File.WriteAllText( FileName, manifestContent ); } finally { // Always revert if no updates; otherwise, the service will not restart if ( RevertExecutableNamesIfNotUpdated() ) { wereFilesUpdated = true; } } return wereFilesUpdated; }