/* GStreamer
 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
 *                    2000 Wim Taymans <wtay@chello.be>
 *                    2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
 *
 * gstdevicemonitorfactory.c: GstDeviceMonitorFactory object, support routines
 *
 * 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., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/**
 * SECTION:gstdevicemonitorfactory
 * @short_description: Create GstDeviceMonitors from a factory
 * @see_also: #GstDeviceMonitor, #GstPlugin, #GstPluginFeature, #GstPadTemplate.
 *
 * #GstDeviceMonitorFactory is used to create instances of device monitors. A
 * GstDeviceMonitorfactory can be added to a #GstPlugin as it is also a
 * #GstPluginFeature.
 *
 * Use the gst_device_monitor_factory_find() and gst_device_monitor_factory_create()
 * functions to create device monitor instances or use gst_device_monitor_factory_make() as a
 * convenient shortcut.
 *
 * Since: 1.4
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "gst_private.h"

#include "gstdevicemonitorfactory.h"
#include "gst.h"

#include "glib-compat-private.h"

GST_DEBUG_CATEGORY_STATIC (device_monitor_factory_debug);
#define GST_CAT_DEFAULT device_monitor_factory_debug

static void gst_device_monitor_factory_finalize (GObject * object);
static void gst_device_monitor_factory_cleanup (GstDeviceMonitorFactory *
    factory);

/* static guint gst_device_monitor_factory_signals[LAST_SIGNAL] = { 0 }; */

/* this is defined in gstelement.c */
extern GQuark __gst_devicemonitorclass_factory;

#define _do_init \
{ \
  GST_DEBUG_CATEGORY_INIT (device_monitor_factory_debug, "GST_DEVICE_MONITOR_FACTORY", \
      GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, \
      "device monitor factories keep information about installed device monitors"); \
}

G_DEFINE_TYPE_WITH_CODE (GstDeviceMonitorFactory, gst_device_monitor_factory,
    GST_TYPE_PLUGIN_FEATURE, _do_init);

static void
gst_device_monitor_factory_class_init (GstDeviceMonitorFactoryClass * klass)
{
  GObjectClass *gobject_class = (GObjectClass *) klass;

  gobject_class->finalize = gst_device_monitor_factory_finalize;
}

static void
gst_device_monitor_factory_init (GstDeviceMonitorFactory * factory)
{
}

static void
gst_device_monitor_factory_finalize (GObject * object)
{
  GstDeviceMonitorFactory *factory = GST_DEVICE_MONITOR_FACTORY (object);
  GstDeviceMonitor *monitor;

  gst_device_monitor_factory_cleanup (factory);

  monitor = g_atomic_pointer_get (&factory->monitor);
  if (monitor)
    gst_object_unref (monitor);

  G_OBJECT_CLASS (gst_device_monitor_factory_parent_class)->finalize (object);
}

/**
 * gst_device_monitor_factory_find:
 * @name: name of factory to find
 *
 * Search for an device monitor factory of the given name. Refs the returned
 * device monitor factory; caller is responsible for unreffing.
 *
 * Returns: (transfer full): #GstDeviceMonitorFactory if found, NULL otherwise
 *
 * Since: 1.4
 */
GstDeviceMonitorFactory *
gst_device_monitor_factory_find (const gchar * name)
{
  GstPluginFeature *feature;

  g_return_val_if_fail (name != NULL, NULL);

  feature = gst_registry_find_feature (gst_registry_get (), name,
      GST_TYPE_DEVICE_MONITOR_FACTORY);
  if (feature)
    return GST_DEVICE_MONITOR_FACTORY (feature);

  /* this isn't an error, for instance when you query if an device monitor factory is
   * present */
  GST_LOG ("no such device monitor factory \"%s\"", name);

  return NULL;
}

static void
gst_device_monitor_factory_cleanup (GstDeviceMonitorFactory * factory)
{
  if (factory->metadata) {
    gst_structure_free ((GstStructure *) factory->metadata);
    factory->metadata = NULL;
  }
  if (factory->type) {
    factory->type = G_TYPE_INVALID;
  }
}

#define CHECK_METADATA_FIELD(klass, name, key)                                 \
  G_STMT_START {                                                               \
    const gchar *metafield = gst_device_monitor_class_get_metadata (klass, key);      \
    if (G_UNLIKELY (metafield == NULL || *metafield == '\0')) {                \
      g_warning ("Device monitor factory metadata for '%s' has no valid %s field", name, key);    \
      goto detailserror;                                                       \
    } \
  } G_STMT_END;

