func()

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
}