Wed, 15 Jan 2014 22:55:52 +0100
CodeStyleChecker moved to background service and done a little cleanup.
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

1  # * coding: utf8 * 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

2  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

3  # Copyright (c) 2013  2014 Detlev Offenbach <detlev@dieoffenbachs.de> 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

4  # 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

5  # pylint: disable=C0103 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

6  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

7  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

8  Module implementing a background service for the various checkers and other 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

9  python interpreter dependent functions. 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

10  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

11  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

12  from __future__ import unicode_literals 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

13  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

14  import json 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

15  import os 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

16  import struct 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

17  import sys 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

18  import threading 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

19  from zlib import adler32 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

20  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

21  from PyQt4.QtCore import QProcess, pyqtSignal 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

22  from PyQt4.QtNetwork import QTcpServer, QHostAddress 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

23  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

24  import Preferences 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

25  import Utilities 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

26  from Utilities.BackgroundClient import BackgroundClient 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

27  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

28  from eric5config import getConfig 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

29  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

30  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

31  class BackgroundService(QTcpServer): 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

32  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

33  Class implementing the main part of the background service. 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

34  """ 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

35  serviceNotAvailable = pyqtSignal(str, str, int, str) 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

36  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

37  def __init__(self): 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

38  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

39  Constructor of the BackgroundService class. 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

40  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

41  self.processes = [None, None] 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

42  self.connections = [None, None] 
3209
c5432abceb25
CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3173
diff
changeset

43  self.isWorking = None 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

44  self.__queue = [] 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

45  self.services = {} 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

46  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

47  super(BackgroundService, self).__init__() 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

48  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

49  networkInterface = Preferences.getDebugger("NetworkInterface") 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

50  if networkInterface == "all" or '.' in networkInterface: 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

51  self.hostAddress = '127.0.0.1' 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

52  else: 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

53  self.hostAddress = '::1' 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

54  self.listen(QHostAddress(self.hostAddress)) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

55  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

56  self.newConnection.connect(self.on_newConnection) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

57  port = self.serverPort() 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

58  ## NOTE: Need the port if started external in debugger: 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

59  print('BackgroundService listening on: %i' % port) 
3172
c0f78e9d0971
Bugfixes for Linux and if not both interpreters are specified. Project file updated.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3159
diff
changeset

60  if sys.platform == 'win32': 
c0f78e9d0971
Bugfixes for Linux and if not both interpreters are specified. Project file updated.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3159
diff
changeset

61  pyCompare = Utilities.samefilepath 
c0f78e9d0971
Bugfixes for Linux and if not both interpreters are specified. Project file updated.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3159
diff
changeset

62  else: 
c0f78e9d0971
Bugfixes for Linux and if not both interpreters are specified. Project file updated.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3159
diff
changeset

63  pyCompare = Utilities.samepath 
c0f78e9d0971
Bugfixes for Linux and if not both interpreters are specified. Project file updated.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3159
diff
changeset

64  
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

65  for pyIdx, pyName in enumerate(['Python', 'Python3']): 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

66  interpreter = Preferences.getDebugger( 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

67  pyName + "Interpreter") 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

68  
3172
c0f78e9d0971
Bugfixes for Linux and if not both interpreters are specified. Project file updated.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3159
diff
changeset

69  if pyCompare(interpreter, sys.executable): 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

70  process = self.__startInternalClient(port) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

71  else: 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

72  process = self.__startExternalClient(interpreter, port) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

73  self.processes[pyIdx] = process 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

74  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

75  def __startExternalClient(self, interpreter, port): 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

76  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

77  Private method to start the background client as external process. 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

78  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

79  @param interpreter path and name of the executable to start (string) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

80  @param port socket port to which the interpreter should connect (int) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

81  @return the process object (QProcess) or None 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

82  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

83  if interpreter == "" or not Utilities.isinpath(interpreter): 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

84  return None 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

85  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

86  backgroundClient = os.path.join( 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

87  getConfig('ericDir'), 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

88  "Utilities", "BackgroundClient.py") 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

89  proc = QProcess() 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

90  args = [backgroundClient, self.hostAddress, str(port)] 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

91  proc.start(interpreter, args) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

92  if not proc.waitForStarted(10000): 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

93  proc = None 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

94  return proc 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

95  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

96  def __startInternalClient(self, port): 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

97  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

98  Private method to start the background client as internal thread. 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

99  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

100  @param port socket port to which the interpreter should connect (int) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

101  @return the thread object (Thread) or None 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

102  """ 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

103  backgroundClient = BackgroundClient( 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

104  self.hostAddress, port) 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

105  thread = threading.Thread(target=backgroundClient.run) 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

106  thread.start() 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

107  return thread 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

108  
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

109  def __processQueue(self): 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

110  """ 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

111  Private method to take the next service request and send it to the 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

112  client. 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

113  """ 
3209
c5432abceb25
CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3173
diff
changeset

114  if self.__queue and self.isWorking is None: 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

115  fx, fn, pyVer, data = self.__queue.pop(0) 
3209
c5432abceb25
CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3173
diff
changeset

116  self.isWorking = pyVer 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

117  self.__send(fx, fn, pyVer, data) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

118  
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

119  def __send(self, fx, fn, pyVer, data): 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

120  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

121  Private method to send a job request to one of the clients. 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

122  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

123  @param fx remote function name to execute (str) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

124  @param fn filename for identification (str) 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

125  @param pyVer version for the required interpreter (int) 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

126  @param data function argument(s) (any basic datatype) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

127  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

128  packedData = json.dumps([fx, fn, data]) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

129  if sys.version_info[0] == 3: 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

130  packedData = bytes(packedData, 'utf8') 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

131  connection = self.connections[pyVer  2] 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

132  if connection is None: 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

