public static ExtraDataBlockHandler GetInstance(ExtraDataBlock item, ShellLinkFile context) { var typename = $"Shellify.IO.{item.GetType().Name}Handler"; var type = Type.GetType(typename); if (type == null) { throw new ArgumentException(typename); } return((ExtraDataBlockHandler)Activator.CreateInstance(type, new object[] { item, context })); }
/// <summary> /// Reads the extra data block. /// </summary> /// <param name="binaryReader">The binary reader.</param> /// <returns></returns> internal static ExtraDataBlock ReadExtraDataBlock(this BinaryReader binaryReader) { int blockSize = binaryReader.ReadInt32(); if (blockSize < 0x4) { return(null); } var signature = (ExtraDataBlockSignature)(binaryReader.ReadInt32()); var extraDataBlock = default(ExtraDataBlock); switch (signature) { // Raw case ExtraDataBlockSignature.UnknownDataBlock: case ExtraDataBlockSignature.ConsoleDataBlock: case ExtraDataBlockSignature.ConsoleFEDataBlock: case ExtraDataBlockSignature.PropertyStoreDataBlock: case ExtraDataBlockSignature.ShimDataBlock: case ExtraDataBlockSignature.TrackerDataBlock: case ExtraDataBlockSignature.VistaAndAboveIDListDataBlock: // Base Folder ID case ExtraDataBlockSignature.KnownFolderDataBlock: case ExtraDataBlockSignature.SpecialFolderDataBlock: { // Skip reading these extra data blocks. binaryReader.BaseStream.Seek(blockSize - Marshal.SizeOf(blockSize) - Marshal.SizeOf(typeof(int)), SeekOrigin.Current); extraDataBlock = new ExtraDataBlock() { Signature = signature }; break; } // String case ExtraDataBlockSignature.DarwinDataBlock: case ExtraDataBlockSignature.EnvironmentVariableDataBlock: case ExtraDataBlockSignature.IconEnvironmentDataBlock: { extraDataBlock = binaryReader.ReadStringExtraDataBlock(signature); break; } } return(extraDataBlock); }
public void TestHandler() { foreach (ExtraDataBlockSignature signature in Enum.GetValues(typeof(ExtraDataBlockSignature))) { ExtraDataBlock block = null; try { block = ExtraDataBlockFactory.GetInstance(signature); } catch (Exception) { Assert.Fail("Check ExtraDataBlockFactory with '{0}' signature", signature); } try { ExtraDataBlockHandlerFactory.GetInstance(block, null); } catch (Exception) { Assert.Fail("Check ExtraDataBlockHandlerFactory with '{0}' block type", block.GetType().Name); } } }