app-provider: implementation part1 52/182752/5
authorMichal Kolodziejski <m.kolodziejs@samsung.com>
Wed, 27 Jun 2018 14:00:39 +0000 (16:00 +0200)
committerMichal Kolodziejski <m.kolodziejs@samsung.com>
Fri, 29 Jun 2018 10:31:52 +0000 (12:31 +0200)
Change-Id: Ifca921415fc27b6ef6c200bd8602efaf19719638
Signed-off-by: Michal Kolodziejski <m.kolodziejs@samsung.com>
src/appinfo-provider.c
src/task-worker
src/task-worker.c

index 70a2472..ad70c77 100644 (file)
  * 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
index a60d716..155368b 100755 (executable)
Binary files a/src/task-worker and b/src/task-worker differ
index 6e7291c..b36b2b9 100644 (file)
  * limitations under the License.
  */
 
-#include "procfs.h"
-#include "report-generator.h"
-#include "report-json-serializer.h"
-
 int main(int argc, char *argv[])
 {
        return 0;