* limitations under the License.
*/
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
#include "appinfo-provider.h"
+#include "err-check.h"
-void app_info_provider_app_descriptor_free(struct app_info_descriptor *descr)
+struct app_info_descriptor
{
+ int pid;
+ char *app_id;
+};
+
+static struct app_info_data
+{
+ GMutex mutex;
+ GArray *app_data;
+} app_info = {
+ .app_data = NULL
+};
+
+struct app_info_iterator
+{
+ GArray *data;
+ int position;
+};
+
+static void load_apps();
+static void add_app(int pid, const char *app_id);
+static void remove_app_by_pid(int pid);
+static void remove_app_by_app_id(const char *app_id);
+
+bool app_info_iterator_next(app_info_iterator_t *iter)
+{
+ ON_NULL_RETURN_VAL(iter, false);
+
+ if (iter->position >= iter->data->len - 1)
+ return false;
+
+ iter->position++;
+ return true;
}
-struct app_info_descriptor *app_info_provider_app_descriptor_copy(const struct app_info_descriptor *descr)
+const char *app_info_iterator_get_app_id(app_info_iterator_t *iter)
{
- return NULL;
+ ON_NULL_RETURN_VAL(iter, NULL);
+
+ struct app_info_descriptor elem = g_array_index(iter->data, struct app_info_descriptor, iter->position);
+ return elem.app_id;
}
-void app_info_provider_free_app_info_descriptor_list(struct app_info_descriptor *descriptors)
+int app_info_iterator_get_pid(app_info_iterator_t *iter)
{
+ ON_NULL_RETURN_VAL(iter, -1);
+
+ struct app_info_descriptor elem = g_array_index(iter->data, struct app_info_descriptor, iter->position);
+ return elem.pid;
}
+void app_info_iterator_free(app_info_iterator_t *iter)
+{
+ ON_NULL_RETURN(iter);
+
+ struct app_info_descriptor elem;
+ for (int i = 0; i < iter->data->len; i++)
+ {
+ elem = g_array_index(app_info.app_data, struct app_info_descriptor, i);
+ g_free(elem.app_id);
+ }
+
+ g_array_free(iter->data, TRUE);
+ g_free(iter);
+}
+
+
app_info_iterator_t *app_info_provider_get_running_applications()
{
- return NULL;
+ struct app_info_descriptor elem;
+ struct app_info_iterator *iter = (struct app_info_iterator *)g_malloc(sizeof(struct app_info_iterator));
+ iter->position = 0;
+ iter->data = g_array_new(FALSE, TRUE, sizeof(struct app_info_descriptor));
+
+ g_mutex_lock(&app_info.mutex);
+
+ for (int i = 0; i < app_info.app_data->len; i++)
+ {
+ elem = g_array_index(app_info.app_data, struct app_info_descriptor, i);
+ struct app_info_descriptor cpy;
+ cpy.pid = elem.pid;
+ if (elem.app_id)
+ cpy.app_id = strdup(elem.app_id);
+
+ g_array_append_val(iter->data, cpy);
+ }
+
+ g_mutex_unlock(&app_info.mutex);
+
+ if (iter->data->len == 0)
+ {
+ g_array_free(iter->data, TRUE);
+ g_free(iter);
+ return NULL;
+ }
+
+ return iter;
}
int app_info_provider_find_main_pid(const char *app_id)
{
+ ON_NULL_RETURN_VAL(app_id, -1);
+
+ struct app_info_descriptor elem;
+
+ g_mutex_lock(&app_info.mutex);
+
+ for (int i = 0; i < app_info.app_data->len; i++)
+ {
+ elem = g_array_index(app_info.app_data, struct app_info_descriptor, i);
+
+ if (elem.app_id && strcmp(elem.app_id, app_id) == 0)
+ {
+ g_mutex_unlock(&app_info.mutex);
+ return elem.pid;
+ }
+ }
+
+ g_mutex_unlock(&app_info.mutex);
return -1;
}
-char *app_info_provider_find_appid(int pid)
+char *app_info_provider_find_app_id(int pid)
{
+ struct app_info_descriptor elem;
+
+ g_mutex_lock(&app_info.mutex);
+
+ for (int i = 0; i < app_info.app_data->len; i++)
+ {
+ elem = g_array_index(app_info.app_data, struct app_info_descriptor, i);
+
+ if (elem.pid == pid && elem.app_id)
+ {
+ char *id = strdup(elem.app_id);
+ g_mutex_unlock(&app_info.mutex);
+ return id;
+ }
+ }
+
+ g_mutex_unlock(&app_info.mutex);
return NULL;
}
int app_provider_init()
{
- return -1;
+ g_mutex_init(&app_info.mutex);
+ app_info.app_data = g_array_new(FALSE, TRUE, sizeof(struct app_info_descriptor));
+
+ load_apps();
+
+ return 0;
}
void app_provider_shutdown()
{
+ g_array_free(app_info.app_data, TRUE);
+ g_mutex_clear(&app_info.mutex);
+}
+
+static void load_apps()
+{
+ //TODO implement
+}
+
+static void add_app(int pid, const char *app_id)
+{
+ ON_NULL_RETURN(app_id);
+
+ struct app_info_descriptor descr;
+
+ descr.pid = pid;
+
+ int len = strlen(app_id) + 1;
+ char *_app_id = (char *)g_malloc(len * sizeof(char));
+ snprintf(_app_id, len, "%s", app_id);
+ descr.app_id = _app_id;
+
+ g_mutex_lock(&app_info.mutex);
+
+ g_array_append_val(app_info.app_data, descr);
+
+ g_mutex_unlock(&app_info.mutex);
+}
+
+static void remove_app_by_pid(int pid)
+{
+ g_mutex_lock(&app_info.mutex);
+ struct app_info_descriptor elem;
+
+ for (int i = 0; i < app_info.app_data->len; i++)
+ {
+ elem = g_array_index(app_info.app_data, struct app_info_descriptor, i);
+ if (elem.pid == pid)
+ {
+ g_free(elem.app_id);
+ g_array_remove_index(app_info.app_data, i);
+ break;
+ }
+ }
+ g_mutex_unlock(&app_info.mutex);
}
+static void remove_app_by_app_id(const char *app_id)
+{
+ ON_NULL_RETURN(app_id);
+
+ g_mutex_lock(&app_info.mutex);
+
+ struct app_info_descriptor elem;
+
+ for (int i = 0; i < app_info.app_data->len; i++)
+ {
+ elem = g_array_index(app_info.app_data, struct app_info_descriptor, i);
+ if (strcmp(elem.app_id, app_id) == 0)
+ {
+ g_free(elem.app_id);
+ g_array_remove_index(app_info.app_data, i);
+ i--;
+ }
+ }
+ g_mutex_unlock(&app_info.mutex);
+}
\ No newline at end of file