/**
 * gst_device_monitor_register:
 * @plugin: (allow-none): #GstPlugin to register the device monitor with, or NULL for
 *     a static device monitor.
 * @name: name of device monitors of this type
 * @rank: rank of device monitor (higher rank means more importance when autoplugging)
 * @type: GType of device monitor to register
 *
 * Create a new device monitorfactory capable of instantiating objects of the
 * @type and add the factory to @plugin.
 *
 * Returns: TRUE, if the registering succeeded, FALSE on error
 *
 * Since: 1.4
 */
gboolean
gst_device_monitor_register (GstPlugin * plugin, const gchar * name, guint rank,
    GType type)
{
  GstPluginFeature *existing_feature;
  GstRegistry *registry;
  GstDeviceMonitorFactory *factory;
  GstDeviceMonitorClass *klass;

  g_return_val_if_fail (name != NULL, FALSE);
  g_return_val_if_fail (g_type_is_a (type, GST_TYPE_DEVICE_MONITOR), FALSE);

  registry = gst_registry_get ();

  /* check if feature already exists, if it exists there is no need to update it
   * when the registry is getting updated, outdated plugins and all their
   * features are removed and readded.
   */
  existing_feature = gst_registry_lookup_feature (registry, name);
  if (existing_feature) {
    GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)",
        existing_feature, name);
    factory = GST_DEVICE_MONITOR_FACTORY_CAST (existing_feature);
    factory->type = type;
    existing_feature->loaded = TRUE;
    g_type_set_qdata (type, __gst_devicemonitorclass_factory, factory);
    gst_object_unref (existing_feature);
    return TRUE;
  }

  factory =
      GST_DEVICE_MONITOR_FACTORY_CAST (g_object_newv
      (GST_TYPE_DEVICE_MONITOR_FACTORY, 0, NULL));
  gst_plugin_feature_set_name (GST_PLUGIN_FEATURE_CAST (factory), name);
  GST_LOG_OBJECT (factory, "Created new device monitorfactory for type %s",
      g_type_name (type));

  /* provide info needed during class structure setup */
  g_type_set_qdata (type, __gst_devicemonitorclass_factory, factory);
  klass = GST_DEVICE_MONITOR_CLASS (g_type_class_ref (type));

  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_LONGNAME);
  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_KLASS);
  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_DESCRIPTION);
  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_AUTHOR);

  factory->type = type;
  factory->metadata = gst_structure_copy ((GstStructure *) klass->metadata);

  if (plugin && plugin->desc.name) {
    GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = plugin->desc.name;
    GST_PLUGIN_FEATURE_CAST (factory)->plugin = plugin;
    g_object_add_weak_pointer ((GObject *) plugin,
        (gpointer *) & GST_PLUGIN_FEATURE_CAST (factory)->plugin);
  } else {
    GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = "NULL";
    GST_PLUGIN_FEATURE_CAST (factory)->plugin = NULL;
  }
  gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE_CAST (factory), rank);
  GST_PLUGIN_FEATURE_CAST (factory)->loaded = TRUE;

  gst_registry_add_feature (registry, GST_PLUGIN_FEATURE_CAST (factory));

  return TRUE;

  /* ERRORS */
detailserror:
  {
    gst_device_monitor_factory_cleanup (factory);
    return FALSE;
  }
}

/**
 * gst_device_monitor_factory_get:
 * @factory: factory to instantiate
 *
 * Returns the device monitor of the type defined by the given device
 * monitorfactory.
 *
 * Returns: (transfer full): the #GstDeviceMonitor or NULL if the
 *     device monitor couldn't be created
 *
 * Since: 1.4
 */
