aboutsummaryrefslogtreecommitdiffstats
path: root/wsutil
diff options
context:
space:
mode:
authorJoão Valverde <joao.valverde@tecnico.ulisboa.pt>2019-02-03 02:15:13 +0000
committerAnders Broman <a.broman58@gmail.com>2019-06-11 20:59:39 +0000
commit63af1da7e72dea670594aa7ce521adc8020ecab4 (patch)
tree523a6a953595f9bc988509b9f8acbcefddabb456 /wsutil
parent57bb2b2a099fd1df57a37b3a93a07212167c59aa (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.txt2
-rw-r--r--wsutil/codecs.c168
-rw-r--r--wsutil/codecs.h84
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:
+ */