{-# 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                                ,


 -- * 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.BasicTypes as B.Types
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 Control.Monad.IO.Class as MIO
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 (SP.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)

instance SP.ManagedPtrNewtype Tracer where
    toManagedPtr :: Tracer -> ManagedPtr Tracer
toManagedPtr (Tracer ManagedPtr Tracer
p) = ManagedPtr Tracer
p

foreign import ccall "gst_tracer_get_type"
    c_gst_tracer_get_type :: IO B.Types.GType

instance B.Types.TypedObject Tracer where
    glibType :: IO GType
glibType = IO GType
c_gst_tracer_get_type

instance B.Types.GObject Tracer

-- | 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 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 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 (SP.GObject o, O.IsDescendantOf Tracer o) => IsTracer o
instance (SP.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, ManagedPtrNewtype o, TypedObject o,
 ManagedPtrNewtype o', TypedObject o') =>
(ManagedPtr o' -> o') -> o -> IO o'
unsafeCastTo ManagedPtr Tracer -> Tracer
Tracer

#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 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 String
"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 o
obj 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 String
"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, MIO.MonadIO m) => T.Text -> m (GValueConstruct o)
constructTracerParams :: Text -> m (GValueConstruct o)
constructTracerParams Text
val = IO (GValueConstruct o) -> m (GValueConstruct o)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
MIO.liftIO (IO (GValueConstruct o) -> m (GValueConstruct o))
-> IO (GValueConstruct o) -> m (GValueConstruct o)
forall a b. (a -> b) -> a -> b
$ String -> Maybe Text -> IO (GValueConstruct o)
forall o. String -> Maybe Text -> IO (GValueConstruct o)
B.Properties.constructObjectPropertyString String
"params" (Text -> Maybe Text
forall a. a -> Maybe a
P.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 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 String
"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