{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)
-}

module GI.Poppler.Callbacks
    ( 

 -- * Signals
-- ** AttachmentSaveFunc
    AttachmentSaveFunc                      ,
    AttachmentSaveFuncC                     ,
    attachmentSaveFuncClosure               ,
    attachmentSaveFuncWrapper               ,
    mkAttachmentSaveFunc                    ,
    noAttachmentSaveFunc                    ,


-- ** MediaSaveFunc
    MediaSaveFunc                           ,
    MediaSaveFuncC                          ,
    mediaSaveFuncClosure                    ,
    mediaSaveFuncWrapper                    ,
    mkMediaSaveFunc                         ,
    noMediaSaveFunc                         ,




    ) where

import Prelude ()
import Data.GI.Base.ShortPrelude

import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map

import GI.Poppler.Types


-- callback MediaSaveFunc
mediaSaveFuncClosure :: MediaSaveFunc -> IO Closure
mediaSaveFuncClosure cb = newCClosure =<< mkMediaSaveFunc wrapped
    where wrapped = mediaSaveFuncWrapper Nothing cb

type MediaSaveFuncC =
    Ptr Word8 ->
    Word64 ->
    Ptr () ->
    IO CInt

foreign import ccall "wrapper"
    mkMediaSaveFunc :: MediaSaveFuncC -> IO (FunPtr MediaSaveFuncC)

type MediaSaveFunc =
    ByteString ->
    IO Bool

noMediaSaveFunc :: Maybe MediaSaveFunc
noMediaSaveFunc = Nothing

mediaSaveFuncWrapper ::
    Maybe (Ptr (FunPtr (MediaSaveFuncC))) ->
    MediaSaveFunc ->
    Ptr Word8 ->
    Word64 ->
    Ptr () ->
    IO CInt
mediaSaveFuncWrapper funptrptr _cb buf count _ = do
    buf' <- (unpackByteStringWithLength count) buf
    result <- _cb  buf'
    maybeReleaseFunPtr funptrptr
    let result' = (fromIntegral . fromEnum) result
    return result'

-- callback AttachmentSaveFunc
attachmentSaveFuncClosure :: AttachmentSaveFunc -> IO Closure
attachmentSaveFuncClosure cb = newCClosure =<< mkAttachmentSaveFunc wrapped
    where wrapped = attachmentSaveFuncWrapper Nothing cb

type AttachmentSaveFuncC =
    Ptr Word8 ->
    Word64 ->
    Ptr () ->
    IO CInt

foreign import ccall "wrapper"
    mkAttachmentSaveFunc :: AttachmentSaveFuncC -> IO (FunPtr AttachmentSaveFuncC)

type AttachmentSaveFunc =
    ByteString ->
    IO Bool

noAttachmentSaveFunc :: Maybe AttachmentSaveFunc
noAttachmentSaveFunc = Nothing

attachmentSaveFuncWrapper ::
    Maybe (Ptr (FunPtr (AttachmentSaveFuncC))) ->
    AttachmentSaveFunc ->
    Ptr Word8 ->
    Word64 ->
    Ptr () ->
    IO CInt
attachmentSaveFuncWrapper funptrptr _cb buf count _ = do
    buf' <- (unpackByteStringWithLength count) buf
    result <- _cb  buf'
    maybeReleaseFunPtr funptrptr
    let result' = (fromIntegral . fromEnum) result
    return result'