fix: don't allow delete of rail vehicle when in active train

Dieser Commit ist enthalten in:
Reinder Feenstra 2023-09-24 20:22:31 +02:00
Ursprung 38b76e93c8
Commit cfb1fba8a5
6 geänderte Dateien mit 43 neuen und 2 gelöschten Zeilen

Datei anzeigen

@ -3,7 +3,7 @@
*
* This file is part of the traintastic source code.
*
* Copyright (C) 2019-2020 Reinder Feenstra
* Copyright (C) 2019-2020,2023 Reinder Feenstra
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -59,6 +59,11 @@ QString errorCodeToText(Message::ErrorCode ec)
text = "Unknown class id";
break;
case ErrorCode::LogMessageException:
assert(false);
text = "LogMessageException";
break;
case ErrorCode::Other:
assert(false);
text = "Other";

Datei anzeigen

@ -33,6 +33,7 @@
#include "../core/objectproperty.tpp"
#include "../core/tablemodel.hpp"
#include "../log/log.hpp"
#include "../log/logmessageexception.hpp"
#include "../log/memorylogger.hpp"
#include "../board/board.hpp"
#include "../board/tile/tiles.hpp"
@ -385,6 +386,26 @@ bool Session::processMessage(const Message& message)
return true;
}
}
catch(const LogMessageException& e)
{
if(message.isRequest())
{
auto response = Message::newErrorResponse(message.command(), message.requestId(), Message::ErrorCode::LogMessageException);
response->write(static_cast<uint32_t>(e.message()));
response->write(e.args().size());
for(const auto& arg : e.args())
{
response->write(arg);
}
m_connection->sendMessage(std::move(response));
return true;
}
else
{
// we can't report it back to the caller, so just log it.
Log::log(*object, e.message(), e.args());
}
}
catch(const std::exception& e)
{
if(message.isRequest())

Datei anzeigen

@ -27,6 +27,7 @@
#include "../../core/attributes.hpp"
#include "../../core/method.tpp"
#include "../../utils/displayname.hpp"
#include "../../log/logmessageexception.hpp"
RailVehicleList::RailVehicleList(Object& _parent, std::string_view parentPropertyName) :
ObjectList<RailVehicle>(_parent, parentPropertyName),
@ -36,7 +37,15 @@ RailVehicleList::RailVehicleList(Object& _parent, std::string_view parentPropert
auto& world = getWorld(parent());
return RailVehicles::create(world, railVehicleClassId, world.getUniqueId("vehicle"));
}}
, delete_{*this, "delete", std::bind(&RailVehicleList::deleteMethodHandler, this, std::placeholders::_1)}
, delete_{*this, "delete",
[this](const std::shared_ptr<RailVehicle>& railVehicle)
{
if(railVehicle->activeTrain.value())
{
throw LogMessageException(LogMessage::E3001_CANT_DELETE_RAIL_VEHICLE_WHEN_IN_ACTIVE_TRAIN);
}
RailVehicleList::deleteMethodHandler(railVehicle);
}}
{
const bool editable = contains(getWorld(parent()).state.value(), WorldState::Edit);

Datei anzeigen

@ -177,6 +177,7 @@ enum class LogMessage : uint32_t
E2022_SOCKET_CREATE_FAILED_X = LogMessageOffset::error + 2022,
E2023_SOCKET_IOCTL_FAILED_X = LogMessageOffset::error + 2023,
E2024_UNKNOWN_LOCOMOTIVE_MFX_UID_X = LogMessageOffset::error + 2024,
E3001_CANT_DELETE_RAIL_VEHICLE_WHEN_IN_ACTIVE_TRAIN = LogMessageOffset::error + 3001,
E9001_X_DURING_EXECUTION_OF_X_EVENT_HANDLER = LogMessageOffset::error + 9001,
E9999_X = LogMessageOffset::error + 9999,

Datei anzeigen

@ -115,6 +115,7 @@ class Message
InvalidProperty = 3,
InvalidValue = 4,
*/
LogMessageException = 61,
Other = 62,
Unknown = 63
};

Datei anzeigen

@ -4314,5 +4314,9 @@
{
"term": "message:W9001",
"definition": "Execution took %1 us"
},
{
"term": "message:E3001",
"definition": "Can't delete rail vehicle when in active train"
}
]