Browse files

wader-core import

  • Loading branch information...
0 parents commit d6ddf348a3b53c3b72ec4fd80c22e1379f0dba73 Pablo Martí Gamboa committed Jul 9, 2009
Showing with 19,783 additions and 0 deletions.
  1. +215 −0 CHANGELOG
  2. +278 −0 LICENSE
  3. +95 −0 README
  4. +41 −0 bin/wader-core-ctl
  5. +5 −0 bin/wader-resolvconf-helper
  6. +16 −0 contrib/osxserialports/PKG-INFO
  7. +200 −0 contrib/osxserialports/osxserialportsmodule.c
  8. +43 −0 core-tap.py
  9. +69 −0 debian/changelog
  10. +1 −0 debian/compat
  11. +23 −0 debian/control
  12. +15 −0 debian/copyright
  13. +44 −0 debian/rules
  14. +8 −0 debian/wader-core-restart-required.update-notifier
  15. +2 −0 debian/wader-core.install
  16. +77 −0 debian/wader-core.postinst
  17. +11 −0 debian/wader-core.postrm
  18. +15 −0 debian/wader-core.preinst
  19. +22 −0 debian/wader-core.prerm
  20. +56 −0 doc/Makefile
  21. +1 −0 doc/_static/wader.css
  22. +131 −0 doc/conf.py
  23. +31 −0 doc/contents.rst
  24. +151 −0 doc/devel/add-new-device.rst
  25. +40 −0 doc/devel/add-new-os.rst
  26. BIN doc/devel/images/network_registration.png
  27. BIN doc/devel/images/overview.png
  28. +436 −0 doc/devel/images/overview.svg
  29. +16 −0 doc/devel/index.rst
  30. +45 −0 doc/devel/overview.rst
  31. +316 −0 doc/devel/usage.rst
  32. +48 −0 doc/glossary.rst
  33. +18 −0 doc/modules/_dbus.rst
  34. +175 −0 doc/modules/aterrors.rst
  35. +18 −0 doc/modules/command.rst
  36. +11 −0 doc/modules/config.rst
  37. +13 −0 doc/modules/contact.rst
  38. +31 −0 doc/modules/daemon.rst
  39. +22 −0 doc/modules/dialer.rst
  40. +13 −0 doc/modules/dialers/hsolink.rst
  41. +13 −0 doc/modules/dialers/nm_dialer.rst
  42. +25 −0 doc/modules/dialers/wvdial.rst
  43. +21 −0 doc/modules/encoding.rst
  44. +20 −0 doc/modules/exceptions.rst
  45. +32 −0 doc/modules/exported.rst
  46. +16 −0 doc/modules/hardware/base.rst
  47. +27 −0 doc/modules/hardware/huawei.rst
  48. +15 −0 doc/modules/hardware/novatel.rst
  49. +31 −0 doc/modules/hardware/option.rst
  50. +15 −0 doc/modules/hardware/sierra.rst
  51. +11 −0 doc/modules/hardware/sonnyericsson.rst
  52. +15 −0 doc/modules/hardware/zte.rst
  53. +146 −0 doc/modules/interfaces.rst
  54. +34 −0 doc/modules/keyring.rst
  55. +16 −0 doc/modules/middleware.rst
  56. +16 −0 doc/modules/netspeed.rst
  57. +10 −0 doc/modules/oal.rst
  58. +25 −0 doc/modules/oses/linux.rst
  59. +17 −0 doc/modules/oses/osx.rst
  60. +22 −0 doc/modules/plugin.rst
  61. +17 −0 doc/modules/profile.rst
  62. +17 −0 doc/modules/protocol.rst
  63. +10 −0 doc/modules/secrets.rst
  64. +17 −0 doc/modules/serialport.rst
  65. +10 −0 doc/modules/shell.rst
  66. +13 −0 doc/modules/sim.rst
  67. +25 −0 doc/modules/sms.rst
  68. +28 −0 doc/modules/startup.rst
  69. +33 −0 doc/modules/utils.rst
  70. BIN doc/user/images/add-contact.png
  71. BIN doc/user/images/contacts-main.png
  72. BIN doc/user/images/delete-contacts.png
  73. BIN doc/user/images/delete-sms.png
  74. BIN doc/user/images/edit-contact.png
  75. BIN doc/user/images/new-profile.png
  76. BIN doc/user/images/pin-required.png
  77. BIN doc/user/images/search-contacts.png
  78. BIN doc/user/images/select-number.png
  79. BIN doc/user/images/send-sms.png
  80. BIN doc/user/images/sms-received.png
  81. +12 −0 doc/user/index.rst
  82. +367 −0 doc/user/tutorial.rst
  83. +228 −0 ez_setup.py
  84. 0 plugins/__init__.py
  85. 0 plugins/devices/__init__.py
  86. +36 −0 plugins/devices/huawei_e169.py
  87. +55 −0 plugins/devices/huawei_e17X.py
  88. +33 −0 plugins/devices/huawei_e180.py
  89. +68 −0 plugins/devices/huawei_e220.py
  90. +35 −0 plugins/devices/huawei_e270.py
  91. +35 −0 plugins/devices/huawei_e272.py
  92. +51 −0 plugins/devices/huawei_e620.py
  93. +33 −0 plugins/devices/huawei_e660.py
  94. +33 −0 plugins/devices/huawei_e660a.py
  95. +34 −0 plugins/devices/huawei_e870.py
  96. +33 −0 plugins/devices/huawei_em730v.py
  97. +93 −0 plugins/devices/huawei_exxx.py
  98. +58 −0 plugins/devices/huawei_k3520.py
  99. +33 −0 plugins/devices/novatel_eu740.py
  100. +36 −0 plugins/devices/novatel_eu870d.py
  101. +52 −0 plugins/devices/novatel_mc990d.py
  102. +38 −0 plugins/devices/novatel_ovation.py
  103. +35 −0 plugins/devices/novatel_s720.py
  104. +34 −0 plugins/devices/novatel_u630.py
  105. +33 −0 plugins/devices/novatel_u740.py
  106. +33 −0 plugins/devices/novatel_xu870.py
  107. +108 −0 plugins/devices/option_colt.py
  108. +74 −0 plugins/devices/option_etna.py
  109. +37 −0 plugins/devices/option_globesurfericon.py
  110. +40 −0 plugins/devices/option_gtfusion.py
  111. +37 −0 plugins/devices/option_gtfusionquadlite.py
  112. +44 −0 plugins/devices/option_gtm378.py
  113. +35 −0 plugins/devices/option_gtmax36.py
  114. +36 −0 plugins/devices/option_icon225.py
  115. +36 −0 plugins/devices/option_icon401.py
  116. +53 −0 plugins/devices/option_k3760.py
  117. +35 −0 plugins/devices/option_nozomi.py
  118. +40 −0 plugins/devices/sierrawireless_850.py
  119. +39 −0 plugins/devices/sierrawireless_875.py
  120. +52 −0 plugins/devices/sonyericsson_k610i.py
  121. +35 −0 plugins/devices/sonyericsson_k618i.py
  122. +38 −0 plugins/devices/zte_k3520.py
  123. +42 −0 plugins/devices/zte_k3565.py
  124. +34 −0 plugins/devices/zte_mf620.py
  125. +33 −0 plugins/devices/zte_mf632.py
  126. +46 −0 plugins/devices/zte_mf6xx.py
  127. 0 plugins/oses/__init__.py
  128. +34 −0 plugins/oses/debian.py
  129. +43 −0 plugins/oses/fedora.py
  130. +28 −0 plugins/oses/freebsd.py
  131. +23 −0 plugins/oses/osx.py
  132. +39 −0 plugins/oses/suse.py
  133. +71 −0 plugins/oses/ubuntu.py
  134. +42 −0 resources/config/10-wader-modems.fdi
  135. +24 −0 resources/config/95wader-down
  136. +42 −0 resources/config/95wader-up
  137. +5 −0 resources/config/huawei-E169.conf
  138. +6 −0 resources/config/novatel-MC950D.conf
  139. +5 −0 resources/config/option-icon-225.conf
  140. +20 −0 resources/config/wvdial.conf.tpl
  141. +38 −0 resources/dbus/org.freedesktop.ModemManager.conf
  142. +4 −0 resources/dbus/org.freedesktop.ModemManager.service
  143. 0 resources/extra/__init__.py
  144. +374 −0 resources/extra/networks.py
  145. +172 −0 resources/rpm/wader.spec
  146. +13 −0 resources/udev/99-huawei-e169.rules
  147. +15 −0 resources/udev/99-novatel-eu870d.rules
  148. +13 −0 resources/udev/99-novatel-mc950d.rules
  149. +1 −0 resources/udev/99-novatel-mc990d.rules
  150. +13 −0 resources/udev/99-option-icon-225.rules
  151. +116 −0 setup.py
  152. +21 −0 wader/__init__.py
  153. +27 −0 wader/_version.py
  154. +19 −0 wader/common/__init__.py
  155. +151 −0 wader/common/_dbus.py
  156. +57 −0 wader/common/_gconf.py
  157. +537 −0 wader/common/aterrors.py
  158. +271 −0 wader/common/command.py
  159. +65 −0 wader/common/config.py
  160. +148 −0 wader/common/consts.py
  161. +58 −0 wader/common/contact.py
  162. +200 −0 wader/common/daemon.py
  163. +337 −0 wader/common/dialer.py
  164. +21 −0 wader/common/dialers/__init__.py
  165. +74 −0 wader/common/dialers/hsolink.py
  166. +110 −0 wader/common/dialers/nm_dialer.py
  167. +337 −0 wader/common/dialers/wvdial.py
  168. +83 −0 wader/common/encoding.py
  169. +44 −0 wader/common/exceptions.py
  170. +794 −0 wader/common/exported.py
  171. +21 −0 wader/common/hardware/__init__.py
  172. +120 −0 wader/common/hardware/base.py
  173. +304 −0 wader/common/hardware/huawei.py
  174. +76 −0 wader/common/hardware/novatel.py
  175. +321 −0 wader/common/hardware/option.py
  176. +112 −0 wader/common/hardware/sierra.py
  177. +31 −0 wader/common/hardware/sonyericsson.py
  178. +157 −0 wader/common/hardware/zte.py
  179. +190 −0 wader/common/interfaces.py
  180. +351 −0 wader/common/keyring.py
  181. +929 −0 wader/common/middleware.py
  182. +108 −0 wader/common/netspeed.py
  183. +43 −0 wader/common/oal.py
  184. +20 −0 wader/common/oses/__init__.py
  185. +50 −0 wader/common/oses/bsd.py
  186. +581 −0 wader/common/oses/linux.py
  187. +120 −0 wader/common/oses/osx.py
  188. +38 −0 wader/common/oses/unix.py
  189. +92 −0 wader/common/persistent.py
  190. +238 −0 wader/common/plugin.py
  191. +471 −0 wader/common/profile.py
  192. +783 −0 wader/common/protocol.py
  193. +37 −0 wader/common/runtime.py
  194. +99 −0 wader/common/secrets.py
  195. +78 −0 wader/common/serialport.py
  196. +41 −0 wader/common/shell.py
  197. +52 −0 wader/common/signals.py
  198. +130 −0 wader/common/sim.py
  199. +151 −0 wader/common/sms.py
  200. +205 −0 wader/common/startup.py
  201. +22 −0 wader/common/statem/__init__.py
  202. +219 −0 wader/common/statem/auth.py
  203. +286 −0 wader/common/statem/networkreg.py
  204. +153 −0 wader/common/statem/simple.py
  205. +156 −0 wader/common/utils.py
  206. 0 wader/contrib/__init__.py
  207. +607 −0 wader/contrib/aes.py
  208. +67 −0 wader/contrib/ifconfig.py
  209. +131 −0 wader/contrib/tail.py
  210. +26 −0 wader/plugins/__init__.py
  211. +19 −0 wader/test/__init__.py
  212. +49 −0 wader/test/test_aterrors.py
  213. +248 −0 wader/test/test_command.py
  214. +681 −0 wader/test/test_dbus.py
  215. +156 −0 wader/test/test_dialer.py
  216. +46 −0 wader/test/test_encoding.py
  217. +33 −0 wader/test/test_netspeed.py
  218. +57 −0 wader/test/test_persistent.py
  219. +428 −0 wader/test/test_simprotocol.py
  220. +114 −0 wader/test/test_utils.py
