From f2ebdc9e4b0ad69a5a878c8e14b4e1a6bd34a831 Mon Sep 17 00:00:00 2001 From: Sam T Date: Sun, 9 Jun 2013 03:39:34 +0400 Subject: ~ Hide *.Protocol modules. --- src/Network/BitTorrent.hs | 6 +++- src/Network/BitTorrent/Exchange.hs | 57 +++++++++++++++++++++++++++++++++----- src/Network/BitTorrent/Peer.hs | 3 +- 3 files changed, 57 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/Network/BitTorrent.hs b/src/Network/BitTorrent.hs index 51ba6aac..ac9ed50a 100644 --- a/src/Network/BitTorrent.hs +++ b/src/Network/BitTorrent.hs @@ -5,7 +5,11 @@ -- Stability : experimental -- Portability : portable -- -module Network.BitTorrent (module BT) where +module Network.BitTorrent + (module BT + +-- , ClientSession, newClient + ) where import Network.BitTorrent.Extension as BT import Network.BitTorrent.Peer as BT diff --git a/src/Network/BitTorrent/Exchange.hs b/src/Network/BitTorrent/Exchange.hs index d75fdf96..425ed2a3 100644 --- a/src/Network/BitTorrent/Exchange.hs +++ b/src/Network/BitTorrent/Exchange.hs @@ -6,18 +6,61 @@ -- Portability : portable -- {-# LANGUAGE DoAndIfThenElse #-} -module Network.BitTorrent.Exchange (module PW) where +module Network.BitTorrent.Exchange + ( + -- * Session + PeerSession, newLeacher, newSeeder + ) where + +import Control.Applicative +import Control.Concurrent +import Control.Concurrent.STM +import Data.IORef +import Data.Function +import Data.Ord +import Data.Set as S + +import Data.Conduit +import Data.Conduit.Cereal +import Data.Conduit.Network +import Data.Serialize import Network.BitTorrent.Exchange.Selection as PW import Network.BitTorrent.Exchange.Protocol as PW +import Network.BitTorrent.Internal +import Network.BitTorrent.Extension +import Network.BitTorrent.Peer +import Data.Bitfield as BF +import Data.Torrent + +{----------------------------------------------------------------------- + P2P monad +-----------------------------------------------------------------------} + {- +type P2P = Reader PeerSession (ConduitM Message Message IO) -newtype P2P a = P2P { - getP2P :: ReaderT PSession State PState (Conduit Message IO Message) a - } +conduit :: Socket -> P2P a -> IO a +conduit sock p2p = + sourceSocket sock $= + conduitGet get $= + messageLoop p2p $= + conduitPut put $$ + sinkSocket sock -runP2P :: PConnection -> P2P a -> IO a -recvMessage :: P2P Message -sendMessage :: Message -> P2P () +messageLoop :: P2P () -> P2P () +messageLoop = undefined + +runP2P :: SSession -> PeerAddr -> P2P a -> IO a +runP2P se addr p2p = withPeer se addr $ conduit messageLoop + +data Event = Available + | Want + | Block + +{- +waitForEvent :: P2P Event +signalEvent :: Event -> P2P () +-} -} \ No newline at end of file diff --git a/src/Network/BitTorrent/Peer.hs b/src/Network/BitTorrent/Peer.hs index 6ab80fb6..9aa924d3 100644 --- a/src/Network/BitTorrent/Peer.hs +++ b/src/Network/BitTorrent/Peer.hs @@ -488,7 +488,8 @@ data PeerAddr = PeerAddr { peerID :: Maybe PeerID , peerIP :: HostAddress , peerPort :: PortNumber - } deriving (Show, Eq) + } deriving (Show, Eq, Ord) + -- TODO verify semantic of ord and eq instances instance BEncodable PortNumber where toBEncode = toBEncode . fromEnum -- cgit v1.2.3