#include <hal/hal-common.h>
#include "hal-device-external_connection-interface.h"
+#include "hal-api-device-external_connection-ipc.h"
+#include "hal-api-device-external_connection-passthrough.h"
#include "common.h"
-static hal_backend_device_external_connection_funcs *hal_device_external_connection_funcs = NULL;
+static enum hal_common_transport g_hal_transport = HAL_COMMON_TRANSPORT_UNKNOWN;
-int hal_device_external_connection_get_backend(void)
+static void __attribute__((constructor)) hal_device_external_connection_constructor(void)
{
- int ret;
-
- if (hal_device_external_connection_funcs)
- return 0;
-
- hal_device_external_connection_funcs = calloc(1, sizeof(hal_backend_device_external_connection_funcs));
- if (!hal_device_external_connection_funcs)
- return -ENOMEM;
-
- ret = hal_common_get_backend(HAL_MODULE_DEVICE_EXTERNAL_CONNECTION, (void **)&hal_device_external_connection_funcs);
+ int ret = hal_common_get_transport(HAL_MODULE_DEVICE_EXTERNAL_CONNECTION,
+ &g_hal_transport);
if (ret < 0) {
- _E("Failed to get device-external-connection backend");
- free(hal_device_external_connection_funcs);
- hal_device_external_connection_funcs = NULL;
- return -ENOTSUP;
+ if (ret != -ENOENT)
+ _W("Failed to get HAL transport from HAL manifest\n");
+ g_hal_transport = HAL_COMMON_TRANSPORT_PASSTHROUGH;
}
+}
- return 0;
+int hal_device_external_connection_get_backend(void)
+{
+ switch (g_hal_transport) {
+ case HAL_COMMON_TRANSPORT_IPC:
+ return hal_device_external_connection_ipc_get_backend();
+ case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+ return hal_device_external_connection_passthrough_get_backend();
+ case HAL_COMMON_TRANSPORT_UNKNOWN:
+ default:
+ return -ENOTSUP;
+ }
}
int hal_device_external_connection_put_backend(void)
{
- int ret = 0;
-
- if (!hal_device_external_connection_funcs)
- return 0;
-
- ret = hal_common_put_backend(HAL_MODULE_DEVICE_EXTERNAL_CONNECTION, (void *)hal_device_external_connection_funcs);
- if (ret < 0) {
- _E("Failed to put device-exeternal-connection backend");
- return ret;
+ switch (g_hal_transport) {
+ case HAL_COMMON_TRANSPORT_IPC:
+ return hal_device_external_connection_ipc_get_backend();
+ case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+ return hal_device_external_connection_passthrough_get_backend();
+ case HAL_COMMON_TRANSPORT_UNKNOWN:
+ default:
+ return -ENOTSUP;
}
-
- free(hal_device_external_connection_funcs);
- hal_device_external_connection_funcs = NULL;
-
- return 0;
}
-
int hal_device_external_connection_register_changed_event(hal_device_external_connection_updated_cb updated_cb, void *user_data)
{
- int ret;
-
if (!updated_cb)
return -EINVAL;
- if (!hal_device_external_connection_funcs) {
- if ((ret = hal_device_external_connection_get_backend()) < 0)
- return ret;
- }
-
- if (!hal_device_external_connection_funcs ||
- !hal_device_external_connection_funcs->register_changed_event)
+ switch (g_hal_transport) {
+ case HAL_COMMON_TRANSPORT_IPC:
+ return hal_device_external_connection_ipc_register_changed_event(updated_cb, user_data);
+ case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+ return hal_device_external_connection_passthrough_register_changed_event(updated_cb, user_data);
+ case HAL_COMMON_TRANSPORT_UNKNOWN:
+ default:
return -ENOTSUP;
-
- return hal_device_external_connection_funcs->register_changed_event(updated_cb, user_data);
+ }
}
int hal_device_external_connection_unregister_changed_event(hal_device_external_connection_updated_cb updated_cb)
{
- int ret;
-
if (!updated_cb)
return -EINVAL;
- if (!hal_device_external_connection_funcs) {
- if ((ret = hal_device_external_connection_get_backend()) < 0)
- return ret;
- }
-
- if (!hal_device_external_connection_funcs ||
- !hal_device_external_connection_funcs->unregister_changed_event)
+ switch (g_hal_transport) {
+ case HAL_COMMON_TRANSPORT_IPC:
+ return hal_device_external_connection_ipc_unregister_changed_event(updated_cb);
+ case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+ return hal_device_external_connection_passthrough_unregister_changed_event(updated_cb);
+ case HAL_COMMON_TRANSPORT_UNKNOWN:
+ default:
return -ENOTSUP;
-
- hal_device_external_connection_funcs->unregister_changed_event(updated_cb);
- return 0;
+ }
}
int hal_device_external_connection_get_current_state(hal_device_external_connection_updated_cb updated_cb, void *user_data)
{
- int ret;
-
if (!updated_cb)
return -EINVAL;
- if (!hal_device_external_connection_funcs) {
- if ((ret = hal_device_external_connection_get_backend()) < 0)
- return ret;
- }
-
- if (!hal_device_external_connection_funcs ||
- !hal_device_external_connection_funcs->get_current_state)
+ switch (g_hal_transport) {
+ case HAL_COMMON_TRANSPORT_IPC:
+ return hal_device_external_connection_ipc_get_current_state(updated_cb, user_data);
+ case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+ return hal_device_external_connection_passthrough_get_current_state(updated_cb, user_data);
+ case HAL_COMMON_TRANSPORT_UNKNOWN:
+ default:
return -ENOTSUP;
-
- return hal_device_external_connection_funcs->get_current_state(updated_cb, user_data);
+ }
}
int hal_device_external_connection_get_device_name(hal_device_external_connection_device_type_e deivce_type, const char **device_name)