Changeset 30492 in vbox
- Timestamp:
- Jun 29, 2010 11:25:54 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 63183
- Location:
- trunk/src/VBox
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VBoxShell/vboxshell.py
r30455 r30492 432 432 433 433 def monitorVBox2(ctx, dur): 434 def handleEventImpl(ev): 435 print "got event: %s %s" %(ev, str(ev.type)) 436 if ev.type == ctx['global'].constants.VBoxEventType_OnMachineStateChange: 437 scev = ctx['global'].queryInterface(ev, 'IMachineStateChangeEvent') 438 if scev: 439 print "state event: mach=%s state=%s" %(scev.machineId, scev.state) 440 441 class EventListener: 442 def __init__(self, arg): 443 pass 444 445 def handleEvent(self, ev): 446 handleEventImpl(ev) 447 434 448 vbox = ctx['vb'] 435 listener = vbox.eventSource.createListener() 449 active = True 450 if active: 451 listener = ctx['global'].createListener(EventListener) 452 else: 453 listener = vbox.eventSource.createListener() 436 454 registered = False 437 455 if dur == -1: … … 439 457 dur = 100000 440 458 try: 441 vbox.eventSource.registerListener(listener, [ctx['global'].constants.VBoxEventType_Any], False)459 vbox.eventSource.registerListener(listener, [ctx['global'].constants.VBoxEventType_Any], active) 442 460 registered = True 443 461 end = time.time() + dur 444 462 while time.time() < end: 445 ev = vbox.eventSource.getEvent(listener, 500) 446 if ev: 447 print "got event: %s %s" %(ev, str(ev.type)) 448 if ev.type == ctx['global'].constants.VBoxEventType_OnMachineStateChange: 449 scev = ctx['global'].queryInterface(ev, 'IMachineStateChangeEvent') 450 if scev: 451 print "state event: mach=%s state=%s" %(scev.machineId, scev.state) 452 # otherwise waitable events will leak 453 vbox.eventSource.eventProcessed(listener, ev) 463 if active: 464 ctx['global'].waitForEvents(500) 465 else: 466 ev = vbox.eventSource.getEvent(listener, 500) 467 if ev: 468 handleEventImpl(ev) 469 # otherwise waitable events will leak (active listeners ACK automatically) 470 vbox.eventSource.eventProcessed(listener, ev) 454 471 # We need to catch all exceptions here, otherwise listener will never be unregistered 455 except Exception, e: 456 printErr(ctx,e) 457 traceback.print_exc() 472 except: 458 473 pass 459 474 if listener and registered: … … 1013 1028 try: 1014 1029 while True: 1015 data = guest.getProcessOutput(pid, 0, 1000 , 4096)1030 data = guest.getProcessOutput(pid, 0, 10000, 4096) 1016 1031 if data and len(data) > 0: 1017 1032 sys.stdout.write(data) … … 3058 3073 pass 3059 3074 cmds = [] 3060 3075 3061 3076 if g_cmd is not None: 3062 3077 cmds = g_cmd.split(';') -
trunk/src/VBox/Main/glue/vboxapi.py
r30393 r30492 275 275 return d['result'] 276 276 277 def createListener(self, impl, arg): 278 d = {} 279 d['BaseClass'] = impl 280 d['arg'] = arg 281 d['tlb_guid'] = PlatformMSCOM.VBOX_TLB_GUID 282 str = "" 283 str += "import win32com.server.util\n" 284 str += "import pythoncom\n" 285 286 str += "class ListenerImpl(BaseClass):\n" 287 str += " _com_interfaces_ = ['IEventListener']\n" 288 str += " _typelib_guid_ = tlb_guid\n" 289 str += " _typelib_version_ = 1, 0\n" 290 str += " _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER\n" 291 # Maybe we'd better implement Dynamic invoke policy, to be more flexible here 292 str += " _reg_policy_spec_ = 'win32com.server.policy.EventHandlerPolicy'\n" 293 294 # capitalized version of callback method 295 str += " HandleEvent=BaseClass.handleEvent\n" 296 str += " def __init__(self): BaseClass.__init__(self, arg)\n" 297 str += "result = ListenerImpl()\n" 298 exec (str,d,d) 299 return d['result'] 300 277 301 def waitForEvents(self, timeout): 278 302 from win32api import GetCurrentThreadId … … 358 382 str += "result = xpcom.components.classes['@virtualbox.org/CallbackWrapper;1'].createInstance()\n" 359 383 str += "result.setLocalObject("+iface+"Impl())\n" 384 exec (str,d,d) 385 return d['result'] 386 387 def createListener(self, impl, arg): 388 d = {} 389 d['BaseClass'] = impl 390 d['arg'] = arg 391 str = "" 392 str += "import xpcom.components\n" 393 str += "class ListenerImpl(BaseClass):\n" 394 str += " _com_interfaces_ = xpcom.components.interfaces.IEventListener\n" 395 str += " def __init__(self): BaseClass.__init__(self, arg)\n" 396 str += "result = ListenerImpl()\n" 360 397 exec (str,d,d) 361 398 return d['result'] … … 444 481 raise Exception("no callbacks for webservices") 445 482 483 def createListener(self, impl, arg): 484 raise Exception("no active listeners for webservices") 485 446 486 def waitForEvents(self, timeout): 447 487 # Webservices cannot do that yet … … 544 584 return self.platform.createCallback(iface, impl, arg) 545 585 586 def createListener(self, impl, arg = None): 587 return self.platform.createListener(impl, arg) 588 546 589 def waitForEvents(self, timeout): 547 590 return self.platform.waitForEvents(timeout)
Note:
See TracChangeset
for help on using the changeset viewer.