module System.Gnome.VFS.Monitor (
MonitorHandle,
MonitorCallback,
monitorAdd,
monitorCancel
) where
import Control.Monad (liftM)
import System.Glib.FFI
import System.Glib.UTFString
import System.Gnome.VFS.Marshal
import System.Gnome.VFS.BasicTypes
type CMonitorCallback = Ptr MonitorHandle
-> CString
-> CString
-> (CInt)
-> ((Ptr ()))
-> IO ()
monitorAdd :: String
-> MonitorType
-> MonitorCallback
-> IO MonitorHandle
monitorAdd textURI monitorType callback =
do cTestURI <- newUTFString textURI
let cMonitorType = cFromEnum monitorType
cCallback <- monitorCallbackMarshal callback
newObjectResultMarshal
(\cMonitorHandle ->
MonitorHandle (cMonitorHandle, cCallback))
(\cMonitorHandlePtr ->
gnome_vfs_monitor_add (castPtr cMonitorHandlePtr) cTestURI cMonitorType cCallback nullPtr)
monitorCallbackMarshal :: MonitorCallback
-> IO ((FunPtr ((Ptr ()) -> ((Ptr CChar) -> ((Ptr CChar) -> (CInt -> ((Ptr ()) -> (IO ()))))))))
monitorCallbackMarshal callback =
let cCallback :: CMonitorCallback
cCallback cHandle cMonitorURI cInfoURI cEventType cUserData =
do handle <- liftM (\cHandle -> MonitorHandle (cHandle, castPtrToFunPtr cUserData)) $
newForeignPtr_ cHandle
monitorURI <- peekUTFString cMonitorURI
infoURI <- peekUTFString cInfoURI
let eventType = cToEnum cEventType
callback handle monitorURI infoURI eventType
in makeMonitorCallback cCallback
foreign import ccall safe "wrapper"
makeMonitorCallback :: CMonitorCallback
-> IO ((FunPtr ((Ptr ()) -> ((Ptr CChar) -> ((Ptr CChar) -> (CInt -> ((Ptr ()) -> (IO ()))))))))
monitorCancel :: MonitorHandle
-> IO ()
monitorCancel (MonitorHandle (cMonitorHandle, cCallback)) =
do freeHaskellFunPtr cCallback
withForeignPtr cMonitorHandle $
voidResultMarshal . gnome_vfs_monitor_cancel . castPtr
foreign import ccall safe "gnome_vfs_monitor_add"
gnome_vfs_monitor_add :: ((Ptr (Ptr ())) -> ((Ptr CChar) -> (CInt -> ((FunPtr ((Ptr ()) -> ((Ptr CChar) -> ((Ptr CChar) -> (CInt -> ((Ptr ()) -> (IO ()))))))) -> ((Ptr ()) -> (IO CInt))))))
foreign import ccall safe "gnome_vfs_monitor_cancel"
gnome_vfs_monitor_cancel :: ((Ptr ()) -> (IO CInt))