packages feed

hums-0.2.2: src/SendFile.hs

{-
    hums - The Haskell UPnP Server
    Copyright (C) 2009 Bardur Arantsson <bardur@scientician.net>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-}

--
-- This exists because Network.Socket.SendFile isn't usable on Linux as of 0.4.
--
module SendFile ( sendFile' 
                ) where

import Data.ByteString as BS (hGet, length)
import Network.Socket.ByteString (sendAll)
import Network.Socket (Socket)
import System.IO (Handle, hSeek, SeekMode(..))

sendFile' :: Socket -> Handle -> Integer -> Integer -> IO ()
sendFile' outs inp off count = do
    hSeek inp AbsoluteSeek off
    rsend count
    where rsend 0        = return ()
          rsend reqBytes = do
              let bytes = min 32768 reqBytes :: Integer
              buf <- hGet inp (fromIntegral bytes)
              sendAll outs buf
              rsend (reqBytes - (fromIntegral $ BS.length buf))