def __init__(self,appdir): print appdir self.trayicon=TrayIcon() self.msg_render=NotificationDaemon() self.appdir=appdir self.udi_dict = {} self.config = {} self.voice = {} self.virtual_root = {} self.bus = dbus.SystemBus() self.hal_manager_obj = self.bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager') self.hal_manager = dbus.Interface(self.hal_manager_obj, 'org.freedesktop.Hal.Manager') # gdl_changed will be invoked when the Global Device List is changed # per the hal spec self.hal_manager.connect_to_signal("DeviceAdded", lambda *args: self.gdl_changed("DeviceAdded", *args)) #print self.hal_manager self.hal_manager.connect_to_signal("DeviceRemoved", lambda *args: self.gdl_changed("DeviceRemoved", *args)) #print self.hal_manager self.hal_manager.connect_to_signal("NewCapability", lambda *args: self.gdl_changed("NewCapability", *args)) #print self.hal_manager # Add listeners for all devices try: device_names = self.hal_manager.GetAllDevices() except: print 'add here notification-daemon error' for name in device_names: self.add_device_signal_recv (name); self.update_device_dict() # config.xml dict config=ConfigParser(filename=self.appdir+"/config.xml") #print config self.config=config.dict_config # voice.xml dict voice=VoiceParser(filename=self.appdir+"/voice.xml") # print voice self.voice=voice.dict_voice print "Nomed Volume Manager started" gtk.main()
class DeviceManager: def __init__(self,appdir): print appdir self.trayicon=TrayIcon() self.msg_render=NotificationDaemon() self.appdir=appdir self.udi_dict = {} self.config = {} self.voice = {} self.virtual_root = {} self.bus = dbus.SystemBus() self.hal_manager_obj = self.bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager') self.hal_manager = dbus.Interface(self.hal_manager_obj, 'org.freedesktop.Hal.Manager') # gdl_changed will be invoked when the Global Device List is changed # per the hal spec self.hal_manager.connect_to_signal("DeviceAdded", lambda *args: self.gdl_changed("DeviceAdded", *args)) #print self.hal_manager self.hal_manager.connect_to_signal("DeviceRemoved", lambda *args: self.gdl_changed("DeviceRemoved", *args)) #print self.hal_manager self.hal_manager.connect_to_signal("NewCapability", lambda *args: self.gdl_changed("NewCapability", *args)) #print self.hal_manager # Add listeners for all devices try: device_names = self.hal_manager.GetAllDevices() except: print 'add here notification-daemon error' for name in device_names: self.add_device_signal_recv (name); self.update_device_dict() # config.xml dict config=ConfigParser(filename=self.appdir+"/config.xml") #print config self.config=config.dict_config # voice.xml dict voice=VoiceParser(filename=self.appdir+"/voice.xml") # print voice self.voice=voice.dict_voice print "Nomed Volume Manager started" gtk.main() def get_tray_coordinates(self,trayicon): """ get the trayicon coordinates to send to notification-daemon trayicon=egg.trayicon.TrayIcon return : [x,y] """ coordinates=trayicon.window.get_origin() size=trayicon.window.get_size() screen=trayicon.window.get_screen() screen_height=screen.get_height() if coordinates[1] <= screen_height/2: y=coordinates[1]+size[1]/2 else: y=coordinates[1]-size[1]/2 msg_xy=[coordinates[0],y] return msg_xy def properties_rules(self,device_udi): """ Parse the rules.xml file for actions input=device udi return:device properties dict,actions,required """ properties = self.udi_to_properties(device_udi) rules=RulesParser(filename=self.appdir+"/rules.xml",input=properties) required=rules.required actions=rules.actions return required,actions,properties def property_modified(self, device_udi, num_changes, change_list): """ This method is called when signals on the Device interface is received """ # device_udi: the device identifier # change_list : # ex: when the volume has been mounted # [('volume.mount_point', False, False), ('volume.is_mounted', False, False)] # it will read # 1) ('volume.mount_point', False, False) # i[0] == volume.mount_point [property_name] [key] # i[1] == False [removed] [rem=0|1] # i[2] == False [added] [add=0|1] # 2) ('volume.is_mounted', False, False) # i[0] == volume.is_mounted [property_name] # i[1] == False [removed] # i[2] == False [added] print "\nPropertyModified, device=%s, num=%s"%(device_udi,num_changes) for i in change_list: property_name = i[0] removed = i[1] added = i[2] print property_name,removed,added #print " key=%s, rem=%d, add=%d"%(property_name, removed, added) if property_name=="info.parent": self.update_device_list() else: device_udi_obj = self.bus.get_object("org.freedesktop.Hal", device_udi) properties = self.udi_to_properties(device_udi) # if from the udi of the devce is possible to find the modified property: # value = the value of the hal key: # ex: # key=volume.mount_point # value=/media/usbdisk if device_udi_obj.PropertyExists(property_name, dbus_interface="org.freedesktop.Hal.Device"): properties[property_name] = device_udi_obj.GetProperty(property_name, dbus_interface="org.freedesktop.Hal.Device") print " value=%s"%(properties[property_name]) rules=RulesParser(filename=self.appdir+"/rules.xml", input=properties) ############################################################# # ACTOR # # # #if mount is true volume.mount_point property is modified # # # ############################################################# if "mount" in rules.actions.keys() and rules.actions["mount"]: if property_name == "volume.mount_point": actor=Actor(rules.actions,rules.required,properties,self.msg_render,self.config,self.voice ) # if val is empty don't do anything actor.on_modified_mount(properties[property_name]) else: if property_name in rules.required.keys() and str(properties[property_name]) == str(rules.required[property_name]): pass else: rules.actions={} rules.required={} else: if device_obj != None: try: del device_obj.properties[property_name] except: pass def gdl_changed(self, signal_name, device_udi, *args): """ This method is called when a HAL device is added or removed. """ #play sound playsound_removed='' playsound_added='' if signal_name=="DeviceAdded": #print "\nDeviceAdded, udi=%s"%(device_udi) self.add_device_signal_recv(device_udi) self.update_device_dict() required,actions,properties=self.properties_rules(device_udi) #get traicon position as a tuple (x,y) coordinates=self.get_tray_coordinates(self.trayicon.tray) actor=Actor(actions,required,properties,self.msg_render,self.config,self.voice,coordinates=coordinates ) actor.on_added() elif signal_name=="DeviceRemoved": #print "\nDeviceRemoved, udi=%s"%(device_udi) required,actions,properties=self.properties_rules(device_udi) #get traicon position as a tuple (x,y) coordinates=self.get_tray_coordinates(self.trayicon.tray) actor=Actor(actions,required,properties,self.msg_render,self.config,self.voice,coordinates=coordinates) actor.on_removed() self.remove_device_signal_recv(device_udi) self.virtual_root.pop(device_udi) self.trayicon.on_rem_udi(device_udi) elif signal_name=="NewCapability": [cap] = args #print "\nNewCapability, cap=%s, udi=%s"%(cap, device_udi) # not an hal signal: needed to add new parttions elif signal_name=="VolumeAdded": print "\nVolumeAdded, udi=%s"%(device_udi) device_dict=args[0] print device_dict.__class__ self.trayicon.on_add_udi(device_udi,device_dict) #for i in device_dict[0]["vm.info.childs"]: # for key in i.keys(): # print i[key] else: print "*** Unknown signal %s"% signal_name def add_device_signal_recv (self, udi): self.bus.add_signal_receiver(lambda *args: self.property_modified(udi, *args), "PropertyModified", "org.freedesktop.Hal.Device", "org.freedesktop.Hal", udi) def remove_device_signal_recv (self, udi): try: self.bus.remove_signal_receiver(None, "PropertyModified", "org.freedesktop.Hal.Device", "org.freedesktop.Hal", udi) except Exception, e: print "Older versions of the D-BUS bindings have an error when removing signals. Please upgrade." print e