| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  | import time | 
					
						
							|  |  |  | import socket | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-20 04:24:43 +00:00
										 |  |  | import boolcheck | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  | import CallTips | 
					
						
							|  |  |  | import RemoteDebugger | 
					
						
							|  |  |  | import RemoteObjectBrowser | 
					
						
							|  |  |  | import StackViewer | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | import rpc | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  | import __main__ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | def main(): | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  |     """Start the Python execution server in a subprocess
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  |     In the Python subprocess, RPCServer is instantiated with handlerclass | 
					
						
							|  |  |  |     MyHandler, which inherits register/unregister methods from RPCHandler via | 
					
						
							|  |  |  |     the mix-in class SocketIO. | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  |     When the RPCServer svr is instantiated, the TCPServer initialization | 
					
						
							|  |  |  |     creates an instance of run.MyHandler and calls its handle() method. | 
					
						
							|  |  |  |     handle() instantiates a run.Executive object, passing it a reference to the | 
					
						
							|  |  |  |     MyHandler object.  That reference is saved as attribute rpchandler of the | 
					
						
							|  |  |  |     Executive instance.  The Executive methods have access to the reference and | 
					
						
							|  |  |  |     can pass it on to entities that they command | 
					
						
							|  |  |  |     (e.g. RemoteDebugger.Debugger.start_debugger()).  The latter, in turn, can | 
					
						
							|  |  |  |     call MyHandler(SocketIO) register/unregister methods via the reference to | 
					
						
							|  |  |  |     register and unregister themselves. | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |     port = 8833 | 
					
						
							|  |  |  |     if sys.argv[1:]: | 
					
						
							|  |  |  |         port = int(sys.argv[1]) | 
					
						
							|  |  |  |     sys.argv[:] = [""] | 
					
						
							|  |  |  |     addr = ("localhost", port) | 
					
						
							| 
									
										
										
										
											2002-08-05 03:52:10 +00:00
										 |  |  |     for i in range(6): | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  |         time.sleep(i) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             svr = rpc.RPCServer(addr, MyHandler) | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |         except socket.error, err: | 
					
						
							| 
									
										
										
										
											2002-08-05 03:52:10 +00:00
										 |  |  |             if i < 3: | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  |                 print>>sys.__stderr__, ".. ", | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 print>>sys.__stderr__,"\nPython subprocess socket error: "\ | 
					
						
							|  |  |  |                                               + err[1] + ", retrying...." | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         print>>sys.__stderr__, "\nConnection to Idle failed, exiting." | 
					
						
							|  |  |  |         sys.exit() | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |     svr.handle_request() # A single request only | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MyHandler(rpc.RPCHandler): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def handle(self): | 
					
						
							|  |  |  |         executive = Executive(self) | 
					
						
							|  |  |  |         self.register("exec", executive) | 
					
						
							|  |  |  |         sys.stdin = self.get_remote_proxy("stdin") | 
					
						
							|  |  |  |         sys.stdout = self.get_remote_proxy("stdout") | 
					
						
							|  |  |  |         sys.stderr = self.get_remote_proxy("stderr") | 
					
						
							|  |  |  |         rpc.RPCHandler.handle(self) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Executive: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, rpchandler): | 
					
						
							| 
									
										
										
										
											2002-06-26 02:32:09 +00:00
										 |  |  |         self.rpchandler = rpchandler | 
					
						
							| 
									
										
										
										
											2002-08-25 14:08:07 +00:00
										 |  |  |         self.locals = __main__.__dict__ | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  |         self.calltip = CallTips.CallTips() | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def runcode(self, code): | 
					
						
							| 
									
										
										
										
											2002-08-25 14:08:07 +00:00
										 |  |  |         exec code in self.locals | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-16 03:32:24 +00:00
										 |  |  |     def start_the_debugger(self, gui_adap_oid): | 
					
						
							| 
									
										
										
										
											2002-06-26 02:32:09 +00:00
										 |  |  |         return RemoteDebugger.start_debugger(self.rpchandler, gui_adap_oid) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def stop_the_debugger(self, idb_adap_oid): | 
					
						
							|  |  |  |         "Unregister the Idb Adapter.  Link objects and Idb then subject to GC" | 
					
						
							|  |  |  |         self.rpchandler.unregister(idb_adap_oid) | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  |     def get_the_calltip(self, name): | 
					
						
							|  |  |  |         return self.calltip.fetch_tip(name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |     def stackviewer(self, flist_oid=None): | 
					
						
							|  |  |  |         if not hasattr(sys, "last_traceback"): | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  |         flist = None | 
					
						
							|  |  |  |         if flist_oid is not None: | 
					
						
							| 
									
										
										
										
											2002-06-26 02:32:09 +00:00
										 |  |  |             flist = self.rpchandler.get_remote_proxy(flist_oid) | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |         tb = sys.last_traceback | 
					
						
							|  |  |  |         while tb and tb.tb_frame.f_globals["__name__"] in ["rpc", "run"]: | 
					
						
							|  |  |  |             tb = tb.tb_next | 
					
						
							|  |  |  |         item = StackViewer.StackTreeItem(flist, tb) | 
					
						
							|  |  |  |         return RemoteObjectBrowser.remote_object_tree_item(item) |