{-# LANGUAGE TypeApplications #-}


-- | Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
-- License    : LGPL-2.1
-- Maintainer : Iñaki García Etxebarria
-- 
-- Virtual table for handling subtrees registered with 'GI.Gio.Objects.DBusConnection.dBusConnectionRegisterSubtree'.
-- 
-- /Since: 2.26/

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

module GI.Gio.Structs.DBusSubtreeVTable
    (

-- * Exported types
    DBusSubtreeVTable(..)                   ,
    newZeroDBusSubtreeVTable                ,
    noDBusSubtreeVTable                     ,


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

#if defined(ENABLE_OVERLOADING)
    ResolveDBusSubtreeVTableMethod          ,
#endif




 -- * Properties
-- ** dispatch #attr:dispatch#
-- | Function for dispatching a remote call on a child node.

    clearDBusSubtreeVTableDispatch          ,
#if defined(ENABLE_OVERLOADING)
    dBusSubtreeVTable_dispatch              ,
#endif
    getDBusSubtreeVTableDispatch            ,
    setDBusSubtreeVTableDispatch            ,


-- ** introspect #attr:introspect#
-- | Function for introspecting a child node.

    clearDBusSubtreeVTableIntrospect        ,
#if defined(ENABLE_OVERLOADING)
    dBusSubtreeVTable_introspect            ,
#endif
    getDBusSubtreeVTableIntrospect          ,
    setDBusSubtreeVTableIntrospect          ,




    ) 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.Gio.Callbacks as Gio.Callbacks

-- | Memory-managed wrapper type.
newtype DBusSubtreeVTable = DBusSubtreeVTable (ManagedPtr DBusSubtreeVTable)
    deriving (Eq)
instance WrappedPtr DBusSubtreeVTable where
    wrappedPtrCalloc = callocBytes 44
    wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 44 >=> wrapPtr DBusSubtreeVTable)
    wrappedPtrFree = Just ptr_to_g_free

-- | Construct a `DBusSubtreeVTable` struct initialized to zero.
newZeroDBusSubtreeVTable :: MonadIO m => m DBusSubtreeVTable
newZeroDBusSubtreeVTable = liftIO $ wrappedPtrCalloc >>= wrapPtr DBusSubtreeVTable

instance tag ~ 'AttrSet => Constructible DBusSubtreeVTable tag where
    new _ attrs = do
        o <- newZeroDBusSubtreeVTable
        GI.Attributes.set o attrs
        return o


-- | A convenience alias for `Nothing` :: `Maybe` `DBusSubtreeVTable`.
noDBusSubtreeVTable :: Maybe DBusSubtreeVTable
noDBusSubtreeVTable = Nothing

-- | Get the value of the “@introspect@” field.
-- When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to
-- 
-- @
-- 'Data.GI.Base.Attributes.get' dBusSubtreeVTable #introspect
-- @
getDBusSubtreeVTableIntrospect :: MonadIO m => DBusSubtreeVTable -> m (Maybe Gio.Callbacks.DBusSubtreeIntrospectFunc_WithClosures)
getDBusSubtreeVTableIntrospect s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 4) :: IO (FunPtr Gio.Callbacks.C_DBusSubtreeIntrospectFunc)
    result <- SP.convertFunPtrIfNonNull val $ \val' -> do
        let val'' = Gio.Callbacks.dynamic_DBusSubtreeIntrospectFunc val'
        return val''
    return result

-- | Set the value of the “@introspect@” field.
-- When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to
-- 
-- @
-- 'Data.GI.Base.Attributes.set' dBusSubtreeVTable [ #introspect 'Data.GI.Base.Attributes.:=' value ]
-- @
setDBusSubtreeVTableIntrospect :: MonadIO m => DBusSubtreeVTable -> FunPtr Gio.Callbacks.C_DBusSubtreeIntrospectFunc -> m ()
setDBusSubtreeVTableIntrospect s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 4) (val :: FunPtr Gio.Callbacks.C_DBusSubtreeIntrospectFunc)

-- | Set the value of the “@introspect@” field to `Nothing`.
-- When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to
-- 
-- @
-- 'Data.GI.Base.Attributes.clear' #introspect
-- @
clearDBusSubtreeVTableIntrospect :: MonadIO m => DBusSubtreeVTable -> m ()
clearDBusSubtreeVTableIntrospect s = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 4) (FP.nullFunPtr :: FunPtr Gio.Callbacks.C_DBusSubtreeIntrospectFunc)

#if defined(ENABLE_OVERLOADING)
data DBusSubtreeVTableIntrospectFieldInfo
instance AttrInfo DBusSubtreeVTableIntrospectFieldInfo where
    type AttrBaseTypeConstraint DBusSubtreeVTableIntrospectFieldInfo = (~) DBusSubtreeVTable
    type AttrAllowedOps DBusSubtreeVTableIntrospectFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint DBusSubtreeVTableIntrospectFieldInfo = (~) (FunPtr Gio.Callbacks.C_DBusSubtreeIntrospectFunc)
    type AttrTransferTypeConstraint DBusSubtreeVTableIntrospectFieldInfo = (~)Gio.Callbacks.DBusSubtreeIntrospectFunc_WithClosures
    type AttrTransferType DBusSubtreeVTableIntrospectFieldInfo = (FunPtr Gio.Callbacks.C_DBusSubtreeIntrospectFunc)
    type AttrGetType DBusSubtreeVTableIntrospectFieldInfo = Maybe Gio.Callbacks.DBusSubtreeIntrospectFunc_WithClosures
    type AttrLabel DBusSubtreeVTableIntrospectFieldInfo = "introspect"
    type AttrOrigin DBusSubtreeVTableIntrospectFieldInfo = DBusSubtreeVTable
    attrGet = getDBusSubtreeVTableIntrospect
    attrSet = setDBusSubtreeVTableIntrospect
    attrConstruct = undefined
    attrClear = clearDBusSubtreeVTableIntrospect
    attrTransfer _ v = do
        Gio.Callbacks.mk_DBusSubtreeIntrospectFunc (Gio.Callbacks.wrap_DBusSubtreeIntrospectFunc Nothing v)

