Added fragment calculations (untested).
This commit is contained in:
@@ -16,6 +16,54 @@ func (f *fragment) SizeLeft() uint32 {
|
||||
|
||||
func (f *fragment) AddFragment(fil *fileHolder) {
|
||||
//SizeLeft should already be checked
|
||||
fil.fragOffset = len(f.files)
|
||||
f.files = append(f.files, fil)
|
||||
f.sizes = append(f.sizes, fil.blockSizes[len(fil.blockSizes)-1])
|
||||
}
|
||||
|
||||
func (w *Writer) addToFragments(fil *fileHolder) {
|
||||
fragSize := fil.blockSizes[len(fil.blockSizes)-1]
|
||||
//only fragment if the final block is less then 80% of a full block or AlwaysFragment
|
||||
if w.Flags.AlwaysFragment || fragSize < uint32(float32(w.BlockSize)*0.8) {
|
||||
var possibleFrags []int
|
||||
for i := range w.frags {
|
||||
left := w.frags[i].SizeLeft()
|
||||
if left == fragSize {
|
||||
fil.fragIndex = i
|
||||
w.frags[i].AddFragment(fil)
|
||||
return
|
||||
} else if left > fragSize {
|
||||
possibleFrags = append(possibleFrags, i)
|
||||
}
|
||||
}
|
||||
if len(possibleFrags) > 0 {
|
||||
fil.fragIndex = possibleFrags[0]
|
||||
} else {
|
||||
fil.fragIndex = len(w.frags)
|
||||
w.frags = append(w.frags, fragment{
|
||||
w: w,
|
||||
files: []*fileHolder{fil},
|
||||
sizes: []uint32{fragSize},
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (w *Writer) calculateFragsAndBlockSizes() {
|
||||
for _, files := range w.structure {
|
||||
for i := range files {
|
||||
files[i].fragIndex = -1
|
||||
files[i].blockSizes = make([]uint32, files[i].size/uint64(w.BlockSize))
|
||||
for j := range files[i].blockSizes {
|
||||
files[i].blockSizes[j] = w.BlockSize
|
||||
}
|
||||
fragSize := uint32(files[i].size % uint64(w.BlockSize))
|
||||
if fragSize > 0 {
|
||||
files[i].blockSizes = append(files[i].blockSizes, fragSize)
|
||||
if !w.Flags.NoFragments {
|
||||
w.addToFragments(files[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user