{-# LINE 1 "src/System/ZMQ/Base.hsc" #-}
{-# LANGUAGE CPP, ForeignFunctionInterface #-}
{-# LINE 2 "src/System/ZMQ/Base.hsc" #-}
-- |
-- Module      : System.ZMQ.Base
-- Copyright   : (c) 2010 Toralf Wittner
-- License     : LGPL
-- Maintainer  : toralf.wittner@gmail.com
-- Stability   : experimental
-- Portability : non-portable
-- 

module System.ZMQ.Base where

import Control.Applicative
import Foreign
import Foreign.C.Types
import Foreign.C.String


{-# LINE 19 "src/System/ZMQ/Base.hsc" #-}

newtype ZMQMsg = ZMQMsg { content :: Ptr () }

instance Storable ZMQMsg where
    alignment _        = 4
{-# LINE 24 "src/System/ZMQ/Base.hsc" #-}
    sizeOf    _        = (36)
{-# LINE 25 "src/System/ZMQ/Base.hsc" #-}
    peek p             = ZMQMsg <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 26 "src/System/ZMQ/Base.hsc" #-}
    poke p (ZMQMsg c)  = (\hsc_ptr -> pokeByteOff hsc_ptr 0) p c
{-# LINE 27 "src/System/ZMQ/Base.hsc" #-}

data ZMQPoll = ZMQPoll
    { pSocket  :: ZMQSocket
    , pFd      :: CInt
    , pEvents  :: CShort
    , pRevents :: CShort
    }

instance Storable ZMQPoll where
    alignment _ = 4
{-# LINE 37 "src/System/ZMQ/Base.hsc" #-}
    sizeOf    _ = (12)
{-# LINE 38 "src/System/ZMQ/Base.hsc" #-}
    peek p = do
        s  <- (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 40 "src/System/ZMQ/Base.hsc" #-}
        f  <- (\hsc_ptr -> peekByteOff hsc_ptr 4) p
{-# LINE 41 "src/System/ZMQ/Base.hsc" #-}
        e  <- (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 42 "src/System/ZMQ/Base.hsc" #-}
        re <- (\hsc_ptr -> peekByteOff hsc_ptr 10) p
{-# LINE 43 "src/System/ZMQ/Base.hsc" #-}
        return $ ZMQPoll s f e re
    poke p (ZMQPoll s f e re) = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p s
{-# LINE 46 "src/System/ZMQ/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 4) p f
{-# LINE 47 "src/System/ZMQ/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p e
{-# LINE 48 "src/System/ZMQ/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 10) p re
{-# LINE 49 "src/System/ZMQ/Base.hsc" #-}

usePoll :: CInt
usePoll = 1
{-# LINE 52 "src/System/ZMQ/Base.hsc" #-}

type ZMQMsgPtr  = Ptr ZMQMsg
type ZMQCtx     = Ptr ()
type ZMQSocket  = Ptr ()
type ZMQPollPtr = Ptr ZMQPoll


{-# LINE 59 "src/System/ZMQ/Base.hsc" #-}

newtype ZMQSocketType = ZMQSocketType { typeVal :: CInt } deriving (Eq, Ord)

p2p         :: ZMQSocketType
p2p         = ZMQSocketType 0
pub         :: ZMQSocketType
pub         = ZMQSocketType 1
sub         :: ZMQSocketType
sub         = ZMQSocketType 2
request     :: ZMQSocketType
request     = ZMQSocketType 3
response    :: ZMQSocketType
response    = ZMQSocketType 4
xrequest    :: ZMQSocketType
xrequest    = ZMQSocketType 5
xresponse   :: ZMQSocketType
xresponse   = ZMQSocketType 6
upstream    :: ZMQSocketType
upstream    = ZMQSocketType 7
downstream  :: ZMQSocketType
downstream  = ZMQSocketType 8

{-# LINE 73 "src/System/ZMQ/Base.hsc" #-}

newtype ZMQOption = ZMQOption { optVal :: CInt } deriving (Eq, Ord)

highWM       :: ZMQOption
highWM       = ZMQOption 1
lowWM        :: ZMQOption
lowWM        = ZMQOption 2
swap         :: ZMQOption
swap         = ZMQOption 3
affinity     :: ZMQOption
affinity     = ZMQOption 4
identity     :: ZMQOption
identity     = ZMQOption 5
subscribe    :: ZMQOption
subscribe    = ZMQOption 6
unsubscribe  :: ZMQOption
unsubscribe  = ZMQOption 7
rate         :: ZMQOption
rate         = ZMQOption 8
recoveryIVL  :: ZMQOption
recoveryIVL  = ZMQOption 9
mcastLoop    :: ZMQOption
mcastLoop    = ZMQOption 10
sendBuf      :: ZMQOption
sendBuf      = ZMQOption 11
receiveBuf   :: ZMQOption
receiveBuf   = ZMQOption 12

{-# LINE 90 "src/System/ZMQ/Base.hsc" #-}

newtype ZMQFlag = ZMQFlag { flagVal :: CInt } deriving (Eq, Ord)

noBlock  :: ZMQFlag
noBlock  = ZMQFlag 1
noFlush  :: ZMQFlag
noFlush  = ZMQFlag 2

{-# LINE 97 "src/System/ZMQ/Base.hsc" #-}

newtype ZMQPollEvent = ZMQPollEvent { pollVal :: CShort } deriving (Eq, Ord)

pollIn     :: ZMQPollEvent
pollIn     = ZMQPollEvent 1
pollOut    :: ZMQPollEvent
pollOut    = ZMQPollEvent 2
pollInOut  :: ZMQPollEvent
pollInOut  = ZMQPollEvent 3

{-# LINE 105 "src/System/ZMQ/Base.hsc" #-}

-- general initialization

foreign import ccall unsafe "zmq.h zmq_init"
    c_zmq_init :: CInt -> CInt -> CInt -> IO ZMQCtx

foreign import ccall unsafe "zmq.h zmq_term"
    c_zmq_term :: ZMQCtx -> IO CInt

-- zmq_msg_t related

foreign import ccall unsafe "zmq.h zmq_msg_init"
    c_zmq_msg_init :: ZMQMsgPtr -> IO CInt

foreign import ccall unsafe "zmq.h zmq_msg_init_size"
    c_zmq_msg_init_size :: ZMQMsgPtr -> CSize -> IO CInt

foreign import ccall unsafe "zmq.h zmq_msg_close"
    c_zmq_msg_close :: ZMQMsgPtr -> IO CInt

foreign import ccall unsafe "zmq.h zmq_msg_data"
    c_zmq_msg_data :: ZMQMsgPtr -> IO (Ptr a)

foreign import ccall unsafe "zmq.h zmq_msg_size"
    c_zmq_msg_size :: ZMQMsgPtr -> IO CSize

-- socket

foreign import ccall unsafe "zmq.h zmq_socket"
    c_zmq_socket :: ZMQCtx -> CInt -> IO ZMQSocket

foreign import ccall unsafe "zmq.h zmq_close"
    c_zmq_close :: ZMQSocket -> IO CInt

foreign import ccall unsafe "zmq.h zmq_setsockopt"
    c_zmq_setsockopt :: ZMQSocket
                     -> CInt   -- option
                     -> Ptr () -- option value
                     -> CSize  -- option value size
                     -> IO CInt

foreign import ccall unsafe "zmq.h zmq_bind"
    c_zmq_bind :: ZMQSocket -> CString -> IO CInt

foreign import ccall unsafe "zmq.h zmq_connect"
    c_zmq_connect :: ZMQSocket -> CString -> IO CInt

foreign import ccall unsafe "zmq.h zmq_send"
    c_zmq_send :: ZMQSocket -> ZMQMsgPtr -> CInt -> IO CInt

foreign import ccall unsafe "zmq.h zmq_flush"
    c_zmq_flush :: ZMQSocket -> IO CInt

foreign import ccall safe "zmq.h zmq_recv"
    c_zmq_recv :: ZMQSocket -> ZMQMsgPtr -> CInt -> IO CInt

-- poll

foreign import ccall safe "zmq.h zmq_poll"
    c_zmq_poll :: ZMQPollPtr -> CInt -> CLong -> IO CInt