mmi-provider.c : add provider lookup and load 14/264014/1
authordyamy-lee <dyamy.lee@samsung.com>
Fri, 13 Aug 2021 09:08:17 +0000 (18:08 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Mon, 13 Sep 2021 11:23:47 +0000 (20:23 +0900)
It considers only one provider lookup and load.
It needs provider library and it should be care about multiple providers
which have different capabilities.

Change-Id: I4ced39f940ee39ddb8ed38e9e3fc9db00d5bf382

src/mmi-provider.c

index 8cbba5a..c3ea511 100644 (file)
 */
 
 #include "mmi-provider-iface.h"
+#include "mmi-manager-dbg.h"
+
+#include <Ecore.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <dlfcn.h>
+#include <string.h>
+
+#define PROVIDER_PATH "/lib/provider/"
+
+Eina_List *_provider_list = NULL;
 
 int
 mmi_provider_register_caps(mmi_provider_handle provider, int caps)
@@ -41,9 +52,90 @@ mmi_provider_alloc_event(int ev_type)
 }
 
 void
+_provider_load_module(const char *provider_name)
+{
+       mmi_provider_handle *provider;
+
+       void *module_info = NULL;
+       mmi_provider_module *mmi_provider_module_info = NULL;
+       mmi_provider_module_data *provider_module_data = NULL;
+
+       module_info = dlopen(PROVIDER_PATH, RTLD_LAZY);
+
+       if(!module_info)
+       {
+               LOGE("Failed to dlopen(error :%s, path :%s)!\n", dlerror(), provider_name);
+               return;
+       }
+
+       mmi_provider_module_info = dlsym(module_info, "mmi_provider_module");
+
+       if(!mmi_provider_module_info)
+       {
+               LOGE("Module(%s) dosen't have mmi_provider_module_info \n", provider_name);
+               goto err;
+       }
+
+       if(!mmi_provider_module_info->provider_init || !mmi_provider_module_info->provider_deinit)
+       {
+               LOGE("Module(%s) doesn't have init/deinit function\n", provider_name);
+               goto err;
+       }
+
+       provider_module_data = mmi_provider_module_info->provider_init();
+
+       if(!provider_module_data)
+       {
+               LOGE("Failed to init module (%s) !\n", provider_name);
+               goto err;
+       }
+
+       provider->module_info.provider_init = mmi_provider_module_info->provider_init;
+       provider->module_info.provider_deinit = mmi_provider_module_info->provider_deinit;
+
+       _provider_list = eina_list_append(_provider_list, provider);
+
+err:
+       if(mmi_provider_module_info && mmi_provider_module_info->provider_deinit)
+               mmi_provider_module_info->provider_deinit(provider_module_data);
+
+       if(module_info)
+               dlclose(module_info);
+}
+
+void
+_modality_providers_lookup(void)
+{
+       DIR *dir;
+       struct dirent *entry;
+
+       dir = opendir(PROVIDER_PATH);
+
+       if(!dir)
+       {
+               printf("no dir\n");
+               return;
+       }
+
+       while((entry = readdir(dir)) != NULL)
+       {
+               char provider_name[512];
+               if(strstr(entry->d_name, "libmmi_modality") != NULL)
+               {
+                       snprintf(provider_name, sizeof(provider_name), "%s%s", PROVIDER_PATH, entry->d_name);
+                       printf("Provider full path = %s\n", provider_name);
+                       _provider_load_module(provider_name);
+               }
+       }
+
+       closedir(dir);
+}
+
+void
 modality_providers_init(void)
 {
        //Lookup and init modality providers
+       _modality_providers_lookup();
 }
 
 void