Exemplo n.º 1
0
 public HomeController(RepositoryModel repositoryModel, IManifestProvider manifestProvider)
 {
     _repositoryModel = repositoryModel;
     _manifestProvider = manifestProvider;
 }
Exemplo n.º 2
0
 public HomeController(RepositoryModel repositoryModel, IManifestProvider manifestProvider)
 {
     _repositoryModel  = repositoryModel;
     _manifestProvider = manifestProvider;
 }
Exemplo n.º 3
0
        /// <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;
        }