10 |
10 |
11 import os |
11 import os |
12 import sys |
12 import sys |
13 |
13 |
14 from PyQt5.QtCore import pyqtSignal, QModelIndex |
14 from PyQt5.QtCore import pyqtSignal, QModelIndex |
15 from PyQt5.QtNetwork import QTcpServer, QHostAddress, QHostInfo, \ |
15 from PyQt5.QtNetwork import ( |
16 QNetworkInterface |
16 QTcpServer, QHostAddress, QHostInfo, QNetworkInterface |
|
17 ) |
17 |
18 |
18 from E5Gui.E5Application import e5App |
19 from E5Gui.E5Application import e5App |
19 from E5Gui import E5MessageBox |
20 from E5Gui import E5MessageBox |
20 |
21 |
21 from .BreakPointModel import BreakPointModel |
22 from .BreakPointModel import BreakPointModel |
178 # the value |
179 # the value |
179 |
180 |
180 # create our models |
181 # create our models |
181 self.breakpointModel = BreakPointModel(self) |
182 self.breakpointModel = BreakPointModel(self) |
182 self.watchpointModel = WatchPointModel(self) |
183 self.watchpointModel = WatchPointModel(self) |
183 self.watchSpecialCreated = \ |
184 self.watchSpecialCreated = self.tr( |
184 self.tr("created", "must be same as in EditWatchpointDialog") |
185 "created", "must be same as in EditWatchpointDialog") |
185 self.watchSpecialChanged = \ |
186 self.watchSpecialChanged = self.tr( |
186 self.tr("changed", "must be same as in EditWatchpointDialog") |
187 "changed", "must be same as in EditWatchpointDialog") |
187 |
188 |
188 self.networkInterface = Preferences.getDebugger("NetworkInterface") |
189 self.networkInterface = Preferences.getDebugger("NetworkInterface") |
189 if self.networkInterface == "all": |
190 if self.networkInterface == "all": |
190 hostAddress = QHostAddress("0.0.0.0") # QHostAddress.Any) |
191 hostAddress = QHostAddress("0.0.0.0") # QHostAddress.Any) |
191 elif self.networkInterface == "allv6": |
192 elif self.networkInterface == "allv6": |
192 hostAddress = QHostAddress("::") # QHostAddress.AnyIPv6) |
193 hostAddress = QHostAddress("::") # QHostAddress.AnyIPv6) |
193 else: |
194 else: |
194 hostAddress = QHostAddress(self.networkInterface) |
195 hostAddress = QHostAddress(self.networkInterface) |
195 self.networkInterfaceName, self.networkInterfaceIndex = \ |
196 self.networkInterfaceName, self.networkInterfaceIndex = ( |
196 self.__getNetworkInterfaceAndIndex(self.networkInterface) |
197 self.__getNetworkInterfaceAndIndex(self.networkInterface)) |
197 |
198 |
198 if not preventPassiveDebugging and \ |
199 if (not preventPassiveDebugging and |
199 Preferences.getDebugger("PassiveDbgEnabled"): |
200 Preferences.getDebugger("PassiveDbgEnabled")): |
200 sock = Preferences.getDebugger("PassiveDbgPort") # default: 42424 |
201 sock = Preferences.getDebugger("PassiveDbgPort") # default: 42424 |
201 self.listen(hostAddress, sock) |
202 self.listen(hostAddress, sock) |
202 self.passive = True |
203 self.passive = True |
203 self.passiveClientExited = False |
204 self.passiveClientExited = False |
204 else: |
205 else: |
210 self.debuggerInterface = None |
211 self.debuggerInterface = None |
211 self.debugging = False |
212 self.debugging = False |
212 self.running = False |
213 self.running = False |
213 self.clientProcess = None |
214 self.clientProcess = None |
214 self.clientInterpreter = "" |
215 self.clientInterpreter = "" |
215 self.clientType = \ |
216 self.clientType = Preferences.Prefs.settings.value('DebugClient/Type') |
216 Preferences.Prefs.settings.value('DebugClient/Type') |
|
217 if self.clientType is None: |
217 if self.clientType is None: |
218 self.clientType = 'Python3' |
218 self.clientType = 'Python3' |
219 # Change clientType if dependent interpreter does not exist anymore |
219 # Change clientType if dependent interpreter does not exist anymore |
220 # (maybe deinstalled,...) |
220 # (maybe deinstalled,...) |
221 elif self.clientType == 'Python2' and Preferences.getDebugger( |
221 elif self.clientType == 'Python2' and Preferences.getDebugger( |
285 if address not in ["all", "allv6"]: |
285 if address not in ["all", "allv6"]: |
286 for networkInterface in QNetworkInterface.allInterfaces(): |
286 for networkInterface in QNetworkInterface.allInterfaces(): |
287 addressEntries = networkInterface.addressEntries() |
287 addressEntries = networkInterface.addressEntries() |
288 if len(addressEntries) > 0: |
288 if len(addressEntries) > 0: |
289 for addressEntry in addressEntries: |
289 for addressEntry in addressEntries: |
290 if addressEntry.ip().toString().lower() == \ |
290 if (addressEntry.ip().toString().lower() == |
291 address.lower(): |
291 address.lower()): |
292 return networkInterface.humanReadableName(), \ |
292 return (networkInterface.humanReadableName(), |
293 networkInterface.index() |
293 networkInterface.index()) |
294 |
294 |
295 return "", 0 |
295 return "", 0 |
296 |
296 |
297 def preferencesChanged(self): |
297 def preferencesChanged(self): |
298 """ |
298 """ |
299 Public slot to handle the preferencesChanged signal. |
299 Public slot to handle the preferencesChanged signal. |
300 """ |
300 """ |
301 registeredInterfaces = {} |
301 registeredInterfaces = {} |
302 for interfaceName in self.__debuggerInterfaces: |
302 for interfaceName in self.__debuggerInterfaces: |
303 registeredInterfaces[interfaceName] = \ |
303 registeredInterfaces[interfaceName] = ( |
304 self.__debuggerInterfaces[interfaceName] |
304 self.__debuggerInterfaces[interfaceName]) |
305 |
305 |
306 self.__debuggerInterfaceRegistry = {} |
306 self.__debuggerInterfaceRegistry = {} |
307 for interfaceName, getRegistryData in registeredInterfaces.items(): |
307 for interfaceName, getRegistryData in registeredInterfaces.items(): |
308 self.registerDebuggerInterface(interfaceName, getRegistryData, |
308 self.registerDebuggerInterface(interfaceName, getRegistryData, |
309 reregister=True) |
309 reregister=True) |
336 |
336 |
337 if not reregister: |
337 if not reregister: |
338 self.__debuggerInterfaces[interfaceName] = getRegistryData |
338 self.__debuggerInterfaces[interfaceName] = getRegistryData |
339 registryDataList = getRegistryData() |
339 registryDataList = getRegistryData() |
340 if registryDataList: |
340 if registryDataList: |
341 for clientLanguage, clientCapabilities, clientExtensions, \ |
341 for (clientLanguage, clientCapabilities, clientExtensions, |
342 interfaceCreator in registryDataList: |
342 interfaceCreator) in registryDataList: |
343 self.__debuggerInterfaceRegistry[clientLanguage] = [ |
343 self.__debuggerInterfaceRegistry[clientLanguage] = [ |
344 clientCapabilities, clientExtensions, interfaceCreator, |
344 clientCapabilities, clientExtensions, interfaceCreator, |
345 interfaceName] |
345 interfaceName] |
346 |
346 |
347 def unregisterDebuggerInterface(self, interfaceName): |
347 def unregisterDebuggerInterface(self, interfaceName): |
351 @param interfaceName interfaceName of the debugger interface |
351 @param interfaceName interfaceName of the debugger interface |
352 @type str |
352 @type str |
353 """ |
353 """ |
354 if interfaceName in self.__debuggerInterfaces: |
354 if interfaceName in self.__debuggerInterfaces: |
355 clientLanguages = [] |
355 clientLanguages = [] |
356 for clientLanguage, registryData in \ |
356 for clientLanguage, registryData in ( |
357 self.__debuggerInterfaceRegistry.items(): |
357 self.__debuggerInterfaceRegistry.items()): |
358 if interfaceName == registryData[-1]: |
358 if interfaceName == registryData[-1]: |
359 clientLanguages.append(clientLanguage) |
359 clientLanguages.append(clientLanguage) |
360 for clientLanguage in clientLanguages: |
360 for clientLanguage in clientLanguages: |
361 del self.__debuggerInterfaceRegistry[clientLanguage] |
361 del self.__debuggerInterfaceRegistry[clientLanguage] |
362 del self.__debuggerInterfaces[interfaceName] |
362 del self.__debuggerInterfaces[interfaceName] |
402 languages.remove("None") |
402 languages.remove("None") |
403 except ValueError: |
403 except ValueError: |
404 pass # it is not in the list |
404 pass # it is not in the list |
405 |
405 |
406 if shellOnly: |
406 if shellOnly: |
407 languages = \ |
407 languages = [lang for lang in languages |
408 [lang for lang in languages |
408 if self.__debuggerInterfaceRegistry[lang][0] & |
409 if self.__debuggerInterfaceRegistry[lang][0] & |
409 DebugClientCapabilities.HasShell] |
410 DebugClientCapabilities.HasShell] |
|
411 |
410 |
412 return languages[:] |
411 return languages[:] |
413 |
412 |
414 def getExtensions(self, language): |
413 def getExtensions(self, language): |
415 """ |
414 """ |
432 """ |
431 """ |
433 if self.lastClientType != self.clientType or clientType is not None: |
432 if self.lastClientType != self.clientType or clientType is not None: |
434 if clientType is None: |
433 if clientType is None: |
435 clientType = self.clientType |
434 clientType = self.clientType |
436 if clientType in self.__debuggerInterfaceRegistry: |
435 if clientType in self.__debuggerInterfaceRegistry: |
437 self.debuggerInterface = \ |
436 self.debuggerInterface = ( |
438 self.__debuggerInterfaceRegistry[clientType][2]( |
437 self.__debuggerInterfaceRegistry[clientType][2]( |
439 self, self.passive) |
438 self, self.passive)) |
440 else: |
439 else: |
441 self.debuggerInterface = \ |
440 self.debuggerInterface = ( |
442 self.__debuggerInterfaceRegistry["None"][2]( |
441 self.__debuggerInterfaceRegistry["None"][2]( |
443 self, self.passive) |
442 self, self.passive)) |
444 self.clientType = "None" |
443 self.clientType = "None" |
445 |
444 |
446 def __setClientType(self, clType): |
445 def __setClientType(self, clType): |
447 """ |
446 """ |
448 Private method to set the client type. |
447 Private method to set the client type. |
499 self.__forProject = forProject |
498 self.__forProject = forProject |
500 self.__createDebuggerInterface() |
499 self.__createDebuggerInterface() |
501 if forProject: |
500 if forProject: |
502 project = e5App().getObject("Project") |
501 project = e5App().getObject("Project") |
503 if not project.isDebugPropertiesLoaded(): |
502 if not project.isDebugPropertiesLoaded(): |
504 self.clientProcess, isNetworked, clientInterpreter = \ |
503 self.clientProcess, isNetworked, clientInterpreter = ( |
505 self.debuggerInterface.startRemote( |
504 self.debuggerInterface.startRemote( |
506 self.serverPort(), runInConsole, venvName, |
505 self.serverPort(), runInConsole, venvName, |
507 self.__originalPathString, workingDir=workingDir) |
506 self.__originalPathString, workingDir=workingDir)) |
508 else: |
507 else: |
509 self.clientProcess, isNetworked, clientInterpreter = \ |
508 self.clientProcess, isNetworked, clientInterpreter = ( |
510 self.debuggerInterface.startRemoteForProject( |
509 self.debuggerInterface.startRemoteForProject( |
511 self.serverPort(), runInConsole, venvName, |
510 self.serverPort(), runInConsole, venvName, |
512 self.__originalPathString, workingDir=workingDir) |
511 self.__originalPathString, workingDir=workingDir)) |
513 else: |
512 else: |
514 self.clientProcess, isNetworked, clientInterpreter = \ |
513 self.clientProcess, isNetworked, clientInterpreter = ( |
515 self.debuggerInterface.startRemote( |
514 self.debuggerInterface.startRemote( |
516 self.serverPort(), runInConsole, venvName, |
515 self.serverPort(), runInConsole, venvName, |
517 self.__originalPathString, workingDir=workingDir) |
516 self.__originalPathString, workingDir=workingDir)) |
518 |
517 |
519 if self.clientProcess: |
518 if self.clientProcess: |
520 self.clientProcess.readyReadStandardError.connect( |
519 self.clientProcess.readyReadStandardError.connect( |
521 self.__clientProcessError) |
520 self.__clientProcessError) |
522 self.clientProcess.readyReadStandardOutput.connect( |
521 self.clientProcess.readyReadStandardOutput.connect( |
580 @param end end row (integer) |
579 @param end end row (integer) |
581 """ |
580 """ |
582 if self.debugging: |
581 if self.debugging: |
583 for row in range(start, end + 1): |
582 for row in range(start, end + 1): |
584 index = self.breakpointModel.index(row, 0, parentIndex) |
583 index = self.breakpointModel.index(row, 0, parentIndex) |
585 fn, lineno = \ |
584 fn, lineno = ( |
586 self.breakpointModel.getBreakPointByIndex(index)[0:2] |
585 self.breakpointModel.getBreakPointByIndex(index)[0:2]) |
587 self.remoteBreakpoint(fn, lineno, False) |
586 self.remoteBreakpoint(fn, lineno, False) |
588 |
587 |
589 def __changeBreakPoints(self, startIndex, endIndex): |
588 def __changeBreakPoints(self, startIndex, endIndex): |
590 """ |
589 """ |
591 Private slot to set changed breakpoints. |
590 Private slot to set changed breakpoints. |
618 @param end end row (integer) |
617 @param end end row (integer) |
619 """ |
618 """ |
620 if self.debugging: |
619 if self.debugging: |
621 for row in range(start, end + 1): |
620 for row in range(start, end + 1): |
622 index = self.breakpointModel.index(row, 0, parentIndex) |
621 index = self.breakpointModel.index(row, 0, parentIndex) |
623 fn, line, cond, temp, enabled, ignorecount = \ |
622 fn, line, cond, temp, enabled, ignorecount = ( |
624 self.breakpointModel.getBreakPointByIndex(index)[:6] |
623 self.breakpointModel.getBreakPointByIndex(index)[:6]) |
625 self.remoteBreakpoint(fn, line, True, cond, temp) |
624 self.remoteBreakpoint(fn, line, True, cond, temp) |
626 if not enabled: |
625 if not enabled: |
627 self.__remoteBreakpointEnable(fn, line, False) |
626 self.__remoteBreakpointEnable(fn, line, False) |
628 if ignorecount: |
627 if ignorecount: |
629 self.__remoteBreakpointIgnore(fn, line, ignorecount) |
628 self.__remoteBreakpointIgnore(fn, line, ignorecount) |
685 @param end end row (integer) |
684 @param end end row (integer) |
686 """ |
685 """ |
687 if self.debugging: |
686 if self.debugging: |
688 for row in range(start, end + 1): |
687 for row in range(start, end + 1): |
689 index = self.watchpointModel.index(row, 0, parentIndex) |
688 index = self.watchpointModel.index(row, 0, parentIndex) |
690 cond, special = \ |
689 cond, special = ( |
691 self.watchpointModel.getWatchPointByIndex(index)[0:2] |
690 self.watchpointModel.getWatchPointByIndex(index)[0:2]) |
692 cond = self.__makeWatchCondition(cond, special) |
691 cond = self.__makeWatchCondition(cond, special) |
693 self.__remoteWatchpoint(cond, False) |
692 self.__remoteWatchpoint(cond, False) |
694 |
693 |
695 def __watchPointDataAboutToBeChanged(self, startIndex, endIndex): |
694 def __watchPointDataAboutToBeChanged(self, startIndex, endIndex): |
696 """ |
695 """ |
713 @param end end row (integer) |
712 @param end end row (integer) |
714 """ |
713 """ |
715 if self.debugging: |
714 if self.debugging: |
716 for row in range(start, end + 1): |
715 for row in range(start, end + 1): |
717 index = self.watchpointModel.index(row, 0, parentIndex) |
716 index = self.watchpointModel.index(row, 0, parentIndex) |
718 cond, special, temp, enabled, ignorecount = \ |
717 cond, special, temp, enabled, ignorecount = ( |
719 self.watchpointModel.getWatchPointByIndex(index)[:5] |
718 self.watchpointModel.getWatchPointByIndex(index)[:5]) |
720 cond = self.__makeWatchCondition(cond, special) |
719 cond = self.__makeWatchCondition(cond, special) |
721 self.__remoteWatchpoint(cond, True, temp) |
720 self.__remoteWatchpoint(cond, True, temp) |
722 if not enabled: |
721 if not enabled: |
723 self.__remoteWatchpointEnable(cond, False) |
722 self.__remoteWatchpointEnable(cond, False) |
724 if ignorecount: |
723 if ignorecount: |