Add an example/test plugin 81/321681/4
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Tue, 25 Mar 2025 13:40:22 +0000 (14:40 +0100)
committerMichal Bloch <m.bloch@samsung.com>
Mon, 31 Mar 2025 13:58:30 +0000 (15:58 +0200)
Co-authored-by: Michal Bloch <m.bloch@samsung.com>
Change-Id: Ifa7c7d2b773d1840449e855d9885d5c951c1b86d

packaging/sessiond.spec
tests/CMakeLists.txt
tests/plugin_example/CMakeLists.txt [new file with mode: 0644]
tests/plugin_example/empty_plugin.cpp [new file with mode: 0644]

index 6756610178be0cdb82df95efc4e6d12a5bc74328..324adbfaf8b387632ddf6ae1faa75497bc8d53fa 100644 (file)
@@ -41,6 +41,11 @@ Summary:    Example program using libsessiond API
 Group:      Development/Libraries
 %description -n subsession-client-example
 
+%package -n subsession-plugin-example
+Summary:    Example plugin for sessiond
+Group:      Development/Libraries
+%description -n subsession-plugin-example
+
 %prep
 %setup -q
 
@@ -103,3 +108,8 @@ popd
 %manifest sessiond.manifest
 %license LICENSE.MIT
 %{_bindir}/subsession-client-example
+
+%files -n subsession-plugin-example
+%manifest sessiond.manifest
+%license LICENSE.MIT
+%{_libdir}/system/plugin/libplugin-backend-sessiond.so
index 051d4f830b44772746641f4b28be0712a9cede68..66d2c66e97e7978b15ffdf3aee4315cccdd4b260 100644 (file)
@@ -1,4 +1,5 @@
 add_subdirectory(client_example)
+add_subdirectory(plugin_example)
 add_subdirectory(integration)
 
 option(ENABLE_TARGET_TESTS "On target API tests" ON)
diff --git a/tests/plugin_example/CMakeLists.txt b/tests/plugin_example/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f2e274e
--- /dev/null
@@ -0,0 +1,11 @@
+set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -Wall -fPIE -Wno-error=shadow -Werror=missing-field-initializers -pthread")
+set(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie")
+
+find_package(PkgConfig)
+find_package(GNUInstallDirs)
+pkg_check_modules(DEPS REQUIRED IMPORTED_TARGET glib-2.0 gio-2.0 gobject-2.0 dlog)
+
+add_library(plugin-backend-sessiond MODULE empty_plugin.cpp)
+target_compile_features(plugin-backend-sessiond PUBLIC cxx_std_20)
+target_link_libraries(plugin-backend-sessiond PRIVATE PkgConfig::DEPS libsessiond)
+install(TARGETS plugin-backend-sessiond DESTINATION "${CMAKE_INSTALL_LIBDIR}/system/plugin/")
diff --git a/tests/plugin_example/empty_plugin.cpp b/tests/plugin_example/empty_plugin.cpp
new file mode 100644 (file)
index 0000000..2db3e7f
--- /dev/null
@@ -0,0 +1,89 @@
+#include <stdio.h>
+#include <string.h>
+
+#include <system/syscommon-plugin-common-interface.h>
+#include <system/syscommon-plugin-sessiond.h>
+#include <system/syscommon-plugin-sessiond-interface.h>
+#include <system/syscommon-internal-sessiond.h>
+
+#undef LOG_TAG
+#define LOG_TAG "SESSIOND_PLUGIN"
+#include <dlog.h>
+
+extern "C" {
+
+static int sessiond_initialize (void)
+{
+       LOGI("initialized plugin!");
+
+       // TODO: pthread_create, sleep 10s, add_subsession -> emulates event from the outside
+       // or better yet, add a new dbus object and subscribe to some event, then add_subsession from inside method handler
+
+       return 0;
+}
+
+static int sessiond_deinitialize (void)
+{
+       LOGI("deinitialized plugin!");
+       return 0;
+}
+
+static int sessiond_subsession_changed(int uid, const char *from, const char *to)
+{
+       LOGI("uid %d's subsession changed %s -> %s!", uid, from, to);
+       return 0;
+}
+
+static int sessiond_subsession_added(int uid, const char *subsession)
+{
+       LOGI("uid %d subsession %s added!", uid, subsession);
+
+       // switch to "pick_me" subsession as soon as it is added
+       if (!strcmp(subsession, "switch_to_me_asap"))
+               sessiond_internal_switch_subsession(uid, "switch_to_me_asap");
+
+       return 0;
+}
+
+static int sessiond_subsession_removed(int uid, const char *subsession)
+{
+       LOGI("uid %d subsession %s removed!", uid, subsession);
+
+       if (!strcmp(subsession, "stump_on_removal"))
+               sessiond_internal_add_subsession_fixed_size(uid, "stump", 500);
+
+       return 0;
+}
+
+
+static syscommon_plugin_backend_sessiond_funcs plugin_funcs = {
+       .sessiond_initialize = sessiond_initialize,
+       .sessiond_deinitialize = sessiond_deinitialize,
+       .sessiond_subsession_changed = sessiond_subsession_changed,
+       .sessiond_subsession_added = sessiond_subsession_added,
+       .sessiond_subsession_removed = sessiond_subsession_removed,
+};
+
+static int sessiond_init(void **data)
+{
+       *data = (void *)&plugin_funcs;
+       return 0;
+}
+
+static int sessiond_exit(void *data)
+{
+       return 0;
+}
+
+#ifndef EXPORT
+#define EXPORT __attribute__((visibility("default")))
+#endif
+
+syscommon_plugin_backend EXPORT system_plugin_backend_sessiond_data = {
+       .name = "sessiond",
+       .vendor = "Samsung",
+       .init = sessiond_init,
+       .exit = sessiond_exit,
+};
+
+};