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

Use 'GI.Gst.Objects.TracerFactory.tracerFactoryGetList' to get a list of tracer factories known to
GStreamer.
-}

module GI.Gst.Objects.TracerFactory
    ( 

-- * Exported types
    TracerFactory(..)                       ,
    IsTracerFactory                         ,
    toTracerFactory                         ,
    noTracerFactory                         ,


 -- * Methods
-- ** getList #method:getList#
    tracerFactoryGetList                    ,




    ) 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.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
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 GI.GObject.Objects.Object as GObject.Object
import {-# SOURCE #-} qualified GI.Gst.Objects.Object as Gst.Object
import {-# SOURCE #-} qualified GI.Gst.Objects.PluginFeature as Gst.PluginFeature

newtype TracerFactory = TracerFactory (ManagedPtr TracerFactory)
foreign import ccall "gst_tracer_factory_get_type"
    c_gst_tracer_factory_get_type :: IO GType

instance GObject TracerFactory where
    gobjectType _ = c_gst_tracer_factory_get_type
    

class GObject o => IsTracerFactory o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError TracerFactory a) =>
    IsTracerFactory a
#endif
instance IsTracerFactory TracerFactory
instance Gst.PluginFeature.IsPluginFeature TracerFactory
instance Gst.Object.IsObject TracerFactory
instance GObject.Object.IsObject TracerFactory

toTracerFactory :: IsTracerFactory o => o -> IO TracerFactory
toTracerFactory = unsafeCastTo TracerFactory

noTracerFactory :: Maybe TracerFactory
noTracerFactory = Nothing

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

instance (info ~ ResolveTracerFactoryMethod t TracerFactory, O.MethodInfo info TracerFactory p) => O.IsLabelProxy t (TracerFactory -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

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

instance O.HasAttributeList TracerFactory
type instance O.AttributeList TracerFactory = TracerFactoryAttributeList
type TracerFactoryAttributeList = ('[ '("name", Gst.Object.ObjectNamePropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo)] :: [(Symbol, *)])

type instance O.SignalList TracerFactory = TracerFactorySignalList
type TracerFactorySignalList = ('[ '("deepNotify", Gst.Object.ObjectDeepNotifySignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

-- method TracerFactory::get_list
-- method type : MemberFunction
-- Args : []
-- Lengths : []
-- returnType : Just (TGList (TInterface (Name {namespace = "Gst", name = "TracerFactory"})))
-- throws : False
-- Skip return : False

foreign import ccall "gst_tracer_factory_get_list" gst_tracer_factory_get_list :: 
    IO (Ptr (GList (Ptr TracerFactory)))

{- |
Gets the list of all registered tracer factories. You must free the
list using 'GI.Gst.Objects.PluginFeature.pluginFeatureListFree'.

The returned factories are sorted by factory name.

Free-function: gst_plugin_feature_list_free

@since 1.8
-}
tracerFactoryGetList ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m [TracerFactory]
    {- ^ __Returns:__ the list of all
    registered 'GI.Gst.Objects.TracerFactory.TracerFactory'. -}
tracerFactoryGetList  = liftIO $ do
    result <- gst_tracer_factory_get_list
    result' <- unpackGList result
    result'' <- mapM (wrapObject TracerFactory) result'
    g_list_free result
    return result''