{- |
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.Gio.Objects.MemoryOutputStream
    ( 

-- * Exported types
    MemoryOutputStream(..)                  ,
    MemoryOutputStreamK                     ,
    toMemoryOutputStream                    ,
    noMemoryOutputStream                    ,


 -- * Methods
-- ** memoryOutputStreamGetData
    memoryOutputStreamGetData               ,


-- ** memoryOutputStreamGetDataSize
    memoryOutputStreamGetDataSize           ,


-- ** memoryOutputStreamGetSize
    memoryOutputStreamGetSize               ,


-- ** memoryOutputStreamNewResizable
    memoryOutputStreamNewResizable          ,


-- ** memoryOutputStreamStealAsBytes
    memoryOutputStreamStealAsBytes          ,


-- ** memoryOutputStreamStealData
    memoryOutputStreamStealData             ,




 -- * Properties
-- ** Data
    MemoryOutputStreamDataPropertyInfo      ,
    constructMemoryOutputStreamData         ,
    getMemoryOutputStreamData               ,


-- ** DataSize
    MemoryOutputStreamDataSizePropertyInfo  ,
    getMemoryOutputStreamDataSize           ,


-- ** Size
    MemoryOutputStreamSizePropertyInfo      ,
    constructMemoryOutputStreamSize         ,
    getMemoryOutputStreamSize               ,




    ) 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.Gio.Types
import GI.Gio.Callbacks
import qualified GI.GLib as GLib
import qualified GI.GObject as GObject

newtype MemoryOutputStream = MemoryOutputStream (ForeignPtr MemoryOutputStream)
foreign import ccall "g_memory_output_stream_get_type"
    c_g_memory_output_stream_get_type :: IO GType

type instance ParentTypes MemoryOutputStream = MemoryOutputStreamParentTypes
type MemoryOutputStreamParentTypes = '[OutputStream, GObject.Object, PollableOutputStream, Seekable]

instance GObject MemoryOutputStream where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_g_memory_output_stream_get_type
    

class GObject o => MemoryOutputStreamK o
instance (GObject o, IsDescendantOf MemoryOutputStream o) => MemoryOutputStreamK o

toMemoryOutputStream :: MemoryOutputStreamK o => o -> IO MemoryOutputStream
toMemoryOutputStream = unsafeCastTo MemoryOutputStream

noMemoryOutputStream :: Maybe MemoryOutputStream
noMemoryOutputStream = Nothing

-- VVV Prop "data"
   -- Type: TBasicType TVoid
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]

getMemoryOutputStreamData :: (MonadIO m, MemoryOutputStreamK o) => o -> m (Ptr ())
getMemoryOutputStreamData obj = liftIO $ getObjectPropertyPtr obj "data"

constructMemoryOutputStreamData :: (Ptr ()) -> IO ([Char], GValue)
constructMemoryOutputStreamData val = constructObjectPropertyPtr "data" val

data MemoryOutputStreamDataPropertyInfo
instance AttrInfo MemoryOutputStreamDataPropertyInfo where
    type AttrAllowedOps MemoryOutputStreamDataPropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint MemoryOutputStreamDataPropertyInfo = (~) (Ptr ())
    type AttrBaseTypeConstraint MemoryOutputStreamDataPropertyInfo = MemoryOutputStreamK
    type AttrGetType MemoryOutputStreamDataPropertyInfo = (Ptr ())
    type AttrLabel MemoryOutputStreamDataPropertyInfo = "MemoryOutputStream::data"
    attrGet _ = getMemoryOutputStreamData
    attrSet _ = undefined
    attrConstruct _ = constructMemoryOutputStreamData

-- VVV Prop "data-size"
   -- Type: TBasicType TUInt64
   -- Flags: [PropertyReadable]

getMemoryOutputStreamDataSize :: (MonadIO m, MemoryOutputStreamK o) => o -> m Word64
getMemoryOutputStreamDataSize obj = liftIO $ getObjectPropertyUInt64 obj "data-size"

data MemoryOutputStreamDataSizePropertyInfo
instance AttrInfo MemoryOutputStreamDataSizePropertyInfo where
    type AttrAllowedOps MemoryOutputStreamDataSizePropertyInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint MemoryOutputStreamDataSizePropertyInfo = (~) ()
    type AttrBaseTypeConstraint MemoryOutputStreamDataSizePropertyInfo = MemoryOutputStreamK
    type AttrGetType MemoryOutputStreamDataSizePropertyInfo = Word64
    type AttrLabel MemoryOutputStreamDataSizePropertyInfo = "MemoryOutputStream::data-size"
    attrGet _ = getMemoryOutputStreamDataSize
    attrSet _ = undefined
    attrConstruct _ = undefined

-- VVV Prop "size"
   -- Type: TBasicType TUInt64
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]

getMemoryOutputStreamSize :: (MonadIO m, MemoryOutputStreamK o) => o -> m Word64
getMemoryOutputStreamSize obj = liftIO $ getObjectPropertyUInt64 obj "size"

constructMemoryOutputStreamSize :: Word64 -> IO ([Char], GValue)
constructMemoryOutputStreamSize val = constructObjectPropertyUInt64 "size" val

