Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
DavidMoore committed Mar 16, 2020
2 parents ce62ac3 + 835ceac commit 7d2c6ab
Show file tree
Hide file tree
Showing 20 changed files with 478 additions and 35 deletions.
2 changes: 1 addition & 1 deletion Code/IPFilter/Apps/BitTorrentApplication.cs
Expand Up @@ -55,7 +55,7 @@ public async Task<FilterUpdateResult> UpdateFilterAsync(FilterDownloadResult fil

Trace.TraceInformation("Writing filter to " + destinationPath);
using (var destination = File.Open(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None))
using (var writer = new BitTorrentWriter(destination))
using (var writer = new P2pWriter(destination))
{
await writer.Write(filter.Entries, progress);
}
Expand Down
92 changes: 92 additions & 0 deletions Code/IPFilter/Apps/DelugeApplication.cs
@@ -0,0 +1,92 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using IPFilter.Formats;
using IPFilter.Models;
using IPFilter.Native;
using Microsoft.Win32;

namespace IPFilter.Apps
{
class DelugeApplication : IApplication {

public Task<ApplicationDetectionResult> DetectAsync()
{
using (var key = Registry.ClassesRoot.OpenSubKey(@"SOFTWARE\Deluge", false))
{
if (key == null)
{
Trace.TraceInformation("Couldn't find Deluge key at HKCR\\SOFTWARE\\Deluge");
return Task.FromResult(ApplicationDetectionResult.NotFound());
}

var startMenuFolder = (string)key.GetValue("Start Menu Folder");
if (string.IsNullOrWhiteSpace(startMenuFolder))
{
Trace.TraceInformation("Couldn't find Deluge start menu location");
return Task.FromResult(ApplicationDetectionResult.NotFound());
}

// Get the link
var linkPath = Path.Combine(Environment.ExpandEnvironmentVariables(@"%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs"), startMenuFolder);
if (!Directory.Exists(linkPath))
{
Trace.TraceInformation("Couldn't find Deluge shortcut folder: " + linkPath);
return Task.FromResult(ApplicationDetectionResult.NotFound());
}

var shortcut = Path.Combine(linkPath, "Deluge.lnk");
if (!File.Exists(shortcut))
{
Trace.TraceInformation("Couldn't find Deluge shortcut: " + shortcut);
return Task.FromResult(ApplicationDetectionResult.NotFound());
}

var path = ShellLinkHelper.ResolveShortcut(shortcut);
Trace.TraceInformation("Deluge location is " + path);

var result = ApplicationDetectionResult.Create(this, "Deluge", Path.GetDirectoryName(path));

var exe = new FileInfo(path);
if (!exe.Exists)
{
Trace.TraceInformation("Deluge exe not found @ " + path);
result.IsPresent = false;
}

var version = FileVersionInfo.GetVersionInfo(exe.FullName);
result.Description = version.ProductName;
result.Version = version.FileVersion;

return Task.FromResult(result);
}

// DisplayName: Deluge 1.3.15
// UninstallString: C:\Program Files (x86)\Deluge\deluge-uninst.exe
var uninstallKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Deluge";
var uinstallValue = @"";

// Recent Apps GUID: {86B4A402-4897-48E8-8D82-0D19C33E1431}
// AppId: {7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}\Deluge\deluge.exe
// AppPath: C:\Program Files (x86)\Deluge\deluge.exe

}

public async Task<FilterUpdateResult> UpdateFilterAsync(FilterDownloadResult filter, CancellationToken cancellationToken, IProgress<ProgressModel> progress)
{
var roamingPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData, Environment.SpecialFolderOption.Create);
var destinationPath = Path.Combine(roamingPath, "deluge", "ipfilter.dat");

Trace.TraceInformation("Writing filter to " + destinationPath);
using (var destination = File.Open(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None))
using (var writer = new P2pWriter(destination))
{
await writer.Write(filter.Entries, progress);
}

return new FilterUpdateResult { FilterTimestamp = filter.FilterTimestamp };
}
}
}
2 changes: 1 addition & 1 deletion Code/IPFilter/Apps/QBitTorrent.cs
Expand Up @@ -55,7 +55,7 @@ public async Task<FilterUpdateResult> UpdateFilterAsync(FilterDownloadResult fil

Trace.TraceInformation("Writing filter to " + destinationPath);
using (var destination = File.Open(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None))
using (var writer = new BitTorrentWriter(destination))
using (var writer = new P2pWriter(destination))
{
await writer.Write(filter.Entries, progress);
}
Expand Down
43 changes: 43 additions & 0 deletions Code/IPFilter/Cli/MultiFilterWriter.cs
@@ -0,0 +1,43 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using IPFilter.Core;

namespace IPFilter.Cli
{
class MultiFilterWriter : IFilterWriter
{
readonly IList<IFilterWriter> writers;

public MultiFilterWriter(IEnumerable<IFilterWriter> writers)
{
this.writers = writers.ToList();
}

public void Dispose()
{
foreach (var writer in writers)
{
writer.Dispose();
}
}

public Task WriteLineAsync(string line)
{
foreach (var writer in writers)
{
writer.WriteLineAsync(line);
}

return Task.FromResult(1);
}

public async Task Flush()
{
foreach (var writer in writers)
{
await writer.Flush();
}
}
}
}
24 changes: 14 additions & 10 deletions Code/IPFilter/Cli/TextFilterWriter.cs
Expand Up @@ -10,6 +10,8 @@ namespace IPFilter.Cli
{
class TextFilterWriter : IFilterWriter
{
static readonly Task success = Task.FromResult(1);

readonly FileInfo file;
readonly TextWriter writer;
readonly TempFile temp;
Expand All @@ -18,7 +20,6 @@ public TextFilterWriter(string path)
{
file = new FileInfo(path);
temp = new TempFile();

writer = new StreamWriter( temp.File.Open(FileMode.Create, FileAccess.Write, FileShare.Read));
}

Expand All @@ -28,16 +29,17 @@ public void Dispose()
temp?.Dispose();
}

public async Task WriteLineAsync(string line)
public Task WriteLineAsync(string line)
{
var parsed = DatParser.ParseLine(line);
if (parsed == null)
{
Trace.TraceWarning("Invalid line: " + line);
return;
if(!line.StartsWith("#")) Trace.TraceWarning("Invalid line: " + line);
return success;
}

await writer.WriteLineAsync(parsed);
writer.WriteLine(parsed);
return success;
}

public async Task Flush()
Expand All @@ -61,11 +63,13 @@ public async Task Flush()
var list = FilterCollection.Merge(filters);

// Flush the list out
using (var stream = file.Open(FileMode.Create, FileAccess.Write, FileShare.Read))
using (var listWriter = new EmuleWriter(stream))
{
await listWriter.Write(list, null);
}
using var stream = file.Open(FileMode.Create, FileAccess.Write, FileShare.Read);

// Determine the desired format from the file extension
var format = file.Extension.StartsWith(".p2p") ? FilterFileFormat.P2p : FilterFileFormat.Emule;
//using var listWriter = (format == FilterFileFormat.Emule ? new EmuleWriter(stream) : (IFormatWriter)new BitTorrentWriter(stream));
using var listWriter = new P2pWriter(stream);
await listWriter.Write(list, null);
}
}
}
2 changes: 1 addition & 1 deletion Code/IPFilter/Core/FileInfoExtensions.cs
Expand Up @@ -21,7 +21,7 @@ public static void SafeDelete(this FileInfo file)
}
catch (Exception ex)
{
Trace.TraceWarning($"Couldn't delete temporary file {file.FullName}: {ex}");
Trace.TraceWarning($"Couldn't delete file {file.FullName}: {ex}");
}
}

