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

Tracing modules will subclass 'GI.Gst.Objects.Tracer.Tracer' and register through
@/gst_tracing_register()/@. Modules can attach to various hook-types - see
@/gst_tracing_register_hook()/@. When invoked they receive hook specific
contextual data, which they must not modify.
-}

module GI.Gst.Objects.Tracer
    ( 

-- * Exported types
    Tracer(..)                              ,
    IsTracer                                ,
    toTracer                                ,
    noTracer                                ,


 -- * Properties
-- ** params #attr:params#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    TracerParamsPropertyInfo                ,
#endif
    clearTracerParams                       ,
    constructTracerParams                   ,
    getTracerParams                         ,
    setTracerParams                         ,
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    tracerParams                            ,
#endif




    ) 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

newtype Tracer = Tracer (ManagedPtr Tracer)
foreign import ccall "gst_tracer_get_type"
    c_gst_tracer_get_type :: IO GType

instance GObject Tracer where
    gobjectType _ = c_gst_tracer_get_type
    

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

toTracer :: (MonadIO m, IsTracer o) => o -> m Tracer
toTracer = liftIO . unsafeCastTo Tracer

noTracer :: Maybe Tracer
noTracer = Nothing

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

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

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveTracerMethod t Tracer, O.MethodInfo info Tracer p) => O.IsLabel t (Tracer -> 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

#endif

-- VVV Prop "params"
   -- Type: TBasicType TUTF8
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstruct]
   -- Nullable: (Nothing,Nothing)

getTracerParams :: (MonadIO m, IsTracer o) => o -> m (Maybe T.Text)
getTracerParams obj = liftIO $ getObjectPropertyString obj "params"

setTracerParams :: (MonadIO m, IsTracer o) => o -> T.Text -> m ()
setTracerParams obj val = liftIO $ setObjectPropertyString obj "params" (Just val)

constructTracerParams :: (IsTracer o) => T.Text -> IO (GValueConstruct o)
constructTracerParams val = constructObjectPropertyString "params" (Just val)

clearTracerParams :: (MonadIO m, IsTracer o) => o -> m ()
clearTracerParams obj = liftIO $ setObjectPropertyString obj "params" (Nothing :: Maybe T.Text)

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data TracerParamsPropertyInfo
instance AttrInfo TracerParamsPropertyInfo where
    type AttrAllowedOps TracerParamsPropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint TracerParamsPropertyInfo = (~) T.Text
    type AttrBaseTypeConstraint TracerParamsPropertyInfo = IsTracer
    type AttrGetType TracerParamsPropertyInfo = (Maybe T.Text)
    type AttrLabel TracerParamsPropertyInfo = "params"
    type AttrOrigin TracerParamsPropertyInfo = Tracer
    attrGet _ = getTracerParams
    attrSet _ = setTracerParams
    attrConstruct _ = constructTracerParams
    attrClear _ = clearTracerParams
#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
instance O.HasAttributeList Tracer
type instance O.AttributeList Tracer = TracerAttributeList
type TracerAttributeList = ('[ '("name", Gst.Object.ObjectNamePropertyInfo), '("params", TracerParamsPropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo)] :: [(Symbol, *)])
#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
tracerParams :: AttrLabelProxy "params"
tracerParams = AttrLabelProxy

#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
type instance O.SignalList Tracer = TracerSignalList
type TracerSignalList = ('[ '("deepNotify", Gst.Object.ObjectDeepNotifySignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

#endif