mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-23 17:02:39 +00:00
# Description <!-- > Please provide a summary of the changes made in this PR. Include details such as: > * What issue does this PR address or fix? > * What new features or enhancements does this PR introduce? > * Are there any breaking changes or dependencies that need to be considered? --> A Python printer agent plugin could take the host down, and one of its operations could never report its result. This PR fixes both in `PrinterAgentPluginCapabilityTrampoline.hpp`. ## Changes ### A faulty printer agent no longer throws into the GUI `IPrinterAgent` reports failure through return values, and none of its callers catch. A Python `raise`, a missing override or a wrongly typed return from a printer agent plugin therefore escaped the trampoline as a C++ exception. Every trampoline operation now catches, logs `Printer agent plugin '<key>': <operation> failed: <error>`, and answers with what `NetworkAgent` returns when no printer agent is set. `BBLPrinterAgent` returns the same values when the Bambu plug-in is unavailable: - `-1` for every `int` status code - `false` for `start_discovery` and `fetch_filament_info` - `""` for `get_user_selected_machine` - an empty `AgentInfo` for `get_agent_info` (registration already rejects an empty agent ID) - `FilamentSyncMode::none` for `get_filament_sync_mode` `ORCA_PY_AGENT_OVERRIDE(ret, name, ...)` derives the fallback from the return type through `printer_agent_failure<ret>()`, so the call sites carry no fallback values of their own. An exception is the safety net for plugin bugs, not an error channel. A plugin reports an expected failure by returning a code, as the Bambu plug-in does. A raise is logged as a failure and collapses to the generic `-1`, so the GUI shows the generic message instead of the specific one (`-18` cancelled, `-4020` FTP upload failed, …). ### `bind_detect` results now reach the host `detect` is an out-parameter (`detectResult&`). pybind11 casts a reference argument to an override with a copy, so a plugin that filled in `detect` wrote to a throwaway object and the host always saw an empty `detectResult`. It is now passed so that Python edits the caller's struct. Plugins see the same `DetectResult` argument as before. ## TODO - Expose the `BAMBU_NETWORK_*` return codes to Python (the `orca.printer_agent` binding and the generated stub from `scripts/generate_orca_python_stubs.py`). Plugins can already return them, but only as hard-coded numbers. # Screenshots/Recordings/Graphs <!-- > Please attach relevant screenshots to showcase the UI changes. > Please attach images that can help explain the changes. --> ## Tests <!-- > Please describe the tests that you have conducted to verify the changes made in this PR. --> - New `tests/slic3rutils/test_plugin_printer_agent.cpp`: an agent whose operations raise, one that omits them, and one that returns the wrong type all answer like a missing agent, and the interpreter stays usable. A working agent's answers reach the host unchanged, including `request_bind_ticket`'s out-param and the fields a plugin writes into `bind_detect`'s `detect`. - The `bind_detect` check failed before the fix (`"" == "192.168.0.2"`) and passes after. - `slic3rutils` passes under `ctest` (144/144); full Release build clean on Linux. - End to end on Linux with a test plugin whose chosen operations raise (`start_discovery`, `get_filament_sync_mode`, `disconnect_printer`): selecting the plugin's agent in the printer preset and switching back logged each raise as a `Printer agent plugin '…': <operation> failed` line, and the app kept running and closed cleanly (exit 0). Without the guard, the first raise (`start_discovery`, on selecting the agent) ended the app with `Uncaught exception` and SIGABRT (exit 134); that run used a build whose printer-agent files are identical to `main`. <!-- > A guide for users on how to download the artifacts from this PR. --> [How to Download Pull Requests Artifacts for Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
75 lines
2.9 KiB
CMake
75 lines
2.9 KiB
CMake
get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME)
|
|
add_executable(${_TEST_NAME}_tests
|
|
${_TEST_NAME}_tests_main.cpp
|
|
test_bambu_filament_ids.cpp
|
|
test_creality_cfs_match.cpp
|
|
test_dev_mapping.cpp
|
|
test_filament_bitmap_utils.cpp
|
|
test_network_versions.cpp
|
|
test_action_source.cpp
|
|
test_plugin_host_api.cpp
|
|
test_plugin_capability_config.cpp
|
|
test_plugin_config.cpp
|
|
test_plugin_capabilities_in_use.cpp
|
|
test_plugin_install.cpp
|
|
test_plugin_lifecycle.cpp
|
|
test_plugin_printer_agent.cpp
|
|
test_slicing_pipeline_bindings.cpp
|
|
test_slicing_pipeline_config.cpp
|
|
test_plugin_sort.cpp
|
|
test_plugin_cloud_metadata.cpp
|
|
test_plugin_audit.cpp
|
|
test_shortcuts.cpp
|
|
../fff_print/test_helpers.cpp
|
|
)
|
|
|
|
if (MSVC)
|
|
target_link_libraries(${_TEST_NAME}_tests Setupapi.lib)
|
|
endif ()
|
|
|
|
target_link_libraries(${_TEST_NAME}_tests test_common libslic3r_gui libslic3r pybind11::embed Catch2::Catch2WithMain)
|
|
set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests")
|
|
|
|
orcaslicer_copy_test_dlls()
|
|
|
|
if (WIN32)
|
|
add_custom_command(TARGET ${_TEST_NAME}_tests POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:${_TEST_NAME}_tests>/python"
|
|
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_PREFIX_PATH}/libpython" "$<TARGET_FILE_DIR:${_TEST_NAME}_tests>/python"
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
"${CMAKE_PREFIX_PATH}/libpython/python${_bundled_python_abi}.dll"
|
|
"${CMAKE_PREFIX_PATH}/libpython/vcruntime140.dll"
|
|
"${CMAKE_PREFIX_PATH}/libpython/vcruntime140_1.dll"
|
|
"$<TARGET_FILE_DIR:${_TEST_NAME}_tests>"
|
|
COMMENT "Copying Python runtime for slic3rutils plugin host API tests"
|
|
VERBATIM
|
|
)
|
|
elseif (APPLE)
|
|
target_link_options(${_TEST_NAME}_tests PRIVATE
|
|
"LINKER:-rpath,@executable_path/python/lib")
|
|
|
|
add_custom_command(TARGET ${_TEST_NAME}_tests POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E rm -rf
|
|
"$<TARGET_FILE_DIR:${_TEST_NAME}_tests>/python"
|
|
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
|
"${CMAKE_PREFIX_PATH}/libpython"
|
|
"$<TARGET_FILE_DIR:${_TEST_NAME}_tests>/python"
|
|
COMMENT "Copying Python runtime for macOS plugin host API tests"
|
|
VERBATIM
|
|
)
|
|
elseif (FLATPAK)
|
|
# Same <testdir>/python home as WIN32/APPLE; symlink since /app/libpython
|
|
# already ships in the flatpak (the test exe links libpython3.12.so from it).
|
|
add_custom_command(TARGET ${_TEST_NAME}_tests POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E rm -rf
|
|
"$<TARGET_FILE_DIR:${_TEST_NAME}_tests>/python"
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink
|
|
"${CMAKE_PREFIX_PATH}/libpython"
|
|
"$<TARGET_FILE_DIR:${_TEST_NAME}_tests>/python"
|
|
COMMENT "Linking Python runtime for flatpak plugin host API tests"
|
|
VERBATIM
|
|
)
|
|
endif()
|
|
|
|
orcaslicer_discover_tests(${_TEST_NAME}_tests)
|