With some usage in the example/test plugin.
Change-Id: Ieb1826b69fea90d926b7ed85e8c9cb0a2b9cf101
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
*/
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
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)
{
#include <dlog.h>
#include <sessiond-plugin-internal.h>
+#include <sessiond.h>
+
+#include <cstring>
#ifndef EXPORT
#define EXPORT __attribute__((visibility("default")))
}
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;
+ }
+ }
};
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);
if (!strcmp(subsession, "switch_to_me_asap"))
sessiond_internal_switch_subsession(uid, "switch_to_me_asap");
+ print_subsessions(uid);
+
return 0;
}
if (!strcmp(subsession, "stump_on_removal"))
sessiond_internal_add_subsession_fixed_size(uid, "stump", 10000);
+ print_subsessions(uid);
+
return 0;
}