1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveDataTypeable #-}
module Network.BitTorrent.Exchange.Session
( Session
, newSession
, closeSession
, Network.BitTorrent.Exchange.Session.insert
) where
import Control.Concurrent
import Control.Exception
import Control.Lens
import Control.Monad.Reader
import Control.Monad.State
import Data.Function
import Data.IORef
import Data.Map
import Data.Ord
import Data.Typeable
import Text.PrettyPrint
import Data.Torrent.Bitfield
import Data.Torrent.InfoHash
import Network.BitTorrent.Core
import Network.BitTorrent.Exchange.Assembler
import Network.BitTorrent.Exchange.Block
import Network.BitTorrent.Exchange.Message
import Network.BitTorrent.Exchange.Status
import Network.BitTorrent.Exchange.Wire
import System.Torrent.Storage
data ExchangeError
= InvalidPieceIx PieceIx
| InvalidBlock BlockIx
| CorruptedPiece PieceIx
data Session = Session
{ tpeerId :: PeerId
, bitfield :: Bitfield
, assembler :: Assembler
, storage :: Storage
, unchoked :: [PeerAddr IP]
, connections :: MVar (Map (PeerAddr IP) (Connection Session))
}
newSession :: PeerAddr IP -> Storage -> Bitfield -> IO Session
newSession addr st bf = do
return Session
{ tpeerId = undefined
, bitfield = undefined
, assembler = undefined
, storage = undefined
, unchoked = undefined
, connections = undefined
}
closeSession :: Session -> IO ()
closeSession = undefined
insert :: PeerAddr IP -> {- Maybe Socket -> -} Session -> IO ()
insert addr ses @ Session {..} = do
undefined
-- forkIO $ connectWire hs addr caps (runStateT ses handler)
delete :: PeerAddr IP -> Session -> IO ()
delete = undefined
deleteAll :: Session -> IO ()
deleteAll = undefined
{-----------------------------------------------------------------------
-- Event loop
-----------------------------------------------------------------------}
type Exchange = StateT Session (ReaderT (Connection Session) IO)
--runExchange :: Exchange () -> [PeerAddr] -> IO ()
--runExchange exchange peers = do
-- forM_ peers $ \ peer -> do
-- forkIO $ runReaderT (runStateT exchange session )
data Event = NewMessage (PeerAddr IP) Message
| Timeout -- for scheduling
awaitEvent :: Exchange Event
awaitEvent = undefined
yieldEvent :: Exchange Event
yieldEvent = undefined
|