summaryrefslogtreecommitdiff
path: root/src/Network/BitTorrent/Exchange/Session.hs
diff options
context:
space:
mode:
authorSam Truzjan <pxqr.sta@gmail.com>2014-02-11 12:30:50 +0400
committerSam Truzjan <pxqr.sta@gmail.com>2014-02-11 12:30:50 +0400
commit0ec910a0fb7c1e5d72e06f00806b85111138461a (patch)
tree396fbcac569a171d9ef0e2ffe59dbd27a7f6978f /src/Network/BitTorrent/Exchange/Session.hs
parent4fef598f29cbb138e7b93c5011887c2b92a12879 (diff)
Add exchange manager and session to client session
Diffstat (limited to 'src/Network/BitTorrent/Exchange/Session.hs')
-rw-r--r--src/Network/BitTorrent/Exchange/Session.hs57
1 files changed, 52 insertions, 5 deletions
diff --git a/src/Network/BitTorrent/Exchange/Session.hs b/src/Network/BitTorrent/Exchange/Session.hs
index d455ec65..5bfc2a71 100644
--- a/src/Network/BitTorrent/Exchange/Session.hs
+++ b/src/Network/BitTorrent/Exchange/Session.hs
@@ -1,14 +1,21 @@
1{-# LANGUAGE TemplateHaskell #-} 1{-# LANGUAGE TemplateHaskell #-}
2{-# LANGUAGE DeriveDataTypeable #-} 2{-# LANGUAGE DeriveDataTypeable #-}
3module Network.BitTorrent.Exchange.Session 3module Network.BitTorrent.Exchange.Session
4 ( 4 ( Session
5 , newSession
6 , closeSession
7
8 , Network.BitTorrent.Exchange.Session.insert
5 ) where 9 ) where
6 10
7import Control.Concurrent.STM 11import Control.Concurrent.STM
8import Control.Exception 12import Control.Exception
9import Control.Lens 13import Control.Lens
14import Control.Monad.Reader
15import Control.Monad.State
10import Data.Function 16import Data.Function
11import Data.IORef 17import Data.IORef
18import Data.Map
12import Data.Ord 19import Data.Ord
13import Data.Typeable 20import Data.Typeable
14import Text.PrettyPrint 21import Text.PrettyPrint
@@ -16,8 +23,12 @@ import Text.PrettyPrint
16import Data.Torrent.Bitfield 23import Data.Torrent.Bitfield
17import Data.Torrent.InfoHash 24import Data.Torrent.InfoHash
18import Network.BitTorrent.Core 25import Network.BitTorrent.Core
26import Network.BitTorrent.Exchange.Assembler
27import Network.BitTorrent.Exchange.Block
19import Network.BitTorrent.Exchange.Message 28import Network.BitTorrent.Exchange.Message
20import Network.BitTorrent.Exchange.Status 29import Network.BitTorrent.Exchange.Status
30import Network.BitTorrent.Exchange.Wire
31import System.Torrent.Storage
21 32
22 33
23data ExchangeError 34data ExchangeError
@@ -26,12 +37,45 @@ data ExchangeError
26 | CorruptedPiece PieceIx 37 | CorruptedPiece PieceIx
27 38
28data Session = Session 39data Session = Session
29 { storage :: Storage 40 { peerId :: PeerId
30 , bitfield :: Bitfield 41 , bitfield :: Bitfield
31 , assembler :: Assembler 42 , assembler :: Assembler
32 , peerId :: PeerId 43 , storage :: Storage
44 , unchoked :: [PeerAddr IP]
45 , handler :: Exchange ()
46 , connections :: Map (PeerAddr IP) Connection
33 } 47 }
34 48
49newSession :: PeerAddr IP -> Storage -> Bitfield -> IO Session
50newSession addr st bf = do
51 return Session
52 { peerId = undefined
53 , bitfield = undefined
54 , assembler = undefined
55 , storage = undefined
56 , unchoked = undefined
57 , handler = undefined
58 , connections = undefined
59 }
60
61closeSession :: Session -> IO ()
62closeSession = undefined
63
64insert :: PeerAddr IP -> {- Maybe Socket -> -} Session -> IO ()
65insert addr ses @ Session {..} = do
66 undefined
67-- forkIO $ connectWire hs addr caps (runStateT ses handler)
68
69delete :: PeerAddr IP -> Session -> IO ()
70delete = undefined
71
72deleteAll :: Session -> IO ()
73deleteAll = undefined
74
75{-----------------------------------------------------------------------
76-- Event loop
77-----------------------------------------------------------------------}
78
35type Exchange = StateT Session (ReaderT Connection IO) 79type Exchange = StateT Session (ReaderT Connection IO)
36 80
37--runExchange :: Exchange () -> [PeerAddr] -> IO () 81--runExchange :: Exchange () -> [PeerAddr] -> IO ()
@@ -39,6 +83,9 @@ type Exchange = StateT Session (ReaderT Connection IO)
39-- forM_ peers $ \ peer -> do 83-- forM_ peers $ \ peer -> do
40-- forkIO $ runReaderT (runStateT exchange session ) 84-- forkIO $ runReaderT (runStateT exchange session )
41 85
86data Event = NewMessage (PeerAddr IP) Message
87 | Timeout -- for scheduling
88
42awaitEvent :: Exchange Event 89awaitEvent :: Exchange Event
43awaitEvent = undefined 90awaitEvent = undefined
44 91