{-# LINE 1 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
module System.Socket.Address.SockAddrIn6
{-# LINE 2 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
  ( SockAddrIn6 (..)
  ) where

import Data.Word
import qualified Data.ByteString as BS
import qualified Data.ByteString.Unsafe as BS

import Foreign.Ptr
import Foreign.Storable
import Foreign.Marshal.Utils

import System.Socket.Address


{-# LINE 16 "src/System/Socket/Address/SockAddrIn6.hsc" #-}

{-# LINE 17 "src/System/Socket/Address/SockAddrIn6.hsc" #-}

{-# LINE 18 "src/System/Socket/Address/SockAddrIn6.hsc" #-}

{-# LINE 19 "src/System/Socket/Address/SockAddrIn6.hsc" #-}

{-# LINE 20 "src/System/Socket/Address/SockAddrIn6.hsc" #-}

instance Address SockAddrIn6 where
  addressFamilyNumber _ = (10)
{-# LINE 23 "src/System/Socket/Address/SockAddrIn6.hsc" #-}

data SockAddrIn6
   = SockAddrIn6
     { sin6Port      :: Word16
     , sin6Flowinfo  :: Word32
     , sin6Addr      :: BS.ByteString
     , sin6ScopeId   :: Word32
     } deriving (Eq, Ord, Show)

instance Storable SockAddrIn6 where
  sizeOf    _ = ((28))
{-# LINE 34 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
  alignment _ = (4)
{-# LINE 35 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
  peek ptr    = do
    f   <- peek              (sin6_flowinfo ptr) :: IO Word32
    ph  <- peekByteOff       (sin6_port ptr)  0  :: IO Word8
    pl  <- peekByteOff       (sin6_port ptr)  1  :: IO Word8
    a   <- BS.packCStringLen (sin6_addr ptr, 16) :: IO BS.ByteString
    s   <- peek              (sin6_scope_id ptr) :: IO Word32
    return (SockAddrIn6 (fromIntegral ph * 256 + fromIntegral pl) f a s)
    where
      sin6_flowinfo = ((\hsc_ptr -> hsc_ptr `plusPtr` 4))
{-# LINE 44 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
      sin6_scope_id = ((\hsc_ptr -> hsc_ptr `plusPtr` 24))
{-# LINE 45 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
      sin6_port     = ((\hsc_ptr -> hsc_ptr `plusPtr` 2))
{-# LINE 46 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
      sin6_addr     = ((\hsc_ptr -> hsc_ptr `plusPtr` 0)) . ((\hsc_ptr -> hsc_ptr `plusPtr` 8))
{-# LINE 47 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
  poke ptr (SockAddrIn6 p f a s) = do
    poke        (sin6_family   ptr) ((10) :: Word16)
{-# LINE 49 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
    poke        (sin6_flowinfo ptr) f
    poke        (sin6_scope_id ptr) s
    pokeByteOff (sin6_port     ptr)  0 (fromIntegral $ rem (quot p 256) 256 :: Word8)
    pokeByteOff (sin6_port     ptr)  1 (fromIntegral $ rem       p      256 :: Word8)
    BS.unsafeUseAsCString a $ \a'-> do
      copyBytes (sin6_addr ptr) a' (min 16 $ BS.length a)-- copyBytes dest from count
    where
      sin6_family   = ((\hsc_ptr -> hsc_ptr `plusPtr` 0))
{-# LINE 57 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
      sin6_flowinfo = ((\hsc_ptr -> hsc_ptr `plusPtr` 4))
{-# LINE 58 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
      sin6_scope_id = ((\hsc_ptr -> hsc_ptr `plusPtr` 24))
{-# LINE 59 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
      sin6_port     = ((\hsc_ptr -> hsc_ptr `plusPtr` 2))
{-# LINE 60 "src/System/Socket/Address/SockAddrIn6.hsc" #-}
      sin6_addr     = ((\hsc_ptr -> hsc_ptr `plusPtr` 0)) . ((\hsc_ptr -> hsc_ptr `plusPtr` 8))