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

Zlib decompression
-}

module GI.Gio.Objects.ZlibDecompressor
    ( 

-- * Exported types
    ZlibDecompressor(..)                    ,
    IsZlibDecompressor                      ,
    toZlibDecompressor                      ,
    noZlibDecompressor                      ,


 -- * Methods
-- ** getFileInfo #method:getFileInfo#
    ZlibDecompressorGetFileInfoMethodInfo   ,
    zlibDecompressorGetFileInfo             ,


-- ** new #method:new#
    zlibDecompressorNew                     ,




 -- * Properties
-- ** fileInfo #attr:fileInfo#
    ZlibDecompressorFileInfoPropertyInfo    ,
    getZlibDecompressorFileInfo             ,
    zlibDecompressorFileInfo                ,


-- ** format #attr:format#
    ZlibDecompressorFormatPropertyInfo      ,
    constructZlibDecompressorFormat         ,
    getZlibDecompressorFormat               ,
    zlibDecompressorFormat                  ,




    ) 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.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 {-# SOURCE #-} qualified GI.Gio.Enums as Gio.Enums
import {-# SOURCE #-} qualified GI.Gio.Interfaces.Converter as Gio.Converter
import {-# SOURCE #-} qualified GI.Gio.Objects.FileInfo as Gio.FileInfo

newtype ZlibDecompressor = ZlibDecompressor (ManagedPtr ZlibDecompressor)
foreign import ccall "g_zlib_decompressor_get_type"
    c_g_zlib_decompressor_get_type :: IO GType

instance GObject ZlibDecompressor where
    gobjectType _ = c_g_zlib_decompressor_get_type
    

class GObject o => IsZlibDecompressor o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError ZlibDecompressor a) =>
    IsZlibDecompressor a
#endif
instance IsZlibDecompressor ZlibDecompressor
instance GObject.Object.IsObject ZlibDecompressor
instance Gio.Converter.IsConverter ZlibDecompressor

toZlibDecompressor :: IsZlibDecompressor o => o -> IO ZlibDecompressor
toZlibDecompressor = unsafeCastTo ZlibDecompressor

noZlibDecompressor :: Maybe ZlibDecompressor
noZlibDecompressor = Nothing

type family ResolveZlibDecompressorMethod (t :: Symbol) (o :: *) :: * where
    ResolveZlibDecompressorMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveZlibDecompressorMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveZlibDecompressorMethod "convert" o = Gio.Converter.ConverterConvertMethodInfo
    ResolveZlibDecompressorMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveZlibDecompressorMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveZlibDecompressorMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveZlibDecompressorMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveZlibDecompressorMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveZlibDecompressorMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveZlibDecompressorMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveZlibDecompressorMethod "replaceData" o = GObject.Object.ObjectReplaceDataMethodInfo
    ResolveZlibDecompressorMethod "replaceQdata" o = GObject.Object.ObjectReplaceQdataMethodInfo
    ResolveZlibDecompressorMethod "reset" o = Gio.Converter.ConverterResetMethodInfo
    ResolveZlibDecompressorMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveZlibDecompressorMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveZlibDecompressorMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveZlibDecompressorMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveZlibDecompressorMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveZlibDecompressorMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveZlibDecompressorMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveZlibDecompressorMethod "getFileInfo" o = ZlibDecompressorGetFileInfoMethodInfo
    ResolveZlibDecompressorMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveZlibDecompressorMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveZlibDecompressorMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveZlibDecompressorMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveZlibDecompressorMethod l o = O.MethodResolutionFailed l o

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

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveZlibDecompressorMethod t ZlibDecompressor, O.MethodInfo info ZlibDecompressor p) => O.IsLabel t (ZlibDecompressor -> p) where
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

-- VVV Prop "file-info"
   -- Type: TInterface (Name {namespace = "Gio", name = "FileInfo"})
   -- Flags: [PropertyReadable]
   -- Nullable: (Just False,Nothing)

getZlibDecompressorFileInfo :: (MonadIO m, IsZlibDecompressor o) => o -> m Gio.FileInfo.FileInfo
getZlibDecompressorFileInfo obj = liftIO $ checkUnexpectedNothing "getZlibDecompressorFileInfo" $ getObjectPropertyObject obj "file-info" Gio.FileInfo.FileInfo

data ZlibDecompressorFileInfoPropertyInfo
instance AttrInfo ZlibDecompressorFileInfoPropertyInfo where
    type AttrAllowedOps ZlibDecompressorFileInfoPropertyInfo = '[ 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint ZlibDecompressorFileInfoPropertyInfo = (~) ()
    type AttrBaseTypeConstraint ZlibDecompressorFileInfoPropertyInfo = IsZlibDecompressor
    type AttrGetType ZlibDecompressorFileInfoPropertyInfo = Gio.FileInfo.FileInfo
    type AttrLabel ZlibDecompressorFileInfoPropertyInfo = "file-info"
    type AttrOrigin ZlibDecompressorFileInfoPropertyInfo = ZlibDecompressor
    attrGet _ = getZlibDecompressorFileInfo
    attrSet _ = undefined
    attrConstruct _ = undefined
    attrClear _ = undefined

-- VVV Prop "format"
   -- Type: TInterface (Name {namespace = "Gio", name = "ZlibCompressorFormat"})
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]
   -- Nullable: (Nothing,Nothing)

