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

    'GI.Gio.Structs.IOExtensionPoint.IOExtensionPoint' is an opaque data structure and can only be accessed
    using the following functions.
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Structs.IOExtensionPoint
        (

    -- * Exported types
        IOExtensionPoint(..)                    ,
        noIOExtensionPoint                      ,

     -- * Methods
    -- ** getExtensionByName #method:getExtensionByName#

    #if ENABLE_OVERLOADING
        IOExtensionPointGetExtensionByNameMethodInfo,
    #endif
        iOExtensionPointGetExtensionByName      ,

    -- ** getExtensions #method:getExtensions#

    #if ENABLE_OVERLOADING
        IOExtensionPointGetExtensionsMethodInfo ,
    #endif
        iOExtensionPointGetExtensions           ,

    -- ** getRequiredType #method:getRequiredType#

    #if ENABLE_OVERLOADING
        IOExtensionPointGetRequiredTypeMethodInfo,
    #endif
        iOExtensionPointGetRequiredType         ,

    -- ** implement #method:implement#

        iOExtensionPointImplement               ,

    -- ** lookup #method:lookup#

        iOExtensionPointLookup                  ,

    -- ** register #method:register#

        iOExtensionPointRegister                ,

    -- ** setRequiredType #method:setRequiredType#

    #if ENABLE_OVERLOADING
        IOExtensionPointSetRequiredTypeMethodInfo,
    #endif
        iOExtensionPointSetRequiredType         ,

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

    -- | Memory-managed wrapper type.
    newtype IOExtensionPoint = IOExtensionPoint (ManagedPtr IOExtensionPoint)
    -- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
    instance WrappedPtr IOExtensionPoint where
        wrappedPtrCalloc = return nullPtr
        wrappedPtrCopy = return
        wrappedPtrFree = Nothing

    -- | A convenience alias for `Nothing` :: `Maybe` `IOExtensionPoint`.
    noIOExtensionPoint :: Maybe IOExtensionPoint
    noIOExtensionPoint = Nothing

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList IOExtensionPoint
    type instance O.AttributeList IOExtensionPoint = IOExtensionPointAttributeList
    type IOExtensionPointAttributeList = ('[ ] :: [(Symbol, *)])
    #endif

    -- method IOExtensionPoint::get_extension_by_name
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "extension_point", argType = TInterface (Name {namespace = "Gio", name = "IOExtensionPoint"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GIOExtensionPoint", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of the extension to get", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "IOExtension"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_io_extension_point_get_extension_by_name" g_io_extension_point_get_extension_by_name ::
        Ptr IOExtensionPoint ->                 -- extension_point : TInterface (Name {namespace = "Gio", name = "IOExtensionPoint"})
        CString ->                              -- name : TBasicType TUTF8
        IO (Ptr Gio.IOExtension.IOExtension)

    {- |
    Finds a 'GI.Gio.Structs.IOExtension.IOExtension' for an extension point by name.
    -}
    iOExtensionPointGetExtensionByName ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        IOExtensionPoint
        {- ^ /@extensionPoint@/: a 'GI.Gio.Structs.IOExtensionPoint.IOExtensionPoint' -}
        -> T.Text
        {- ^ /@name@/: the name of the extension to get -}
        -> m Gio.IOExtension.IOExtension
        {- ^ __Returns:__ the 'GI.Gio.Structs.IOExtension.IOExtension' for /@extensionPoint@/ that has the
       given name, or 'Nothing' if there is no extension with that name -}
    iOExtensionPointGetExtensionByName extensionPoint name = liftIO $ do
        extensionPoint' <- unsafeManagedPtrGetPtr extensionPoint
        name' <- textToCString name
        result <- g_io_extension_point_get_extension_by_name extensionPoint' name'
        checkUnexpectedReturnNULL "iOExtensionPointGetExtensionByName" result
        result' <- (newPtr Gio.IOExtension.IOExtension) result
        touchManagedPtr extensionPoint
        freeMem name'
        return result'

    #if ENABLE_OVERLOADING
    data IOExtensionPointGetExtensionByNameMethodInfo
    instance (signature ~ (T.Text -> m Gio.IOExtension.IOExtension), MonadIO m) => O.MethodInfo IOExtensionPointGetExtensionByNameMethodInfo IOExtensionPoint signature where
        overloadedMethod _ = iOExtensionPointGetExtensionByName

    #endif

    -- method IOExtensionPoint::get_extensions
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "extension_point", argType = TInterface (Name {namespace = "Gio", name = "IOExtensionPoint"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GIOExtensionPoint", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TGList (TInterface (Name {namespace = "Gio", name = "IOExtension"})))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_io_extension_point_get_extensions" g_io_extension_point_get_extensions ::
        Ptr IOExtensionPoint ->                 -- extension_point : TInterface (Name {namespace = "Gio", name = "IOExtensionPoint"})
        IO (Ptr (GList (Ptr Gio.IOExtension.IOExtension)))

    {- |
    Gets a list of all extensions that implement this extension point.
    The list is sorted by priority, beginning with the highest priority.
    -}
    iOExtensionPointGetExtensions ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        IOExtensionPoint
        {- ^ /@extensionPoint@/: a 'GI.Gio.Structs.IOExtensionPoint.IOExtensionPoint' -}
        -> m [Gio.IOExtension.IOExtension]
        {- ^ __Returns:__ a 'GI.GLib.Structs.List.List' of
        @/GIOExtensions/@. The list is owned by GIO and should not be
        modified. -}
    iOExtensionPointGetExtensions extensionPoint = liftIO $ do
        extensionPoint' <- unsafeManagedPtrGetPtr extensionPoint
        result <- g_io_extension_point_get_extensions extensionPoint'
        result' <- unpackGList result
        result'' <- mapM (newPtr Gio.IOExtension.IOExtension) result'
        touchManagedPtr extensionPoint
        return result''

    #if ENABLE_OVERLOADING
    data IOExtensionPointGetExtensionsMethodInfo
    instance (signature ~ (m [Gio.IOExtension.IOExtension]), MonadIO m) => O.MethodInfo IOExtensionPointGetExtensionsMethodInfo IOExtensionPoint signature where
        overloadedMethod _ = iOExtensionPointGetExtensions

    #endif

    -- method IOExtensionPoint::get_required_type
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "extension_point", argType = TInterface (Name {namespace = "Gio", name = "IOExtensionPoint"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GIOExtensionPoint", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TBasicType TGType)
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_io_extension_point_get_required_type" g_io_extension_point_get_required_type ::
        Ptr IOExtensionPoint ->                 -- extension_point : TInterface (Name {namespace = "Gio", name = "IOExtensionPoint"})
        IO CGType

    {- |
    Gets the required type for /@extensionPoint@/.
    -}
    iOExtensionPointGetRequiredType ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        IOExtensionPoint
        {- ^ /@extensionPoint@/: a 'GI.Gio.Structs.IOExtensionPoint.IOExtensionPoint' -}
        -> m GType
        {- ^ __Returns:__ the 'GType' that all implementations must have,
        or @/G_TYPE_INVALID/@ if the extension point has no required type -}
    iOExtensionPointGetRequiredType extensionPoint = liftIO $ do
        extensionPoint' <- unsafeManagedPtrGetPtr extensionPoint
        result <- g_io_extension_point_get_required_type extensionPoint'
        let result' = GType result
        touchManagedPtr extensionPoint
        return result'

    #if ENABLE_OVERLOADING
    data IOExtensionPointGetRequiredTypeMethodInfo
    instance (signature ~ (m GType), MonadIO m) => O.MethodInfo IOExtensionPointGetRequiredTypeMethodInfo IOExtensionPoint signature where
        overloadedMethod _ = iOExtensionPointGetRequiredType

    #endif

    -- method IOExtensionPoint::set_required_type
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "extension_point", argType = TInterface (Name {namespace = "Gio", name = "IOExtensionPoint"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GIOExtensionPoint", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the #GType to require", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_io_extension_point_set_required_type" g_io_extension_point_set_required_type ::
        Ptr IOExtensionPoint ->                 -- extension_point : TInterface (Name {namespace = "Gio", name = "IOExtensionPoint"})
        CGType ->                               -- type : TBasicType TGType
        IO ()

    {- |
    Sets the required type for /@extensionPoint@/ to /@type@/.
    All implementations must henceforth have this type.
    -}
    iOExtensionPointSetRequiredType ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        IOExtensionPoint
        {- ^ /@extensionPoint@/: a 'GI.Gio.Structs.IOExtensionPoint.IOExtensionPoint' -}
        -> GType
        {- ^ /@type@/: the 'GType' to require -}
        -> m ()
    iOExtensionPointSetRequiredType extensionPoint type_ = liftIO $ do
        extensionPoint' <- unsafeManagedPtrGetPtr extensionPoint
        let type_' = gtypeToCGType type_
        g_io_extension_point_set_required_type extensionPoint' type_'
        touchManagedPtr extensionPoint
        return ()

    #if ENABLE_OVERLOADING
    data IOExtensionPointSetRequiredTypeMethodInfo
    instance (signature ~ (GType -> m ()), MonadIO m) => O.MethodInfo IOExtensionPointSetRequiredTypeMethodInfo IOExtensionPoint signature where
        overloadedMethod _ = iOExtensionPointSetRequiredType

    #endif

    -- method IOExtensionPoint::implement
    -- method type : MemberFunction
    -- Args : [Arg {argCName = "extension_point_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of the extension point", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the #GType to register as extension", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "extension_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name for the extension", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "priority", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the priority for the extension", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "IOExtension"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_io_extension_point_implement" g_io_extension_point_implement ::
        CString ->                              -- extension_point_name : TBasicType TUTF8
        CGType ->                               -- type : TBasicType TGType
        CString ->                              -- extension_name : TBasicType TUTF8
        Int32 ->                                -- priority : TBasicType TInt
        IO (Ptr Gio.IOExtension.IOExtension)

    {- |
    Registers /@type@/ as extension for the extension point with name
    /@extensionPointName@/.

    If /@type@/ has already been registered as an extension for this
    extension point, the existing 'GI.Gio.Structs.IOExtension.IOExtension' object is returned.
    -}
    iOExtensionPointImplement ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        T.Text
        {- ^ /@extensionPointName@/: the name of the extension point -}
        -> GType
        {- ^ /@type@/: the 'GType' to register as extension -}
        -> T.Text
        {- ^ /@extensionName@/: the name for the extension -}
        -> Int32
        {- ^ /@priority@/: the priority for the extension -}
        -> m Gio.IOExtension.IOExtension
        {- ^ __Returns:__ a 'GI.Gio.Structs.IOExtension.IOExtension' object for 'GType' -}
    iOExtensionPointImplement extensionPointName type_ extensionName priority = liftIO $ do
        extensionPointName' <- textToCString extensionPointName
        let type_' = gtypeToCGType type_
        extensionName' <- textToCString extensionName
        result <- g_io_extension_point_implement extensionPointName' type_' extensionName' priority
        checkUnexpectedReturnNULL "iOExtensionPointImplement" result
        result' <- (newPtr Gio.IOExtension.IOExtension) result
        freeMem extensionPointName'
        freeMem extensionName'
        return result'

    #if ENABLE_OVERLOADING
    #endif

    -- method IOExtensionPoint::lookup
    -- method type : MemberFunction
    -- Args : [Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of the extension point", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "IOExtensionPoint"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_io_extension_point_lookup" g_io_extension_point_lookup ::
        CString ->                              -- name : TBasicType TUTF8
        IO (Ptr IOExtensionPoint)

    {- |
    Looks up an existing extension point.
    -}
    iOExtensionPointLookup ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        T.Text
        {- ^ /@name@/: the name of the extension point -}
        -> m IOExtensionPoint
        {- ^ __Returns:__ the 'GI.Gio.Structs.IOExtensionPoint.IOExtensionPoint', or 'Nothing' if there
       is no registered extension point with the given name. -}
    iOExtensionPointLookup name = liftIO $ do
        name' <- textToCString name
        result <- g_io_extension_point_lookup name'
        checkUnexpectedReturnNULL "iOExtensionPointLookup" result
        result' <- (newPtr IOExtensionPoint) result
        freeMem name'
        return result'

    #if ENABLE_OVERLOADING
    #endif

    -- method IOExtensionPoint::register
    -- method type : MemberFunction
    -- Args : [Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "The name of the extension point", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "IOExtensionPoint"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_io_extension_point_register" g_io_extension_point_register ::
        CString ->                              -- name : TBasicType TUTF8
        IO (Ptr IOExtensionPoint)

    {- |
    Registers an extension point.
    -}
    iOExtensionPointRegister ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        T.Text
        {- ^ /@name@/: The name of the extension point -}
        -> m IOExtensionPoint
        {- ^ __Returns:__ the new 'GI.Gio.Structs.IOExtensionPoint.IOExtensionPoint'. This object is
       owned by GIO and should not be freed. -}
    iOExtensionPointRegister name = liftIO $ do
        name' <- textToCString name
        result <- g_io_extension_point_register name'
        checkUnexpectedReturnNULL "iOExtensionPointRegister" result
        result' <- (newPtr IOExtensionPoint) result
        freeMem name'
        return result'

    #if ENABLE_OVERLOADING
    #endif

    #if ENABLE_OVERLOADING
    type family ResolveIOExtensionPointMethod (t :: Symbol) (o :: *) :: * where
        ResolveIOExtensionPointMethod "getExtensionByName" o = IOExtensionPointGetExtensionByNameMethodInfo
        ResolveIOExtensionPointMethod "getExtensions" o = IOExtensionPointGetExtensionsMethodInfo
        ResolveIOExtensionPointMethod "getRequiredType" o = IOExtensionPointGetRequiredTypeMethodInfo
        ResolveIOExtensionPointMethod "setRequiredType" o = IOExtensionPointSetRequiredTypeMethodInfo
        ResolveIOExtensionPointMethod l o = O.MethodResolutionFailed l o

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

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