215 CHANGELOG
@@ -0,0 +1,215 @@
+=======================================
+Wader-0.3.6
+Overview of changes since Wader-0.3.5.2
+=======================================
+
+This is a new minor stable release of Wader. List of changes:
+
+* wader-core
+ * DNS update mechanisms have been harmonized, see #154. On Ubuntu
+ hardy, wader-core does not depend on resolvconf anymore as it
+ causes conflicts with the stock NetworkManager.
+ * New device supported: Novatel MC990D
+ * Start and restart scripts merged into one: wader-core-ctl
+
+* wader-gtk
+ * Fix PUK/PUK2 handling, see #148
+ * Make sure profiles work with GConf-DBus, see #144
+
+* wader-doc
+ * Documentation migrated to Sphinx and revised
+ * wader-doc is no longer built by default, thus saving us from
+ maintaining many, buggy, dependencies.
+
+=====================================
+Wader-0.3.5.2
+Overview of changes since Wader-0.3.5
+=====================================
+
+This is a new nano stable release of Wader. wader-0.3.5.1 was quickly
+replaced by wader-0.3.5.2 as it didn't built on hardy. List of changes:
+
+* wader-core
+ * Some HSO bugs introduced in 0.3.{4,5} have been fixed. This is what
+ you get when you don't test a release with every supported device.
+ * Do not execute set_network_type if network_type is None
+ * wader._version allows nano releases
+ * wader-core depends on resolvconf as its not included by default
+ on Hardy.
+
+* wader-gtk
+ * Handle NoKeyringDaemonError exceptions, not finished. #149
+
+=====================================
+Wader-0.3.5
+Overview of changes since Wader-0.3.4
+=====================================
+
+This is a new minor stable release of Wader. List of changes:
+
+* wader-core
+ * DBusDevicePlugin merged into DevicePlugin
+ * Separate better the ModemManager and Wader exceptions
+ * get_radio_status return value fixed
+ * Some fixes for hotplugging events
+ * Huawei:
+ * get_driver_name fixed for Nozomi
+ * use HuaweiE620's cmd_dict rather than Huawei's
+ * Handle ^MODE: 0,2 in Huawei
+ * Handle error in ^CURC=1 command
+ * Do not use os.system but subprocess.call instead
+ * Set a registering lock to avoid multiple attempts of registration
+ * Add the U1900 band
+ * org.freedesktop.ModemManager.Modem.Simple interface implemented
+ (and untested)
+ * Device creation time has been reduced
+ * Fix "undefined reference to ser" while probing ports
+ * Unused stuff removed
+
+* wader-gtk
+ * Many profiles bugs fixed
+ * Only ask for profile when self.profile is None
+ * Add Ctrl+Q accelerator to log window
+ * Stop throbber if device is not present
+ * Remove standard gtk symbols from translation
+
+=====================================
+Wader-0.3.4
+Overview of changes since Wader-0.3.3
+=====================================
+
+This is a new minor stable release of Wader. List of changes:
+
+* wader-core
+ * WVDIAL: Use either the 'Connected' string or the DNS info to ack that we are
+ connected.
+ * Get rid of python-axiom
+* wader-gtk
+ * Handle gracefully errors in SetBand and SetConnectionMode
+ * Use translated strings for mode changes
+
+=====================================
+Wader-0.3.3
+Overview of changes since Wader-0.3.2
+=====================================
+
+This is a new minor stable release of Wader. List of changes:
+
+* wader-core
+ * Fix initialization routine so it bails with cards that insist on
+ replying SimBusy to +CPBR=? commands. Next time is necessary will be
+ requested again and will succeed.
+ * Use PDP context in HSO dialer
+ * Only enable/disable radio if necessary
+ * Some wvdial fixes make it more robust
+ * CLeanup CGMM response if echo was enabled
+ * Some ZTE love
+ * Fix dialup with Option GTM378, it must use the hso dialer.
+ * Better responsiveness in network registration state machine
+ * Many, many bug fixes.
+
+* wader-gtk
+ * only enable PIN/PUK if what user entered is meaningful
+ * new wader icon
+ * make sure bytes are resetted
+
+=====================================
+Wader-0.3.2
+Overview of changes since Wader-0.3.1
+=====================================
+
+This is a new minor stable release of Wader. List of changes:
+
+* wader-core
+ * NetworkManager compatibility has been temporally disabled, our
+ three target distros ship with different snapshots of NM/MM and
+ they don't include some later patches required for compatibility.
+ See [0] for more info. This has the downside of firefox not realizing
+ that we are connected and it will insist on that we are disconnected. A
+ simple workaround is to check the "Work offline" checkbox in "File".
+ * New device added (untested): ZTE MF632
+ * NMPPPDDialer now listens to PropertyChanged signals
+ * Make sure dialers are unexported upon unsuccessful connection attempt.
+ * wader-core now depends on ozerocdoff.
+ * Many, many bug fixes.
+
+* wader-gtk
+ * Problems with unsigned ints and some DNS have been fixed.
+ * Get rid of GtkSpinButton warning.
+ * Handle gracefully unsucessful connection attempts [1].
+ * Do not allow Set{Band,ConnectionMode} if we are connected.
+
+[0] http://trac.warp.es/wader/ticket/133
+[1] http://trac.warp.es/wader/ticket/132
+
+=====================================
+Wader-0.3.1
+Overview of changes since Wader-0.3.0
+=====================================
+
+This is a new minor stable release of Wader. List of changes:
+
+* wader-core
+ * Really restart the core upon upgrade (Debian/Ubuntu only)
+ * Plugins are only included once and at /usr/share/wader/plugins. An
+ upgrade routine has been added to ensure a smooth transition.
+ * wader-core now mimics the udis that ModemManager uses to export devices.
+ * wader-core enables/disables radio too now (+CFUN=0,1)
+ * Use o.fd.MM.Modem rather than o.fd.ModemManager for properties
+ * OS detection has been improved by not relying on lsb_release
+ * wader-core runs on python2.6
+ * wader-core now depends on python-messaging. A joint project between
+ Warp (Wader) & OpenShine (MobileManager) to create a solid SMS
+ encoding/decoding library.
+ * New models supported: Huawei E169, Huawei E180
+ * o.fd.DBus.Properties.GetAll implemented
+
+* wader-gtk
+ * The UI has been gettex'd and there are Spanish and French translations
+ * The SMS/Contacts UI has been polished and some interesting
+ new features have been added:
+ * Support for multipart SMS (only sending for now)
+ * Support for categories (Inbox, Drafts and Sent for now)
+ * Support for storing SMS and sending it from SIM
+ * Support for searching contacts
+ * Support for searching SMS (not enabled unless pygtk >= 2.14.0
+ because of a bug on set_visible_func)
+ * A throbber is shown for every potentially long (IO) operations
+ * Log window now updates the log every second
+ * .desktop added for supported RPM systems
+ * Copyright changed to 'Wader contributors'
+ * Many, many bugs fixed
+
+* doc
+ * User tutorial added
+
+
+=====================================
+Wader-0.3.0
+Overview of changes since Wader-0.2.X
+=====================================
+
+This is a new major stable release of Wader. List of changes:
+
+* wader-core
+ * Wader is the first project that implements the ModemManager API
+ apart from MM itself. It implements the whole MM API except for
+ the new Ericsson's MBM devices (introduced late in the MM
+ development cycle, will support them as soon as we get our hands
+ in one of them). For more info check out[0].
+ * Wader ditches the session bus and works exclusively on the system bus.
+ * Dialup support for system with NM 0.6.X, NM0.7 and NM0.7.X.
+ * Multiple active devices.
+ * Wader doesn't depends on hsolink any more.
+ * New devices supported: Option Icon 401, Huawei EM730V, Huawei K3520,
+ ZTE K3520 and ZTE K3565.
+ * Initial support for OSX. No dialup, no UI, only DBus functionality.
+
+* wader-gtk
+ * Wader now uses gconf to store all its config settings.
+ * Initial support for SMS/Contacts. The UI is not that great, it will
+ be improved in next release.
+
+[0] http://trac.warp.es/wader/wiki/WhatsModemManager
+
+
278 LICENSE
@@ -0,0 +1,278 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
95 README
@@ -0,0 +1,95 @@
+Wader is a 3G daemon accessible via DBus, written in Python and released
+under the GPLv2. Wader runs on Linux and OSX.
+
+Wader's target audience are developers. If you would like your application to
+interact with a UMTS device, such as a mobile data card or a mobile phone,
+then stop searching! Features:
+
+ * Built upon modern technologies such as dbus and hal
+ * Service invoked via DBus
+ * A single process handles n devices
+ * Dialup via NM 0.7+ (if present) or Wvdial on systems with NM < 0.7
+ * Extensible AT Engine
+ * Pluggable support for devices: Adding support for a new device is
+ usually a matter of copying an skeleton, changing the device IDs and
+ dropping the plugin in /usr/share/wader-core/plugins
+ * A python shell to interact with the device in runtime
+
+History
+
+Wader is a fork of the core of Vodafone Mobile Connect Card driver for Linux[0]
+
+Some of its parts have been completely rewritten and the most juicy bits have
+been exported over DBus to allow other applications of the Linux desktop to
+use Wader. Wader is the first project (apart from ModemManager itself) that
+implements ModemManager's API[1]. This means that NetworkManager 0.7.X/0.8
+will be able to use wader-core to perform operations on devices.
+
+Supported devices
+
+ * Huawei E170/E172
+ * Huawei E620/E660/E660a
+ * Huawei E220
+ * Huawei E270/E272
+ * Huawei E870
+ * Huawei EM730V
+ * Huawei K3520
+ * Option Nozomi, Etna
+ * Option Icon 225
+ * Option Icon 401
+ * Novatel Ovation
+
+Devices that are known to work although we haven't tested:
+
+ * Huawei E169
+ * Huawei E180
+ * Novatel U630 (plugin written by Pablo Marti with help from Andrew Gee)
+ * Novatel U740 (plugin written by Adam King)
+ * Novatel EU740
+ * Novatel XU870
+ * Option Colt (It's recommended to disable PIN, it has a rather buggy fw)
+ * Option GlobeSurfer? Icon (plugin contributed by Simone Tolotti)
+ * Option GT Fusion (plugin contributed by Stefano Rivera)
+ * Option GT Fusion Quad Lite (plugin contributed by Stefano Rivera)
+ * Option GT M 378
+ * Option GT Max 3.6 (plugin contributed by kgb0y)
+ * SierraWireless 850, 875
+ * ZTE MF620
+ * ZTE K3520, K3565
+
+This software should work (in theory) with any device that follows the relevant GSM and 3G specs. Nonetheless, every device is different and it may not work in an untested device. Try it at your own risk. If you speak Python and feel adventurous you could get involved by supporting a new device/distro.
+SVN access
+
+Project SVN:
+
+svn co http://pubsvn.warp.es/wader/node/core/trunk wader-core-trunk-ro
+
+Contact the developers if you want commit access
+
+
+LICENSE
+
+Wader is distributed under the GPLv2. See the LICENSE file for the gory
+details.
+
+FAQ
+
+0 .- Wader fails horribly with my OS
+
+ Wader has been tested on the following distros:
+ - Ubuntu 8.04+
+ - OpenSUSE 11+
+ - Fedora 10+
+
+ You can find instructions of how to add a new OS/Distro in the doc.
+
+1 .- Wader fails horribly with my device
+
+ Chances are that your device is a cousin of one of our supported devices.
+ Adding support for a new device is relatively easy (as long as it behaves),
+ you can find instructions of how to add a new device in the doc.
+
+
+[0] https://forge.vodafonebetavine.net/projects/vodafonemobilec/
+[1] http://trac.warp.es/wader/wiki/WhatsModemManager
+
41 bin/wader-core-ctl
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+
+import os
+from optparse import OptionParser
+import sys
+
+from wader.common.consts import APP_VERSION, LOG_PATH, DATA_DIR, PID_PATH
+
+from twisted.python.release import sh
+
+parser = OptionParser()
+parser.add_option ("-v", "--version", action="store_true",
+ dest="show_version", default=False,
+ help="Show version and exit")
+parser.add_option ("-r", "--restart", action="store_true",
+ dest="should_restart", default=False,
+ help="Restart wader-core")
+parser.add_option ("-s", "--start", action="store_true",
+ dest="should_start", default=True,
+ help="Start wader-core")
+
+options, args = parser.parse_args()
+
+if options.show_version:
+ print "%s: version %s" % (os.path.basename(sys.argv[0]), APP_VERSION)
+ sys.exit(0)
+
+if options.should_restart:
+ if os.path.exists('/var/run/wader.pid'):
+ sh("kill -9 `cat /var/run/wader.pid`")
+
+ sh("dbus-send --system --dest=org.freedesktop.ModemManager /org/freedesktop/ModemManager org.freedesktop.ModemManager.EnumerateDevices")
+
+elif options.should_start:
+ if os.path.exists('/tmp/wader.err'):
+ sh("rm -f /tmp/wader.err")
+
+ tap_path = os.path.join(DATA_DIR, 'core-tap.py')
+ sh("/usr/bin/twistd --nodaemon --python=%s --logfile=%s "
+ "--pidfile=%s --reactor=glib2 2> /tmp/wader.err" % (tap_path, LOG_PATH, PID_PATH))
+
5 bin/wader-resolvconf-helper
@@ -0,0 +1,5 @@
+#!/bin/bash
+# Debian/Ubuntu only helper for setting resolvconf info
+# twisted's getProcessValue never returned with this command :?
+/sbin/resolvconf -a $1 < $2
+exit 0
16 contrib/osxserialports/PKG-INFO
@@ -0,0 +1,16 @@
+Metadata-Version: 1.0
+Name: MacOS_X_SerialPorts
+Version: 0.2
+Summary: An extension for detecting available serial modems on MacOS X.
+Home-page: http://www.wader-project.org/
+Author: Pablo Marti
+Author-email: pmarti@warp.es
+License: GNU GPL
+Description: An extension for MacOS X
+
+ It allows you to detect all serial modems on OSX.
+
+ Based on Pascal Oberndoerfer's osxserialports module,
+ placed on the public domain.
+
+Platform: MacOS
200 contrib/osxserialports/osxserialportsmodule.c
@@ -0,0 +1,200 @@
+#include <Python.h>
+
+#include <sysexits.h>
+#include <sys/param.h>
+
+#include <CoreFoundation/CoreFoundation.h>
+
+#include <IOKit/IOKitLib.h>
+#include <IOKit/serial/IOSerialKeys.h>
+#include <IOKit/IOBSD.h>
+
+static PyObject * GetModemList(io_iterator_t serialPortIterator);
+static kern_return_t FindModems(io_iterator_t *matchingServices);
+static PyObject * osxserialports_modems(PyObject *self, PyObject *args);
+
+static PyObject *
+GetModemList(io_iterator_t serialPortIterator)
+{
+ io_object_t deviceService;
+ int maxPathSize = MAXPATHLEN;
+
+ PyObject *ret = Py_BuildValue("[]");
+
+ /* Iterate across all devices found. */
+
+ while ((deviceService = IOIteratorNext(serialPortIterator)))
+ {
+ CFTypeRef bsdIOTTYDeviceAsCFString;
+ CFTypeRef bsdIOTTYBaseNameAsCFString;
+ CFTypeRef bsdIOTTYSuffixAsCFString;
+ CFTypeRef bsdCalloutPathAsCFString;
+ CFTypeRef bsdDialinPathAsCFString;
+
+ Boolean result;
+
+ char name[MAXPATHLEN]; /* MAXPATHLEN = 1024 */
+ char base[MAXPATHLEN];
+ char suffix[MAXPATHLEN];
+ char callout[MAXPATHLEN];
+ char dialin[MAXPATHLEN];
+
+ PyObject *d;
+
+ bsdIOTTYDeviceAsCFString = IORegistryEntryCreateCFProperty(deviceService,
+ CFSTR(kIOTTYDeviceKey),
+ kCFAllocatorDefault,
+ 0);
+ bsdIOTTYBaseNameAsCFString = IORegistryEntryCreateCFProperty(deviceService,
+ CFSTR(kIOTTYBaseNameKey),
+ kCFAllocatorDefault,
+ 0);
+ bsdIOTTYSuffixAsCFString = IORegistryEntryCreateCFProperty(deviceService,
+ CFSTR(kIOTTYSuffixKey),
+ kCFAllocatorDefault,
+ 0);
+ bsdCalloutPathAsCFString = IORegistryEntryCreateCFProperty(deviceService,
+ CFSTR(kIOCalloutDeviceKey),
+ kCFAllocatorDefault,
+ 0);
+ bsdDialinPathAsCFString = IORegistryEntryCreateCFProperty(deviceService,
+ CFSTR(kIODialinDeviceKey),
+ kCFAllocatorDefault,
+ 0);
+
+ if (bsdIOTTYDeviceAsCFString)
+ {
+ result = CFStringGetCString(bsdIOTTYDeviceAsCFString,
+ name,
+ maxPathSize,
+ kCFStringEncodingASCII);
+ CFRelease(bsdIOTTYDeviceAsCFString);
+ }
+
+ if (bsdIOTTYBaseNameAsCFString)
+ {
+ result = CFStringGetCString(bsdIOTTYBaseNameAsCFString,
+ base,
+ maxPathSize,
+ kCFStringEncodingASCII);
+ CFRelease(bsdIOTTYBaseNameAsCFString);
+ }
+
+ if (bsdIOTTYSuffixAsCFString)
+ {
+ result = CFStringGetCString(bsdIOTTYSuffixAsCFString,
+ suffix,
+ maxPathSize,
+ kCFStringEncodingASCII);
+ CFRelease(bsdIOTTYSuffixAsCFString);
+ }
+
+ if (bsdCalloutPathAsCFString)
+ {
+ result = CFStringGetCString(bsdCalloutPathAsCFString,
+ callout,
+ maxPathSize,
+ kCFStringEncodingASCII);
+ CFRelease(bsdCalloutPathAsCFString);
+ }
+
+ if (bsdDialinPathAsCFString)
+ {
+ result = CFStringGetCString(bsdDialinPathAsCFString,
+ dialin,
+ maxPathSize,
+ kCFStringEncodingASCII);
+ CFRelease(bsdDialinPathAsCFString);
+ }
+
+ d = Py_BuildValue("{s:s,s:s,s:s,s:s,s:s}",
+ "name", name,
+ "base", base,
+ "suffix", suffix,
+ "callout", callout,
+ "dialin", dialin);
+
+ if (PyList_Append(ret, d)) {
+ Py_DECREF(d);
+ goto error;
+ } else {
+ Py_DECREF(d);
+ }
+ }
+
+error:
+ /* Release the io_service_t now that we are done with it. */
+ (void) IOObjectRelease(deviceService);
+ return ret;
+}
+
+static kern_return_t
+FindModems(io_iterator_t *matchingServices)
+{
+ kern_return_t kernResult;
+ mach_port_t masterPort;
+ CFMutableDictionaryRef classesToMatch;
+
+ kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort);
+ if (KERN_SUCCESS != kernResult)
+ {
+ /* printf("IOMasterPort returned %d\n", kernResult); */
+ goto exit;
+ }
+
+ classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue);
+ if (classesToMatch != NULL)
+ {
+ CFDictionarySetValue(classesToMatch,
+ CFSTR(kIOSerialBSDTypeKey),
+ CFSTR(kIOSerialBSDModemType));
+ }
+
+ kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch, matchingServices);
+ if (KERN_SUCCESS != kernResult)
+ {
+ /* printf("IOServiceGetMatchingServices returned %d\n", kernResult); */
+ goto exit;
+ }
+
+exit:
+ return kernResult;
+}
+
+static PyObject *
+osxserialports_modems(PyObject *self, PyObject *args)
+{
+ kern_return_t kernResult;
+ io_iterator_t serialPortIterator;
+ PyObject *ret = NULL;
+
+ char *argstring;
+
+ if (!PyArg_ParseTuple(args, "", &argstring)) /* No arguments */
+ return NULL;
+
+ kernResult = FindModems(&serialPortIterator);
+ ret = GetModemList(serialPortIterator);
+
+ IOObjectRelease(serialPortIterator); /* Release the iterator. */
+ if (EX_OK != kernResult) {
+ Py_XDECREF(ret);
+ return NULL;
+ } else {
+ return ret;
+ }
+}
+
+static PyMethodDef
+osxserialportsMethods[] = {
+ {"modems", osxserialports_modems, METH_VARARGS,
+ "List all serial port modems available on MacOS X."},
+ {NULL, NULL, 0, NULL} /* Sentinel */
+};
+
+void
+initosxserialports(void)
+{
+ (void) Py_InitModule("osxserialports", osxserialportsMethods);
+}
+
43 core-tap.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2006-2008 Vodafone España, S.A.
+# Copyright (C) 2008-2009 Warp Networks, S.L.
+# Author: Pablo Martí
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+"""tap file for Wader"""
+
+import locale
+# i10n stuff
+locale.setlocale(locale.LC_ALL, '')
+
+from wader.common.consts import APP_NAME
+from wader.common.startup import (create_skeleton_and_do_initial_setup,
+ get_wader_application)
+# it will just return if its not necessary
+create_skeleton_and_do_initial_setup()
+
+# access osobj singleton
+from wader.common.oal import osobj
+if osobj is None:
+ message = 'OS/Distro not registered'
+ details = """
+The OS/Distro under which you are running %s
+is not registered in the OS database. Check the documentation for what
+you can do in order to support your OS/Distro
+""" % APP_NAME
+ raise SystemExit("%s\n%s" % (message, details))
+
+application = get_wader_application()
+
69 debian/changelog
@@ -0,0 +1,69 @@
+wader-core (0.3.6-1) jaunty; urgency=low
+
+ * New upstream version
+
+ -- Pablo Martí Gamboa <pmarti@warp.es> Tue, 05 May 2009 15:50:31 +0200
+
+wader (0.3.5) intrepid; urgency=low
+
+ * New upstream version
+
+ -- Pablo Martí Gamboa <pmarti@warp.es> Mon, 15 Apr 2009 16:09:11 +0100
+
+wader (0.3.4) intrepid; urgency=low
+
+ * New upstream version
+
+ -- Pablo Martí Gamboa <pmarti@warp.es> Tue, 3 Mar 2009 16:52:21 +0100
+
+wader (0.3.3) intrepid; urgency=low
+
+ * New upstream version
+
+ -- Pablo Martí Gamboa <pmarti@warp.es> Mon, 23 Feb 2009 12:11:29 +0100
+
+wader (0.3.2) intrepid; urgency=low
+
+ * New upstream version
+
+ -- Pablo Martí Gamboa <pmarti@warp.es> Thu, 13 Feb 2009 12:01:11 +0100
+
+wader (0.3.1) hardy; urgency=low
+
+ * New upstream version
+
+ -- Pablo Martí Gamboa <pmarti@warp.es> Mon, 02 Feb 2009 16:59:13 +0100
+
+wader (0.3.0) hardy; urgency=low
+
+ * New upstream version
+
+ -- Pablo Martí Gamboa <pmarti@warp.es> Mon, 1 Dec 2008 12:36:58 +0100
+
+wader (0.2.2-1) hardy; urgency=low
+
+ * New upstream version
+
+ -- Pablo Martí Gamboa <pmarti@warp.es> Thu, 17 Jul 2008 18:12:21 +0200
+
+wader (0.2.1-1) hardy; urgency=low
+
+ * New upstream version
+ * Do not include restart-wader-core twice
+
+ -- Pablo Martí Gamboa <pmarti@warp.es> Thu, 17 Jul 2008 17:17:48 +0200
+
+
+wader (0.2.0-1) hardy; urgency=low
+
+ * New upstream version
+
+ -- Pablo Martí Gamboa <pmarti@warp.es> Thu, 17 Jul 2008 15:31:48 +0200
+
+
+wader (0.1.0-1) hardy; urgency=low
+
+ * Initial Release
+ * Renamed to wader
+
+ -- <pmarti@warp.es> Fri, 04 Jul 2008 10:38:41 +0100
1 debian/compat
@@ -0,0 +1 @@
+4
23 debian/control
@@ -0,0 +1,23 @@
+Source: wader-core
+Section: net
+Priority: optional
+Maintainer: Pablo Marti Gamboa <pmarti@warp.es>
+Build-Depends: debhelper (>= 5)
+Build-Depends-Indep: python-central (>= 0.5), python-setuptools, python-dbus, python-twisted-core
+Standards-Version: 3.8.0
+Homepage: http://www.wader-project.org
+XS-Python-Version: current
+
+Package: wader-core
+Architecture: all
+Replaces: wader-core, vmc-core
+Depends: ${python:Depends}, python-twisted-core, python-serial, python-dbus, python-tz, python-messaging, python-epsilon, wvdial, usb-modeswitch, ozerocdoff, resolvconf, eject
+Recommends: python-twisted-conch
+Conflicts: modem-manager
+XB-Python-Version: ${python:Versions}
+Description: Internet connection assistant for mobile devices.
+ Wader is a tool that manages 3G devices and mobile phones offering a dbus
+ interface so other applications can use its services as connecting to the
+ Internet, sending SMS, managing contacts, and such. This is the core
+ package.
+ .
15 debian/copyright
@@ -0,0 +1,15 @@
+Copyright 2006-2008, Vodafone España S.A.
+Copyright 2008-2009, Warp Networks S.L.
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License with your
+Debian GNU system, in /usr/share/common-licenses/GPL. If not, write to the
+Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+02110-1301, USA.
44 debian/rules
@@ -0,0 +1,44 @@
+#!/usr/bin/make -f
+export DH_VERBOSE=1
+
+build: build-stamp
+
+build-stamp:
+ dh_testdir
+ python setup.py build
+ touch build-stamp
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp
+ rm -rf build
+ -find . -name '*.py[co]' | xargs rm -f
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+ python setup.py install --root $(CURDIR)/debian/wader-core
+ DH_PYCENTRAL=nomove dh_pycentral
+ dh_install
+
+# Build architecture-independent files here.
+binary-indep: build install
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs CHANGELOG
+ dh_installdocs README
+ dh_compress -X.py
+ dh_fixperms
+ dh_installdeb
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+# Build architecture-dependent files here.
+binary-arch: build install
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
8 debian/wader-core-restart-required.update-notifier
@@ -0,0 +1,8 @@
+Name: wader-core restart required
+Priority: High
+Terminal: False
+DontShowAfterReboot: True
+DisplayIf: ps aux | grep wader | grep twistd
+Command: gksudo /usr/bin/wader-core-ctl --restart
+Description: Wader has been upgraded (or reinstalled) and must be restarted.
+ Please press the command button in order to stop Wader.
2 debian/wader-core.install
@@ -0,0 +1,2 @@
+debian/wader-core-restart-required.update-notifier /usr/share/wader-core/
+bin/wader-resolvconf-helper /usr/bin/
77 debian/wader-core.postinst
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+set -e
+
+UPDATENOTIFIERDIR=/var/lib/update-notifier/user.d
+LIBDIR=/usr/share/wader-core
+UPDATENOTIFIERTOUCH=/var/lib/update-notifier/dpkg-run-stamp
+
+fix_peers()
+{
+ if [ -e /etc/ppp/peers ];then
+ chown -R :dialout /etc/ppp/peers
+ chmod -R g+w /etc/ppp/peers
+ fi
+}
+
+fix_pap()
+{
+ if [ -e /etc/ppp/pap-secrets ]; then
+ chown :dialout /etc/ppp/pap-secrets
+ chmod g+rw /etc/ppp/pap-secrets
+ fi
+}
+
+fix_chap()
+{
+ if [ -e /etc/ppp/chap-secrets ]; then
+ chown :dialout /etc/ppp/chap-secrets
+ chmod g+rw /etc/ppp/chap-secrets
+ fi
+}
+
+show_update()
+{
+ if [ -d $UPDATENOTIFIERDIR ] ; then
+ if [ `ps aux | grep wader | grep twistd | wc -l` -ne 0 ] ; then
+ cp -f $LIBDIR/wader-core-restart-required.update-notifier \
+ $UPDATENOTIFIERDIR/wader-core-restart-required
+ # if we don't do this touch it wont work
+ touch $UPDATENOTIFIERTOUCH
+ else
+ rm -f $UPDATENOTIFIERDIR/wader-core-restart-required
+ fi
+ fi
+}
+
+reload_udev_rules()
+{
+ if [ ! -x /sbin/udevcontrol ] ; then
+ /sbin/udevadm control --reload-rules
+ else
+ /sbin/udevcontrol reload_rules
+ fi
+}
+
+clear_plugin_cache()
+{
+ rm -rf /usr/share/wader-core/plugins/dropin.cache
+ python -c "from twisted.plugin import IPlugin, getPlugins;import wader.plugins; list(getPlugins(IPlugin, package=wader.plugins))"
+}
+
+case "$1" in
+ (configure)
+ fix_peers
+ fix_pap
+ fix_chap
+ kill -HUP `cat /var/run/dbus/pid`
+ [ -n "$2" ] && clear_plugin_cache && show_update
+ ;;
+esac
+
+reload_udev_rules
+
+exit 0
+
+#DEBHELPER#
+
11 debian/wader-core.postrm
@@ -0,0 +1,11 @@
+#!/bin/sh -e
+
+case "$1" in
+ (remove)
+ if [ -e /var/run/wader.pid ]; then
+ kill -9 `cat /var/run/wader.pid` 2>/dev/null || true
+ fi
+ ;;
+esac
+
+#DEBHELPER#
15 debian/wader-core.preinst
@@ -0,0 +1,15 @@
+#!/bin/sh -e
+
+case "$1" in
+ (upgrade)
+ # kill wader
+ kill -9 `cat /var/run/wader.pid` 2>/dev/null || true
+ # clean up
+ rm /var/run/wader.pid 2>/dev/null || true
+ # remove traces of old dir
+ if [ -d /usr/share/wader ]; then
+ rm -rf /usr/share/wader
+ fi
+esac
+
+#DEBHELPER#
22 debian/wader-core.prerm
@@ -0,0 +1,22 @@
+#!/bin/sh -e
+
+case "$1" in
+ (remove)
+ rm -rf /usr/share/wader-core/plugins/dropin.cache
+ rm -rf /usr/share/wader-core/plugins
+ rm -rf /usr/share/wader-core/.setup-done
+ if [ -d /usr/local/lib/python2.6/dist-packages/wader ]; then
+ find /usr/local/lib/python2.6/dist-packages/wader -name "*.pyc" 2>/dev/null | xargs rm -rf
+ fi
+ if [ -d /usr/lib/python2.5/site-packages/wader ]; then
+ find /usr/lib/python2.5/site-packages/wader -name "*.pyc" 2>/dev/null | xargs rm -rf
+ fi
+ ;;
+ (purge)
+ if [ -e /usr/share/wader-core/networks.db ]; then
+ rm -f /usr/share/wader-core/networks.db
+ fi
+ ;;
+esac
+
+#DEBHELPER#
56 doc/Makefile
@@ -0,0 +1,56 @@
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html htmlhelp latex changes coverage
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " changes to make an overview over all changed/added/deprecated items"
+ @echo " coverage to check documentation coverage for library and C API"
+
+clean:
+ -rm -rf _build/*
+
+html:
+ mkdir -p _build/html _build/doctrees
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html
+ @echo
+ @echo "Build finished. The HTML pages are in _build/html."
+
+latex:
+ mkdir -p _build/latex _build/doctrees
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in _build/latex."
+ @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
+ "run these through (pdf)latex."
+
+htmlhelp:
+ mkdir -p _build/htmlhelp _build/doctrees
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in _build/htmlhelp."
+
+changes:
+ mkdir -p _build/changes _build/doctrees
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes
+ @echo
+ @echo "The overview file is in _build/changes."
+
+coverage:
+ mkdir -p _build/coverage _build/doctrees
+ $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) _build/coverage
+ @echo
+ @echo "Coverage finished; see _build/coverage/python.txt"
+
1 doc/_static/wader.css
@@ -0,0 +1 @@
+@import url(foo.css);
131 doc/conf.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+#
+# Wader documentation build configuration file, created by
+# sphinx-quickstart on Mon Apr 20 09:16:21 2009.
+
+from wader.common.consts import APP_VERSION, APP_NAME
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.coverage']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = []
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'contents'
+
+# General substitutions.
+project = APP_NAME
+copyright = 'The Wader project and contributors'
+
+# The default replacements for |version| and |release|, also used in various
+# other places throughout the built documents.
+#
+# The short X.Y version.
+version = APP_VERSION
+release = version
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+today_fmt = '%d %B, %Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+add_module_names = False
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'trac'
+
+# Sphinx will recurse into subversion configuration folders and try to read
+# any document file within. These should be ignored.
+# Note: exclude_dirnames is new in Sphinx 0.5
+exclude_dirnames = ['.svn', '.git']
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+#html_style = 'wader.css'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+#html_static_path = ["_static"]
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+html_use_smartypants = True
+
+# Content template for the index page.
+#html_index = ''
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+html_additional_pages = {}
+
+# If false, no module index is generated.
+html_use_modindex = True
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+html_copy_source = True
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'Waderdoc'
+
+html_show_sourcelink = True
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+#latex_documents = []
+latex_documents = [
+ ('contents', 'wader.tex', 'Wader Documentation', 'The Wader project', 'manual'),
+]
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+# If this isn't set to True, the LaTex writer can only handle six levels of headers.
+latex_use_parts = True
+
31 doc/contents.rst
@@ -0,0 +1,31 @@
+.. _contents:
+
+=============================
+Wader documentation contents
+=============================
+
+.. toctree::
+ :maxdepth: 2
+
+ user/index
+ devel/index
+ glossary
+
+Indices, glossary and tables
+============================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`glossary`
+* :ref:`search`
+
+
+.. toctree::
+ :hidden:
+ :glob:
+
+ modules/*
+ modules/dialers/*
+ modules/hardware/*
+ modules/oses/*
+
151 doc/devel/add-new-device.rst
@@ -0,0 +1,151 @@
+===================================
+How to add support for a new device
+===================================
+
+How to support a new device
+===========================
+
+All devices should inherit from :class:`~wader.common.middleware.WCDMAWrapper`
+in order to override its base methods. It accepts two argument for
+its constructor, an instance or subclass of
+:class:`~wader.common.plugin.DevicePlugin` and the udi of the device to use.
+
+A DevicePlugin contains all the necessary information to speak with
+the device: a data port, a control port (if exists), a baudrate, etc.
+It also has the following attributes and members that you can
+customise for your device plugin:
+
+- ``custom``: An instance or subclass of
+ :class:`wader.common.hardware.base.WCDMACustomizer`. See bellow.
+- ``sim_klass``: An instance or subclass of
+ :class:`wader.common.sim.SIMBaseClass`.
+- ``baudrate``: At what speed are we going to talk with this device
+ (default 115200).
+- ``__remote_name__``: As some devices share the same vendor and product ids,
+ we will issue an `AT+GMR` command right at the beginning to find out the
+ real device model. Set this attribute to whatever your device replies to the
+ `AT+GMR` command.
+- ``mapping``: A dictionary that, when is not empty, means that that
+ particular combination of vendor and product ids is shared between several
+ models from the same company. As the ids are the same, the only way to
+ differentiate them is issuing an `AT+GMR` command to get the device model.
+ This dict must have an entry for each model and a `default` entry that
+ will be used in cases where we do not know about the card model. For more
+ information about the mapping dictionary, have a look at the module
+ :class:`wader.common.plugins.huawei_exxx`.
+
+The object :class:`wader.common.hardware.base.WCDMACustomizer` acts as a
+container for all the device-specific customizations such as:
+
+- ``wrapper_klass``: Specifies the class that will be used to wrap the
+ `Device` object. Used in situations where the default commands supplied
+ by :class:`wader.common.middleware.WCDMAWrapper` are not enough:
+ (i.e. devices with "interesting" firmwares). Some of its commands may
+ need an special parsing or an specific workaround.
+- ``exporter_klass``: Specifies the class that will export the wrapper
+ methods over :term:`DBus`.
+- State Machines: Each device its a world on its own, and even though they
+ are supposed to support the relevant GSM and 3GPP standards, some devices
+ prefer to differ from them. The `custom` object contains references to
+ the state machines that the device should use, (on situations where it
+ applies, such as with WCDMA devices of course):
+
+ - ``auth_klass``: The state machine used to authenticate against the device,
+ default is :class:`wader.common.statem.auth.AuthStateMachine`.
+ - ``netr_klass``: The state machine used to register on the network, default
+ is :class:`wader.common.statem.networkreg.NetworkRegistrationStateMachine`.
+ - ``simp_klass``: The *simple* state machine specified by
+ :term:`ModemManager` v0.2. This state machine basically comprises the
+ previous two on a single (and simpler) one.
+
+- ``async_regexp``: regular expression object that will match whatever pattern
+ of unsolicited notifications the given device sends us.
+- ``signal_translations``: Dictionary of tuples, each tuple has two members:
+ the first is the signal id and the second is a function that will translate
+ the signal arguments and the signal to the internal representation that Wader
+ uses. You can find some sample code in the
+ :class:`~wader.common.hardware.huawei` module.
+- ``band_dict``: Dictionary with the AT strings necessary to switch the band
+ technology that the device uses. The number of possible bands is limited by
+ the device itself and the modifications that the manufacturer might have done
+ to the device's firmware. The reference band dictionary is in the
+ :class:`~wader.common.hardware` module.
+- ``conn_dict``: Dictionary with 5 items, each one defines the AT string that
+ must be sent to the device in order to configure the connection mode
+ preferences (Gprs only, 3G preferred, any, etc.) This dictionaries can be
+ shared most of the time between different models from the same manufacturer.
+- ``cmd_dict``: Dictionary with information about how each command should be
+ processed. ``cmd_dict`` most of the time will be a shallow copy of the
+ :class:`~wader.common.command` dict with minor modifications about how a
+ particular command is processed on the given device.
+- ``device_capabilities``: List with all the unsolicited notifications that
+ this device will send us. If the device sends us every RSSI change that
+ detects, we don't need to poll manually the device for that information.
+
+
+Overview of a simple DevicePlugin
+=================================
+
+Lets have a look at the NovatelXU870 plugin:
+
+.. literalinclude:: ../../plugins/devices/novatel_xu870.py
+ :lines: 18-
+
+In an ideal world, devices have a unique vendor and product id tuple, they
+conform to the relevant CDMA or WCDMA specs, and that's it. The device is
+identified by its vendor and product ids and double-checked with its
+`__remote_name__` attribute (the response to an `AT+GMR` command).
+This vendor and product id tuple will usually use the `usb` bus, however
+some devices might end up attached to the ``pci`` or `pcmcia` buses. The
+last line in the plugin will create an instance of the plugin in wader's
+plugin system -otherwise it will not be found!.
+
+Overview of a *relatively* simple DevicePlugin
+==============================================
+
+Take for example the HuaweiE620 class:
+
+.. literalinclude:: ../../plugins/devices/huawei_e620.py
+ :lines: 19-
+
+The E620 plugin is identical to the XU870 except one small difference
+regarding the parsing of the `get_roaming_ids` command. The E620 omits
+some information that other devices do output, and the regular expression
+object that parses it has to be updated. We get a new copy of the
+`cmd_dict` dictionary attribute and modify it with the new regexp the
+`get_roaming_ids` entry. The new `cmd_dict` is specified in its
+Customizer object.
+
+Overview of a not so simple DevicePlugin
+========================================
+
+.. literalinclude:: ../../plugins/devices/huawei_e220.py
+ :lines: 19-
+
+Huawei's E220, despite sharing its manufacturer with the E620, has a couple
+of minor differences that deserve some explanation. There's a bug in its
+firmware that will reset the device if you ask its SMSC. The workaround is
+to get once the SMSC before switching to UCS2, you'd be amazed of how long
+took me to discover the fix. The second difference with the E620 is that
+the E220 can have several product_ids, thus its product_id list has two
+elements.
+
+Overview of a complex DevicePlugin
+==================================
+
+.. literalinclude:: ../../plugins/devices/option_colt.py
+ :lines: 24-
+
+This data card is the buggiest card we've found so far, and has proven to be
+an excellent challenge for the extensibility and granularity of our plugin
+system. Basically we've found the following bugs on the card's firmware:
+
+- If PIN authentication is disabled and you issue an `AT+CPIN?`, the card
+ will reply with a `+CPIN: SIM PUK2`.
+- Don't ask me why, but `AT+CPBR=1,250` does not work once the application
+ is running. I have tried replacing the command with an equivalent one
+ (`AT+CPBF=""`) without luck.
+
+So we had to modify the AuthStateMachine for this particular device and its
+`cmd_dict`.
+
40 doc/devel/add-new-os.rst
@@ -0,0 +1,40 @@
+How to add support for a new distro/OS
+======================================
+
+How to add support for a new distro
++++++++++++++++++++++++++++++++++++
+
+Adding support for a new distro is relatively straightforward, it basically
+boils down to:
+
+- Inheriting from :class:`~wader.common.oses.linux.LinuxPlugin`.
+- Implementing the ``is_valid`` method. This will return True if we are in
+ the given OS/Distro and False otherwise. Usually you will just need to
+ check for a well known file that your distro or OS ships with.
+- Implement the ``get_timezone`` method. This method returns a string with
+ the timezone name (i.e. "Europe/Madrid"). Implementing this method is not
+ strictly necessary, and Wader can start up without it, but your SMS dates
+ will probably be off by some hours.
+
+Lets have a look at the Fedora plugin:
+
+.. literalinclude:: ../../plugins/oses/fedora.py
+ :lines: 21-
+
+As we can see, the Fedora plugin just defines ``is_valid`` and provides an
+implementation for ``get_timezone``.
+
+How to add support for a new OS
++++++++++++++++++++++++++++++++
+
+Adding support for a new OS is not as easy as the previous point. You need to
+add a new os class to ``wader.common.oses`` with a working
+implementation for the following methods/objects:
+
+- ``get_iface_stats``: Accepts just one parameter, the iface name, and
+ returns a tuple with tx,rx bytes.
+- ``is_valid``: Returns True if the plugin is valid in the context where is
+ being run, otherwise returns False.
+- ``hw_manager``: A instance of a class that implements the
+ :class:`~wader.common.interfaces.IHardwareManager` interface.
+
BIN doc/devel/images/network_registration.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN doc/devel/images/overview.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
436 doc/devel/images/overview.svg
</
@@ -0,0 +1,436 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45"
+ sodipodi:docbase="/home/huno"
+ sodipodi:docname="drawing.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="true">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.98994949"
+ inkscape:cx="317.88908"
+ inkscape:cy="774.80718"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ inkscape:window-x="0"
+ inkscape:window-y="25">
+ <sodipodi:guide
+ orientation="vertical"
+ position="309.10668"
+ id="guide9002" />
+ <sodipodi:guide
+ orientation="vertical"
+ position="132.85714"
+ id="guide9004" />
+ <sodipodi:guide
+ orientation="vertical"
+ position="323.24881"
+ id="guide9012" />
+ <sodipodi:guide
+ orientation="vertical"
+ position="570.73619"
+ id="guide10027" />
+ <sodipodi:guide
+ orientation="horizontal"
+ position="486.89353"
+ id="guide10052" />
+ <sodipodi:guide
+ orientation="horizontal"
+ position="578.81741"
+ id="guide10080" />
+ <sodipodi:guide
+ orientation="vertical"
+ position="29.294424"
+ id="guide10088" />
+ <sodipodi:guide
+ orientation="horizontal"
+ position="768.72609"
+ id="guide10116" />
+ <sodipodi:guide
+ orientation="horizontal"
+ position="835.39616"
+ id="guide10118" />
+ <sodipodi:guide
+ orientation="horizontal"
+ position="783.87838"
+ id="guide10134" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:#ffc5ff;fill-opacity:1;stroke:#1a1e43;stroke-opacity:1"
+ id="rect2162"
+ width="155.56349"
+ height="50.507629"
+ x="309.78571"
+ y="422.99872" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.69819891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 29.330709,583.07647 L 663.86945,583.07647"
+ id="path3134" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="59.857147"
+ y="596.64789"
+ id="text3136"><tspan
+ sodipodi:role="line"
+ id="tspan3138"
+ x="59.857147"
+ y="596.64789">KERNEL</tspan></text>
+ <rect
+ style="fill:#ffc5ff;fill-opacity:1;stroke:#1a1e43;stroke-width:0.9334414;stroke-opacity:1"
+ id="rect4109"
+ width="135.36609"
+ height="50.574188"
+ x="133.32385"
+ y="422.50388" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="322.49469"
+ y="450.22543"
+ id="text4111"><tspan
+ sodipodi:role="line"
+ id="tspan4113"
+ x="322.49469"
+ y="450.22543">SIMProtocol</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="153.16901"
+ y="449.76385"
+ id="text4115"><tspan
+ sodipodi:role="line"
+ id="tspan4117"
+ x="153.16901"
+ y="449.76385">WVdialProtocol</tspan></text>
+ <rect
+ style="fill:#ffc5ff;fill-opacity:1;stroke:#1a1e43;stroke-width:0.69549614;stroke-opacity:1"
+ id="rect8996"
+ width="155.868"
+ height="24.383562"
+ x="309.63345"
+ y="395.24185" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="322.49469"
+ y="411.12152"
+ id="text8998"><tspan
+ sodipodi:role="line"
+ id="tspan9000"
+ x="322.49469"
+ y="411.12152">SIMCardConnection</tspan></text>
+ <rect
+ style="fill:#ffc5ff;fill-opacity:1;stroke:#1a1e43;stroke-width:0.69549614;stroke-opacity:1"
+ id="rect9006"
+ width="155.868"
+ height="24.383562"
+ x="309.63345"
+ y="366.36533" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="322.49469"
+ y="382.245"
+ id="text9008"><tspan
+ sodipodi:role="line"
+ id="tspan9010"
+ x="322.49469"
+ y="382.245">SIMCardConnWrapper</tspan></text>
+ <rect
+ style="fill:#ffc5ff;fill-opacity:1;stroke:#1a1e43;stroke-width:0.60191429;stroke-opacity:1"
+ id="rect9032"
+ width="41.814342"
+ height="68.078308"
+ x="431.74582"
+ y="-570.06726"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.17309284px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="514.45123"
+ y="440.81641"
+ id="text9034"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9855828,1.0146281)"><tspan
+ sodipodi:role="line"
+ id="tspan9038"
+ x="514.45123"
+ y="440.81641">Hardware</tspan><tspan
+ sodipodi:role="line"
+ id="tspan9040"
+ x="514.45123"
+ y="456.03277">Registry</tspan></text>
+ <rect
+ style="fill:#ffc5ff;fill-opacity:1;stroke:#1a1e43;stroke-width:0.60191429;stroke-opacity:1"
+ id="rect10029"
+ width="41.814342"
+ height="68.078308"
+ x="381.54623"
+ y="-570.06726"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.17309284px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="514.45123"
+ y="391.34058"
+ id="text10031"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9855828,1.0146281)"><tspan
+ sodipodi:role="line"
+ id="tspan10033"
+ x="514.45123"
+ y="391.34058">Device</tspan><tspan
+ sodipodi:role="line"
+ id="tspan10035"
+ x="514.45123"
+ y="406.55694">Listener</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#1a1e43;stroke-width:0.49397013;stroke-opacity:1"
+ id="rect10037"
+ width="22.729387"
+ height="84.348694"
+ x="514.70801"
+ y="-217.45282"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.17309284px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="152.55267"
+ y="522.63611"
+ id="text10039"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9855828,1.0146281)"><tspan
+ sodipodi:role="line"
+ x="152.55267"
+ y="522.63611"
+ id="tspan10041">wvdial</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#1a1e43;stroke-width:0.49397013;stroke-opacity:1"
+ id="rect10045"
+ width="22.729387"
+ height="84.348694"
+ x="542.97192"
+ y="-217.45282"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.17309284px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="151.95828"
+ y="550.49261"
+ id="text10047"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9855828,1.0146281)"><tspan
+ sodipodi:role="line"
+ x="151.95828"
+ y="550.49261"
+ id="tspan10049">pppd</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#1a1e43;stroke-width:1.10875034;stroke-opacity:1"
+ id="rect10054"
+ width="22.114607"
+ height="436.77032"
+ x="484.01538"
+ y="-570.18182"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.17309284px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="335.18134"
+ y="492.08298"
+ id="text10056"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9855828,1.0146281)"><tspan
+ sodipodi:role="line"
+ x="335.18134"
+ y="492.08298"
+ id="tspan10058">twisted</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#1a1e43;stroke-width:0.49397013;stroke-opacity:1"
+ id="rect10060"
+ width="22.729387"
+ height="84.348694"
+ x="541.97192"
+ y="-393.44852"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.17309284px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="316.32355"
+ y="549.50659"
+ id="text10062"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9855828,1.0146281)"><tspan
+ sodipodi:role="line"
+ x="316.32355"
+ y="549.50659"
+ id="tspan10064">python-serial</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#1a1e43;stroke-width:0.49397013;stroke-opacity:1"
+ id="rect10066"
+ width="22.729387"
+ height="84.348694"
+ x="514.22839"
+ y="-570.4892"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.17309284px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="498.57782"
+ y="522.16339"
+ id="text10068"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9855828,1.0146281)"><tspan
+ sodipodi:role="line"
+ x="498.57782"
+ y="522.16339"
+ id="tspan10070">python-dbus</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#1a1e43;stroke-width:0.49397013;stroke-opacity:1"
+ id="rect10072"
+ width="22.729387"
+ height="84.348694"
+ x="542.49231"
+ y="-570.4892"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text