{- |
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.StaticResource.StaticResource' is an opaque data structure and can only be accessed
using the following functions.
-}

module GI.Gio.Structs.StaticResource
    ( 

-- * Exported types
    StaticResource(..)                      ,
    newZeroStaticResource                   ,
    noStaticResource                        ,


 -- * Methods
-- ** fini #method:fini#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    StaticResourceFiniMethodInfo            ,
#endif
    staticResourceFini                      ,


-- ** getResource #method:getResource#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    StaticResourceGetResourceMethodInfo     ,
#endif
    staticResourceGetResource               ,


-- ** init #method:init#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    StaticResourceInitMethodInfo            ,
#endif
    staticResourceInit                      ,




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

newtype StaticResource = StaticResource (ManagedPtr StaticResource)
instance WrappedPtr StaticResource where
    wrappedPtrCalloc = callocBytes 40
    wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 40 >=> wrapPtr StaticResource)
    wrappedPtrFree = Just ptr_to_g_free

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

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


noStaticResource :: Maybe StaticResource
noStaticResource = Nothing


#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
instance O.HasAttributeList StaticResource
type instance O.AttributeList StaticResource = StaticResourceAttributeList
type StaticResourceAttributeList = ('[ ] :: [(Symbol, *)])
#endif

-- method StaticResource::fini
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "static_resource", argType = TInterface (Name {namespace = "Gio", name = "StaticResource"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "pointer to a static #GStaticResource", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_static_resource_fini" g_static_resource_fini :: 
    Ptr StaticResource ->                   -- static_resource : TInterface (Name {namespace = "Gio", name = "StaticResource"})
    IO ()

{- |
Finalized a GResource initialized by 'GI.Gio.Structs.StaticResource.staticResourceInit'.

This is normally used by code generated by
[glib-compile-resources][glib-compile-resources]
and is not typically used by other code.

@since 2.32
-}
staticResourceFini ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    StaticResource
    {- ^ /@staticResource@/: pointer to a static 'GI.Gio.Structs.StaticResource.StaticResource' -}
    -> m ()
staticResourceFini staticResource = liftIO $ do
    staticResource' <- unsafeManagedPtrGetPtr staticResource
    g_static_resource_fini staticResource'
    touchManagedPtr staticResource
    return ()

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data StaticResourceFiniMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo StaticResourceFiniMethodInfo StaticResource signature where
    overloadedMethod _ = staticResourceFini

#endif

-- method StaticResource::get_resource
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "static_resource", argType = TInterface (Name {namespace = "Gio", name = "StaticResource"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "pointer to a static #GStaticResource", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gio", name = "Resource"}))
-- throws : False
-- Skip return : False

foreign import ccall "g_static_resource_get_resource" g_static_resource_get_resource :: 
    Ptr StaticResource ->                   -- static_resource : TInterface (Name {namespace = "Gio", name = "StaticResource"})
    IO (Ptr Gio.Resource.Resource)

{- |
Gets the GResource that was registered by a call to 'GI.Gio.Structs.StaticResource.staticResourceInit'.

This is normally used by code generated by
[glib-compile-resources][glib-compile-resources]
and is not typically used by other code.

@since 2.32
-}
staticResourceGetResource ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    StaticResource
    {- ^ /@staticResource@/: pointer to a static 'GI.Gio.Structs.StaticResource.StaticResource' -}
    -> m Gio.Resource.Resource
    {- ^ __Returns:__ a 'GI.Gio.Structs.Resource.Resource' -}
staticResourceGetResource staticResource = liftIO $ do
    staticResource' <- unsafeManagedPtrGetPtr staticResource
    result <- g_static_resource_get_resource staticResource'
    checkUnexpectedReturnNULL "staticResourceGetResource" result
    result' <- (newBoxed Gio.Resource.Resource) result
    touchManagedPtr staticResource
    return result'

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data StaticResourceGetResourceMethodInfo
instance (signature ~ (m Gio.Resource.Resource), MonadIO m) => O.MethodInfo StaticResourceGetResourceMethodInfo StaticResource signature where
    overloadedMethod _ = staticResourceGetResource

#endif

-- method StaticResource::init
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "static_resource", argType = TInterface (Name {namespace = "Gio", name = "StaticResource"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "pointer to a static #GStaticResource", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_static_resource_init" g_static_resource_init :: 
    Ptr StaticResource ->                   -- static_resource : TInterface (Name {namespace = "Gio", name = "StaticResource"})
    IO ()

{- |
Initializes a GResource from static data using a
GStaticResource.

This is normally used by code generated by
[glib-compile-resources][glib-compile-resources]
and is not typically used by other code.

@since 2.32
-}
staticResourceInit ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    StaticResource
    {- ^ /@staticResource@/: pointer to a static 'GI.Gio.Structs.StaticResource.StaticResource' -}
    -> m ()
staticResourceInit staticResource = liftIO $ do
    staticResource' <- unsafeManagedPtrGetPtr staticResource
    g_static_resource_init staticResource'
    touchManagedPtr staticResource
    return ()

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data StaticResourceInitMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo StaticResourceInitMethodInfo StaticResource signature where
    overloadedMethod _ = staticResourceInit

#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
type family ResolveStaticResourceMethod (t :: Symbol) (o :: *) :: * where
    ResolveStaticResourceMethod "fini" o = StaticResourceFiniMethodInfo
    ResolveStaticResourceMethod "init" o = StaticResourceInitMethodInfo
    ResolveStaticResourceMethod "getResource" o = StaticResourceGetResourceMethodInfo
    ResolveStaticResourceMethod l o = O.MethodResolutionFailed l o

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

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