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

Watches @/GUnixMounts/@ for changes.
-}

module GI.Gio.Objects.UnixMountMonitor
    ( 

-- * Exported types
    UnixMountMonitor(..)                    ,
    IsUnixMountMonitor                      ,
    toUnixMountMonitor                      ,
    noUnixMountMonitor                      ,


 -- * Methods
-- ** get #method:get#
    unixMountMonitorGet                     ,


-- ** new #method:new#
    unixMountMonitorNew                     ,


-- ** setRateLimit #method:setRateLimit#
    UnixMountMonitorSetRateLimitMethodInfo  ,
    unixMountMonitorSetRateLimit            ,




 -- * Signals
-- ** mountpointsChanged #signal:mountpointsChanged#
    C_UnixMountMonitorMountpointsChangedCallback,
    UnixMountMonitorMountpointsChangedCallback,
    UnixMountMonitorMountpointsChangedSignalInfo,
    afterUnixMountMonitorMountpointsChanged ,
    genClosure_UnixMountMonitorMountpointsChanged,
    mk_UnixMountMonitorMountpointsChangedCallback,
    noUnixMountMonitorMountpointsChangedCallback,
    onUnixMountMonitorMountpointsChanged    ,
    wrap_UnixMountMonitorMountpointsChangedCallback,


-- ** mountsChanged #signal:mountsChanged#
    C_UnixMountMonitorMountsChangedCallback ,
    UnixMountMonitorMountsChangedCallback   ,
    UnixMountMonitorMountsChangedSignalInfo ,
    afterUnixMountMonitorMountsChanged      ,
    genClosure_UnixMountMonitorMountsChanged,
    mk_UnixMountMonitorMountsChangedCallback,
    noUnixMountMonitorMountsChangedCallback ,
    onUnixMountMonitorMountsChanged         ,
    wrap_UnixMountMonitorMountsChangedCallback,




    ) 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

newtype UnixMountMonitor = UnixMountMonitor (ManagedPtr UnixMountMonitor)
foreign import ccall "g_unix_mount_monitor_get_type"
    c_g_unix_mount_monitor_get_type :: IO GType

instance GObject UnixMountMonitor where
    gobjectType _ = c_g_unix_mount_monitor_get_type
    

class GObject o => IsUnixMountMonitor o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError UnixMountMonitor a) =>
    IsUnixMountMonitor a
#endif
instance IsUnixMountMonitor UnixMountMonitor
instance GObject.Object.IsObject UnixMountMonitor

toUnixMountMonitor :: IsUnixMountMonitor o => o -> IO UnixMountMonitor
toUnixMountMonitor = unsafeCastTo UnixMountMonitor

noUnixMountMonitor :: Maybe UnixMountMonitor
noUnixMountMonitor = Nothing

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

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

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

-- signal UnixMountMonitor::mountpoints-changed
type UnixMountMonitorMountpointsChangedCallback =
    IO ()

noUnixMountMonitorMountpointsChangedCallback :: Maybe UnixMountMonitorMountpointsChangedCallback
noUnixMountMonitorMountpointsChangedCallback = Nothing

type C_UnixMountMonitorMountpointsChangedCallback =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mk_UnixMountMonitorMountpointsChangedCallback :: C_UnixMountMonitorMountpointsChangedCallback -> IO (FunPtr C_UnixMountMonitorMountpointsChangedCallback)

genClosure_UnixMountMonitorMountpointsChanged :: UnixMountMonitorMountpointsChangedCallback -> IO Closure
genClosure_UnixMountMonitorMountpointsChanged cb = do
    let cb' = wrap_UnixMountMonitorMountpointsChangedCallback cb
    mk_UnixMountMonitorMountpointsChangedCallback cb' >>= newCClosure


wrap_UnixMountMonitorMountpointsChangedCallback ::
    UnixMountMonitorMountpointsChangedCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
wrap_UnixMountMonitorMountpointsChangedCallback _cb _ _ = do
    _cb 


onUnixMountMonitorMountpointsChanged :: (GObject a, MonadIO m) => a -> UnixMountMonitorMountpointsChangedCallback -> m SignalHandlerId
onUnixMountMonitorMountpointsChanged obj cb = liftIO $ connectUnixMountMonitorMountpointsChanged obj cb SignalConnectBefore
afterUnixMountMonitorMountpointsChanged :: (GObject a, MonadIO m) => a -> UnixMountMonitorMountpointsChangedCallback -> m SignalHandlerId
afterUnixMountMonitorMountpointsChanged obj cb = connectUnixMountMonitorMountpointsChanged obj cb SignalConnectAfter

