diff --git a/DiscImageChef.Filters/PCExchange.cs b/DiscImageChef.Filters/PCExchange.cs
index 1967b208..022b8025 100644
--- a/DiscImageChef.Filters/PCExchange.cs
+++ b/DiscImageChef.Filters/PCExchange.cs
@@ -215,7 +215,7 @@ namespace DiscImageChef.Filters
FileStream finderDatStream = new FileStream(Path.Combine(parentFolder, FinderInfo), FileMode.Open, FileAccess.Read);
- while(finderDatStream.Position + 0x5C < finderDatStream.Length)
+ while(finderDatStream.Position + 0x5C <= finderDatStream.Length)
{
PCExchangeEntry datEntry = new PCExchangeEntry();
byte[] datEntry_b = new byte[Marshal.SizeOf(datEntry)];
@@ -269,7 +269,7 @@ namespace DiscImageChef.Filters
FileStream finderDatStream = new FileStream(Path.Combine(parentFolder, FinderInfo), FileMode.Open, FileAccess.Read);
- while(finderDatStream.Position + 0x5C < finderDatStream.Length)
+ while(finderDatStream.Position + 0x5C <= finderDatStream.Length)
{
PCExchangeEntry datEntry = new PCExchangeEntry();
byte[] datEntry_b = new byte[Marshal.SizeOf(datEntry)];
@@ -313,6 +313,8 @@ namespace DiscImageChef.Filters
basePath = path;
opened = true;
+
+ finderDatStream.Close();
}
}
}
diff --git a/DiscImageChef.Tests/DiscImageChef.Tests.csproj b/DiscImageChef.Tests/DiscImageChef.Tests.csproj
index aeba41ec..8070a7e5 100644
--- a/DiscImageChef.Tests/DiscImageChef.Tests.csproj
+++ b/DiscImageChef.Tests/DiscImageChef.Tests.csproj
@@ -50,6 +50,7 @@
+
diff --git a/DiscImageChef.Tests/Filters/PCExchange.cs b/DiscImageChef.Tests/Filters/PCExchange.cs
new file mode 100644
index 00000000..0a55f52e
--- /dev/null
+++ b/DiscImageChef.Tests/Filters/PCExchange.cs
@@ -0,0 +1,122 @@
+// /***************************************************************************
+// The Disc Image Chef
+// ----------------------------------------------------------------------------
+//
+// Filename : GZip.cs
+// Version : 1.0
+// Author(s) : Natalia Portillo
+//
+// Component : Component
+//
+// Revision : $Revision$
+// Last change by : $Author$
+// Date : $Date$
+//
+// --[ Description ] ----------------------------------------------------------
+//
+// Description
+//
+// --[ License ] --------------------------------------------------------------
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+// ----------------------------------------------------------------------------
+// Copyright (C) 2011-2015 Claunia.com
+// ****************************************************************************/
+// //$Id$
+using System.IO;
+using DiscImageChef.Checksums;
+using DiscImageChef.Filters;
+using NUnit.Framework;
+
+namespace DiscImageChef.Tests.Filters
+{
+ [TestFixture]
+ public class PCExchange
+ {
+ const string ExpectedFile = "348825a08fa84766d20b91ed917012b9";
+ const string ExpectedContents = "c2be571406cf6353269faa59a4a8c0a4";
+ const string ExpectedResource = "5cb168d60ce8b2b1b3133c2faaf47165";
+ readonly string location;
+
+ public PCExchange()
+ {
+ location = Path.Combine(Consts.TestFilesRoot, "filters", "pcexchange", "DC6_RW_DOS_720.img");
+ }
+
+ [Test]
+ public void CheckCorrectFile()
+ {
+ MD5Context ctx = new MD5Context();
+ ctx.Init();
+ string result = ctx.File(Path.Combine(Consts.TestFilesRoot, "filters", "pcexchange", "FINDER.DAT"), out byte[] tmp);
+ Assert.AreEqual(ExpectedFile, result);
+ }
+
+ [Test]
+ public void CheckFilterId()
+ {
+ Filter filter = new DiscImageChef.Filters.PCExchange();
+ Assert.AreEqual(true, filter.Identify(location));
+ }
+
+ [Test]
+ public void Test()
+ {
+ Filter filter = new DiscImageChef.Filters.PCExchange();
+ filter.Open(location);
+ Assert.AreEqual(true, filter.IsOpened());
+ Assert.AreEqual(737280, filter.GetDataForkLength());
+ Assert.AreNotEqual(null, filter.GetDataForkStream());
+ Assert.AreEqual(546, filter.GetResourceForkLength());
+ Assert.AreNotEqual(null, filter.GetResourceForkStream());
+ Assert.AreEqual(true, filter.HasResourceFork());
+ filter.Close();
+ }
+
+ [Test]
+ public void CheckContents()
+ {
+ Filter filter = new DiscImageChef.Filters.PCExchange();
+ filter.Open(location);
+ Stream str = filter.GetDataForkStream();
+ byte[] data = new byte[737280];
+ str.Read(data, 0, 737280);
+ str.Close();
+ str.Dispose();
+ filter.Close();
+ MD5Context ctx = new MD5Context();
+ ctx.Init();
+ string result = ctx.Data(data, out byte[] tmp);
+ Assert.AreEqual(ExpectedContents, result);
+ }
+
+ [Test]
+ public void CheckResource()
+ {
+ Filter filter = new DiscImageChef.Filters.PCExchange();
+ filter.Open(location);
+ Stream str = filter.GetResourceForkStream();
+ byte[] data = new byte[546];
+ str.Read(data, 0, 546);
+ str.Close();
+ str.Dispose();
+ filter.Close();
+ MD5Context ctx = new MD5Context();
+ ctx.Init();
+ string result = ctx.Data(data, out byte[] tmp);
+ Assert.AreEqual(ExpectedResource, result);
+ }
+ }
+}