//----------------------------------------------------------------------------
type File struct {
- // this will be returned as SingleFile or MultiFile, see Info method
- name string
- length int64
- files []FileInfo
-
+ // the type is SingleFile or MultiFile
+ Info interface{}
InfoHash []byte
PieceLength int64
Pieces []byte
URLList []string
}
-// the real type of this return value is SingleFile or MultiFile and it must be
-// checked by an API user
-func (f *File) Info() interface{} {
- if len(f.files) > 0 {
- return MultiFile{Name: f.name, Files: f.files}
- }
- return SingleFile{Name: f.name, Length: f.length}
-}
-
-func Open(r io.Reader) (*File, error) {
+func Load(r io.Reader) (*File, error) {
var file File
var data torrent_data
d := bencode.NewDecoder(r)
}
// post-parse processing
- file.name = data.Info.Name
- file.length = data.Info.Length
if len(data.Info.Files) > 0 {
- file.files = make([]FileInfo, len(data.Info.Files))
+ files := make([]FileInfo, len(data.Info.Files))
for i, fi := range data.Info.Files {
- file.files[i] = FileInfo{
+ files[i] = FileInfo{
Length: fi.Length,
Path: fi.Path,
}
}
+ file.Info = MultiFile{
+ Name: data.Info.Name,
+ Files: files,
+ }
+ } else {
+ file.Info = SingleFile{
+ Name: data.Info.Name,
+ Length: data.Info.Length,
+ }
}
file.InfoHash = data.Info.Hash
file.PieceLength = data.Info.PieceLength
return &file, nil
}
-func OpenFromFile(filename string) (*File, error) {
+func LoadFromFile(filename string) (*File, error) {
f, err := os.Open(filename)
if err != nil {
return nil, err
}
defer f.Close()
- return Open(f)
+ return Load(f)
}
//----------------------------------------------------------------------------
import "path"
func test_file(t *testing.T, filename string) {
- f, err := OpenFromFile(filename)
+ f, err := LoadFromFile(filename)
if err != nil {
t.Fatal(err)
}
- switch info := f.Info().(type) {
+ switch info := f.Info.(type) {
case SingleFile:
t.Logf("Single file: %s (length: %d)\n", info.Name, info.Length)
case MultiFile: