--- /dev/null
+K 25
+svn:wc:ra_dav:version-url
+V 51
+/svn/pc-suite/!svn/ver/650/trunk/tabletsuite/debian
+END
+control
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/pc-suite/!svn/ver/650/trunk/tabletsuite/debian/control
+END
+compat
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/debian/compat
+END
+changelog
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/pc-suite/!svn/ver/649/trunk/tabletsuite/debian/changelog
+END
+copyright
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/debian/copyright
+END
+docs
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/debian/docs
+END
+rules
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/debian/rules
+END
--- /dev/null
+K 13
+svn:mergeinfo
+V 0
+
+END
--- /dev/null
+9
+
+dir
+653
+http://gforge.embedded.ufcg.edu.br/svn/pc-suite/trunk/tabletsuite/debian
+http://gforge.embedded.ufcg.edu.br/svn/pc-suite
+
+
+
+2009-09-29T15:40:22.681741Z
+650
+otacilio
+has-props
+
+svn:special svn:externals svn:needs-lock
+
+
+
+
+
+
+
+
+
+
+
+ccd57667-b161-0410-a082-fa92f2fb3e95
+\f
+control
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+3f11fa51870d30106bcaba2287c59637
+2009-09-29T15:40:22.681741Z
+650
+otacilio
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+397
+\f
+compat
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+84bc3da1b3e33a18e8d5e1bdd7a18d7a
+2009-07-30T18:46:46.398336Z
+495
+otacilio
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2
+\f
+changelog
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+1b9dbce6d0ba853bfec1ac3ed6bb8e2d
+2009-09-28T17:26:29.361774Z
+649
+melunko
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+156
+\f
+copyright
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+dee7a3d70eedde5d9959617122de4083
+2009-07-30T18:46:46.398336Z
+495
+otacilio
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+696
+\f
+docs
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+d41d8cd98f00b204e9800998ecf8427e
+2009-07-30T18:46:46.398336Z
+495
+otacilio
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+\f
+rules
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+bb04c0b837f042492f69dd6a707c39df
+2009-08-04T13:54:03.919326Z
+505
+otacilio
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+169
+\f
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+tablet-suite (0.1) unstable; urgency=low
+
+ * Initial release
+
+ -- Otacilio Freitas de Lacerda <otaciliolacerda@gmail.com> Thu, 30 Jul 2009 13:26:51 -0300
--- /dev/null
+Source: tablet-suite
+Section: python
+Priority: optional
+Maintainer: Otacilio Freitas de Lacerda <otaciliolacerda@gmail.com>
+Build-Depends: cdbs, debhelper (>= 7), python2.6
+Standards-Version: 3.8.0
+
+Package: tablet-suite
+Architecture: all
+Depends: sshfs, python-qt4, python2.6, openssh-client, python-paramiko
+Description: <TabletSuite Alpha>
+ <.
+ This package contains the tablet-suite project.>
--- /dev/null
+This package was debianized by Otacilio Freitas de Lacerda <otacilio@unknown> on
+Thu, 30 Jul 2009 13:26:51 -0300.
+
+It was downloaded from <url://example.com>
+
+Upstream Author(s):
+
+ <put author's name and email here>
+ <likewise for another author>
+
+Copyright:
+
+ <Copyright (C) YYYY Name OfAuthor>
+ <likewise for another author>
+
+License:
+
+ <Put the license of the package here indented by 4 spaces>
+
+The Debian packaging is copyright 2009, Otacilio Freitas de Lacerda <otacilio@unknown> and
+is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
+
+# Please also look if there are files or directories which have a
+# different copyright/license attached and list them here.
--- /dev/null
+#!/usr/bin/make -f
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/python-distutils.mk
+include /usr/share/cdbs/1/rules/simple-patchsys.mk
+
--- /dev/null
+tablet-suite (0.1) unstable; urgency=low
+
+ * Initial release
+
+ -- Otacilio Freitas de Lacerda <otaciliolacerda@gmail.com> Thu, 30 Jul 2009 13:26:51 -0300
--- /dev/null
+Source: tablet-suite
+Section: python
+Priority: optional
+Maintainer: Otacilio Freitas de Lacerda <otaciliolacerda@gmail.com>
+Build-Depends: cdbs, debhelper (>= 7), python2.6
+Standards-Version: 3.8.0
+
+Package: tablet-suite
+Architecture: all
+Depends: sshfs, python-qt4, python2.6, openssh-client, python-paramiko
+Description: <TabletSuite Alpha>
+ <.
+ This package contains the tablet-suite project.>
--- /dev/null
+This package was debianized by Otacilio Freitas de Lacerda <otacilio@unknown> on
+Thu, 30 Jul 2009 13:26:51 -0300.
+
+It was downloaded from <url://example.com>
+
+Upstream Author(s):
+
+ <put author's name and email here>
+ <likewise for another author>
+
+Copyright:
+
+ <Copyright (C) YYYY Name OfAuthor>
+ <likewise for another author>
+
+License:
+
+ <Put the license of the package here indented by 4 spaces>
+
+The Debian packaging is copyright 2009, Otacilio Freitas de Lacerda <otacilio@unknown> and
+is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
+
+# Please also look if there are files or directories which have a
+# different copyright/license attached and list them here.
--- /dev/null
+#!/usr/bin/make -f
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/python-distutils.mk
+include /usr/share/cdbs/1/rules/simple-patchsys.mk
+
--- /dev/null
+K 25
+svn:wc:ra_dav:version-url
+V 50
+/svn/pc-suite/!svn/ver/632/trunk/tabletsuite/fonts
+END
+pf_tempesta_seven.ttf
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/pc-suite/!svn/ver/632/trunk/tabletsuite/fonts/pf_tempesta_seven.ttf
+END
+pf_tempesta_seven_bold.ttf
+K 25
+svn:wc:ra_dav:version-url
+V 77
+/svn/pc-suite/!svn/ver/632/trunk/tabletsuite/fonts/pf_tempesta_seven_bold.ttf
+END
+pf_tempesta_seven_extended.ttf
+K 25
+svn:wc:ra_dav:version-url
+V 81
+/svn/pc-suite/!svn/ver/632/trunk/tabletsuite/fonts/pf_tempesta_seven_extended.ttf
+END
+pf_tempesta_seven_extended_bold.ttf
+K 25
+svn:wc:ra_dav:version-url
+V 86
+/svn/pc-suite/!svn/ver/632/trunk/tabletsuite/fonts/pf_tempesta_seven_extended_bold.ttf
+END
+pf_tempesta_seven_condensed.ttf
+K 25
+svn:wc:ra_dav:version-url
+V 82
+/svn/pc-suite/!svn/ver/632/trunk/tabletsuite/fonts/pf_tempesta_seven_condensed.ttf
+END
+pf_tempesta_seven_condensed_bold.ttf
+K 25
+svn:wc:ra_dav:version-url
+V 87
+/svn/pc-suite/!svn/ver/632/trunk/tabletsuite/fonts/pf_tempesta_seven_condensed_bold.ttf
+END
+BROWA.TTF
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/pc-suite/!svn/ver/632/trunk/tabletsuite/fonts/BROWA.TTF
+END
+pf_tempesta_seven_compressed.ttf
+K 25
+svn:wc:ra_dav:version-url
+V 83
+/svn/pc-suite/!svn/ver/632/trunk/tabletsuite/fonts/pf_tempesta_seven_compressed.ttf
+END
+pf_tempesta_seven_compressed_bold.ttf
+K 25
+svn:wc:ra_dav:version-url
+V 88
+/svn/pc-suite/!svn/ver/632/trunk/tabletsuite/fonts/pf_tempesta_seven_compressed_bold.ttf
+END
--- /dev/null
+9
+
+dir
+653
+http://gforge.embedded.ufcg.edu.br/svn/pc-suite/trunk/tabletsuite/fonts
+http://gforge.embedded.ufcg.edu.br/svn/pc-suite
+
+
+
+2009-09-15T18:22:54.599315Z
+632
+amaury
+
+
+svn:special svn:externals svn:needs-lock
+
+
+
+
+
+
+
+
+
+
+
+ccd57667-b161-0410-a082-fa92f2fb3e95
+\f
+pf_tempesta_seven.ttf
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+9f70908a87757dce7c6e692cd9b6dacb
+2009-09-15T18:22:54.599315Z
+632
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+22176
+\f
+pf_tempesta_seven_bold.ttf
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+31fbb55b275dbdededfc430f50ad9354
+2009-09-15T18:22:54.599315Z
+632
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+21780
+\f
+pf_tempesta_seven_extended.ttf
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+07b0d01caeb4f8a81ae384119e1c182d
+2009-09-15T18:22:54.599315Z
+632
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+22464
+\f
+pf_tempesta_seven_extended_bold.ttf
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+8e2f92fc5a949a2cca42e28d019f5681
+2009-09-15T18:22:54.599315Z
+632
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+22160
+\f
+pf_tempesta_seven_condensed.ttf
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+18f38e87a9c2dfd026026d8922d5ce9e
+2009-09-15T18:22:54.599315Z
+632
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+21616
+\f
+pf_tempesta_seven_condensed_bold.ttf
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+6b38585aac6b3b3a37e218faa4f06ae7
+2009-09-15T18:22:54.599315Z
+632
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+21160
+\f
+BROWA.TTF
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+558e1f7c26d9405ac41942266ebac11d
+2009-09-15T18:22:54.599315Z
+632
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+80392
+\f
+pf_tempesta_seven_compressed.ttf
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+ff7b35bf8a97fbb416e5d475a6cff55f
+2009-09-15T18:22:54.599315Z
+632
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+20396
+\f
+pf_tempesta_seven_compressed_bold.ttf
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+8cc607fb27e7fdc770eea5c45dc9d823
+2009-09-15T18:22:54.599315Z
+632
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+20796
+\f
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 25
+svn:wc:ra_dav:version-url
+V 48
+/svn/pc-suite/!svn/ver/643/trunk/tabletsuite/img
+END
+checkbox_checked.png
+K 25
+svn:wc:ra_dav:version-url
+V 69
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/checkbox_checked.png
+END
+scroll_handle_v.png
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/pc-suite/!svn/ver/610/trunk/tabletsuite/img/scroll_handle_v.png
+END
+scroll_base_h.png
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/pc-suite/!svn/ver/610/trunk/tabletsuite/img/scroll_base_h.png
+END
+ip_list_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 67
+/svn/pc-suite/!svn/ver/591/trunk/tabletsuite/img/ip_list_border.png
+END
+progress_bar_bg.png
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/progress_bar_bg.png
+END
+backup_name_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/backup_name_border.png
+END
+large_arrow_image.png
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/large_arrow_image.png
+END
+small_default_button.png
+K 25
+svn:wc:ra_dav:version-url
+V 73
+/svn/pc-suite/!svn/ver/591/trunk/tabletsuite/img/small_default_button.png
+END
+progress_bar_connecting_bg.png
+K 25
+svn:wc:ra_dav:version-url
+V 79
+/svn/pc-suite/!svn/ver/612/trunk/tabletsuite/img/progress_bar_connecting_bg.png
+END
+scroll_base_v.png
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/pc-suite/!svn/ver/610/trunk/tabletsuite/img/scroll_base_v.png
+END
+progress_bar_chunk.png
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/pc-suite/!svn/ver/609/trunk/tabletsuite/img/progress_bar_chunk.png
+END
+view_bg.png
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/pc-suite/!svn/ver/600/trunk/tabletsuite/img/view_bg.png
+END
+bg_geral0.png
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/bg_geral0.png
+END
+table_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/table_border.png
+END
+bg_geral2.png
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/bg_geral2.png
+END
+progress_bar_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/progress_bar_border.png
+END
+N810_file.png
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/pc-suite/!svn/ver/608/trunk/tabletsuite/img/N810_file.png
+END
+N800.png
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/pc-suite/!svn/ver/608/trunk/tabletsuite/img/N800.png
+END
+small_default_button_clicked.png
+K 25
+svn:wc:ra_dav:version-url
+V 81
+/svn/pc-suite/!svn/ver/591/trunk/tabletsuite/img/small_default_button_clicked.png
+END
+disconnected_backup.png
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/pc-suite/!svn/ver/624/trunk/tabletsuite/img/disconnected_backup.png
+END
+white_arrow.png
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/white_arrow.png
+END
+device_file_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/device_file_border.png
+END
+bg_restore.png
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/bg_restore.png
+END
+icon-ref-restorebackups.png
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/svn/pc-suite/!svn/ver/626/trunk/tabletsuite/img/icon-ref-restorebackups.png
+END
+default_bg.png
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/pc-suite/!svn/ver/610/trunk/tabletsuite/img/default_bg.png
+END
+browse_button.png
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/browse_button.png
+END
+bg_backup0.png
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/bg_backup0.png
+END
+pc_name_border_file.png
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/pc_name_border_file.png
+END
+pc_file_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 67
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/pc_file_border.png
+END
+checkbox_unchecked.png
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/checkbox_unchecked.png
+END
+icon-ref-settings.png
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/svn/pc-suite/!svn/ver/626/trunk/tabletsuite/img/icon-ref-settings.png
+END
+large_arrow_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/large_arrow_border.png
+END
+device_checkbox_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 75
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/device_checkbox_border.png
+END
+device_name_border_checkbox.png
+K 25
+svn:wc:ra_dav:version-url
+V 80
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/device_name_border_checkbox.png
+END
+disconnected.png
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/pc-suite/!svn/ver/608/trunk/tabletsuite/img/disconnected.png
+END
+backup.png
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/pc-suite/!svn/ver/626/trunk/tabletsuite/img/backup.png
+END
+back_arrow_on.png
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/back_arrow_on.png
+END
+view_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/pc-suite/!svn/ver/600/trunk/tabletsuite/img/view_border.png
+END
+icon-alert-ref.png
+K 25
+svn:wc:ra_dav:version-url
+V 67
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/icon-alert-ref.png
+END
+tabletsuite.desktop
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/pc-suite/!svn/ver/643/trunk/tabletsuite/img/tabletsuite.desktop
+END
+N800_backup.png
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/pc-suite/!svn/ver/608/trunk/tabletsuite/img/N800_backup.png
+END
+forward_arrow_on.png
+K 25
+svn:wc:ra_dav:version-url
+V 69
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/forward_arrow_on.png
+END
+N810_backup.png
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/pc-suite/!svn/ver/608/trunk/tabletsuite/img/N810_backup.png
+END
+lista.png
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/lista.png
+END
+bg_backup.png
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/bg_backup.png
+END
+icon-ref-newbackup.png
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/pc-suite/!svn/ver/626/trunk/tabletsuite/img/icon-ref-newbackup.png
+END
+device_backup_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 73
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/device_backup_border.png
+END
+N810.png
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/pc-suite/!svn/ver/608/trunk/tabletsuite/img/N810.png
+END
+arrow.png
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/arrow.png
+END
+device_name_border_file.png
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/device_name_border_file.png
+END
+tab_bg_1.png
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/tab_bg_1.png
+END
+tab_bg_2.png
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/tab_bg_2.png
+END
+progress_bar_chunk_dialog.png
+K 25
+svn:wc:ra_dav:version-url
+V 78
+/svn/pc-suite/!svn/ver/609/trunk/tabletsuite/img/progress_bar_chunk_dialog.png
+END
+tab_bg_3.png
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/tab_bg_3.png
+END
+icon-ref-managebackups.png
+K 25
+svn:wc:ra_dav:version-url
+V 75
+/svn/pc-suite/!svn/ver/626/trunk/tabletsuite/img/icon-ref-managebackups.png
+END
+pc_image.png
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/pc-suite/!svn/ver/614/trunk/tabletsuite/img/pc_image.png
+END
+progress_bar_dialog_bg.png
+K 25
+svn:wc:ra_dav:version-url
+V 75
+/svn/pc-suite/!svn/ver/609/trunk/tabletsuite/img/progress_bar_dialog_bg.png
+END
+device_name_border_backup.png
+K 25
+svn:wc:ra_dav:version-url
+V 78
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/device_name_border_backup.png
+END
+checkbox_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/checkbox_border.png
+END
+button_bg.png
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/button_bg.png
+END
+small_icon-ref-restorebackups.png
+K 25
+svn:wc:ra_dav:version-url
+V 82
+/svn/pc-suite/!svn/ver/626/trunk/tabletsuite/img/small_icon-ref-restorebackups.png
+END
+N800_file.png
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/pc-suite/!svn/ver/608/trunk/tabletsuite/img/N800_file.png
+END
+button_with_icon_bg.png
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/button_with_icon_bg.png
+END
+black_arrow.png
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/black_arrow.png
+END
+small_icon-ref-settings.png
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/svn/pc-suite/!svn/ver/626/trunk/tabletsuite/img/small_icon-ref-settings.png
+END
+memory_bar.png
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/memory_bar.png
+END
+ssh.png
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/ssh.png
+END
+battery_bar.png
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/battery_bar.png
+END
+button_bg_clicked.png
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/button_bg_clicked.png
+END
+bt_next.png
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/bt_next.png
+END
+path_bg.png
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/path_bg.png
+END
+backup_default_button.png
+K 25
+svn:wc:ra_dav:version-url
+V 74
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/backup_default_button.png
+END
+back_arrow_off.png
+K 25
+svn:wc:ra_dav:version-url
+V 67
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/back_arrow_off.png
+END
+button_with_icon_bg_clicked.png
+K 25
+svn:wc:ra_dav:version-url
+V 80
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/button_with_icon_bg_clicked.png
+END
+tabletSuite_logo.png
+K 25
+svn:wc:ra_dav:version-url
+V 69
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/tabletSuite_logo.png
+END
+copy_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/copy_border.png
+END
+small_icon-ref-newbackup.png
+K 25
+svn:wc:ra_dav:version-url
+V 77
+/svn/pc-suite/!svn/ver/626/trunk/tabletsuite/img/small_icon-ref-newbackup.png
+END
+forward_arrow_off.png
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/forward_arrow_off.png
+END
+device_selection_bg.png
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/pc-suite/!svn/ver/600/trunk/tabletsuite/img/device_selection_bg.png
+END
+backup_name_bg.png
+K 25
+svn:wc:ra_dav:version-url
+V 67
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/backup_name_bg.png
+END
+scroll_handle_h.png
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/pc-suite/!svn/ver/610/trunk/tabletsuite/img/scroll_handle_h.png
+END
+bt_next_clicked.png
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/bt_next_clicked.png
+END
+backup_default_button_clicked.png
+K 25
+svn:wc:ra_dav:version-url
+V 82
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/backup_default_button_clicked.png
+END
+bg_manager.png
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/pc-suite/!svn/ver/596/trunk/tabletsuite/img/bg_manager.png
+END
+device_memory.png
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/device_memory.png
+END
+path_border.png
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/img/path_border.png
+END
+small_icon-ref-managebackups.png
+K 25
+svn:wc:ra_dav:version-url
+V 81
+/svn/pc-suite/!svn/ver/626/trunk/tabletsuite/img/small_icon-ref-managebackups.png
+END
--- /dev/null
+K 13
+svn:mergeinfo
+V 0
+
+END
--- /dev/null
+9
+
+dir
+653
+http://gforge.embedded.ufcg.edu.br/svn/pc-suite/trunk/tabletsuite/img
+http://gforge.embedded.ufcg.edu.br/svn/pc-suite
+
+
+
+2009-09-24T18:11:29.733195Z
+643
+otacilio
+has-props
+
+svn:special svn:externals svn:needs-lock
+
+
+
+
+
+
+
+
+
+
+
+ccd57667-b161-0410-a082-fa92f2fb3e95
+\f
+checkbox_checked.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+a01bf9fbe352b626b8e5b3484c9e645e
+2009-08-13T17:08:11.546686Z
+550
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+822
+\f
+scroll_handle_v.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+cfbffd47da519d20e6c645586e1be0fc
+2009-09-09T16:10:10.046818Z
+610
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3103
+\f
+scroll_base_h.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+23e767ca7a1bf2a2158e52837f6e415b
+2009-09-09T16:10:10.046818Z
+610
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+844
+\f
+progress_bar_bg.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+342126781b58ecf007b3faad2568af64
+2009-08-21T18:19:06.773534Z
+573
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3756
+\f
+ip_list_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+eaca0b8358ab0e84df410a39886c9d6f
+2009-09-03T16:03:51.683671Z
+591
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4841
+\f
+backup_name_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+78844d8e12b99fab3f63869565651301
+2009-08-13T19:38:57.115054Z
+551
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3410
+\f
+large_arrow_image.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+2957d2a0847d5844f5a130b40d11271a
+2009-08-13T19:38:57.115054Z
+551
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5609
+\f
+progress_bar_connecting_bg.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+00f570e8e6010180c9bd53f241fae029
+2009-09-10T20:35:15.948790Z
+612
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3699
+\f
+small_default_button.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+13644f0774d460563f934c46e2cd8056
+2009-09-03T16:03:51.683671Z
+591
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3443
+\f
+scroll_base_v.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+3230dc7d26417d0b4d968c9a6f2c71c5
+2009-09-09T16:10:10.046818Z
+610
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3597
+\f
+progress_bar_chunk.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+f9a64d04eb7eae7900af543bedf374be
+2009-09-08T17:01:54.301655Z
+609
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3279
+\f
+bg_geral0.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+91111ff0319924d279c47e55423dec94
+2009-07-28T18:31:05.094742Z
+476
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+79464
+\f
+view_bg.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+6d46d6caa3a6ca58e35094b664a39a6b
+2009-09-03T22:08:31.931352Z
+600
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3281
+\f
+bg_geral2.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+e6e8a6c49810a752be37c0e22f753781
+2009-07-16T17:37:19.503117Z
+437
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+52909
+\f
+table_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+aec2ba53080f3ffa7ee774e73211b8f5
+2009-08-27T10:01:51.549755Z
+577
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4887
+\f
+progress_bar_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+d888d82dcd05b6055888ba810fa25799
+2009-08-21T18:19:06.773534Z
+573
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3273
+\f
+N810_file.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+de0f0760975780acd73d91f857d05426
+2009-09-08T14:59:55.898571Z
+608
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+10288
+\f
+N800.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+8ed3e9ce544ea2f26a4dbd7657122398
+2009-09-08T14:59:55.898571Z
+608
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6231
+\f
+small_default_button_clicked.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+a1fa5275ce8a0ec5e68d25b3e9f02883
+2009-09-03T16:03:51.683671Z
+591
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3579
+\f
+disconnected_backup.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+7414015bc4afd729f9b54b05ea9c04f7
+2009-09-14T19:20:21.821743Z
+624
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+21287
+\f
+white_arrow.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+690dc22ed876c3436a427891a9115362
+2009-07-29T09:45:01.027130Z
+482
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2817
+\f
+device_file_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+4211e9d5c31659da6d66dad550c9d646
+2009-08-10T18:42:02.033426Z
+532
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4224
+\f
+bg_restore.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+460acdb041c97f3b866c48bd01e6dcc4
+2009-08-27T10:01:51.549755Z
+577
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+62107
+\f
+icon-ref-restorebackups.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+06caf36fbbacfa1e892c62e6ad6cd104
+2009-09-15T12:07:49.302204Z
+626
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4633
+\f
+default_bg.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+562028809d59ea75c5bb4fc2face91b7
+2009-09-09T16:10:10.046818Z
+610
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2396
+\f
+browse_button.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+850dd65278e2b1ab21ad0a9bd34e6c31
+2009-08-13T19:38:57.115054Z
+551
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3991
+\f
+bg_backup0.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+71b7252b3021dd09f8ec587549118893
+2009-08-11T16:36:01.916949Z
+539
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+48940
+\f
+pc_name_border_file.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+cafe36896b8b58e92d5d351b0c153720
+2009-08-13T19:38:57.115054Z
+551
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3468
+\f
+pc_file_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+20068b0940926d1110879ab4a59fb44f
+2009-08-13T19:38:57.115054Z
+551
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4230
+\f
+checkbox_unchecked.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+118a0f804bcc4d7e90be766910bbc51c
+2009-08-13T17:08:11.546686Z
+550
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+688
+\f
+icon-ref-settings.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+1a0d9597956dda69c405967db13fed7c
+2009-09-15T12:07:49.302204Z
+626
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5214
+\f
+large_arrow_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+0f34a62a541a7caa7aa2f1d4b1d9b112
+2009-08-13T19:38:57.115054Z
+551
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6248
+\f
+disconnected.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+ff9a15db496d8dae6461766710d6686d
+2009-09-08T14:59:55.898571Z
+608
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+12211
+\f
+device_name_border_checkbox.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+bd2ca576ffc5981ec2323064d2dadb65
+2009-08-10T18:42:02.033426Z
+532
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3324
+\f
+device_checkbox_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+cf98ab9a0bb3870789b4853bd1957667
+2009-08-10T18:42:02.033426Z
+532
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4304
+\f
+backup.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+870aca33c4343973c09b83e3dfe45ab4
+2009-09-15T12:07:49.302204Z
+626
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4657
+\f
+back_arrow_on.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+d259ebab223ef56773733ce28676fb3e
+2009-07-29T12:18:32.451141Z
+490
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2954
+\f
+icon-alert-ref.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+36c02dce8980394a63d0716986846db4
+2009-08-10T18:42:02.033426Z
+532
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3604
+\f
+view_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+07c9e5b9c933aab32c52d83369f1749b
+2009-09-03T22:08:31.931352Z
+600
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4512
+\f
+forward_arrow_on.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+972f112af726e4cc1048c4957987df5c
+2009-07-29T12:18:32.451141Z
+490
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2950
+\f
+N800_backup.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+3a755c3c2d6016b103280e1dfac404c3
+2009-09-08T14:59:55.898571Z
+608
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+10860
+\f
+tabletsuite.desktop
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+57206ed9fbe3ad7e9f6035587fc0a20d
+2009-09-24T18:11:29.733195Z
+643
+otacilio
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+269
+\f
+N810_backup.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+f42fa915e09e712f6904561390845c73
+2009-09-08T14:59:55.898571Z
+608
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+19137
+\f
+lista.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+21abea4315d51598bc9493ba74507eb5
+2009-08-27T10:01:51.549755Z
+577
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3363
+\f
+bg_backup.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+929064a3d451a8c7e72c8e211401db87
+2009-08-07T19:29:53.557169Z
+529
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+74676
+\f
+icon-ref-newbackup.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+207b1bdc88279b56c6755a3841021208
+2009-09-15T12:07:49.302204Z
+626
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4895
+\f
+device_backup_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+afb641c1d2d237b8be0b564ed6c979c1
+2009-08-10T18:42:02.033426Z
+532
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4792
+\f
+N810.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+24f08a897165cee8770aee6a05e0ed65
+2009-09-08T14:59:55.898571Z
+608
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+12356
+\f
+arrow.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+690dc22ed876c3436a427891a9115362
+2009-07-28T17:43:56.280909Z
+474
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2817
+\f
+device_name_border_file.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+d425373982afaea21744991e30f584fe
+2009-08-10T18:42:02.033426Z
+532
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3399
+\f
+tab_bg_1.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+5cd4e834dcd5137cf36f48552cb30ef6
+2009-08-27T10:01:51.549755Z
+577
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+11985
+\f
+progress_bar_chunk_dialog.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+8201eaae0da8f4f292365a716b4d527a
+2009-09-08T17:01:54.301655Z
+609
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3228
+\f
+tab_bg_2.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+e822a037236b010e3285fd7c6b0026c2
+2009-08-27T10:01:51.549755Z
+577
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+10955
+\f
+tab_bg_3.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+53bb3b054aa1ae191d9a3caf0f3d5cb8
+2009-08-27T10:01:51.549755Z
+577
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+7825
+\f
+icon-ref-managebackups.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+1d823eb2520527d96b65d79292c3bfdb
+2009-09-15T12:07:49.302204Z
+626
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5154
+\f
+pc_image.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+8aef2711997e0be150bfb960d4b22f3d
+2009-09-10T22:40:29.655655Z
+614
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6196
+\f
+progress_bar_dialog_bg.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+4a2c3ade46963dee17dcf765773e9274
+2009-09-08T17:01:54.301655Z
+609
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3903
+\f
+device_name_border_backup.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+845b4976344776d80ab27ef9baf073d4
+2009-08-10T18:42:02.033426Z
+532
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3487
+\f
+button_bg.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+8f7e66a13a3d77964b89ecc60062fd8b
+2009-08-05T16:55:19.618241Z
+511
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5430
+\f
+checkbox_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+335ed6a4799668bd6d0e2e84f69c6f62
+2009-08-12T10:13:12.305172Z
+544
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3953
+\f
+N800_file.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+de991fbf0dde3cf6b7bfa3f5bc1dbdad
+2009-09-08T14:59:55.898571Z
+608
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5012
+\f
+small_icon-ref-restorebackups.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+822f5e0ed76fb0bb47a8d2f90f375469
+2009-09-15T12:07:49.302204Z
+626
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3725
+\f
+black_arrow.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+03e716d26ee1913272983b9cfcc199f8
+2009-07-29T09:45:01.027130Z
+482
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2824
+\f
+button_with_icon_bg.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+d4ffa3fe7a2f3e2eba14b66936411a85
+2009-08-10T11:25:57.599617Z
+531
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3896
+\f
+small_icon-ref-settings.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+1140c565d18d21a1efd190bc1a2ec8dc
+2009-09-15T12:07:49.302204Z
+626
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4242
+\f
+memory_bar.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+35fa29ba1087512051d27bf08766942c
+2009-07-27T10:04:31.020564Z
+466
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3563
+\f
+ssh.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+40dfa113ff4dbf710d29e9c965f94e97
+2009-07-02T12:53:33.231762Z
+373
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3437
+\f
+battery_bar.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+23a300c76eb873d8b2f35a037151a0b7
+2009-07-27T10:04:31.020564Z
+466
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3659
+\f
+button_bg_clicked.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+b4331208b1129b52d060a67e9f812335
+2009-08-05T16:55:19.618241Z
+511
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4360
+\f
+bt_next.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+0ea17926855c030924cd0375de12cbe6
+2009-08-11T18:11:13.211844Z
+540
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3705
+\f
+path_bg.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+2e9149e73f319bd8c29b46e4f68bd29b
+2009-08-13T19:38:57.115054Z
+551
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3856
+\f
+backup_default_button.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+507a2a81d9894d081cd48286cabc08be
+2009-08-27T20:31:13.838494Z
+579
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3604
+\f
+back_arrow_off.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+e08a8e19f58dcc1ae9993676fa2d2273
+2009-07-29T12:18:32.451141Z
+490
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2954
+\f
+button_with_icon_bg_clicked.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+1ca5a51cd91b76b1d00ed4f75e4ddbd5
+2009-08-10T11:25:57.599617Z
+531
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4141
+\f
+tabletSuite_logo.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+1a1166670a4205cfd08c1befc674c2bb
+2009-08-18T15:36:29.586124Z
+570
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+7324
+\f
+copy_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+e92a79031af207d5615413f878bcaa27
+2009-08-13T17:08:11.546686Z
+550
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4924
+\f
+small_icon-ref-newbackup.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+cf9ba7641b827a058912d9379915ecad
+2009-09-15T12:07:49.302204Z
+626
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4003
+\f
+forward_arrow_off.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+3379a96302f63597c319c50a264933a8
+2009-07-29T12:18:32.451141Z
+490
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2950
+\f
+device_selection_bg.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+63b1ba933149d0ffcb6e17edefa09c70
+2009-09-03T22:08:31.931352Z
+600
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5927
+\f
+backup_name_bg.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+abfde4ac92d9205f446eef12a951f024
+2009-08-13T19:38:57.115054Z
+551
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3909
+\f
+scroll_handle_h.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+25c1fa8f802f15ba9575b98a6f645346
+2009-09-09T16:10:10.046818Z
+610
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+446
+\f
+bt_next_clicked.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+ff7a184854f8fc2301f35393d62102f5
+2009-08-11T18:11:13.211844Z
+540
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3836
+\f
+backup_default_button_clicked.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+df78c1f41a82b17a499c603b5fd4f381
+2009-08-27T20:31:13.838494Z
+579
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3732
+\f
+bg_manager.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+460acdb041c97f3b866c48bd01e6dcc4
+2009-09-03T21:14:33.964127Z
+596
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+62107
+\f
+device_memory.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+ead62093235e632745d327a6e05fb890
+2009-07-27T10:04:31.020564Z
+466
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3715
+\f
+path_border.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+e2bf32a0e2b5b49abd45777ddb597fd0
+2009-08-13T19:38:57.115054Z
+551
+pauloouriques
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3412
+\f
+small_icon-ref-managebackups.png
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+35938d68793a64ddc63691a22bbbb912
+2009-09-15T12:07:49.302204Z
+626
+amaury
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4022
+\f
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+K 13
+svn:mergeinfo
+V 0
+
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
--- /dev/null
+#!/usr/bin/env xdg-open
+[Desktop Entry]
+Name=TabletSuite
+Comment=TabletSuite Application
+Version=0.0.1
+Exec=tabletsuite
+Icon=/usr/share/tabletsuite/tabletSuite_logo.png
+Type=Application
+Terminal=false
+Categories=Application;
+StartupNotify=false
+Name[en_US]=tabletsuite
--- /dev/null
+#!/usr/bin/env xdg-open
+[Desktop Entry]
+Name=TabletSuite
+Comment=TabletSuite Application
+Version=0.0.1
+Exec=tabletsuite
+Icon=/usr/share/tabletsuite/tabletSuite_logo.png
+Type=Application
+Terminal=false
+Categories=Application;
+StartupNotify=false
+Name[en_US]=tabletsuite
--- /dev/null
+#!/usr/bin/env python
+
+from distutils.core import setup
+from subprocess import *
+import os
+import glob
+
+dist = setup(name='tabletsuite',
+ version='0.0.1',
+ maintainer='Otacilio Lacerda',
+ maintainer_email='otaciliolacerda@gmail.com',
+ description='TabletSuite application',
+ long_description='',
+ license='GNU GPL',
+ platforms='all',
+ scripts=['tabletsuite'],
+ packages=['src', 'src/backup', 'src/pcsuite', 'src/ui', 'src/style'],
+ data_files=[('share/tabletsuite', glob.glob("img/*")),
+ ('share/applications', ['img/tabletsuite.desktop']),
+ ('share/fonts/extras', glob.glob('fonts/*'))],
+)
--- /dev/null
+K 25
+svn:wc:ra_dav:version-url
+V 48
+/svn/pc-suite/!svn/ver/653/trunk/tabletsuite/src
+END
+battery.py
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/pc-suite/!svn/ver/617/trunk/tabletsuite/src/battery.py
+END
+__init__.py
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/src/__init__.py
+END
+pcsdevicemanager.py
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/pc-suite/!svn/ver/642/trunk/tabletsuite/src/pcsdevicemanager.py
+END
+settings.py
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/src/settings.py
+END
+pcsdeviceinfo.py
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/src/pcsdeviceinfo.py
+END
+tabletsuite.py
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/src/tabletsuite.py
+END
+pcsdeviceutils.py
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/pc-suite/!svn/ver/643/trunk/tabletsuite/src/pcsdeviceutils.py
+END
+pcsutils.py
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/pc-suite/!svn/ver/611/trunk/tabletsuite/src/pcsutils.py
+END
--- /dev/null
+K 13
+svn:mergeinfo
+V 0
+
+END
--- /dev/null
+9
+
+dir
+653
+http://gforge.embedded.ufcg.edu.br/svn/pc-suite/trunk/tabletsuite/src
+http://gforge.embedded.ufcg.edu.br/svn/pc-suite
+
+
+
+2009-10-06T17:00:03.678569Z
+653
+pauloouriques
+has-props
+
+svn:special svn:externals svn:needs-lock
+
+
+
+
+
+
+
+
+
+
+
+ccd57667-b161-0410-a082-fa92f2fb3e95
+\f
+style
+dir
+\f
+plugins
+dir
+\f
+battery.py
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+9e4cc0a1ebba665c2fe12b76ba889647
+2009-09-14T12:56:51.357750Z
+617
+otacilio
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1811
+\f
+backup
+dir
+\f
+__init__.py
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+d41d8cd98f00b204e9800998ecf8427e
+2009-03-29T21:16:15.145020Z
+24
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+\f
+pcsdevicemanager.py
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+c759b16ea11f886c17310a1daa147d15
+2009-09-24T17:39:24.743743Z
+642
+pauloouriques
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4001
+\f
+settings.py
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+a624870d9c3018ae79cfc67d37fa1abf
+2009-06-23T17:46:40.723124Z
+346
+melunko
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1158
+\f
+pcsdeviceinfo.py
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+027acaec3db77d7c557936ef39ae9e75
+2009-07-08T15:53:48.428567Z
+394
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+417
+\f
+pcsuite
+dir
+\f
+tabletsuite.py
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+0e1bae3cfc483abe88238c96c4ac1798
+2009-09-03T11:08:46.919187Z
+588
+otacilio
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+775
+\f
+ui
+dir
+\f
+pcsdeviceutils.py
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+99e1f832b7dab66b04bd0742b4f90423
+2009-09-24T18:11:29.733195Z
+643
+otacilio
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5128
+\f
+pcsutils.py
+file
+
+
+
+
+2009-09-29T18:30:22.000000Z
+6bac19aba73e3f938e4cdb3aea339c13
+2009-09-10T18:11:56.305145Z
+611
+nicholas
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4727
+\f
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+K 13
+svn:mergeinfo
+V 0
+
+END
--- /dev/null
+#!/usr/bin/python
+
+# Ainda continua sendo o codigo do cara, apenas retirei as partes que nao nos interessa.
+# Ainda tem que ver se pode usar o codigo, ou seja, olhar a licensa.
+# Deve ser istalado no dispositivo
+# Otacilio Lacerda
+
+import dbus
+import dbus.service
+import dbus.glib
+import gobject
+
+percent_left = -1
+charging = False
+
+loop = gobject.MainLoop()
+
+class Request(dbus.service.Object):
+ def __init__(self, bus_name):
+ dbus.service.Object.__init__(self, bus_name, '/com/nokia/bme/request')
+
+ @dbus.service.signal('com.nokia.bme.request')
+ def timeleft_info_req(self):
+ pass
+
+ @dbus.service.signal('com.nokia.bme.request')
+ def status_info_req(self):
+ pass
+
+def timeleft_handler(idle_time, active_time):
+ global percent_left
+ percent_left = min(100, 100.0 * idle_time / 15000)
+ loop.quit()
+
+def charging_on_handler():
+ global charging
+ charging = True
+ loop.quit()
+
+def charging_off_handler():
+ global charging
+ charging = False
+ loop.quit()
+
+def getBatteryState(request):
+ global percent_left
+ global charging
+
+ request.status_info_req()
+ loop.run()
+
+ if charging:
+ return -1
+ request.timeleft_info_req()
+ loop.run()
+ return percent_left
+
+if __name__ == "__main__":
+
+ bus = dbus.SystemBus(private = True)
+ bus.add_signal_receiver(timeleft_handler, 'battery_timeleft')
+ bus.add_signal_receiver(charging_on_handler, 'charger_charging_on')
+ bus.add_signal_receiver(charging_on_handler, 'battery_full')
+ bus.add_signal_receiver(charging_off_handler, 'charger_charging_off')
+ bus_name = dbus.service.BusName('com.nokia.bme.request', bus)
+ request = Request(bus_name)
+
+ percent = getBatteryState(request)
+ if percent < 0:
+ print '-1'
+ else:
+ print '%.1f' % (percent)
+
--- /dev/null
+# low_device_info module
+# Authors: Nicholas Alexander && Otacilio Lacerda
+
+class PcsDeviceInfo:
+
+ def __init__(self):
+ self.ip = ""
+ self.storage = 0 # list memory data (FIXME: document the array information
+ self.battery = 0
+ self.model = ""
+ self.name = ""
+ self.hostname = ""
+ self.system = ""
+ self.charging = False
+ self.ossoBackup = ""
--- /dev/null
+# low_device_manager module
+# Authors: Nicholas Alexander && Otacilio Lacerda
+# Module responsible for management of devices informations.
+
+import pickle
+import os
+
+from PyQt4.QtCore import *
+
+import pcsutils as utils
+from pcsdeviceinfo import PcsDeviceInfo
+from pcsdeviceutils import *
+from ui.tsuigeneralmethods import showMessageBox
+
+USER_HOST = 'root'
+HOME = os.path.expanduser("~")
+DEVICES_FILE = os.path.join(HOME, ".pcsuite/devices/.ip_list")
+
+
+class PcsDeviceManager(QObject):
+ """Class responsible for devices management such as adding and removing
+ devices, get batery, memory and name informations and saving Device objects.
+
+ The DeviceManager holds a list of Devices objects and can save and load this
+ list on a file and retrieve information about each Device.
+
+ """
+ _currentIp = None
+ def __init__(self):
+ QObject.__init__(self)
+ self._deviceList = []
+
+ # FIXME: initialize this in another place
+ utils.initDirs()
+ self.loadDevices()
+
+ self._currentIp = None
+
+ def _batteryException(self):
+ errorMessage = "Could not get device battery status, check if " +\
+ "python is installed on your device. To get information about " + \
+ "python installation visit: " +\
+ "http://pymaemo.garage.maemo.org/installation.html"
+ showMessageBox(errorMessage,
+ "Error while collecting device information")
+
+ def _addDevice(self, deviceIp):
+ """Add a new device to list connecting to it in the process.
+
+ Arguments:
+ host_ip -- The IP of the device to connect.
+
+ """
+ self.loadDevices()
+
+ deviceInfo = PcsDeviceInfo()
+ deviceInfo.ip = deviceIp
+ (deviceInfo.name, deviceInfo.system,
+ deviceInfo.ossoBackup) = queryProductInformation(deviceIp)
+ if deviceInfo.name == "NO INFORMATION":
+ return "connectException"
+ try:
+ deviceInfo.battery = float(queryDeviceBattery(deviceIp))
+ except:
+ return "batteryException"
+
+ if deviceInfo.battery < 0:
+ deviceInfo.charging = True
+
+ deviceInfo.storage = queryDeviceStorage(deviceIp)
+
+ if self.getDevice(deviceIp) != None:
+ return deviceInfo
+
+ self._deviceList.append(deviceInfo)
+ self.saveDevices()
+ return deviceInfo
+
+ def removeDevice(self, deviceIp):
+ """Remove a Device from list.
+
+ Arguments:
+ device_ip -- The IP of the device to remove
+
+ """
+ deviceInfo = self.getDevice(deviceIp)
+ if deviceInfo != -1:
+ self._deviceList.remove(deviceInfo)
+ self.saveDevices()
+ return 1
+ else:
+ raise Exception("No device with that ip was found")
+
+ def getDevices(self):
+ """Returns a list with the IP address of all devices in the object's
+ devices list.
+
+ """
+ ips = []
+ for deviceInfo in self._deviceList:
+ ips.append(deviceInfo.ip)
+ return ips
+
+ def saveDevices(self):
+ """Save the list of Device objects in DEVICES_FILE file."""
+ obj = self._deviceList
+ file = open(DEVICES_FILE, "w")
+ pickle.dump(obj, file)
+ file.close()
+
+ def loadDevices(self):
+ """Loads the list of Device objects from DEVICES_FILE path if possible."""
+
+ if os.path.exists(DEVICES_FILE):
+ file = open(DEVICES_FILE)
+ self._deviceList = pickle.load(file)
+ file.close()
+
+ def getDevice(self, ip):
+ # Returns the Device object with the provided ip
+ for deviceInfo in self._deviceList:
+ if deviceInfo.ip == ip:
+ return deviceInfo
+ return None
+
+ def setCurrentDevice (self, ip):
+ self._currentIp = ip
+
+ def getCurrentDevice(self):
+ return self.getDevice(self._currentIp)
+
--- /dev/null
+# low_backup module
+# Authors: Nicholas Alexander && Otacilio Lacerda
+
+import commands
+import os
+
+BATTERY = os.environ['BATTERY_PATH'] + 'battery.py'
+EXECUTE = "./"
+USER_HOST = "root"
+
+def queryProductInformation(deviceIp):
+ """ Update device name by getting device product name and os version
+ informations.
+
+ Use osso-product-info command to get the device and device OS short
+ names and set each to it correspondent attribute.
+
+ """
+
+ info = commands.getoutput("ssh -l %s %s osso-product-info" %
+ (USER_HOST, deviceIp))
+
+ deviceName = _extractOssoInfo(info, "shortName")
+ deviceOs = _extractOssoInfo(info, "shortOS")
+ ossoVersion = _extractOssoInfo(info, "ossoVersion")
+ if deviceName != -1 and deviceOs != -1:
+ deviceName = deviceName.strip("'")
+ deviceOs = deviceOs.strip("'")
+ else:
+ deviceName = "NO INFORMATION"
+ deviceOs = "NO INFORMATION"
+
+ return (deviceName, deviceOs, ossoVersion)
+
+def queryDeviceStorage(deviceIp):
+ """Returns a list of tuples, each tuple representing a memory status.
+
+ Tuples are in this format: (total, used)
+
+ Returns:
+ mem_infos -- List with all tuples holding memory info
+
+ """
+ info = commands.getoutput("ssh -l root %s df" %
+ deviceIp).splitlines()
+ mem_infos = [-1, -1, -1]
+ for line in info:
+ if line.find("/dev/mtdblock4") != -1:
+ if line[-1] == "/":
+ total_used = _get_memory(line, "/dev/mtdblock4")
+ mem_infos.pop(0)
+ mem_infos.insert(0, total_used)
+
+ elif line.find("/media/mmc1") != -1:
+ total_used = _get_memory(line, "/dev/mmcblk0p1")
+ mem_infos.pop(1)
+ mem_infos.insert(1, total_used)
+
+ elif line.find("/media/mmc2") != -1:
+ total_used = _get_memory(line, "/dev/mmcblk1p1")
+ mem_infos.pop(2)
+ mem_infos.insert(2, total_used)
+
+ return mem_infos
+
+def queryDeviceBattery(deviceIp):
+ """Return device current battery status in a string.
+
+ This method runs a python script in the device that returns the battery
+ status, this status is represented by one string with the percentage of
+ battery current charge or the number -1 case battery is charging.
+
+ Returns:
+ text -- Text with the battery status
+
+ """
+
+ # Calls script that returns device battery status
+ os.system("scp %s %s@%s:/tmp" % (BATTERY, USER_HOST, deviceIp))
+ battery_status = commands.getoutput("ssh -l %s %s /usr/bin/python \
+ /tmp/battery.py" % (USER_HOST,
+ deviceIp))
+ return battery_status
+
+def _get_memory(line, path):
+ """Retrieve and return total and used memory information from the given
+ line using the memory path to retrieve the right information.
+
+ This function is to be used with a line of the return of a df command.
+
+ Arguments:
+ line -- The line where the memory information is
+ path -- The path in the begining of the line
+
+ Returns:
+ total -- Total memory
+ used -- Amount of used memory
+
+ """
+ number_of_infos = 0
+ i = len(path) + 1
+ while number_of_infos < 2:
+ char = line[i]
+ if char != " ":
+ start = i
+ end = line.find(" ", start + 1)
+ if number_of_infos == 0:
+ total = line[start: end]
+ elif number_of_infos == 1:
+ used = line[start: end]
+ i = end
+ number_of_infos += 1
+ i += 1
+ return total, used
+
+def _extractOssoInfo(osso_string, info_type="name"):
+ """Read the osso-product-info command return string and extract the
+ needed info depeding on info_type argument.
+
+ Arguments:
+ osso_string -- The string returned by osso-product-info command
+ info_type -- the kind of information to b extracted, can be:
+ name - returns device full name (default)
+ OS - returns device OS full name
+ shortName - returns device short name
+ shortOS - returns device short OS name
+
+ Returns:
+ info -- String with the needed information
+ -1 -- Case the information couldn't be found in the given string
+
+ """
+ detailed_type = ""
+ if info_type == "shortName":
+ detailed_type = "OSSO_PRODUCT_NAME"
+ elif info_type == "shortOS":
+ detailed_type = "OSSO_PRODUCT_RELEASE_NAME"
+ elif info_type == "name":
+ detailed_type = "OSSO_PRODUCT_FULL_NAME"
+ elif info_type == "OS":
+ detailed_type = "OSSO_PRODUCT_RELEASE_FULL_NAME"
+ elif info_type == "ossoVersion":
+ detailed_type = "OSSO_VERSION"
+ else:
+ detailed_type = "OSSO_PRODUCT_FULL_NAME"
+
+ types_list = osso_string.splitlines()
+ info = -1
+ for type_line in types_list:
+ if type_line.startswith(detailed_type):
+ # The second argument is the information itself since informations
+ # are displayed like: OSSO_PRODUCT_RELEASE_NAME='OS 2008'
+ info = type_line.split("=")[1]
+
+ return info
--- /dev/null
+import os.path
+
+import commands
+import os
+import pwd
+import settings
+import socket
+import sys
+
+import paramiko
+
+from backup.pcsbackuputils import createFolder
+
+sshPath = os.path.expanduser('~/.ssh/')
+known_hosts = os.path.join(sshPath, 'known_hosts')
+log_file = os.path.expanduser('~/.pcsuite/.ssh_log')
+user = 'root'
+keyName = 'rsa_key'
+
+def create_route(host, port=22):
+ # Verify Auth with privateKey
+ try:
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.settimeout(15)
+ sock.connect((host, port))
+ sock.close()
+ return True
+ except:
+ print 'No route to host'
+ return False
+
+def verify_exist_keys(host, port=22):
+ try:
+ transport = _create_transport(host, port)
+ except:
+ return False
+ try:
+ getKey = paramiko.RSAKey.from_private_key_file(sshPath + keyName)
+ transport.start_client()
+ transport.auth_publickey(user, getKey)
+ if transport.is_authenticated():
+ transport.close()
+ return True
+ except:
+ # 'Error in auth with publickey, try with password...'
+ return False
+ return False
+
+def keyExchange(host, passwd, port=22):
+ if not os.path.exists(sshPath):
+ createFolder(sshPath)
+
+ # Clean cached keys in ssh-agent
+ os.system('ssh-add -d')
+
+ try:
+ transport = _create_transport(host, port)
+ except:
+ transport.close()
+ return False
+
+ if not _add_host_fingerprint(host):
+ transport.close()
+ return False
+
+ if not _authenticate(user, passwd, transport):
+ transport.close()
+ return False
+
+ if not _add_key_to_host(host, transport):
+ transport.close()
+ return False
+
+ transport.stop_thread()
+ transport.close()
+ return True
+
+def initDirs():
+ settings.makeDirs()
+
+def _create_transport(host, port):
+ # Create a transport and initiate client mode
+ try:
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.settimeout(15)
+ sock.connect((host, port))
+ except Exception, msg:
+ print 'Connect failed: ' + str(msg)
+ raise Exception('Error while create sockets.')
+ transport = paramiko.Transport(sock)
+ return transport
+
+def _add_host_fingerprint(host):
+ if not os.path.exists(known_hosts):
+ os.system('touch %s' %known_hosts)
+ if os.system('ssh-keyscan -t rsa %s >> %s' %(host, known_hosts)) != 0:
+ return False
+ return True
+
+def _generate_keys():
+ # Generate public and private RSAKey
+ keyFile = os.path.join(sshPath, keyName)
+ if not os.path.exists(keyFile):
+ privateKey = paramiko.RSAKey.generate(2048)
+ privateKey.write_private_key_file(keyFile)
+ login = pwd.getpwuid(os.geteuid())[0]
+ publicKey = '%s %s %s@%s' %(privateKey.get_name(),
+ privateKey.get_base64(),
+ login , socket.gethostname())
+ try:
+ keyFile = open(keyFile + '.pub','w')
+ keyFile.write(publicKey)
+ keyFile.close()
+ except:
+ print 'Error while save the public key'
+ raise Exception()
+ else:
+ try:
+ privateKey = paramiko.RSAKey.from_private_key_file(keyFile)
+ login = pwd.getpwuid(os.geteuid())[0]
+ publicKey = '%s %s %s@%s' %(privateKey.get_name(),
+ privateKey.get_base64(),
+ login , socket.gethostname())
+ except:
+ print 'Error while read the private key'
+ raise Exception()
+ return publicKey
+
+def _authenticate(user, passwd, transport):
+ # Try Auth with password
+ try:
+ transport.start_client()
+ transport.auth_password(user, passwd)
+ except:
+ print 'Verify user or password.'
+ return False
+ if not transport.is_authenticated():
+ print 'Authentication fail'
+ return False
+
+ try:
+ exception = transport.get_exception()
+ if exception:
+ raise exception
+ except Exception, msg:
+ print 'Error in connection: ' + str(msg)
+ return False
+ return True
+
+def _add_key_to_host(host, transport):
+ # Add publickey in host
+ if not transport.is_active():
+ print 'Channel is not active'
+ return False
+
+ paramiko.util.log_to_file(log_file, 10)
+ channel = transport.open_session()
+ try:
+ channel.exec_command('mkdir -p ~/.ssh; echo %s >> .ssh/authorized_keys' % (_generate_keys()))
+ except Exception, msg:
+ print 'Error while generate or add the keys.'
+ channel.close()
+ return False
+ channel.close()
+ return True
--- /dev/null
+import os
+import os.path
+
+class Settings:
+ def __init__(self):
+ self.home = os.path.expanduser("~")
+ self.default_folder = os.path.join(self.home, ".pcsuite")
+ self.devices_folder = os.path.join(self.default_folder,
+ "devices")
+ self.backup_config_path = os.path.join(self.default_folder, "config")
+ self.backup_folder = os.path.join(self.default_folder, "Backup")
+
+ def initalize(self):
+
+ """Check the existence of required project folders, creating
+ them if needed. Also gives execution permission to all scripts.
+
+ """
+
+ # This is checking if the default folder exists too, because
+ # if it doesn't exist the mount_point won't exist either
+ if not os.path.exists(self.devices_folder):
+ os.makedirs(self.devices_folder)
+ if not os.path.exists(self.backup_config_path):
+ os.makedirs(self.backup_config_path)
+ if not os.path.exists(self.backup_folder):
+ os.makedirs(self.backup_folder)
+
+def makeDirs():
+ s = Settings()
+ s.initalize()
+
+if __name__ == "__main__":
+ makeDirs()
+
+
--- /dev/null
+#!/usr/bin/python
+
+import sys, os
+import optparse
+from PyQt4.QtGui import *
+
+parser = optparse.OptionParser(usage="%prog [options] [project-file]")
+parser.add_option("-l", "--local-dirs", action="store_true", dest="use_local_dirs",
+ help="Use files from the local directory tree")
+
+(options, args) = parser.parse_args()
+if options.use_local_dirs:
+ PATHS = {"IMAGE_PATH" : os.pardir + "/img/",
+ "BATTERY_PATH" : "./"}
+else:
+ PATHS = {"IMAGE_PATH" : "/usr/share/tabletsuite/",
+ "BATTERY_PATH" : "/usr/lib/python2.6/site-packages/src/"}
+
+for var, path in PATHS.iteritems():
+ os.environ.setdefault(var, path)
+
+
+from pcsuite.pcsuite import PCSuite
+
+app = QApplication(sys.argv)
+ps = PCSuite()
+ps.show()
+
+app.exec_()
--- /dev/null
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/pc-suite/!svn/ver/653/trunk/tabletsuite/src/backup
+END
+pcsopenfilewizard.py
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/svn/pc-suite/!svn/ver/648/trunk/tabletsuite/src/backup/pcsopenfilewizard.py
+END
+pcsbackupparser.py
+K 25
+svn:wc:ra_dav:version-url
+V 74
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/src/backup/pcsbackupparser.py
+END
+pcspcbackupmanager.py
+K 25
+svn:wc:ra_dav:version-url
+V 77
+/svn/pc-suite/!svn/ver/648/trunk/tabletsuite/src/backup/pcspcbackupmanager.py
+END
+pcsprogressdialog.py
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/svn/pc-suite/!svn/ver/639/trunk/tabletsuite/src/backup/pcsprogressdialog.py
+END
+pcsprogresswizard.py
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/svn/pc-suite/!svn/ver/636/trunk/tabletsuite/src/backup/pcsprogresswizard.py
+END
+pcsbackupxml.py
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/pc-suite/!svn/ver/620/trunk/tabletsuite/src/backup/pcsbackupxml.py
+END
+pcsbackupwizard.py
+K 25
+svn:wc:ra_dav:version-url
+V 74
+/svn/pc-suite/!svn/ver/653/trunk/tabletsuite/src/backup/pcsbackupwizard.py
+END
+pcsbackuputils.py
+K 25
+svn:wc:ra_dav:version-url
+V 73
+/svn/pc-suite/!svn/ver/648/trunk/tabletsuite/src/backup/pcsbackuputils.py
+END
+__init__.py
+K 25
+svn:wc:ra_dav:version-url
+V 67
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/src/backup/__init__.py
+END
+pcsbackupmanagerui.py
+K 25
+svn:wc:ra_dav:version-url
+V 77
+/svn/pc-suite/!svn/ver/652/trunk/tabletsuite/src/backup/pcsbackupmanagerui.py
+END
+pcsbackuplocation.py
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/src/backup/pcsbackuplocation.py
+END
+pcsbackuplistui.py
+K 25
+svn:wc:ra_dav:version-url
+V 74
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/src/backup/pcsbackuplistui.py
+END
+pcsbackupmanager.py
+K 25
+svn:wc:ra_dav:version-url
+V 75
+/svn/pc-suite/!svn/ver/648/trunk/tabletsuite/src/backup/pcsbackupmanager.py
+END
+pcswindowmanager.py
+K 25
+svn:wc:ra_dav:version-url
+V 75
+/svn/pc-suite/!svn/ver/630/trunk/tabletsuite/src/backup/pcswindowmanager.py
+END
+pcsrestoredialog.py
+K 25
+svn:wc:ra_dav:version-url
+V 75
+/svn/pc-suite/!svn/ver/606/trunk/tabletsuite/src/backup/pcsrestoredialog.py
+END
+pcsbackup.py
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/pc-suite/!svn/ver/652/trunk/tabletsuite/src/backup/pcsbackup.py
+END
+pcscheckboxwizard.py
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/svn/pc-suite/!svn/ver/641/trunk/tabletsuite/src/backup/pcscheckboxwizard.py
+END
+pcsrestorebackupui.py
+K 25
+svn:wc:ra_dav:version-url
+V 77
+/svn/pc-suite/!svn/ver/648/trunk/tabletsuite/src/backup/pcsrestorebackupui.py
+END
+pcsdevicebackupmanager.py
+K 25
+svn:wc:ra_dav:version-url
+V 81
+/svn/pc-suite/!svn/ver/648/trunk/tabletsuite/src/backup/pcsdevicebackupmanager.py
+END
+pcsbackupinfo.py
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/pc-suite/!svn/ver/590/trunk/tabletsuite/src/backup/pcsbackupinfo.py
+END
--- /dev/null
+K 13
+svn:mergeinfo
+V 0
+
+END
--- /dev/null
+9
+
+dir
+653
+http://gforge.embedded.ufcg.edu.br/svn/pc-suite/trunk/tabletsuite/src/backup
+http://gforge.embedded.ufcg.edu.br/svn/pc-suite
+
+
+
+2009-10-06T17:00:03.678569Z
+653
+pauloouriques
+has-props
+
+svn:special svn:externals svn:needs-lock
+
+
+
+
+
+
+
+
+
+
+
+ccd57667-b161-0410-a082-fa92f2fb3e95
+\f
+pcsopenfilewizard.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+bd7d89e9e75d7a71828842740bf96bc9
+2009-09-28T11:36:33.963218Z
+648
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+9749
+\f
+pcsbackupparser.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+cb732e14b18419973e32171f4ab44586
+2009-08-20T18:08:50.977477Z
+571
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4071
+\f
+pcspcbackupmanager.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+ce87348b076ca74e6cb7c6453cae7683
+2009-09-28T11:36:33.963218Z
+648
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+19153
+\f
+pcsprogressdialog.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+8f8ede17cf9c329d29af777bae73a556
+2009-09-18T09:51:12.321968Z
+639
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4432
+\f
+pcsprogresswizard.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+3982df75bf944d1b5b8eb49df76460f7
+2009-09-17T14:38:23.185224Z
+636
+pauloouriques
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+9496
+\f
+pcsbackupxml.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+cfc2951c78dbc548e271022d230fa645
+2009-09-14T16:31:07.677300Z
+620
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3174
+\f
+pcsbackupwizard.py
+file
+
+
+
+
+2009-10-08T18:25:37.000000Z
+3171ca50afa16f0dcaf44c048cfa62c6
+2009-10-06T17:00:03.678569Z
+653
+pauloouriques
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6759
+\f
+pcsbackuputils.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+9f9b1db376f86057eb1dac85a386e05c
+2009-09-28T11:36:33.963218Z
+648
+nicholas
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5583
+\f
+__init__.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+d41d8cd98f00b204e9800998ecf8427e
+2009-03-30T19:44:37.661351Z
+26
+amaury
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+\f
+pcsbackupmanagerui.py
+file
+
+
+
+
+2009-10-08T18:25:37.000000Z
+9c5a36ddecd9d79d7d7988c6b8fd673a
+2009-10-05T11:14:02.602311Z
+652
+pauloouriques
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+19623
+\f
+pcsbackuplocation.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+dd0ceb1377ef5b46c6dc79c44dcee7ba
+2009-06-23T16:10:35.956172Z
+345
+melunko
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+337
+\f
+pcsbackuplistui.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+313275d8fa5de6a6a67dcc3a0b75bf7a
+2009-08-27T10:01:51.549755Z
+577
+pauloouriques
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3915
+\f
+pcsbackupmanager.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+d61dc11dd6cfdfe3d2eec0b7ebd3a643
+2009-09-28T11:36:33.963218Z
+648
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6801
+\f
+pcswindowmanager.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+8f77ded896d07d7f62d101b3f70ba23d
+2009-09-15T17:59:33.111110Z
+630
+pauloouriques
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1279
+\f
+pcsrestoredialog.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+44f071048e2ac8dd3e4944866fa857c4
+2009-09-08T13:49:13.253249Z
+606
+amaury
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+7658
+\f
+pcsbackup.py
+file
+
+
+
+
+2009-10-08T18:25:37.000000Z
+6b5f22c2382885b7cd8d0f3d468c2597
+2009-10-05T11:14:02.602311Z
+652
+pauloouriques
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4784
+\f
+pcscheckboxwizard.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+c7bce3b7fe62f58f2c84b72690008619
+2009-09-24T16:33:15.553218Z
+641
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+11024
+\f
+pcsrestorebackupui.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+6229aa92dec31b2d6350a936e4f05849
+2009-09-28T11:36:33.963218Z
+648
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+16050
+\f
+pcsdevicebackupmanager.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+a6eca97d9d73c00c79d1afa06a79c98d
+2009-09-28T11:36:33.963218Z
+648
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3340
+\f
+pcsbackupinfo.py
+file
+
+
+
+
+2009-09-29T18:30:21.000000Z
+227e4c627b4f06fb55da1e3d9e59ec4d
+2009-08-12T12:26:15.094255Z
+548
+nicholas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2055
+\f
--- /dev/null
+K 13
+svn:mergeinfo
+V 0
+
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+# Authors: Amaury Medeiros and Paulo Ouriques
+# Software License: GPL
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from ui.pcsapp import PcsApp
+from ui.pcsdevicewidget import PcsDeviceWidget
+from ui.pcsuiutils import *
+from ui.pcsbutton import *
+from ui.tsuigeneralmethods import *
+
+from ui.pcscustombuttons import PcsCustomButton as customButton
+
+from pcswindowmanager import *
+
+class PcsBackup(PcsApp):
+
+ def __init__(self, deviceInfo, parent=None):
+ PcsApp.__init__(self, parent)
+ self.deviceInfo = deviceInfo
+
+ if (self.deviceInfo != None):
+ self.windowManager = PcsWindowManager(self.deviceInfo, self)
+
+ self.setWindowIcon(QIcon(BACKUP_IMAGE))
+ self.setWindowTitle("%s Backup" % APPLICATION_NAME)
+
+ self.hLayout = QHBoxLayout()
+ self.hLayout.setMargin(8)
+ self.vLayout = QVBoxLayout()
+
+ spc = QSpacerItem(0,50)
+ self.optionsLayout = QVBoxLayout()
+ self.optionsLayout.addItem(spc)
+ self._addButtons()
+ self.optionsLayout.addItem(spc)
+
+ self.deviceWidget = PcsDeviceWidget(1)
+ self.deviceWidget.addBorder()
+ self.deviceWidget.addDeviceName()
+ self.deviceWidget.setDeviceInfo(self.deviceInfo)
+
+ self.optionsBorderLayout = QGridLayout()
+ self.optionsBorderLabel = QLabel()
+ self.optionsBorderLabel.setFixedSize(208, 205)
+ self.optionsBorderLabel.setPixmap(QPixmap(DEVICE_BACKUP_BORDER))
+ self.optionsBorderLayout.addWidget(self.optionsBorderLabel, 0, 0, Qt.AlignCenter)
+ self.optionsBorderLayout.addLayout(self.optionsLayout, 0, 0, Qt.AlignCenter)
+ self.hLayout.addLayout(self.optionsBorderLayout)
+ self.hLayout.addWidget(self.deviceWidget)
+
+ #FIXE ME
+ l1 = QLabel("<font style='color: #333333'; size=2>Main</font>")
+ self.vLayout.addItem(TOP_SPACER)
+ self.vLayout.addWidget(l1)
+ self.vLayout.addLayout(self.hLayout)
+ informationLayout = QHBoxLayout()
+ spc = QSpacerItem(10, 0)
+ iconAlert = QLabel()
+ iconAlert.setPixmap(QPixmap(ICON_ALERT))
+ information = QLabel("<font style='color:"\
+ "#333333'; size=2>"\
+ "Select an action.</font>")
+ informationLayout.addItem(spc)
+ informationLayout.addWidget(iconAlert)
+ informationLayout.addWidget(information, Qt.AlignLeft)
+ self.vLayout.addLayout(informationLayout)
+ self.vLayout.setMargin(8)
+ self.setLayout(self.vLayout)
+
+ def openBackupWizard(self):
+
+ if(self.deviceInfo and self.deviceInfo.ip != None):
+ backup_wizard = self.windowManager.getNewBackup()
+ centralize(backup_wizard)
+ backup_wizard.setGeometry(self.geometry())
+ backup_wizard.exec_()
+ self.setVisible(False)
+ self.setGeometry(backup_wizard.geometry())
+ else:
+ showMessageBox("No devices were found.", "")
+
+ def openBackupManagerDialog(self):
+ if(self.deviceInfo and self.deviceInfo.ip != None):
+ backupManager = self.windowManager.getBackupManager()
+ centralize(backupManager)
+ backupManager.show()
+ self.setVisible(False)
+ else:
+ showMessageBox("No devices were found.", "")
+
+ def openRestoreBackupDialog(self):
+ if(self.deviceInfo and self.deviceInfo.ip != None):
+ restoreBackup = self.windowManager.getRestoreBackup()
+ centralize(restoreBackup)
+ restoreBackup.show()
+ self.setVisible(False)
+ else:
+ showMessageBox("No devices were found.", "")
+
+ def _addButtons(self):
+ infList = [("New Backup ", ICON_NEW_BACKUP),
+ ("Manage Backups", ICON_MANAGER_BACKUP),
+ ("Restore Backups ", ICON_RESTORE_BACKUP)]
+ buttonsList = []
+ for inf in infList:
+ buttonOptions = PcsButton(inf[0])
+ buttonOptions.setStyleSheet("background-image\
+ :url("+ BUTTON_WITH_ICON_BG +");\
+ qproperty-icon:url("+inf[1]+");\
+ min-height:50px; min-width:188px;\
+ max-height:50px; max-width:188px;\
+ qproperty-iconSize: 43px 36px")
+ self.optionsLayout.addWidget(buttonOptions)
+ buttonsList.append(buttonOptions)
+
+ self.connect(buttonsList[0], SIGNAL("clicked()"),
+ self.openBackupWizard)
+ self.connect(buttonsList[1], SIGNAL("clicked()"),
+ self.openBackupManagerDialog)
+ self.connect(buttonsList[2], SIGNAL("clicked()"),
+ self.openRestoreBackupDialog)
+
--- /dev/null
+import time
+from datetime import datetime
+
+class PcsBackupInfo:
+ """Class that represents a backup
+
+ Attributes:
+ _name -- Backup name
+ path -- Backup directory path
+ date -- Date when backup was created
+ _comment -- Any comment about backup
+ size -- Backup file size
+ files_number = total number of backup files
+ _time = time object was created in seconds since epoch
+
+ """
+
+ def __init__(self, name, path, size, comment=""):
+ """Initialize object attributes."""
+ self._name = name
+ self.path = path
+ self._time = time.time()
+ self.date = datetime.fromtimestamp(self._time).replace(microsecond=0)
+ self.size = size
+ self.files_number = 0
+ self._comment = comment
+ self.fromDevice = False
+
+ def getPath(self):
+ """Return object path."""
+ return self.path
+
+ def getName(self):
+ """Return object name."""
+ return self._name
+
+ def getDate(self):
+ """Return object creation date."""
+ return self.date
+
+ def getComment(self):
+ """Return object _comment attribute."""
+ return self._comment
+
+ def getSize(self):
+ """Return object file size."""
+ return self.size
+
+ def getTime(self):
+ """ Returns the object creation time in seconds since epoch. """
+ return self._time
+
+ def getFilesNumber(self):
+ """ Return number of files this backup holds. """
+ return self.files_number
+
+ def setComment(self, new_comment):
+ """Set object _comment attribute to the given string"""
+ self._comment = new_comment
+
+ def setName(self, new_name):
+ """Set object name to a new name"""
+ self._name = new_name
+
+ def setDate(self, newDate):
+ self.date = newDate
+
+ def setFilesNumber(self, number_of_files):
+ """ Set number of files this backup holds to number_of_files ."""
+ self.files_number = number_of_files
+
+ def setAtDevice(self, bool=False):
+ self.fromDevice = bool
--- /dev/null
+# Authors: Amaury Medeiros and Paulo Ouriques
+# Software License: GPL
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+class PCSBackupListUi(QTableView):
+
+ ''' Class that creates a table, where the backups will be shown '''
+
+ def __init__(self, backupManager):
+ super(PCSBackupListUi, self).__init__()
+
+ self.setSelectionBehavior(QAbstractItemView.SelectRows)
+ self.setSelectionMode(QAbstractItemView.ExtendedSelection)
+ self.setAlternatingRowColors(True)
+ self.setShowGrid(False)
+ self.setEditTriggers(QAbstractItemView.NoEditTriggers)
+ self.model = QStandardItemModel()
+ self.setModel(self.model)
+
+ hHeader = QHeaderView(Qt.Horizontal)
+ hHeader.setObjectName("listHeader")
+ hHeader.setAttribute(Qt.WA_NoSystemBackground)
+ hHeader.setStretchLastSection(True)
+ hHeader.setResizeMode(QHeaderView.ResizeToContents)
+ hHeader.setMinimumSectionSize(100)
+
+ hHeader.setClickable(False)
+
+ self.setHorizontalHeader(hHeader)
+
+ vHeader = QHeaderView(Qt.Vertical)
+ vHeader.setVisible(False)
+ self.setVerticalHeader(vHeader)
+ self._backupManager = backupManager
+
+ def updateBackupList(self):
+ self.model.clear()
+ self.model.setHorizontalHeaderItem(0, QStandardItem("NAME"))
+ self.model.setHorizontalHeaderItem(1, QStandardItem("SIZE"))
+ self.model.setHorizontalHeaderItem(2, QStandardItem("DATE"))
+
+ backupList = self._backupManager.getBackupList()
+ for backupInfo in backupList:
+ name = backupInfo.getName()
+ date = str(backupInfo.getDate())
+ size = self._formatBackupSize(backupInfo.getSize())
+ backupData = [QStandardItem(name), QStandardItem(size), QStandardItem(date)]
+ self.model.appendRow(backupData)
+
+ def removeSelectedBackups(self):
+ selectionModel = self.selectionModel()
+ indexList = selectionModel.selectedRows()
+ for index in reversed(sorted(indexList)):
+ if index.isValid():
+ row = index.row()
+ data = self.model.itemData(index)
+ backupName = data[0].toString()
+ if self._backupManager.removeBackup((str(backupName).strip())):
+ self.model.removeRow(row)
+ self.updateBackupList()
+
+ def renameSelectedBackup (self, newName):
+ #!!!!!!! getSelectedBackup
+ backupName = (str(self.getSelectedBackup())).strip()
+ if backupName != None:
+ if self._backupManager.renameBackup(backupName, newName):
+ self.updateBackupList()
+ return True
+
+ return False
+
+ def getSelectedBackup(self):
+ list = self.getSelectedBackupList()
+ if list and len(list) > 0:
+ return list[0]
+
+ return None
+
+ def getSelectedBackupList(self):
+ selectionModel = self.selectionModel()
+ indexList = selectionModel.selectedRows()
+ backupList = []
+ for index in indexList:
+ if index.isValid():
+ row = index.row()
+ data = self.model.itemData(index)
+ backupList.append(data[0].toString())
+ return backupList
+
+ def getBackupManager(self):
+ return self._backupManager
+
+ def _formatBackupSize(self, size):
+ """ Return a string with a more suited size and byte multiple for the
+ received size.
+
+ Attributes:
+ String/Float/Int size - size in bytes or string representing it.
+
+ """
+ size = float(size)
+ multiples = ["B", "KB", "MB", "GB"]
+ divisions = 0
+ while size > 1000 and divisions <= 3:
+ size = size / 1024.
+ divisions += 1
+
+ return "%.1f %s" % (size, multiples[divisions])
--- /dev/null
+# Class Backup_Category holds osso-backup .conf files informations
+
+class PcsBackupLocation:
+ """Backup_Location class.
+ Used for holding location attributes from parsed osso-backup xml files.
+
+ """
+ def __init__(self, type, category, path):
+ self.category = category
+ self.type = type
+ self.path = path
--- /dev/null
+import os
+
+from PyQt4.QtCore import *
+from zipfile import *
+
+import pcsbackuputils as utils
+
+
+HOME = os.path.expanduser("~")
+USER_HOST = "root"
+DEVICES_POINT = "%s/.pcsuite/devices/" % HOME
+
+
+class PcsBackupManager(QObject):
+
+ def __init__(self):
+ QObject.__init__(self)
+ self._backupList = []
+
+ def loadBackups(self):
+ return False
+
+ def saveBackups(self):
+ return False
+
+ def getBackupList(self):
+ return None
+
+ def createBackup(self, backup_name, path, host_ip, categories, comment=""):
+ return False
+
+ def removeBackup(self, backup_name):
+ return False
+
+ def getBackupInfo(self, backupName):
+ return None
+
+ def renameBackup(self, backupName, newName):
+ return False
+
+ def changeBackupComment(self, backupName, new_comment):
+ return False
+
+ def listBackupContent(self, backupName):
+ content = []
+ backupInfo = self.getBackupInfo(backupName)
+ backupPath = backupInfo.getPath()
+ fullPath = os.path.join(str(backupPath), str(backupName))
+
+ for entry in os.listdir(fullPath):
+ if entry.endswith(".zip"):
+ zipfile = utils.openZip(os.path.join(fullPath, entry), "r")
+ for member in zipfile.namelist():
+ folders = member.split("/")
+ memberName = "../" + "/".join([folders[-2], folders[-1]])
+ content.append(memberName)
+ return content
+
+ def restoreBackup(self, backupInfo, host_ip, categories):
+ """ Restore a PC backup to device with given IP address.
+
+ Attributes:
+ String backupInfo - Object representing the backup
+ String host_ip - IP address of device.
+ Dictionary categories - dictionary with categories as keys and with
+ value True if that category should be restored.
+
+ """
+ self.setRestoreInProgress(True)
+ # Set restore needed paths
+ devicePath = os.path.join(DEVICES_POINT, "%s" % host_ip)
+ mountPath = os.path.join(devicePath, "Root" )
+ tempPath = os.path.join(mountPath, "tmp/paths")
+ restScriptsPath = ("/etc/osso-backup/restore.d/always")
+ try:
+ utils.mountDevice(USER_HOST, host_ip, mountPath)
+ # Get backup location depending from backup source
+ if backupInfo == None:
+ return False
+ if backupInfo.fromDevice:
+ backup_path = backupInfo.getPath()
+ else:
+ backup_path = os.path.join(str(backupInfo.getPath()),
+ str(backupInfo.getName()))
+ # Get backup files list for each category and write it on a file
+ # that will be needed by restore scripts.
+ pathsDictonary = utils.getBackupFilesPath(backup_path)
+ if utils.writeBackupFilesPath(pathsDictonary, tempPath) == False:
+ return False
+ # --- Initialize restore progress ---
+ currentSize = 0
+ # Get total number of files to restore
+ numberOfFiles = 0
+ for categ in pathsDictonary:
+ for file in pathsDictonary[categ]:
+ numberOfFiles += 1
+ # Get size of all categories being restored
+ totalSize = 0
+ for file in os.listdir(backup_path):
+ if file.endswith(".zip"):
+ categ = file[:-4]
+ if categories[categ]:
+ catPath = os.path.join(backup_path, file)
+ zip = utils.openZip(catPath)
+ for member in zip.namelist():
+ totalSize += zip.getinfo(member).file_size
+ # Extract zip files to device
+ for entry in os.listdir(backup_path):
+ category = entry[:-4]
+ if entry.endswith(".zip") and categories[category]:
+ zipPath = os.path.join(backup_path, entry)
+ zip = utils.openZip(zipPath)
+ # Update restore progress, extract current f print "member %s: %.2f" % (member, zip.getinfo(member).file_size)ile and emit
+ # progress sinal
+ for member in zip.namelist():
+ if not self.restoreInProgress:
+ return 0
+ percentage = "%.1f" % self.computePercentage(totalSize,
+ currentSize)
+
+ status = (percentage, category, numberOfFiles, totalSize)
+ self.emit(SIGNAL("restoreProgress"), status)
+ zip.extract(member, devicePath)
+ currentSize += zip.getinfo(member).file_size
+ percentage = "%.1f" % ((currentSize / float(totalSize)) * 100)
+ status = (percentage, category, numberOfFiles, totalSize)
+ self.emit(SIGNAL("restoreProgress"), status)
+ zip.close()
+ # Execute restore scripts
+ os.system("ssh %s@%s ..%s/*.sh %s" % (USER_HOST, host_ip,
+ restScriptsPath, tempPath))
+ self.setRestoreInProgress(False)
+ # --- Restore finished ---
+ finally:
+ utils.unmountDevice(mountPath)
+
+
+ def computePercentage(self, totalSize, currentSize):
+ if totalSize == 0:
+ percentage = 100
+ else:
+ percentage = (currentSize / float(totalSize)) * 100
+ if percentage > 100:
+ percentage = 100
+ return percentage
+
+ def copy(self, sourcePath, destinationPath):
+ numberOfFiles = 0
+ for entry in os.listdir(sourcePath):
+ zipPath = os.path.join(sourcePath, entry)
+ if zipPath.endswith(".zip"):
+ zip = utils.openZip(zipPath)
+ numberOfFiles += len(zip.namelist())
+ totalSize = float(utils.getSize(sourcePath))
+ currentSize = 0
+ self.emit(SIGNAL("copyProgress"), ("0.00", numberOfFiles, totalSize))
+ for entry in os.listdir(sourcePath):
+ if not self.copyInProgress:
+ utils.removePath(destinationPath)
+ return 0
+ entryPath = os.path.join(sourcePath, entry)
+ utils.copy(entryPath, destinationPath)
+ currentSize += utils.getSize(entryPath)
+ progress = "%.2f" % ((currentSize / totalSize) * 100)
+ self.emit(SIGNAL("copyProgress"), (progress, numberOfFiles,
+ totalSize))
+
+
\ No newline at end of file
--- /dev/null
+# Software License: GPL
+
+import os
+import sys
+
+from functools import partial
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from ui.pcsuiutils import *
+from ui.tsuigeneralmethods import *
+from ui.pcsapp import PcsApp
+from backup.pcsbackuputils import *
+
+from pcsbackuplistui import PCSBackupListUi
+from pcspcbackupmanager import PcsPcBackupManager
+from pcsdevicebackupmanager import PcsDeviceBackupManager
+from pcsprogressdialog import PcsProgressDialog
+from style.styleTabletSuite import *
+
+COPY_BUTTON_ID = 0
+DELETE_BUTTON_ID = 1
+RENAME_BUTTON_ID = 2
+VIEW_BUTTON_ID = 3
+_home_dir = os.path.expanduser("~")
+_default_dir = _home_dir + "/.pcsuite/Backup"
+
+
+class PcsBackupManagerUi(QDialog):
+
+ ''' Class that calls a Backup Pc Suite application
+ with a Table Viewer'''
+
+ def __init__(self, deviceInfo, windowManager, parent=None):
+ QDialog.__init__(self, parent)
+ self.deviceInfo = deviceInfo
+ self.windowManager = windowManager
+
+ self.setWindowIcon(QIcon(BACKUP_IMAGE))
+ self.setWindowTitle("%s Backup Manager" % APPLICATION_NAME)
+ self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
+ self._home_dir = os.path.expanduser("~")
+ self._default_dir = _home_dir + "/.pcsuite/Backup"
+ self.copyPath = self._default_dir
+ self.name_change = None
+ self._setupUi()
+
+ def _setupUi(self):
+ # Creates the lists
+ self.pcBackupManager = PcsPcBackupManager()
+ self.deviceBackupManager = PcsDeviceBackupManager(self.deviceInfo)
+
+ self.pcListView = PCSBackupListUi(self.pcBackupManager)
+ self.pcListView.setObjectName("ListView")
+ # "Update pc list view"
+ pcListViewSelectionModel = self.pcListView.selectionModel()
+ self.connect(pcListViewSelectionModel,
+ SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
+ self._updateButtonsState)
+ self.pcListView.updateBackupList()
+
+ self.deviceListView = PCSBackupListUi(self.deviceBackupManager)
+ self.deviceListView.setObjectName("ListView")
+ deviceListViewSelectionModel = self.deviceListView.selectionModel()
+ self.connect(deviceListViewSelectionModel,
+ SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
+ self._updateButtonsState)
+ # "Update device List view"
+ self.deviceListView.updateBackupList()
+
+ layout = QVBoxLayout()
+ menuLayout = self._menuButtons()
+ layout.addLayout(menuLayout, Qt.AlignTop)
+ wayLayout = self._wayLayout()
+ layout.addLayout(wayLayout, Qt.AlignLeft)
+ layout.addItem(QSpacerItem(0,3))
+ layout.addLayout(self._centerLayout(), Qt.AlignTop)
+
+ layout.addItem(QSpacerItem(0,15))
+ informationLayout = self._createInformationsLabel()
+ layout.addLayout(informationLayout)
+ layout.addItem(QSpacerItem(0,2))
+ self.setLayout(layout)
+
+ def _centerLayout(self):
+ # Creates the tabs
+ layout = QVBoxLayout()
+ tabLayout = QVBoxLayout()
+ tab = QTabBar()
+ tab.setObjectName("managerTabs")
+ self.tabBar = QTabWidget()
+ self.tabBar.setTabBar(tab)
+ self.tabBar.setAttribute(Qt.WA_NoSystemBackground)
+ self.tabBar.setObjectName("tabBar")
+ self.tabBar.addTab(self.pcListView, "PC Backups")
+ self.tabBar.addTab(self.deviceListView, "Device Backups")
+ self.connect(self.tabBar, SIGNAL("currentChanged(int)"), self._updateButtonsState)
+ tabLayout.addWidget(self.tabBar)
+ layout.addLayout(tabLayout)
+ #Spacer
+ layout.addItem(QSpacerItem(0,5))
+ # Creates the buttons
+ buttonBox = QHBoxLayout()
+ self._buttonCopy = QPushButton("Copy")
+ self._buttonCopy.setDisabled(True)
+ self._buttonCopy.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ buttonBox.addWidget(self._buttonCopy)
+ self.connect (self._buttonCopy, SIGNAL("clicked()"), self._doCopyBackup)
+
+ self._buttonDelete = QPushButton("Delete")
+ self._buttonDelete.setDisabled(True)
+ buttonBox.addWidget(self._buttonDelete)
+ self._buttonDelete.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self.connect (self._buttonDelete, SIGNAL("clicked()"), self._doDeleteBackup)
+
+ self._buttonRename = QPushButton("Rename")
+ self._buttonRename.setDisabled(True)
+ buttonBox.addWidget(self._buttonRename)
+ self._buttonRename.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self.connect (self._buttonRename, SIGNAL("clicked()"), self._doRenameBackup)
+
+ self._buttonView = QPushButton("View")
+ self._buttonView.setDisabled(True)
+ buttonBox.addWidget(self._buttonView)
+ self._buttonView.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self.connect (self._buttonView, SIGNAL("clicked()"), self._doViewBackup)
+
+ self._buttonUpdate = QPushButton("Update")
+ self._buttonUpdate.setDisabled(False)
+ self._buttonUpdate.setVisible(False)
+ buttonBox.addWidget(self._buttonUpdate)
+ self._buttonUpdate.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self.connect (self._buttonUpdate, SIGNAL("clicked()"), self._doUpdateList)
+
+ layout.addLayout(buttonBox)
+ return layout
+
+ def _menuButtons(self):
+ infList = [("New Backup", SMALL_ICON_NEW_BACKUP_STYLE, self._newBackupDialog),
+ ("Manage Backup", SMALL_ICON_MANAGER_BACKUP_STYLE_SELECTED),
+ ("Restore Backup", SMALL_ICON_RESTORE_BACKUP_STYLE, self._restoreDialog)]
+
+ buttonsLayout = QHBoxLayout()
+ for i in range(3):
+ but = QPushButton(infList[i][0])
+ but.setStyleSheet(infList[i][1])
+ if i <> 1:
+ buttonsLayout.addWidget(but, Qt.AlignLeft)
+ self.connect(but, SIGNAL("clicked()"), infList[i][2])
+ else:
+ buttonsLayout.addWidget(but)
+ buttonsLayout.setMargin(0)
+ return buttonsLayout
+
+ def _newBackupDialog(self):
+ if(self.deviceInfo and self.deviceInfo.ip != None):
+ newBackup = self.windowManager.getNewBackup()
+ centralize(newBackup)
+ newBackup.setGeometry(self.geometry())
+ newBackup.show()
+ self.close()
+ else:
+ self._showNoDeviceFoundMessage()
+
+ def _restoreDialog(self):
+ if(self.deviceInfo and self.deviceInfo.ip != None):
+ restoreBackup = self.windowManager.getRestoreBackup()
+ centralize(restoreBackup)
+ restoreBackup.setGeometry(self.geometry())
+ restoreBackup.show()
+ self.close()
+ else:
+ self._showNoDeviceFoundMessage()
+
+ def _wayLayout(self):
+ self.barLayout = QHBoxLayout()
+ self.barLayout.setMargin(0)
+ spc = QSpacerItem(8, 0)
+ self.barLayout.addItem(spc)
+ main = QLabel("<font style='color: #333333'; size=2>Main</font>")
+ restore = QLabel("<font style='color: #FFFFFF'; size=2> Manage backups</font>")
+ spc = QSpacerItem(2, 0)
+ widgetList = [main, self._arrow(), restore]
+
+ for widget in widgetList:
+ self.barLayout.addWidget(widget, Qt.AlignLeft)
+ self.barLayout.addItem(spc)
+
+ self.barLayout.addItem(QSpacerItem(300, 0))
+ return self.barLayout
+
+ def _arrow(self):
+ label = QLabel()
+ label.setPixmap(QPixmap(BLACK_ARROW))
+ return label
+
+ def _createInformationsLabel(self):
+ hLay = QHBoxLayout()
+
+ self.infLabel = QLabel("<font style='color:"\
+ "#333333'; size=2>"\
+ "Select the backup you wish to manipulate.</font>")
+ iconAlert = QLabel()
+ hLay.setMargin(0)
+ iconAlert.setPixmap(QPixmap(ICON_ALERT))
+ spc = QSpacerItem(15, 0)
+ hLay.addItem(spc)
+ hLay.addWidget(iconAlert)
+ hLay.addWidget(self.infLabel, Qt.AlignLeft)
+
+ return hLay
+
+ def _doUpdateList(self):
+ self._currentBackupList().updateBackupList()
+ self._updateButtonsState(0)
+
+ def _execCopyDialogToDevice(self):
+ self._copyDialogToDevice = QDialog(self, Qt.FramelessWindowHint)
+ self._copyDialogToDevice.setObjectName("copyDialogToDevice")
+
+ self.rb1 = QRadioButton()
+ self.rb1.setText("External Memory Card")
+ self.rb2 = QRadioButton()
+ self.rb2.setText("Internal Memory Card")
+
+ layout = QVBoxLayout()
+ layout.addWidget(self.rb1)
+ layout.addWidget(self.rb2)
+
+ buttonCopy = QPushButton("Copy")
+ buttonCopy.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self.connect(buttonCopy, SIGNAL("clicked()"), self._doCopyToDevice)
+ buttonCancel = QPushButton("Cancel")
+ buttonCancel.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self.connect(buttonCancel, SIGNAL("clicked()"), self._copyDialogToDevice.close)
+
+ hlay = QHBoxLayout()
+ hlay.addWidget(buttonCancel)
+ hlay.addWidget(buttonCopy)
+ layout.addLayout(hlay)
+ self._copyDialogToDevice.setLayout(layout)
+ self._copyDialogToDevice.exec_()
+
+ def _execCopyDialogFromDevice(self):
+ self._copyDialogFromDevice = QDialog(self, Qt.FramelessWindowHint)
+ self._copyDialogFromDevice.setObjectName("copyDialogFromDevice")
+
+ hLayout = QHBoxLayout()
+ hLayout.setMargin(0)
+ self.textField = QLineEdit(self)
+ buttonOpen = QPushButton()
+ buttonOpen.setObjectName("buttonBrowse")
+ self.connect(buttonOpen, SIGNAL("clicked()"), self._doBrowse)
+ copyPath = str(self._default_dir)
+ self.textField.setReadOnly(True)
+ self.textField.setText(self._default_dir)
+ hLayout.addWidget(self.textField)
+ hLayout.addWidget(buttonOpen)
+
+ message = QLabel("<font style='color: #333333'; size=2> Backup copy destination: </font>")
+ message.setFixedHeight(15)
+
+ layout = QVBoxLayout()
+ layout.addWidget(message)
+ layout.addLayout(hLayout)
+
+ buttonCopy = QPushButton("Copy")
+ buttonCopy.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self.connect(buttonCopy, SIGNAL("clicked()"), self._doCopyFromDevice)
+ buttonCancel = QPushButton("Cancel")
+ buttonCancel.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self.connect(buttonCancel, SIGNAL("clicked()"), self._copyDialogFromDevice.close)
+
+ hlay = QHBoxLayout()
+ hlay.addWidget(buttonCancel)
+ hlay.addWidget(buttonCopy)
+ layout.addLayout(hlay)
+ self._copyDialogFromDevice.setLayout(layout)
+ self._copyDialogFromDevice.exec_()
+
+ def _doCopyBackup(self):
+ if self.tabBar.currentIndex() == 0:
+ self._execCopyDialogToDevice()
+ else:
+ self._execCopyDialogFromDevice()
+
+ def doCopy(self, device_ip, backupName, ret, destinationPath):
+ self.copyThread = CopyBackupThread(self, device_ip, backupName, ret, destinationPath)
+ self.copyThread.start()
+ self._runCopyProgress()
+
+ self.connect(self.copyThread, SIGNAL("openFileError"), self._onOpenFileError)
+ self.connect(self.copyThread, SIGNAL("copyProgress"), self._updateProgress)
+ self.connect(self.copyThread, SIGNAL("copyDone"), self._onCopyDone)
+
+ def _doCopyToDevice(self):
+ self._copyDialogToDevice.close()
+ ret = 1
+ if self.rb1.isChecked():
+ ret = 0
+ selectedBackupList = self._currentBackupList().getSelectedBackupList()
+ for backup in selectedBackupList:
+ self.doCopy(self.deviceInfo.ip, str(backup).strip(), ret, "")
+
+ def _doCopyFromDevice(self):
+ self._copyDialogFromDevice.close()
+ if self.copyPath != "":
+ selectedBackupList = self._currentBackupList().getSelectedBackupList()
+ self.name_change = False
+ for backup in selectedBackupList:
+ self.pcBackupManager.loadBackups()
+ self.correct_name = self.pcBackupManager._verify_backup_name(str(backup).strip())
+ self.doCopy(self.deviceInfo.ip, str(backup).strip(), 0, self.copyPath)
+ if self.correct_name != backup:
+ self.name_change = True
+
+ def _showMessageCopyBackupDone(self):
+ if self.name_change == None or not self.name_change:
+ QMessageBox.information(self, "Copy Backup", "Backup(s) copied")
+ else:
+ QMessageBox.information(sopenFileErrorelf, "Copy Backup",
+ "Backup copied with name: %s" % self.correct_name)
+
+ def _doBrowse(self):
+ pathDialog = QFileDialog()
+ prompt = "Select the folder you wish to copy your backup(s):"
+ self.copyPath = pathDialog.getExistingDirectory(self, prompt, self._home_dir)
+ if(self.copyPath != ""):
+ self.textField.setText(self.copyPath)
+
+ def _doRenameBackup(self):
+ res = False
+ (newName, ok) = QInputDialog.getText(self, "Rename Backup", "New Backup Name:",
+ QLineEdit.Normal, QString(),
+ Qt.FramelessWindowHint)
+ if ok:
+ if newName:
+ newName = QString(str(newName).strip())
+ if not newName.isEmpty():
+ list = self._currentBackupList()
+ res = list.renameSelectedBackup(newName)
+ if res:
+ showMessageBox("Backup Renamed", "")
+ else:
+ showMessageBox("Error while renaming the backup", "")
+
+ def _doDeleteBackup(self):
+
+ dialog = QMessageBox()
+ dialog.setText("Remove selected backup?")
+ dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
+ dialog.setWindowFlags(Qt.FramelessWindowHint)
+ dialog.setStyleSheet(MESSAGE_BOX_DEFAULT)
+ ret = dialog.exec_()
+ if ret == QMessageBox.Yes:
+ list = self._currentBackupList()
+ list.removeSelectedBackups()
+ showMessageBox("Backup Removed", "")
+
+ def _currentBackupList(self):
+ if self.tabBar.currentIndex() == 0:
+ self._buttonRename.setVisible(True)
+ self._buttonDelete.setVisible(True)
+ self._buttonView.setVisible(True)
+ self._buttonUpdate.setVisible(False)
+ return self.pcListView
+ else:
+ self._buttonUpdate.setVisible(True)
+ self._buttonRename.setVisible(False)
+ self._buttonDelete.setVisible(False)
+ self._buttonView.setVisible(False)
+ return self.deviceListView
+
+ def _updateButtonsState(self, index):
+ list = self._currentBackupList()
+ selectionModel = list.selectionModel()
+ indexList = selectionModel.selectedRows()
+
+ if len(indexList) != 1:
+ self._buttonRename.setDisabled(True)
+ self._buttonView.setDisabled(True)
+ self._buttonCopy.setDisabled(True)
+ else:
+ self._buttonRename.setEnabled(True)
+ self._buttonView.setEnabled(True)
+ self._buttonCopy.setEnabled(True)
+
+ if len(indexList) == 0:
+ self._buttonDelete.setDisabled(True)
+# self._buttonCopy.setDisabled(True)
+ else:
+ self._buttonDelete.setEnabled(True)
+# self._buttonCopy.setEnabled(True)
+
+
+ def _doViewBackup(self):
+ list = self._currentBackupList()
+ backupManager = list.getBackupManager()
+ backupName = (str(list.getSelectedBackup())).strip()
+ if backupName == None:
+ return False
+
+ dialog = QDialog(self, Qt.FramelessWindowHint)
+ dialog.setObjectName("viewDialog")
+ dialog.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
+ dialog.setWindowTitle("Backup Files")
+ dialog.setWindowIcon(QIcon(BACKUP_IMAGE))
+
+ layout = QVBoxLayout()
+ listWidget = QListWidget()
+ listWidget.setObjectName("viewList")
+ listWidget.setDragDropMode(QAbstractItemView.NoDragDrop)
+
+ try:
+ backupContentList = backupManager.listBackupContent(backupName)
+ except IOError:
+ showMessageBox(self.openFileError, "Error while opening file")
+ return False
+
+ for backupContent in backupContentList:
+ backup_button = QListWidgetItem()
+ backup_button.setText(backupContent)
+ listWidget.addItem(backup_button)
+
+ okButton = QPushButton("OK")
+ okButton.setStyleSheet(SMALL_DEFAULT_BUTTON_STYLE)
+ visible = partial(dialog.setVisible, False)
+ self.connect(okButton, SIGNAL("clicked()"), visible)
+ hLay = QHBoxLayout()
+ hLay.addItem(QSpacerItem(200,0))
+ hLay.addWidget(okButton)
+
+ layout.addWidget(listWidget)
+ layout.addLayout(hLay)
+ dialog.setLayout(layout)
+ dialog.show()
+
+ def _runCopyProgress(self):
+ self._progressDialog = PcsProgressDialog(self)
+ self._progressDialog.setAction("copy")
+ self.connect(self._progressDialog.cancelButton, SIGNAL("clicked()"),
+ self._onCopyCancel)
+ self._progressDialog.show()
+
+ def _updateProgress(self, information):
+ progress, self.numberOfFiles, self.totalSize = information
+ self._progressDialog.setProgress(progress)
+
+ def _onCopyDone(self):
+ self._progressDialog.updateInfo(self.totalSize, self.numberOfFiles)
+ self._progressDialog.progressDone()
+ self.pcListView.updateBackupList()
+
+ def _onCopyCancel(self):
+ if self.tabBar.currentIndex() == 0:
+ self.pcBackupManager.setCopyInProgress(False)
+ else:
+ self.deviceBackupManager.setCopyInProgress(False)
+ self._progressDialog.progressCanceled()
+
+ def _onOpenFileError(self):
+ self._progressDialog.close()
+ showMessageBox(OPEN_FILE_ERROR, OPEN_FILE_ERROR_TITLE)
+
+
+
+class CopyBackupThread(QThread):
+ def __init__(self, manager, deviceIp, backupName, ret, destinationPath ):
+ QThread.__init__(self)
+ self.uiManager = manager
+ self.deviceIp = deviceIp
+ self.backupName = backupName
+ self.memoryCard = ret
+ self.destinationPath = destinationPath
+ self.connect(self.uiManager.pcBackupManager, SIGNAL("copyProgress"),
+ self.reEmit)
+ self.connect(self.uiManager.deviceBackupManager, SIGNAL("copyProgress"),
+ self.reEmit)
+
+ def reEmit(self, inf):
+ self.emit(SIGNAL("copyProgress"), inf)
+
+ def run(self):
+ try:
+ if self.uiManager.tabBar.currentIndex() == 0:
+ manager = self.uiManager.pcBackupManager
+ manager.copyBackupToDevice(self.deviceIp, self.backupName,
+ self.memoryCard)
+ else:
+ manager = self.uiManager.deviceBackupManager
+ manager.copyBackupFromDevice(self.backupName,
+ self.destinationPath)
+
+ except IOError:
+ self.emit(SIGNAL("openFileError"))
+ return
+ self.emit(SIGNAL("copyDone"))
+
+
+
+
--- /dev/null
+# Module used to parse osso-backup xml conf files, retrieving categories and
+# backup paths information
+
+import os.path
+import xml.dom
+import xml.dom.minidom
+
+from pcsbackuplocation import *
+
+
+class PcsBackupParser:
+ """Holds a list of Backup_location objects
+
+ Can parse .conf xml files with osso-backup format at the given path with
+ fill_locations_list, creating Backup_location objects based on type,
+ category and path of each location inside each xml file and then holding
+ all objects in the locations_list attribute.
+
+ """
+ def __init__(self):
+ self.locationsDict = {}
+
+ def getLocationsDict(self):
+ return self.locationsDict
+
+ def addLocation(self, location):
+ """Add a location to locations_list attribute of theis class.
+
+ Arguments:
+ location -- the location object to be added
+
+ """
+ category = location.category
+ if category in self.locationsDict.keys():
+ self.locationsDict[category].append(location)
+ else:
+ self.locationsDict[category] = [location]
+
+ def fillLocationsDict(self, path):
+ """Add all locations that can be found inside xml files of the given
+ path.
+
+ This method reads all .conf files inside the directory path given and
+ puts on its locations_list attribute all the Backup_location objects
+ created with the informations returned from the files parsing.
+
+ Arguments:
+ path -- Path of directory containing files to parse
+
+ """
+ for file in os.listdir(path):
+ if file.endswith(".conf"):
+ locations = self.locationsFromFile(os.path.join(path, file))
+ for location in locations:
+ self.addLocation(location)
+
+ def locationsFromFile(self, xml_file):
+ """Return a list with all locations objects inside the given file.
+
+ The file is parsed and all informations retrieved from it are used to
+ create Backup_location objects and these objects are appended to a list
+ that is returned to caller.
+
+ Arguments:
+ xml_file -- File to parse
+
+ Returns:
+ locations -- List with all Backup_location objects created from file
+
+ """
+ locations_map = self._parser(xml_file)
+ locations = []
+ number_of_locations = len(locations_map["types"])
+ for i in range(number_of_locations):
+ type = locations_map["types"][i]
+ category = locations_map["categories"][i]
+ path = locations_map["paths"][i]
+ path = self._fixPath(path)
+ new_loc = PcsBackupLocation(type, category, path)
+ locations.append(new_loc)
+ return locations
+
+
+ def _parser(self, xml_file):
+ # Parses the xml_file, divide each location element information on a
+ # dictonary with key to respective information.
+ # Dictonary format:
+ # { "types": list of types in order of location appereance,
+ # "categories": list of categories ordered like types
+ # "paths" list of install paths in the same order as the others }
+ dom = xml.dom.minidom.parse(xml_file)
+ types = []
+ categories = []
+ paths = []
+ for node in dom.getElementsByTagName("location"):
+ type = node.getAttribute("type")
+ category = node.getAttribute("category")
+ path = node.childNodes[0].data.strip()
+ types.append(type)
+ categories.append(category)
+ paths.append(path)
+
+ location_map = {"types": types, "categories": categories, "paths": paths}
+ return location_map
+
+ def _fixPath(self, path):
+ # Fix any file path containing device specific constants, modifying
+ # them to its values
+ modifications = {"$HOME":"/home/user", "$USER":"user"}
+ for key in modifications.keys():
+ path = path.replace(key, modifications[key])
+ if not path.startswith("/"):
+ path = "/".join(path)
+ return path
+
--- /dev/null
+
+from pcsbackupinfo import *
+import zipfile
+import os
+import xml.dom.minidom
+
+
+def copyOssoBackupConfigFiles(destination, mountPath):
+ """ Copy all osso-backup .conf files to the given path. The device must be
+ already mounted in the mountPath.
+
+ Attributes:
+ - String mountPath - Path of the folder where the device is mounted
+ - String destination - Destination folder path where config files should be
+ copied to.
+
+ """
+ os.system("cp %s/etc/osso-backup/applications/*.conf %s" %
+ (mountPath, destination))
+
+
+def mountDevice(user, ip, path):
+ # Mount device file system using sshfs in the given path
+ try:
+ if not os.path.exists(path):
+ createFolder(path)
+ os.system('sshfs %s@%s:/ %s' % (user, ip, path))
+ except:
+ raise Exception("Error while mounting device file system")
+
+
+def unmountDevice(path):
+ try:
+ os.system('fusermount -uz %s' % path)
+ except:
+ raise Exception("Error while unmounting device file system")
+
+
+def createFolder(complete_path):
+ if not os.path.exists(complete_path):
+ os.makedirs(complete_path)
+
+ # FIXME
+ return True
+
+
+def removePath(complete_path):
+ for entry in os.listdir(complete_path):
+ if os.path.isdir(entry):
+ removePath(os.path.join(complete_path, entry))
+ else:
+ os.remove(os.path.join(complete_path, entry))
+ os.rmdir(complete_path)
+
+
+def getDeviceBackupList(mountPoint):
+ """This function return a list of backupInfo objects for each backup found
+ in the mount point.
+
+ """
+ deviceBackups = []
+ mmc1 = '%s/media/mmc1/backups' % mountPoint
+ mmc2 = '%s/media/mmc2/backups' % mountPoint
+
+ if os.path.exists(mmc1):
+ deviceBackups += _getDeviceBackupsInfo(mmc1)
+ if os.path.exists(mmc2):
+ deviceBackups += _getDeviceBackupsInfo(mmc2)
+
+ return deviceBackups
+
+
+def copy(original, destination):
+ original = original.replace(" ", "\ ")
+ destination = destination.replace(" ", "\ ")
+ createFolder(destination)
+ os.system("cp %s %s" % (original, destination))
+
+
+def getSize(path):
+ if not os.path.exists(path):
+ return False
+ if os.path.isdir(path):
+ files_and_folders = os.listdir(path)
+ sum_size = 0
+ for entry in files_and_folders:
+ if os.path.isdir(os.path.join(path, entry)):
+ sum_size += getSize(os.path.join(path, entry))
+ else:
+ try:
+ sum_size += os.stat(os.path.join(path, entry)).st_size
+ except:
+ sum_size += 1
+ return sum_size
+ else:
+ return os.stat(path).st_size
+
+
+def getBackupFilesPath(backupPath):
+ dic = {}
+ for entry in os.listdir(backupPath):
+ if entry.endswith(".zip"):
+ zip = openZip(os.path.join(backupPath, entry))
+ dic[entry.replace(".zip", "")] = zip.namelist()
+ return dic
+
+
+def getBackupCategories(backupInfo):
+ backupPath = str(backupInfo.path)
+ if not backupInfo.fromDevice:
+ backupPath = os.path.join(backupPath, str(backupInfo._name))
+ categoriesList = []
+ for entry in os.listdir(backupPath):
+ if entry.endswith(".zip"):
+ categoriesList.append(entry.replace(".zip", ""))
+ return categoriesList
+
+
+def writeBackupFilesPath(paths_dictionary, file_path):
+ try:
+ file = open(file_path, "w")
+ except:
+ return False
+ for category in paths_dictionary.keys():
+ file.write("[" + category + "]\n")
+ for path in paths_dictionary[category]:
+ file.write(path + "\n")
+
+ file.close()
+
+def openZip(zipPath, mode="r"):
+ """ Open a .zip file using python ZipFile library.
+
+ Attributes:
+ String zipPath - The directory path to the file
+ String mode - "w" to open file for writting.
+ "a" to open file for appending.
+ "r" to open file for reading.
+
+ """
+ try:
+ zip = zipfile.ZipFile(zipPath, mode)
+ return zip
+ except zipfile.BadZipfile, msg:
+ raise IOError("Problem while opening %s: %s" % (zipPath, msg))
+ except:
+ raise
+
+def closeZip(zipfile):
+ zipfile.close()
+
+def zip(zipfile, path):
+ # Compress the file in the given path to the zipfile
+ try:
+ zipfile.write(path.encode('UTF'))
+ return True
+ except:
+ return False
+
+def rebootDevice(deviceIp):
+ return os.system("ssh root@%s reboot" % deviceIp) == 0
+
+
+def _parseMetadata(metadata_path):
+ document = xml.dom.minidom.parse(metadata_path)
+ node = document.getElementsByTagName("size")[0]
+ size = int(str(node.firstChild.nodeValue))
+ node = document.getElementsByTagName("timestamp")[0]
+ objDate = datetime.fromtimestamp(float(str(node.firstChild.nodeValue)))
+ return size, str(objDate)