Add maximum character limits to user-definable elements which appear in GUI/OSD to keep everything on screen

This commit is contained in:
Et0h 2016-12-26 11:29:12 +00:00
parent dc5ed86de8
commit 665956b84c
7 changed files with 39 additions and 2 deletions

View File

@ -685,7 +685,7 @@ info = dict(
options={'py2exe': { options={'py2exe': {
'dist_dir': OUT_DIR, 'dist_dir': OUT_DIR,
'packages': 'PySide.QtUiTools', 'packages': 'PySide.QtUiTools',
'includes': 'twisted, sys, encodings, datetime, os, time, math, PySide, liburl, ast', 'includes': 'twisted, sys, encodings, datetime, os, time, math, PySide, liburl, ast, unicodedata',
'excludes': 'venv, _ssl, doctest, pdb, unittest, win32clipboard, win32file, win32pdh, win32security, win32trace, win32ui, winxpgui, win32pipe, win32process, Tkinter', 'excludes': 'venv, _ssl, doctest, pdb, unittest, win32clipboard, win32file, win32pdh, win32security, win32trace, win32ui, winxpgui, win32pipe, win32process, Tkinter',
'dll_excludes': 'msvcr71.dll, MSVCP90.dll, POWRPROF.dll', 'dll_excludes': 'msvcr71.dll, MSVCP90.dll, POWRPROF.dll',
'optimize': 2, 'optimize': 2,

View File

@ -588,6 +588,7 @@ class SyncplayClient(object):
def sendChat(self,message): def sendChat(self,message):
if self._protocol and self._protocol.logged: if self._protocol and self._protocol.logged:
message = utils.truncateText(message,constants.MAX_CHAT_MESSAGE_LENGTH)
self._protocol.sendChatMessage(message) self._protocol.sendChatMessage(message)
def sendRoom(self): def sendRoom(self):

View File

@ -56,6 +56,12 @@ PLAYLIST_MAX_CHARACTERS = 10000
PLAYLIST_MAX_ITEMS = 250 PLAYLIST_MAX_ITEMS = 250
VLC_LISTEN_FOR_STDOUT = False # Changing to True this could break VLC 3 on Windows VLC_LISTEN_FOR_STDOUT = False # Changing to True this could break VLC 3 on Windows
# Maximum character lengths (for client and server)
MAX_CHAT_MESSAGE_LENGTH = 50 # Number of displayed characters
MAX_USERNAME_LENGTH = 12 # Number of displayed characters
MAX_ROOM_NAME_LENGTH = 35 # Number of displayed characters
MAX_FILENAME_LENGTH = 250 # Number of displayed characters
# Options for the File Switch feature: # Options for the File Switch feature:
FOLDER_SEARCH_FIRST_FILE_TIMEOUT = 15.0 # Secs - How long to wait to find the first file in folder search (to take account of HDD spin up) FOLDER_SEARCH_FIRST_FILE_TIMEOUT = 15.0 # Secs - How long to wait to find the first file in folder search (to take account of HDD spin up)
FOLDER_SEARCH_TIMEOUT = 6.0 # Secs - How long to wait until searches in folder to update cache are aborted (after first file is found) FOLDER_SEARCH_TIMEOUT = 6.0 # Secs - How long to wait until searches in folder to update cache are aborted (after first file is found)

View File

@ -11,7 +11,7 @@ import codecs
import os import os
from string import Template from string import Template
import argparse import argparse
from syncplay.utils import RoomPasswordProvider, NotControlledRoom, RandomStringGenerator, meetsMinVersion, playlistIsValid from syncplay.utils import RoomPasswordProvider, NotControlledRoom, RandomStringGenerator, meetsMinVersion, playlistIsValid, truncateText
class SyncFactory(Factory): class SyncFactory(Factory):
def __init__(self, password='', motdFilePath=None, isolateRooms=False, salt=None, disableReady=False,disableChat=False): def __init__(self, password='', motdFilePath=None, isolateRooms=False, salt=None, disableReady=False,disableChat=False):
@ -72,11 +72,13 @@ class SyncFactory(Factory):
return "" return ""
def addWatcher(self, watcherProtocol, username, roomName): def addWatcher(self, watcherProtocol, username, roomName):
roomName = truncateText(roomName, constants.MAX_ROOM_NAME_LENGTH)
username = self._roomManager.findFreeUsername(username) username = self._roomManager.findFreeUsername(username)
watcher = Watcher(self, watcherProtocol, username) watcher = Watcher(self, watcherProtocol, username)
self.setWatcherRoom(watcher, roomName, asJoin=True) self.setWatcherRoom(watcher, roomName, asJoin=True)
def setWatcherRoom(self, watcher, roomName, asJoin=False): def setWatcherRoom(self, watcher, roomName, asJoin=False):
roomName = truncateText(roomName, constants.MAX_ROOM_NAME_LENGTH)
self._roomManager.moveWatcher(watcher, roomName) self._roomManager.moveWatcher(watcher, roomName)
if asJoin: if asJoin:
self.sendJoinMessage(watcher) self.sendJoinMessage(watcher)
@ -145,6 +147,7 @@ class SyncFactory(Factory):
self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName(), room._name)) self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName(), room._name))
def sendChat(self,watcher,message): def sendChat(self,watcher,message):
message = truncateText(message, constants.MAX_CHAT_MESSAGE_LENGTH)
messageDict={"message":message,"username" : watcher.getName()} messageDict={"message":message,"username" : watcher.getName()}
self._roomManager.broadcastRoom(watcher, lambda w: w.sendChatMessage(messageDict)) self._roomManager.broadcastRoom(watcher, lambda w: w.sendChatMessage(messageDict))
@ -192,6 +195,7 @@ class RoomManager(object):
return watchers return watchers
def moveWatcher(self, watcher, roomName): def moveWatcher(self, watcher, roomName):
roomName = truncateText(roomName, constants.MAX_ROOM_NAME_LENGTH)
self.removeWatcher(watcher) self.removeWatcher(watcher)
room = self._getRoom(roomName) room = self._getRoom(roomName)
room.addWatcher(watcher) room.addWatcher(watcher)
@ -218,6 +222,7 @@ class RoomManager(object):
del self._rooms[room.getName()] del self._rooms[room.getName()]
def findFreeUsername(self, username): def findFreeUsername(self, username):
username = truncateText(username,constants.MAX_USERNAME_LENGTH)
allnames = [] allnames = []
for room in self._rooms.itervalues(): for room in self._rooms.itervalues():
for watcher in room.getWatchers(): for watcher in room.getWatchers():
@ -392,6 +397,9 @@ class Watcher(object):
reactor.callLater(0.1, self._scheduleSendState) reactor.callLater(0.1, self._scheduleSendState)
def setFile(self, file_): def setFile(self, file_):
print file_
if file_ and file_.has_key("name"):
file_["name"] = truncateText(file_["name"],constants.MAX_FILENAME_LENGTH)
self._file = file_ self._file = file_
self._server.sendFileUpdate(self) self._server.sendFileUpdate(self)

View File

@ -542,6 +542,9 @@ class ConfigDialog(QtGui.QDialog):
self.defaultroomLabel.setObjectName("room") self.defaultroomLabel.setObjectName("room")
self.defaultroomTextbox.setObjectName("room") self.defaultroomTextbox.setObjectName("room")
self.usernameTextbox.setMaxLength(constants.MAX_USERNAME_LENGTH)
self.defaultroomTextbox.setMaxLength(constants.MAX_ROOM_NAME_LENGTH)
self.connectionSettingsLayout = QtGui.QGridLayout() self.connectionSettingsLayout = QtGui.QGridLayout()
self.connectionSettingsLayout.addWidget(self.hostLabel, 0, 0) self.connectionSettingsLayout.addWidget(self.hostLabel, 0, 0)
self.connectionSettingsLayout.addWidget(self.hostCombobox, 0, 1) self.connectionSettingsLayout.addWidget(self.hostCombobox, 0, 1)

View File

@ -1058,6 +1058,7 @@ class MainWindow(QtGui.QMainWindow):
window.outputlabel = QtGui.QLabel(getMessage("notifications-heading-label")) window.outputlabel = QtGui.QLabel(getMessage("notifications-heading-label"))
window.chatInput = QtGui.QLineEdit() window.chatInput = QtGui.QLineEdit()
window.chatInput.setMaxLength(constants.MAX_CHAT_MESSAGE_LENGTH)
window.chatInput.returnPressed.connect(self.sendChatMessage) window.chatInput.returnPressed.connect(self.sendChatMessage)
window.chatButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'email_go.png'), window.chatButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'email_go.png'),
getMessage("sendmessage-label")) getMessage("sendmessage-label"))
@ -1112,6 +1113,7 @@ class MainWindow(QtGui.QMainWindow):
window.listLayout.addWidget(window.listSplit) window.listLayout.addWidget(window.listSplit)
window.roomInput = QtGui.QLineEdit() window.roomInput = QtGui.QLineEdit()
window.roomInput.setMaxLength(constants.MAX_ROOM_NAME_LENGTH)
window.roomInput.returnPressed.connect(self.joinRoom) window.roomInput.returnPressed.connect(self.joinRoom)
window.roomButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'door_in.png'), window.roomButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'door_in.png'),
getMessage("joinroom-label")) getMessage("joinroom-label"))

View File

@ -11,6 +11,7 @@ import random
import string import string
import urllib import urllib
import ast import ast
import unicodedata
folderSearchEnabled = True folderSearchEnabled = True
@ -160,6 +161,22 @@ def blackholeStdoutForFrozenWindow():
sys.stdout = Blackhole() sys.stdout = Blackhole()
del Blackhole del Blackhole
def truncateText(unicodeText, maxLength):
try:
unicodeText = unicodedata.normalize('NFC', unicodeText)
except:
pass
try:
maxSaneLength= maxLength*5
if len(unicodeText) > maxSaneLength:
unicodeText = unicode(unicodeText.encode("utf-8")[:maxSaneLength], "utf-8", errors="ignore")
while len(unicodeText) > maxLength:
unicodeText = unicode(unicodeText.encode("utf-8")[:-1], "utf-8", errors="ignore")
return unicodeText
except:
pass
return ""
# Relate to file hashing / difference checking: # Relate to file hashing / difference checking:
def stripfilename(filename, stripURL): def stripfilename(filename, stripURL):