diff --git a/src/addoncreator/Addon.cs b/src/addoncreator/Addon.cs
index 4873058..35b2d02 100644
--- a/src/addoncreator/Addon.cs
+++ b/src/addoncreator/Addon.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
@@ -28,7 +29,8 @@ namespace GarrysMod.AddonCreator
/// Import all metadata (title, description, creator, timestamp, etc.) as well?
public void Import(string path, bool withMetadata = true)
{
- using (var stream = File.OpenRead(path))
+ var stream = File.OpenRead(path);
+
{
var sr = new BinaryReader(stream, Encoding.GetEncoding("windows-1252"));
@@ -39,6 +41,7 @@ namespace GarrysMod.AddonCreator
// Check addon's CRC32 hash
{
+ Debug.WriteLine("Checking CRC32...");
var baseAddon = new byte[stream.Length - sizeof (int)];
var oldpos = stream.Position;
stream.Position = 0;
@@ -48,26 +51,49 @@ namespace GarrysMod.AddonCreator
{
throw new IOException("Data corrupted (calculated hash mismatching hash in addon file)");
}
+ stream.Position = oldpos;
}
// Import metadata
var newSteamID = sr.ReadUInt64();
var newBuildTimestamp = sr.ReadUInt64();
var newRequiredContentLen = sr.ReadByte();
+ var newTitle = sr.ReadString(true);
+ var newDescription = sr.ReadString(true);
+ var newAuthor = sr.ReadString(true);
+ var newVersion = sr.ReadInt32();
+
+ Debug.WriteLine("## Metadata ##");
+ Debug.WriteLine("Steam ID: {0}", newSteamID);
+ Debug.WriteLine("Build time: {0}", newBuildTimestamp);
+ Debug.WriteLine("Required content count: {0}", newRequiredContentLen);
+
+ Debug.Assert(newSteamID == 0);
+ Debug.Assert(newRequiredContentLen == 0);
+
for (var b = 0; b < newRequiredContentLen; b++)
{
var value = sr.ReadString(true);
if (withMetadata && !RequiredContent.Contains(value))
RequiredContent.Add(value);
}
+
if (withMetadata)
{
SteamID = newSteamID;
BuildTimestamp = newBuildTimestamp;
+ Title = newTitle;
+ Description = newDescription;
+ Author = newAuthor;
+ Version = newVersion;
}
+ Debug.WriteLine("");
+
// file list
+ Debug.WriteLine("## File list ##");
var newFilesList = new Dictionary>();
+ var expectedFileId = 1;
do
{
var fileId = sr.ReadUInt32();
@@ -79,6 +105,11 @@ namespace GarrysMod.AddonCreator
var fileSize = sr.ReadInt64();
var fileHash = sr.ReadInt32();
+ Debug.WriteLine("\t#{2} : {0} ({1:0.0} kB)", filePath, fileSize / 1024, fileId);
+ Debug.Assert(fileId == expectedFileId);
+
+ expectedFileId++;
+
// avoid duplicates
if (newFilesList.ContainsKey(filePath))
{
@@ -87,12 +118,17 @@ namespace GarrysMod.AddonCreator
newFilesList.Add(filePath, new Tuple(fileSize, fileHash));
} while (true);
+ Debug.WriteLine("");
+ Debug.WriteLine("## File import ##");
foreach (var file in newFilesList)
{
var filePath = file.Key;
var fileSize = file.Value.Item1;
var fileHash = file.Value.Item2;
+
+ Debug.WriteLine("Extracting: {0} ({1:0.00} kB)", filePath, fileSize / 1024);
+
var fileContent = new byte[fileSize];
// long-compatible file reading
@@ -140,6 +176,8 @@ namespace GarrysMod.AddonCreator
addonJson.CheckForErrors();
addonJson.RemoveIgnoredFiles(ref files);
+ // TODO: Extract data from addon.json
+
// Sort files
var resultingFiles = new SortedDictionary(files);
diff --git a/src/addoncreator/AddonWhitelist.cs b/src/addoncreator/AddonWhitelist.cs
index 7cc5ade..24b14e4 100644
--- a/src/addoncreator/AddonWhitelist.cs
+++ b/src/addoncreator/AddonWhitelist.cs
@@ -76,7 +76,7 @@ namespace GarrysMod.AddonCreator
if (RegularExpressions != null)
return;
- RegularExpressions = Whitelist.Select(w => w.WildcardRegex).ToArray();
+ RegularExpressions = Whitelist.Select(w => w.WildcardRegex()).ToArray();
}
public static IEnumerable FindBlacklistedFiles(IEnumerable files)
diff --git a/src/addoncreator/SegmentedAddonFileInfo.cs b/src/addoncreator/SegmentedAddonFileInfo.cs
index 0b30b29..27273a0 100644
--- a/src/addoncreator/SegmentedAddonFileInfo.cs
+++ b/src/addoncreator/SegmentedAddonFileInfo.cs
@@ -25,14 +25,16 @@ namespace GarrysMod.AddonCreator
var output = new byte[_len];
var oldpos = _stream.Position;
_stream.Position = _pos;
- for (long i = 0; i < _len; i += int.MaxValue) // for loop for supporting long file sizes
+ for (long i = 0; i < _len; i += int.MaxValue) // for-loop for supporting long file sizes
{
var toRead = (int) Math.Min(int.MaxValue, _len);
var buffer = new byte[toRead];
var readReal = _stream.Read(buffer, 0, toRead);
- i -= (toRead - readReal); // make absolutely sure everything gets read
buffer.CopyTo(output, i);
+
+ i -= (toRead - readReal); // make absolutely sure everything gets read
}
+ _stream.Position = oldpos;
return output;
}
}