GstDeviceMonitor *
gst_device_monitor_factory_get (GstDeviceMonitorFactory * factory)
{
  GstDeviceMonitor *device_monitor;
  GstDeviceMonitorClass *oclass;
  GstDeviceMonitorFactory *newfactory;

  g_return_val_if_fail (factory != NULL, NULL);

  newfactory =
      GST_DEVICE_MONITOR_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
          (factory)));

  if (newfactory == NULL)
    goto load_failed;

  factory = newfactory;

  GST_INFO ("getting device monitor \"%s\"", GST_OBJECT_NAME (factory));

  if (factory->type == 0)
    goto no_type;

  device_monitor = g_atomic_pointer_get (&newfactory->monitor);
  if (device_monitor)
    return gst_object_ref (device_monitor);

  /* create an instance of the device monitor, cast so we don't assert on NULL
   * also set name as early as we can
   */
  device_monitor = GST_DEVICE_MONITOR_CAST (g_object_newv (factory->type, 0,
          NULL));
  if (G_UNLIKELY (device_monitor == NULL))
    goto no_device_monitor;

  /* fill in the pointer to the factory in the device monitor class. The
   * class will not be unreffed currently.
   * Be thread safe as there might be 2 threads creating the first instance of
   * an device monitor at the same moment
   */
  oclass = GST_DEVICE_MONITOR_GET_CLASS (device_monitor);
  if (!g_atomic_pointer_compare_and_exchange (&oclass->factory, NULL, factory))
    gst_object_unref (factory);

  gst_object_ref_sink (device_monitor);

  /* We use an atomic to make sure we don't create two in parallel */
  if (!g_atomic_pointer_compare_and_exchange (&newfactory->monitor, NULL,
          device_monitor)) {
    gst_object_unref (device_monitor);

    device_monitor = g_atomic_pointer_get (&newfactory->monitor);
  }

  GST_DEBUG ("created device monitor \"%s\"", GST_OBJECT_NAME (factory));

  return gst_object_ref (device_monitor);

  /* ERRORS */
load_failed:
  {
    GST_WARNING_OBJECT (factory,
        "loading plugin containing feature %s returned NULL!",
        GST_OBJECT_NAME (factory));
    return NULL;
  }
no_type:
  {
    GST_WARNING_OBJECT (factory, "factory has no type");
    gst_object_unref (factory);
    return NULL;
  }
no_device_monitor:
  {
    GST_WARNING_OBJECT (factory, "could not create device monitor");
    gst_object_unref (factory);
    return NULL;
  }
}

/**
 * gst_device_monitor_factory_get_by_name:
 * @factoryname: a named factory to instantiate
 *
 * Returns the device monitor of the type defined by the given device
 * monitor factory.
 *
 * Returns: (transfer full): a #GstDeviceMonitor or NULL if unable to
 * create device monitor
 *
 * Since: 1.4
 */
GstDeviceMonitor *
gst_device_monitor_factory_get_by_name (const gchar * factoryname)
{
  GstDeviceMonitorFactory *factory;
  GstDeviceMonitor *device_monitor;

  g_return_val_if_fail (factoryname != NULL, NULL);
  g_return_val_if_fail (gst_is_initialized (), NULL);

  GST_LOG ("gstdevicemonitorfactory: get_by_name \"%s\"", factoryname);

  factory = gst_device_monitor_factory_find (factoryname);
  if (factory == NULL)
    goto no_factory;

  GST_LOG_OBJECT (factory, "found factory %p", factory);
  device_monitor = gst_device_monitor_factory_get (factory);
  if (device_monitor == NULL)
    goto create_failed;

  gst_object_unref (factory);
  return device_monitor;

  /* ERRORS */
no_factory:
  {
    GST_INFO ("no such device monitor factory \"%s\"!", factoryname);
    return NULL;
  }
create_failed:
  {
    GST_INFO_OBJECT (factory, "couldn't create instance!");
    gst_object_unref (factory);
    return NULL;
  }
}

/**
 * gst_device_monitor_factory_get_device_monitor_type:
 * @factory: factory to get managed #GType from
 *
 * Get the #GType for device monitors managed by this factory. The type can
 * only be retrieved if the device monitor factory is loaded, which can be
 * assured with gst_plugin_feature_load().
 *
 * Returns: the #GType for device monitors managed by this factory or 0 if
 * the factory is not loaded.
 *
 * Since: 1.4
 */
GType
gst_device_monitor_factory_get_device_monitor_type (GstDeviceMonitorFactory *
    factory)
{
  g_return_val_if_fail (GST_IS_DEVICE_MONITOR_FACTORY (factory), 0);

  return factory->type;
}

/**
 * gst_device_monitor_factory_get_metadata:
 * @factory: a #GstDeviceMonitorFactory
 * @key: a key
 *
 * Get the metadata on @factory with @key.
 *
 * Returns: the metadata with @key on @factory or %NULL when there was no
 * metadata with the given @key.
 *
 * Since: 1.4
 */
const gchar *
gst_device_monitor_factory_get_metadata (GstDeviceMonitorFactory * factory,
    const gchar * key)
{
  return gst_structure_get_string ((GstStructure *) factory->metadata, key);
}

/**
 * gst_device_monitor_factory_get_metadata_keys:
 * @factory: a #GstDeviceMonitorFactory
 *
 * Get the available keys for the metadata on @factory.
 *
 * Returns: (transfer full) (element-type utf8) (array zero-terminated=1):
 * a %NULL-terminated array of key strings, or %NULL when there is no
 * metadata. Free with g_strfreev() when no longer needed.
 *
 * Since: 1.4
 */
