ScolaSync  1.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 import dbus
26 from PyQt4.QtCore import *
27 import ownedUsbDisk
28 
30  ##
31  #
32  # le constructeur
33  # @param widget un QWidget qui s'intéresse aux disques amovibles
34  #
35  def __init__(self, widget=None):
36  self.bus = dbus.SystemBus()
37  self.manager = self.bus.get_object(
38  'org.freedesktop.UDisks',
39  '/org/freedesktop/UDisks')
40  self.interface = dbus.Interface(
41  self.manager,
42  'org.freedesktop.UDisks')
43  self.interface.connect_to_signal('DeviceAdded', self.cbAdd)
44  self.interface.connect_to_signal('DeviceChanged', self.cbChange)
45  self.interface.connect_to_signal("DeviceRemoved",self.cbDel)
47  self.widget=widget
48  self.pollDevices()
49 
50  ##
51  #
52  # peuple le dictionnaire self.connectedVolumes avec les volumes
53  # actuellement gérés par dbus.
54  #
55  def pollDevices(self):
56  self.connectedVolumes={}
57  for d in self.interface.EnumerateDevices():
58  pathUDisks=self.vfatUsbPath(d)
59  if pathUDisks:
60  self.connectedVolumes[pathUDisks]=d
61  ## print "at init:", self.connectedVolumes
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  ## print "in cbAdd", self.connectedVolumes
74  if self.widget:
75  self.widget.emit(SIGNAL("deviceAdded(QString)"), key)
76  return
77 
78  ##
79  #
80  # fonction de rappel pour une clé qui vient de changer de type
81  # @param path un chemin de type UDisks vers une partition
82  #
83  def cbChange(self, path):
84  key=self.vfatUsbPath(path)
85  if key and not self.connectedVolumes.has_key(key):
86  self.connectedVolumes[key]=path
87  ## print "in cbChange", self.connectedVolumes
88  if self.widget:
89  self.widget.emit(SIGNAL("deviceAdded(QString)"), key)
90  return
91 
92 
93  ##
94  #
95  # fonction de rappel pour une clé retirée
96  # @param path un chemin de type UDisks vers une partition
97  #
98  def cbDel(self, path):
99  key=str(path)
100  if self.connectedVolumes.has_key(key):
101  if self.widget:
102  self.widget.emit(SIGNAL("deviceRemoved(QString)"), key)
103  self.connectedVolumes.pop(key)
104  ## print "in cbDel", self.connectedVolumes
105  return
106 
107  ##
108  #
109  # Détermine le chemin UDisks pour une partition vfat connectée par USB
110  # @param dev est un objet dbus renvoyé par EnumerateDevices(), ou une
111  # simple chaine de caractères, clé dans le tableau connectedVolumes
112  # @return un chemin vers le disque (selon UDisks), sinon ""
113  #
114  def vfatUsbPath(self, dev):
115  if type(dev)==type(""):
116  dev=self.connectedVolumes[dev]
117  o=self.bus.get_object("org.freedesktop.UDisks", dev)
118  if self.isVfatUsb(o):
119  return str(dev)
120  return ""
121 
122  ##
123  #
124  # Renvoie une identification de baladeur pour scolasync
125  # @param dev est un objet dbus renvoyé par EnumerateDevices(), ou une
126  # simple chaine de caractères, clé dans le tableau connectedVolumes
127  # @return un triplet (stickId, tatouage, uuid)
128  #
129  def identify(self,dev):
130  if type(dev)==type(""):
131  dev=self.connectedVolumes[dev]
132  o=self.bus.get_object("org.freedesktop.UDisks", dev)
133  i=dbus.Interface(o, "org.freedesktop.DBus.Properties")
134  stickId, tattoo, uuid = "", "", ""
135  try:
136  p=i.Get('','DeviceMountPaths')
137  if len(p) > 0:
138  mountPoint=str(p[0])
139  tattoo=ownedUsbDisk.tattooInDir(mountPoint)
140  except:
141  pass
142  try:
143  uuid=str(i.Get('','IdUuid'))
144  except:
145  pass
146  try:
147  stickId=str(i.Get("", "DriveSerial"))
148  except:
149  pass
150  return (stickId, tattoo, uuid)
151 
152 
153  ##
154  #
155  # Décide si une partition est de type vfat, et connectée par USB
156  # @param o un objet dbus correspondant à une partition
157  #
158  def isVfatUsb(self, o):
159  i=dbus.Interface(o, "org.freedesktop.DBus.Properties")
160  try:
161  result=str(i.Get('','DriveConnectionInterface'))=="usb" and \
162  str(i.Get('','IdType'))=="vfat"
163  except:
164  result=False
165  return result
166 
167