diff options
author | Sam Truzjan <pxqr.sta@gmail.com> | 2014-02-11 12:30:50 +0400 |
---|---|---|
committer | Sam Truzjan <pxqr.sta@gmail.com> | 2014-02-11 12:30:50 +0400 |
commit | 0ec910a0fb7c1e5d72e06f00806b85111138461a (patch) | |
tree | 396fbcac569a171d9ef0e2ffe59dbd27a7f6978f /src/Network/BitTorrent/Exchange/Session.hs | |
parent | 4fef598f29cbb138e7b93c5011887c2b92a12879 (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.hs | 57 |
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 #-} |
3 | module Network.BitTorrent.Exchange.Session | 3 | module Network.BitTorrent.Exchange.Session |
4 | ( | 4 | ( Session |
5 | , newSession | ||
6 | , closeSession | ||
7 | |||
8 | , Network.BitTorrent.Exchange.Session.insert | ||
5 | ) where | 9 | ) where |
6 | 10 | ||
7 | import Control.Concurrent.STM | 11 | import Control.Concurrent.STM |
8 | import Control.Exception | 12 | import Control.Exception |
9 | import Control.Lens | 13 | import Control.Lens |
14 | import Control.Monad.Reader | ||
15 | import Control.Monad.State | ||
10 | import Data.Function | 16 | import Data.Function |
11 | import Data.IORef | 17 | import Data.IORef |
18 | import Data.Map | ||
12 | import Data.Ord | 19 | import Data.Ord |
13 | import Data.Typeable | 20 | import Data.Typeable |
14 | import Text.PrettyPrint | 21 | import Text.PrettyPrint |
@@ -16,8 +23,12 @@ import Text.PrettyPrint | |||
16 | import Data.Torrent.Bitfield | 23 | import Data.Torrent.Bitfield |
17 | import Data.Torrent.InfoHash | 24 | import Data.Torrent.InfoHash |
18 | import Network.BitTorrent.Core | 25 | import Network.BitTorrent.Core |
26 | import Network.BitTorrent.Exchange.Assembler | ||
27 | import Network.BitTorrent.Exchange.Block | ||
19 | import Network.BitTorrent.Exchange.Message | 28 | import Network.BitTorrent.Exchange.Message |
20 | import Network.BitTorrent.Exchange.Status | 29 | import Network.BitTorrent.Exchange.Status |
30 | import Network.BitTorrent.Exchange.Wire | ||
31 | import System.Torrent.Storage | ||
21 | 32 | ||
22 | 33 | ||
23 | data ExchangeError | 34 | data ExchangeError |
@@ -26,12 +37,45 @@ data ExchangeError | |||
26 | | CorruptedPiece PieceIx | 37 | | CorruptedPiece PieceIx |
27 | 38 | ||
28 | data Session = Session | 39 | data 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 | ||
49 | newSession :: PeerAddr IP -> Storage -> Bitfield -> IO Session | ||
50 | newSession 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 | |||
61 | closeSession :: Session -> IO () | ||
62 | closeSession = undefined | ||
63 | |||
64 | insert :: PeerAddr IP -> {- Maybe Socket -> -} Session -> IO () | ||
65 | insert addr ses @ Session {..} = do | ||
66 | undefined | ||
67 | -- forkIO $ connectWire hs addr caps (runStateT ses handler) | ||
68 | |||
69 | delete :: PeerAddr IP -> Session -> IO () | ||
70 | delete = undefined | ||
71 | |||
72 | deleteAll :: Session -> IO () | ||
73 | deleteAll = undefined | ||
74 | |||
75 | {----------------------------------------------------------------------- | ||
76 | -- Event loop | ||
77 | -----------------------------------------------------------------------} | ||
78 | |||
35 | type Exchange = StateT Session (ReaderT Connection IO) | 79 | type 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 | ||
86 | data Event = NewMessage (PeerAddr IP) Message | ||
87 | | Timeout -- for scheduling | ||
88 | |||
42 | awaitEvent :: Exchange Event | 89 | awaitEvent :: Exchange Event |
43 | awaitEvent = undefined | 90 | awaitEvent = undefined |
44 | 91 | ||