Add subsession current/list getters to plugin API 15/323615/2
authorMichal Bloch <m.bloch@samsung.com>
Wed, 30 Apr 2025 20:14:15 +0000 (22:14 +0200)
committerMichal Bloch <m.bloch@samsung.com>
Wed, 30 Apr 2025 21:44:34 +0000 (23:44 +0200)
With some usage in the example/test plugin.

Change-Id: Ieb1826b69fea90d926b7ed85e8c9cb0a2b9cf101

src/library/include/sessiond-plugin-internal.h
src/service/src/main_context.hpp
src/service/src/plugin_push.cpp
tests/plugin_example/empty_plugin.cpp

index 56cf03c9602b4a2040b684198e106c9fe0cae73b..496b6b93ddce60fa1078087eb96077d115fe2cd7 100644 (file)
@@ -25,6 +25,8 @@
 extern "C" {
 #endif
 
+#include <sessiond.h> // for subsession_user_t
+
 /**
  * @brief Add a subsession (called from plugin)
  * @param uid user ID to add the subsession to
@@ -58,6 +60,29 @@ int sessiond_internal_remove_subsession(int uid, const char *subsession);
  */
 int sessiond_internal_switch_subsession(int uid, const char *subsession);
 
+/**
+ * @brief Get subsession list (called from plugin)
+ * @param uid user ID whose subsession list to get
+ * @param subsession_list Address of a pointer that will contain the returned array
+ * @param subsession_count Address of a number that will contain the size of the array
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int sessiond_internal_get_subsession_list(int uid, subsession_user_t **subsession_list, size_t *subsession_count);
+
+/**
+ * @brief Free subsession list (called from plugin)
+ * @param subsession_list Pointer containing the list to free
+ */
+void sessiond_internal_free_subsession_list(subsession_user_t *subsession_list);
+
+/**
+ * @brief Get current subsession (called from plugin)
+ * @param uid user ID whose current subsession to get
+ * @param subsession Address of a buffer which will contain the subsession name
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int sessiond_internal_get_current_subsession(int uid, subsession_user_t *subsession);
+
 #ifdef __cplusplus
 }
 #endif
index a939dc7aebbbd1a2fb60972e1b7f38f7236cf098..1dc960fba73ace59ea590d591211715802624c3d 100644 (file)
@@ -162,6 +162,14 @@ struct sessiond_context {
                return subsession_id == current_subsession_id;
        }
 
+       std::string get_current_subsession(int session_uid)
+       {
+               if (last_subsession_per_session.contains(session_uid))
+                       return last_subsession_per_session.at(session_uid);
+               else
+                       return std::string {SUBSESSION_INITIAL_SID};
+       }
+
        bool check_parameters_invalid(GDBusMethodInvocation *invocation,
                const int session_uid, const std::string_view subsession_id)
        {
index 303c72118e083ab62cba53aa8e7e893e67ca318d..0a1ba3113b67f25e468ae7810fba50660cf2e90b 100644 (file)
@@ -29,6 +29,9 @@
 #include <dlog.h>
 
 #include <sessiond-plugin-internal.h>
+#include <sessiond.h>
+
+#include <cstring>
 
 #ifndef EXPORT
        #define EXPORT __attribute__((visibility("default")))
@@ -129,4 +132,56 @@ extern "C"
                }
                return 0;
        }
+
+       EXPORT int sessiond_internal_get_subsession_list(int uid, subsession_user_t **subsession_list, size_t *subsession_count)
+       {
+               LOGD("Called subsession_get_subsession_list(%d, ...)", uid);
+
+               if (!check_uid_valid(uid) || !subsession_list || !subsession_count) {
+                       LOGE("Invalid arguments: subsession_get_subsession_list(%d, %p, %p)", uid, subsession_list, subsession_count);
+                       return -EINVAL;
+               }
+
+               try {
+                       const auto subsessions = get_user_list(uid);
+                       const auto ret = static_cast <subsession_user_t *> (calloc(subsessions.size(), SUBSESSION_USER_MAXLEN));
+                       if (!ret)
+                               throw std::runtime_error("Not enough memory");
+
+                       for (size_t i = 0; i < subsessions.size(); ++i)
+                               strncpy(ret[i], subsessions[i].c_str(), SUBSESSION_USER_MAXLEN);
+
+                       *subsession_count = subsessions.size();
+                       *subsession_list = ret;
+                       return 0;
+               } catch (const std::exception &ex) {
+                       LOGE("Error in subsession_get_subsession_list(%d, %p, %p): %s", uid, subsession_list, subsession_count, ex.what());
+                       return -EIO;
+               }
+       }
+
+       EXPORT void sessiond_internal_free_subsession_list(subsession_user_t *subsession_list)
+       {
+               free(subsession_list);
+       }
+
+       EXPORT int sessiond_internal_get_current_subsession(int uid, subsession_user_t *subsession)
+       {
+               if (!check_uid_valid(uid) || !subsession) {
+                       LOGE("Invalid arguments: subsession_get_current_subsession(%d, %p)", uid, subsession);
+                       return -EINVAL;
+               }
+
+               try {
+                       if (!g_sessiond_context)
+                               throw std::runtime_error("g_session_context is null");
+
+                       const auto current_subsession = g_sessiond_context->get_current_subsession(uid);
+                       strncpy(*subsession, current_subsession.c_str(), SUBSESSION_USER_MAXLEN);
+                       return 0;
+               } catch (const std::exception &ex) {
+                       LOGE("Error in subsession_get_current_subsession(%d, %p): %s", uid, subsession, ex.what());
+                       return -EIO;
+               }
+       }
 };
index 923e8727a541a3615617bd35ef4b854e0635e56e..17e3f6bf817a397ceb80202e45aa6826feccac8a 100644 (file)
@@ -41,9 +41,28 @@ static int sessiond_deinitialize (void)
 static int sessiond_subsession_changed(int uid, const char *from, const char *to)
 {
        LOGI("uid %d's subsession changed %s -> %s!", uid, from, to);
+
+       subsession_user_t subsession;
+       sessiond_internal_get_current_subsession(uid, &subsession);
+       LOGI("According to the API, current subsession is now %s!", subsession);
+
        return 0;
 }
 
+static void print_subsessions(int uid)
+{
+       subsession_user_t *subsessions;
+       size_t subsession_count;
+
+       sessiond_internal_get_subsession_list(uid, &subsessions, &subsession_count);
+
+       LOGI("According to the API, there are %zu subsessions:", subsession_count);
+       for (size_t i = 0; i < subsession_count; ++i)
+               LOGI("%zu) %s", i, subsessions[i]);
+
+       sessiond_internal_free_subsession_list(subsessions);
+}
+
 static int sessiond_subsession_added(int uid, const char *subsession)
 {
        LOGI("uid %d subsession %s added!", uid, subsession);
@@ -52,6 +71,8 @@ static int sessiond_subsession_added(int uid, const char *subsession)
        if (!strcmp(subsession, "switch_to_me_asap"))
                sessiond_internal_switch_subsession(uid, "switch_to_me_asap");
 
+       print_subsessions(uid);
+
        return 0;
 }
 
@@ -63,6 +84,8 @@ static int sessiond_subsession_removed(int uid, const char *subsession)
        if (!strcmp(subsession, "stump_on_removal"))
                sessiond_internal_add_subsession_fixed_size(uid, "stump", 10000);
 
+       print_subsessions(uid);
+
        return 0;
 }