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

    GFileOutputStream provides output streams that write their
    content to a file.

    GFileOutputStream implements 'GI.Gio.Interfaces.Seekable.Seekable', which allows the output
    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 output stream, use 'GI.Gio.Interfaces.Seekable.seekableTell'.
    To find out if a file output stream supports seeking, use
    'GI.Gio.Interfaces.Seekable.seekableCanSeek'.To position a file output stream, use
    'GI.Gio.Interfaces.Seekable.seekableSeek'. To find out if a file output stream supports
    truncating, use 'GI.Gio.Interfaces.Seekable.seekableCanTruncate'. To truncate a file output
    stream, use 'GI.Gio.Interfaces.Seekable.seekableTruncate'.
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Objects.FileOutputStream
        (

    -- * Exported types
        FileOutputStream(..)                    ,
        IsFileOutputStream                      ,
        toFileOutputStream                      ,
        noFileOutputStream                      ,

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

    #if ENABLE_OVERLOADING
        FileOutputStreamGetEtagMethodInfo       ,
    #endif
        fileOutputStreamGetEtag                 ,

    -- ** queryInfo #method:queryInfo#

    #if ENABLE_OVERLOADING
        FileOutputStreamQueryInfoMethodInfo     ,
    #endif
        fileOutputStreamQueryInfo               ,

    -- ** queryInfoAsync #method:queryInfoAsync#

    #if ENABLE_OVERLOADING
        FileOutputStreamQueryInfoAsyncMethodInfo,
    #endif
        fileOutputStreamQueryInfoAsync          ,

    -- ** queryInfoFinish #method:queryInfoFinish#

    #if ENABLE_OVERLOADING
        FileOutputStreamQueryInfoFinishMethodInfo,
    #endif
        fileOutputStreamQueryInfoFinish         ,

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

    -- | Memory-managed wrapper type.
    newtype FileOutputStream = FileOutputStream (ManagedPtr FileOutputStream)
    foreign import ccall "g_file_output_stream_get_type"
        c_g_file_output_stream_get_type :: IO GType

    instance GObject FileOutputStream where
        gobjectType _ = c_g_file_output_stream_get_type

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

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

    -- | A convenience alias for `Nothing` :: `Maybe` `FileOutputStream`.
    noFileOutputStream :: Maybe FileOutputStream
    noFileOutputStream = Nothing

    #if ENABLE_OVERLOADING
    type family ResolveFileOutputStreamMethod (t :: Symbol) (o :: *) :: * where
        ResolveFileOutputStreamMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
        ResolveFileOutputStreamMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
        ResolveFileOutputStreamMethod "canSeek" o = Gio.Seekable.SeekableCanSeekMethodInfo
        ResolveFileOutputStreamMethod "canTruncate" o = Gio.Seekable.SeekableCanTruncateMethodInfo
        ResolveFileOutputStreamMethod "clearPending" o = Gio.OutputStream.OutputStreamClearPendingMethodInfo
        ResolveFileOutputStreamMethod "close" o = Gio.OutputStream.OutputStreamCloseMethodInfo
        ResolveFileOutputStreamMethod "closeAsync" o = Gio.OutputStream.OutputStreamCloseAsyncMethodInfo
        ResolveFileOutputStreamMethod "closeFinish" o = Gio.OutputStream.OutputStreamCloseFinishMethodInfo
        ResolveFileOutputStreamMethod "flush" o = Gio.OutputStream.OutputStreamFlushMethodInfo
        ResolveFileOutputStreamMethod "flushAsync" o = Gio.OutputStream.OutputStreamFlushAsyncMethodInfo
        ResolveFileOutputStreamMethod "flushFinish" o = Gio.OutputStream.OutputStreamFlushFinishMethodInfo
        ResolveFileOutputStreamMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
        ResolveFileOutputStreamMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
        ResolveFileOutputStreamMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
        ResolveFileOutputStreamMethod "hasPending" o = Gio.OutputStream.OutputStreamHasPendingMethodInfo
        ResolveFileOutputStreamMethod "isClosed" o = Gio.OutputStream.OutputStreamIsClosedMethodInfo
        ResolveFileOutputStreamMethod "isClosing" o = Gio.OutputStream.OutputStreamIsClosingMethodInfo
        ResolveFileOutputStreamMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
        ResolveFileOutputStreamMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
        ResolveFileOutputStreamMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
        ResolveFileOutputStreamMethod "queryInfo" o = FileOutputStreamQueryInfoMethodInfo
        ResolveFileOutputStreamMethod "queryInfoAsync" o = FileOutputStreamQueryInfoAsyncMethodInfo
        ResolveFileOutputStreamMethod "queryInfoFinish" o = FileOutputStreamQueryInfoFinishMethodInfo
        ResolveFileOutputStreamMethod "ref" o = GObject.Object.ObjectRefMethodInfo
        ResolveFileOutputStreamMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
        ResolveFileOutputStreamMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
        ResolveFileOutputStreamMethod "seek" o = Gio.Seekable.SeekableSeekMethodInfo
        ResolveFileOutputStreamMethod "splice" o = Gio.OutputStream.OutputStreamSpliceMethodInfo
        ResolveFileOutputStreamMethod "spliceAsync" o = Gio.OutputStream.OutputStreamSpliceAsyncMethodInfo
        ResolveFileOutputStreamMethod "spliceFinish" o = Gio.OutputStream.OutputStreamSpliceFinishMethodInfo
        ResolveFileOutputStreamMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
        ResolveFileOutputStreamMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
        ResolveFileOutputStreamMethod "tell" o = Gio.Seekable.SeekableTellMethodInfo
        ResolveFileOutputStreamMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
        ResolveFileOutputStreamMethod "truncate" o = Gio.Seekable.SeekableTruncateMethodInfo
        ResolveFileOutputStreamMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
        ResolveFileOutputStreamMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
        ResolveFileOutputStreamMethod "write" o = Gio.OutputStream.OutputStreamWriteMethodInfo
        ResolveFileOutputStreamMethod "writeAll" o = Gio.OutputStream.OutputStreamWriteAllMethodInfo
        ResolveFileOutputStreamMethod "writeAllAsync" o = Gio.OutputStream.OutputStreamWriteAllAsyncMethodInfo
        ResolveFileOutputStreamMethod "writeAllFinish" o = Gio.OutputStream.OutputStreamWriteAllFinishMethodInfo
        ResolveFileOutputStreamMethod "writeAsync" o = Gio.OutputStream.OutputStreamWriteAsyncMethodInfo
        ResolveFileOutputStreamMethod "writeBytes" o = Gio.OutputStream.OutputStreamWriteBytesMethodInfo
        ResolveFileOutputStreamMethod "writeBytesAsync" o = Gio.OutputStream.OutputStreamWriteBytesAsyncMethodInfo
        ResolveFileOutputStreamMethod "writeBytesFinish" o = Gio.OutputStream.OutputStreamWriteBytesFinishMethodInfo
        ResolveFileOutputStreamMethod "writeFinish" o = Gio.OutputStream.OutputStreamWriteFinishMethodInfo
        ResolveFileOutputStreamMethod "writev" o = Gio.OutputStream.OutputStreamWritevMethodInfo
        ResolveFileOutputStreamMethod "writevAll" o = Gio.OutputStream.OutputStreamWritevAllMethodInfo
        ResolveFileOutputStreamMethod "writevAllAsync" o = Gio.OutputStream.OutputStreamWritevAllAsyncMethodInfo
        ResolveFileOutputStreamMethod "writevAllFinish" o = Gio.OutputStream.OutputStreamWritevAllFinishMethodInfo
        ResolveFileOutputStreamMethod "writevAsync" o = Gio.OutputStream.OutputStreamWritevAsyncMethodInfo
        ResolveFileOutputStreamMethod "writevFinish" o = Gio.OutputStream.OutputStreamWritevFinishMethodInfo
        ResolveFileOutputStreamMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
        ResolveFileOutputStreamMethod "getEtag" o = FileOutputStreamGetEtagMethodInfo
        ResolveFileOutputStreamMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
        ResolveFileOutputStreamMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
        ResolveFileOutputStreamMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
        ResolveFileOutputStreamMethod "setPending" o = Gio.OutputStream.OutputStreamSetPendingMethodInfo
        ResolveFileOutputStreamMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
        ResolveFileOutputStreamMethod l o = O.MethodResolutionFailed l o

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

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveFileOutputStreamMethod t FileOutputStream, O.MethodInfo info FileOutputStream p) => O.IsLabel t (FileOutputStream -> 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 FileOutputStream
    type instance O.AttributeList FileOutputStream = FileOutputStreamAttributeList
    type FileOutputStreamAttributeList = ('[ ] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    #endif

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

    #endif

    -- method FileOutputStream::get_etag
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "stream", argType = TInterface (Name {namespace = "Gio", name = "FileOutputStream"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileOutputStream.", 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_output_stream_get_etag" g_file_output_stream_get_etag ::
        Ptr FileOutputStream ->                 -- stream : TInterface (Name {namespace = "Gio", name = "FileOutputStream"})
        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.
    -}
    fileOutputStreamGetEtag ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileOutputStream a) =>
        a
        {- ^ /@stream@/: a 'GI.Gio.Objects.FileOutputStream.FileOutputStream'. -}
        -> m T.Text
        {- ^ __Returns:__ the entity tag for the stream. -}
    fileOutputStreamGetEtag stream = liftIO $ do
        stream' <- unsafeManagedPtrCastPtr stream
        result <- g_file_output_stream_get_etag stream'
        checkUnexpectedReturnNULL "fileOutputStreamGetEtag" result
        result' <- cstringToText result
        freeMem result
        touchManagedPtr stream
        return result'

    #if ENABLE_OVERLOADING
    data FileOutputStreamGetEtagMethodInfo
    instance (signature ~ (m T.Text), MonadIO m, IsFileOutputStream a) => O.MethodInfo FileOutputStreamGetEtagMethodInfo a signature where
        overloadedMethod _ = fileOutputStreamGetEtag

    #endif

    -- method FileOutputStream::query_info
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "stream", argType = TInterface (Name {namespace = "Gio", name = "FileOutputStream"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileOutputStream.", 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_output_stream_query_info" g_file_output_stream_query_info ::
        Ptr FileOutputStream ->                 -- stream : TInterface (Name {namespace = "Gio", name = "FileOutputStream"})
        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 output stream for the given /@attributes@/.
    This function blocks while querying the stream. For the asynchronous
    version of this function, see 'GI.Gio.Objects.FileOutputStream.fileOutputStreamQueryInfoAsync'.
    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'). In
    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.
    -}
    fileOutputStreamQueryInfo ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileOutputStream a, Gio.Cancellable.IsCancellable b) =>
        a
        {- ^ /@stream@/: a 'GI.Gio.Objects.FileOutputStream.FileOutputStream'. -}
        -> 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')/ -}
    fileOutputStreamQueryInfo 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_output_stream_query_info stream' attributes' maybeCancellable
            checkUnexpectedReturnNULL "fileOutputStreamQueryInfo" result
            result' <- (wrapObject Gio.FileInfo.FileInfo) result
            touchManagedPtr stream
            whenJust cancellable touchManagedPtr
            freeMem attributes'
            return result'
         ) (do
            freeMem attributes'
         )

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

    #endif

    -- method FileOutputStream::query_info_async
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "stream", argType = TInterface (Name {namespace = "Gio", name = "FileOutputStream"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileOutputStream.", 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_output_stream_query_info_async" g_file_output_stream_query_info_async ::
        Ptr FileOutputStream ->                 -- stream : TInterface (Name {namespace = "Gio", name = "FileOutputStream"})
        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.FileOutputStream.fileOutputStreamQueryInfoFinish'.

    For the synchronous version of this function, see
    'GI.Gio.Objects.FileOutputStream.fileOutputStreamQueryInfo'.
    -}
    fileOutputStreamQueryInfoAsync ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileOutputStream a, Gio.Cancellable.IsCancellable b) =>
        a
        {- ^ /@stream@/: a 'GI.Gio.Objects.FileOutputStream.FileOutputStream'. -}
        -> 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 ()
    fileOutputStreamQueryInfoAsync 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_output_stream_query_info_async stream' attributes' ioPriority maybeCancellable maybeCallback userData
        touchManagedPtr stream
        whenJust cancellable touchManagedPtr
        freeMem attributes'
        return ()

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

    #endif

    -- method FileOutputStream::query_info_finish
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "stream", argType = TInterface (Name {namespace = "Gio", name = "FileOutputStream"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileOutputStream.", 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_output_stream_query_info_finish" g_file_output_stream_query_info_finish ::
        Ptr FileOutputStream ->                 -- stream : TInterface (Name {namespace = "Gio", name = "FileOutputStream"})
        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.FileOutputStream.fileOutputStreamQueryInfoAsync'.
    -}
    fileOutputStreamQueryInfoFinish ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileOutputStream a, Gio.AsyncResult.IsAsyncResult b) =>
        a
        {- ^ /@stream@/: a 'GI.Gio.Objects.FileOutputStream.FileOutputStream'. -}
        -> 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')/ -}
    fileOutputStreamQueryInfoFinish stream result_ = liftIO $ do
        stream' <- unsafeManagedPtrCastPtr stream
        result_' <- unsafeManagedPtrCastPtr result_
        onException (do
            result <- propagateGError $ g_file_output_stream_query_info_finish stream' result_'
            checkUnexpectedReturnNULL "fileOutputStreamQueryInfoFinish" result
            result' <- (wrapObject Gio.FileInfo.FileInfo) result
            touchManagedPtr stream
            touchManagedPtr result_
            return result'
         ) (do
            return ()
         )

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

    #endif