packages feed

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 ()