data MemoryOutputStreamSizePropertyInfo
instance AttrInfo MemoryOutputStreamSizePropertyInfo where
    type AttrAllowedOps MemoryOutputStreamSizePropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint MemoryOutputStreamSizePropertyInfo = (~) Word64
    type AttrBaseTypeConstraint MemoryOutputStreamSizePropertyInfo = MemoryOutputStreamK
    type AttrGetType MemoryOutputStreamSizePropertyInfo = Word64
    type AttrLabel MemoryOutputStreamSizePropertyInfo = "MemoryOutputStream::size"
    attrGet _ = getMemoryOutputStreamSize
    attrSet _ = undefined
    attrConstruct _ = constructMemoryOutputStreamSize

type instance AttributeList MemoryOutputStream = MemoryOutputStreamAttributeList
type MemoryOutputStreamAttributeList = ('[ '("data", MemoryOutputStreamDataPropertyInfo), '("data-size", MemoryOutputStreamDataSizePropertyInfo), '("size", MemoryOutputStreamSizePropertyInfo)] :: [(Symbol, *)])

type instance SignalList MemoryOutputStream = MemoryOutputStreamSignalList
type MemoryOutputStreamSignalList = ('[ '("notify", GObject.ObjectNotifySignalInfo), '("notify::[property]", GObjectNotifySignalInfo)] :: [(Symbol, *)])

-- method MemoryOutputStream::new_resizable
-- method type : Constructor
-- Args : []
-- Lengths : []
-- hInArgs : []
-- returnType : TInterface "Gio" "MemoryOutputStream"
-- throws : False
-- Skip return : False

foreign import ccall "g_memory_output_stream_new_resizable" g_memory_output_stream_new_resizable :: 
    IO (Ptr MemoryOutputStream)


memoryOutputStreamNewResizable ::
    (MonadIO m) =>
    m MemoryOutputStream
memoryOutputStreamNewResizable  = liftIO $ do
    result <- g_memory_output_stream_new_resizable
    checkUnexpectedReturnNULL "g_memory_output_stream_new_resizable" result
    result' <- (wrapObject MemoryOutputStream) result
    return result'

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

foreign import ccall "g_memory_output_stream_get_data" g_memory_output_stream_get_data :: 
    Ptr MemoryOutputStream ->               -- _obj : TInterface "Gio" "MemoryOutputStream"
    IO ()


memoryOutputStreamGetData ::
    (MonadIO m, MemoryOutputStreamK a) =>
    a ->                                    -- _obj
    m ()
memoryOutputStreamGetData _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    g_memory_output_stream_get_data _obj'
    touchManagedPtr _obj
    return ()

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

foreign import ccall "g_memory_output_stream_get_data_size" g_memory_output_stream_get_data_size :: 
    Ptr MemoryOutputStream ->               -- _obj : TInterface "Gio" "MemoryOutputStream"
    IO Word64


memoryOutputStreamGetDataSize ::
    (MonadIO m, MemoryOutputStreamK a) =>
    a ->                                    -- _obj
    m Word64
memoryOutputStreamGetDataSize _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- g_memory_output_stream_get_data_size _obj'
    touchManagedPtr _obj
    return result

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

foreign import ccall "g_memory_output_stream_get_size" g_memory_output_stream_get_size :: 
    Ptr MemoryOutputStream ->               -- _obj : TInterface "Gio" "MemoryOutputStream"
    IO Word64


memoryOutputStreamGetSize ::
    (MonadIO m, MemoryOutputStreamK a) =>
    a ->                                    -- _obj
    m Word64
memoryOutputStreamGetSize _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- g_memory_output_stream_get_size _obj'
    touchManagedPtr _obj
    return result

-- method MemoryOutputStream::steal_as_bytes
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gio" "MemoryOutputStream", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gio" "MemoryOutputStream", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "GLib" "Bytes"
-- throws : False
-- Skip return : False

foreign import ccall "g_memory_output_stream_steal_as_bytes" g_memory_output_stream_steal_as_bytes :: 
    Ptr MemoryOutputStream ->               -- _obj : TInterface "Gio" "MemoryOutputStream"
    IO (Ptr GLib.Bytes)


memoryOutputStreamStealAsBytes ::
    (MonadIO m, MemoryOutputStreamK a) =>
    a ->                                    -- _obj
    m GLib.Bytes
memoryOutputStreamStealAsBytes _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- g_memory_output_stream_steal_as_bytes _obj'
    checkUnexpectedReturnNULL "g_memory_output_stream_steal_as_bytes" result
    result' <- (wrapBoxed GLib.Bytes) result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "g_memory_output_stream_steal_data" g_memory_output_stream_steal_data :: 
    Ptr MemoryOutputStream ->               -- _obj : TInterface "Gio" "MemoryOutputStream"
    IO ()


memoryOutputStreamStealData ::
    (MonadIO m, MemoryOutputStreamK a) =>
    a ->                                    -- _obj
    m ()
memoryOutputStreamStealData _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    g_memory_output_stream_steal_data _obj'
    touchManagedPtr _obj
    return ()