import Prelude hiding (log, length, readFile, getContents)
-import Control.Concurrent (forkIO)
+import Control.Concurrent (forkIO, killThread)
import Control.Concurrent.MVar (readMVar)
import Data.ByteString.Char8 (ByteString, getContents, readFile)
-import qualified FuncTorrent.FileSystem as FS (initFS, pieceMapFromFile, startThread)
+import qualified FuncTorrent.FileSystem as FS (createMsgChannel, pieceMapFromFile, run)
import FuncTorrent.Logger (initLogger, logMessage, logStop)
import FuncTorrent.Metainfo (Info(..), Metainfo(..), torrentToMetainfo)
import FuncTorrent.Peer (handlePeerMsgs)
import FuncTorrent.PieceManager (initPieceMap)
import qualified FuncTorrent.Server as Server
-import FuncTorrent.Tracker (connectedPeers, initialTrackerState, trackerLoop, udpTrackerLoop)
-import FuncTorrent.Utils (createDummyFile)
+import FuncTorrent.Tracker (runTracker, getConnectedPeers, newTracker)
import Network (PortID (PortNumber))
+import System.IO (withFile, IOMode (ReadWriteMode))
import System.Directory (doesFileExist)
import System.Environment (getArgs)
import System.Exit (exitSuccess)
fileLen = lengthInBytes (info m)
pieceHash = pieces (info m)
pLen = pieceLength (info m)
+ infohash = infoHash m
defaultPieceMap = initPieceMap pieceHash fileLen pLen
log $ "create FS msg channel"
- (handle, fsMsgChannel) <- FS.initFS filePath
+ fsMsgChannel <- FS.createMsgChannel
log $ "Downloading file : " ++ filePath
- dfe <- doesFileExist filePath
- pieceMap <- if dfe
- then
- FS.pieceMapFromFile handle defaultPieceMap
- else do
- -- create a dummy file
- createDummyFile filePath (fromIntegral fileLen) >>
- return defaultPieceMap
+ pieceMap <- FS.pieceMapFromFile filePath fileLen defaultPieceMap
log $ "start filesystem manager thread"
- FS.startThread handle fsMsgChannel pieceMap
+ fsTid <- forkIO $ withFile filePath ReadWriteMode (FS.run pieceMap fsMsgChannel)
log $ "starting server"
(serverSock, (PortNumber portnum)) <- Server.start
log $ "server started on " ++ show portnum
log "Trying to fetch peers"
_ <- forkIO $ Server.run serverSock peerId m pieceMap fsMsgChannel
log $ "Trackers: " ++ head (announceList m)
- -- (tstate, errstr) <- runTracker portnum peerId m
- tstate <- initialTrackerState $ lengthInBytes $ info m
- _ <- forkIO $ trackerLoop portnum peerId m tstate >> return ()
- ps <- readMVar (connectedPeers tstate)
+ trackerMsgChan <- newTracker
+ _ <- forkIO $ runTracker trackerMsgChan fsMsgChannel infohash portnum peerId (announceList m) fileLen
+ ps <- getConnectedPeers trackerMsgChan
log $ "Peers List : " ++ (show ps)
let p1 = head ps
handlePeerMsgs p1 peerId m pieceMap True fsMsgChannel
logStop logR
+ killThread fsTid