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);
	}
}
Example #3
0
void CProfileSettings::Flush()
{
	if (m_hCallbackTimer)
	{
		KillCallbackTimer(m_hCallbackTimer);
		m_hCallbackTimer=NULL;
	}

	if (!m_bModified)
		return;

	Save(NULL, true, true);

	m_bModified=false;
}