...
1 package queue
2
3 import (
4 "fmt"
5 "github.com/concurrency-8/parser"
6 )
7
8
9 type Queue struct {
10 torrent parser.TorrentFile
11 Choked bool
12 queue []parser.PieceBlock
13 }
14
15
16 func NewQueue(torrent parser.TorrentFile) (queue *Queue) {
17 queue = &Queue{torrent, true, make([]parser.PieceBlock, 0)}
18 return
19 }
20
21
22 func (queue *Queue) Enqueue(pieceIndex uint32) (err error) {
23 nBlocks, err := parser.BlocksPerPiece(queue.torrent, pieceIndex)
24
25 if err != nil {
26 return
27 }
28
29 for i := 0; i < int(nBlocks); i++ {
30 blocklen, err := parser.BlockLen(queue.torrent, pieceIndex, uint32(i))
31 if err != nil {
32 break
33 }
34
35 pieceBlock := parser.PieceBlock{
36 Index: pieceIndex,
37 Begin: uint32(i) * parser.BLOCK_LEN,
38 Length: blocklen,
39 Nblocks: nBlocks,
40 }
41 queue.queue = append(queue.queue, pieceBlock)
42
43 }
44 return
45 }
46
47
48 func (queue *Queue) Dequeue() error {
49 if queue.Length() == 0 {
50 return fmt.Errorf("Queue empty : can't dequeue")
51 }
52
53 queue.queue = queue.queue[1:]
54 return nil
55 }
56
57
58 func (queue *Queue) Peek() (block parser.PieceBlock, err error) {
59
60 if queue.Length() == 0 {
61 err = fmt.Errorf("Queue empty : can't peek")
62 } else {
63 block = queue.queue[0]
64 }
65 return
66 }
67
68
69 func (queue *Queue) Length() int {
70 return len(queue.queue)
71 }
72
View as plain text