/** * Handler for all trajectories * $Id$ * $HeadURL$ * $Author$ * Created by Norbert Thoden, ESVG, 2026-01-28 */ #include "handler_trajectory.h" #include "object_trajectory.h" #include namespace AreaEffectSimulation { static int s_idCounter = 0; /// id counter for creating trajectories: class HandlerTrajectory::Private { public: Private() = default; ~Private() = default; MainHandler *m_mainHandler{nullptr}; QMap m_objectMap; }; // class HandlerTrajectory::Private //----------------------------------------------------------------------------- HandlerTrajectory::HandlerTrajectory(MainHandler *mainHandler) : d(new Private) , m_logger(getLogger("HandlerTrajectory")) { d->m_mainHandler = mainHandler; } HandlerTrajectory::~HandlerTrajectory() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; delete d; TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } int HandlerTrajectory::create(const TrajectoryData &providedData) { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; int newId = -1; auto *ifs = new ObjectTrajectory(d->m_mainHandler); if (!ifs) { ERROR_LOG(m_logger)<<" couldn't create ObjectTrajectory!"; TRACE_LOG(m_logger) << LOGFUNCTION << " END"; return -1; } newId = ++s_idCounter; // avoid copying providedData. // cast const away to be able to update the id: TrajectoryData *PROVIDED_DATA = const_cast(&providedData); PROVIDED_DATA->id = newId; if (ifs->createObject(providedData)) { d->m_objectMap.insert(providedData.id, ifs); ifs->publish(); } TRACE_LOG(m_logger) << LOGFUNCTION << " END, newId = " << newId; return newId; } bool HandlerTrajectory::update(const TrajectoryData &providedData) { TRACE_LOG(m_logger) << LOGFUNCTION << " START, id = " << providedData.id; bool success = false; if (!providedData.isIdValid()) { TRACE_LOG(m_logger) << LOGFUNCTION << " END "; return false; } auto *ifs = d->m_objectMap[providedData.id]; if (ifs && ifs->updateObject(providedData)) { ifs->publish(); success = true; } TRACE_LOG(m_logger) << LOGFUNCTION << " END, success = " << success; return success; } bool HandlerTrajectory::remove(const int trajId) { TRACE_LOG(m_logger) << LOGFUNCTION << " START, id = " << trajId; if (trajId <= 0) { ERROR_LOG(m_logger) << " remove topic: got Invalid trajectory Id: "<m_objectMap[trajId]; if (!ifs->removeTopic()) { ERROR_LOG(m_logger) << "failed to remove trajectory with id " << trajId; return false; } d->m_objectMap.remove(trajId); delete ifs; ifs = nullptr; TRACE_LOG(m_logger) << LOGFUNCTION << " END "; return true; } int HandlerTrajectory::createUpdate(const TrajectoryData &providedData) { TRACE_LOG(m_logger) << LOGFUNCTION << " START, id = " << providedData.id; int ret = -1; if (providedData.isIdValid()) { if (update(providedData)) ret = providedData.id; } else { ret = create(providedData); } TRACE_LOG(m_logger) << LOGFUNCTION << " END, id ret " << ret; return ret; } int HandlerTrajectory::count() const { return d->m_objectMap.size(); } } // Namespace AreaEffectSimulation