henet-1.3.8.0: src/Network/ENet/Packet.hs
module Network.ENet.Packet where
import Foreign
import Foreign.C.Error
import Foreign.C.Types
import Data.Word
import Data.BitSet.Generic(GBitSet, toBits, unsafeFromBits)
import qualified Data.ByteString as SB
import qualified Data.ByteString.Unsafe as SB
import Data.Endian
import Data.Endian.Unsafe( unsafeUnwrapBigEndian
, unsafeAssertBigEndian)
import qualified Network.ENet.Bindings as B
type PacketFlagSet = GBitSet Word32 B.PacketFlag
-- String is defensively coppied, so unsafe is appropriate
create :: SB.ByteString -> PacketFlagSet -> IO (Ptr B.Packet)
create bytes flags = SB.unsafeUseAsCStringLen bytes $
\(ptr,len) -> B.packetCreate (castPtr ptr) (fromIntegral len) $ toBits flags
destroy :: Ptr B.Packet -> IO ()
destroy = B.packetDestroy
resize :: Ptr B.Packet -> CSize -> IO ()
resize ptr size = do _ <- throwErrnoIf -- explicity throw away return after
(/=0)
"Packet could not be resized"
$ B.packetResize ptr size
return ()