UltimateZoneBuilder/Source/Tools/Updater/Helpers/Webdata.cs
MaxED 2c0f530ba5 Fixed a crash when changing Custom Field type to Sector/Linedef/Thing Tag.
Changed the way editor is closed during the update process (updater now asks to close the editor after downloading the update package).
Added write access check before performing the update.
The editor can now update the updater.
Updater: merged relevant parts of SharpCompress into the updater source, reducing updater file size from 900 kb to 150 kb.
Updated ZDoom_DECORATE.cfg.
2016-10-08 21:09:55 +00:00

113 lines
3.2 KiB
C#

using System;
using System.Net;
using System.IO;
namespace mxd.GZDBUpdater
{
public delegate void BytesDownloadedEventHandler(ByteArgs e);
public class ByteArgs : EventArgs
{
public int Downloaded;
public int Total;
}
static class Webdata
{
public static event BytesDownloadedEventHandler BytesDownloaded;
public static bool SaveWebFile(string url, string file, string targetFolder)
{
try
{
MemoryStream memoryStream = DownloadWebFile(Path.Combine(url, file));
if(memoryStream == null) return false;
//Convert the downloaded stream to a byte array
byte[] downloadedData = memoryStream.ToArray();
//Release resources
memoryStream.Close();
//Write bytes to the specified file
FileStream newFile = new FileStream(targetFolder + file, FileMode.Create);
newFile.Write(downloadedData, 0, downloadedData.Length);
newFile.Close();
return !MainForm.AppClosing;
}
catch(Exception e)
{
//We may not be connected to the internet
//Or the URL may be incorrect
MainForm.ErrorDescription = "Failed to download the update...\n" + e.Message;
return false;
}
}
public static MemoryStream DownloadWebFile(string url)
{
//open a data stream from the supplied URL
WebRequest webReq = WebRequest.Create(url);
WebResponse webResponse;
try
{
webResponse = webReq.GetResponse();
}
catch(Exception e)
{
MainForm.ErrorDescription = "Failed to retrieve remote revision info...\n" + e.Message;
return null;
}
Stream dataStream = webResponse.GetResponseStream();
//Download the data in chuncks
byte[] dataBuffer = new byte[1024];
//Get the total size of the download
int dataLength = (int)webResponse.ContentLength;
//lets declare our downloaded bytes event args
ByteArgs byteArgs = new ByteArgs();
byteArgs.Downloaded = 0;
byteArgs.Total = dataLength;
//we need to test for a null as if an event is not consumed we will get an exception
if(BytesDownloaded != null) BytesDownloaded(byteArgs);
//Download the data
MemoryStream memoryStream = new MemoryStream();
while(!MainForm.AppClosing)
{
//Let's try and read the data
int bytesFromStream = dataStream.Read(dataBuffer, 0, dataBuffer.Length);
if(bytesFromStream == 0)
{
byteArgs.Downloaded = dataLength;
byteArgs.Total = dataLength;
if(BytesDownloaded != null) BytesDownloaded(byteArgs);
//Download complete
break;
}
else
{
//Write the downloaded data
memoryStream.Write(dataBuffer, 0, bytesFromStream);
byteArgs.Downloaded += bytesFromStream;
byteArgs.Total = dataLength;
if(BytesDownloaded != null) BytesDownloaded(byteArgs);
}
}
//Release resources
dataStream.Close();
// Rewind and return the stream
memoryStream.Position = 0;
return (MainForm.AppClosing ? null : memoryStream);
}
}
}