void UIMainEventListeningThread::run() { /* Initialize COM: */ COMBase::InitializeCOM(false); /* Copy source wrapper to this thread: */ CEventSource comSource = m_comSource; /* Copy listener wrapper to this thread: */ CEventListener comListener = m_comListener; /* While we are not in shutdown: */ while (!isShutdown()) { /* Fetch the event from the queue: */ CEvent comEvent = comSource.GetEvent(comListener, 500); if (!comEvent.isNull()) { /* Process the event and tell the listener: */ comListener.HandleEvent(comEvent); if (comEvent.GetWaitable()) comSource.EventProcessed(comListener, comEvent); } } /* Cleanup COM: */ COMBase::CleanupCOM(); }
void UIConsoleEventHandler::cleanup() { /* Get console: */ const CConsole console = m_pSession->session().GetConsole(); if (console.isNull() || !console.isOk()) return; /* Get event-source: */ CEventSource eventSource = console.GetEventSource(); AssertReturnVoid(!eventSource.isNull() || eventSource.isOk()); /* Unregister listener: */ eventSource.UnregisterListener(m_mainEventListener); }
void UIMainEventListener::registerSource(const CEventSource &comSource, const CEventListener &comListener) { /* Make sure source and listener are valid: */ AssertReturnVoid(!comSource.isNull()); AssertReturnVoid(!comListener.isNull()); /* Create thread for passed source: */ m_threads << new UIMainEventListeningThread(comSource, comListener); /* And start it: */ m_threads.last()->start(); }
void UIConsoleEventHandler::prepare() { /* Make sure session is passed: */ AssertPtrReturnVoid(m_pSession); /* Create Main-event listener instance: */ ComObjPtr<UIMainEventListenerImpl> pListener; pListener.createObject(); pListener->init(new UIMainEventListener, this); m_mainEventListener = CEventListener(pListener); /* Get console: */ const CConsole console = m_pSession->session().GetConsole(); AssertReturnVoid(!console.isNull() && console.isOk()); /* Get event-source: */ CEventSource eventSource = console.GetEventSource(); AssertReturnVoid(!eventSource.isNull() && eventSource.isOk()); /* Register listener for expected event-types: */ QVector<KVBoxEventType> events; events << KVBoxEventType_OnMousePointerShapeChanged << KVBoxEventType_OnMouseCapabilityChanged << KVBoxEventType_OnKeyboardLedsChanged << KVBoxEventType_OnStateChanged << KVBoxEventType_OnAdditionsStateChanged << KVBoxEventType_OnNetworkAdapterChanged << KVBoxEventType_OnMediumChanged << KVBoxEventType_OnVRDEServerChanged << KVBoxEventType_OnVRDEServerInfoChanged << KVBoxEventType_OnVideoCaptureChanged << KVBoxEventType_OnUSBControllerChanged << KVBoxEventType_OnUSBDeviceStateChanged << KVBoxEventType_OnSharedFolderChanged << KVBoxEventType_OnCPUExecutionCapChanged << KVBoxEventType_OnGuestMonitorChanged << KVBoxEventType_OnRuntimeError << KVBoxEventType_OnCanShowWindow << KVBoxEventType_OnShowWindow; eventSource.RegisterListener(m_mainEventListener, events, TRUE); /* Prepare connections: */ connect(pListener->getWrapped(), SIGNAL(sigMousePointerShapeChange(bool, bool, QPoint, QSize, QVector<uint8_t>)), this, SIGNAL(sigMousePointerShapeChange(bool, bool, QPoint, QSize, QVector<uint8_t>)), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigMouseCapabilityChange(bool, bool, bool, bool)), this, SIGNAL(sigMouseCapabilityChange(bool, bool, bool, bool)), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigKeyboardLedsChangeEvent(bool, bool, bool)), this, SIGNAL(sigKeyboardLedsChangeEvent(bool, bool, bool)), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigStateChange(KMachineState)), this, SIGNAL(sigStateChange(KMachineState)), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigAdditionsChange()), this, SIGNAL(sigAdditionsChange()), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigNetworkAdapterChange(CNetworkAdapter)), this, SIGNAL(sigNetworkAdapterChange(CNetworkAdapter)), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigMediumChange(CMediumAttachment)), this, SIGNAL(sigMediumChange(CMediumAttachment)), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigVRDEChange()), this, SIGNAL(sigVRDEChange()), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigVideoCaptureChange()), this, SIGNAL(sigVideoCaptureChange()), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigUSBControllerChange()), this, SIGNAL(sigUSBControllerChange()), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigUSBDeviceStateChange(CUSBDevice, bool, CVirtualBoxErrorInfo)), this, SIGNAL(sigUSBDeviceStateChange(CUSBDevice, bool, CVirtualBoxErrorInfo)), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigSharedFolderChange()), this, SIGNAL(sigSharedFolderChange()), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigCPUExecutionCapChange()), this, SIGNAL(sigCPUExecutionCapChange()), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigGuestMonitorChange(KGuestMonitorChangedEventType, ulong, QRect)), this, SIGNAL(sigGuestMonitorChange(KGuestMonitorChangedEventType, ulong, QRect)), Qt::QueuedConnection); connect(pListener->getWrapped(), SIGNAL(sigRuntimeError(bool, QString, QString)), this, SIGNAL(sigRuntimeError(bool, QString, QString)), Qt::QueuedConnection); /* This is a vetoable event, so we have to respond to the event and have to * use a direct connection therefor. */ connect(pListener->getWrapped(), SIGNAL(sigCanShowWindow(bool&, QString&)), this, SLOT(sltCanShowWindow(bool&, QString&)), Qt::DirectConnection); /* This returns a winId, so we have to respond to the event and have to use * a direct connection therefor. */ connect(pListener->getWrapped(), SIGNAL(sigShowWindow(LONG64&)), this, SLOT(sltShowWindow(LONG64&)), Qt::DirectConnection); }