public static bool Execute(Request req, out Result result) { result = new Result(); try { var rep = new BlendTypeRepository(); var loader = new BlendLoader(rep); result.EntityList = loader.FromFile(req.FilePath); } catch (Exception e) { return(false); } return(true); }
private static List <BlockHeaderEntity> _CreateEntityList(ReadValueContext context, BlendTypeRepository repository) { var result = new List <BlockHeaderEntity>(); BlendStructures.GlobalHeader.ReadValue(context); while (true) { var blockEntity = BlockHeaderEntity.ReadValue(context); switch (blockEntity.Code) { case "DNA1": // skip result.Add(blockEntity); context.reader.ReadBytes(blockEntity.Size); break; case "ENDB": // end of file result.Add(blockEntity); return(result); case "REND": // RenderInfo case "TEST": // Preview Image // skip result.Add(blockEntity); context.reader.ReadBytes(blockEntity.Size); break; default: { var type = repository.Find(blockEntity.SdnaIndex); // register address mapping int sdnaSize = blockEntity.Count * type.SizeOf(); context.mapper.AddEntry(blockEntity.OldAddress.Address, (int)context.reader.BaseStream.Position, blockEntity.Size, blockEntity.SdnaIndex, type); if (blockEntity.Count == 1 && blockEntity.SdnaIndex == 0 && blockEntity.Size != type.SizeOf()) { // Error? skip result.Add(blockEntity); context.reader.ReadBytes(blockEntity.Size); } else { Debug.Assert((type.SizeOf() * blockEntity.Count) == blockEntity.Size, "structure size unmatched"); for (int i = 0; i < blockEntity.Count; ++i) { var value = type.ReadValue(context); blockEntity.Children.Add(new BlendEntityBase(value.Type.Name, value)); } result.Add(blockEntity); } } break; } } }
public BlendLoader(BlendTypeRepository rep) { m_repository = rep; }