Prevent inserting default-constructed elements in CSimulatorFsxCommon::m_simConnectObjects.

Hopefully this fixes null pointer dereference of CSimConnectObject::m_interpolator.
This commit is contained in:
Mathew Sutcliffe
2017-05-11 17:44:08 +01:00
parent 91341890ec
commit a89e042ff8
2 changed files with 13 additions and 4 deletions

View File

@@ -31,11 +31,13 @@ namespace BlackSimPlugin
void CSimConnectObject::addAircraftParts(const CAircraftParts &parts) void CSimConnectObject::addAircraftParts(const CAircraftParts &parts)
{ {
Q_ASSERT(m_interpolator);
m_interpolator->addAircraftParts(parts); m_interpolator->addAircraftParts(parts);
} }
void CSimConnectObject::addAircraftSituation(const CAircraftSituation &situation) void CSimConnectObject::addAircraftSituation(const CAircraftSituation &situation)
{ {
Q_ASSERT(m_interpolator);
m_interpolator->addAircraftSituation(situation); m_interpolator->addAircraftSituation(situation);
} }
@@ -76,11 +78,13 @@ namespace BlackSimPlugin
void CSimConnectObject::toggleInterpolatorMode() void CSimConnectObject::toggleInterpolatorMode()
{ {
Q_ASSERT(m_interpolator);
this->m_interpolator->toggleMode(); this->m_interpolator->toggleMode();
} }
bool CSimConnectObject::setInterpolatorMode(CInterpolatorMulti::Mode mode) bool CSimConnectObject::setInterpolatorMode(CInterpolatorMulti::Mode mode)
{ {
Q_ASSERT(m_interpolator);
return this->m_interpolator->setMode(mode); return this->m_interpolator->setMode(mode);
} }

View File

@@ -1072,7 +1072,7 @@ namespace BlackSimPlugin
objectId, SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, objectId, SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0,
sizeof(DataDefinitionRemoteAircraftPartsWithoutLights), &ddRemoteAircraftPartsWithoutLights); sizeof(DataDefinitionRemoteAircraftPartsWithoutLights), &ddRemoteAircraftPartsWithoutLights);
if (hr == S_OK) if (hr == S_OK && m_simConnectObjects.contains(simObj.getCallsign()))
{ {
// Update data // Update data
CSimConnectObject &objUdpate = m_simConnectObjects[simObj.getCallsign()]; CSimConnectObject &objUdpate = m_simConnectObjects[simObj.getCallsign()];
@@ -1103,8 +1103,11 @@ namespace BlackSimPlugin
const CCallsign callsign(simObj.getCallsign()); const CCallsign callsign(simObj.getCallsign());
// Update data // Update data
CSimConnectObject &simObjToUpdate = m_simConnectObjects[callsign]; if (m_simConnectObjects.contains(callsign))
simObjToUpdate.setLightsAsSent(lightsWanted); {
CSimConnectObject &simObjToUpdate = m_simConnectObjects[callsign];
simObjToUpdate.setLightsAsSent(lightsWanted);
}
// state available, then I can toggle // state available, then I can toggle
if (!lightsIsState.isNull()) if (!lightsIsState.isNull())
@@ -1141,6 +1144,7 @@ namespace BlackSimPlugin
CLogMessage(this).info("Missing light state for '%1'") << callsign; CLogMessage(this).info("Missing light state for '%1'") << callsign;
QTimer::singleShot(2500, this, [ = ] QTimer::singleShot(2500, this, [ = ]
{ {
if (!m_simConnectObjects.contains(callsign)) { return; }
const CSimConnectObject currentSimObj = m_simConnectObjects[callsign]; const CSimConnectObject currentSimObj = m_simConnectObjects[callsign];
if (!currentSimObj.hasValidRequestAndObjectId()) { return; } // stale if (!currentSimObj.hasValidRequestAndObjectId()) { return; } // stale
if (lightsWanted != currentSimObj.getLightsAsSent()) { return; } // changed in between if (lightsWanted != currentSimObj.getLightsAsSent()) { return; } // changed in between
@@ -1229,7 +1233,8 @@ namespace BlackSimPlugin
m_hSimConnect, simObject.getRequestId() + RequestSimDataOffset, m_hSimConnect, simObject.getRequestId() + RequestSimDataOffset,
CSimConnectDefinitions::DataRemoteAircraftSimData, CSimConnectDefinitions::DataRemoteAircraftSimData,
simObject.getObjectId(), period); simObject.getObjectId(), period);
if (result == S_OK)
if (result == S_OK && m_simConnectObjects.contains(simObject.getCallsign()))
{ {
m_simConnectObjects[simObject.getCallsign()].setSimDataPeriod(period); m_simConnectObjects[simObject.getCallsign()].setSimDataPeriod(period);
return true; return true;