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

module GI.GObject.Interfaces.TypePlugin
    ( 

-- * Exported types
    TypePlugin(..)                          ,
    noTypePlugin                            ,
    TypePluginK                             ,


 -- * Methods
-- ** typePluginCompleteInterfaceInfo
    typePluginCompleteInterfaceInfo         ,


-- ** typePluginCompleteTypeInfo
    typePluginCompleteTypeInfo              ,


-- ** typePluginUnuse
    typePluginUnuse                         ,


-- ** typePluginUse
    typePluginUse                           ,




    ) where

import Prelude ()
import Data.GI.Base.ShortPrelude

import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map

import GI.GObject.Types
import GI.GObject.Callbacks

-- interface TypePlugin 

newtype TypePlugin = TypePlugin (ForeignPtr TypePlugin)
noTypePlugin :: Maybe TypePlugin
noTypePlugin = Nothing

type instance AttributeList TypePlugin = TypePluginAttributeList
type TypePluginAttributeList = ('[ ] :: [(Symbol, *)])

type instance SignalList TypePlugin = TypePluginSignalList
type TypePluginSignalList = ('[ ] :: [(Symbol, *)])

class ForeignPtrNewtype a => TypePluginK a
instance (ForeignPtrNewtype o, IsDescendantOf TypePlugin o) => TypePluginK o
type instance ParentTypes TypePlugin = TypePluginParentTypes
type TypePluginParentTypes = '[]

-- method TypePlugin::complete_interface_info
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GObject" "TypePlugin", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "instance_type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "interface_type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "info", argType = TInterface "GObject" "InterfaceInfo", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GObject" "TypePlugin", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "instance_type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "interface_type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "info", argType = TInterface "GObject" "InterfaceInfo", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_type_plugin_complete_interface_info" g_type_plugin_complete_interface_info :: 
    Ptr TypePlugin ->                       -- _obj : TInterface "GObject" "TypePlugin"
    CGType ->                               -- instance_type : TBasicType TGType
    CGType ->                               -- interface_type : TBasicType TGType
    Ptr InterfaceInfo ->                    -- info : TInterface "GObject" "InterfaceInfo"
    IO ()


typePluginCompleteInterfaceInfo ::
    (MonadIO m, TypePluginK a) =>
    a ->                                    -- _obj
    GType ->                                -- instance_type
    GType ->                                -- interface_type
    InterfaceInfo ->                        -- info
    m ()
typePluginCompleteInterfaceInfo _obj instance_type interface_type info = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let instance_type' = gtypeToCGType instance_type
    let interface_type' = gtypeToCGType interface_type
    let info' = unsafeManagedPtrGetPtr info
    g_type_plugin_complete_interface_info _obj' instance_type' interface_type' info'
    touchManagedPtr _obj
    touchManagedPtr info
    return ()

-- method TypePlugin::complete_type_info
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GObject" "TypePlugin", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "g_type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "info", argType = TInterface "GObject" "TypeInfo", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "value_table", argType = TInterface "GObject" "TypeValueTable", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GObject" "TypePlugin", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "g_type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "info", argType = TInterface "GObject" "TypeInfo", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "value_table", argType = TInterface "GObject" "TypeValueTable", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_type_plugin_complete_type_info" g_type_plugin_complete_type_info :: 
    Ptr TypePlugin ->                       -- _obj : TInterface "GObject" "TypePlugin"
    CGType ->                               -- g_type : TBasicType TGType
    Ptr TypeInfo ->                         -- info : TInterface "GObject" "TypeInfo"
    Ptr TypeValueTable ->                   -- value_table : TInterface "GObject" "TypeValueTable"
    IO ()


typePluginCompleteTypeInfo ::
    (MonadIO m, TypePluginK a) =>
    a ->                                    -- _obj
    GType ->                                -- g_type
    TypeInfo ->                             -- info
    TypeValueTable ->                       -- value_table
    m ()
typePluginCompleteTypeInfo _obj g_type info value_table = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let g_type' = gtypeToCGType g_type
    let info' = unsafeManagedPtrGetPtr info
    let value_table' = unsafeManagedPtrGetPtr value_table
    g_type_plugin_complete_type_info _obj' g_type' info' value_table'
    touchManagedPtr _obj
    touchManagedPtr info
    touchManagedPtr value_table
    return ()

-- method TypePlugin::unuse
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GObject" "TypePlugin", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GObject" "TypePlugin", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_type_plugin_unuse" g_type_plugin_unuse :: 
    Ptr TypePlugin ->                       -- _obj : TInterface "GObject" "TypePlugin"
    IO ()


typePluginUnuse ::
    (MonadIO m, TypePluginK a) =>
    a ->                                    -- _obj
    m ()
typePluginUnuse _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    g_type_plugin_unuse _obj'
    touchManagedPtr _obj
    return ()

-- method TypePlugin::use
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GObject" "TypePlugin", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GObject" "TypePlugin", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_type_plugin_use" g_type_plugin_use :: 
    Ptr TypePlugin ->                       -- _obj : TInterface "GObject" "TypePlugin"
    IO ()


typePluginUse ::
    (MonadIO m, TypePluginK a) =>
    a ->                                    -- _obj
    m ()
typePluginUse _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    g_type_plugin_use _obj'
    touchManagedPtr _obj
    return ()