connectUnixMountMonitorMountpointsChanged :: (GObject a, MonadIO m) =>
                                             a -> UnixMountMonitorMountpointsChangedCallback -> SignalConnectMode -> m SignalHandlerId
connectUnixMountMonitorMountpointsChanged obj cb after = liftIO $ do
    let cb' = wrap_UnixMountMonitorMountpointsChangedCallback cb
    cb'' <- mk_UnixMountMonitorMountpointsChangedCallback cb'
    connectSignalFunPtr obj "mountpoints-changed" cb'' after

-- signal UnixMountMonitor::mounts-changed
type UnixMountMonitorMountsChangedCallback =
    IO ()

noUnixMountMonitorMountsChangedCallback :: Maybe UnixMountMonitorMountsChangedCallback
noUnixMountMonitorMountsChangedCallback = Nothing

type C_UnixMountMonitorMountsChangedCallback =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mk_UnixMountMonitorMountsChangedCallback :: C_UnixMountMonitorMountsChangedCallback -> IO (FunPtr C_UnixMountMonitorMountsChangedCallback)

genClosure_UnixMountMonitorMountsChanged :: UnixMountMonitorMountsChangedCallback -> IO Closure
genClosure_UnixMountMonitorMountsChanged cb = do
    let cb' = wrap_UnixMountMonitorMountsChangedCallback cb
    mk_UnixMountMonitorMountsChangedCallback cb' >>= newCClosure


wrap_UnixMountMonitorMountsChangedCallback ::
    UnixMountMonitorMountsChangedCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
wrap_UnixMountMonitorMountsChangedCallback _cb _ _ = do
    _cb 


onUnixMountMonitorMountsChanged :: (GObject a, MonadIO m) => a -> UnixMountMonitorMountsChangedCallback -> m SignalHandlerId
onUnixMountMonitorMountsChanged obj cb = liftIO $ connectUnixMountMonitorMountsChanged obj cb SignalConnectBefore
afterUnixMountMonitorMountsChanged :: (GObject a, MonadIO m) => a -> UnixMountMonitorMountsChangedCallback -> m SignalHandlerId
afterUnixMountMonitorMountsChanged obj cb = connectUnixMountMonitorMountsChanged obj cb SignalConnectAfter

connectUnixMountMonitorMountsChanged :: (GObject a, MonadIO m) =>
                                        a -> UnixMountMonitorMountsChangedCallback -> SignalConnectMode -> m SignalHandlerId
connectUnixMountMonitorMountsChanged obj cb after = liftIO $ do
    let cb' = wrap_UnixMountMonitorMountsChangedCallback cb
    cb'' <- mk_UnixMountMonitorMountsChangedCallback cb'
    connectSignalFunPtr obj "mounts-changed" cb'' after

