|  | @@ -23,9 +23,8 @@ type deviceFolderFileDownloadState struct {
 | 
	
		
			
				|  |  |  // deviceFolderDownloadState holds current download state of all files that
 | 
	
		
			
				|  |  |  // a remote device is currently downloading in a specific folder.
 | 
	
		
			
				|  |  |  type deviceFolderDownloadState struct {
 | 
	
		
			
				|  |  | -	mut                      sync.RWMutex
 | 
	
		
			
				|  |  | -	files                    map[string]deviceFolderFileDownloadState
 | 
	
		
			
				|  |  | -	numberOfBlocksInProgress int
 | 
	
		
			
				|  |  | +	mut   sync.RWMutex
 | 
	
		
			
				|  |  | +	files map[string]deviceFolderFileDownloadState
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Has returns whether a block at that specific index, and that specific version of the file
 | 
	
	
		
			
				|  | @@ -57,7 +56,6 @@ func (p *deviceFolderDownloadState) Update(updates []protocol.FileDownloadProgre
 | 
	
		
			
				|  |  |  	for _, update := range updates {
 | 
	
		
			
				|  |  |  		local, ok := p.files[update.Name]
 | 
	
		
			
				|  |  |  		if update.UpdateType == protocol.UpdateTypeForget && ok && local.version.Equal(update.Version) {
 | 
	
		
			
				|  |  | -			p.numberOfBlocksInProgress -= len(local.blockIndexes)
 | 
	
		
			
				|  |  |  			delete(p.files, update.Name)
 | 
	
		
			
				|  |  |  		} else if update.UpdateType == protocol.UpdateTypeAppend {
 | 
	
		
			
				|  |  |  			if !ok {
 | 
	
	
		
			
				|  | @@ -66,25 +64,25 @@ func (p *deviceFolderDownloadState) Update(updates []protocol.FileDownloadProgre
 | 
	
		
			
				|  |  |  					version:      update.Version,
 | 
	
		
			
				|  |  |  				}
 | 
	
		
			
				|  |  |  			} else if !local.version.Equal(update.Version) {
 | 
	
		
			
				|  |  | -				p.numberOfBlocksInProgress -= len(local.blockIndexes)
 | 
	
		
			
				|  |  |  				local.blockIndexes = append(local.blockIndexes[:0], update.BlockIndexes...)
 | 
	
		
			
				|  |  |  				local.version = update.Version
 | 
	
		
			
				|  |  |  			} else {
 | 
	
		
			
				|  |  |  				local.blockIndexes = append(local.blockIndexes, update.BlockIndexes...)
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  			p.files[update.Name] = local
 | 
	
		
			
				|  |  | -			p.numberOfBlocksInProgress += len(update.BlockIndexes)
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// NumberOfBlocksInProgress returns the number of blocks the device has downloaded
 | 
	
		
			
				|  |  | -// for a specific folder.
 | 
	
		
			
				|  |  | -func (p *deviceFolderDownloadState) NumberOfBlocksInProgress() int {
 | 
	
		
			
				|  |  | +// GetBlockCounts returns a map filename -> number of blocks downloaded.
 | 
	
		
			
				|  |  | +func (p *deviceFolderDownloadState) GetBlockCounts() map[string]int {
 | 
	
		
			
				|  |  |  	p.mut.RLock()
 | 
	
		
			
				|  |  | -	n := p.numberOfBlocksInProgress
 | 
	
		
			
				|  |  | +	res := make(map[string]int, len(p.files))
 | 
	
		
			
				|  |  | +	for name, state := range p.files {
 | 
	
		
			
				|  |  | +		res[name] = len(state.blockIndexes)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  	p.mut.RUnlock()
 | 
	
		
			
				|  |  | -	return n
 | 
	
		
			
				|  |  | +	return res
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // deviceDownloadState represents the state of all in progress downloads
 | 
	
	
		
			
				|  | @@ -134,20 +132,21 @@ func (t *deviceDownloadState) Has(folder, file string, version protocol.Vector,
 | 
	
		
			
				|  |  |  	return f.Has(file, version, index)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// NumberOfBlocksInProgress returns the number of blocks the device has downloaded
 | 
	
		
			
				|  |  | -// for all folders.
 | 
	
		
			
				|  |  | -func (t *deviceDownloadState) NumberOfBlocksInProgress() int {
 | 
	
		
			
				|  |  | +// GetBlockCounts returns a map filename -> number of blocks downloaded for the
 | 
	
		
			
				|  |  | +// given folder.
 | 
	
		
			
				|  |  | +func (t *deviceDownloadState) GetBlockCounts(folder string) map[string]int {
 | 
	
		
			
				|  |  |  	if t == nil {
 | 
	
		
			
				|  |  | -		return 0
 | 
	
		
			
				|  |  | +		return nil
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	n := 0
 | 
	
		
			
				|  |  |  	t.mut.RLock()
 | 
	
		
			
				|  |  | -	for _, folder := range t.folders {
 | 
	
		
			
				|  |  | -		n += folder.NumberOfBlocksInProgress()
 | 
	
		
			
				|  |  | +	for name, state := range t.folders {
 | 
	
		
			
				|  |  | +		if name == folder {
 | 
	
		
			
				|  |  | +			return state.GetBlockCounts()
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	t.mut.RUnlock()
 | 
	
		
			
				|  |  | -	return n
 | 
	
		
			
				|  |  | +	return nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func newDeviceDownloadState() *deviceDownloadState {
 |