--- /dev/null
+# Authors: Amaury Medeiros and Paulo Ouriques
+# Software License: GPL
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from functools import partial
+
+from ui.pcsuiutils import *
+from ui.tsuigeneralmethods import *
+
+from style.styleTabletSuite import *
+
+from backup.pcsbackupmanager import PcsBackupManager, DEVICES_POINT, USER_HOST
+from backup.pcspcbackupmanager import PcsPcBackupManager
+from backup.pcsdevicebackupmanager import PcsDeviceBackupManager
+from pcsbackuplistui import PCSBackupListUi
+from pcsprogressdialog import PcsProgressDialog
+from pcsrestoredialog import PcsRestoreDialog
+from pcsbackuputils import *
+
+
+class PcsRestoreBackupUi(QDialog):
+
+ def __init__(self, deviceInfo, windowManager, parent = None):
+ super(PcsRestoreBackupUi, self).__init__(parent)
+ self.deviceInfo = deviceInfo
+
+ self.windowManager = windowManager
+ self.pcBackupManager = PcsPcBackupManager()
+ self.deviceBackupManager = PcsDeviceBackupManager(self.deviceInfo)
+ self.deviceListView = PCSBackupListUi(self.deviceBackupManager)
+
+ self._buttonRestoreI = QPushButton("Restore")
+ self.connect (self._buttonRestoreI, SIGNAL("clicked()"), self._openRestoreBackup)
+ self._buttonRestoreII = QPushButton("Restore")
+ self.connect (self._buttonRestoreII, SIGNAL("clicked()"), self._openRestoreBackup)
+ self._buttonView = QPushButton("View")
+ self.connect (self._buttonView, SIGNAL("clicked()"), self._doViewBackup)
+
+ self.pcListView = PCSBackupListUi(self.pcBackupManager)
+
+ self.setWindowTitle("%s Restore Backup" % APPLICATION_NAME)
+ self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
+ self.vLayout = QVBoxLayout()
+
+ self._insertLayout()
+
+ def _createCenterLayout(self):
+ self.deviceListView.updateBackupList()
+ tab = QTabBar()
+ tab.setObjectName("restoreTabs")
+ self.tabBar = QTabWidget()
+ self.tabBar.setTabBar(tab)
+ self.tabBar.setAttribute(Qt.WA_NoSystemBackground)
+ self.tabBar.setObjectName("tabBar")
+ self.tabBar.addTab(self._createPcListViewWidget(), "PC Backups")
+ self.tabBar.addTab(self._createDeviceListViewWidget(), "Device Backups")
+ self.connect(self.tabBar, SIGNAL("currentChanged(int)"),
+ self._updateButtonsState)
+
+ layout = QVBoxLayout()
+ layout.addWidget(self.tabBar)
+
+ return layout
+
+ def _createButtons(self, pcFlag = False):
+ buttonBox = QHBoxLayout()
+ self._buttonRestoreI.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self._buttonRestoreI.setDisabled(True)
+ self._buttonRestoreII.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self._buttonRestoreII.setDisabled(True)
+ self._buttonView.setStyleSheet(DEFAULT_BUTTON_STYLE)
+ self._buttonView.setDisabled(True)
+
+ if pcFlag:
+ buttonBox.addWidget(self._buttonView)
+ buttonBox.addWidget(self._buttonRestoreI)
+ else:
+ buttonBox.addWidget(self._buttonRestoreII)
+
+ return buttonBox
+
+ def _createPcListViewWidget(self):
+ self.pcListView.setObjectName("ListView")
+ pcListViewSelectionModel = self.pcListView.selectionModel()
+ self.connect(pcListViewSelectionModel,
+ SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
+ self._updateButtonsState)
+
+ self.pcListView.updateBackupList()
+
+ panel = QWidget()
+ panel.setAttribute(Qt.WA_NoSystemBackground)
+ panel.setObjectName("DeviceListPanel")
+ vLay = QVBoxLayout()
+
+ vLay.addWidget(self.pcListView)
+ vLay.addLayout(self._createButtons(True))
+ panel.setLayout(vLay)
+
+ return panel
+
+ def _createDeviceListViewWidget(self):
+ self.deviceListView.setObjectName("ListView")
+ deviceListViewSelectionModel = self.deviceListView.selectionModel()
+ self.connect(deviceListViewSelectionModel,
+ SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
+ self._updateButtonsState)
+
+ self.deviceListView.updateBackupList()
+
+ panel = QWidget()
+ panel.setAttribute(Qt.WA_NoSystemBackground)
+ panel.setObjectName("DeviceListPanel")
+ vLay = QVBoxLayout()
+
+ vLay.addWidget(self.deviceListView)
+ vLay.addLayout(self._createButtons())
+ panel.setLayout(vLay)
+
+ return panel
+
+
+ def _insertLayout(self):
+
+ self.vLayout.setMargin(0)
+ self.wayLayout = self._wayLayout()
+ buttonLayout = self._menuButtons()
+ spc = QSpacerItem(0, 6)
+ self.vLayout.addItem(spc)
+ self.vLayout.addLayout(buttonLayout, Qt.AlignTop)
+ spc = QSpacerItem(0, 5)
+ self.vLayout.addItem(spc)
+ self.vLayout.addLayout(self.wayLayout, Qt.AlignLeft)
+ spc = QSpacerItem(0, 3)
+ self.vLayout.addItem(spc)
+ self.vLayout.addLayout(self._createCenterLayout(), Qt.AlignVCenter)
+
+ self.vLayout.addLayout(self._createInformationsLabel(), Qt.AlignVCenter)
+ spc = QSpacerItem(0, 8)
+ self.vLayout.addItem(spc)
+ self.setLayout(self.vLayout)
+
+ def _menuButtons(self):
+ infList = [("New Backup", SMALL_ICON_NEW_BACKUP_STYLE, self._newBackupDialog),
+ ("Manage Backup", SMALL_ICON_MANAGER_BACKUP_STYLE, self._manageDialog),
+ ("Restore Backup", SMALL_ICON_RESTORE_BACKUP_STYLE_SELECTED)]
+
+ buttonsLayout = QHBoxLayout()
+ for i in range(3):
+ but = QPushButton(infList[i][0])
+ but.setStyleSheet(infList[i][1])
+ if i <> 2:
+ buttonsLayout.addWidget(but, Qt.AlignLeft)
+ self.connect(but, SIGNAL("clicked()"), infList[i][2])
+ else:
+ buttonsLayout.addWidget(but)
+ return buttonsLayout
+
+ 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> Restore 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 _manageDialog(self):
+ if(self.deviceInfo and self.deviceInfo.ip != None):
+ backupManager = self.windowManager.getBackupManager()
+ centralize(backupManager)
+ backupManager.setGeometry(self.geometry())
+ backupManager.show()
+ self.close()
+ else:
+ self._showNoDeviceFoundMessage()
+
+ 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 _showNoDeviceFoundMessage(self):
+ inf = QMessageBox(self)
+ inf.setWindowTitle("Connect a device.")
+ inf.setText("No devices were found.")
+ inf.show()
+
+ 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 restore.</font>")
+ iconAlert = QLabel()
+ iconAlert.setPixmap(QPixmap(ICON_ALERT))
+ spc = QSpacerItem(15, 0)
+ hLay.addItem(spc)
+ hLay.addWidget(iconAlert)
+ hLay.addWidget(self.infLabel, Qt.AlignLeft)
+
+ return hLay
+
+ def _updateButtonsState(self, index):
+ list = self._currentBackupList()
+ selectionModel = list.selectionModel()
+ indexList = selectionModel.selectedRows()
+
+ if len(indexList) <> 1:
+ self._buttonView.setDisabled(True)
+ self._buttonRestoreI.setDisabled(True)
+ self._buttonRestoreII.setDisabled(True)
+ else:
+ self._buttonView.setEnabled(True)
+ self._buttonRestoreI.setEnabled(True)
+ self._buttonRestoreII.setEnabled(True)
+
+ def _currentBackupList(self):
+ if self.tabBar.currentIndex() == 0:
+ return self.pcListView
+ else:
+ return self.deviceListView
+
+
+ def doRestoreBackup(self, categories):
+ if self._currentBackupList() == self.pcListView:
+ manager = self.pcBackupManager
+ else:
+ manager = self.deviceBackupManager
+
+ self.restoreBackupThread = RestoreBackupThread(self, manager, categories)
+ self.restoreBackupThread.start()
+ self._runRestoreProgress()
+ self.connect(self.restoreBackupThread, SIGNAL("restoreProgress"),
+ self._updateCategoriesAndProgress)
+ self.connect(self.restoreBackupThread, SIGNAL("restoreDone"),
+ self._onRestodeDone)
+ self.connect(self.restoreBackupThread, SIGNAL("openFileError"),
+ self._onOpenFileError)
+
+ def _openRestoreBackup(self):
+ backup = self._currentBackupList().getSelectedBackup()
+ if self._currentBackupList() == self.pcListView:
+ self.pcBackupManager.loadBackups()
+ backupInfo = self.pcBackupManager.getBackupInfo(str(backup))
+ else:
+ self.deviceBackupManager.loadBackups()
+ backupInfo = self.deviceBackupManager.getBackupInfo(str(backup))
+
+ host_ip = self.deviceInfo.ip
+ devicePath = os.path.join(DEVICES_POINT, "%s" % host_ip)
+ mountPath = os.path.join(devicePath, "Root" )
+ mountDevice(USER_HOST, host_ip, mountPath)
+ list = getBackupCategories(backupInfo)
+ unmountDevice(mountPath)
+
+ self.restoreDialog = PcsRestoreDialog(self.deviceInfo, list, self)
+ self.connect(self.restoreDialog.buttonCancel, SIGNAL("clicked()"),
+ self.restoreDialog.close)
+
+ self.connect(self.restoreDialog.buttonOk, SIGNAL("clicked()"),
+ self._doRestoreAndCloseDialog)
+ self.restoreDialog.exec_()
+
+
+ def _doRestoreAndCloseDialog(self):
+ categories = self.restoreDialog.getCategories()
+ self.restoreDialog.close()
+ self.doRestoreBackup(categories)
+
+ def _doRestoreBackup(self, categories):
+ selectedBackups = self._currentBackupList().getSelectedBackupList()
+ if self._currentBackupList() == self.pcListView:
+ self.pcBackupManager.loadBackups()
+ for backup in selectedBackups:
+ backupInfo = self.pcBackupManager.getBackupInfo(str(backup))
+ ip = self.deviceBackupManager._deviceInfo.ip
+ self.emit(SIGNAL("restoreStarted"))
+ result = self.pcBackupManager.startBackupRestore(backupInfo, ip,
+ categories)
+ if result == False or result == 0:
+ return result
+ else:
+ self.deviceBackupManager.loadBackups()
+ for backup in selectedBackups:
+ backupInfo = self.deviceBackupManager.getBackupInfo(str(backup))
+ self.emit(SIGNAL("restoreStarted"))
+ result = self.deviceBackupManager.startBackupRestore(backupInfo,
+ categories)
+ if result == False or result == 0:
+ return result
+ return True
+
+ def showRestoreMessage(self, done):
+ if done != 0:
+ self._progressDialog.cancel()
+ ip = self.deviceBackupManager._deviceInfo.ip
+ if done:
+ doneMessage = "Restore done. Your device will be rebooted now"
+ showMessageBox(doneMessage, "Restore successfully Done")
+ rebootDevice(ip)
+ else:
+ showMessageBox("An error occurred while restoring backup",
+ "Restore error")
+
+ 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()
+ layout.setMargin(10)
+ listWidget = QListWidget()
+ listWidget.setObjectName("viewList")
+ listWidget.setDragDropMode(QAbstractItemView.NoDragDrop)
+
+ backupContentList = backupManager.listBackupContent(backupName)
+ if not backupContentList:
+ showMessageBox("Could not open backup files", "Error")
+ 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 _runRestoreProgress(self):
+ self._progressDialog = PcsProgressDialog(self)
+ self._progressDialog.setAction("restore")
+ self.connect(self._progressDialog.cancelButton, SIGNAL("clicked()"),
+ self._onRestoreCancel)
+
+ self._progressDialog.show()
+
+ def _updateCategoriesAndProgress(self, information):
+ progress, category, self.numberOfFiles, self.totalSize = information
+
+ self._progressDialog.setProgress(progress)
+ self._progressDialog.setCategory(category)
+
+ def _onRestodeDone(self):
+ self._progressDialog.updateInfo(self.totalSize, self.numberOfFiles)
+ self._progressDialog.progressDone()
+
+ def _onRestoreCancel(self):
+ self._progressDialog.progressCanceled()
+ if self._currentBackupList() == self.pcListView:
+ self.pcBackupManager.setRestoreInProgress(False)
+ else:
+ self.deviceBackupManager.setRestoreInProgress(False)
+
+ def _onOpenFileError(self):
+ self._progressDialog.close()
+ showMessageBox(OPEN_FILE_ERROR, OPEN_FILE_ERROR_TITLE)
+
+class RestoreBackupThread(QThread):
+ def __init__(self, restoreBackup, manager, categories):
+ QThread.__init__(self)
+ self.restoreBackup = restoreBackup
+ self.categories = categories
+ self.connect(manager, SIGNAL("restoreProgress"), self._reEmitSignal)
+
+ def _reEmitSignal(self, informations):
+ self.emit(SIGNAL("restoreProgress"), informations)
+
+ def run(self):
+ try:
+ done = self.restoreBackup._doRestoreBackup(self.categories)
+ except IOError:
+ self.emit(SIGNAL("openFileError"))
+ return
+ self.emit(SIGNAL("restoreDone"))
+