48
49
from elisa.plugins.base.models.device import DevicesModel, VolumeModel
49
50
from elisa.core.media_uri import MediaUri
52
from elisa.plugins.pigment.message import PigmentFrontendLoadedMessage
51
54
_ = install_translation('wmd')
55
GUID_DEVINTERFACE_VOLUME = u'{53F5630D-B6BF-11D0-94F2-00A0C91EFB8B}'
57
58
class WMDVolumeModel(VolumeModel):
59
60
Volume model Win32 platform specific.
95
96
supported_uri='^volumes://'
97
98
def initialize(self):
98
winprocs = {win32con.WM_DEVICECHANGE : self._on_device_change, }
99
self._message_source = common.application.windows_message_source
100
self._message_source.add_wndproc(winprocs)
101
self._message_source.register_device_notification(GUID_DEVINTERFACE_VOLUME)
102
self._message_source.attach()
99
bus = common.application.bus
100
bus.register(self._frontend_loaded, PigmentFrontendLoadedMessage)
104
101
self._dfr_list = []
102
self._signal_handler_id = None
106
103
return super(WMDResource, self).initialize()
109
106
self.debug('cleaning up')
107
if self._signal_handler_id != None:
108
gobject.disconnect(self._signal_handler_id)
109
self._signal_handler_id = None
111
111
dfr = super(WMDResource, self).clean()
113
self._message_source.destroy()
115
113
if self._dfr_list != []:
116
114
dfr_list = defer.DeferredList(self._dfr_list)
117
115
dfr.chainDeferred(dfr_list)
119
def _frontend_loaded(self, message, frontend):
120
frontend.windows_msg_handler.add_wndproc(win32con.WM_DEVICECHANGE,
121
self._on_device_change)
121
123
def get(self, uri, context_model=None):
123
125
Simple method to retrieve volumes. You can access it with
295
def _on_device_change(self, hwnd, msg, wparam, lparam):
296
info = UnpackDEV_BROADCAST(lparam)
297
if (wparam != win32con.DBT_DEVICEARRIVAL \
298
and wparam != win32con.DBT_DEVICEREMOVECOMPLETE) \
297
def _on_device_change(self, viewport, event):
298
info = UnpackDEV_BROADCAST(event.lparam)
299
if (event.wparam != win32con.DBT_DEVICEARRIVAL \
300
and event.wparam != win32con.DBT_DEVICEREMOVECOMPLETE) \
299
301
or info.devicetype != win32con.DBT_DEVTYP_VOLUME:
302
304
self.debug('on device change')
304
306
units = self._drive_units_from_mask(info.unitmask)
306
if wparam == win32con.DBT_DEVICEARRIVAL:
308
if event.wparam == win32con.DBT_DEVICEARRIVAL:
307
309
dfr = threads.deferToThread(self._send_new_devices, units)
309
311
def send_messages(messages):