mirror of https://github.com/zlatinb/muwire
add piece size and file length
parent
608de1c9b3
commit
5e0519cc06
|
@ -84,7 +84,7 @@ class FileCollectionBuilder {
|
|||
String comment = sf.getComment() // TODO: check comment encoding
|
||||
if (comment == null)
|
||||
comment = ""
|
||||
def item = new FileCollectionItem(new InfoHash(sf.root), comment, sfPathElements.get(sf))
|
||||
def item = new FileCollectionItem(new InfoHash(sf.root), comment, sfPathElements.get(sf), (byte)sf.pieceSize, sf.getCachedLength())
|
||||
files.add(item)
|
||||
}
|
||||
|
||||
|
|
|
@ -3,19 +3,24 @@ package com.muwire.core.collections
|
|||
import com.muwire.core.Constants
|
||||
import com.muwire.core.InfoHash
|
||||
import com.muwire.core.Name
|
||||
import com.muwire.core.files.FileHasher
|
||||
|
||||
class FileCollectionItem {
|
||||
|
||||
private final InfoHash infoHash
|
||||
private final String comment
|
||||
private final File file
|
||||
private final byte pieceSizePow2
|
||||
private final long length
|
||||
private volatile byte[] payload
|
||||
private final List<String> pathElements = new ArrayList<>()
|
||||
|
||||
public FileCollectionItem(InfoHash infoHash, String comment, List<String> pathElements) {
|
||||
public FileCollectionItem(InfoHash infoHash, String comment, List<String> pathElements, byte pieceSizePow2, long length) {
|
||||
this.infoHash = infoHash
|
||||
this.comment = comment
|
||||
this.pathElements = pathElements
|
||||
this.pieceSizePow2 = pieceSizePow2
|
||||
this.length = length
|
||||
|
||||
File f = null
|
||||
pathElements.each {
|
||||
|
@ -38,6 +43,14 @@ class FileCollectionItem {
|
|||
dis.readFully(hash)
|
||||
infoHash = new InfoHash(hash)
|
||||
|
||||
pieceSizePow2 = dis.readByte()
|
||||
if (pieceSizePow2 < FileHasher.MIN_PIECE_SIZE_POW2 || pieceSizePow2 > FileHasher.MAX_PIECE_SIZE_POW2)
|
||||
throw new InvalidCollectionException("invalid piece size $pieceSizePow2")
|
||||
|
||||
length = dis.readLong()
|
||||
if (length < 1 || length > FileHasher.MAX_SIZE)
|
||||
throw new InvalidCollectionException("invalid length $length")
|
||||
|
||||
int nPathElements = dis.readUnsignedByte()
|
||||
File f = null
|
||||
nPathElements.times {
|
||||
|
@ -62,6 +75,8 @@ class FileCollectionItem {
|
|||
|
||||
daos.writeByte(Constants.COLLECTION_ENTRY_VERSION)
|
||||
daos.write(infoHash.getRoot())
|
||||
daos.writeByte(pieceSizePow2)
|
||||
daos.writeLong(length)
|
||||
daos.writeByte((byte) pathElements.size())
|
||||
pathElements.each {
|
||||
def name = new Name(it)
|
||||
|
|
|
@ -24,8 +24,10 @@ The header is followed by a file entry for each file in the collection. The for
|
|||
```
|
||||
byte 0: File entry version, currently fixed at "1".
|
||||
byte 1-33: hash of the file
|
||||
byte 34: Unsigned 8-bit number of path elements from root to where the file will ultimately be placed upon download.
|
||||
bytes 35-N : UTF-8 encoded length-prefixed path elements. Each element can be at most 32kb long. The last element is the name of the file.
|
||||
byte 34: piece size power of 2
|
||||
bytes 35-43: length of the file
|
||||
byte 44: Unsigned 8-bit number of path elements from root to where the file will ultimately be placed upon download.
|
||||
bytes 45-N : UTF-8 encoded length-prefixed path elements. Each element can be at most 32kb long. The last element is the name of the file.
|
||||
bytes N-M: length-prefixed free from description of the file (comment). Format is UTF-8, maximum size is 32kb.
|
||||
```
|
||||
|
||||
|
|
Loading…
Reference in New Issue