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

import Data.Word
import Data.List
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
import System.Socket.Internal.FFI


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

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

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

{-# LINE 21 "src/System/Socket/Address/SockAddrIn.hsc" #-}

{-# LINE 22 "src/System/Socket/Address/SockAddrIn.hsc" #-}

instance Address SockAddrIn where
  addressFamilyNumber _ = (2)
{-# LINE 25 "src/System/Socket/Address/SockAddrIn.hsc" #-}

data SockAddrIn
   = SockAddrIn
     { sinPort      :: Word16
     , sinAddr      :: BS.ByteString
     } deriving (Eq, Ord)

instance Show SockAddrIn where
  show (SockAddrIn p a) =
    "\"" ++ (concat $ intersperse "." $ map show $ BS.unpack a) ++ ":" ++ show p ++ "\""

instance Storable SockAddrIn where
  sizeOf    _ = ((16))
{-# LINE 38 "src/System/Socket/Address/SockAddrIn.hsc" #-}
  alignment _ = (4)
{-# LINE 39 "src/System/Socket/Address/SockAddrIn.hsc" #-}
  peek ptr    = do
    ph  <- peekByteOff       (sin_port ptr)  0  :: IO Word8
    pl  <- peekByteOff       (sin_port ptr)  1  :: IO Word8
    a   <- BS.packCStringLen (sin_addr ptr,  4) :: IO BS.ByteString
    return (SockAddrIn (fromIntegral ph * 256 + fromIntegral pl) a)
    where
      sin_port     = ((\hsc_ptr -> hsc_ptr `plusPtr` 2))
{-# LINE 46 "src/System/Socket/Address/SockAddrIn.hsc" #-}
      sin_addr     = ((\hsc_ptr -> hsc_ptr `plusPtr` 0)) . ((\hsc_ptr -> hsc_ptr `plusPtr` 4))
{-# LINE 47 "src/System/Socket/Address/SockAddrIn.hsc" #-}
  poke ptr (SockAddrIn p a) = do
    c_memset ptr 0 (16)
{-# LINE 49 "src/System/Socket/Address/SockAddrIn.hsc" #-}
    poke        (sin_family   ptr) ((2) :: Word16)
{-# LINE 50 "src/System/Socket/Address/SockAddrIn.hsc" #-}
    pokeByteOff (sin_port     ptr)  0 (fromIntegral $ rem (quot p 256) 256 :: Word8)
    pokeByteOff (sin_port     ptr)  1 (fromIntegral $ rem       p      256 :: Word8)
    BS.unsafeUseAsCString a $ \a'-> do
      copyBytes (sin_addr ptr) a' (min 4 $ BS.length a)-- copyBytes dest from count
    where
      sin_family   = ((\hsc_ptr -> hsc_ptr `plusPtr` 0))
{-# LINE 56 "src/System/Socket/Address/SockAddrIn.hsc" #-}
      sin_port     = ((\hsc_ptr -> hsc_ptr `plusPtr` 2))
{-# LINE 57 "src/System/Socket/Address/SockAddrIn.hsc" #-}
      sin_addr     = ((\hsc_ptr -> hsc_ptr `plusPtr` 0)) . ((\hsc_ptr -> hsc_ptr `plusPtr` 4))