Пример #1
0
 def OnDeviceChange(self, hwnd, msg, wparam, lparam):
     #
     # WM_DEVICECHANGE:
     #  wParam - type of change: arrival, removal etc.
     #  lParam - what's changed?
     #    if it's a volume then...
     #  lParam - what's changed more exactly
     #
     if wparam == DBT_DEVICEARRIVAL:
         dbch = DEV_BROADCAST_HDR.from_address(lparam)
         if dbch.dbch_devicetype == DBT_DEVTYP_VOLUME:
             dbcv = DEV_BROADCAST_VOLUME.from_address(lparam)
             for driveLetter in DriveLettersFromMask(dbcv.dbcv_unitmask):
                 self.TriggerEvent("DriveMounted." + driveLetter)
         elif dbch.dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE:
             deviceName = wstring_at(lparam + DBD_NAME_OFFSET)
             self.TriggerEvent("DeviceAttached", [deviceName])
     elif wparam == DBT_DEVICEREMOVECOMPLETE:
         dbch = DEV_BROADCAST_HDR.from_address(lparam)
         if dbch.dbch_devicetype == DBT_DEVTYP_VOLUME:
             dbcv = DEV_BROADCAST_VOLUME.from_address(lparam)
             for driveLetter in DriveLettersFromMask(dbcv.dbcv_unitmask):
                 self.TriggerEvent("DriveRemoved." + driveLetter)
         elif dbch.dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE:
             deviceName = wstring_at(lparam + DBD_NAME_OFFSET)
             self.TriggerEvent("DeviceRemoved", [deviceName])
     return 1
Пример #2
0
 def OnDeviceChange(self, hwnd, msg, wparam, lparam):
     #
     # WM_DEVICECHANGE:
     #  wParam - type of change: arrival, removal etc.
     #  lParam - what's changed?
     #    if it's a volume then...
     #  lParam - what's changed more exactly
     #
     if wparam == DBT_DEVICEARRIVAL:
         dbch = DEV_BROADCAST_HDR.from_address(lparam)
         if dbch.dbch_devicetype == DBT_DEVTYP_VOLUME:
             dbcv = DEV_BROADCAST_VOLUME.from_address(lparam)
             for driveLetter in DriveLettersFromMask(dbcv.dbcv_unitmask):
                 self.TriggerEvent("DriveMounted." + driveLetter)
         elif dbch.dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE:
             deviceName = wstring_at(lparam + DBD_NAME_OFFSET)
             self.TriggerEvent("DeviceAttached", [deviceName])
     elif wparam == DBT_DEVICEREMOVECOMPLETE:
         dbch = DEV_BROADCAST_HDR.from_address(lparam)
         if dbch.dbch_devicetype == DBT_DEVTYP_VOLUME:
             dbcv = DEV_BROADCAST_VOLUME.from_address(lparam)
             for driveLetter in DriveLettersFromMask(dbcv.dbcv_unitmask):
                 self.TriggerEvent("DriveRemoved." + driveLetter)
         elif dbch.dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE:
             deviceName = wstring_at(lparam + DBD_NAME_OFFSET)
             self.TriggerEvent("DeviceRemoved", [deviceName])
     return 1
