]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Implement connection.{Cancel,Choke}
authorMatt Joiner <anacrolix@gmail.com>
Wed, 21 May 2014 07:49:28 +0000 (17:49 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 21 May 2014 07:49:28 +0000 (17:49 +1000)
client.go
connection.go

index 3ca57e10a8f3ae12446a871b723d0c13dd6f38cb..e697884e81a192c5c2f5ec0fc358948743abb7e4 100644 (file)
--- a/client.go
+++ b/client.go
@@ -401,6 +401,7 @@ func (me *Client) connectionLoop(torrent *torrent, conn *connection) error {
                        conn.Unchoke()
                case peer_protocol.NotInterested:
                        conn.PeerInterested = false
+                       conn.Choke()
                case peer_protocol.Have:
                        me.peerGotPiece(torrent, conn, int(msg.Index))
                case peer_protocol.Request:
index 136520874c83e11648b2895572aa1db712e841d8..96a1d2154d9676370fe45af843a9f33d82ccaf9b 100644 (file)
@@ -89,6 +89,24 @@ func (c *connection) Request(chunk request) bool {
        return true
 }
 
+// Returns true if an unsatisfied request was canceled.
+func (c *connection) Cancel(r request) bool {
+       if c.Requests == nil {
+               return false
+       }
+       if _, ok := c.Requests[r]; !ok {
+               return false
+       }
+       delete(c.Requests, r)
+       c.Post(peer_protocol.Message{
+               Type:   peer_protocol.Cancel,
+               Index:  r.Index,
+               Begin:  r.Begin,
+               Length: r.Length,
+       })
+       return true
+}
+
 // Returns true if an unsatisfied request was canceled.
 func (c *connection) PeerCancel(r request) bool {
        if c.PeerRequests == nil {
@@ -101,6 +119,16 @@ func (c *connection) PeerCancel(r request) bool {
        return true
 }
 
+func (c *connection) Choke() {
+       if c.Choked {
+               return
+       }
+       c.Post(peer_protocol.Message{
+               Type: peer_protocol.Choke,
+       })
+       c.Choked = true
+}
+
 func (c *connection) Unchoke() {
        if !c.Choked {
                return