PiScan/client/py/connect.py

109 lines
4.2 KiB
Python

import sys
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QWidget, QLabel, QPushButton, QLineEdit, QCheckBox
from PySide2.QtCore import QObject
from PySide2.QtGui import QMovie, QPixmap
from socket import *
import common
import constants
class ConnectDialog:
def __init__(self, parentWindow, address=None, port=None, use_audio=False, rtsp_port=None):
self.widget = parentWindow.findChild(QWidget, 'connectPage')
self.errorLabel = parentWindow.findChild(QLabel, 'connect_errorLabel')
self.confirmButton = parentWindow.findChild(QPushButton, 'connect_confirmButton')
self.connectIndicator = parentWindow.findChild(QLabel, 'connect_indicator')
self.hostLineEdit = parentWindow.findChild(QLineEdit, 'connect_hostnameLineEdit')
self.portLineEdit = parentWindow.findChild(QLineEdit, 'connect_portLineEdit')
self.logo = parentWindow.findChild(QLabel, 'connect_logoImage')
self.hostLabel = parentWindow.findChild(QLabel, 'hostLabel')
self.portLabel = parentWindow.findChild(QLabel, 'hostPortLabel')
self.audioCheckBox = parentWindow.findChild(QCheckBox, 'connect_audioCheckBox')
self.rtspPortPanel = parentWindow.findChild(QWidget, 'connect_rtspPortPanel')
self.rtspPortLineEdit = parentWindow.findChild(QLineEdit, 'connect_rtspPortLineEdit')
self.logo.setPixmap(QPixmap("resources/icon-256.png"))
self.logo.setVisible(False)
movie = QMovie("resources/loader-small.gif")
movie.start()
self.connectIndicator.setMovie(movie)
self.connectIndicator.setVisible(False)
self.errorLabel.setVisible(False)
self.hostLineEdit.setText(constants.DEFAULT_ADDRESS)
self.portLineEdit.setText(str(constants.DEFAULT_TCP_PORT))
self.confirmButton.clicked.connect(self.onConfirm)
self.hostLineEdit.returnPressed.connect(self.onConfirm)
self.portLineEdit.returnPressed.connect(self.onConfirm)
self.rtspPortPanel.setVisible(False)
def onConfirm(self):
host = self.hostLineEdit.text()
port = int(self.portLineEdit.text())
audio = self.audioCheckBox.isChecked()
rtsp_port = int(self.rtspPortLineEdit.text())
self.tryConnect(host, port, audio, rtsp_port)
def tryConnect(self, address, port, use_audio=False, rtsp_port=8554):
print('connect confirm')
try:
self.connectIndicator.setVisible(True)
self.errorLabel.setVisible(False)
self.hostLineEdit.setText(address)
self.portLineEdit.setText(str(port))
self.audioCheckBox.setChecked(use_audio)
self.rtspPortLineEdit.setText(str(rtsp_port))
self.widget.repaint()
print('Connecting to ', address, ':', port)
dest = (address, port)
sock = socket(AF_INET, SOCK_STREAM)
sock.connect(dest)
print('Connection success')
self.connectIndicator.setVisible(False)
common.getApp().completeConnection(sock, address, use_audio, rtsp_port)
except ConnectionRefusedError:
self.connectFailed('Connect failed - Connection refused')
except gaierror as err:
self.connectFailed('Connect failed - ' + str(err))
except TimeoutError:
self.connectFailed('Connect failed - Timed out')
except:
e = sys.exc_info()[0]
self.connectFailed('Connect failed - Unhandled exception: ' + str(e))
def contextWait(self):
self.connectIndicator.setVisible(True)
self.errorLabel.setVisible(False)
self.hostLineEdit.setVisible(False)
self.portLineEdit.setVisible(False)
self.confirmButton.setVisible(False)
self.hostLabel.setVisible(False)
self.portLabel.setVisible(False)
def connectFailed(self, message):
self.connectIndicator.setVisible(False)
self.errorLabel.setText(str(message))
self.errorLabel.setVisible(True)
self.hostLineEdit.setVisible(True)
self.portLineEdit.setVisible(True)
self.confirmButton.setVisible(True)
self.hostLabel.setVisible(True)
self.portLabel.setVisible(True)