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

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

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !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.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.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 {-# 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) => OL.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