----------------------------------------------------------------------------- -- | -- Module : System.Win32.Event -- Copyright : (c) Esa Ilari Vuokko, 2006 -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Esa Ilari Vuokko -- Stability : provisional -- Portability : portable -- -- A collection of FFI declarations for interfacing with Win32 event system between -- processes. -- ----------------------------------------------------------------------------- module System.Win32.Event ( -- * Duplicate options DuplicateOption , dUPLICATE_CLOSE_SOURCE , dUPLICATE_SAME_ACCESS -- * Access modes , AccessMode , eVENT_ALL_ACCESS , eVENT_MODIFY_STATE -- * Wait results , WaitResult , wAIT_ABANDONED , wAIT_IO_COMPLETION , wAIT_OBJECT_0 , wAIT_TIMEOUT , wAIT_FAILED -- * Managing events , openEvent , createEvent , duplicateHandle , setEvent , resetEvent , pulseEvent -- * Signalling objects , signalObjectAndWait -- * Waiting on objects , waitForSingleObject , waitForSingleObjectEx , waitForMultipleObjects , waitForMultipleObjectsEx ) where import Foreign.Marshal.Alloc ( alloca ) import Foreign.Marshal.Array ( withArrayLen ) import Foreign.Marshal.Utils ( maybeWith, with ) import Foreign.Ptr ( Ptr, nullPtr ) import Foreign.Storable ( Storable(..) ) import Graphics.Win32.Misc ( MilliSeconds ) import System.Win32.File ( AccessMode, LPSECURITY_ATTRIBUTES, SECURITY_ATTRIBUTES ) import System.Win32.Types ( LPCTSTR, HANDLE, BOOL, withTString, failIf, failIfFalse_ ) import System.Win32.Word ( DWORD ) ##include "windows_cconv.h" #include "windows.h" #include "winuser_compat.h" #include "alignment.h" --------------------------------------------------------------------------- -- Enums --------------------------------------------------------------------------- type DuplicateOption = DWORD #{enum DuplicateOption, , dUPLICATE_CLOSE_SOURCE = DUPLICATE_CLOSE_SOURCE , dUPLICATE_SAME_ACCESS = DUPLICATE_SAME_ACCESS } #{enum AccessMode, , eVENT_ALL_ACCESS = EVENT_ALL_ACCESS , eVENT_MODIFY_STATE = EVENT_MODIFY_STATE } type WaitResult = DWORD #{enum WaitResult, , wAIT_ABANDONED = WAIT_ABANDONED , wAIT_IO_COMPLETION = WAIT_IO_COMPLETION , wAIT_OBJECT_0 = WAIT_OBJECT_0 , wAIT_TIMEOUT = WAIT_TIMEOUT , wAIT_FAILED = WAIT_FAILED } --------------------------------------------------------------------------- -- API in Haskell --------------------------------------------------------------------------- openEvent :: AccessMode -> Bool -> String -> IO HANDLE openEvent amode inherit name = withTString name $ \c_name -> failIf (==nullPtr) "openEvent: OpenEvent" $ c_OpenEvent (fromIntegral amode) inherit c_name createEvent :: Maybe SECURITY_ATTRIBUTES -> Bool -> Bool -> String -> IO HANDLE createEvent msecurity manual initial name = withTString name $ \c_name -> maybeWith with msecurity $ \c_sec -> failIf (==nullPtr) "createEvent: CreateEvent" $ c_CreateEvent c_sec manual initial c_name duplicateHandle :: HANDLE -> HANDLE -> HANDLE -> AccessMode -> Bool -> DuplicateOption -> IO HANDLE duplicateHandle srcProccess srcHandler targetProcess access inherit opts = alloca $ \res -> do failIfFalse_ "duplicateHandle: DuplicateHandle" $ c_DuplicateHandle srcProccess srcHandler targetProcess res (fromIntegral access) inherit opts peek res setEvent :: HANDLE -> IO () setEvent event = failIfFalse_ "setEvent: SetEvent" $ c_SetEvent event resetEvent :: HANDLE -> IO () resetEvent event = failIfFalse_ "resetEvent: ResetEvent" $ c_ResetEvent event pulseEvent :: HANDLE -> IO () pulseEvent event = failIfFalse_ "pulseEvent: PulseEvent" $ c_PulseEvent event signalObjectAndWait :: HANDLE -> HANDLE -> MilliSeconds -> Bool -> IO WaitResult signalObjectAndWait toSignal toWaitOn millis alterable = c_SignalObjectAndWait toSignal toWaitOn millis alterable waitForSingleObject :: HANDLE -> MilliSeconds -> IO WaitResult waitForSingleObject toWaitOn millis = c_WaitForSingleObject toWaitOn millis waitForSingleObjectEx :: HANDLE -> MilliSeconds -> Bool -> IO WaitResult waitForSingleObjectEx toWaitOn millis alterable = c_WaitForSingleObjectEx toWaitOn millis alterable waitForMultipleObjects :: [HANDLE] -> Bool -> MilliSeconds -> IO WaitResult waitForMultipleObjects hs waitAll millis = withArrayLen hs $ \n hsp -> c_WaitForMultipleObjects (fromIntegral n) hsp waitAll millis waitForMultipleObjectsEx :: [HANDLE] -> Bool -> MilliSeconds -> Bool -> IO WaitResult waitForMultipleObjectsEx hs waitAll millis alterable = withArrayLen hs $ \n hsp -> c_WaitForMultipleObjectsEx (fromIntegral n) hsp waitAll millis alterable --------------------------------------------------------------------------- -- Imports --------------------------------------------------------------------------- foreign import WINDOWS_CCONV "windows.h OpenEventW" c_OpenEvent :: DWORD -> BOOL -> LPCTSTR -> IO HANDLE foreign import WINDOWS_CCONV "windows.h CreateEventW" c_CreateEvent :: LPSECURITY_ATTRIBUTES -> BOOL -> BOOL -> LPCTSTR -> IO HANDLE foreign import WINDOWS_CCONV "windows.h DuplicateHandle" c_DuplicateHandle :: HANDLE -> HANDLE -> HANDLE -> Ptr HANDLE -> DWORD -> BOOL -> DWORD -> IO BOOL foreign import WINDOWS_CCONV "windows.h SetEvent" c_SetEvent :: HANDLE -> IO Bool foreign import WINDOWS_CCONV "windows.h ResetEvent" c_ResetEvent :: HANDLE -> IO Bool foreign import WINDOWS_CCONV "windows.h PulseEvent" c_PulseEvent :: HANDLE -> IO Bool foreign import WINDOWS_CCONV "windows.h SignalObjectAndWait" c_SignalObjectAndWait :: HANDLE -> HANDLE -> DWORD -> BOOL -> IO DWORD foreign import WINDOWS_CCONV "windows.h WaitForSingleObject" c_WaitForSingleObject :: HANDLE -> DWORD -> IO DWORD foreign import WINDOWS_CCONV "windows.h WaitForSingleObjectEx" c_WaitForSingleObjectEx :: HANDLE -> DWORD -> BOOL -> IO DWORD foreign import WINDOWS_CCONV "windows.h WaitForMultipleObjects" c_WaitForMultipleObjects :: DWORD -> Ptr HANDLE -> BOOL -> DWORD -> IO DWORD foreign import WINDOWS_CCONV "windows.h WaitForMultipleObjectsEx" c_WaitForMultipleObjectsEx :: DWORD -> Ptr HANDLE -> BOOL -> DWORD -> BOOL -> IO DWORD