gi-gio-2.0.20: GI/Gio/Interfaces/AsyncInitable.hs
{- |
Copyright : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License : LGPL-2.1
Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc)
This is the asynchronous version of 'GI.Gio.Interfaces.Initable.Initable'; it behaves the same
in all ways except that initialization is asynchronous. For more details
see the descriptions on 'GI.Gio.Interfaces.Initable.Initable'.
A class may implement both the 'GI.Gio.Interfaces.Initable.Initable' and 'GI.Gio.Interfaces.AsyncInitable.AsyncInitable' interfaces.
Users of objects implementing this are not intended to use the interface
method directly; instead it will be used automatically in various ways.
For C applications you generally just call @/g_async_initable_new_async()/@
directly, or indirectly via a @/foo_thing_new_async()/@ wrapper. This will call
'GI.Gio.Interfaces.AsyncInitable.asyncInitableInitAsync' under the cover, calling back with 'Nothing' and
a set @/GError/@ on failure.
A typical implementation might look something like this:
=== /C code/
>
>enum {
> NOT_INITIALIZED,
> INITIALIZING,
> INITIALIZED
>};
>
>static void
>_foo_ready_cb (Foo *self)
>{
> GList *l;
>
> self->priv->state = INITIALIZED;
>
> for (l = self->priv->init_results; l != NULL; l = l->next)
> {
> GTask *task = l->data;
>
> if (self->priv->success)
> g_task_return_boolean (task, TRUE);
> else
> g_task_return_new_error (task, ...);
> g_object_unref (task);
> }
>
> g_list_free (self->priv->init_results);
> self->priv->init_results = NULL;
>}
>
>static void
>foo_init_async (GAsyncInitable *initable,
> int io_priority,
> GCancellable *cancellable,
> GAsyncReadyCallback callback,
> gpointer user_data)
>{
> Foo *self = FOO (initable);
> GTask *task;
>
> task = g_task_new (initable, cancellable, callback, user_data);
>
> switch (self->priv->state)
> {
> case NOT_INITIALIZED:
> _foo_get_ready (self);
> self->priv->init_results = g_list_append (self->priv->init_results,
> task);
> self->priv->state = INITIALIZING;
> break;
> case INITIALIZING:
> self->priv->init_results = g_list_append (self->priv->init_results,
> task);
> break;
> case INITIALIZED:
> if (!self->priv->success)
> g_task_return_new_error (task, ...);
> else
> g_task_return_boolean (task, TRUE);
> g_object_unref (task);
> break;
> }
>}
>
>static gboolean
>foo_init_finish (GAsyncInitable *initable,
> GAsyncResult *result,
> GError **error)
>{
> g_return_val_if_fail (g_task_is_valid (result, initable), FALSE);
>
> return g_task_propagate_boolean (G_TASK (result), error);
>}
>
>static void
>foo_async_initable_iface_init (gpointer g_iface,
> gpointer data)
>{
> GAsyncInitableIface *iface = g_iface;
>
> iface->init_async = foo_init_async;
> iface->init_finish = foo_init_finish;
>}
/Since: 2.22/
-}
#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
&& !defined(__HADDOCK_VERSION__))
module GI.Gio.Interfaces.AsyncInitable
(
-- * Exported types
AsyncInitable(..) ,
noAsyncInitable ,
IsAsyncInitable ,
toAsyncInitable ,
-- * Methods
-- ** initAsync #method:initAsync#
#if ENABLE_OVERLOADING
AsyncInitableInitAsyncMethodInfo ,
#endif
asyncInitableInitAsync ,
-- ** initFinish #method:initFinish#
#if ENABLE_OVERLOADING
AsyncInitableInitFinishMethodInfo ,
#endif
asyncInitableInitFinish ,
-- ** newFinish #method:newFinish#
#if ENABLE_OVERLOADING
AsyncInitableNewFinishMethodInfo ,
#endif
asyncInitableNewFinish ,
-- ** newvAsync #method:newvAsync#
asyncInitableNewvAsync ,
) 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 qualified GI.GObject.Objects.Object as GObject.Object
import qualified GI.GObject.Structs.Parameter as GObject.Parameter
import qualified GI.Gio.Callbacks as Gio.Callbacks
import {-# SOURCE #-} qualified GI.Gio.Interfaces.AsyncResult as Gio.AsyncResult
import {-# SOURCE #-} qualified GI.Gio.Objects.Cancellable as Gio.Cancellable
-- interface AsyncInitable
-- | Memory-managed wrapper type.
newtype AsyncInitable = AsyncInitable (ManagedPtr AsyncInitable)
-- | A convenience alias for `Nothing` :: `Maybe` `AsyncInitable`.
noAsyncInitable :: Maybe AsyncInitable
noAsyncInitable = Nothing
#if ENABLE_OVERLOADING
type instance O.SignalList AsyncInitable = AsyncInitableSignalList
type AsyncInitableSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])
#endif
foreign import ccall "g_async_initable_get_type"
c_g_async_initable_get_type :: IO GType
instance GObject AsyncInitable where
gobjectType = c_g_async_initable_get_type
-- | Type class for types which can be safely cast to `AsyncInitable`, for instance with `toAsyncInitable`.
class (GObject o, O.IsDescendantOf AsyncInitable o) => IsAsyncInitable o
instance (GObject o, O.IsDescendantOf AsyncInitable o) => IsAsyncInitable o
instance O.HasParentTypes AsyncInitable
type instance O.ParentTypes AsyncInitable = '[GObject.Object.Object]
-- | Cast to `AsyncInitable`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toAsyncInitable :: (MonadIO m, IsAsyncInitable o) => o -> m AsyncInitable
toAsyncInitable = liftIO . unsafeCastTo AsyncInitable
#if ENABLE_OVERLOADING
instance O.HasAttributeList AsyncInitable
type instance O.AttributeList AsyncInitable = AsyncInitableAttributeList
type AsyncInitableAttributeList = ('[ ] :: [(Symbol, *)])
#endif
#if ENABLE_OVERLOADING
#endif
#if ENABLE_OVERLOADING
type family ResolveAsyncInitableMethod (t :: Symbol) (o :: *) :: * where
ResolveAsyncInitableMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
ResolveAsyncInitableMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
ResolveAsyncInitableMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
ResolveAsyncInitableMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
ResolveAsyncInitableMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
ResolveAsyncInitableMethod "initAsync" o = AsyncInitableInitAsyncMethodInfo
ResolveAsyncInitableMethod "initFinish" o = AsyncInitableInitFinishMethodInfo
ResolveAsyncInitableMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
ResolveAsyncInitableMethod "newFinish" o = AsyncInitableNewFinishMethodInfo
ResolveAsyncInitableMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
ResolveAsyncInitableMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
ResolveAsyncInitableMethod "ref" o = GObject.Object.ObjectRefMethodInfo
ResolveAsyncInitableMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
ResolveAsyncInitableMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
ResolveAsyncInitableMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
ResolveAsyncInitableMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
ResolveAsyncInitableMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
ResolveAsyncInitableMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
ResolveAsyncInitableMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
ResolveAsyncInitableMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
ResolveAsyncInitableMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
ResolveAsyncInitableMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
ResolveAsyncInitableMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
ResolveAsyncInitableMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
ResolveAsyncInitableMethod l o = O.MethodResolutionFailed l o
instance (info ~ ResolveAsyncInitableMethod t AsyncInitable, O.MethodInfo info AsyncInitable p) => OL.IsLabel t (AsyncInitable -> 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
-- method AsyncInitable::init_async
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "initable", argType = TInterface (Name {namespace = "Gio", name = "AsyncInitable"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GAsyncInitable.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "io_priority", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the [I/O priority][io-priority] of the operation", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "cancellable", argType = TInterface (Name {namespace = "Gio", name = "Cancellable"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "optional #GCancellable object, %NULL to ignore.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "callback", argType = TInterface (Name {namespace = "Gio", name = "AsyncReadyCallback"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "a #GAsyncReadyCallback to call when the request is satisfied", sinceVersion = Nothing}, argScope = ScopeTypeAsync, argClosure = 4, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the data to pass to callback function", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False
foreign import ccall "g_async_initable_init_async" g_async_initable_init_async ::
Ptr AsyncInitable -> -- initable : TInterface (Name {namespace = "Gio", name = "AsyncInitable"})
Int32 -> -- io_priority : TBasicType TInt
Ptr Gio.Cancellable.Cancellable -> -- cancellable : TInterface (Name {namespace = "Gio", name = "Cancellable"})
FunPtr Gio.Callbacks.C_AsyncReadyCallback -> -- callback : TInterface (Name {namespace = "Gio", name = "AsyncReadyCallback"})
Ptr () -> -- user_data : TBasicType TPtr
IO ()
{- |
Starts asynchronous initialization of the object implementing the
interface. This must be done before any real use of the object after
initial construction. If the object also implements 'GI.Gio.Interfaces.Initable.Initable' you can
optionally call 'GI.Gio.Interfaces.Initable.initableInit' instead.
This method is intended for language bindings. If writing in C,
@/g_async_initable_new_async()/@ should typically be used instead.
When the initialization is finished, /@callback@/ will be called. You can
then call 'GI.Gio.Interfaces.AsyncInitable.asyncInitableInitFinish' to get the result of the
initialization.
Implementations may also support cancellation. If /@cancellable@/ is not
'Nothing', then initialization can be cancelled by triggering the cancellable
object from another thread. If the operation was cancelled, the error
'GI.Gio.Enums.IOErrorEnumCancelled' will be returned. If /@cancellable@/ is not 'Nothing', and
the object doesn\'t support cancellable initialization, the error
'GI.Gio.Enums.IOErrorEnumNotSupported' will be returned.
As with 'GI.Gio.Interfaces.Initable.Initable', if the object is not initialized, or initialization
returns with an error, then all operations on the object except
'GI.GObject.Objects.Object.objectRef' and 'GI.GObject.Objects.Object.objectUnref' are considered to be invalid, and
have undefined behaviour. They will often fail with @/g_critical()/@ or
@/g_warning()/@, but this must not be relied on.
Callers should not assume that a class which implements 'GI.Gio.Interfaces.AsyncInitable.AsyncInitable' can
be initialized multiple times; for more information, see 'GI.Gio.Interfaces.Initable.initableInit'.
If a class explicitly supports being initialized multiple times,
implementation requires yielding all subsequent calls to @/init_async()/@ on the
results of the first call.
For classes that also support the 'GI.Gio.Interfaces.Initable.Initable' interface, the default
implementation of this method will run the 'GI.Gio.Interfaces.Initable.initableInit' function
in a thread, so if you want to support asynchronous initialization via
threads, just implement the 'GI.Gio.Interfaces.AsyncInitable.AsyncInitable' interface without overriding
any interface methods.
/Since: 2.22/
-}
asyncInitableInitAsync ::
(B.CallStack.HasCallStack, MonadIO m, IsAsyncInitable a, Gio.Cancellable.IsCancellable b) =>
a
{- ^ /@initable@/: a 'GI.Gio.Interfaces.AsyncInitable.AsyncInitable'. -}
-> Int32
{- ^ /@ioPriority@/: the [I\/O priority][io-priority] of the operation -}
-> Maybe (b)
{- ^ /@cancellable@/: optional 'GI.Gio.Objects.Cancellable.Cancellable' object, 'Nothing' to ignore. -}
-> Maybe (Gio.Callbacks.AsyncReadyCallback)
{- ^ /@callback@/: a 'GI.Gio.Callbacks.AsyncReadyCallback' to call when the request is satisfied -}
-> m ()
asyncInitableInitAsync initable ioPriority cancellable callback = liftIO $ do
initable' <- unsafeManagedPtrCastPtr initable
maybeCancellable <- case cancellable of
Nothing -> return nullPtr
Just jCancellable -> do
jCancellable' <- unsafeManagedPtrCastPtr jCancellable
return jCancellable'
maybeCallback <- case callback of
Nothing -> return (castPtrToFunPtr nullPtr)
Just jCallback -> do
ptrcallback <- callocMem :: IO (Ptr (FunPtr Gio.Callbacks.C_AsyncReadyCallback))
jCallback' <- Gio.Callbacks.mk_AsyncReadyCallback (Gio.Callbacks.wrap_AsyncReadyCallback (Just ptrcallback) (Gio.Callbacks.drop_closures_AsyncReadyCallback jCallback))
poke ptrcallback jCallback'
return jCallback'
let userData = nullPtr
g_async_initable_init_async initable' ioPriority maybeCancellable maybeCallback userData
touchManagedPtr initable
whenJust cancellable touchManagedPtr
return ()
#if ENABLE_OVERLOADING
data AsyncInitableInitAsyncMethodInfo
instance (signature ~ (Int32 -> Maybe (b) -> Maybe (Gio.Callbacks.AsyncReadyCallback) -> m ()), MonadIO m, IsAsyncInitable a, Gio.Cancellable.IsCancellable b) => O.MethodInfo AsyncInitableInitAsyncMethodInfo a signature where
overloadedMethod _ = asyncInitableInitAsync
#endif
-- method AsyncInitable::init_finish
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "initable", argType = TInterface (Name {namespace = "Gio", name = "AsyncInitable"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GAsyncInitable.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "res", argType = TInterface (Name {namespace = "Gio", name = "AsyncResult"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GAsyncResult.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : True
-- Skip return : False
foreign import ccall "g_async_initable_init_finish" g_async_initable_init_finish ::
Ptr AsyncInitable -> -- initable : TInterface (Name {namespace = "Gio", name = "AsyncInitable"})
Ptr Gio.AsyncResult.AsyncResult -> -- res : TInterface (Name {namespace = "Gio", name = "AsyncResult"})
Ptr (Ptr GError) -> -- error
IO CInt
{- |
Finishes asynchronous initialization and returns the result.
See 'GI.Gio.Interfaces.AsyncInitable.asyncInitableInitAsync'.
/Since: 2.22/
-}
asyncInitableInitFinish ::
(B.CallStack.HasCallStack, MonadIO m, IsAsyncInitable a, Gio.AsyncResult.IsAsyncResult b) =>
a
{- ^ /@initable@/: a 'GI.Gio.Interfaces.AsyncInitable.AsyncInitable'. -}
-> b
{- ^ /@res@/: a 'GI.Gio.Interfaces.AsyncResult.AsyncResult'. -}
-> m ()
{- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
asyncInitableInitFinish initable res = liftIO $ do
initable' <- unsafeManagedPtrCastPtr initable
res' <- unsafeManagedPtrCastPtr res
onException (do
_ <- propagateGError $ g_async_initable_init_finish initable' res'
touchManagedPtr initable
touchManagedPtr res
return ()
) (do
return ()
)
#if ENABLE_OVERLOADING
data AsyncInitableInitFinishMethodInfo
instance (signature ~ (b -> m ()), MonadIO m, IsAsyncInitable a, Gio.AsyncResult.IsAsyncResult b) => O.MethodInfo AsyncInitableInitFinishMethodInfo a signature where
overloadedMethod _ = asyncInitableInitFinish
#endif
-- method AsyncInitable::new_finish
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "initable", argType = TInterface (Name {namespace = "Gio", name = "AsyncInitable"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the #GAsyncInitable from the callback", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "res", argType = TInterface (Name {namespace = "Gio", name = "AsyncResult"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the #GAsyncResult from the callback", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "GObject", name = "Object"}))
-- throws : True
-- Skip return : False
foreign import ccall "g_async_initable_new_finish" g_async_initable_new_finish ::
Ptr AsyncInitable -> -- initable : TInterface (Name {namespace = "Gio", name = "AsyncInitable"})
Ptr Gio.AsyncResult.AsyncResult -> -- res : TInterface (Name {namespace = "Gio", name = "AsyncResult"})
Ptr (Ptr GError) -> -- error
IO (Ptr GObject.Object.Object)
{- |
Finishes the async construction for the various g_async_initable_new
calls, returning the created object or 'Nothing' on error.
/Since: 2.22/
-}
asyncInitableNewFinish ::
(B.CallStack.HasCallStack, MonadIO m, IsAsyncInitable a, Gio.AsyncResult.IsAsyncResult b) =>
a
{- ^ /@initable@/: the 'GI.Gio.Interfaces.AsyncInitable.AsyncInitable' from the callback -}
-> b
{- ^ /@res@/: the 'GI.Gio.Interfaces.AsyncResult.AsyncResult' from the callback -}
-> m GObject.Object.Object
{- ^ __Returns:__ a newly created 'GI.GObject.Objects.Object.Object',
or 'Nothing' on error. Free with 'GI.GObject.Objects.Object.objectUnref'. /(Can throw 'Data.GI.Base.GError.GError')/ -}
asyncInitableNewFinish initable res = liftIO $ do
initable' <- unsafeManagedPtrCastPtr initable
res' <- unsafeManagedPtrCastPtr res
onException (do
result <- propagateGError $ g_async_initable_new_finish initable' res'
checkUnexpectedReturnNULL "asyncInitableNewFinish" result
result' <- (wrapObject GObject.Object.Object) result
touchManagedPtr initable
touchManagedPtr res
return result'
) (do
return ()
)
#if ENABLE_OVERLOADING
data AsyncInitableNewFinishMethodInfo
instance (signature ~ (b -> m GObject.Object.Object), MonadIO m, IsAsyncInitable a, Gio.AsyncResult.IsAsyncResult b) => O.MethodInfo AsyncInitableNewFinishMethodInfo a signature where
overloadedMethod _ = asyncInitableNewFinish
#endif
-- method AsyncInitable::newv_async
-- method type : MemberFunction
-- Args : [Arg {argCName = "object_type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GType supporting #GAsyncInitable.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "n_parameters", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the number of parameters in @parameters", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "parameters", argType = TInterface (Name {namespace = "GObject", name = "Parameter"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the parameters to use to construct the object", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "io_priority", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the [I/O priority][io-priority] of the operation", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "cancellable", argType = TInterface (Name {namespace = "Gio", name = "Cancellable"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "optional #GCancellable object, %NULL to ignore.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "callback", argType = TInterface (Name {namespace = "Gio", name = "AsyncReadyCallback"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "a #GAsyncReadyCallback to call when the initialization is\n finished", sinceVersion = Nothing}, argScope = ScopeTypeAsync, argClosure = 6, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the data to pass to callback function", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False
foreign import ccall "g_async_initable_newv_async" g_async_initable_newv_async ::
CGType -> -- object_type : TBasicType TGType
Word32 -> -- n_parameters : TBasicType TUInt
Ptr GObject.Parameter.Parameter -> -- parameters : TInterface (Name {namespace = "GObject", name = "Parameter"})
Int32 -> -- io_priority : TBasicType TInt
Ptr Gio.Cancellable.Cancellable -> -- cancellable : TInterface (Name {namespace = "Gio", name = "Cancellable"})
FunPtr Gio.Callbacks.C_AsyncReadyCallback -> -- callback : TInterface (Name {namespace = "Gio", name = "AsyncReadyCallback"})
Ptr () -> -- user_data : TBasicType TPtr
IO ()
{-# DEPRECATED asyncInitableNewvAsync ["(Since version 2.54)","Use @/g_object_new_with_properties()/@ and","'GI.Gio.Interfaces.AsyncInitable.asyncInitableInitAsync' instead. See 'GI.GObject.Structs.Parameter.Parameter' for more information."] #-}
{- |
Helper function for constructing 'GI.Gio.Interfaces.AsyncInitable.AsyncInitable' object. This is
similar to 'GI.GObject.Objects.Object.objectNewv' but also initializes the object asynchronously.
When the initialization is finished, /@callback@/ will be called. You can
then call 'GI.Gio.Interfaces.AsyncInitable.asyncInitableNewFinish' to get the new object and check
for any errors.
/Since: 2.22/
-}
asyncInitableNewvAsync ::
(B.CallStack.HasCallStack, MonadIO m, Gio.Cancellable.IsCancellable a) =>
GType
{- ^ /@objectType@/: a 'GType' supporting 'GI.Gio.Interfaces.AsyncInitable.AsyncInitable'. -}
-> Word32
{- ^ /@nParameters@/: the number of parameters in /@parameters@/ -}
-> GObject.Parameter.Parameter
{- ^ /@parameters@/: the parameters to use to construct the object -}
-> Int32
{- ^ /@ioPriority@/: the [I\/O priority][io-priority] of the operation -}
-> Maybe (a)
{- ^ /@cancellable@/: optional 'GI.Gio.Objects.Cancellable.Cancellable' object, 'Nothing' to ignore. -}
-> Maybe (Gio.Callbacks.AsyncReadyCallback)
{- ^ /@callback@/: a 'GI.Gio.Callbacks.AsyncReadyCallback' to call when the initialization is
finished -}
-> m ()
asyncInitableNewvAsync objectType nParameters parameters ioPriority cancellable callback = liftIO $ do
let objectType' = gtypeToCGType objectType
parameters' <- unsafeManagedPtrGetPtr parameters
maybeCancellable <- case cancellable of
Nothing -> return nullPtr
Just jCancellable -> do
jCancellable' <- unsafeManagedPtrCastPtr jCancellable
return jCancellable'
maybeCallback <- case callback of
Nothing -> return (castPtrToFunPtr nullPtr)
Just jCallback -> do
ptrcallback <- callocMem :: IO (Ptr (FunPtr Gio.Callbacks.C_AsyncReadyCallback))
jCallback' <- Gio.Callbacks.mk_AsyncReadyCallback (Gio.Callbacks.wrap_AsyncReadyCallback (Just ptrcallback) (Gio.Callbacks.drop_closures_AsyncReadyCallback jCallback))
poke ptrcallback jCallback'
return jCallback'
let userData = nullPtr
g_async_initable_newv_async objectType' nParameters parameters' ioPriority maybeCancellable maybeCallback userData
touchManagedPtr parameters
whenJust cancellable touchManagedPtr
return ()
#if ENABLE_OVERLOADING
#endif