OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 | 2 |
3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 import dbus | 7 import dbus |
8 import os | 8 import os |
9 | 9 |
| 10 MMPROVIDERS = [ 'org.chromium', 'org.freedesktop' ] |
| 11 |
10 class ModemManager(object): | 12 class ModemManager(object): |
11 MMPROVIDER = os.getenv('MMPROVIDER') | |
12 if not MMPROVIDER: | |
13 MMPROVIDER = 'org.chromium' | |
14 SERVICE = '%s.ModemManager' % (MMPROVIDER) | |
15 PATH = '/%s/ModemManager' % (MMPROVIDER.replace('.', '/')) | |
16 INTERFACE = 'org.freedesktop.ModemManager' | 13 INTERFACE = 'org.freedesktop.ModemManager' |
17 MODEM_INTERFACE = 'org.freedesktop.ModemManager.Modem' | 14 MODEM_INTERFACE = 'org.freedesktop.ModemManager.Modem' |
18 SIMPLE_MODEM_INTERFACE = 'org.freedesktop.ModemManager.Modem.Simple' | 15 SIMPLE_MODEM_INTERFACE = 'org.freedesktop.ModemManager.Modem.Simple' |
19 CDMA_MODEM_INTERFACE = 'org.freedesktop.ModemManager.Modem.Cdma' | 16 CDMA_MODEM_INTERFACE = 'org.freedesktop.ModemManager.Modem.Cdma' |
20 GSM_MODEM_INTERFACE = 'org.freedesktop.ModemManager.Modem.Gsm' | 17 GSM_MODEM_INTERFACE = 'org.freedesktop.ModemManager.Modem.Gsm' |
21 GOBI_MODEM_INTERFACE = 'org.chromium.ModemManager.Modem.Gobi' | 18 GOBI_MODEM_INTERFACE = 'org.chromium.ModemManager.Modem.Gobi' |
22 GSM_CARD_INTERFACE = 'org.freedesktop.ModemManager.Modem.Gsm.Card' | 19 GSM_CARD_INTERFACE = 'org.freedesktop.ModemManager.Modem.Gsm.Card' |
23 GSM_NETWORK_INTERFACE = 'org.freedesktop.ModemManager.Modem.Gsm.Network' | 20 GSM_NETWORK_INTERFACE = 'org.freedesktop.ModemManager.Modem.Gsm.Network' |
24 PROPERTIES_INTERFACE = 'org.freedesktop.DBus.Properties' | 21 PROPERTIES_INTERFACE = 'org.freedesktop.DBus.Properties' |
25 | 22 |
26 GSM_MODEM = 1 | 23 GSM_MODEM = 1 |
27 CDMA_MODEM = 2 | 24 CDMA_MODEM = 2 |
28 | 25 |
29 def __init__(self): | 26 def __init__(self, provider=None): |
30 self.bus = dbus.SystemBus() | 27 self.bus = dbus.SystemBus() |
31 self.manager = dbus.Interface(self.bus.get_object(ModemManager.SERVICE, | 28 self.provider = provider or os.getenv('MMPROVIDER') or 'org.chromium' |
32 ModemManager.PATH), | 29 self.service = '%s.ModemManager' % self.provider |
| 30 self.path = '/%s/ModemManager' % (self.provider.replace('.', '/')) |
| 31 self.manager = dbus.Interface(self.bus.get_object(self.service, self.path), |
33 ModemManager.INTERFACE) | 32 ModemManager.INTERFACE) |
34 | 33 |
35 def Modem(self, path): | 34 def Modem(self, path): |
36 obj = self.bus.get_object(ModemManager.SERVICE, path) | 35 obj = self.bus.get_object(self.service, path) |
37 return dbus.Interface(obj, ModemManager.MODEM_INTERFACE) | 36 return dbus.Interface(obj, ModemManager.MODEM_INTERFACE) |
38 | 37 |
39 def SimpleModem(self, path): | 38 def SimpleModem(self, path): |
40 obj = self.bus.get_object(ModemManager.SERVICE, path) | 39 obj = self.bus.get_object(self.service, path) |
41 return dbus.Interface(obj, ModemManager.SIMPLE_MODEM_INTERFACE) | 40 return dbus.Interface(obj, ModemManager.SIMPLE_MODEM_INTERFACE) |
42 | 41 |
43 def CdmaModem(self, path): | 42 def CdmaModem(self, path): |
44 obj = self.bus.get_object(ModemManager.SERVICE, path) | 43 obj = self.bus.get_object(self.service, path) |
45 return dbus.Interface(obj, ModemManager.CDMA_MODEM_INTERFACE) | 44 return dbus.Interface(obj, ModemManager.CDMA_MODEM_INTERFACE) |
46 | 45 |
47 def GobiModem(self, path): | 46 def GobiModem(self, path): |
48 obj = self.bus.get_object(ModemManager.SERVICE, path) | 47 obj = self.bus.get_object(self.service, path) |
49 return dbus.Interface(obj, ModemManager.GOBI_MODEM_INTERFACE) | 48 return dbus.Interface(obj, ModemManager.GOBI_MODEM_INTERFACE) |
50 | 49 |
51 def GsmModem(self, path): | 50 def GsmModem(self, path): |
52 obj = self.bus.get_object(ModemManager.SERVICE, path) | 51 obj = self.bus.get_object(self.service, path) |
53 return dbus.Interface(obj, ModemManager.GSM_MODEM_INTERFACE) | 52 return dbus.Interface(obj, ModemManager.GSM_MODEM_INTERFACE) |
54 | 53 |
55 def GsmCard(self, path): | 54 def GsmCard(self, path): |
56 obj = self.bus.get_object(ModemManager.SERVICE, path) | 55 obj = self.bus.get_object(self.service, path) |
57 return dbus.Interface(obj, ModemManager.GSM_CARD_INTERFACE) | 56 return dbus.Interface(obj, ModemManager.GSM_CARD_INTERFACE) |
58 | 57 |
59 def GsmNetwork(self, path): | 58 def GsmNetwork(self, path): |
60 obj = self.bus.get_object(ModemManager.SERVICE, path) | 59 obj = self.bus.get_object(self.service, path) |
61 return dbus.Interface(obj, ModemManager.GSM_NETWORK_INTERFACE) | 60 return dbus.Interface(obj, ModemManager.GSM_NETWORK_INTERFACE) |
62 | 61 |
63 def GetAll(self, iface, path): | 62 def GetAll(self, iface, path): |
64 obj = self.bus.get_object(ModemManager.SERVICE, path) | 63 obj = self.bus.get_object(self.service, path) |
65 obj_iface = dbus.Interface(obj, ModemManager.PROPERTIES_INTERFACE) | 64 obj_iface = dbus.Interface(obj, ModemManager.PROPERTIES_INTERFACE) |
66 return obj_iface.GetAll(iface) | 65 return obj_iface.GetAll(iface) |
67 | 66 |
68 def GetModemInterfaces(self): | 67 def GetModemInterfaces(self): |
69 return [ | 68 return [ |
70 ModemManager.MODEM_INTERFACE, | 69 ModemManager.MODEM_INTERFACE, |
71 ModemManager.SIMPLE_MODEM_INTERFACE, | 70 ModemManager.SIMPLE_MODEM_INTERFACE, |
72 ModemManager.CDMA_MODEM_INTERFACE, | 71 ModemManager.CDMA_MODEM_INTERFACE, |
73 ModemManager.GSM_MODEM_INTERFACE, | 72 ModemManager.GSM_MODEM_INTERFACE, |
74 ModemManager.GOBI_MODEM_INTERFACE] | 73 ModemManager.GOBI_MODEM_INTERFACE] |
75 | 74 |
76 def Properties(self, path): | 75 def Properties(self, path): |
77 props = dict() | 76 props = dict() |
78 for iface in self.GetModemInterfaces(): | 77 for iface in self.GetModemInterfaces(): |
79 try: | 78 try: |
80 d = self.GetAll(iface, path) | 79 d = self.GetAll(iface, path) |
81 except: | 80 except: |
82 continue | 81 continue |
83 if d: | 82 if d: |
84 for k, v in d.iteritems(): | 83 for k, v in d.iteritems(): |
85 props[k] = v | 84 props[k] = v |
86 | 85 |
87 return props | 86 return props |
88 | 87 |
89 def PickOneModem(manager, modem_pattern): | 88 |
90 devices = manager.manager.EnumerateDevices() | 89 def EnumerateDevices(manager=None): |
91 matches = [path for path in devices if modem_pattern in path] | 90 """ Enumerate all modems in the system |
92 if not len(matches): | 91 |
| 92 Args: |
| 93 manager - the specific manager to use, if None check all known managers |
| 94 |
| 95 Returns: |
| 96 a list of (ModemManager object, modem dbus path) |
| 97 """ |
| 98 if manager: |
| 99 managers = [manager] |
| 100 else: |
| 101 managers = [ModemManager(x) for x in MMPROVIDERS] |
| 102 |
| 103 result = [] |
| 104 for m in managers: |
| 105 for path in m.manager.EnumerateDevices(): |
| 106 result.append((m, path)) |
| 107 |
| 108 return result |
| 109 |
| 110 |
| 111 def PickOneModem(modem_pattern, manager=None): |
| 112 """ Pick a modem |
| 113 |
| 114 If a machine has a single modem, managed by one one of the |
| 115 MMPROVIDERS, return the dbus path and a ModemManager object for |
| 116 that modem. |
| 117 |
| 118 Args: |
| 119 modem_pattern - pattern that should match the modem path |
| 120 manager - the specific manager to use, if None check all known managers |
| 121 |
| 122 Returns: |
| 123 ModemManager object, modem dbus path |
| 124 |
| 125 Raises: |
| 126 ValueError - if there are no matching modems, or there are more |
| 127 than one |
| 128 """ |
| 129 devices = EnumerateDevices(manager) |
| 130 |
| 131 matches = [(m, path) for m, path in devices if modem_pattern in path] |
| 132 if not matches: |
93 raise ValueError("No modems had substring: " + modem_pattern) | 133 raise ValueError("No modems had substring: " + modem_pattern) |
94 if len(matches) > 1: | 134 if len(matches) > 1: |
95 raise ValueError("Expected only one modem, got: " + ', '.join(matches)) | 135 raise ValueError("Expected only one modem, got: " + |
| 136 ", ".join([path for _, path in matches])) |
96 return matches[0] | 137 return matches[0] |
OLD | NEW |