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

    Information about an argument for a method or a signal.

    /Since: 2.26/
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Structs.DBusArgInfo
        (

    -- * Exported types
        DBusArgInfo(..)                         ,
        newZeroDBusArgInfo                      ,
        noDBusArgInfo                           ,

     -- * Methods
    -- ** ref #method:ref#

    #if ENABLE_OVERLOADING
        DBusArgInfoRefMethodInfo                ,
    #endif
        dBusArgInfoRef                          ,

    -- ** unref #method:unref#

    #if ENABLE_OVERLOADING
        DBusArgInfoUnrefMethodInfo              ,
    #endif
        dBusArgInfoUnref                        ,

     -- * Properties
    -- ** annotations #attr:annotations#
    {- | A pointer to a 'Nothing'-terminated array of pointers to 'GI.Gio.Structs.DBusAnnotationInfo.DBusAnnotationInfo' structures or 'Nothing' if there are no annotations.
    -}
        clearDBusArgInfoAnnotations             ,
    #if ENABLE_OVERLOADING
        dBusArgInfo_annotations                 ,
    #endif
        getDBusArgInfoAnnotations               ,
        setDBusArgInfoAnnotations               ,

    -- ** name #attr:name#
    {- | Name of the argument, e.g. /@unixUserId@/.
    -}
        clearDBusArgInfoName                    ,
    #if ENABLE_OVERLOADING
        dBusArgInfo_name                        ,
    #endif
        getDBusArgInfoName                      ,
        setDBusArgInfoName                      ,

    -- ** refCount #attr:refCount#
    {- | The reference count or -1 if statically allocated.
    -}
    #if ENABLE_OVERLOADING
        dBusArgInfo_refCount                    ,
    #endif
        getDBusArgInfoRefCount                  ,
        setDBusArgInfoRefCount                  ,

    -- ** signature #attr:signature#
    {- | D-Bus signature of the argument (a single complete type).
    -}
        clearDBusArgInfoSignature               ,
    #if ENABLE_OVERLOADING
        dBusArgInfo_signature                   ,
    #endif
        getDBusArgInfoSignature                 ,
        setDBusArgInfoSignature                 ,

        ) 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.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.Text as T
    import qualified Data.ByteString.Char8 as B
    import qualified Data.Map as Map
    import qualified Foreign.Ptr as FP

    import {-# SOURCE #-} qualified GI.Gio.Structs.DBusAnnotationInfo as Gio.DBusAnnotationInfo

    -- | Memory-managed wrapper type.
    newtype DBusArgInfo = DBusArgInfo (ManagedPtr DBusArgInfo)
    foreign import ccall "g_dbus_arg_info_get_type" c_g_dbus_arg_info_get_type ::
        IO GType

    instance BoxedObject DBusArgInfo where
        boxedType _ = c_g_dbus_arg_info_get_type

    -- | Construct a `DBusArgInfo` struct initialized to zero.
    newZeroDBusArgInfo :: MonadIO m => m DBusArgInfo
    newZeroDBusArgInfo = liftIO $ callocBoxedBytes 32 >>= wrapBoxed DBusArgInfo

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

    -- | A convenience alias for `Nothing` :: `Maybe` `DBusArgInfo`.
    noDBusArgInfo :: Maybe DBusArgInfo
    noDBusArgInfo = Nothing

    {- |
    Get the value of the “@ref_count@” field.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.get' dBusArgInfo #refCount
    @
    -}
    getDBusArgInfoRefCount :: MonadIO m => DBusArgInfo -> m Int32
    getDBusArgInfoRefCount s = liftIO $ withManagedPtr s $ \ptr -> do
        val <- peek (ptr `plusPtr` 0) :: IO Int32
        return val

    {- |
    Set the value of the “@ref_count@” field.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.set' dBusArgInfo [ #refCount 'Data.GI.Base.Attributes.:=' value ]
    @
    -}
    setDBusArgInfoRefCount :: MonadIO m => DBusArgInfo -> Int32 -> m ()
    setDBusArgInfoRefCount s val = liftIO $ withManagedPtr s $ \ptr -> do
        poke (ptr `plusPtr` 0) (val :: Int32)

    #if ENABLE_OVERLOADING
    data DBusArgInfoRefCountFieldInfo
    instance AttrInfo DBusArgInfoRefCountFieldInfo where
        type AttrAllowedOps DBusArgInfoRefCountFieldInfo = '[ 'AttrSet, 'AttrGet]
        type AttrSetTypeConstraint DBusArgInfoRefCountFieldInfo = (~) Int32
        type AttrBaseTypeConstraint DBusArgInfoRefCountFieldInfo = (~) DBusArgInfo
        type AttrGetType DBusArgInfoRefCountFieldInfo = Int32
        type AttrLabel DBusArgInfoRefCountFieldInfo = "ref_count"
        type AttrOrigin DBusArgInfoRefCountFieldInfo = DBusArgInfo
        attrGet _ = getDBusArgInfoRefCount
        attrSet _ = setDBusArgInfoRefCount
        attrConstruct = undefined
        attrClear _ = undefined

    dBusArgInfo_refCount :: AttrLabelProxy "refCount"
    dBusArgInfo_refCount = AttrLabelProxy

    #endif

    {- |
    Get the value of the “@name@” field.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.get' dBusArgInfo #name
    @
    -}
    getDBusArgInfoName :: MonadIO m => DBusArgInfo -> m (Maybe T.Text)
    getDBusArgInfoName s = liftIO $ withManagedPtr s $ \ptr -> do
        val <- peek (ptr `plusPtr` 8) :: IO CString
        result <- SP.convertIfNonNull val $ \val' -> do
            val'' <- cstringToText val'
            return val''
        return result

    {- |
    Set the value of the “@name@” field.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.set' dBusArgInfo [ #name 'Data.GI.Base.Attributes.:=' value ]
    @
    -}
    setDBusArgInfoName :: MonadIO m => DBusArgInfo -> CString -> m ()
    setDBusArgInfoName s val = liftIO $ withManagedPtr s $ \ptr -> do
        poke (ptr `plusPtr` 8) (val :: CString)

    {- |
    Set the value of the “@name@” 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' #name
    @
    -}
    clearDBusArgInfoName :: MonadIO m => DBusArgInfo -> m ()
    clearDBusArgInfoName s = liftIO $ withManagedPtr s $ \ptr -> do
        poke (ptr `plusPtr` 8) (FP.nullPtr :: CString)

    #if ENABLE_OVERLOADING
    data DBusArgInfoNameFieldInfo
    instance AttrInfo DBusArgInfoNameFieldInfo where
        type AttrAllowedOps DBusArgInfoNameFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
        type AttrSetTypeConstraint DBusArgInfoNameFieldInfo = (~) CString
        type AttrBaseTypeConstraint DBusArgInfoNameFieldInfo = (~) DBusArgInfo
        type AttrGetType DBusArgInfoNameFieldInfo = Maybe T.Text
        type AttrLabel DBusArgInfoNameFieldInfo = "name"
        type AttrOrigin DBusArgInfoNameFieldInfo = DBusArgInfo
        attrGet _ = getDBusArgInfoName
        attrSet _ = setDBusArgInfoName
        attrConstruct = undefined
        attrClear _ = clearDBusArgInfoName

    dBusArgInfo_name :: AttrLabelProxy "name"
    dBusArgInfo_name = AttrLabelProxy

    #endif

    {- |
    Get the value of the “@signature@” field.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.get' dBusArgInfo #signature
    @
    -}
    getDBusArgInfoSignature :: MonadIO m => DBusArgInfo -> m (Maybe T.Text)
    getDBusArgInfoSignature s = liftIO $ withManagedPtr s $ \ptr -> do
        val <- peek (ptr `plusPtr` 16) :: IO CString
        result <- SP.convertIfNonNull val $ \val' -> do
            val'' <- cstringToText val'
            return val''
        return result

    {- |
    Set the value of the “@signature@” field.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.set' dBusArgInfo [ #signature 'Data.GI.Base.Attributes.:=' value ]
    @
    -}
    setDBusArgInfoSignature :: MonadIO m => DBusArgInfo -> CString -> m ()
    setDBusArgInfoSignature s val = liftIO $ withManagedPtr s $ \ptr -> do
        poke (ptr `plusPtr` 16) (val :: CString)

    {- |
    Set the value of the “@signature@” 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' #signature
    @
    -}
    clearDBusArgInfoSignature :: MonadIO m => DBusArgInfo -> m ()
    clearDBusArgInfoSignature s = liftIO $ withManagedPtr s $ \ptr -> do
        poke (ptr `plusPtr` 16) (FP.nullPtr :: CString)

    #if ENABLE_OVERLOADING
    data DBusArgInfoSignatureFieldInfo
    instance AttrInfo DBusArgInfoSignatureFieldInfo where
        type AttrAllowedOps DBusArgInfoSignatureFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
        type AttrSetTypeConstraint DBusArgInfoSignatureFieldInfo = (~) CString
        type AttrBaseTypeConstraint DBusArgInfoSignatureFieldInfo = (~) DBusArgInfo
        type AttrGetType DBusArgInfoSignatureFieldInfo = Maybe T.Text
        type AttrLabel DBusArgInfoSignatureFieldInfo = "signature"
        type AttrOrigin DBusArgInfoSignatureFieldInfo = DBusArgInfo
        attrGet _ = getDBusArgInfoSignature
        attrSet _ = setDBusArgInfoSignature
        attrConstruct = undefined
        attrClear _ = clearDBusArgInfoSignature

    dBusArgInfo_signature :: AttrLabelProxy "signature"
    dBusArgInfo_signature = AttrLabelProxy

    #endif

    {- |
    Get the value of the “@annotations@” field.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.get' dBusArgInfo #annotations
    @
    -}
    getDBusArgInfoAnnotations :: MonadIO m => DBusArgInfo -> m (Maybe [Gio.DBusAnnotationInfo.DBusAnnotationInfo])
    getDBusArgInfoAnnotations s = liftIO $ withManagedPtr s $ \ptr -> do
        val <- peek (ptr `plusPtr` 24) :: IO (Ptr (Ptr Gio.DBusAnnotationInfo.DBusAnnotationInfo))
        result <- SP.convertIfNonNull val $ \val' -> do
            val'' <- unpackZeroTerminatedPtrArray val'
            val''' <- mapM (newBoxed Gio.DBusAnnotationInfo.DBusAnnotationInfo) val''
            return val'''
        return result

    {- |
    Set the value of the “@annotations@” field.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.set' dBusArgInfo [ #annotations 'Data.GI.Base.Attributes.:=' value ]
    @
    -}
    setDBusArgInfoAnnotations :: MonadIO m => DBusArgInfo -> Ptr (Ptr Gio.DBusAnnotationInfo.DBusAnnotationInfo) -> m ()
    setDBusArgInfoAnnotations s val = liftIO $ withManagedPtr s $ \ptr -> do
        poke (ptr `plusPtr` 24) (val :: Ptr (Ptr Gio.DBusAnnotationInfo.DBusAnnotationInfo))

    {- |
    Set the value of the “@annotations@” 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' #annotations
    @
    -}
    clearDBusArgInfoAnnotations :: MonadIO m => DBusArgInfo -> m ()
    clearDBusArgInfoAnnotations s = liftIO $ withManagedPtr s $ \ptr -> do
        poke (ptr `plusPtr` 24) (FP.nullPtr :: Ptr (Ptr Gio.DBusAnnotationInfo.DBusAnnotationInfo))

    #if ENABLE_OVERLOADING
    data DBusArgInfoAnnotationsFieldInfo
    instance AttrInfo DBusArgInfoAnnotationsFieldInfo where
        type AttrAllowedOps DBusArgInfoAnnotationsFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
        type AttrSetTypeConstraint DBusArgInfoAnnotationsFieldInfo = (~) (Ptr (Ptr Gio.DBusAnnotationInfo.DBusAnnotationInfo))
        type AttrBaseTypeConstraint DBusArgInfoAnnotationsFieldInfo = (~) DBusArgInfo
        type AttrGetType DBusArgInfoAnnotationsFieldInfo = Maybe [Gio.DBusAnnotationInfo.DBusAnnotationInfo]
        type AttrLabel DBusArgInfoAnnotationsFieldInfo = "annotations"
        type AttrOrigin DBusArgInfoAnnotationsFieldInfo = DBusArgInfo
        attrGet _ = getDBusArgInfoAnnotations
        attrSet _ = setDBusArgInfoAnnotations
        attrConstruct = undefined
        attrClear _ = clearDBusArgInfoAnnotations

    dBusArgInfo_annotations :: AttrLabelProxy "annotations"
    dBusArgInfo_annotations = AttrLabelProxy

    #endif

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList DBusArgInfo
    type instance O.AttributeList DBusArgInfo = DBusArgInfoAttributeList
    type DBusArgInfoAttributeList = ('[ '("refCount", DBusArgInfoRefCountFieldInfo), '("name", DBusArgInfoNameFieldInfo), '("signature", DBusArgInfoSignatureFieldInfo), '("annotations", DBusArgInfoAnnotationsFieldInfo)] :: [(Symbol, *)])
    #endif

    -- method DBusArgInfo::ref
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "info", argType = TInterface (Name {namespace = "Gio", name = "DBusArgInfo"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GDBusArgInfo", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "DBusArgInfo"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_dbus_arg_info_ref" g_dbus_arg_info_ref ::
        Ptr DBusArgInfo ->                      -- info : TInterface (Name {namespace = "Gio", name = "DBusArgInfo"})
        IO (Ptr DBusArgInfo)

    {- |
    If /@info@/ is statically allocated does nothing. Otherwise increases
    the reference count.

    /Since: 2.26/
    -}
    dBusArgInfoRef ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        DBusArgInfo
        {- ^ /@info@/: A 'GI.Gio.Structs.DBusArgInfo.DBusArgInfo' -}
        -> m DBusArgInfo
        {- ^ __Returns:__ The same /@info@/. -}
    dBusArgInfoRef info = liftIO $ do
        info' <- unsafeManagedPtrGetPtr info
        result <- g_dbus_arg_info_ref info'
        checkUnexpectedReturnNULL "dBusArgInfoRef" result
        result' <- (wrapBoxed DBusArgInfo) result
        touchManagedPtr info
        return result'

    #if ENABLE_OVERLOADING
    data DBusArgInfoRefMethodInfo
    instance (signature ~ (m DBusArgInfo), MonadIO m) => O.MethodInfo DBusArgInfoRefMethodInfo DBusArgInfo signature where
        overloadedMethod _ = dBusArgInfoRef

    #endif

    -- method DBusArgInfo::unref
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "info", argType = TInterface (Name {namespace = "Gio", name = "DBusArgInfo"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GDBusArgInfo.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_dbus_arg_info_unref" g_dbus_arg_info_unref ::
        Ptr DBusArgInfo ->                      -- info : TInterface (Name {namespace = "Gio", name = "DBusArgInfo"})
        IO ()

    {- |
    If /@info@/ is statically allocated, does nothing. Otherwise decreases
    the reference count of /@info@/. When its reference count drops to 0,
    the memory used is freed.

    /Since: 2.26/
    -}
    dBusArgInfoUnref ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        DBusArgInfo
        {- ^ /@info@/: A 'GI.Gio.Structs.DBusArgInfo.DBusArgInfo'. -}
        -> m ()
    dBusArgInfoUnref info = liftIO $ do
        info' <- unsafeManagedPtrGetPtr info
        g_dbus_arg_info_unref info'
        touchManagedPtr info
        return ()

    #if ENABLE_OVERLOADING
    data DBusArgInfoUnrefMethodInfo
    instance (signature ~ (m ()), MonadIO m) => O.MethodInfo DBusArgInfoUnrefMethodInfo DBusArgInfo signature where
        overloadedMethod _ = dBusArgInfoUnref

    #endif

    #if ENABLE_OVERLOADING
    type family ResolveDBusArgInfoMethod (t :: Symbol) (o :: *) :: * where
        ResolveDBusArgInfoMethod "ref" o = DBusArgInfoRefMethodInfo
        ResolveDBusArgInfoMethod "unref" o = DBusArgInfoUnrefMethodInfo
        ResolveDBusArgInfoMethod l o = O.MethodResolutionFailed l o

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

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