void CVBoxMachine::Close() { if (m_bCallbackRegistered) { // Connect listsner for IVirtualBoxCallback log("Unregistering virtualbox callback\n"); CComPtr<IEventSource> spEventSource; m_spVirtualBox->get_EventSource(&spEventSource); spEventSource->UnregisterListener(&m_EventListener); m_bCallbackRegistered=false; } if (m_hPollTimer!=NULL) { KillCallbackTimer(m_hPollTimer); m_hPollTimer=NULL; } log("Releasing Machine\n"); m_spMachine.Release(); log("Releasing VirtualBox\n"); m_spVirtualBox.Release(); m_bstrMachineID.Empty(); m_State=MachineState_Null; log_close(); }
void CVBoxMachine::OnMachineStateChange(IMachineStateChangedEvent* e) { if (e!=NULL) { // A real machine state change event! CComBSTR bstrMachineID; e->get_MachineId(&bstrMachineID); if (!IsEqualStringI(bstrMachineID, m_bstrMachineID)) return; // Get new state e->get_State(&m_State); // Since we got an actual event from VirtualBox, let's assume it's working // and kill our poll timer if (m_hPollTimer!=NULL) { KillCallbackTimer(m_hPollTimer); } } else { // Poll mode // Get the current state and see if it changed MachineState newState; m_spMachine->get_State(&newState); if (newState == m_State) return; // Yep m_State = newState; } switch (m_State) { case MachineState_PoweredOff: case MachineState_Saved: case MachineState_Teleported: case MachineState_Aborted: m_dwHeadlessPid=0; CloseHandle(m_hHeadlessProcess); m_hHeadlessProcess=NULL; break; } if (m_pEvents) { m_pEvents->OnStateChange(m_State); } }
void CProfileSettings::Flush() { if (m_hCallbackTimer) { KillCallbackTimer(m_hCallbackTimer); m_hCallbackTimer=NULL; } if (!m_bModified) return; Save(NULL, true, true); m_bModified=false; }