packages feed

gi-gst-0.1.6.13: GI/Gst/Structs/TypeFind.hs


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

The following functions allow you to detect the media type of an unknown
stream.
-}

module GI.Gst.Structs.TypeFind
    ( 

-- * Exported types
    TypeFind(..)                            ,
    newZeroTypeFind                         ,
    noTypeFind                              ,


 -- * Methods
-- ** typeFindGetLength
    TypeFindGetLengthMethodInfo             ,
    typeFindGetLength                       ,


-- ** typeFindPeek
    TypeFindPeekMethodInfo                  ,
    typeFindPeek                            ,


-- ** typeFindRegister
    typeFindRegister                        ,


-- ** typeFindSuggest
    TypeFindSuggestMethodInfo               ,
    typeFindSuggest                         ,




 -- * Properties
-- ** Data
    typeFindReadData                        ,




    ) 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.Gst.Types
import GI.Gst.Callbacks
import qualified GI.GLib as GLib

newtype TypeFind = TypeFind (ForeignPtr TypeFind)
-- | Construct a `TypeFind` struct initialized to zero.
newZeroTypeFind :: MonadIO m => m TypeFind
newZeroTypeFind = liftIO $ callocBytes 64 >>= wrapPtr TypeFind

noTypeFind :: Maybe TypeFind
noTypeFind = Nothing

-- XXX Skipped getter for "TypeFind:peek" :: Not implemented: "Wrapping foreign callbacks is not supported yet"

-- XXX Skipped getter for "TypeFind:suggest" :: Not implemented: "Wrapping foreign callbacks is not supported yet"

typeFindReadData :: TypeFind -> IO (Ptr ())
typeFindReadData s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 16) :: IO (Ptr ())
    return val

-- XXX Skipped getter for "TypeFind:get_length" :: Not implemented: "Wrapping foreign callbacks is not supported yet"

-- method TypeFind::get_length
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "TypeFind", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TBasicType TUInt64
-- throws : False
-- Skip return : False

foreign import ccall "gst_type_find_get_length" gst_type_find_get_length :: 
    Ptr TypeFind ->                         -- _obj : TInterface "Gst" "TypeFind"
    IO Word64


typeFindGetLength ::
    (MonadIO m) =>
    TypeFind                                -- _obj
    -> m Word64                             -- result
typeFindGetLength _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- gst_type_find_get_length _obj'
    touchManagedPtr _obj
    return result

data TypeFindGetLengthMethodInfo
instance (signature ~ (m Word64), MonadIO m) => MethodInfo TypeFindGetLengthMethodInfo TypeFind signature where
    overloadedMethod _ = typeFindGetLength