gchar **
gst_device_monitor_factory_get_metadata_keys (GstDeviceMonitorFactory * factory)
{
  GstStructure *metadata;
  gchar **arr;
  gint i, num;

  g_return_val_if_fail (GST_IS_DEVICE_MONITOR_FACTORY (factory), NULL);

  metadata = (GstStructure *) factory->metadata;
  if (metadata == NULL)
    return NULL;

  num = gst_structure_n_fields (metadata);
  if (num == 0)
    return NULL;

  arr = g_new (gchar *, num + 1);
  for (i = 0; i < num; ++i) {
    arr[i] = g_strdup (gst_structure_nth_field_name (metadata, i));
  }
  arr[i] = NULL;
  return arr;
}

/**
 * gst_device_monitor_factory_has_classesv:
 * @factory: a #GstDeviceMonitorFactory
 * @classes: a %NULL terminated array of klasses to match, only match if all
 *  classes are matched
 *
 * Check if @factory matches all of the given classes
 *
 * Returns: %TRUE if @factory matches.
 *
 * Since: 1.4
 */
gboolean
gst_device_monitor_factory_has_classesv (GstDeviceMonitorFactory * factory,
    gchar ** classes)
{
  const gchar *klass;

  g_return_val_if_fail (GST_IS_DEVICE_MONITOR_FACTORY (factory), FALSE);

  klass = gst_device_monitor_factory_get_metadata (factory,
      GST_ELEMENT_METADATA_KLASS);

  if (klass == NULL) {
    GST_ERROR_OBJECT (factory,
        "device monitor factory is missing klass identifiers");
    return FALSE;
  }

  for (; classes[0]; classes++) {
    const gchar *found;
    guint len;

    if (classes[0] == '\0')
      continue;

    found = strstr (klass, classes[0]);

    if (!found)
      return FALSE;
    if (found != klass && *(found - 1) != '/')
      return FALSE;

    len = strlen (classes[0]);
    if (found[len] != 0 && found[len] != '/')
      return FALSE;
  }

  return TRUE;
}

/**
 * gst_device_monitor_factory_has_classes:
 * @factory: a #GstDeviceMonitorFactory
 * @classes: a "/" separate list of klasses to match, only match if all classes
 *  are matched
 *
 * Check if @factory matches all of the given @classes
 *
 * Returns: %TRUE if @factory matches.
 *
 * Since: 1.4
 */
gboolean
gst_device_monitor_factory_has_classes (GstDeviceMonitorFactory * factory,
    const gchar * classes)
{
  gchar **classesv;
  gboolean res;

  classesv = g_strsplit (classes, "/", 0);

  res = gst_device_monitor_factory_has_classesv (factory, classesv);

  g_strfreev (classesv);

  return res;
}

typedef struct
{
  const char *classes;
  GstRank minrank;
} FilterData;

static gboolean
device_monitor_filter (GstPluginFeature * feature, FilterData * data)
{
  gboolean res;

  /* we only care about device monitor factories */
  if (G_UNLIKELY (!GST_IS_DEVICE_MONITOR_FACTORY (feature)))
    return FALSE;

  res = (gst_plugin_feature_get_rank (feature) >= data->minrank) &&
      gst_device_monitor_factory_has_classes (GST_DEVICE_MONITOR_FACTORY_CAST
      (feature), data->classes);

  return res;
}

/**
 * gst_device_monitor_factory_list_get_device_monitors:
 * @classes: a "/" separate list of klasses to match, only match if all classes
 *  are matched
 * @minrank: Minimum rank
 *
 * Get a list of factories that match all of the given @classes. Only
 * device monitors with a rank greater or equal to @minrank will be
 * returned.  The list of factories is returned by decreasing rank.
 *
 * Returns: (transfer full) (element-type Gst.DeviceMonitorFactory): a #GList of
 *     #GstDeviceMonitorFactory device monitors. Use gst_plugin_feature_list_free() after
 *     usage.
 *
 * Since: 1.4
 */
GList *gst_device_monitor_factory_list_get_device_monitors
    (const gchar * classes, GstRank minrank)
{
  GList *result;
  FilterData data;

  /* prepare type */
  data.classes = classes;
  data.minrank = minrank;

  /* get the feature list using the filter */
  result = gst_registry_feature_filter (gst_registry_get (),
      (GstPluginFeatureFilter) device_monitor_filter, FALSE, &data);

  /* sort on rank and name */
  result = g_list_sort (result, gst_plugin_feature_rank_compare_func);

  return result;
}
