Ignore:
Timestamp:
1/13/2010 4:29:25 AM (2 years ago)
Author:
lowjoel
Message:

Merged the SpeedMeter? branch to trunk. Fixes #90: Generic speed meter

Location:
trunk/eraser6
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/eraser6

  • trunk/eraser6/Eraser/UpdateForm.cs

    r1495 r1515  
    536536                    Assembly.GetExecutingAssembly().GetName().Version.ToString())); 
    537537             
    538             using (WebResponse resp = req.GetResponse()) 
    539             using (Stream strm = resp.GetResponseStream()) 
    540             { 
     538            using (WebResponse response = req.GetResponse()) 
     539            using (Stream responseStream = response.GetResponseStream()) 
     540            using (MemoryStream memoryStream = new MemoryStream()) 
     541            { 
     542                Manager.ProgressManager progress = new Manager.ProgressManager(); 
     543                progress.Total = response.ContentLength; 
     544 
    541545                //Download the response 
    542                 int bytesRead = 0; 
     546                int lastRead = 0; 
    543547                byte[] buffer = new byte[16384]; 
    544                 List<byte> responseBuffer = new List<byte>(); 
    545                 while ((bytesRead = strm.Read(buffer, 0, buffer.Length)) != 0) 
     548                while ((lastRead = responseStream.Read(buffer, 0, buffer.Length)) != 0) 
    546549                { 
    547                     byte[] tmpDest = new byte[bytesRead]; 
    548                     Buffer.BlockCopy(buffer, 0, tmpDest, 0, bytesRead); 
    549                     responseBuffer.AddRange(tmpDest); 
    550  
    551                     float progress = responseBuffer.Count / (float)resp.ContentLength; 
    552                     OnProgress(new ProgressEventArgs(progress, progress, null, 
     550                    memoryStream.Write(buffer, 0, lastRead); 
     551                    progress.Completed = memoryStream.Position; 
     552                    OnProgress(new ProgressEventArgs(progress.Progress, progress.Progress, null, 
    553553                        S._("{0} of {1} downloaded", 
    554                             Util.File.GetHumanReadableFilesize(responseBuffer.Count), 
    555                             Util.File.GetHumanReadableFilesize(resp.ContentLength)))); 
     554                            Util.File.GetHumanReadableFilesize(progress.Completed), 
     555                            Util.File.GetHumanReadableFilesize(progress.Total)))); 
    556556                } 
    557557 
    558558                //Parse it. 
    559                 using (MemoryStream mStrm = new MemoryStream(responseBuffer.ToArray())) 
    560                     ParseUpdateList(mStrm); 
     559                memoryStream.Position = 0; 
     560                ParseUpdateList(memoryStream); 
    561561            } 
    562562        } 
     
    671671            int currUpdate = 0; 
    672672            Dictionary<string, UpdateInfo> tempFilesMap = new Dictionary<string, UpdateInfo>(); 
     673            Manager.SteppedProgressManager progress = new Manager.SteppedProgressManager(); 
    673674            foreach (UpdateInfo update in downloadQueue) 
    674675            { 
    675676                try 
    676677                { 
     678                    //Add the update to the overall progress. 
     679                    Manager.ProgressManager step = new Eraser.Manager.ProgressManager(); 
     680                    progress.Steps.Add(new Manager.SteppedProgressManager.Step( 
     681                        step, 1.0f / downloadQueue.Count)); 
     682 
    677683                    //Decide on the URL to connect to. The Link of the update may 
    678684                    //be a relative path (relative to the selected mirror) or an 
     
    701707                                UriFormat.Unescaped)) : contentDisposition.FileName)); 
    702708 
    703                         byte[] tempBuffer = new byte[16384]; 
    704                         using (Stream strm = resp.GetResponseStream()) 
    705                         using (FileStream tempStrm = new FileStream(tempFilePath, FileMode.CreateNew)) 
    706                         using (BufferedStream bufStrm = new BufferedStream(tempStrm)) 
     709                        using (Stream responseStream = resp.GetResponseStream()) 
     710                        using (FileStream fileStream = new FileStream(tempFilePath, FileMode.CreateNew)) 
    707711                        { 
     712                            //Update the progress of this step 
     713                            step.Total = resp.ContentLength; 
     714 
    708715                            //Copy the information into the file stream 
    709                             int readBytes = 0; 
    710                             while ((readBytes = strm.Read(tempBuffer, 0, tempBuffer.Length)) != 0) 
     716                            int lastRead = 0; 
     717                            byte[] buffer = new byte[16384]; 
     718                            while ((lastRead = responseStream.Read(buffer, 0, buffer.Length)) != 0) 
    711719                            { 
    712                                 bufStrm.Write(tempBuffer, 0, readBytes); 
     720                                fileStream.Write(buffer, 0, lastRead); 
    713721 
    714722                                //Compute progress 
    715                                 float itemProgress = tempStrm.Position / (float)resp.ContentLength; 
    716                                 float overallProgress = (currUpdate - 1 + itemProgress) / downloadQueue.Count; 
    717                                 OnProgress(new ProgressEventArgs(itemProgress, overallProgress, 
     723                                step.Completed = fileStream.Position; 
     724                                OnProgress(new ProgressEventArgs(step.Progress, progress.Progress, 
    718725                                    update, S._("Downloading: {0}", update.Name))); 
    719726                            } 
     
    724731 
    725732                        //Let the event handler know the download is complete. 
    726                         OnProgress(new ProgressEventArgs(1.0f, (float)currUpdate / downloadQueue.Count, 
     733                        step.Completed = step.Total; 
     734                        OnProgress(new ProgressEventArgs(step.Progress, progress.Progress, 
    727735                            update, S._("Downloaded: {0}", update.Name))); 
    728736                    } 
     
    747755        public void InstallUpdates(object value) 
    748756        { 
     757            Manager.ProgressManager progress = new Manager.ProgressManager(); 
    749758            Dictionary<string, UpdateInfo> tempFiles = (Dictionary<string, UpdateInfo>)value; 
    750759            Dictionary<string, UpdateInfo>.KeyCollection files = tempFiles.Keys; 
    751             int currItem = 0; 
    752760 
    753761            try 
    754762            { 
     763                progress.Total = files.Count; 
    755764                foreach (string path in files) 
    756765                { 
    757766                    UpdateInfo item = tempFiles[path]; 
    758                     float progress = (float)currItem++ / files.Count; 
    759                     OnProgress(new ProgressEventArgs(0.0f, progress, 
     767                    ++progress.Completed; 
     768                    OnProgress(new ProgressEventArgs(0.0f, progress.Progress, 
    760769                        item, S._("Installing {0}", item.Name))); 
    761770 
     
    767776                    process.WaitForExit(Int32.MaxValue); 
    768777                    if (process.ExitCode == 0) 
    769                         OnProgress(new ProgressEventArgs(1.0f, progress, 
     778                        OnProgress(new ProgressEventArgs(1.0f, progress.Progress, 
    770779                            item, S._("Installed {0}", item.Name))); 
    771780                    else 
    772781                        OnProgress(new ProgressErrorEventArgs(new ProgressEventArgs(1.0f, 
    773                             progress, item, S._("Error installing {0}", item.Name)), 
     782                            progress.Progress, item, S._("Error installing {0}", item.Name)), 
    774783                            new ApplicationException(S._("The installer exited with an error code {0}", 
    775784                                process.ExitCode)))); 
Note: See TracChangeset for help on using the changeset viewer.