-
Notifications
You must be signed in to change notification settings - Fork 1
/
ZsyncManager.cs
104 lines (94 loc) · 4.23 KB
/
ZsyncManager.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System;
using com.salesforce.zsync;
using System.Runtime.CompilerServices;
using System.IO;
using System.Net;
using com.salesforce.zsync.http;
using NLog;
[assembly: InternalsVisibleTo("BSOU.CommandLinePrototype")]
namespace BSU.Sync
{
internal static class ZsyncManager
{
public const long UpdateIntervalBytes = 10 * 1024 * 1024;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
internal static void Make(string filepath)
{
var zm = new ZsyncMake();
java.nio.file.Path p;
p = java.nio.file.Paths.get(filepath);
var options = new ZsyncMake.Options();
// The bisign for TFAR seems to crash this if you don't do this, yet the outputted URL looks normal in the file?? Who knows..
options.setUrl(WebUtility.UrlEncode(p.getFileName().ToString()));
Logger.Info("Writing zsync file {0}", filepath);
zm.writeToFile(java.nio.file.Paths.get(filepath), options);
}
internal static void ZsyncDownload(Uri controlFileUri, string saveFolder, string fileName, Action<long> updateEvent = null)
{
// Work around for BSOU-13
if (java.util.Locale.getDefault() != java.util.Locale.UK)
{
java.util.Locale.setDefault(java.util.Locale.UK);
Logger.Trace("Java locale set to UK");
}
// ReSharper disable once AssignNullToNotNullAttribute
Directory.CreateDirectory(Path.GetDirectoryName(saveFolder + @"\" + fileName));
var zsync = new Zsync();
var options = new Zsync.Options();
string controlFileString = controlFileUri.ToString().Replace(Path.GetFileName(controlFileUri.LocalPath), Uri.EscapeDataString(Path.GetFileName(controlFileUri.LocalPath)));
var javaUri = new java.net.URI(controlFileString);
options.setOutputFile(java.nio.file.Paths.get(saveFolder + @"\" + fileName));
try
{
Logger.Trace("Fetching {0}", javaUri.toString());
if (updateEvent != null)
zsync.zsync(javaUri, options, new MyZsyncObserver(updateEvent));
else
zsync.zsync(javaUri, options);
}
catch (Exception ex)
{
if (ex.Message == "Invalid Length header value '0'")
{
Logger.Warn(ex, "Invalid Length Header");
// Is a 0 byte, just write it
using (WebClient client = new WebClient())
{
Logger.Info("Saving {0} to {1}", controlFileString.Replace(".zsync", string.Empty), saveFolder + @"\" + fileName);
client.DownloadFile(controlFileString.Replace(".zsync", string.Empty), saveFolder + @"\" + fileName);
Logger.Info("Downloaded file {0} directly");
}
}
else
{
throw;
//Console.WriteLine("Something failed \n {0} ", ex.Message);
//Console.WriteLine("\t {0}", ControlFileString);
//logger.Warn(ex, "Error");
}
}
}
private class MyZsyncObserver : ZsyncObserver
{
private readonly Action<long> _updateEvent;
private readonly long _interval;
private long _bytestotal;
private long _lastupdate;
public MyZsyncObserver(Action<long> updateEvent, long? interval = null)
{
_updateEvent = updateEvent;
_interval = interval ?? UpdateIntervalBytes;
_lastupdate = 0;
_bytestotal = 0;
}
public override void bytesDownloaded(long bytes)
{
_bytestotal += bytes;
base.bytesDownloaded(bytes);
if (_bytestotal <= _lastupdate + _interval) return;
_lastupdate = _bytestotal;
_updateEvent(_bytestotal);
}
}
}
}