133  if fx != 'INIT': 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

134  self.serviceNotAvailable.emit( 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

135  fx, fn, pyVer, self.trUtf8( 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

136  'Python{0} interpreter not configured.').format(pyVer)) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

137  # Reset flag and continue processing queue 
3209
c5432abceb25
CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3173
diff
changeset

138  self.isWorking = None 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

139  self.__processQueue() 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

140  else: 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

141  header = struct.pack( 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

142  b'!II', len(packedData), adler32(packedData) & 0xffffffff) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

143  connection.write(header) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

144  connection.write(packedData) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

145  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

146  def __receive(self, channel): 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

147  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

148  Private method to receive the response from the clients. 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

149  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

150  @param channel of the incomming connection (int: 0 or 1) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

151  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

152  connection = self.connections[channel] 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

153  header = connection.read(8) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

154  length, datahash = struct.unpack(b'!II', header) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

155  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

156  packedData = b'' 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

157  while len(packedData) < length: 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

158  connection.waitForReadyRead(50) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

159  packedData += connection.read(length  len(packedData)) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

160  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

161  assert adler32(packedData) & 0xffffffff == datahash, 'Hashes not equal' 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

162  if sys.version_info[0] == 3: 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

163  packedData = packedData.decode('utf8') 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

164  # "check" if is's a tuple of 3 values 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

165  fx, fn, data = json.loads(packedData) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

166  self.__postResult(fx, fn, data) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

167  
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

168  def __postResult(self, fx, fn, data): 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

169  """ 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

170  Private method to emit the correspondig signal for the returned 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

171  function. 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

172  
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

173  @param fx remote function name to execute (str) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

174  @param fn filename for identification (str) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

175  @param data function argument(s) (any basic datatype) 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

176  """ 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

177  if fx == 'INIT': 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

178  pass 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

179  elif fx == 'exception': 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

180  # Call sys.excepthook(type, value, traceback) to emulate the 
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

181  # exception which was caught on the client 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

182  #sys.excepthook(*data) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

183  print(data) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

184  else: 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

185  callback = self.services.get(fx) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

186  if callback: 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

187  callback[2](fn, *data) 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

188  
3209
c5432abceb25
CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3173
diff
changeset

189  self.isWorking = None 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

190  self.__processQueue() 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

191  
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

192  def enqueueRequest(self, fx, fn, pyVer, data): 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

193  """ 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

194  Implement a queued processing of incomming events. 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

195  
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

196  Dublicate file checks update an older request to avoid overrun or 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

197  starving of the check. 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

198  @param fx function name of the service (str) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

199  @param fn filename for identification (str) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

200  @param pyVer version for the required interpreter (int) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

201  @param data function argument(s) (any basic datatype) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

202  """ 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

203  args = [fx, fn, pyVer, data] 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

204  if fx == 'INIT': 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

205  self.__queue.insert(0, args) 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

206  else: 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

207  for pendingArg in self.__queue: 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

208  if pendingArg[:3] == args[:3]: 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

209  pendingArg[3] = args[3] 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

210  break 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

211  else: 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

212  self.__queue.append(args) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

213  self.__processQueue() 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

214  
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

215  def serviceConnect( 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

216  self, fx, modulepath, module, callback, onErrorCallback=None): 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

217  """ 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

218  Announce a new service to the background service/ client. 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

219  
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

220  @param fx function name of the service (str) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

221  @param modulepath full path to the module (str) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

222  @param module name to import (str) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

223  @param callback function on service response (function) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

224  @param onErrorCallback function if client isn't available (function) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

225  """ 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

226  self.services[fx] = modulepath, module, callback, onErrorCallback 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

227  self.enqueueRequest('INIT', fx, 0, [modulepath, module]) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

228  self.enqueueRequest('INIT', fx, 1, [modulepath, module]) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

229  if onErrorCallback: 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

230  self.serviceNotAvailable.connect(onErrorCallback) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

231  
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

232  def serviceDisconnect(self, fx): 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

233  """ 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

234  Remove the service from the service list. 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

235  
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

236  @param fx function name of the service 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

237  """ 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

238  self.services.pop(fx, None) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

239  
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

240  def on_newConnection(self): 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

241  """ 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

242  Slot for new incomming connections from the clients. 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

243  """ 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

244  connection = self.nextPendingConnection() 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

245  if not connection.waitForReadyRead(1000): 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

246  return 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

247  ch = 0 if connection.read(1) == b'2' else 1 
3209
c5432abceb25
CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3173
diff
changeset

248  # Avoid hanging of eric on shutdown 
c5432abceb25
CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3173
diff
changeset

249  if self.connections[ch]: 
c5432abceb25
CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3173
diff
changeset

250  self.connections[ch].close() 
c5432abceb25
CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3173
diff
changeset

251  if self.isWorking == ch + 2: 
c5432abceb25
CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3173
diff
changeset

252  self.isWorking = None 
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

253  self.connections[ch] = connection 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

254  connection.readyRead.connect( 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

255  lambda x=ch: self.__receive(x)) 
3159
02cb2adb4868
First implementation for the BackgroundService.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

256  
3173
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

257  for fx, args in self.services.items(): 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

258  self.enqueueRequest('INIT', fx, ch, args[:2]) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

259  
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

260  def shutdown(self): 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

261  """ 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

262  Cleanup the connections and processes when Eric is shuting down. 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

263  """ 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

264  for connection in self.connections: 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

265  if connection: 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

266  connection.close() 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

267  
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

268  for process in self.processes: 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

269  if isinstance(process, QProcess): 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

270  process.close() 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

271  process = None 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

272  elif isinstance(process, threading.Thread): 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

273  process.join(0.1) 
1fb284abe46e
Interface to add userdefined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
3172
diff
changeset

274  process = None 