int minor;
} halcc_version;
-typedef struct halcc_interface {
- char *name;
- char *instance_id;
-} halcc_interface;
-
typedef struct halcc_hal {
char *name;
halcc_version version_list[HALCC_NUM_VERSION_LIST_MAX];
int num_version_list;
halcc_transport_e transport;
- GHashTable *interfaces;
} halcc_hal;
typedef struct halcc_manifest {
g_hash_table_remove(hal_table, name);
}
-static guint interface_hash(gconstpointer key)
-{
- const halcc_interface *interface = (const halcc_interface *) key;
- char interface_str[HALCC_NAME_MAX * 2] = { 0 , };
-
- assert(interface);
- assert(interface->name);
-
- if (interface->instance_id)
- snprintf(interface_str, sizeof(interface_str), "%s.%s", interface->name, interface->instance_id);
- else
- snprintf(interface_str, sizeof(interface_str), "%s.default", interface->name);
-
- return g_str_hash(interface_str);
-}
-
-static gboolean interface_hash_equal(gconstpointer a, gconstpointer b)
-{
- const halcc_interface *interface = (const halcc_interface *) a;
- const halcc_interface *key = (const halcc_interface *) b;
-
- assert(interface);
- assert(key);
-
- return strncmp(interface->name, key->name, strlen(interface->name) + 1) == 0;
-}
-
-static void interface_hash_value_free(gpointer data)
-{
- halcc_interface *interface = (halcc_interface *) data;
-
- halcc_interface_free(interface);
-}
-
-static GHashTable* hashtable_interface_new(void)
-{
- return g_hash_table_new_full(interface_hash,
- interface_hash_equal, NULL, interface_hash_value_free);
-}
-
-static int hashtable_interface_insert(GHashTable *interface_table, halcc_interface *interface)
-{
- g_hash_table_insert(interface_table, interface, interface);
-
- return 0;
-}
-
-/*
-static halcc_interface* hashtable_interface_lookup(GHashTable *interface_table,
- const char *name, const char *instance_id)
-{
- halcc_interface key;
-
- if (!interface_table || !name) {
- _E("Invalid parameter\n");
- return NULL;
- }
-
- key = (halcc_interface) {
- .name = (char *) name,
- .instance_id = (char *) instance_id,
- };
-
- return g_hash_table_lookup(interface_table, &key);
-}
-*/
-
-static void hashtable_interface_remove(GHashTable *interface_table,
- const char *name, const char *instance_id)
-{
- halcc_interface key;
-
- if (!interface_table || !name) {
- _E("Invalid parameter\n");
- return;
- }
-
- key = (halcc_interface) {
- .name = (char *) name,
- .instance_id = (char *) instance_id,
- };
-
- g_hash_table_remove(interface_table, &key);
-}
-
int halcc_manifest_new(halcc_manifest **manifest)
{
halcc_manifest *m;
}
h->transport = HALCC_TRANSPORT_DEFAULT;
- h->interfaces = hashtable_interface_new();
*hal = g_steal_pointer(&h);
}
free(g_steal_pointer(&hal->name));
- g_hash_table_destroy(g_steal_pointer(&hal->interfaces));
free(hal);
}
return 0;
}
-int halcc_hal_add_interface(halcc_hal *hal, halcc_interface *interface)
-{
- if (!hal || !interface) {
- _E("Invalid parameter\n");
- return -EINVAL;
- }
-
- return hashtable_interface_insert(hal->interfaces, interface);
-}
-
-void halcc_hal_remove_interface(halcc_hal *hal,
- const char *interface_name, const char *instance_id)
-{
- if (!hal || !interface_name) {
- _E("Invalid parameter\n");
- return;
- }
-
- hashtable_interface_remove(hal->interfaces, interface_name, instance_id);
-}
-
-void halcc_hal_foreach_interface(halcc_hal *hal, halcc_iter_cb cb, void *user_data)
-{
- if (!hal || !hal->interfaces || !cb) {
- _E("Invalid parameter\n");
- return;
- }
-
- hashtable_foreach(hal->interfaces, cb, user_data);
-}
-
bool halcc_hal_is_compatible_with_version(halcc_hal *hal, int major, int minor)
{
if (!hal) {
return false;
}
-
-int halcc_interface_new(halcc_interface **interface)
-{
- halcc_interface *iface;
-
- if (!interface) {
- _E("Invalid parameter\n");
- return -EINVAL;
- }
-
- iface = calloc(1, sizeof(halcc_interface));
- if (!iface) {
- _E("Failed to allocate halcc_interface\n");
- return -ENOMEM;
- }
-
- *interface = g_steal_pointer(&iface);
-
- return 0;
-}
-
-void halcc_interface_free(halcc_interface *interface)
-{
- if (!interface) {
- _E("Invalid parameter\n");
- return;
- }
-
- free(g_steal_pointer(&interface->name));
- free(g_steal_pointer(&interface->instance_id));
- free(g_steal_pointer(&interface));
-}
-
-int halcc_interface_set_name(halcc_interface *interface, const char *interface_name)
-{
- char *n;
-
- if (!interface || !interface_name) {
- _E("Invalid parameter\n");
- return -EINVAL;
- }
-
- n = strndup(interface_name, HALCC_NAME_MAX);
- if (!n) {
- _E("Failed to allocate interface_name\n");
- return -ENOMEM;
- }
-
- interface->name = g_steal_pointer(&n);
-
- return 0;
-}
-
-int halcc_interface_get_name(halcc_interface *interface, const char **interface_name)
-{
- if (!interface || !interface_name) {
- _E("Invalid parameter\n");
- return -EINVAL;
- }
-
- *interface_name = interface->name;
-
- return 0;
-}
-
-int halcc_interface_set_instance_id(halcc_interface *interface, const char *instance_id)
-{
- char *id = NULL;
-
- if (!interface || !instance_id) {
- _E("Invalid parameter\n");
- return -EINVAL;
- }
-
- id = strndup(instance_id, HALCC_NAME_MAX);
- if (!id) {
- _E("Failed to allocate instance_id\n");
- return -ENOMEM;
- }
-
- interface->instance_id = g_steal_pointer(&id);
-
- return 0;
-}
-
-int halcc_interface_get_instance_id(halcc_interface *interface, const char **instance_id)
-{
- if (!interface || !instance_id) {
- _E("Invalid parameter\n");
- return -EINVAL;
- }
-
- *instance_id = interface->instance_id;
-
- return 0;
-}
typedef struct halcc_manifest halcc_manifest;
typedef struct halcc_hal halcc_hal;
-typedef struct halcc_interface halcc_interface;
typedef void (*halcc_iter_cb) (void *, void *);
int version_list[][2], int max_num_version_list, int *num_version_list);
int halcc_hal_set_transport(halcc_hal *hal, halcc_transport_e transport);
int halcc_hal_get_transport(halcc_hal *hal, halcc_transport_e *transport);
-int halcc_hal_add_interface(halcc_hal *hal, halcc_interface *interface);
-void halcc_hal_remove_interface(halcc_hal *hal,
- const char *interface_name, const char *instance_id);
-void halcc_hal_foreach_interface(halcc_hal *hal, halcc_iter_cb cb, void *user_data);
bool halcc_hal_is_compatible_with_version(halcc_hal *hal, int major, int minor);
-int halcc_interface_new(halcc_interface **interface);
-void halcc_interface_free(halcc_interface *interface);
-int halcc_interface_set_name(halcc_interface *interface, const char *interface_name);
-int halcc_interface_get_name(halcc_interface *interface, const char **interface_name);
-int halcc_interface_set_instance_id(halcc_interface *interface, const char *instance_id);
-int halcc_interface_get_instance_id(halcc_interface *interface, const char **instance_id);
-
#ifdef __cplusplus
}
#endif
xmlFree(*str);
}
-static int parse_interface(xmlNode *node, halcc_interface *interface)
-{
- assert(node);
- assert(interface);
-
- if (!xmlStrEqual(node->name, "interface")) {
- _E("Invalid interface node, %s\n", node->name);
- return -EINVAL;
- }
-
- for (xmlNode *child = node->children; child; child = child->next) {
- if (xmlStrEqual(child->name, "name")) {
- __xmlchar__ xmlChar *name = xmlNodeGetContent(child);
- halcc_interface_set_name(interface, name);
- } else if (xmlStrEqual(child->name, "instance")) {
- __xmlchar__ xmlChar *instance = xmlNodeGetContent(child);
- halcc_interface_set_instance_id(interface, (char *) instance);
- }
- }
-
- return 0;
-}
-
static int parse_hal(xmlNode *node, halcc_manifest *manifest)
{
int ret = 0;
if (ret != 0)
_E("Failed to halcc_hal_set_transport(), %s, ret=%d\n", transport, ret);
- } else if (xmlStrEqual(child->name, "interface")) {
- halcc_interface *iface;
-
- ret = halcc_interface_new(&iface);
- if (ret != 0) {
- _E("Failed to halcc_interface_new(), ret=%d\n", ret);
- continue;
- }
-
- ret = parse_interface(child, iface);
- if (ret != 0) {
- _E("Failed to parse_interface(), ret=%d\n", ret);
- halcc_interface_free(iface);
- continue;
- }
-
- halcc_hal_add_interface(hal, iface);
- iface = NULL;
}
}