import Control.Concurrent (forkIO)
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, startThread)
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 Network (PortID (PortNumber))
+import System.IO (withFile, IOMode (ReadWriteMode))
import System.Directory (doesFileExist)
import System.Environment (getArgs)
import System.Exit (exitSuccess)
pLen = pieceLength (info 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
+ withFile filePath ReadWriteMode (FS.startThread pieceMap fsMsgChannel)
log $ "starting server"
(serverSock, (PortNumber portnum)) <- Server.start
log $ "server started on " ++ show portnum