/// <summary>
/// Download image
/// </summary>
/// <param name="url"></param>
/// <param name="referer"></param>
/// <param name="filename"></param>
/// <param name="progressChanged"></param>
/// <returns></returns>
public string Download(string url, string referer, string filename, Action<string> progressChanged, CancellationToken cancelToken)
{
String message = "";
checkOverwrite(filename, progressChanged, ref message);
ExtendedWebClient client = new ExtendedWebClient();
client.Referer = referer;
var tempFilename = DeleteTempFile(filename, progressChanged);
Util.CreateSubDir(tempFilename);
int retry = 1;
while (retry <= Properties.Settings.Default.RetryCount)
{
try
{
using (var stream = client.OpenRead(url))
{
Int64 bytes_total = downloadPreCheck(filename, client, progressChanged, ref message);
using (var f = File.Create(tempFilename))
{
stream.CopyTo(f);
}
downloadPostCheck(filename, tempFilename, bytes_total, progressChanged, ref message);
}
break;
}
catch (NijieException)
{
throw;
}
catch (Exception ex)
{
checkHttpStatusCode(url, ex);
Log.Warn(string.Format("Error when downloading: {0} to {1} ==> {2}, Retrying {2} of {3}...", url, tempFilename, ex.Message, retry, Properties.Settings.Default.RetryCount));
DeleteTempFile(filename, progressChanged);
var prefixMsg = message.Clone();
for (int i = 0; i < Properties.Settings.Default.RetryDelay; ++i)
{
message = String.Format("{0} waiting: {1}", prefixMsg, i);
Thread.Sleep(1000);
if (cancelToken != null && cancelToken.IsCancellationRequested)
{
throw new NijieException(string.Format("Cancel requested, error when downloading: {0} to {1} ==> {2}", url, tempFilename, ex.Message), ex, NijieException.DOWNLOAD_CANCELLED);
}
}
++retry;
if (retry > Properties.Settings.Default.RetryCount)
throw new NijieException(string.Format("Error when downloading: {0} to {1} ==> {2}", url, tempFilename, ex.Message), ex, NijieException.DOWNLOAD_UNKNOWN_ERROR);
}
}
Thread.Sleep(100); // delay before renaming
File.Move(tempFilename, filename);
message = "Saved to: " + filename;
if (progressChanged != null)
progressChanged(message);
return message;
}