package edu.cmu.sv.arinc838.builder; import java.io.IOException; import com.arinc.arinc838.FileDefinition; import com.arinc.arinc838.IntegrityDefinition; import edu.cmu.sv.arinc838.binary.BdfFile; import edu.cmu.sv.arinc838.dao.FileDefinitionDao; import edu.cmu.sv.arinc838.dao.IntegrityDefinitionDao; public class FileDefinitionBuilder implements Builder<FileDefinitionDao, FileDefinition> { private BuilderFactory builderFactory; public FileDefinitionBuilder(BuilderFactory builderFactory) { this.builderFactory = builderFactory; } @Override public FileDefinition buildXml(FileDefinitionDao fileDefinitionDao) { FileDefinition retDef = new FileDefinition(); retDef.setFileLoadable(fileDefinitionDao.isFileLoadable()); retDef.setFileName(fileDefinitionDao.getFileName()); retDef.setFileSize(fileDefinitionDao.getFileSize()); retDef.setFileIntegrityDefinition(builderFactory.getBuilder(IntegrityDefinitionDao.class, IntegrityDefinition.class).buildXml(fileDefinitionDao.getFileIntegrityDefinition())); return retDef; } @Override public int buildBinary(FileDefinitionDao fileDefinitionDao, BdfFile bdfFile) throws IOException { int initialPosition = (int) bdfFile.getFilePointer(); bdfFile.writeUint32(0); // Place holder for APTPTR to the next file // definition bdfFile.writeBoolean(fileDefinitionDao.isFileLoadable()); bdfFile.writeStr64k(fileDefinitionDao.getFileName()); bdfFile.writeUint32(fileDefinitionDao.getFileSize()); builderFactory.getBuilder(IntegrityDefinitionDao.class, IntegrityDefinition.class).buildBinary(fileDefinitionDao.getFileIntegrityDefinition(), bdfFile); int finalPosition = (int) bdfFile.getFilePointer(); // If not last file def then fill in the pointer to the next file def if (!fileDefinitionDao.isLast()) { bdfFile.seek(initialPosition); bdfFile.writeUint32(finalPosition); bdfFile.seek(finalPosition); } return (int) (finalPosition - initialPosition); } }