instance O.HasAttributeList UnixMountMonitor
type instance O.AttributeList UnixMountMonitor = UnixMountMonitorAttributeList
type UnixMountMonitorAttributeList = ('[ ] :: [(Symbol, *)])

data UnixMountMonitorMountpointsChangedSignalInfo
instance SignalInfo UnixMountMonitorMountpointsChangedSignalInfo where
    type HaskellCallbackType UnixMountMonitorMountpointsChangedSignalInfo = UnixMountMonitorMountpointsChangedCallback
    connectSignal _ = connectUnixMountMonitorMountpointsChanged

data UnixMountMonitorMountsChangedSignalInfo
instance SignalInfo UnixMountMonitorMountsChangedSignalInfo where
    type HaskellCallbackType UnixMountMonitorMountsChangedSignalInfo = UnixMountMonitorMountsChangedCallback
    connectSignal _ = connectUnixMountMonitorMountsChanged

type instance O.SignalList UnixMountMonitor = UnixMountMonitorSignalList
type UnixMountMonitorSignalList = ('[ '("mountpointsChanged", UnixMountMonitorMountpointsChangedSignalInfo), '("mountsChanged", UnixMountMonitorMountsChangedSignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

-- method UnixMountMonitor::new
-- method type : Constructor
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gio", name = "UnixMountMonitor"}))
-- throws : False
-- Skip return : False

foreign import ccall "g_unix_mount_monitor_new" g_unix_mount_monitor_new :: 
    IO (Ptr UnixMountMonitor)

{-# DEPRECATED unixMountMonitorNew ["(Since version 2.44)","Use 'GI.Gio.Objects.UnixMountMonitor.unixMountMonitorGet' instead."] #-}
{- |
Deprecated alias for 'GI.Gio.Objects.UnixMountMonitor.unixMountMonitorGet'.

This function was never a true constructor, which is why it was
renamed.
-}
unixMountMonitorNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m UnixMountMonitor
    {- ^ __Returns:__ a 'GI.Gio.Objects.UnixMountMonitor.UnixMountMonitor'. -}
unixMountMonitorNew  = liftIO $ do
    result <- g_unix_mount_monitor_new
    checkUnexpectedReturnNULL "unixMountMonitorNew" result
    result' <- (wrapObject UnixMountMonitor) result
    return result'

-- method UnixMountMonitor::set_rate_limit
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "mount_monitor", argType = TInterface (Name {namespace = "Gio", name = "UnixMountMonitor"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GUnixMountMonitor", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "limit_msec", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a integer with the limit in milliseconds to\n    poll for changes.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_unix_mount_monitor_set_rate_limit" g_unix_mount_monitor_set_rate_limit :: 
    Ptr UnixMountMonitor ->                 -- mount_monitor : TInterface (Name {namespace = "Gio", name = "UnixMountMonitor"})
    Int32 ->                                -- limit_msec : TBasicType TInt
    IO ()

{-# DEPRECATED unixMountMonitorSetRateLimit ["(Since version 2.44)","This function does nothing.  Don\\'t call it."] #-}
{- |
This function does nothing.

Before 2.44, this was a partially-effective way of controlling the
rate at which events would be reported under some uncommon
circumstances.  Since /@mountMonitor@/ is a singleton, it also meant
that calling this function would have side effects for other users of
the monitor.

@since 2.18
-}
unixMountMonitorSetRateLimit ::
    (B.CallStack.HasCallStack, MonadIO m, IsUnixMountMonitor a) =>
    a
    {- ^ /@mountMonitor@/: a 'GI.Gio.Objects.UnixMountMonitor.UnixMountMonitor' -}
    -> Int32
    {- ^ /@limitMsec@/: a integer with the limit in milliseconds to
    poll for changes. -}
    -> m ()
unixMountMonitorSetRateLimit mountMonitor limitMsec = liftIO $ do
    mountMonitor' <- unsafeManagedPtrCastPtr mountMonitor
    g_unix_mount_monitor_set_rate_limit mountMonitor' limitMsec
    touchManagedPtr mountMonitor
    return ()

data UnixMountMonitorSetRateLimitMethodInfo
instance (signature ~ (Int32 -> m ()), MonadIO m, IsUnixMountMonitor a) => O.MethodInfo UnixMountMonitorSetRateLimitMethodInfo a signature where
    overloadedMethod _ = unixMountMonitorSetRateLimit

-- method UnixMountMonitor::get
-- method type : MemberFunction
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gio", name = "UnixMountMonitor"}))
-- throws : False
-- Skip return : False

foreign import ccall "g_unix_mount_monitor_get" g_unix_mount_monitor_get :: 
    IO (Ptr UnixMountMonitor)

{- |
Gets the 'GI.Gio.Objects.UnixMountMonitor.UnixMountMonitor' for the current thread-default main
context.

The mount monitor can be used to monitor for changes to the list of
mounted filesystems as well as the list of mount points (ie: fstab
entries).

You must only call 'GI.GObject.Objects.Object.objectUnref' on the return value from under
the same main context as you called this function.

@since 2.44
-}
unixMountMonitorGet ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m UnixMountMonitor
    {- ^ __Returns:__ the 'GI.Gio.Objects.UnixMountMonitor.UnixMountMonitor'. -}
unixMountMonitorGet  = liftIO $ do
    result <- g_unix_mount_monitor_get
    checkUnexpectedReturnNULL "unixMountMonitorGet" result
    result' <- (wrapObject UnixMountMonitor) result
    return result'