Expand Down
11 changes: 8 additions & 3 deletions Code/IPFilter/EntryPoint.cs
Expand Up @@ -87,8 +87,6 @@ internal static void Main(string[] args)
}
else
{


CurateList(args).GetAwaiter().GetResult();
//Trace.TraceWarning("Invalid command line: " + commandLine);
}
Expand Down Expand Up @@ -194,7 +192,14 @@ static async Task CurateList(string[] args)
// Configure outputs
if (options.Outputs.Count > 0)
{
context.Filter = new TextFilterWriter(options.Outputs.First());
if (options.Outputs.Count > 1)
{
context.Filter = new MultiFilterWriter(options.Outputs.Select(x => new TextFilterWriter(x)));
}
else
{
context.Filter = new TextFilterWriter(options.Outputs.First());
}
}
else
{
Expand Down
7 changes: 5 additions & 2 deletions Code/IPFilter/Formats/EmuleWriter.cs
Expand Up @@ -11,7 +11,7 @@ namespace IPFilter.Formats
/// <summary>
/// Writes out ipfilter.dat for eMule, which aligns the data in space-padded columns e.g.<c>"1.2.8.0 - 1.2.8.255 , 0 , Some organization"</c>
/// </summary>
class EmuleWriter : IDisposable
class EmuleWriter : IFormatWriter
{
readonly Stream stream;

Expand Down Expand Up @@ -54,13 +54,16 @@ public async Task Write(IList<FilterEntry> entries, IProgress<ProgressModel> pro

sb.Append(entry.Description);

await writer.WriteLineAsync(sb.ToString());
writer.WriteLine(sb.ToString());

if (progress == null) continue;
var percent = (int) Math.Floor((double) (i / entries.Count * 100));
progress.Report(new ProgressModel(UpdateState.Decompressing, "Updating eMule...", percent));
}

progress?.Report(new ProgressModel(UpdateState.Decompressing, "Flushing...", 100));
await writer.FlushAsync();

progress?.Report(new ProgressModel(UpdateState.Decompressing, "Updated eMule.", 100));
}
}
Expand Down
13 changes: 13 additions & 0 deletions Code/IPFilter/Formats/FilterFileFormat.cs
@@ -0,0 +1,13 @@
using System;

namespace IPFilter.Formats
{
[Flags]
enum FilterFileFormat
{
None = 0,
Emule = 1,
P2p = 2,
P2b = 4
}
}
12 changes: 12 additions & 0 deletions Code/IPFilter/Formats/IFormatWriter.cs
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using IPFilter.Models;

namespace IPFilter.Formats
{
interface IFormatWriter : IDisposable
{
Task Write(IList<FilterEntry> entries, IProgress<ProgressModel> progress);
}
}
Expand Up @@ -11,7 +11,7 @@ namespace IPFilter.Formats
/// <summary>
/// Writes out eMule DAT format, 0-padding integers to 3 digits. e.g.<c>"001.009.096.105 - 001.009.096.105 , 000 , Some organization"</c>
/// </summary>
class BitTorrentWriter : IDisposable
class P2pWriter : IFormatWriter
{
readonly Stream stream;

Expand All @@ -20,7 +20,7 @@ public void Dispose()
stream.Dispose();
}

public BitTorrentWriter(Stream stream)
public P2pWriter(Stream stream)
{
this.stream = stream;
}
Expand Down

0 comments on commit 7d2c6ab

Please sign in to comment.