ScolaSync  4.0
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Pages
deviceListener.py
Aller à la documentation de ce fichier.
1 # -*- coding: utf-8 -*-
2 # $Id$
3 
4 licence={}
5 licence['en']="""
6  file deviceListener.py
7  this file is part of the project scolasync
8 
9  Copyright (C) 2010 Georges Khaznadar <georgesk@ofset.org>
10 
11  This program is free software: you can redistribute it and/or modify
12  it under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version3 of the License, or
14  (at your option) any later version.
15 
16  This program is distributed in the hope that it will be useful,
17  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  GNU General Public License for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with this program. If not, see <http://www.gnu.org/licenses/>.
23 """
24 
25 python3safe=True
26 import dbus
27 from PyQt4.QtCore import *
28 import ownedUsbDisk
29 
31  ##
32  #
33  # le constructeur
34  # @param widget un QWidget qui s'intéresse aux disques amovibles
35  #
36  def __init__(self, widget=None):
37  self.bus = dbus.SystemBus()
38  self.manager = self.bus.get_object(
39  'org.freedesktop.UDisks',
40  '/org/freedesktop/UDisks')
41  self.interface = dbus.Interface(
42  self.manager,
43  'org.freedesktop.UDisks')
44  self.interface.connect_to_signal('DeviceAdded', self.cbAdd)
45  self.interface.connect_to_signal('DeviceChanged', self.cbChange)
46  self.interface.connect_to_signal("DeviceRemoved",self.cbDel)
48  self.widget=widget
49  self.pollDevices()
50 
51  ##
52  #
53  # peuple le dictionnaire self.connectedVolumes avec les volumes
54  # actuellement gérés par dbus.
55  #
56  def pollDevices(self):
57  self.connectedVolumes={}
58  for d in self.interface.EnumerateDevices():
59  pathUDisks=self.vfatUsbPath(d)
60  if pathUDisks:
61  self.connectedVolumes[pathUDisks]=d
62  return
63 
64  ##
65  #
66  # fonction de rappel pour une clé qu'on vient de brancher
67  # @param path un chemin de type UDisks vers une partition
68  #
69  def cbAdd(self, path):
70  key=self.vfatUsbPath(path)
71  if key:
72  self.connectedVolumes[key]=path
73  if self.widget:
74  self.widget.emit(SIGNAL("deviceAdded(QString)"), key)
75  return
76 
77  ##
78  #
79  # fonction de rappel pour une clé qui vient de changer de type
80  # @param path un chemin de type UDisks vers une partition
81  #
82  def cbChange(self, path):
83  key=self.vfatUsbPath(path)
84  if key and not key in self.connectedVolumes:
85  self.connectedVolumes[key]=path
86  if self.widget:
87  self.widget.emit(SIGNAL("deviceAdded(QString)"), key)
88  return
89 
90 
91  ##
92  #
93  # fonction de rappel pour une clé retirée
94  # @param path un chemin de type UDisks vers une partition
95  #
96  def cbDel(self, path):
97  key=str(path)
98  if key in self.connectedVolumes:
99  if self.widget:
100  self.widget.emit(SIGNAL("deviceRemoved(QString)"), key)
101  self.connectedVolumes.pop(key)
102  return
103 
104  ##
105  #
106  # Détermine le chemin UDisks pour une partition vfat connectée par USB
107  # @param dev est un objet dbus renvoyé par EnumerateDevices(), ou une
108  # simple chaine de caractères, clé dans le tableau connectedVolumes
109  # @return un chemin vers le disque (selon UDisks), sinon ""
110  #
111  def vfatUsbPath(self, dev):
112  if type(dev)==type(""):
113  dev=self.connectedVolumes[dev]
114  o=self.bus.get_object("org.freedesktop.UDisks", dev)
115  if self.isVfatUsb(o):
116  return str(dev)
117  return ""
118 
119  ##
120  #
121  # Renvoie une identification de baladeur pour scolasync
122  # @param dev est un objet dbus renvoyé par EnumerateDevices(), ou une
123  # simple chaine de caractères, clé dans le tableau connectedVolumes
124  # @return un triplet (stickId, tatouage, uuid)
125  #
126  def identify(self,dev):
127  if type(dev)==type(""):
128  dev=self.connectedVolumes[dev]
129  o=self.bus.get_object("org.freedesktop.UDisks", dev)
130  i=dbus.Interface(o, "org.freedesktop.DBus.Properties")
131  stickId, tattoo, uuid = "", "", ""
132  try:
133  p=i.Get('','DeviceMountPaths')
134  if len(p) > 0:
135  mountPoint=str(p[0])
136  tattoo=ownedUsbDisk.tattooInDir(mountPoint)
137  except:
138  pass
139  try:
140  uuid=str(i.Get('','IdUuid'))
141  except:
142  pass
143  try:
144  stickId=str(i.Get("", "DriveSerial"))
145  except:
146  pass
147  return (stickId, tattoo, uuid)
148 
149 
150  ##
151  #
152  # Décide si une partition est de type vfat, et connectée par USB
153  # @param o un objet dbus correspondant à une partition
154  #
155  def isVfatUsb(self, o):
156  i=dbus.Interface(o, "org.freedesktop.DBus.Properties")
157  try:
158  result=str(i.Get('','DriveConnectionInterface'))=="usb" and \
159  str(i.Get('','IdType'))=="vfat"
160  except:
161  result=False
162  return result
163 
164