# 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)