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

'GI.Gst.Objects.DeviceProviderFactory.DeviceProviderFactory' is used to create instances of device providers. A
GstDeviceProviderfactory can be added to a 'GI.Gst.Objects.Plugin.Plugin' as it is also a
'GI.Gst.Objects.PluginFeature.PluginFeature'.

Use the 'GI.Gst.Objects.DeviceProviderFactory.deviceProviderFactoryFind' and
'GI.Gst.Objects.DeviceProviderFactory.deviceProviderFactoryGet' functions to create device
provider instances or use 'GI.Gst.Objects.DeviceProviderFactory.deviceProviderFactoryGetByName' as a
convenient shortcut.

/Since: 1.4/
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.Gst.Objects.DeviceProviderFactory
    (

-- * Exported types
    DeviceProviderFactory(..)               ,
    IsDeviceProviderFactory                 ,
    toDeviceProviderFactory                 ,
    noDeviceProviderFactory                 ,


 -- * Methods
-- ** find #method:find#

    deviceProviderFactoryFind               ,


-- ** get #method:get#

#if ENABLE_OVERLOADING
    DeviceProviderFactoryGetMethodInfo      ,
#endif
    deviceProviderFactoryGet                ,


-- ** getByName #method:getByName#

    deviceProviderFactoryGetByName          ,


-- ** getDeviceProviderType #method:getDeviceProviderType#

#if ENABLE_OVERLOADING
    DeviceProviderFactoryGetDeviceProviderTypeMethodInfo,
#endif
    deviceProviderFactoryGetDeviceProviderType,


-- ** getMetadata #method:getMetadata#

#if ENABLE_OVERLOADING
    DeviceProviderFactoryGetMetadataMethodInfo,
#endif
    deviceProviderFactoryGetMetadata        ,


-- ** getMetadataKeys #method:getMetadataKeys#

#if ENABLE_OVERLOADING
    DeviceProviderFactoryGetMetadataKeysMethodInfo,
#endif
    deviceProviderFactoryGetMetadataKeys    ,


-- ** hasClasses #method:hasClasses#

#if ENABLE_OVERLOADING
    DeviceProviderFactoryHasClassesMethodInfo,
#endif
    deviceProviderFactoryHasClasses         ,


-- ** hasClassesv #method:hasClassesv#

#if ENABLE_OVERLOADING
    DeviceProviderFactoryHasClassesvMethodInfo,
#endif
    deviceProviderFactoryHasClassesv        ,


-- ** listGetDeviceProviders #method:listGetDeviceProviders#

    deviceProviderFactoryListGetDeviceProviders,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.GI.Base.Properties as B.Properties
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP
import qualified GHC.OverloadedLabels as OL

import qualified GI.GObject.Objects.Object as GObject.Object
import {-# SOURCE #-} qualified GI.Gst.Enums as Gst.Enums
import {-# SOURCE #-} qualified GI.Gst.Objects.DeviceProvider as Gst.DeviceProvider
import {-# SOURCE #-} qualified GI.Gst.Objects.Object as Gst.Object
import {-# SOURCE #-} qualified GI.Gst.Objects.PluginFeature as Gst.PluginFeature

-- | Memory-managed wrapper type.
newtype DeviceProviderFactory = DeviceProviderFactory (ManagedPtr DeviceProviderFactory)
foreign import ccall "gst_device_provider_factory_get_type"
    c_gst_device_provider_factory_get_type :: IO GType

instance GObject DeviceProviderFactory where
    gobjectType = c_gst_device_provider_factory_get_type


-- | Type class for types which can be safely cast to `DeviceProviderFactory`, for instance with `toDeviceProviderFactory`.
class (GObject o, O.IsDescendantOf DeviceProviderFactory o) => IsDeviceProviderFactory o
instance (GObject o, O.IsDescendantOf DeviceProviderFactory o) => IsDeviceProviderFactory o

instance O.HasParentTypes DeviceProviderFactory
type instance O.ParentTypes DeviceProviderFactory = '[Gst.PluginFeature.PluginFeature, Gst.Object.Object, GObject.Object.Object]

-- | Cast to `DeviceProviderFactory`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toDeviceProviderFactory :: (MonadIO m, IsDeviceProviderFactory o) => o -> m DeviceProviderFactory
toDeviceProviderFactory = liftIO . unsafeCastTo DeviceProviderFactory

-- | A convenience alias for `Nothing` :: `Maybe` `DeviceProviderFactory`.
noDeviceProviderFactory :: Maybe DeviceProviderFactory
noDeviceProviderFactory = Nothing

#if ENABLE_OVERLOADING
type family ResolveDeviceProviderFactoryMethod (t :: Symbol) (o :: *) :: * where
    ResolveDeviceProviderFactoryMethod "addControlBinding" o = Gst.Object.ObjectAddControlBindingMethodInfo
    ResolveDeviceProviderFactoryMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveDeviceProviderFactoryMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveDeviceProviderFactoryMethod "checkVersion" o = Gst.PluginFeature.PluginFeatureCheckVersionMethodInfo
    ResolveDeviceProviderFactoryMethod "defaultError" o = Gst.Object.ObjectDefaultErrorMethodInfo
    ResolveDeviceProviderFactoryMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveDeviceProviderFactoryMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveDeviceProviderFactoryMethod "get" o = DeviceProviderFactoryGetMethodInfo
    ResolveDeviceProviderFactoryMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolveDeviceProviderFactoryMethod "hasActiveControlBindings" o = Gst.Object.ObjectHasActiveControlBindingsMethodInfo
    ResolveDeviceProviderFactoryMethod "hasAncestor" o = Gst.Object.ObjectHasAncestorMethodInfo
    ResolveDeviceProviderFactoryMethod "hasAsAncestor" o = Gst.Object.ObjectHasAsAncestorMethodInfo
    ResolveDeviceProviderFactoryMethod "hasAsParent" o = Gst.Object.ObjectHasAsParentMethodInfo
    ResolveDeviceProviderFactoryMethod "hasClasses" o = DeviceProviderFactoryHasClassesMethodInfo
    ResolveDeviceProviderFactoryMethod "hasClassesv" o = DeviceProviderFactoryHasClassesvMethodInfo
    ResolveDeviceProviderFactoryMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveDeviceProviderFactoryMethod "load" o = Gst.PluginFeature.PluginFeatureLoadMethodInfo
    ResolveDeviceProviderFactoryMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveDeviceProviderFactoryMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveDeviceProviderFactoryMethod "ref" o = Gst.Object.ObjectRefMethodInfo
    ResolveDeviceProviderFactoryMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveDeviceProviderFactoryMethod "removeControlBinding" o = Gst.Object.ObjectRemoveControlBindingMethodInfo
    ResolveDeviceProviderFactoryMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveDeviceProviderFactoryMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveDeviceProviderFactoryMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveDeviceProviderFactoryMethod "suggestNextSync" o = Gst.Object.ObjectSuggestNextSyncMethodInfo
    ResolveDeviceProviderFactoryMethod "syncValues" o = Gst.Object.ObjectSyncValuesMethodInfo
    ResolveDeviceProviderFactoryMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveDeviceProviderFactoryMethod "unparent" o = Gst.Object.ObjectUnparentMethodInfo
    ResolveDeviceProviderFactoryMethod "unref" o = Gst.Object.ObjectUnrefMethodInfo
    ResolveDeviceProviderFactoryMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveDeviceProviderFactoryMethod "getControlBinding" o = Gst.Object.ObjectGetControlBindingMethodInfo
    ResolveDeviceProviderFactoryMethod "getControlRate" o = Gst.Object.ObjectGetControlRateMethodInfo
    ResolveDeviceProviderFactoryMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveDeviceProviderFactoryMethod "getDeviceProviderType" o = DeviceProviderFactoryGetDeviceProviderTypeMethodInfo
    ResolveDeviceProviderFactoryMethod "getGValueArray" o = Gst.Object.ObjectGetGValueArrayMethodInfo
    ResolveDeviceProviderFactoryMethod "getMetadata" o = DeviceProviderFactoryGetMetadataMethodInfo
    ResolveDeviceProviderFactoryMethod "getMetadataKeys" o = DeviceProviderFactoryGetMetadataKeysMethodInfo
    ResolveDeviceProviderFactoryMethod "getName" o = Gst.Object.ObjectGetNameMethodInfo
    ResolveDeviceProviderFactoryMethod "getParent" o = Gst.Object.ObjectGetParentMethodInfo
    ResolveDeviceProviderFactoryMethod "getPathString" o = Gst.Object.ObjectGetPathStringMethodInfo
    ResolveDeviceProviderFactoryMethod "getPlugin" o = Gst.PluginFeature.PluginFeatureGetPluginMethodInfo
    ResolveDeviceProviderFactoryMethod "getPluginName" o = Gst.PluginFeature.PluginFeatureGetPluginNameMethodInfo
    ResolveDeviceProviderFactoryMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveDeviceProviderFactoryMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveDeviceProviderFactoryMethod "getRank" o = Gst.PluginFeature.PluginFeatureGetRankMethodInfo
    ResolveDeviceProviderFactoryMethod "getValue" o = Gst.Object.ObjectGetValueMethodInfo
    ResolveDeviceProviderFactoryMethod "setControlBindingDisabled" o = Gst.Object.ObjectSetControlBindingDisabledMethodInfo
    ResolveDeviceProviderFactoryMethod "setControlBindingsDisabled" o = Gst.Object.ObjectSetControlBindingsDisabledMethodInfo
    ResolveDeviceProviderFactoryMethod "setControlRate" o = Gst.Object.ObjectSetControlRateMethodInfo
    ResolveDeviceProviderFactoryMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveDeviceProviderFactoryMethod "setName" o = Gst.Object.ObjectSetNameMethodInfo
    ResolveDeviceProviderFactoryMethod "setParent" o = Gst.Object.ObjectSetParentMethodInfo
    ResolveDeviceProviderFactoryMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveDeviceProviderFactoryMethod "setRank" o = Gst.PluginFeature.PluginFeatureSetRankMethodInfo
    ResolveDeviceProviderFactoryMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveDeviceProviderFactoryMethod t DeviceProviderFactory, O.MethodInfo info DeviceProviderFactory p) => OL.IsLabel t (DeviceProviderFactory -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

#endif

#if ENABLE_OVERLOADING
instance O.HasAttributeList DeviceProviderFactory
type instance O.AttributeList DeviceProviderFactory = DeviceProviderFactoryAttributeList
type DeviceProviderFactoryAttributeList = ('[ '("name", Gst.Object.ObjectNamePropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
type instance O.SignalList DeviceProviderFactory = DeviceProviderFactorySignalList
type DeviceProviderFactorySignalList = ('[ '("deepNotify", Gst.Object.ObjectDeepNotifySignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

#endif

-- method DeviceProviderFactory::get
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "factory", argType = TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "factory to instantiate", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gst", name = "DeviceProvider"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_factory_get" gst_device_provider_factory_get ::
    Ptr DeviceProviderFactory ->            -- factory : TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"})
    IO (Ptr Gst.DeviceProvider.DeviceProvider)

{- |
Returns the device provider of the type defined by the given device
providerfactory.

/Since: 1.4/
-}
deviceProviderFactoryGet ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProviderFactory a) =>
    a
    {- ^ /@factory@/: factory to instantiate -}
    -> m (Maybe Gst.DeviceProvider.DeviceProvider)
    {- ^ __Returns:__ the 'GI.Gst.Objects.DeviceProvider.DeviceProvider' or 'Nothing'
if the device provider couldn\'t be created -}
deviceProviderFactoryGet factory = liftIO $ do
    factory' <- unsafeManagedPtrCastPtr factory
    result <- gst_device_provider_factory_get factory'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (wrapObject Gst.DeviceProvider.DeviceProvider) result'
        return result''
    touchManagedPtr factory
    return maybeResult

#if ENABLE_OVERLOADING
data DeviceProviderFactoryGetMethodInfo
instance (signature ~ (m (Maybe Gst.DeviceProvider.DeviceProvider)), MonadIO m, IsDeviceProviderFactory a) => O.MethodInfo DeviceProviderFactoryGetMethodInfo a signature where
    overloadedMethod _ = deviceProviderFactoryGet

#endif

-- method DeviceProviderFactory::get_device_provider_type
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "factory", argType = TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "factory to get managed #GType from", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TGType)
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_factory_get_device_provider_type" gst_device_provider_factory_get_device_provider_type ::
    Ptr DeviceProviderFactory ->            -- factory : TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"})
    IO CGType

{- |
Get the 'GType' for device providers managed by this factory. The type can
only be retrieved if the device provider factory is loaded, which can be
assured with 'GI.Gst.Objects.PluginFeature.pluginFeatureLoad'.

/Since: 1.4/
-}
deviceProviderFactoryGetDeviceProviderType ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProviderFactory a) =>
    a
    {- ^ /@factory@/: factory to get managed 'GType' from -}
    -> m GType
    {- ^ __Returns:__ the 'GType' for device providers managed by this factory. -}
deviceProviderFactoryGetDeviceProviderType factory = liftIO $ do
    factory' <- unsafeManagedPtrCastPtr factory
    result <- gst_device_provider_factory_get_device_provider_type factory'
    let result' = GType result
    touchManagedPtr factory
    return result'

#if ENABLE_OVERLOADING
data DeviceProviderFactoryGetDeviceProviderTypeMethodInfo
instance (signature ~ (m GType), MonadIO m, IsDeviceProviderFactory a) => O.MethodInfo DeviceProviderFactoryGetDeviceProviderTypeMethodInfo a signature where
    overloadedMethod _ = deviceProviderFactoryGetDeviceProviderType

#endif

-- method DeviceProviderFactory::get_metadata
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "factory", argType = TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProviderFactory", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "key", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a key", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_factory_get_metadata" gst_device_provider_factory_get_metadata ::
    Ptr DeviceProviderFactory ->            -- factory : TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"})
    CString ->                              -- key : TBasicType TUTF8
    IO CString

{- |
Get the metadata on /@factory@/ with /@key@/.

/Since: 1.4/
-}
deviceProviderFactoryGetMetadata ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProviderFactory a) =>
    a
    {- ^ /@factory@/: a 'GI.Gst.Objects.DeviceProviderFactory.DeviceProviderFactory' -}
    -> T.Text
    {- ^ /@key@/: a key -}
    -> m (Maybe T.Text)
    {- ^ __Returns:__ the metadata with /@key@/ on /@factory@/ or 'Nothing'
when there was no metadata with the given /@key@/. -}
deviceProviderFactoryGetMetadata factory key = liftIO $ do
    factory' <- unsafeManagedPtrCastPtr factory
    key' <- textToCString key
    result <- gst_device_provider_factory_get_metadata factory' key'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- cstringToText result'
        return result''
    touchManagedPtr factory
    freeMem key'
    return maybeResult

#if ENABLE_OVERLOADING
data DeviceProviderFactoryGetMetadataMethodInfo
instance (signature ~ (T.Text -> m (Maybe T.Text)), MonadIO m, IsDeviceProviderFactory a) => O.MethodInfo DeviceProviderFactoryGetMetadataMethodInfo a signature where
    overloadedMethod _ = deviceProviderFactoryGetMetadata

#endif

-- method DeviceProviderFactory::get_metadata_keys
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "factory", argType = TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProviderFactory", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TCArray True (-1) (-1) (TBasicType TUTF8))
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_factory_get_metadata_keys" gst_device_provider_factory_get_metadata_keys ::
    Ptr DeviceProviderFactory ->            -- factory : TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"})
    IO (Ptr CString)

{- |
Get the available keys for the metadata on /@factory@/.

/Since: 1.4/
-}
deviceProviderFactoryGetMetadataKeys ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProviderFactory a) =>
    a
    {- ^ /@factory@/: a 'GI.Gst.Objects.DeviceProviderFactory.DeviceProviderFactory' -}
    -> m (Maybe [T.Text])
    {- ^ __Returns:__ 
a 'Nothing'-terminated array of key strings, or 'Nothing' when there is no
metadata. Free with 'GI.GLib.Functions.strfreev' when no longer needed. -}
deviceProviderFactoryGetMetadataKeys factory = liftIO $ do
    factory' <- unsafeManagedPtrCastPtr factory
    result <- gst_device_provider_factory_get_metadata_keys factory'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- unpackZeroTerminatedUTF8CArray result'
        mapZeroTerminatedCArray freeMem result'
        freeMem result'
        return result''
    touchManagedPtr factory
    return maybeResult

#if ENABLE_OVERLOADING
data DeviceProviderFactoryGetMetadataKeysMethodInfo
instance (signature ~ (m (Maybe [T.Text])), MonadIO m, IsDeviceProviderFactory a) => O.MethodInfo DeviceProviderFactoryGetMetadataKeysMethodInfo a signature where
    overloadedMethod _ = deviceProviderFactoryGetMetadataKeys

#endif

-- method DeviceProviderFactory::has_classes
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "factory", argType = TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProviderFactory", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "classes", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "a \"/\" separate list of classes to match, only match\n    if all classes are matched", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_factory_has_classes" gst_device_provider_factory_has_classes ::
    Ptr DeviceProviderFactory ->            -- factory : TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"})
    CString ->                              -- classes : TBasicType TUTF8
    IO CInt

{- |
Check if /@factory@/ matches all of the given /@classes@/

/Since: 1.4/
-}
deviceProviderFactoryHasClasses ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProviderFactory a) =>
    a
    {- ^ /@factory@/: a 'GI.Gst.Objects.DeviceProviderFactory.DeviceProviderFactory' -}
    -> Maybe (T.Text)
    {- ^ /@classes@/: a \"\/\" separate list of classes to match, only match
    if all classes are matched -}
    -> m Bool
    {- ^ __Returns:__ 'True' if /@factory@/ matches or if /@classes@/ is 'Nothing'. -}
deviceProviderFactoryHasClasses factory classes = liftIO $ do
    factory' <- unsafeManagedPtrCastPtr factory
    maybeClasses <- case classes of
        Nothing -> return nullPtr
        Just jClasses -> do
            jClasses' <- textToCString jClasses
            return jClasses'
    result <- gst_device_provider_factory_has_classes factory' maybeClasses
    let result' = (/= 0) result
    touchManagedPtr factory
    freeMem maybeClasses
    return result'

#if ENABLE_OVERLOADING
data DeviceProviderFactoryHasClassesMethodInfo
instance (signature ~ (Maybe (T.Text) -> m Bool), MonadIO m, IsDeviceProviderFactory a) => O.MethodInfo DeviceProviderFactoryHasClassesMethodInfo a signature where
    overloadedMethod _ = deviceProviderFactoryHasClasses

#endif

-- method DeviceProviderFactory::has_classesv
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "factory", argType = TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProviderFactory", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "classes", argType = TCArray True (-1) (-1) (TBasicType TUTF8), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "a %NULL terminated array\n  of classes to match, only match if all classes are matched", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_factory_has_classesv" gst_device_provider_factory_has_classesv ::
    Ptr DeviceProviderFactory ->            -- factory : TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"})
    Ptr CString ->                          -- classes : TCArray True (-1) (-1) (TBasicType TUTF8)
    IO CInt

{- |
Check if /@factory@/ matches all of the given classes

/Since: 1.4/
-}
deviceProviderFactoryHasClassesv ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProviderFactory a) =>
    a
    {- ^ /@factory@/: a 'GI.Gst.Objects.DeviceProviderFactory.DeviceProviderFactory' -}
    -> Maybe ([T.Text])
    {- ^ /@classes@/: a 'Nothing' terminated array
  of classes to match, only match if all classes are matched -}
    -> m Bool
    {- ^ __Returns:__ 'True' if /@factory@/ matches. -}
deviceProviderFactoryHasClassesv factory classes = liftIO $ do
    factory' <- unsafeManagedPtrCastPtr factory
    maybeClasses <- case classes of
        Nothing -> return nullPtr
        Just jClasses -> do
            jClasses' <- packZeroTerminatedUTF8CArray jClasses
            return jClasses'
    result <- gst_device_provider_factory_has_classesv factory' maybeClasses
    let result' = (/= 0) result
    touchManagedPtr factory
    mapZeroTerminatedCArray freeMem maybeClasses
    freeMem maybeClasses
    return result'

#if ENABLE_OVERLOADING
data DeviceProviderFactoryHasClassesvMethodInfo
instance (signature ~ (Maybe ([T.Text]) -> m Bool), MonadIO m, IsDeviceProviderFactory a) => O.MethodInfo DeviceProviderFactoryHasClassesvMethodInfo a signature where
    overloadedMethod _ = deviceProviderFactoryHasClassesv

#endif

-- method DeviceProviderFactory::find
-- method type : MemberFunction
-- Args : [Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "name of factory to find", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_factory_find" gst_device_provider_factory_find ::
    CString ->                              -- name : TBasicType TUTF8
    IO (Ptr DeviceProviderFactory)

{- |
Search for an device provider factory of the given name. Refs the returned
device provider factory; caller is responsible for unreffing.

/Since: 1.4/
-}
deviceProviderFactoryFind ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    T.Text
    {- ^ /@name@/: name of factory to find -}
    -> m (Maybe DeviceProviderFactory)
    {- ^ __Returns:__ 'GI.Gst.Objects.DeviceProviderFactory.DeviceProviderFactory' if
found, 'Nothing' otherwise -}
deviceProviderFactoryFind name = liftIO $ do
    name' <- textToCString name
    result <- gst_device_provider_factory_find name'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (wrapObject DeviceProviderFactory) result'
        return result''
    freeMem name'
    return maybeResult

#if ENABLE_OVERLOADING
#endif

-- method DeviceProviderFactory::get_by_name
-- method type : MemberFunction
-- Args : [Arg {argCName = "factoryname", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a named factory to instantiate", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gst", name = "DeviceProvider"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_factory_get_by_name" gst_device_provider_factory_get_by_name ::
    CString ->                              -- factoryname : TBasicType TUTF8
    IO (Ptr Gst.DeviceProvider.DeviceProvider)

{- |
Returns the device provider of the type defined by the given device
provider factory.

/Since: 1.4/
-}
deviceProviderFactoryGetByName ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    T.Text
    {- ^ /@factoryname@/: a named factory to instantiate -}
    -> m (Maybe Gst.DeviceProvider.DeviceProvider)
    {- ^ __Returns:__ a 'GI.Gst.Objects.DeviceProvider.DeviceProvider' or 'Nothing'
if unable to create device provider -}
deviceProviderFactoryGetByName factoryname = liftIO $ do
    factoryname' <- textToCString factoryname
    result <- gst_device_provider_factory_get_by_name factoryname'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (wrapObject Gst.DeviceProvider.DeviceProvider) result'
        return result''
    freeMem factoryname'
    return maybeResult

#if ENABLE_OVERLOADING
#endif

-- method DeviceProviderFactory::list_get_device_providers
-- method type : MemberFunction
-- Args : [Arg {argCName = "minrank", argType = TInterface (Name {namespace = "Gst", name = "Rank"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "Minimum rank", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TGList (TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"})))
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_factory_list_get_device_providers" gst_device_provider_factory_list_get_device_providers ::
    CUInt ->                                -- minrank : TInterface (Name {namespace = "Gst", name = "Rank"})
    IO (Ptr (GList (Ptr DeviceProviderFactory)))

{- |
Get a list of factories with a rank greater or equal to /@minrank@/.
The list of factories is returned by decreasing rank.

/Since: 1.4/
-}
deviceProviderFactoryListGetDeviceProviders ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Gst.Enums.Rank
    {- ^ /@minrank@/: Minimum rank -}
    -> m [DeviceProviderFactory]
    {- ^ __Returns:__ 
a 'GI.GLib.Structs.List.List' of 'GI.Gst.Objects.DeviceProviderFactory.DeviceProviderFactory' device providers. Use
'GI.Gst.Objects.PluginFeature.pluginFeatureListFree' after usage. -}
deviceProviderFactoryListGetDeviceProviders minrank = liftIO $ do
    let minrank' = (fromIntegral . fromEnum) minrank
    result <- gst_device_provider_factory_list_get_device_providers minrank'
    result' <- unpackGList result
    result'' <- mapM (wrapObject DeviceProviderFactory) result'
    g_list_free result
    return result''

#if ENABLE_OVERLOADING
#endif