Пример #3
0
 def ThreadLoop(self, startupEvent):
     try:
         hDir = CreateFile(
             self.path, FILE_LIST_DIRECTORY,
             FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING,
             FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, 0)
         if hDir == INVALID_HANDLE_VALUE:
             self.startException = FormatError()
             startupEvent.set()
             return
         overlapped = OVERLAPPED()
         overlapped.hEvent = CreateEvent(None, 1, 0, None)
         buffer = (c_byte * BUFSIZE)()
         events = (HANDLE * 2)(overlapped.hEvent, self.stopEvent)
         flags = (FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME
                  | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE
                  | FILE_NOTIFY_CHANGE_LAST_WRITE
                  | FILE_NOTIFY_CHANGE_SECURITY)
         includeSubdirs = self.includeSubdirs
         renamePath = None
         bytesReturned = DWORD()
         noneCallback = cast(None, LPOVERLAPPED_COMPLETION_ROUTINE)
         startupEvent.set()
         while 1:
             ReadDirectoryChangesW(hDir, buffer, BUFSIZE, includeSubdirs,
                                   flags, byref(bytesReturned),
                                   byref(overlapped), noneCallback)
             rc = MsgWaitForMultipleObjects(2, events, 0, INFINITE,
                                            QS_ALLINPUT)
             if rc == WAIT_OBJECT_0:
                 res = GetOverlappedResult(hDir, byref(overlapped),
                                           byref(bytesReturned), 1)
                 address = addressof(buffer)
                 while True:
                     fni = FILE_NOTIFY_INFORMATION.from_address(address)
                     length = fni.FileNameLength / WCHAR_SIZE
                     fileName = wstring_at(address + 12, length)
                     action = fni.Action
                     fullFilename = os.path.join(self.path, fileName)
                     if action == FILE_ACTION_ADDED:
                         self.TriggerEvent("Created", (fullFilename, ))
                     elif action == FILE_ACTION_REMOVED:
                         self.TriggerEvent("Deleted", (fullFilename, ))
                     elif action == FILE_ACTION_MODIFIED:
                         self.TriggerEvent("Updated", (fullFilename, ))
                     elif action == FILE_ACTION_RENAMED_OLD_NAME:
                         renamePath = fullFilename
                     elif action == FILE_ACTION_RENAMED_NEW_NAME:
                         self.TriggerEvent("Renamed",
                                           (renamePath, fullFilename))
                         renamePath = None
                     if fni.NextEntryOffset == 0:
                         break
                     address += fni.NextEntryOffset
             elif rc == WAIT_OBJECT_0 + 1:
                 break
         CloseHandle(hDir)
     except:
         self.thread = None
         raise
Пример #4
0
 def ThreadLoop(self, startupEvent):
     try:
         hDir = CreateFile(
             self.path,
             FILE_LIST_DIRECTORY,
             FILE_SHARE_READ|FILE_SHARE_WRITE,
             None,
             OPEN_EXISTING,
             FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED,
             0
         )
         if hDir == INVALID_HANDLE_VALUE:
             self.startException = FormatError()
             startupEvent.set()
             return
         overlapped = OVERLAPPED()
         overlapped.hEvent = CreateEvent(None, 1, 0, None)
         buffer = (c_byte * BUFSIZE )()
         events = (HANDLE * 2)(overlapped.hEvent, self.stopEvent)
         flags = (
             FILE_NOTIFY_CHANGE_FILE_NAME |
             FILE_NOTIFY_CHANGE_DIR_NAME |
             FILE_NOTIFY_CHANGE_ATTRIBUTES |
             FILE_NOTIFY_CHANGE_SIZE |
             FILE_NOTIFY_CHANGE_LAST_WRITE |
             FILE_NOTIFY_CHANGE_SECURITY
         )
         includeSubdirs = self.includeSubdirs
         renamePath = None
         bytesReturned = DWORD()
         noneCallback = cast(None, LPOVERLAPPED_COMPLETION_ROUTINE)
         startupEvent.set()
         while 1:
             ReadDirectoryChangesW(
                 hDir,
                 buffer,
                 BUFSIZE,
                 includeSubdirs,
                 flags,
                 byref(bytesReturned),
                 byref(overlapped),
                 noneCallback
             )
             rc = MsgWaitForMultipleObjects(
                 2, events, 0, INFINITE, QS_ALLINPUT
             )
             if rc == WAIT_OBJECT_0:
                 res = GetOverlappedResult(
                     hDir, byref(overlapped), byref(bytesReturned), 1
                 )
                 address = addressof(buffer)
                 while True:
                     fni = FILE_NOTIFY_INFORMATION.from_address(address)
                     length = fni.FileNameLength / WCHAR_SIZE
                     fileName = wstring_at(address + 12, length)
                     action = fni.Action
                     fullFilename = os.path.join(self.path, fileName)
                     if action == FILE_ACTION_ADDED:
                         self.TriggerEvent("Created", (fullFilename,))
                     elif action == FILE_ACTION_REMOVED:
                         self.TriggerEvent("Deleted", (fullFilename,))
                     elif action == FILE_ACTION_MODIFIED:
                         self.TriggerEvent("Updated", (fullFilename,))
                     elif action == FILE_ACTION_RENAMED_OLD_NAME:
                         renamePath = fullFilename
                     elif action == FILE_ACTION_RENAMED_NEW_NAME:
                         self.TriggerEvent(
                             "Renamed",
                             (renamePath, fullFilename)
                         )
                         renamePath = None
                     if fni.NextEntryOffset == 0:
                         break
                     address += fni.NextEntryOffset
             elif rc == WAIT_OBJECT_0+1:
                 break
         CloseHandle(hDir)
     except:
         self.thread = None
         raise