diff --git a/Claunia.RsrcFork.CLI/Program.cs b/Claunia.RsrcFork.CLI/Program.cs index a50dc4b..69d6048 100644 --- a/Claunia.RsrcFork.CLI/Program.cs +++ b/Claunia.RsrcFork.CLI/Program.cs @@ -23,16 +23,17 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. + using System; using System.IO; -using System.Text; using System.Linq; +using System.Text; namespace Claunia.RsrcFork.CLI { class MainClass { - public static void Main (string [] args) + public static void Main(string[] args) { Console.WriteLine("Claunia.RsrcFork.CLI"); Console.WriteLine("© 2016 Natalia Portillo"); @@ -68,20 +69,17 @@ namespace Claunia.RsrcFork.CLI typeBytes = typeBytes.Reverse().ToArray(); string typeName = Types.GetName(type); if(typeName != null) - Console.WriteLine("\"{0}\" (0x{1:X8}) - {2}", Encoding.ASCII.GetString(typeBytes), type, typeName); - else - Console.WriteLine("\"{0}\" (0x{1:X8})", Encoding.ASCII.GetString(typeBytes), type); + Console.WriteLine("\"{0}\" (0x{1:X8}) - {2}", Encoding.ASCII.GetString(typeBytes), type, + typeName); + else Console.WriteLine("\"{0}\" (0x{1:X8})", Encoding.ASCII.GetString(typeBytes), type); Resource rez = rsrc.GetResource(type); - Console.WriteLine("{0,6}{1,8}\t{2}", "ID", "Length", "Name"); + Console.WriteLine("{0,6}{1,8}\t{2}", "ID", "Length", "Name"); Console.WriteLine("{0,6}{1,8}--{2}", "------", "--------", "----------------"); foreach(short id in rez.GetIds()) - { if(rez.GetName(id) != null) Console.WriteLine("{0,6}{1,8}\t\"{2}\"", id, rez.GetLength(id), rez.GetName(id)); - else - Console.WriteLine("{0,6}{1,8}", id, rez.GetLength(id)); - } + else Console.WriteLine("{0,6}{1,8}", id, rez.GetLength(id)); Console.WriteLine(); } @@ -130,14 +128,15 @@ namespace Claunia.RsrcFork.CLI Resource rez = rsrc.GetResource(type); foreach(short id in rez.GetIds()) { - outStream = new FileStream(Path.Combine(args[2], Encoding.ASCII.GetString(typeBytes), string.Format("{0}", id)), FileMode.Create, FileAccess.ReadWrite); + outStream = + new + FileStream(Path.Combine(args[2], Encoding.ASCII.GetString(typeBytes), string.Format("{0}", id)), + FileMode.Create, FileAccess.ReadWrite); byte[] rez_b = rez.GetResource(id); outStream.Write(rez_b, 0, rez_b.Length); outStream.Close(); } } - - return; } } @@ -149,4 +148,4 @@ namespace Claunia.RsrcFork.CLI Console.WriteLine("\tClaunia.RsrcFork.CLI.EXE -x -o output.dir resourcefork.bin - Extracts all resources to output.dir"); } } -} +} \ No newline at end of file diff --git a/Claunia.RsrcFork.CLI/Properties/AssemblyInfo.cs b/Claunia.RsrcFork.CLI/Properties/AssemblyInfo.cs index cb23762..52b9ed4 100644 --- a/Claunia.RsrcFork.CLI/Properties/AssemblyInfo.cs +++ b/Claunia.RsrcFork.CLI/Properties/AssemblyInfo.cs @@ -23,30 +23,29 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. + using System.Reflection; -using System.Runtime.CompilerServices; // Information about this assembly is defined by the following attributes. // Change them to the values specific to your project. -[assembly: AssemblyTitle ("Claunia.RsrcFork.CLI")] -[assembly: AssemblyDescription ("")] -[assembly: AssemblyConfiguration ("")] -[assembly: AssemblyCompany ("Claunia.com")] -[assembly: AssemblyProduct ("")] -[assembly: AssemblyCopyright ("© Claunia.com")] -[assembly: AssemblyTrademark ("")] -[assembly: AssemblyCulture ("")] +[assembly: AssemblyTitle("Claunia.RsrcFork.CLI")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Claunia.com")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("© Claunia.com")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". // The form "{Major}.{Minor}.*" will automatically update the build and revision, // and "{Major}.{Minor}.{Build}.*" will update just the revision. -[assembly: AssemblyVersion ("1.0.*")] +[assembly: AssemblyVersion("1.0.*")] // The following attributes are used to specify the signing key for the assembly, // if desired. See the Mono documentation for more information about signing. //[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - +//[assembly: AssemblyKeyFile("")] \ No newline at end of file diff --git a/Claunia.RsrcFork.Test/Test.cs b/Claunia.RsrcFork.Test/Test.cs index 0943bd8..1893e4f 100644 --- a/Claunia.RsrcFork.Test/Test.cs +++ b/Claunia.RsrcFork.Test/Test.cs @@ -33,15 +33,19 @@ namespace Claunia.RsrcFork.Test [TestFixture] public class Test { - readonly byte[] DC42_Vers = { 0x06, 0x40, 0x80, 0x00, 0x00, 0x00, 0x09, 0x44, 0x69, 0x73, 0x6B, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x1C, 0x34, 0x2E, 0x32, 0x2C, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x73, 0x75, 0x6D, 0x3D, 0x24, 0x41, 0x35, 0x31, 0x34, 0x37, 0x46, 0x37, 0x45 }; - readonly byte[] DC42_Str = { 0x09, 0x44, 0x69, 0x73, 0x6B, 0x20, 0x43, 0x6F, 0x70, 0x79 }; + readonly byte[] DC42_Vers = + { + 0x06, 0x40, 0x80, 0x00, 0x00, 0x00, 0x09, 0x44, 0x69, 0x73, 0x6B, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x1C, + 0x34, 0x2E, 0x32, 0x2C, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x73, 0x75, + 0x6D, 0x3D, 0x24, 0x41, 0x35, 0x31, 0x34, 0x37, 0x46, 0x37, 0x45 + }; + readonly byte[] DC42_Str = {0x09, 0x44, 0x69, 0x73, 0x6B, 0x20, 0x43, 0x6F, 0x70, 0x79}; [Test] public void TestDC42() { - FileStream dc42Stream = new FileStream("Samples/DiskCopy42.rsrc", FileMode.Open, FileAccess.Read); - ResourceFork rsrc = new ResourceFork(dc42Stream); + FileStream dc42Stream = new FileStream("Samples/DiskCopy42.rsrc", FileMode.Open, FileAccess.Read); + ResourceFork rsrc = new ResourceFork(dc42Stream); uint[] types = rsrc.GetTypes(); Assert.AreEqual(0x53545220, types[0]); @@ -52,7 +56,7 @@ namespace Claunia.RsrcFork.Test short[] str_Ids = str_.GetIds(); Assert.AreEqual(-16396, str_Ids[0]); - Assert.AreEqual(10, str_.GetLength(-16396)); + Assert.AreEqual(10, str_.GetLength(-16396)); byte[] str1 = str_.GetResource(-16396); Assert.AreEqual(DC42_Str, str1); @@ -63,7 +67,7 @@ namespace Claunia.RsrcFork.Test Resource vers = rsrc.GetResource(0x76657273); Assert.IsNotNull(vers); short[] versIds = vers.GetIds(); - Assert.AreEqual(1, versIds[0]); + Assert.AreEqual(1, versIds[0]); Assert.AreEqual(45, vers.GetLength(1)); byte[] vers1 = vers.GetResource(1); @@ -73,20 +77,20 @@ namespace Claunia.RsrcFork.Test Assert.IsNull(versStr); Version versDec = new Version(vers1); - Assert.AreEqual(6, versDec.MajorVersion); - Assert.AreEqual(40, versDec.MinorVersion); + Assert.AreEqual(6, versDec.MajorVersion); + Assert.AreEqual(40, versDec.MinorVersion); Assert.AreEqual(Version.DevelopmentStage.Final, versDec.DevStage); - Assert.AreEqual(0, versDec.PreReleaseVersion); - Assert.AreEqual(0, versDec.RegionCode); - Assert.AreEqual("Disk Copy", versDec.VersionString); + Assert.AreEqual(0, versDec.PreReleaseVersion); + Assert.AreEqual(0, versDec.RegionCode); + Assert.AreEqual("Disk Copy", versDec.VersionString); Assert.AreEqual("4.2, data checksum=$A5147F7E", versDec.VersionMessage); } [Test] public void TestDC6() { - FileStream dc6Stream = new FileStream("Samples/DiskCopy6.rsrc", FileMode.Open, FileAccess.Read); - ResourceFork rsrc = new ResourceFork(dc6Stream); + FileStream dc6Stream = new FileStream("Samples/DiskCopy6.rsrc", FileMode.Open, FileAccess.Read); + ResourceFork rsrc = new ResourceFork(dc6Stream); uint[] types = rsrc.GetTypes(); Assert.AreEqual(0x53545220, types[0]); @@ -99,7 +103,7 @@ namespace Claunia.RsrcFork.Test short[] str_Ids = str_.GetIds(); Assert.AreEqual(-16396, str_Ids[0]); - Assert.AreEqual(10, str_.GetLength(-16396)); + Assert.AreEqual(10, str_.GetLength(-16396)); byte[] str1 = str_.GetResource(-16396); Assert.AreEqual(DC42_Str, str1); @@ -110,7 +114,7 @@ namespace Claunia.RsrcFork.Test Resource vers = rsrc.GetResource(0x76657273); Assert.IsNotNull(vers); short[] versIds = vers.GetIds(); - Assert.AreEqual(1, versIds[0]); + Assert.AreEqual(1, versIds[0]); Assert.AreEqual(66, vers.GetLength(1)); string versStr = vers.GetName(1); @@ -132,25 +136,25 @@ namespace Claunia.RsrcFork.Test string bceSStr = bceS.GetName(128); Assert.IsNull(bceSStr); - byte[] vers1 = vers.GetResource(1); + byte[] vers1 = vers.GetResource(1); Version versDec = new Version(vers1); - Assert.AreEqual(6, versDec.MajorVersion); - Assert.AreEqual(40, versDec.MinorVersion); - Assert.AreEqual(Version.DevelopmentStage.Final, versDec.DevStage); - Assert.AreEqual(0, versDec.PreReleaseVersion); - Assert.AreEqual(0, versDec.RegionCode); - Assert.AreEqual("6.4 Disk Copy", versDec.VersionString); + Assert.AreEqual(6, versDec.MajorVersion); + Assert.AreEqual(40, versDec.MinorVersion); + Assert.AreEqual(Version.DevelopmentStage.Final, versDec.DevStage); + Assert.AreEqual(0, versDec.PreReleaseVersion); + Assert.AreEqual(0, versDec.RegionCode); + Assert.AreEqual("6.4 Disk Copy", versDec.VersionString); Assert.AreEqual("Mac? OS HFS 1680K disk image\rCRC28: $07213FB7", versDec.VersionMessage); } [Test] public void TestSMI() { - FileStream smiStream = new FileStream("Samples/SelfMountingImage.rsrc", FileMode.Open, FileAccess.Read); - ResourceFork rsrc = new ResourceFork(smiStream); + FileStream smiStream = new FileStream("Samples/SelfMountingImage.rsrc", FileMode.Open, FileAccess.Read); + ResourceFork rsrc = new ResourceFork(smiStream); uint[] types = rsrc.GetTypes(); - Assert.AreEqual(29, types.Length); + Assert.AreEqual(29, types.Length); Assert.AreEqual(0x424E444C, types[0]); Assert.AreEqual(0x434F4445, types[1]); Assert.AreEqual(0x44415441, types[2]); @@ -166,8 +170,8 @@ namespace Claunia.RsrcFork.Test Resource code = rsrc.GetResource(0x434F4445); Assert.IsNotNull(code); short[] codeIds = code.GetIds(); - Assert.AreEqual(0, codeIds[0]); - Assert.AreEqual(1, codeIds[1]); + Assert.AreEqual(0, codeIds[0]); + Assert.AreEqual(1, codeIds[1]); Assert.AreEqual(35130, code.GetLength(1)); string codeStr = code.GetName(1); Assert.AreEqual("First Segment", codeStr); //"First Segment" @@ -176,38 +180,38 @@ namespace Claunia.RsrcFork.Test Assert.IsNotNull(bndl); short[] bndlIds = bndl.GetIds(); Assert.AreEqual(128, bndlIds[0]); - Assert.AreEqual(28, bndl.GetLength(128)); + Assert.AreEqual(28, bndl.GetLength(128)); string bndlStr = bndl.GetName(128); Assert.IsNull(bndlStr); Resource vers = rsrc.GetResource(0x76657273); Assert.IsNotNull(vers); - byte[] vers1 = vers.GetResource(1); + byte[] vers1 = vers.GetResource(1); Version versDec = new Version(vers1); - Assert.AreEqual(1, versDec.MajorVersion); - Assert.AreEqual(10, versDec.MinorVersion); - Assert.AreEqual(Version.DevelopmentStage.Beta, versDec.DevStage); - Assert.AreEqual(6, versDec.PreReleaseVersion); - Assert.AreEqual(0, versDec.RegionCode); - Assert.AreEqual("1.1b6", versDec.VersionString); + Assert.AreEqual(1, versDec.MajorVersion); + Assert.AreEqual(10, versDec.MinorVersion); + Assert.AreEqual(Version.DevelopmentStage.Beta, versDec.DevStage); + Assert.AreEqual(6, versDec.PreReleaseVersion); + Assert.AreEqual(0, versDec.RegionCode); + Assert.AreEqual("1.1b6", versDec.VersionString); Assert.AreEqual("1.1b6, Copyright 1997-2001 Apple Computer, Inc.", versDec.VersionMessage); } [Test] public void TestUDIF() { - FileStream udifStream = new FileStream("Samples/UDIF.rsrc", FileMode.Open, FileAccess.Read); - ResourceFork rsrc = new ResourceFork(udifStream); + FileStream udifStream = new FileStream("Samples/UDIF.rsrc", FileMode.Open, FileAccess.Read); + ResourceFork rsrc = new ResourceFork(udifStream); uint[] types = rsrc.GetTypes(); - Assert.AreEqual(2, types.Length); + Assert.AreEqual(2, types.Length); Assert.AreEqual(0x626C6B78, types[0]); Assert.AreEqual(0x706C7374, types[1]); Resource blkx = rsrc.GetResource(0x626C6B78); Assert.IsNotNull(blkx); short[] blkxIds = blkx.GetIds(); - Assert.AreEqual(0, blkxIds[0]); + Assert.AreEqual(0, blkxIds[0]); Assert.AreEqual(524, blkx.GetLength(0)); string blkxStr = blkx.GetName(0); Assert.AreEqual("Whole Device (Apple_XXX : 0)", blkxStr); //"First Segment" @@ -215,7 +219,7 @@ namespace Claunia.RsrcFork.Test Resource plst = rsrc.GetResource(0x706C7374); Assert.IsNotNull(plst); short[] plstIds = plst.GetIds(); - Assert.AreEqual(0, plstIds[0]); + Assert.AreEqual(0, plstIds[0]); Assert.AreEqual(1544, plst.GetLength(0)); string plstStr = plst.GetName(0); Assert.IsNull(plstStr); @@ -224,5 +228,4 @@ namespace Claunia.RsrcFork.Test Assert.IsNull(vers); } } -} - +} \ No newline at end of file diff --git a/Claunia.RsrcFork/PascalString.cs b/Claunia.RsrcFork/PascalString.cs index 94430ad..d47fde5 100644 --- a/Claunia.RsrcFork/PascalString.cs +++ b/Claunia.RsrcFork/PascalString.cs @@ -23,51 +23,48 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. + using System; using System.Text; + namespace Claunia.RsrcFork { /// - /// Contains convertes between .NET and Pascal strings. Only ASCII supported right now. + /// Contains convertes between .NET and Pascal strings. Only ASCII supported right now. /// public static class PascalString { /// - /// Converts an ASCII Pascal string to a .NET string. + /// Converts an ASCII Pascal string to a .NET string. /// /// The .NET string. /// The ASCII Pascal string. public static string GetString(byte[] PStr) { - if(PStr == null || PStr[0] >= PStr.Length) - return null; + if(PStr == null || PStr[0] >= PStr.Length) return null; return Encoding.ASCII.GetString(PStr, 1, PStr[0]); } /// - /// Converts a .NET string to an ASCII Pascal string. + /// Converts a .NET string to an ASCII Pascal string. /// /// The ASCII Pascal string. /// The .NET string. public static byte[] GetBytes(string str) { - if(str == null) - return new byte[1]; + if(str == null) return new byte[1]; byte[] str_b = Encoding.ASCII.GetBytes(str); byte[] PStr; - if(str_b.Length >= 256) - PStr = new byte[256]; - else - PStr = new byte[str_b.Length + 1]; + if(str_b.Length >= 256) PStr = new byte[256]; + else PStr = new byte[str_b.Length + 1]; Array.Copy(str_b, 0, PStr, 1, PStr.Length - 1); - PStr[0] = (byte)(PStr.Length - 1); + PStr[0] = (byte)(PStr.Length - 1); return PStr; } } -} - +} \ No newline at end of file diff --git a/Claunia.RsrcFork/Resource.cs b/Claunia.RsrcFork/Resource.cs index ee3e826..c1ad1dd 100644 --- a/Claunia.RsrcFork/Resource.cs +++ b/Claunia.RsrcFork/Resource.cs @@ -33,24 +33,18 @@ using System.Text; namespace Claunia.RsrcFork { /// - /// This class represents a resource type. + /// This class represents a resource type. /// public class Resource { - readonly Dictionary resourceNames; + readonly List ids; + readonly Dictionary resourceCache; + readonly Dictionary resourceNames; readonly Dictionary resources; - readonly Dictionary resourceCache; - readonly Stream rsrcStream; - readonly List ids; - - struct ResourceData - { - public long offset; - public long length; - } + readonly Stream rsrcStream; /// - /// Initializates the specified resource type. + /// Initializates the specified resource type. /// /// Stream where the resources of this reside. /// How many resource of this type are. @@ -58,13 +52,15 @@ namespace Claunia.RsrcFork /// Offset from start of stream to resource name list. /// Offset from start of stream to resource data. /// Resource type. - internal Resource(Stream stream, ushort resources, long referenceListOff, long resourceNameOffset, long resourceDataOffset, uint OSType) + internal Resource(Stream stream, ushort resources, long referenceListOff, long resourceNameOffset, + long resourceDataOffset, uint OSType) { rsrcStream = stream; - Dictionary referenceLists = new Dictionary(); - resourceNames = new Dictionary(); + Dictionary referenceLists = + new Dictionary(); + resourceNames = new Dictionary(); this.resources = new Dictionary(); - ids = new List(); + ids = new List(); byte[] tmp; rsrcStream.Seek(referenceListOff + 2, SeekOrigin.Begin); @@ -76,11 +72,11 @@ namespace Claunia.RsrcFork item.id = BitConverter.ToInt16(tmp.Reverse().ToArray(), 0); rsrcStream.Read(tmp, 0, 2); item.nameOff = BitConverter.ToInt16(tmp.Reverse().ToArray(), 0); - tmp = new byte[4]; + tmp = new byte[4]; rsrcStream.Read(tmp, 0, 4); item.attributes = tmp[0]; - tmp[0] = 0; - item.dataOff = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); + tmp[0] = 0; + item.dataOff = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); rsrcStream.Read(tmp, 0, 4); item.handle = BitConverter.ToUInt32(tmp.Reverse().ToArray(), 0); @@ -90,15 +86,14 @@ namespace Claunia.RsrcFork foreach(ResourceTypeReferenceListItem item in referenceLists.Values) { - string name; + string name; ResourceData data = new ResourceData(); - if(item.nameOff == -1) - name = null; + if(item.nameOff == -1) name = null; else { rsrcStream.Seek(resourceNameOffset + item.nameOff, SeekOrigin.Begin); - byte nameLen = (byte)rsrcStream.ReadByte(); + byte nameLen = (byte)rsrcStream.ReadByte(); byte[] nameBytes = new byte[nameLen]; rsrcStream.Read(nameBytes, 0, nameLen); // TODO: Use MacRoman @@ -119,7 +114,7 @@ namespace Claunia.RsrcFork } /// - /// Gets the name of the specified resource id, or null if there is no name. + /// Gets the name of the specified resource id, or null if there is no name. /// /// The name. /// Identifier. @@ -130,7 +125,7 @@ namespace Claunia.RsrcFork } /// - /// Gets the resource contents. + /// Gets the resource contents. /// /// The resource. /// Identifier. @@ -138,13 +133,11 @@ namespace Claunia.RsrcFork { byte[] resource; - if(resourceCache.TryGetValue(id, out resource)) - return resource; + if(resourceCache.TryGetValue(id, out resource)) return resource; ResourceData data; - if(!resources.TryGetValue(id, out data)) - return null; + if(!resources.TryGetValue(id, out data)) return null; resource = new byte[data.length]; rsrcStream.Seek(data.offset, SeekOrigin.Begin); @@ -156,7 +149,7 @@ namespace Claunia.RsrcFork } /// - /// Gets the length of the resource specified by ID. + /// Gets the length of the resource specified by ID. /// /// The length. /// Resource identifier. @@ -167,23 +160,22 @@ namespace Claunia.RsrcFork } /// - /// Gets the IDs of all the resources contained by this instance. + /// Gets the IDs of all the resources contained by this instance. /// /// The identifiers. - public short[] GetIds() - { - return ids.ToArray(); - } + public short[] GetIds() => ids.ToArray(); /// - /// Checks if the resource specified by ID is contained by this instance. + /// Checks if the resource specified by ID is contained by this instance. /// /// true, if the resource is contained in this instance, false otherwise. /// Resource identifier. - public bool ContainsId(short id) + public bool ContainsId(short id) => ids.Contains(id); + + struct ResourceData { - return ids.Contains(id); + public long offset; + public long length; } } -} - +} \ No newline at end of file diff --git a/Claunia.RsrcFork/ResourceFork.cs b/Claunia.RsrcFork/ResourceFork.cs index 83cc594..c8f77e0 100644 --- a/Claunia.RsrcFork/ResourceFork.cs +++ b/Claunia.RsrcFork/ResourceFork.cs @@ -31,19 +31,19 @@ using System.Linq; namespace Claunia.RsrcFork { /// - /// This class represents a resource fork. + /// This class represents a resource fork. /// public class ResourceFork { - Stream rsrcStream; - ResourceHeader header; - ResourceMap map; + ResourceHeader header; + ResourceMap map; + List osTypes; + Dictionary resourceCache; Dictionary resourceTypeList; - Dictionary resourceCache; - List osTypes; + readonly Stream rsrcStream; /// - /// Initializates a resource fork using a byte array as backend. + /// Initializates a resource fork using a byte array as backend. /// /// Buffer. public ResourceFork(byte[] buffer) @@ -53,7 +53,7 @@ namespace Claunia.RsrcFork } /// - /// Initializates a resource fork using a stream as backed. + /// Initializates a resource fork using a stream as backed. /// /// Stream. public ResourceFork(Stream stream) @@ -63,16 +63,15 @@ namespace Claunia.RsrcFork } /// - /// Cleans up this instances and closes the underlying stream. + /// Cleans up this instances and closes the underlying stream. /// ~ResourceFork() { - if(rsrcStream != null) - rsrcStream.Dispose(); + if(rsrcStream != null) rsrcStream.Dispose(); } /// - /// Initializes this instance. + /// Initializes this instance. /// void Init() { @@ -88,14 +87,14 @@ namespace Claunia.RsrcFork rsrcStream.Read(tmp, 0, 4); header.resourceMapLen = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); - if(header.resourceDataOff <= 0 || header.resourceMapOff <= 0 || header.resourceDataLen <= 0 || header.resourceMapLen <= 0) - throw new InvalidCastException("Not a resource fork"); + if(header.resourceDataOff <= 0 || header.resourceMapOff <= 0 || header.resourceDataLen <= 0 || + header.resourceMapLen <= 0) throw new InvalidCastException("Not a resource fork"); if(header.resourceDataOff + header.resourceDataLen > rsrcStream.Length || - header.resourceMapOff + header.resourceMapLen > rsrcStream.Length) + header.resourceMapOff + header.resourceMapLen > rsrcStream.Length) throw new InvalidCastException("Not a resource fork"); - map = new ResourceMap(); + map = new ResourceMap(); map.header = new ResourceHeader(); rsrcStream.Seek(header.resourceMapOff, SeekOrigin.Begin); rsrcStream.Read(tmp, 0, 4); @@ -109,13 +108,13 @@ namespace Claunia.RsrcFork if(map.header.resourceDataOff != header.resourceDataOff || map.header.resourceDataLen != header.resourceDataLen || - map.header.resourceMapOff != header.resourceMapOff || - map.header.resourceMapLen != header.resourceMapLen) + map.header.resourceMapOff != header.resourceMapOff || + map.header.resourceMapLen != header.resourceMapLen) throw new InvalidCastException("Header copy is not same as header."); rsrcStream.Read(tmp, 0, 4); map.handleToNextMap = BitConverter.ToUInt32(tmp.Reverse().ToArray(), 0); - tmp = new byte[2]; + tmp = new byte[2]; rsrcStream.Read(tmp, 0, 2); map.fileRefNo = BitConverter.ToUInt16(tmp.Reverse().ToArray(), 0); rsrcStream.Read(tmp, 0, 2); @@ -132,14 +131,15 @@ namespace Claunia.RsrcFork map.numberOfTypes = BitConverter.ToUInt16(tmp.Reverse().ToArray(), 0); resourceTypeList = new Dictionary(); - osTypes = new List(); + osTypes = new List(); - for(int i = 0; i <= map.numberOfTypes; i++) { + for(int i = 0; i <= map.numberOfTypes; i++) + { ResourceTypeListItem typeList = new ResourceTypeListItem(); tmp = new byte[4]; rsrcStream.Read(tmp, 0, 4); typeList.type = BitConverter.ToUInt32(tmp.Reverse().ToArray(), 0); - tmp = new byte[2]; + tmp = new byte[2]; rsrcStream.Read(tmp, 0, 2); typeList.resources = BitConverter.ToUInt16(tmp.Reverse().ToArray(), 0); rsrcStream.Read(tmp, 0, 2); @@ -153,7 +153,7 @@ namespace Claunia.RsrcFork } /// - /// Gets the resources with indicated type + /// Gets the resources with indicated type /// /// The resource. /// OSType. @@ -161,14 +161,15 @@ namespace Claunia.RsrcFork { Resource rsrc; - if(resourceCache.TryGetValue(OSType, out rsrc)) - return rsrc; + if(resourceCache.TryGetValue(OSType, out rsrc)) return rsrc; ResourceTypeListItem typeList; - if(!resourceTypeList.TryGetValue(OSType, out typeList)) - return null; + if(!resourceTypeList.TryGetValue(OSType, out typeList)) return null; - rsrc = new Resource(rsrcStream, (ushort)(typeList.resources + 1), header.resourceMapOff + map.typeListOff + typeList.referenceOff - 2, header.resourceMapOff + map.nameListOff, header.resourceDataOff, OSType); + rsrc = new Resource(rsrcStream, (ushort)(typeList.resources + 1), + header.resourceMapOff + map.typeListOff + typeList.referenceOff - 2, + header.resourceMapOff + map.nameListOff, + header.resourceDataOff, OSType); resourceCache.Add(OSType, rsrc); @@ -176,22 +177,15 @@ namespace Claunia.RsrcFork } /// - /// Gets all OSTypes stored in this resource fork + /// Gets all OSTypes stored in this resource fork /// /// The types. - public uint[] GetTypes() - { - return osTypes.ToArray(); - } + public uint[] GetTypes() => osTypes.ToArray(); /// - /// Returns true if the specified OSType is present in this resource fork. + /// Returns true if the specified OSType is present in this resource fork. /// /// OSType. - public bool ContainsKey(uint OSType) - { - return resourceTypeList.ContainsKey(OSType); - } + public bool ContainsKey(uint OSType) => resourceTypeList.ContainsKey(OSType); } -} - +} \ No newline at end of file diff --git a/Claunia.RsrcFork/Resources/Version.cs b/Claunia.RsrcFork/Resources/Version.cs index 7c4e193..fed9ff6 100644 --- a/Claunia.RsrcFork/Resources/Version.cs +++ b/Claunia.RsrcFork/Resources/Version.cs @@ -31,68 +31,35 @@ using Claunia.RsrcFork; namespace Resources { /// - /// This class handles the "VERS" resource fork + /// This class handles the "VERS" resource fork /// public class Version { - static uint ostype = 0x76657273; - - #region On-disk structure /// - /// Major version. - /// - public byte MajorVersion; - /// - /// Minor version. - /// - public byte MinorVersion; - /// - /// Development stage. - /// - public DevelopmentStage DevStage; - /// - /// Pre-release version. - /// - public byte PreReleaseVersion; - /// - /// Region code. - /// - public ushort RegionCode; - /// - /// Version string. - /// - public string VersionString; - /// - /// Version message. - /// - public string VersionMessage; - #endregion - - /// - /// Known development stages + /// Known development stages /// public enum DevelopmentStage : byte { /// - /// Pre-alpha. + /// Pre-alpha. /// PreAlpha = 0x20, /// - /// Alpha. + /// Alpha. /// Alpha = 0x40, /// - /// Beta. + /// Beta. /// Beta = 0x60, /// - /// Final release. + /// Final release. /// Final = 0x80 } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// Byte array containing the "VERS" resource. public Version(byte[] resource) @@ -101,30 +68,36 @@ namespace Resources tmpShort = new byte[2]; - MajorVersion = BCDToNumber(resource[0]); - MinorVersion = BCDToNumber(resource[1]); - DevStage = (DevelopmentStage)resource[2]; + MajorVersion = BCDToNumber(resource[0]); + MinorVersion = BCDToNumber(resource[1]); + DevStage = (DevelopmentStage)resource[2]; PreReleaseVersion = BCDToNumber(resource[3]); Array.Copy(resource, 4, tmpShort, 0, 2); RegionCode = BitConverter.ToUInt16(tmpShort.Reverse().ToArray(), 0); - tmpStr = new byte[resource[6] + 1]; + tmpStr = new byte[resource[6] + 1]; Array.Copy(resource, 6, tmpStr, 0, tmpStr.Length); VersionString = PascalString.GetString(tmpStr); - tmpMsg = new byte[resource[6 + tmpStr.Length] + 1]; + tmpMsg = new byte[resource[6 + tmpStr.Length] + 1]; Array.Copy(resource, 6 + tmpStr.Length, tmpMsg, 0, tmpMsg.Length); VersionMessage = PascalString.GetString(tmpMsg); } /// - /// Gets a byte array with the "VERS" resource contained by this instance. + /// Gets the OSTYPE of this resource. + /// + /// The OSTYPE. + public static uint OSType { get; } = 0x76657273; + + /// + /// Gets a byte array with the "VERS" resource contained by this instance. /// /// The "VERS" resource. public byte[] GetBytes() { byte[] tmpShort, tmpStr, tmpMsg; tmpShort = BitConverter.GetBytes(RegionCode).Reverse().ToArray(); - tmpStr = PascalString.GetBytes(VersionString); - tmpMsg = PascalString.GetBytes(VersionMessage); + tmpStr = PascalString.GetBytes(VersionString); + tmpMsg = PascalString.GetBytes(VersionMessage); byte[] vers = new byte[6 + tmpStr.Length + tmpMsg.Length]; @@ -132,35 +105,51 @@ namespace Resources vers[1] = NumberToBCD(MinorVersion); vers[2] = (byte)DevStage; vers[3] = NumberToBCD(PreReleaseVersion); - Array.Copy(tmpShort, 0, vers, 4, 2); - Array.Copy(tmpStr, 0, vers, 6, tmpStr.Length); - Array.Copy(tmpMsg, 0, vers, 6 + tmpStr.Length, tmpMsg.Length); + Array.Copy(tmpShort, 0, vers, 4, 2); + Array.Copy(tmpStr, 0, vers, 6, tmpStr.Length); + Array.Copy(tmpMsg, 0, vers, 6 + tmpStr.Length, tmpMsg.Length); return vers; } - /// - /// Gets the OSTYPE of this resource. - /// - /// The OSTYPE. - public static uint OSType { - get { - return ostype; - } - } - - byte BCDToNumber(byte bcd) - { - return Convert.ToByte(string.Format("{0:X2}", bcd), 10); - } + byte BCDToNumber(byte bcd) => Convert.ToByte(string.Format("{0:X2}", bcd), 10); byte NumberToBCD(byte number) { - if(number >= 100) - number = 99; + if(number >= 100) number = 99; return Convert.ToByte(string.Format("{0:D2}", number), 16); } - } -} + #region On-disk structure + /// + /// Major version. + /// + public byte MajorVersion; + /// + /// Minor version. + /// + public byte MinorVersion; + /// + /// Development stage. + /// + public DevelopmentStage DevStage; + /// + /// Pre-release version. + /// + public byte PreReleaseVersion; + /// + /// Region code. + /// + public ushort RegionCode; + /// + /// Version string. + /// + public string VersionString; + /// + /// Version message. + /// + public string VersionMessage; + #endregion + } +} \ No newline at end of file diff --git a/Claunia.RsrcFork/Structs.cs b/Claunia.RsrcFork/Structs.cs index c67597a..6beae38 100644 --- a/Claunia.RsrcFork/Structs.cs +++ b/Claunia.RsrcFork/Structs.cs @@ -29,19 +29,19 @@ namespace Claunia.RsrcFork struct ResourceHeader { /// - /// Offset from start of resource fork to resource data + /// Offset from start of resource fork to resource data /// public int resourceDataOff; /// - /// Offset from start of resource fork to resource map + /// Offset from start of resource fork to resource map /// public int resourceMapOff; /// - /// Length of resource data + /// Length of resource data /// public int resourceDataLen; /// - /// Length of resource map + /// Length of resource map /// public int resourceMapLen; } @@ -49,31 +49,31 @@ namespace Claunia.RsrcFork struct ResourceMap { /// - /// Copy of the resource fork header + /// Copy of the resource fork header /// public ResourceHeader header; /// - /// Reserved for handle to next resource map + /// Reserved for handle to next resource map /// public uint handleToNextMap; /// - /// Reserved for file reference number + /// Reserved for file reference number /// public ushort fileRefNo; /// - /// Resource fork attributes + /// Resource fork attributes /// public ushort attributes; /// - /// Offset from start of resource map to resource type list + /// Offset from start of resource map to resource type list /// public short typeListOff; /// - /// Offset from start of resource map to resource name list + /// Offset from start of resource map to resource name list /// public short nameListOff; /// - /// Number of types in the map minus 1 + /// Number of types in the map minus 1 /// public ushort numberOfTypes; } @@ -81,15 +81,15 @@ namespace Claunia.RsrcFork struct ResourceTypeListItem { /// - /// Resource type + /// Resource type /// public uint type; /// - /// Number of resources of this type minus 1 + /// Number of resources of this type minus 1 /// public ushort resources; /// - /// Offset from beginning of resource type list to reference list + /// Offset from beginning of resource type list to reference list /// public short referenceOff; } @@ -97,25 +97,24 @@ namespace Claunia.RsrcFork struct ResourceTypeReferenceListItem { /// - /// Resource ID + /// Resource ID /// public short id; /// - /// Offset from beginning of resource name list to resource name. -1 if it does not have a name + /// Offset from beginning of resource name list to resource name. -1 if it does not have a name /// public short nameOff; /// - /// Resource attributes + /// Resource attributes /// public byte attributes; /// - /// Offset from beginning of resource data to resource. First byte is . + /// Offset from beginning of resource data to resource. First byte is . /// public int dataOff; /// - /// Reserved for handle to resource + /// Reserved for handle to resource /// public uint handle; } -} - +} \ No newline at end of file diff --git a/Claunia.RsrcFork/Types.cs b/Claunia.RsrcFork/Types.cs index bec0402..52e744f 100644 --- a/Claunia.RsrcFork/Types.cs +++ b/Claunia.RsrcFork/Types.cs @@ -25,24 +25,25 @@ // THE SOFTWARE. using System; -using System.Text; using System.Linq; +using System.Text; namespace Claunia.RsrcFork { /// - /// This class contains static methods for OSTYPE handling. + /// This class contains static methods for OSTYPE handling. /// public static class Types { /// - /// Gets a descriptive name of a resource from its OSTYPE. + /// Gets a descriptive name of a resource from its OSTYPE. /// /// The name corresponding to the specified OSTYPE. /// The OSTYPE. public static string GetName(uint OSType) { - switch(OSType) { + switch(OSType) + { case 0x2E58534C: // ".XSL" return "XML style sheet"; case 0x33444D46: // "3DMF" @@ -683,26 +684,23 @@ namespace Claunia.RsrcFork return "MC680x0 Code"; case 0x5F505043: // "_PPC" return "PowerPC Code"; - default: - return null; + default: return null; } } /// - /// Gets a descriptive name of a resource from its OSTYPE. + /// Gets a descriptive name of a resource from its OSTYPE. /// /// The name corresponding to the specified OSTYPE. /// The OSTYPE. public static string GetName(string OSType) { - if(OSType.Length != 4) - return null; + if(OSType.Length != 4) return null; byte[] typB = Encoding.ASCII.GetBytes(OSType); - uint type = BitConverter.ToUInt32(typB.Reverse().ToArray(), 0); + uint type = BitConverter.ToUInt32(typB.Reverse().ToArray(), 0); return GetName(type); } } -} - +} \ No newline at end of file