dBusSubtreeVTable_introspect :: AttrLabelProxy "introspect"
dBusSubtreeVTable_introspect = AttrLabelProxy

#endif


-- | Get the value of the “@dispatch@” field.
-- When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to
-- 
-- @
-- 'Data.GI.Base.Attributes.get' dBusSubtreeVTable #dispatch
-- @
getDBusSubtreeVTableDispatch :: MonadIO m => DBusSubtreeVTable -> m (Maybe Gio.Callbacks.DBusSubtreeDispatchFunc_WithClosures)
getDBusSubtreeVTableDispatch s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 8) :: IO (FunPtr Gio.Callbacks.C_DBusSubtreeDispatchFunc)
    result <- SP.convertFunPtrIfNonNull val $ \val' -> do
        let val'' = Gio.Callbacks.dynamic_DBusSubtreeDispatchFunc val'
        return val''
    return result

-- | Set the value of the “@dispatch@” field.
-- When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to
-- 
-- @
-- 'Data.GI.Base.Attributes.set' dBusSubtreeVTable [ #dispatch 'Data.GI.Base.Attributes.:=' value ]
-- @
setDBusSubtreeVTableDispatch :: MonadIO m => DBusSubtreeVTable -> FunPtr Gio.Callbacks.C_DBusSubtreeDispatchFunc -> m ()
setDBusSubtreeVTableDispatch s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 8) (val :: FunPtr Gio.Callbacks.C_DBusSubtreeDispatchFunc)

-- | Set the value of the “@dispatch@” field to `Nothing`.
-- When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to
-- 
-- @
-- 'Data.GI.Base.Attributes.clear' #dispatch
-- @
clearDBusSubtreeVTableDispatch :: MonadIO m => DBusSubtreeVTable -> m ()
clearDBusSubtreeVTableDispatch s = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 8) (FP.nullFunPtr :: FunPtr Gio.Callbacks.C_DBusSubtreeDispatchFunc)

#if defined(ENABLE_OVERLOADING)
data DBusSubtreeVTableDispatchFieldInfo
instance AttrInfo DBusSubtreeVTableDispatchFieldInfo where
    type AttrBaseTypeConstraint DBusSubtreeVTableDispatchFieldInfo = (~) DBusSubtreeVTable
    type AttrAllowedOps DBusSubtreeVTableDispatchFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint DBusSubtreeVTableDispatchFieldInfo = (~) (FunPtr Gio.Callbacks.C_DBusSubtreeDispatchFunc)
    type AttrTransferTypeConstraint DBusSubtreeVTableDispatchFieldInfo = (~)Gio.Callbacks.DBusSubtreeDispatchFunc_WithClosures
    type AttrTransferType DBusSubtreeVTableDispatchFieldInfo = (FunPtr Gio.Callbacks.C_DBusSubtreeDispatchFunc)
    type AttrGetType DBusSubtreeVTableDispatchFieldInfo = Maybe Gio.Callbacks.DBusSubtreeDispatchFunc_WithClosures
    type AttrLabel DBusSubtreeVTableDispatchFieldInfo = "dispatch"
    type AttrOrigin DBusSubtreeVTableDispatchFieldInfo = DBusSubtreeVTable
    attrGet = getDBusSubtreeVTableDispatch
    attrSet = setDBusSubtreeVTableDispatch
    attrConstruct = undefined
    attrClear = clearDBusSubtreeVTableDispatch
    attrTransfer _ v = do
        Gio.Callbacks.mk_DBusSubtreeDispatchFunc (Gio.Callbacks.wrap_DBusSubtreeDispatchFunc Nothing v)

dBusSubtreeVTable_dispatch :: AttrLabelProxy "dispatch"
dBusSubtreeVTable_dispatch = AttrLabelProxy

#endif



#if defined(ENABLE_OVERLOADING)
instance O.HasAttributeList DBusSubtreeVTable
type instance O.AttributeList DBusSubtreeVTable = DBusSubtreeVTableAttributeList
type DBusSubtreeVTableAttributeList = ('[ '("introspect", DBusSubtreeVTableIntrospectFieldInfo), '("dispatch", DBusSubtreeVTableDispatchFieldInfo)] :: [(Symbol, *)])
#endif

#if defined(ENABLE_OVERLOADING)
type family ResolveDBusSubtreeVTableMethod (t :: Symbol) (o :: *) :: * where
    ResolveDBusSubtreeVTableMethod l o = O.MethodResolutionFailed l o

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

#endif