{-# LANGUAGE CPP #-} -- GIMP Toolkit (GTK) Binding for Haskell: binding to libgnomevfs -*-haskell-*- -- -- Author : Peter Gavin -- Created: 1-Apr-2007 -- -- Copyright (c) 2007 Peter Gavin -- -- This library is free software: you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public License -- as published by the Free Software Foundation, either version 3 of -- the License, or (at your option) any later version. -- -- This library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with this program. If not, see -- . -- -- GnomeVFS, the C library which this Haskell library depends on, is -- available under LGPL Version 2. The documentation included with -- this library is based on the original GnomeVFS documentation, -- Copyright (c) 2001 Seth Nickell . The -- documentation is covered by the GNU Free Documentation License, -- version 1.2. -- -- | Maintainer : gtk2hs-devel@lists.sourceforge.net -- Stability : alpha -- Portability : portable (depends on GHC) module System.Gnome.VFS.VolumeMonitor ( -- * Types -- | An object that monitors volume mounts and unmounts. VolumeMonitor, VolumeMonitorClass, -- * Values volumeMonitor, -- * Operations volumeMonitorGetConnectedDrives, volumeMonitorGetDriveByID, volumeMonitorGetMountedVolumes, volumeMonitorGetVolumeByID, volumeMonitorGetVolumeForPath, onVolumeMonitorVolumeMounted, afterVolumeMonitorVolumeMounted, onVolumeMonitorVolumePreUnmount, afterVolumeMonitorVolumePreUnmount, onVolumeMonitorVolumeUnmounted, afterVolumeMonitorVolumeUnmounted ) where import Control.Exception import Control.Monad (liftM) import System.Glib.FFI import System.Glib.GList (readGList) import System.Glib.UTFString import System.Gnome.VFS.Marshal {#import System.Gnome.VFS.Types#} {#import System.Gnome.VFS.Signals#} {#import System.Gnome.VFS.BasicTypes#} import System.IO (FilePath) {# context lib = "gnomevfs" prefix = "gnome_vfs" #} -- | The global volume monitor object. volumeMonitor :: VolumeMonitor volumeMonitor = unsafePerformIO $ {# call get_volume_monitor #} >>= wrapVolumeMonitor -- | Returns a list of all drives connected to the machine. volumeMonitorGetConnectedDrives :: VolumeMonitorClass volumeMonitor => volumeMonitor -- ^ @volumeMonitor@ - the volume monitor -> IO [Drive] -- ^ the drives connected to the machine volumeMonitorGetConnectedDrives volumeMonitor = {# call volume_monitor_get_connected_drives #} (castToVolumeMonitor volumeMonitor) >>= readGList >>= mapM newDrive -- | Try to find the 'Drive' with ID @id@. volumeMonitorGetDriveByID :: VolumeMonitorClass volumeMonitor => volumeMonitor -- ^ @volumeMonitor@ - the volume monitor -> DriveID -- ^ @id@ - the drive ID -> IO (Maybe Drive) -- ^ the requested -- drive, or 'Nothing' -- if no drive with -- that ID could be -- found volumeMonitorGetDriveByID volumeMonitor id = {# call volume_monitor_get_drive_by_id #} (castToVolumeMonitor volumeMonitor) id >>= maybePeek newDrive -- | Returns a list of all volumes currently mounted on the machine. volumeMonitorGetMountedVolumes :: VolumeMonitorClass volumeMonitor => volumeMonitor -- ^ @volumeMonitor@ - the volume monitor -> IO [Volume] -- ^ the volumes -- currently mounted -- on the machine volumeMonitorGetMountedVolumes volumeMonitor = {# call volume_monitor_get_mounted_volumes #} (castToVolumeMonitor volumeMonitor) >>= readGList >>= mapM newVolume -- | Try to find the 'Volume' with ID @id@. volumeMonitorGetVolumeByID :: VolumeMonitorClass volumeMonitor => volumeMonitor -- ^ @volumeMonitor@ - the volume monitor -> VolumeID -- ^ @id@ - the volume ID -> IO (Maybe Volume) -- ^ the requested -- volume, or -- 'Nothing' if no -- volume with that -- ID could be found volumeMonitorGetVolumeByID volumeMonitor id = {# call volume_monitor_get_volume_by_id #} (castToVolumeMonitor volumeMonitor) id >>= maybePeek newVolume -- | Returns the 'Volume' corresponding to path, or 'Nothing'. -- -- The volume referring to path is found by calling @stat@ on path, -- and then iterating through the list of volumes that refer to -- currently mounted local file systems. The first volume in this -- list maching the path's UNIX device is returned. -- -- If the @stat@ on path was not successful, or no volume matches -- path, 'Nothing' is returned. volumeMonitorGetVolumeForPath :: VolumeMonitorClass volumeMonitor => volumeMonitor -- ^ @volumeMonitor@ - the volume monitor -> FilePath -- ^ the path to -- find the volume -- for -> IO (Maybe Volume) -- ^ the volume the -- path resides -- on, or -- 'Nothing' if -- the volume -- could not be -- determined volumeMonitorGetVolumeForPath volumeMonitor path = (withUTFString path $ {# call volume_monitor_get_volume_for_path #} (castToVolumeMonitor volumeMonitor)) >>= maybePeek newVolume onVolumeMonitorDriveConnected, afterVolumeMonitorDriveConnected, onVolumeMonitorDriveDisconnected, afterVolumeMonitorDriveDisconnected, onVolumeMonitorVolumeMounted, afterVolumeMonitorVolumeMounted, onVolumeMonitorVolumePreUnmount, afterVolumeMonitorVolumePreUnmount, onVolumeMonitorVolumeUnmounted, afterVolumeMonitorVolumeUnmounted :: (VolumeMonitorClass volumeMonitor) => volumeMonitor -- ^ @volumeMonitor@ - the volume monitor -> (Volume -> IO ()) -- ^ @handler@ - the signal handling function -> IO (ConnectId volumeMonitor) -- ^ the identifier for the connection onVolumeMonitorDriveConnected = connect_OBJECT__NONE "drive-connected" False afterVolumeMonitorDriveConnected = connect_OBJECT__NONE "drive-connected" True onVolumeMonitorDriveDisconnected = connect_OBJECT__NONE "drive-disconnected" False afterVolumeMonitorDriveDisconnected = connect_OBJECT__NONE "drive-disconnected" True onVolumeMonitorVolumeMounted = connect_OBJECT__NONE "volume-mounted" False afterVolumeMonitorVolumeMounted = connect_OBJECT__NONE "volume-mounted" True onVolumeMonitorVolumePreUnmount = connect_OBJECT__NONE "volume-pre-unmount" False afterVolumeMonitorVolumePreUnmount = connect_OBJECT__NONE "volume-pre-unmount" True onVolumeMonitorVolumeUnmounted = connect_OBJECT__NONE "volume-unmounted" False afterVolumeMonitorVolumeUnmounted = connect_OBJECT__NONE "volume-unmounted" True