/* Simple Plugin API * Copyright (C) 2016 Wim Taymans * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include typedef struct { SpaIDMap map; PinosMap uris; PinosArray strings; } IDMap; static uint32_t id_map_get_id (SpaIDMap *map, const char *uri) { IDMap *this = SPA_CONTAINER_OF (map, IDMap, map); uint32_t i = 0, len; void *p; off_t o; if (uri != NULL) { for (i = 0; i < pinos_map_get_size (&this->uris); i++) { o = (off_t) pinos_map_lookup_unchecked (&this->uris, i); if (strcmp (SPA_MEMBER (this->strings.data, o, char), uri) == 0) return i; } len = strlen (uri); p = pinos_array_add (&this->strings, SPA_ROUND_UP_N (len+1, 2)); memcpy (p, uri, len+1); o = (p - this->strings.data); i = pinos_map_insert_new (&this->uris, (void *)o); } return i; } static const char * id_map_get_uri (SpaIDMap *map, uint32_t id) { IDMap *this = SPA_CONTAINER_OF (map, IDMap, map); if (id == SPA_ID_INVALID) return NULL; if (SPA_LIKELY (pinos_map_check_id (&this->uris, id))) { off_t o = (off_t) pinos_map_lookup_unchecked (&this->uris, id); return SPA_MEMBER (this->strings.data, o, char); } return NULL; } static uint32_t id_map_get_size (SpaIDMap *map) { IDMap *this = SPA_CONTAINER_OF (map, IDMap, map); return pinos_map_get_size (&this->uris); } static IDMap default_id_map = { { sizeof (SpaIDMap), NULL, id_map_get_id, id_map_get_uri, id_map_get_size, }, PINOS_MAP_INIT(128), PINOS_ARRAY_INIT (4096) }; SpaIDMap * pinos_id_map_get_default (void) { spa_id_map_set_default (&default_id_map.map); return &default_id_map.map; }