-- method TypeFind::peek
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "TypeFind", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "offset", argType = TBasicType TInt64, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "size", argType = TBasicType TUInt32, direction = DirectionOut, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : [Arg {argCName = "size", argType = TBasicType TUInt32, direction = DirectionOut, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- returnType : TCArray False (-1) 2 (TBasicType TUInt8)
-- throws : False
-- Skip return : False

foreign import ccall "gst_type_find_peek" gst_type_find_peek :: 
    Ptr TypeFind ->                         -- _obj : TInterface "Gst" "TypeFind"
    Int64 ->                                -- offset : TBasicType TInt64
    Ptr Word32 ->                           -- size : TBasicType TUInt32
    IO (Ptr Word8)


typeFindPeek ::
    (MonadIO m) =>
    TypeFind                                -- _obj
    -> Int64                                -- offset
    -> m ByteString                         -- result
typeFindPeek _obj offset = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    size <- allocMem :: IO (Ptr Word32)
    result <- gst_type_find_peek _obj' offset size
    size' <- peek size
    checkUnexpectedReturnNULL "gst_type_find_peek" result
    result' <- (unpackByteStringWithLength size') result
    touchManagedPtr _obj
    freeMem size
    return result'

data TypeFindPeekMethodInfo
instance (signature ~ (Int64 -> m ByteString), MonadIO m) => MethodInfo TypeFindPeekMethodInfo TypeFind signature where
    overloadedMethod _ = typeFindPeek

-- method TypeFind::suggest
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "TypeFind", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "probability", argType = TBasicType TUInt32, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "caps", argType = TInterface "Gst" "Caps", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "gst_type_find_suggest" gst_type_find_suggest :: 
    Ptr TypeFind ->                         -- _obj : TInterface "Gst" "TypeFind"
    Word32 ->                               -- probability : TBasicType TUInt32
    Ptr Caps ->                             -- caps : TInterface "Gst" "Caps"
    IO ()


typeFindSuggest ::
    (MonadIO m) =>
    TypeFind                                -- _obj
    -> Word32                               -- probability
    -> Caps                                 -- caps
    -> m ()                                 -- result
typeFindSuggest _obj probability caps = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let caps' = unsafeManagedPtrGetPtr caps
    gst_type_find_suggest _obj' probability caps'
    touchManagedPtr _obj
    touchManagedPtr caps
    return ()

data TypeFindSuggestMethodInfo
instance (signature ~ (Word32 -> Caps -> m ()), MonadIO m) => MethodInfo TypeFindSuggestMethodInfo TypeFind signature where
    overloadedMethod _ = typeFindSuggest

-- method TypeFind::register
-- method type : MemberFunction
-- Args : [Arg {argCName = "plugin", argType = TInterface "Gst" "Plugin", direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "rank", argType = TBasicType TUInt32, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "func", argType = TInterface "Gst" "TypeFindFunction", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeNotified, argClosure = 6, argDestroy = 7, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "extensions", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "possible_caps", argType = TInterface "Gst" "Caps", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data_notify", argType = TInterface "GLib" "DestroyNotify", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeAsync, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TBasicType TBoolean
-- throws : False
-- Skip return : False

foreign import ccall "gst_type_find_register" gst_type_find_register :: 
    Ptr Plugin ->                           -- plugin : TInterface "Gst" "Plugin"
    CString ->                              -- name : TBasicType TUTF8
    Word32 ->                               -- rank : TBasicType TUInt32
    FunPtr TypeFindFunctionC ->             -- func : TInterface "Gst" "TypeFindFunction"
    CString ->                              -- extensions : TBasicType TUTF8
    Ptr Caps ->                             -- possible_caps : TInterface "Gst" "Caps"
    Ptr () ->                               -- data : TBasicType TVoid
    FunPtr GLib.DestroyNotifyC ->           -- data_notify : TInterface "GLib" "DestroyNotify"
    IO CInt


typeFindRegister ::
    (MonadIO m, PluginK a) =>
    Maybe (a)                               -- plugin
    -> T.Text                               -- name
    -> Word32                               -- rank
    -> TypeFindFunction                     -- func
    -> Maybe (T.Text)                       -- extensions
    -> Caps                                 -- possibleCaps
    -> m Bool                               -- result
typeFindRegister plugin name rank func extensions possibleCaps = liftIO $ do
    maybePlugin <- case plugin of
        Nothing -> return nullPtr
        Just jPlugin -> do
            let jPlugin' = unsafeManagedPtrCastPtr jPlugin
            return jPlugin'
    name' <- textToCString name
    func' <- mkTypeFindFunction (typeFindFunctionWrapper Nothing func)
    maybeExtensions <- case extensions of
        Nothing -> return nullPtr
        Just jExtensions -> do
            jExtensions' <- textToCString jExtensions
            return jExtensions'
    let possibleCaps' = unsafeManagedPtrGetPtr possibleCaps
    let data_ = castFunPtrToPtr func'
    let dataNotify = safeFreeFunPtrPtr
    result <- gst_type_find_register maybePlugin name' rank func' maybeExtensions possibleCaps' data_ dataNotify
    let result' = (/= 0) result
    whenJust plugin touchManagedPtr
    touchManagedPtr possibleCaps
    freeMem name'
    freeMem maybeExtensions
    return result'

type family ResolveTypeFindMethod (t :: Symbol) (o :: *) :: * where
    ResolveTypeFindMethod "peek" o = TypeFindPeekMethodInfo
    ResolveTypeFindMethod "suggest" o = TypeFindSuggestMethodInfo
    ResolveTypeFindMethod "getLength" o = TypeFindGetLengthMethodInfo
    ResolveTypeFindMethod l o = MethodResolutionFailed l o

instance (info ~ ResolveTypeFindMethod t TypeFind, MethodInfo info TypeFind p) => IsLabelProxy t (TypeFind -> p) where
    fromLabelProxy _ = overloadedMethod (MethodProxy :: MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveTypeFindMethod t TypeFind, MethodInfo info TypeFind p) => IsLabel t (TypeFind -> p) where
    fromLabel _ = overloadedMethod (MethodProxy :: MethodProxy info)
#endif