in vhdcore/vhdfile/vhdFileFactory.go [45:94]
func (f *FileFactory) CreateFromReaderAtReader(r reader.ReadAtReader, size int64) (*VhdFile, error) {
vhdReader := reader.NewVhdReader(r, size)
vhdFooter, err := (footer.NewFactory(vhdReader)).Create()
if err != nil {
return nil, err
}
vhdFile := VhdFile{
Footer: vhdFooter,
VhdReader: vhdReader,
}
if vhdFooter.DiskType == footer.DiskTypeFixed {
return &vhdFile, nil
}
// Disk is an expanding type (Dynamic or differencing)
vhdHeader, err := (header.NewFactory(vhdReader, vhdFooter.HeaderOffset)).Create()
if err != nil {
return nil, err
}
vhdFile.Header = vhdHeader
vhdBlockAllocationTable, err := (bat.NewBlockAllocationFactory(vhdReader, vhdHeader)).Create()
if err != nil {
return nil, err
}
vhdFile.BlockAllocationTable = vhdBlockAllocationTable
if vhdFooter.DiskType == footer.DiskTypeDynamic {
return &vhdFile, nil
}
var parentPath string
if f.vhdDir == "." || f.vhdDir == string(os.PathSeparator) {
parentPath = vhdHeader.ParentPath
} else {
parentPath = filepath.Join(parentPath, vhdHeader.ParentLocators.GetRelativeParentPath())
}
// Insert a node in the doubly linked list of VhdFileFactory chain.
f.parentVhdFileFactory = &FileFactory{childVhdFileFactory: f}
// Set differencing disk parent VhdFile
vhdFile.Parent, err = f.parentVhdFileFactory.Create(parentPath)
if err != nil {
return nil, err
}
return &vhdFile, nil
}