{-# LANGUAGE TypeApplications #-}


-- | Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
-- License    : LGPL-2.1
-- Maintainer : Iñaki García Etxebarria
-- 
-- Tracing modules will subclass t'GI.Gst.Objects.Tracer.Tracer' and register through
-- @/gst_tracer_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.
-- 
-- /Since: 1.8/

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

module GI.Gst.Objects.Tracer
    ( 

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


 -- * Methods
-- ** Overloaded methods #method:Overloaded methods#

#if defined(ENABLE_OVERLOADING)
    ResolveTracerMethod                     ,
#endif




 -- * Properties
-- ** params #attr:params#
-- | /No description available in the introspection data./

#if defined(ENABLE_OVERLOADING)
    TracerParamsPropertyInfo                ,
#endif
    clearTracerParams                       ,
    constructTracerParams                   ,
    getTracerParams                         ,
    setTracerParams                         ,
#if defined(ENABLE_OVERLOADING)
    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.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.GI.Base.Signals as B.Signals
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.Objects.Object as Gst.Object

-- | Memory-managed wrapper type.
newtype Tracer = Tracer (ManagedPtr Tracer)
    deriving (Tracer -> Tracer -> Bool
(Tracer -> Tracer -> Bool)
-> (Tracer -> Tracer -> Bool) -> Eq Tracer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Tracer -> Tracer -> Bool
$c/= :: Tracer -> Tracer -> Bool
== :: Tracer -> Tracer -> Bool
$c== :: Tracer -> Tracer -> Bool
Eq)
foreign import ccall "gst_tracer_get_type"
    c_gst_tracer_get_type :: IO GType

instance GObject Tracer where
    gobjectType :: IO GType
gobjectType = IO GType
c_gst_tracer_get_type
    

-- | Convert 'Tracer' to and from 'Data.GI.Base.GValue.GValue' with 'Data.GI.Base.GValue.toGValue' and 'Data.GI.Base.GValue.fromGValue'.
instance B.GValue.IsGValue Tracer where
    toGValue :: Tracer -> IO GValue
toGValue o :: Tracer
o = do
        GType
gtype <- IO GType
c_gst_tracer_get_type
        Tracer -> (Ptr Tracer -> IO GValue) -> IO GValue
forall a c.
(HasCallStack, ManagedPtrNewtype a) =>
a -> (Ptr a -> IO c) -> IO c
B.ManagedPtr.withManagedPtr Tracer
o (GType -> (GValue -> Ptr Tracer -> IO ()) -> Ptr Tracer -> IO GValue
forall a. GType -> (GValue -> a -> IO ()) -> a -> IO GValue
B.GValue.buildGValue GType
gtype GValue -> Ptr Tracer -> IO ()
forall a. GObject a => GValue -> Ptr a -> IO ()
B.GValue.set_object)
        
    fromGValue :: GValue -> IO Tracer
fromGValue gv :: GValue
gv = do
        Ptr Tracer
ptr <- GValue -> IO (Ptr Tracer)
forall b. GObject b => GValue -> IO (Ptr b)
B.GValue.get_object GValue
gv :: IO (Ptr Tracer)
        (ManagedPtr Tracer -> Tracer) -> Ptr Tracer -> IO Tracer
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
B.ManagedPtr.newObject ManagedPtr Tracer -> Tracer
Tracer Ptr Tracer
ptr
        
    

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

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

-- | Cast to `Tracer`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toTracer :: (MonadIO m, IsTracer o) => o -> m Tracer
toTracer :: o -> m Tracer
toTracer = IO Tracer -> m Tracer
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Tracer -> m Tracer) -> (o -> IO Tracer) -> o -> m Tracer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ManagedPtr Tracer -> Tracer) -> o -> IO Tracer
forall o o'.
(HasCallStack, GObject o, GObject o') =>
(ManagedPtr o' -> o') -> o -> IO o'
unsafeCastTo ManagedPtr Tracer -> Tracer
Tracer

-- | A convenience alias for `Nothing` :: `Maybe` `Tracer`.
noTracer :: Maybe Tracer
noTracer :: Maybe Tracer
noTracer = Maybe Tracer
forall a. Maybe a
Nothing

#if defined(ENABLE_OVERLOADING)
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 "getv" o = GObject.Object.ObjectGetvMethodInfo
    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 "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 "setDataFull" o = GObject.Object.ObjectSetDataFullMethodInfo
    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) => OL.IsLabel t (Tracer -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod @info
#else
    fromLabel _ = O.overloadedMethod @info
#endif

#endif

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

-- | Get the value of the “@params@” property.
-- When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to
-- 
-- @
-- 'Data.GI.Base.Attributes.get' tracer #params
-- @
getTracerParams :: (MonadIO m, IsTracer o) => o -> m (Maybe T.Text)
getTracerParams :: o -> m (Maybe Text)
getTracerParams obj :: o
obj = IO (Maybe Text) -> m (Maybe Text)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Maybe Text) -> m (Maybe Text))
-> IO (Maybe Text) -> m (Maybe Text)
forall a b. (a -> b) -> a -> b
$ o -> String -> IO (Maybe Text)
forall a. GObject a => a -> String -> IO (Maybe Text)
B.Properties.getObjectPropertyString o
obj "params"

-- | Set the value of the “@params@” property.
-- When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to
-- 
-- @
-- 'Data.GI.Base.Attributes.set' tracer [ #params 'Data.GI.Base.Attributes.:=' value ]
-- @
setTracerParams :: (MonadIO m, IsTracer o) => o -> T.Text -> m ()
setTracerParams :: o -> Text -> m ()
setTracerParams obj :: o
obj val :: Text
val = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ o -> String -> Maybe Text -> IO ()
forall a. GObject a => a -> String -> Maybe Text -> IO ()
B.Properties.setObjectPropertyString o
obj "params" (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
val)

-- | Construct a `GValueConstruct` with valid value for the “@params@” property. This is rarely needed directly, but it is used by `Data.GI.Base.Constructible.new`.
constructTracerParams :: (IsTracer o) => T.Text -> IO (GValueConstruct o)
constructTracerParams :: Text -> IO (GValueConstruct o)
constructTracerParams val :: Text
val = String -> Maybe Text -> IO (GValueConstruct o)
forall o. String -> Maybe Text -> IO (GValueConstruct o)
B.Properties.constructObjectPropertyString "params" (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
val)

-- | Set the value of the “@params@” property to `Nothing`.
-- When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to
-- 
-- @
-- 'Data.GI.Base.Attributes.clear' #params
-- @
clearTracerParams :: (MonadIO m, IsTracer o) => o -> m ()
clearTracerParams :: o -> m ()
clearTracerParams obj :: o
obj = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ o -> String -> Maybe Text -> IO ()
forall a. GObject a => a -> String -> Maybe Text -> IO ()
B.Properties.setObjectPropertyString o
obj "params" (Maybe Text
forall a. Maybe a
Nothing :: Maybe T.Text)

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

#if defined(ENABLE_OVERLOADING)
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)
tracerParams :: AttrLabelProxy "params"
tracerParams = AttrLabelProxy

#endif

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

#endif