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
%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
--- /dev/null
+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/")
--- /dev/null
+#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,
+};
+
+};