--- /dev/null
+# Authors: Amaury Medeiros and Paulo Ouriques
+# Software License: GPL
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from functools import partial
+from time import sleep
+
+from pcsdeviceinfoviewer import PcsDeviceInfoViewer
+from pcsdevicewidget import PcsDeviceWidget
+from pcsuiutils import *
+from tsuigeneralmethods import *
+from pcsutils import *
+
+from style.styleTabletSuite import *
+from backup.pcswindowmanager import *
+
+class PcsDeviceViewer(QFrame):
+
+ '''Class that displays the devices which are connected to the PC'''
+
+ _ip = "None"
+ CONNECTION_ERROR_MESSAGE = "Could not connect to device with the given IP " + \
+ "address.\nCheck if device is turned on and is properly " + \
+ "connected to network"
+
+ def __init__(self, deviceManager, pcSuite):
+ super(PcsDeviceViewer, self).__init__()
+ self.deviceManager = deviceManager
+ self.deviceManager.loadDevices()
+# self.pcSuite = pcSuite
+ self.setFixedSize(WINDOW_WIDTH, 150)
+ self.deviceWidget = PcsDeviceWidget(0)
+
+ # Create device connection type
+ self.deviceInfoViewer = PcsDeviceInfoViewer(pcSuite)
+
+ self.mainLayout = QHBoxLayout()
+ self.mainLayout.setMargin(0)
+
+ spacer = QSpacerItem(15, 15)
+ self.mainLayout.addItem(spacer)
+ self.mainLayout.addWidget(self.deviceWidget)
+ self.mainLayout.addItem(QSpacerItem(20,20))
+ self.mainLayout.addLayout(self.deviceInfoViewer)
+ self.mainLayout.addItem(spacer)
+ self.setLayout(self.mainLayout)
+
+ self.connectDialog = None
+
+ def checkIp(self, ip):
+ list = ip.split(".")
+ if len(list) != 4:
+ return False
+ for sublist in list:
+ if len(sublist) < 1 or len(sublist) > 3:
+ return False
+ for element in sublist:
+ if not str(element).isdigit():
+ return False
+ return True
+
+ def showConnectDialog(self):
+ if(self.connectDialog == None):
+ self.connectDialog = QDialog(self, Qt.FramelessWindowHint)
+ self.connectDialog.setObjectName("connectDialog")
+ self.connectDialog.setWindowIcon(QIcon(TABLET_SUITE_LOGO))
+ self.connectDialog.setWindowTitle("Device Selection")
+ connectDialogLayout = QVBoxLayout()
+
+ hLayout = QHBoxLayout()
+ addButton = QPushButton("Add")
+ addButton.setObjectName("smallButton")
+ self.connect(addButton, SIGNAL("clicked()"), self.addIp)
+
+ self.ipField = QLineEdit()
+ self.ipField.setText("IP Number")
+ self.ipField.setObjectName("ipField")
+ hLayout.addWidget(self.ipField)
+ hLayout.addWidget(addButton)
+
+ buttonLayout = QHBoxLayout()
+ self.connectButton = QPushButton("Connect")
+ self.connectButton.setObjectName("tsButton")
+ self.connect(self.connectButton, SIGNAL("clicked()"), self._connect)
+
+ self.deleteButton = QPushButton("Delete")
+ self.deleteButton.setObjectName("tsButton")
+ self.connect(self.deleteButton, SIGNAL("clicked()"), self._deleteSelectedIp)
+
+ cancelButton = QPushButton("Cancel")
+ cancelButton.setObjectName("tsButton")
+ setVisible = partial(self.connectDialog.setVisible, False)
+ self.connect(cancelButton, SIGNAL("clicked()"), setVisible)
+
+ buttonLayout.addWidget(self.connectButton)
+ buttonLayout.addWidget(self.deleteButton)
+ buttonLayout.addWidget(cancelButton)
+
+ vLayout = QVBoxLayout()
+ vLayout.setMargin(15)
+ vLayout.addWidget(QLabel("Select the device IP"))
+ vLayout.addLayout(hLayout)
+ vLayout.addWidget(self._createIpList())
+ connectDialogLayout.addLayout(vLayout)
+ connectDialogLayout.addLayout(buttonLayout)
+ self.connectDialog.setLayout(connectDialogLayout)
+ self._updateIpList()
+ self.connectDialog.exec_()
+
+ else:
+ self._updateIpList()
+ self.connectDialog.setVisible(True)
+
+ def _connect(self):
+ self._ip = self.getSelectedIp()
+ if not create_route(self._ip):
+ showMessageBox(self.CONNECTION_ERROR_MESSAGE,
+ "Error while connecting to device")
+ return False
+ if not verify_exist_keys(self._ip):
+ dialog = QMessageBox()
+ dialog.setText( "Wrong Key, It seems that the device key " + \
+ "changed. Do you want to exchange keys again?")
+ dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
+ dialog.setWindowFlags(Qt.FramelessWindowHint)
+ dialog.setStyleSheet(MESSAGE_BOX_DEFAULT)
+ ret = dialog.exec_()
+ if ret == QMessageBox.Yes:
+ if not self.showPasswdDialog():
+ return False
+ else:
+ return False
+ self._runAddDevice()
+
+ def _createIpList(self):
+ self.ipList = QTableView(self)
+ self.ipList.setObjectName("ipList")
+ self.ipList.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
+ self.ipList.setAlternatingRowColors(True)
+ self.ipList.setShowGrid(False)
+ self.ipList.setEditTriggers(QAbstractItemView.NoEditTriggers)
+ self.model = QStandardItemModel()
+ self.ipList.setModel(self.model)
+ self._updateButtonsState()
+ self.connect(self.ipList.selectionModel(),
+ SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
+ self._updateButtonsState)
+
+ hHeader = QHeaderView(Qt.Horizontal)
+ hHeader.setVisible(False)
+ hHeader.setResizeMode(QHeaderView.ResizeToContents)
+ hHeader.setMinimumSectionSize(225)
+ self.ipList.setHorizontalHeader(hHeader)
+
+ vHeader = QHeaderView(Qt.Vertical)
+ vHeader.setVisible(False)
+ self.ipList.setVerticalHeader(vHeader)
+
+ return self.ipList
+
+ def _deleteSelectedIp(self):
+ dialog = QMessageBox()
+ dialog.setText("Remove selected ip?")
+ dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
+ dialog.setWindowFlags(Qt.FramelessWindowHint)
+ dialog.setStyleSheet(MESSAGE_BOX_APP)
+ ret = dialog.exec_()
+ if ret == QMessageBox.Yes:
+ selectionModel = self.ipList.selectionModel()
+ indexList = selectionModel.selectedRows()
+ for index in indexList:
+ if index.isValid():
+ try:
+ ipAdress = self.model.itemData(index)[0].toString()
+ self.deviceManager.removeDevice(ipAdress)
+ except:
+ pass
+ finally:
+ self.model.removeRow(index.row())
+
+ def getSelectedIp(self):
+ selectionModel = self.ipList.selectionModel()
+ indexList = selectionModel.selectedRows()
+
+ for index in indexList:
+ if index.isValid():
+ data = self.model.itemData(index)
+ return data[0].toString()
+
+ def showInvalidIpDialog(self):
+ showMessageBox("Invalid ip adress", "Invalid ip")
+
+ def addIp(self):
+ ip = self.ipField.text()
+
+ if self.checkIp(ip):
+ for i in range(self.model.rowCount()):
+ if(self.model.item(i).text() == ip):
+ self.ipField.setText("IP Number")
+ return
+ item = QStandardItem(ip)
+ self.model.appendRow([item])
+ self.ipField.setText("IP Number")
+ else:
+ self.showInvalidIpDialog()
+
+ def showPasswdDialog(self):
+ (passwd, ok) = QInputDialog.getText(self, "Device Selection",
+ "Root Password:",
+ QLineEdit.Password,
+ QString(),
+ Qt.FramelessWindowHint)
+ if ok and not passwd.isEmpty():
+ self._passwd = passwd
+ if not keyExchange(self._ip, self._passwd):
+ errorMessage = "Could not connect to device with the given IP " + \
+ "Could not exchange keys"
+ showMessageBox(errorMessage, "Error while connecting to device")
+ return False
+ return True
+
+ def _updateButtonsState(self):
+ selectionModel = self.ipList.selectionModel()
+ indexList = selectionModel.selectedRows()
+ if len(indexList) > 1 or len(indexList) <= 0:
+ self.connectButton.setDisabled(True)
+ self.deleteButton.setDisabled(True)
+ else:
+ self.connectButton.setEnabled(True)
+ self.deleteButton.setEnabled(True)
+
+ def _createWindowManager(self, deviceInf):
+ if deviceInf != None:
+ PcsWindowManager(deviceInf, self)
+
+ def _runAddDevice(self):
+ self.connectingThread = connectingThread(self.deviceManager, self._ip)
+ self.connect(self.connectingThread, SIGNAL("connectException"), self._connectException)
+ self.connect(self.connectingThread, SIGNAL("createWindowManager"), self._createWindowManager)
+ self.connectingThread.start()
+
+ self.connectionProgress()
+ self.connect(self.connectingThread, SIGNAL("connectionDone"), self.updateDeviceInformation)
+
+ def updateDeviceInformation(self, deviceInfo):
+ self._progressDialog.cancel()
+ self.deviceInfo = deviceInfo
+ self.deviceManager.setCurrentDevice(self._ip)
+ if self.deviceInfo:
+ self.deviceManager.loadDevices()
+ self.deviceWidget.setDeviceInfo(self.deviceInfo)
+ self.deviceInfoViewer.setDeviceInfo(self.deviceInfo)
+ else:
+ showMessageBox("An error occurred while connect.", "Connection error")
+
+ def _updateIpList(self):
+ self.model.clear()
+ devices = self.deviceManager.getDevices()
+ for device in devices:
+ self.model.appendRow(QStandardItem(str(device)))
+
+ def connectionProgress(self):
+ self.connectDialog.setVisible(False)
+ self._progressDialog = QProgressDialog("Connecting...",
+ QString(), 0, -1, self,
+ Qt.FramelessWindowHint)
+ self._progressDialog.setObjectName("progressDialog")
+ self._progressDialog.setWindowIcon(QIcon(BACKUP_IMAGE))
+ self._progressDialog.setValue(0)
+ self._progressDialog.show()
+
+ def _connectException(self):
+ showMessageBox("", "Error while connect to device")
+
+
+class connectingThread(QThread):
+ def __init__(self, deviceManager, deviceIp):
+ QThread.__init__(self)
+ self.deviceManager = deviceManager
+ self.deviceIp = deviceIp
+
+ def run(self):
+ try:
+ deviceInf = self.deviceManager._addDevice(self.deviceIp)
+ self.emit(SIGNAL("createWindowManager"), deviceInf)
+ self.emit(SIGNAL("connectionDone"), deviceInf)
+ except:
+ self.emit(SIGNAL("connectException"))
+ self.emit(SIGNAL("connectionDone"), None)
+
\ No newline at end of file