diff options
author | João Valverde <joao.valverde@tecnico.ulisboa.pt> | 2019-02-03 02:15:13 +0000 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2019-06-11 20:59:39 +0000 |
commit | 63af1da7e72dea670594aa7ce521adc8020ecab4 (patch) | |
tree | 523a6a953595f9bc988509b9f8acbcefddabb456 /wsutil | |
parent | 57bb2b2a099fd1df57a37b3a93a07212167c59aa (diff) |
Kill libwscodecs plugin library, just use plugins
Change-Id: I085d04840acb53b0b7681787429a2b4e10547cd5
Reviewed-on: https://code.wireshark.org/review/33068
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'wsutil')
-rw-r--r-- | wsutil/CMakeLists.txt | 2 | ||||
-rw-r--r-- | wsutil/codecs.c | 168 | ||||
-rw-r--r-- | wsutil/codecs.h | 84 |
3 files changed, 254 insertions, 0 deletions
diff --git a/wsutil/CMakeLists.txt b/wsutil/CMakeLists.txt index d5854dfac2..dbdc65554f 100644 --- a/wsutil/CMakeLists.txt +++ b/wsutil/CMakeLists.txt @@ -20,6 +20,7 @@ set(WSUTIL_PUBLIC_HEADERS bits_ctz.h bitswap.h buffer.h + codecs.h color.h copyright_info.h cpu_info.h @@ -79,6 +80,7 @@ set(WSUTIL_COMMON_FILES base32.c bitswap.c buffer.c + codecs.c copyright_info.c crash_info.c crc10.c diff --git a/wsutil/codecs.c b/wsutil/codecs.c new file mode 100644 index 0000000000..88c2a68b86 --- /dev/null +++ b/wsutil/codecs.c @@ -0,0 +1,168 @@ +/* codecs.c + * codecs interface 2007 Tomas Kukosa + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include <glib.h> +#include "codecs.h" + +#ifdef HAVE_PLUGINS + +static plugins_t *libwscodecs_plugins; +static GSList *codecs_plugins = NULL; + +void +codecs_register_plugin(const codecs_plugin *plug) +{ + codecs_plugins = g_slist_prepend(codecs_plugins, (codecs_plugin *)plug); +} + +static void +call_plugin_register_codec_module(gpointer data, gpointer user_data _U_) +{ + codecs_plugin *plug = (codecs_plugin *)data; + + if (plug->register_codec_module) { + plug->register_codec_module(); + } +} +#endif /* HAVE_PLUGINS */ + + +/* + * For all codec plugins, call their register routines. + */ +void +codecs_init(void) +{ +#ifdef HAVE_PLUGINS + libwscodecs_plugins = plugins_init(WS_PLUGIN_CODEC); + g_slist_foreach(codecs_plugins, call_plugin_register_codec_module, NULL); +#endif /* HAVE_PLUGINS */ +} + +void +codecs_cleanup(void) +{ +#ifdef HAVE_PLUGINS + g_slist_free(codecs_plugins); + codecs_plugins = NULL; + plugins_cleanup(libwscodecs_plugins); + libwscodecs_plugins = NULL; +#endif +} + + +struct codec_handle { + const char *name; + codec_init_fn init_fn; + codec_release_fn release_fn; + codec_get_channels_fn channels_fn; + codec_get_frequency_fn frequency_fn; + codec_decode_fn decode_fn; +}; + +/* + * List of registered codecs. + */ +static GHashTable *registered_codecs = NULL; + + +/* Find a registered codec by name. */ +codec_handle_t +find_codec(const char *name) +{ + return (registered_codecs) ? (codec_handle_t)g_hash_table_lookup(registered_codecs, name) : NULL; +} + +/* Register a codec by name. */ +gboolean +register_codec(const char *name, codec_init_fn init_fn, codec_release_fn release_fn, + codec_get_channels_fn channels_fn, codec_get_frequency_fn frequency_fn, + codec_decode_fn decode_fn) +{ + struct codec_handle *handle; + + /* Create our hash table if it doesn't already exist */ + if (registered_codecs == NULL) + registered_codecs = g_hash_table_new(g_str_hash, g_str_equal); + + /* Make sure the registration is unique */ + if (g_hash_table_lookup(registered_codecs, name) != NULL) + return FALSE; /* report an error, or have our caller do it? */ + + handle = (struct codec_handle *)g_malloc(sizeof (struct codec_handle)); + handle->name = name; + handle->init_fn = init_fn; + handle->release_fn = release_fn; + handle->channels_fn = channels_fn; + handle->frequency_fn = frequency_fn; + handle->decode_fn = decode_fn; + + g_hash_table_insert(registered_codecs, (gpointer)name, (gpointer) handle); + return TRUE; +} + +/* Deregister a codec by name. */ +gboolean +deregister_codec(const char *name) +{ + gpointer key, value; + + if (registered_codecs && g_hash_table_lookup_extended(registered_codecs, name, &key, &value)) { + g_hash_table_remove(registered_codecs, name); + g_free(value); + return TRUE; + } + return FALSE; +} + +void *codec_init(codec_handle_t codec) +{ + if (!codec) return NULL; + return (codec->init_fn)(); +} + +void codec_release(codec_handle_t codec, void *context) +{ + if (!codec) return; + (codec->release_fn)(context); +} + +unsigned codec_get_channels(codec_handle_t codec, void *context) +{ + if (!codec) return 0; + return (codec->channels_fn)(context); +} + +unsigned codec_get_frequency(codec_handle_t codec, void *context) +{ + if (!codec) return 0; + return (codec->frequency_fn)(context); +} + +size_t codec_decode(codec_handle_t codec, void *context, const void *input, size_t inputSizeBytes, void *output, size_t *outputSizeBytes) +{ + if (!codec) return 0; + return (codec->decode_fn)(context, input, inputSizeBytes, output, outputSizeBytes); +} + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ diff --git a/wsutil/codecs.h b/wsutil/codecs.h new file mode 100644 index 0000000000..5cd0084aa7 --- /dev/null +++ b/wsutil/codecs.h @@ -0,0 +1,84 @@ +/* codecs.h + * codecs interface 2007 Tomas Kukosa + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef _CODECS_H_ +#define _CODECS_H_ + +#include <epan/epan.h> +#include "ws_symbol_export.h" +#include "ws_attributes.h" +#ifdef HAVE_PLUGINS +#include "wsutil/plugins.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifdef HAVE_PLUGINS +typedef struct { + void (*register_codec_module)(void); /* routine to call to register a codec */ +} codecs_plugin; + +WS_DLL_PUBLIC void codecs_register_plugin(const codecs_plugin *plug); +#endif + +/** + * For all built-in codecs and codec plugins, call their register routines. + */ +WS_DLL_PUBLIC void codecs_init(void); + +WS_DLL_PUBLIC void codecs_cleanup(void); + +/** + * Get compile-time information for libraries used by libwscodecs. + */ +WS_DLL_PUBLIC void codec_get_compiled_version_info(GString *str); + +struct codec_handle; +typedef struct codec_handle *codec_handle_t; + +typedef void *(*codec_init_fn)(void); +typedef void (*codec_release_fn)(void *context); +typedef unsigned (*codec_get_channels_fn)(void *context); +typedef unsigned (*codec_get_frequency_fn)(void *context); +typedef size_t (*codec_decode_fn)(void *context, const void *input, size_t inputSizeBytes, + void *output, size_t *outputSizeBytes); + +WS_DLL_PUBLIC gboolean register_codec(const char *name, codec_init_fn init_fn, + codec_release_fn release_fn, codec_get_channels_fn channels_fn, + codec_get_frequency_fn frequency_fn, codec_decode_fn decode_fn); +WS_DLL_PUBLIC gboolean deregister_codec(const char *name); +WS_DLL_PUBLIC codec_handle_t find_codec(const char *name); +WS_DLL_PUBLIC void *codec_init(codec_handle_t codec); +WS_DLL_PUBLIC void codec_release(codec_handle_t codec, void *context); +WS_DLL_PUBLIC unsigned codec_get_channels(codec_handle_t codec, void *context); +WS_DLL_PUBLIC unsigned codec_get_frequency(codec_handle_t codec, void *context); +WS_DLL_PUBLIC size_t codec_decode(codec_handle_t codec, void *context, const void *input, + size_t inputSizeBytes, void *output, size_t *outputSizeBytes); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _CODECS_H_ */ + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ |