packages feed

hs-asapo-0.9.0: lib/Asapo/Raw/Common.hs

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE CApiFFI #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}

{-# HLINT ignore "Use camelCase" #-}

module Asapo.Raw.Common
  ( AsapoBool,
    AsapoSourceCredentialsHandle (AsapoSourceCredentialsHandle),
    AsapoMessageDataHandle (AsapoMessageDataHandle),
    asapo_is_error,
    AsapoSourceType,
    asapo_string_c_str,
    mkAsapoFreeWrapper,
    asapo_message_data_get_as_chars,
    asapo_free_stream_infos_handle,
    asapo_new_string_handle,
    asapo_free_string_handle,
    asapo_free_stream_info_handle,
    asapo_free_message_data_handle,
    asapo_error_explain,
    asapo_string_size,
    AsapoErrorHandle (AsapoErrorHandle),
    AsapoStreamInfosHandle (AsapoStreamInfosHandle),
    AsapoStringHandle (AsapoStringHandle),
    ConstCString,
    asapo_free_source_credentials,
    asapo_new_error_handle,
    asapo_free_error_handle,
    asapo_string_from_c_str,
    asapo_new_handle,
    asapo_free_handle,
    asapo_new_message_data_handle,
    asapo_create_source_credentials,
    AsapoStreamInfoHandle (AsapoStreamInfoHandle),
    asapo_stream_infos_get_item,
    asapo_stream_info_get_last_id,
    asapo_stream_info_get_name,
    asapo_stream_info_get_finished,
    asapo_stream_info_get_next_stream,
    asapo_stream_info_get_timestamp_created,
    asapo_stream_info_get_timestamp_last_entry,
    kProcessed,
    kRaw,
  )
where

import Data.Functor ((<$>))
import Foreign (FunPtr, with)
import Foreign.C.ConstPtr (ConstPtr (ConstPtr))
import Foreign.C.String (CString)
import Foreign.C.Types (CChar, CInt (CInt), CSize (CSize), CULong (CULong))
import Foreign.Ptr (Ptr)
import Foreign.Storable (Storable)
import System.Clock (TimeSpec)
import System.IO (IO)
import Prelude ()

-- common
type ConstCString = ConstPtr CChar

type AsapoBool = CInt

newtype {-# CTYPE "asapo/common/common_c.h" "AsapoSourceCredentialsHandle" #-} AsapoSourceCredentialsHandle = AsapoSourceCredentialsHandle (Ptr ()) deriving (Storable)

newtype {-# CTYPE "asapo/common/common_c.h" "AsapoErrorHandle" #-} AsapoErrorHandle = AsapoErrorHandle (Ptr ()) deriving (Storable)

newtype {-# CTYPE "asapo/common/common_c.h" "AsapoStringHandle" #-} AsapoStringHandle = AsapoStringHandle (Ptr ()) deriving (Storable)

asapo_new_string_handle :: IO AsapoStringHandle
asapo_new_string_handle = AsapoStringHandle <$> asapo_new_handle

asapo_free_string_handle :: AsapoStringHandle -> IO ()
asapo_free_string_handle (AsapoStringHandle ptr) = with ptr asapo_free_handle

-- -- FIXME: this is a custom function I added
-- -- foreign import capi "asapo/common/common_c.h &asapo_free_handle___" p_asapo_free_handle :: FunPtr (Ptr () -> IO ())

-- foreign import capi "asapo/common/common_c.h &hs_asapo_free_handle_with_ptr___" p_asapo_free_handle :: FunPtr (Ptr () -> IO ())

newtype {-# CTYPE "asapo/common/common_c.h" "AsapoStreamInfoHandle" #-} AsapoStreamInfoHandle = AsapoStreamInfoHandle (Ptr ()) deriving (Storable)

asapo_free_stream_info_handle :: AsapoStreamInfoHandle -> IO ()
asapo_free_stream_info_handle (AsapoStreamInfoHandle ptr) = with ptr asapo_free_handle

asapo_free_stream_infos_handle :: AsapoStreamInfosHandle -> IO ()
asapo_free_stream_infos_handle (AsapoStreamInfosHandle ptr) = with ptr asapo_free_handle

newtype {-# CTYPE "asapo/common/common_c.h" "AsapoStreamInfosHandle" #-} AsapoStreamInfosHandle = AsapoStreamInfosHandle (Ptr ()) deriving (Storable)

newtype {-# CTYPE "asapo/consumer_c.h" "AsapoMessageDataHandle" #-} AsapoMessageDataHandle = AsapoMessageDataHandle (Ptr ()) deriving (Storable)

asapo_new_message_data_handle :: IO AsapoMessageDataHandle
asapo_new_message_data_handle = AsapoMessageDataHandle <$> asapo_new_handle

asapo_free_message_data_handle :: AsapoMessageDataHandle -> IO ()
asapo_free_message_data_handle (AsapoMessageDataHandle ptr) = with ptr asapo_free_handle

type AsapoSourceType = CInt

foreign import capi "asapo/common/common_c.h value kProcessed" kProcessed :: AsapoSourceType

foreign import capi "asapo/common/common_c.h value kRaw" kRaw :: AsapoSourceType

foreign import capi "asapo/common/common_c.h asapo_free_handle__" asapo_free_handle :: Ptr (Ptr ()) -> IO ()

foreign import ccall "wrapper" mkAsapoFreeWrapper :: (Ptr () -> IO ()) -> IO (FunPtr (Ptr () -> IO ()))

foreign import capi "asapo/common/common_c.h asapo_new_handle" asapo_new_handle :: IO (Ptr ())

asapo_new_error_handle :: IO AsapoErrorHandle
asapo_new_error_handle = AsapoErrorHandle <$> asapo_new_handle

asapo_free_error_handle :: AsapoErrorHandle -> IO ()
asapo_free_error_handle (AsapoErrorHandle ptr) = with ptr asapo_free_handle

foreign import capi "asapo/common/common_c.h asapo_error_explain" asapo_error_explain :: AsapoErrorHandle -> CString -> CSize -> IO ()

foreign import capi "asapo/common/common_c.h asapo_is_error" asapo_is_error :: AsapoErrorHandle -> IO AsapoBool

foreign import capi "asapo/common/common_c.h asapo_string_from_c_str" asapo_string_from_c_str :: ConstCString -> IO AsapoStringHandle

foreign import capi "asapo/common/common_c.h asapo_string_c_str" asapo_string_c_str :: AsapoStringHandle -> IO ConstCString

foreign import capi "asapo/common/common_c.h asapo_string_size" asapo_string_size :: AsapoStringHandle -> IO CSize

foreign import capi "asapo/common/common_c.h asapo_stream_infos_get_item"
  asapo_stream_infos_get_item ::
    AsapoStreamInfosHandle ->
    -- index
    CSize ->
    IO AsapoStreamInfoHandle

foreign import capi "asapo/common/common_c.h asapo_stream_info_get_last_id" asapo_stream_info_get_last_id :: AsapoStreamInfoHandle -> IO CULong

foreign import capi "asapo/common/common_c.h asapo_stream_info_get_name" asapo_stream_info_get_name :: AsapoStreamInfoHandle -> IO ConstCString

-- Yes, this has a typo. Corrected in the Haskell function name
foreign import capi "asapo/common/common_c.h asapo_stream_info_get_ffinished" asapo_stream_info_get_finished :: AsapoStreamInfoHandle -> IO AsapoBool

foreign import capi "asapo/common/common_c.h asapo_stream_info_get_next_stream" asapo_stream_info_get_next_stream :: AsapoStreamInfoHandle -> IO ConstCString

foreign import capi "asapo/common/common_c.h asapo_stream_info_get_timestamp_created" asapo_stream_info_get_timestamp_created :: AsapoStreamInfoHandle -> Ptr TimeSpec -> IO ()

foreign import capi "asapo/common/common_c.h asapo_stream_info_get_timestamp_last_entry" asapo_stream_info_get_timestamp_last_entry :: AsapoStreamInfoHandle -> Ptr TimeSpec -> IO ()

foreign import capi "asapo/common/common_c.h asapo_create_source_credentials"
  asapo_create_source_credentials ::
    AsapoSourceType ->
    -- instance ID
    CString ->
    -- pipeline step
    CString ->
    -- beamtime
    CString ->
    -- beamline
    CString ->
    -- data source
    CString ->
    -- token
    CString ->
    IO AsapoSourceCredentialsHandle

asapo_free_source_credentials :: AsapoSourceCredentialsHandle -> IO ()
asapo_free_source_credentials (AsapoSourceCredentialsHandle ptr) = with ptr asapo_free_handle

foreign import capi "asapo/common/common_c.h asapo_message_data_get_as_chars" asapo_message_data_get_as_chars :: AsapoMessageDataHandle -> IO ConstCString