getZlibDecompressorFormat :: (MonadIO m, IsZlibDecompressor o) => o -> m Gio.Enums.ZlibCompressorFormat
getZlibDecompressorFormat obj = liftIO $ getObjectPropertyEnum obj "format"

constructZlibDecompressorFormat :: (IsZlibDecompressor o) => Gio.Enums.ZlibCompressorFormat -> IO (GValueConstruct o)
constructZlibDecompressorFormat val = constructObjectPropertyEnum "format" val

data ZlibDecompressorFormatPropertyInfo
instance AttrInfo ZlibDecompressorFormatPropertyInfo where
    type AttrAllowedOps ZlibDecompressorFormatPropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint ZlibDecompressorFormatPropertyInfo = (~) Gio.Enums.ZlibCompressorFormat
    type AttrBaseTypeConstraint ZlibDecompressorFormatPropertyInfo = IsZlibDecompressor
    type AttrGetType ZlibDecompressorFormatPropertyInfo = Gio.Enums.ZlibCompressorFormat
    type AttrLabel ZlibDecompressorFormatPropertyInfo = "format"
    type AttrOrigin ZlibDecompressorFormatPropertyInfo = ZlibDecompressor
    attrGet _ = getZlibDecompressorFormat
    attrSet _ = undefined
    attrConstruct _ = constructZlibDecompressorFormat
    attrClear _ = undefined

instance O.HasAttributeList ZlibDecompressor
type instance O.AttributeList ZlibDecompressor = ZlibDecompressorAttributeList
type ZlibDecompressorAttributeList = ('[ '("fileInfo", ZlibDecompressorFileInfoPropertyInfo), '("format", ZlibDecompressorFormatPropertyInfo)] :: [(Symbol, *)])

zlibDecompressorFileInfo :: AttrLabelProxy "fileInfo"
zlibDecompressorFileInfo = AttrLabelProxy

zlibDecompressorFormat :: AttrLabelProxy "format"
zlibDecompressorFormat = AttrLabelProxy

type instance O.SignalList ZlibDecompressor = ZlibDecompressorSignalList
type ZlibDecompressorSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

-- method ZlibDecompressor::new
-- method type : Constructor
-- Args : [Arg {argCName = "format", argType = TInterface (Name {namespace = "Gio", name = "ZlibCompressorFormat"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "The format to use for the compressed data", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gio", name = "ZlibDecompressor"}))
-- throws : False
-- Skip return : False

foreign import ccall "g_zlib_decompressor_new" g_zlib_decompressor_new :: 
    CUInt ->                                -- format : TInterface (Name {namespace = "Gio", name = "ZlibCompressorFormat"})
    IO (Ptr ZlibDecompressor)

{- |
Creates a new 'GI.Gio.Objects.ZlibDecompressor.ZlibDecompressor'.

@since 2.24
-}
zlibDecompressorNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Gio.Enums.ZlibCompressorFormat
    {- ^ /@format@/: The format to use for the compressed data -}
    -> m ZlibDecompressor
    {- ^ __Returns:__ a new 'GI.Gio.Objects.ZlibDecompressor.ZlibDecompressor' -}
zlibDecompressorNew format = liftIO $ do
    let format' = (fromIntegral . fromEnum) format
    result <- g_zlib_decompressor_new format'
    checkUnexpectedReturnNULL "zlibDecompressorNew" result
    result' <- (wrapObject ZlibDecompressor) result
    return result'

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

foreign import ccall "g_zlib_decompressor_get_file_info" g_zlib_decompressor_get_file_info :: 
    Ptr ZlibDecompressor ->                 -- decompressor : TInterface (Name {namespace = "Gio", name = "ZlibDecompressor"})
    IO (Ptr Gio.FileInfo.FileInfo)

{- |
Retrieves the 'GI.Gio.Objects.FileInfo.FileInfo' constructed from the GZIP header data
of compressed data processed by /@compressor@/, or 'Nothing' if /@decompressor@/\'s
'GI.Gio.Objects.ZlibDecompressor.ZlibDecompressor':@/format/@ property is not 'GI.Gio.Enums.ZlibCompressorFormatGzip',
or the header data was not fully processed yet, or it not present in the
data stream at all.

@since 2.26
-}
zlibDecompressorGetFileInfo ::
    (B.CallStack.HasCallStack, MonadIO m, IsZlibDecompressor a) =>
    a
    {- ^ /@decompressor@/: a 'GI.Gio.Objects.ZlibDecompressor.ZlibDecompressor' -}
    -> m Gio.FileInfo.FileInfo
    {- ^ __Returns:__ a 'GI.Gio.Objects.FileInfo.FileInfo', or 'Nothing' -}
zlibDecompressorGetFileInfo decompressor = liftIO $ do
    decompressor' <- unsafeManagedPtrCastPtr decompressor
    result <- g_zlib_decompressor_get_file_info decompressor'
    checkUnexpectedReturnNULL "zlibDecompressorGetFileInfo" result
    result' <- (newObject Gio.FileInfo.FileInfo) result
    touchManagedPtr decompressor
    return result'

data ZlibDecompressorGetFileInfoMethodInfo
instance (signature ~ (m Gio.FileInfo.FileInfo), MonadIO m, IsZlibDecompressor a) => O.MethodInfo ZlibDecompressorGetFileInfoMethodInfo a signature where
    overloadedMethod _ = zlibDecompressorGetFileInfo