{- |
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.FilterOutputStream
    ( 

-- * Exported types
    FilterOutputStream(..)                  ,
    FilterOutputStreamK                     ,
    toFilterOutputStream                    ,
    noFilterOutputStream                    ,


 -- * Methods
-- ** filterOutputStreamGetBaseStream
    filterOutputStreamGetBaseStream         ,


-- ** filterOutputStreamGetCloseBaseStream
    filterOutputStreamGetCloseBaseStream    ,


-- ** filterOutputStreamSetCloseBaseStream
    filterOutputStreamSetCloseBaseStream    ,




 -- * Properties
-- ** BaseStream
    FilterOutputStreamBaseStreamPropertyInfo,
    constructFilterOutputStreamBaseStream   ,
    getFilterOutputStreamBaseStream         ,


-- ** CloseBaseStream
    FilterOutputStreamCloseBaseStreamPropertyInfo,
    constructFilterOutputStreamCloseBaseStream,
    getFilterOutputStreamCloseBaseStream    ,




    ) 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.GObject as GObject

newtype FilterOutputStream = FilterOutputStream (ForeignPtr FilterOutputStream)
foreign import ccall "g_filter_output_stream_get_type"
    c_g_filter_output_stream_get_type :: IO GType

type instance ParentTypes FilterOutputStream = FilterOutputStreamParentTypes
type FilterOutputStreamParentTypes = '[OutputStream, GObject.Object]

instance GObject FilterOutputStream where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_g_filter_output_stream_get_type
    

class GObject o => FilterOutputStreamK o
instance (GObject o, IsDescendantOf FilterOutputStream o) => FilterOutputStreamK o

toFilterOutputStream :: FilterOutputStreamK o => o -> IO FilterOutputStream
toFilterOutputStream = unsafeCastTo FilterOutputStream

noFilterOutputStream :: Maybe FilterOutputStream
noFilterOutputStream = Nothing

-- VVV Prop "base-stream"
   -- Type: TInterface "Gio" "OutputStream"
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]

getFilterOutputStreamBaseStream :: (MonadIO m, FilterOutputStreamK o) => o -> m OutputStream
getFilterOutputStreamBaseStream obj = liftIO $ getObjectPropertyObject obj "base-stream" OutputStream

constructFilterOutputStreamBaseStream :: (OutputStreamK a) => a -> IO ([Char], GValue)
constructFilterOutputStreamBaseStream val = constructObjectPropertyObject "base-stream" val

data FilterOutputStreamBaseStreamPropertyInfo
instance AttrInfo FilterOutputStreamBaseStreamPropertyInfo where
    type AttrAllowedOps FilterOutputStreamBaseStreamPropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint FilterOutputStreamBaseStreamPropertyInfo = OutputStreamK
    type AttrBaseTypeConstraint FilterOutputStreamBaseStreamPropertyInfo = FilterOutputStreamK
    type AttrGetType FilterOutputStreamBaseStreamPropertyInfo = OutputStream
    type AttrLabel FilterOutputStreamBaseStreamPropertyInfo = "FilterOutputStream::base-stream"
    attrGet _ = getFilterOutputStreamBaseStream
    attrSet _ = undefined
    attrConstruct _ = constructFilterOutputStreamBaseStream

-- VVV Prop "close-base-stream"
   -- Type: TBasicType TBoolean
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]

getFilterOutputStreamCloseBaseStream :: (MonadIO m, FilterOutputStreamK o) => o -> m Bool
getFilterOutputStreamCloseBaseStream obj = liftIO $ getObjectPropertyBool obj "close-base-stream"

constructFilterOutputStreamCloseBaseStream :: Bool -> IO ([Char], GValue)
constructFilterOutputStreamCloseBaseStream val = constructObjectPropertyBool "close-base-stream" val

data FilterOutputStreamCloseBaseStreamPropertyInfo
instance AttrInfo FilterOutputStreamCloseBaseStreamPropertyInfo where
    type AttrAllowedOps FilterOutputStreamCloseBaseStreamPropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint FilterOutputStreamCloseBaseStreamPropertyInfo = (~) Bool
    type AttrBaseTypeConstraint FilterOutputStreamCloseBaseStreamPropertyInfo = FilterOutputStreamK
    type AttrGetType FilterOutputStreamCloseBaseStreamPropertyInfo = Bool
    type AttrLabel FilterOutputStreamCloseBaseStreamPropertyInfo = "FilterOutputStream::close-base-stream"
    attrGet _ = getFilterOutputStreamCloseBaseStream
    attrSet _ = undefined
    attrConstruct _ = constructFilterOutputStreamCloseBaseStream

type instance AttributeList FilterOutputStream = FilterOutputStreamAttributeList
type FilterOutputStreamAttributeList = ('[ '("base-stream", FilterOutputStreamBaseStreamPropertyInfo), '("close-base-stream", FilterOutputStreamCloseBaseStreamPropertyInfo)] :: [(Symbol, *)])

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

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

foreign import ccall "g_filter_output_stream_get_base_stream" g_filter_output_stream_get_base_stream :: 
    Ptr FilterOutputStream ->               -- _obj : TInterface "Gio" "FilterOutputStream"
    IO (Ptr OutputStream)


filterOutputStreamGetBaseStream ::
    (MonadIO m, FilterOutputStreamK a) =>
    a ->                                    -- _obj
    m OutputStream
filterOutputStreamGetBaseStream _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- g_filter_output_stream_get_base_stream _obj'
    checkUnexpectedReturnNULL "g_filter_output_stream_get_base_stream" result
    result' <- (newObject OutputStream) result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "g_filter_output_stream_get_close_base_stream" g_filter_output_stream_get_close_base_stream :: 
    Ptr FilterOutputStream ->               -- _obj : TInterface "Gio" "FilterOutputStream"
    IO CInt


filterOutputStreamGetCloseBaseStream ::
    (MonadIO m, FilterOutputStreamK a) =>
    a ->                                    -- _obj
    m Bool
filterOutputStreamGetCloseBaseStream _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- g_filter_output_stream_get_close_base_stream _obj'
    let result' = (/= 0) result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "g_filter_output_stream_set_close_base_stream" g_filter_output_stream_set_close_base_stream :: 
    Ptr FilterOutputStream ->               -- _obj : TInterface "Gio" "FilterOutputStream"
    CInt ->                                 -- close_base : TBasicType TBoolean
    IO ()


filterOutputStreamSetCloseBaseStream ::
    (MonadIO m, FilterOutputStreamK a) =>
    a ->                                    -- _obj
    Bool ->                                 -- close_base
    m ()
filterOutputStreamSetCloseBaseStream _obj close_base = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let close_base' = (fromIntegral . fromEnum) close_base
    g_filter_output_stream_set_close_base_stream _obj' close_base'
    touchManagedPtr _obj
    return ()