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

    GFileIOStream provides io streams that both read and write to the same
    file handle.

    GFileIOStream implements 'GI.Gio.Interfaces.Seekable.Seekable', which allows the io
    stream to jump to arbitrary positions in the file and to truncate
    the file, provided the filesystem of the file supports these
    operations.

    To find the position of a file io stream, use
    'GI.Gio.Interfaces.Seekable.seekableTell'.

    To find out if a file io stream supports seeking, use 'GI.Gio.Interfaces.Seekable.seekableCanSeek'.
    To position a file io stream, use 'GI.Gio.Interfaces.Seekable.seekableSeek'.
    To find out if a file io stream supports truncating, use
    'GI.Gio.Interfaces.Seekable.seekableCanTruncate'. To truncate a file io
    stream, use 'GI.Gio.Interfaces.Seekable.seekableTruncate'.

    The default implementation of all the 'GI.Gio.Objects.FileIOStream.FileIOStream' operations
    and the implementation of 'GI.Gio.Interfaces.Seekable.Seekable' just call into the same operations
    on the output stream.

    /Since: 2.22/
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Objects.FileIOStream
        (

    -- * Exported types
        FileIOStream(..)                        ,
        IsFileIOStream                          ,
        toFileIOStream                          ,
        noFileIOStream                          ,

     -- * Methods
    -- ** getEtag #method:getEtag#

    #if ENABLE_OVERLOADING
        FileIOStreamGetEtagMethodInfo           ,
    #endif
        fileIOStreamGetEtag                     ,

    -- ** queryInfo #method:queryInfo#

    #if ENABLE_OVERLOADING
        FileIOStreamQueryInfoMethodInfo         ,
    #endif
        fileIOStreamQueryInfo                   ,

    -- ** queryInfoAsync #method:queryInfoAsync#

    #if ENABLE_OVERLOADING
        FileIOStreamQueryInfoAsyncMethodInfo    ,
    #endif
        fileIOStreamQueryInfoAsync              ,

    -- ** queryInfoFinish #method:queryInfoFinish#

    #if ENABLE_OVERLOADING
        FileIOStreamQueryInfoFinishMethodInfo   ,
    #endif
        fileIOStreamQueryInfoFinish             ,

        ) 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 qualified GI.GObject.Objects.Object as GObject.Object
    import qualified GI.Gio.Callbacks as Gio.Callbacks
    import {-# SOURCE #-} qualified GI.Gio.Interfaces.AsyncResult as Gio.AsyncResult
    import {-# SOURCE #-} qualified GI.Gio.Interfaces.Seekable as Gio.Seekable
    import {-# SOURCE #-} qualified GI.Gio.Objects.Cancellable as Gio.Cancellable
    import {-# SOURCE #-} qualified GI.Gio.Objects.FileInfo as Gio.FileInfo
    import {-# SOURCE #-} qualified GI.Gio.Objects.IOStream as Gio.IOStream

    -- | Memory-managed wrapper type.
    newtype FileIOStream = FileIOStream (ManagedPtr FileIOStream)
    foreign import ccall "g_file_io_stream_get_type"
        c_g_file_io_stream_get_type :: IO GType

    instance GObject FileIOStream where
        gobjectType _ = c_g_file_io_stream_get_type

    -- | Type class for types which can be safely cast to `FileIOStream`, for instance with `toFileIOStream`.
    class GObject o => IsFileIOStream o
    #if MIN_VERSION_base(4,9,0)
    instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError FileIOStream a) =>
        IsFileIOStream a
    #endif
    instance IsFileIOStream FileIOStream
    instance Gio.IOStream.IsIOStream FileIOStream
    instance GObject.Object.IsObject FileIOStream
    instance Gio.Seekable.IsSeekable FileIOStream

    -- | Cast to `FileIOStream`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
    toFileIOStream :: (MonadIO m, IsFileIOStream o) => o -> m FileIOStream
    toFileIOStream = liftIO . unsafeCastTo FileIOStream

    -- | A convenience alias for `Nothing` :: `Maybe` `FileIOStream`.
    noFileIOStream :: Maybe FileIOStream
    noFileIOStream = Nothing

    #if ENABLE_OVERLOADING
    type family ResolveFileIOStreamMethod (t :: Symbol) (o :: *) :: * where
        ResolveFileIOStreamMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
        ResolveFileIOStreamMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
        ResolveFileIOStreamMethod "canSeek" o = Gio.Seekable.SeekableCanSeekMethodInfo
        ResolveFileIOStreamMethod "canTruncate" o = Gio.Seekable.SeekableCanTruncateMethodInfo
        ResolveFileIOStreamMethod "clearPending" o = Gio.IOStream.IOStreamClearPendingMethodInfo
        ResolveFileIOStreamMethod "close" o = Gio.IOStream.IOStreamCloseMethodInfo
        ResolveFileIOStreamMethod "closeAsync" o = Gio.IOStream.IOStreamCloseAsyncMethodInfo
        ResolveFileIOStreamMethod "closeFinish" o = Gio.IOStream.IOStreamCloseFinishMethodInfo
        ResolveFileIOStreamMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
        ResolveFileIOStreamMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
        ResolveFileIOStreamMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
        ResolveFileIOStreamMethod "hasPending" o = Gio.IOStream.IOStreamHasPendingMethodInfo
        ResolveFileIOStreamMethod "isClosed" o = Gio.IOStream.IOStreamIsClosedMethodInfo
        ResolveFileIOStreamMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
        ResolveFileIOStreamMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
        ResolveFileIOStreamMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
        ResolveFileIOStreamMethod "queryInfo" o = FileIOStreamQueryInfoMethodInfo
        ResolveFileIOStreamMethod "queryInfoAsync" o = FileIOStreamQueryInfoAsyncMethodInfo
        ResolveFileIOStreamMethod "queryInfoFinish" o = FileIOStreamQueryInfoFinishMethodInfo
        ResolveFileIOStreamMethod "ref" o = GObject.Object.ObjectRefMethodInfo
        ResolveFileIOStreamMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
        ResolveFileIOStreamMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
        ResolveFileIOStreamMethod "seek" o = Gio.Seekable.SeekableSeekMethodInfo
        ResolveFileIOStreamMethod "spliceAsync" o = Gio.IOStream.IOStreamSpliceAsyncMethodInfo
        ResolveFileIOStreamMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
        ResolveFileIOStreamMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
        ResolveFileIOStreamMethod "tell" o = Gio.Seekable.SeekableTellMethodInfo
        ResolveFileIOStreamMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
        ResolveFileIOStreamMethod "truncate" o = Gio.Seekable.SeekableTruncateMethodInfo
        ResolveFileIOStreamMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
        ResolveFileIOStreamMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
        ResolveFileIOStreamMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
        ResolveFileIOStreamMethod "getEtag" o = FileIOStreamGetEtagMethodInfo
        ResolveFileIOStreamMethod "getInputStream" o = Gio.IOStream.IOStreamGetInputStreamMethodInfo
        ResolveFileIOStreamMethod "getOutputStream" o = Gio.IOStream.IOStreamGetOutputStreamMethodInfo
        ResolveFileIOStreamMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
        ResolveFileIOStreamMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
        ResolveFileIOStreamMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
        ResolveFileIOStreamMethod "setPending" o = Gio.IOStream.IOStreamSetPendingMethodInfo
        ResolveFileIOStreamMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
        ResolveFileIOStreamMethod l o = O.MethodResolutionFailed l o

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

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

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList FileIOStream
    type instance O.AttributeList FileIOStream = FileIOStreamAttributeList
    type FileIOStreamAttributeList = ('[ '("closed", Gio.IOStream.IOStreamClosedPropertyInfo), '("inputStream", Gio.IOStream.IOStreamInputStreamPropertyInfo), '("outputStream", Gio.IOStream.IOStreamOutputStreamPropertyInfo)] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    #endif

    #if ENABLE_OVERLOADING
    type instance O.SignalList FileIOStream = FileIOStreamSignalList
    type FileIOStreamSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

    #endif

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

    foreign import ccall "g_file_io_stream_get_etag" g_file_io_stream_get_etag ::
        Ptr FileIOStream ->                     -- stream : TInterface (Name {namespace = "Gio", name = "FileIOStream"})
        IO CString

    {- |
    Gets the entity tag for the file when it has been written.
    This must be called after the stream has been written
    and closed, as the etag can change while writing.

    /Since: 2.22/
    -}
    fileIOStreamGetEtag ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileIOStream a) =>
        a
        {- ^ /@stream@/: a 'GI.Gio.Objects.FileIOStream.FileIOStream'. -}
        -> m T.Text
        {- ^ __Returns:__ the entity tag for the stream. -}
    fileIOStreamGetEtag stream = liftIO $ do
        stream' <- unsafeManagedPtrCastPtr stream
        result <- g_file_io_stream_get_etag stream'
        checkUnexpectedReturnNULL "fileIOStreamGetEtag" result
        result' <- cstringToText result
        freeMem result
        touchManagedPtr stream
        return result'

    #if ENABLE_OVERLOADING
    data FileIOStreamGetEtagMethodInfo
    instance (signature ~ (m T.Text), MonadIO m, IsFileIOStream a) => O.MethodInfo FileIOStreamGetEtagMethodInfo a signature where
        overloadedMethod _ = fileIOStreamGetEtag

    #endif

    -- method FileIOStream::query_info
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "stream", argType = TInterface (Name {namespace = "Gio", name = "FileIOStream"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileIOStream.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "attributes", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a file attribute query string.", 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}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "FileInfo"}))
    -- throws : True
    -- Skip return : False

    foreign import ccall "g_file_io_stream_query_info" g_file_io_stream_query_info ::
        Ptr FileIOStream ->                     -- stream : TInterface (Name {namespace = "Gio", name = "FileIOStream"})
        CString ->                              -- attributes : TBasicType TUTF8
        Ptr Gio.Cancellable.Cancellable ->      -- cancellable : TInterface (Name {namespace = "Gio", name = "Cancellable"})
        Ptr (Ptr GError) ->                     -- error
        IO (Ptr Gio.FileInfo.FileInfo)

    {- |
    Queries a file io stream for the given /@attributes@/.
    This function blocks while querying the stream. For the asynchronous
    version of this function, see 'GI.Gio.Objects.FileIOStream.fileIOStreamQueryInfoAsync'.
    While the stream is blocked, the stream will set the pending flag
    internally, and any other operations on the stream will fail with
    'GI.Gio.Enums.IOErrorEnumPending'.

    Can fail if the stream was already closed (with /@error@/ being set to
    'GI.Gio.Enums.IOErrorEnumClosed'), the stream has pending operations (with /@error@/ being
    set to 'GI.Gio.Enums.IOErrorEnumPending'), or if querying info is not supported for
    the stream\'s interface (with /@error@/ being set to 'GI.Gio.Enums.IOErrorEnumNotSupported'). I
    all cases of failure, 'Nothing' will be returned.

    If /@cancellable@/ is not 'Nothing', then the operation can be cancelled by
    triggering the cancellable object from another thread. If the operation
    was cancelled, the error 'GI.Gio.Enums.IOErrorEnumCancelled' will be set, and 'Nothing' will
    be returned.

    /Since: 2.22/
    -}
    fileIOStreamQueryInfo ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileIOStream a, Gio.Cancellable.IsCancellable b) =>
        a
        {- ^ /@stream@/: a 'GI.Gio.Objects.FileIOStream.FileIOStream'. -}
        -> T.Text
        {- ^ /@attributes@/: a file attribute query string. -}
        -> Maybe (b)
        {- ^ /@cancellable@/: optional 'GI.Gio.Objects.Cancellable.Cancellable' object, 'Nothing' to ignore. -}
        -> m Gio.FileInfo.FileInfo
        {- ^ __Returns:__ a 'GI.Gio.Objects.FileInfo.FileInfo' for the /@stream@/, or 'Nothing' on error. /(Can throw 'Data.GI.Base.GError.GError')/ -}
    fileIOStreamQueryInfo stream attributes cancellable = liftIO $ do
        stream' <- unsafeManagedPtrCastPtr stream
        attributes' <- textToCString attributes
        maybeCancellable <- case cancellable of
            Nothing -> return nullPtr
            Just jCancellable -> do
                jCancellable' <- unsafeManagedPtrCastPtr jCancellable
                return jCancellable'
        onException (do
            result <- propagateGError $ g_file_io_stream_query_info stream' attributes' maybeCancellable
            checkUnexpectedReturnNULL "fileIOStreamQueryInfo" result
            result' <- (wrapObject Gio.FileInfo.FileInfo) result
            touchManagedPtr stream
            whenJust cancellable touchManagedPtr
            freeMem attributes'
            return result'
         ) (do
            freeMem attributes'
         )

    #if ENABLE_OVERLOADING
    data FileIOStreamQueryInfoMethodInfo
    instance (signature ~ (T.Text -> Maybe (b) -> m Gio.FileInfo.FileInfo), MonadIO m, IsFileIOStream a, Gio.Cancellable.IsCancellable b) => O.MethodInfo FileIOStreamQueryInfoMethodInfo a signature where
        overloadedMethod _ = fileIOStreamQueryInfo

    #endif

    -- method FileIOStream::query_info_async
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "stream", argType = TInterface (Name {namespace = "Gio", name = "FileIOStream"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileIOStream.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "attributes", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a file attribute query string.", 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][gio-GIOScheduler] of the request", 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 "callback to call when the request is satisfied", sinceVersion = Nothing}, argScope = ScopeTypeAsync, argClosure = 5, 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_file_io_stream_query_info_async" g_file_io_stream_query_info_async ::
        Ptr FileIOStream ->                     -- stream : TInterface (Name {namespace = "Gio", name = "FileIOStream"})
        CString ->                              -- attributes : TBasicType TUTF8
        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 ()

    {- |
    Asynchronously queries the /@stream@/ for a 'GI.Gio.Objects.FileInfo.FileInfo'. When completed,
    /@callback@/ will be called with a 'GI.Gio.Interfaces.AsyncResult.AsyncResult' which can be used to
    finish the operation with 'GI.Gio.Objects.FileIOStream.fileIOStreamQueryInfoFinish'.

    For the synchronous version of this function, see
    'GI.Gio.Objects.FileIOStream.fileIOStreamQueryInfo'.

    /Since: 2.22/
    -}
    fileIOStreamQueryInfoAsync ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileIOStream a, Gio.Cancellable.IsCancellable b) =>
        a
        {- ^ /@stream@/: a 'GI.Gio.Objects.FileIOStream.FileIOStream'. -}
        -> T.Text
        {- ^ /@attributes@/: a file attribute query string. -}
        -> Int32
        {- ^ /@ioPriority@/: the [I\/O priority][gio-GIOScheduler] of the request -}
        -> Maybe (b)
        {- ^ /@cancellable@/: optional 'GI.Gio.Objects.Cancellable.Cancellable' object, 'Nothing' to ignore. -}
        -> Maybe (Gio.Callbacks.AsyncReadyCallback)
        {- ^ /@callback@/: callback to call when the request is satisfied -}
        -> m ()
    fileIOStreamQueryInfoAsync stream attributes ioPriority cancellable callback = liftIO $ do
        stream' <- unsafeManagedPtrCastPtr stream
        attributes' <- textToCString attributes
        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_file_io_stream_query_info_async stream' attributes' ioPriority maybeCancellable maybeCallback userData
        touchManagedPtr stream
        whenJust cancellable touchManagedPtr
        freeMem attributes'
        return ()

    #if ENABLE_OVERLOADING
    data FileIOStreamQueryInfoAsyncMethodInfo
    instance (signature ~ (T.Text -> Int32 -> Maybe (b) -> Maybe (Gio.Callbacks.AsyncReadyCallback) -> m ()), MonadIO m, IsFileIOStream a, Gio.Cancellable.IsCancellable b) => O.MethodInfo FileIOStreamQueryInfoAsyncMethodInfo a signature where
        overloadedMethod _ = fileIOStreamQueryInfoAsync

    #endif

    -- method FileIOStream::query_info_finish
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "stream", argType = TInterface (Name {namespace = "Gio", name = "FileIOStream"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileIOStream.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "result", 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 (TInterface (Name {namespace = "Gio", name = "FileInfo"}))
    -- throws : True
    -- Skip return : False

    foreign import ccall "g_file_io_stream_query_info_finish" g_file_io_stream_query_info_finish ::
        Ptr FileIOStream ->                     -- stream : TInterface (Name {namespace = "Gio", name = "FileIOStream"})
        Ptr Gio.AsyncResult.AsyncResult ->      -- result : TInterface (Name {namespace = "Gio", name = "AsyncResult"})
        Ptr (Ptr GError) ->                     -- error
        IO (Ptr Gio.FileInfo.FileInfo)

    {- |
    Finalizes the asynchronous query started
    by 'GI.Gio.Objects.FileIOStream.fileIOStreamQueryInfoAsync'.

    /Since: 2.22/
    -}
    fileIOStreamQueryInfoFinish ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileIOStream a, Gio.AsyncResult.IsAsyncResult b) =>
        a
        {- ^ /@stream@/: a 'GI.Gio.Objects.FileIOStream.FileIOStream'. -}
        -> b
        {- ^ /@result@/: a 'GI.Gio.Interfaces.AsyncResult.AsyncResult'. -}
        -> m Gio.FileInfo.FileInfo
        {- ^ __Returns:__ A 'GI.Gio.Objects.FileInfo.FileInfo' for the finished query. /(Can throw 'Data.GI.Base.GError.GError')/ -}
    fileIOStreamQueryInfoFinish stream result_ = liftIO $ do
        stream' <- unsafeManagedPtrCastPtr stream
        result_' <- unsafeManagedPtrCastPtr result_
        onException (do
            result <- propagateGError $ g_file_io_stream_query_info_finish stream' result_'
            checkUnexpectedReturnNULL "fileIOStreamQueryInfoFinish" result
            result' <- (wrapObject Gio.FileInfo.FileInfo) result
            touchManagedPtr stream
            touchManagedPtr result_
            return result'
         ) (do
            return ()
         )

    #if ENABLE_OVERLOADING
    data FileIOStreamQueryInfoFinishMethodInfo
    instance (signature ~ (b -> m Gio.FileInfo.FileInfo), MonadIO m, IsFileIOStream a, Gio.AsyncResult.IsAsyncResult b) => O.MethodInfo FileIOStreamQueryInfoFinishMethodInfo a signature where
        overloadedMethod _ = fileIOStreamQueryInfoFinish

    #endif