Added infrastructure to register URI to element+property mappings
authorWim Taymans <wim.taymans@gmail.com>
Thu, 16 Jan 2003 21:22:06 +0000 (21:22 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Thu, 16 Jan 2003 21:22:06 +0000 (21:22 +0000)
Original commit message from CVS:
Added infrastructure to register URI to element+property mappings

gst/Makefile.am
gst/autoplug/gstspideridentity.c
gst/gst.c
gst/gst.h
gst/gstpad.c
gst/gsturi.c [new file with mode: 0644]
gst/gsturi.h [new file with mode: 0644]
gst/registries/gstxmlregistry.c

index db590ca..7150ff9 100644 (file)
@@ -84,6 +84,7 @@ libgstreamer_@GST_MAJORMINOR@_la_SOURCES =            \
        gsttrashstack.c         \
        gsttype.c               \
        $(GST_TYPEFIND_SRC)     \
+       gsturi.c                \
        gstutils.c              \
        gstregistry.c           \
        $(GST_PARSE_SRC)        \
@@ -143,6 +144,7 @@ gst_headers =                       \
        gsttrashstack.h         \
        gsttype.h               \
        gsttypefind.h           \
+       gsturi.h                \
        gstutils.h              \
        gstregistry.h           \
        gstparse.h              \
index a250d82..0db36e8 100644 (file)
@@ -251,6 +251,7 @@ gst_spider_identity_getcaps (GstPad *pad, GstCaps *caps)
 
   if (otherpad != NULL)
     return gst_pad_get_allowed_caps (otherpad);
+  
   return NULL;
 }
 
index 7f1e7a4..59cd908 100644 (file)
--- a/gst/gst.c
+++ b/gst/gst.c
@@ -455,6 +455,7 @@ init_post (void)
   gst_autoplug_factory_get_type ();
 #endif
   gst_index_factory_get_type ();
+  gst_uri_handler_get_type ();
 
 
   plugin_path = g_getenv ("GST_PLUGIN_PATH");
index 6c3f8d3..113ef2a 100644 (file)
--- a/gst/gst.h
+++ b/gst/gst.h
@@ -46,6 +46,7 @@
 #include <gst/gstcaps.h>
 #include <gst/gstprops.h>
 #include <gst/gstplugin.h>
+#include <gst/gsturi.h>
 #include <gst/gstutils.h>
 #include <gst/gsttrace.h>
 #include <gst/gstxml.h>
index eab3fff..57313f9 100644 (file)
@@ -1863,13 +1863,17 @@ gst_pad_get_peer (GstPad *pad)
 GstCaps*
 gst_pad_get_allowed_caps (GstPad *pad)
 {
+  GstCaps *caps;
+
   g_return_val_if_fail (pad != NULL, NULL);
   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
 
   GST_DEBUG (GST_CAT_PROPERTIES, "get allowed caps of %s:%s", 
              GST_DEBUG_PAD_NAME (pad));
 
-  return gst_caps_copy (GST_RPAD_FILTER (pad));
+  caps = gst_caps_copy (GST_RPAD_FILTER (pad));
+
+  return caps;
 }
 
 /**
diff --git a/gst/gsturi.c b/gst/gsturi.c
new file mode 100644 (file)
index 0000000..eb4dddd
--- /dev/null
@@ -0,0 +1,197 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ *                    2000 Wim Taymans <wtay@chello.be>
+ *
+ * gsttype.c: Media-type management functions
+ *
+ * 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.
+ */
+
+/* TODO:
+ * probably should set up a hash table for the type id's, since currently
+ * it's a rather pathetic linear search.  Eventually there may be dozens
+ * of id's, but in reality there are only so many instances of lookup, so
+ * I'm not overly worried yet...
+ */
+
+#include "gst_private.h"
+
+#include "gsturi.h"
+#include "gstregistry.h"
+#include "gstlog.h"
+
+
+static void            gst_uri_handler_class_init      (GstURIHandlerClass *klass);
+static void            gst_uri_handler_init            (GstURIHandler *factory);
+
+static GstPluginFeatureClass *parent_class = NULL;
+/* static guint gst_uri_handler_signals[LAST_SIGNAL] = { 0 }; */
+
+GType
+gst_uri_handler_get_type (void)
+{
+  static GType typefactory_type = 0;
+
+  if (!typefactory_type) {
+    static const GTypeInfo typefactory_info = {
+      sizeof (GstURIHandlerClass),
+      NULL,
+      NULL,
+      (GClassInitFunc) gst_uri_handler_class_init,
+      NULL,
+      NULL,
+      sizeof(GstURIHandler),
+      0,
+      (GInstanceInitFunc) gst_uri_handler_init,
+      NULL
+    };
+    typefactory_type = g_type_register_static (GST_TYPE_PLUGIN_FEATURE,
+                                               "GstURIHandler", &typefactory_info, 0);
+  }
+  return typefactory_type;
+}
+
+static void
+gst_uri_handler_class_init (GstURIHandlerClass *klass)
+{
+  GObjectClass *gobject_class;
+  GstObjectClass *gstobject_class;
+  GstPluginFeatureClass *gstpluginfeature_class;
+
+  gobject_class = (GObjectClass*)klass;
+  gstobject_class = (GstObjectClass*)klass;
+  gstpluginfeature_class = (GstPluginFeatureClass*) klass;
+
+  parent_class = g_type_class_ref (GST_TYPE_PLUGIN_FEATURE);
+}
+
+static void
+gst_uri_handler_init (GstURIHandler *factory)
+{
+}
+
+/**
+ * gst_uri_handler_new:
+ * @definition: the definition to use
+ *
+ * Creata a new typefactory from the given definition.
+ *
+ * Returns: the new typefactory
+ */
+GstURIHandler*
+gst_uri_handler_new (const gchar *name, 
+                    const gchar *uri, const gchar *longdesc, 
+                    const gchar *element, gchar *property)
+{
+  GstURIHandler *factory;
+
+  g_return_val_if_fail (name != NULL, NULL);
+  g_return_val_if_fail (uri != NULL, NULL);
+  g_return_val_if_fail (element != NULL, NULL);
+  g_return_val_if_fail (property != NULL, NULL);
+
+  factory = gst_uri_handler_find (name);
+
+  if (!factory) {
+    factory = GST_URI_HANDLER (g_object_new (GST_TYPE_URI_HANDLER, NULL));
+  }
+
+  GST_PLUGIN_FEATURE_NAME (factory) = g_strdup (name);
+  factory->uri = g_strdup (uri);
+  factory->longdesc = g_strdup (longdesc);
+  factory->element = g_strdup (element);
+  factory->property = g_strdup (property);
+
+  return factory;
+}
+
+/**
+ * gst_uri_handler_find:
+ * @name: the name of the typefactory to find
+ *
+ * Return the URIHandler with the given name. 
+ *
+ * Returns: a GstURIHandler with the given name;
+ */
+GstURIHandler*
+gst_uri_handler_find (const gchar *name)
+{
+  GstPluginFeature *feature;
+
+  g_return_val_if_fail (name != NULL, NULL);
+
+  feature = gst_registry_pool_find_feature (name, GST_TYPE_URI_HANDLER);
+  if (feature)
+    return GST_URI_HANDLER (feature);
+
+  return NULL;
+}
+
+GstURIHandler*
+gst_uri_handler_find_by_uri (const gchar *uri)
+{
+  GList *walk, *orig;
+  GstURIHandler *handler = NULL;
+  
+  g_return_val_if_fail (uri != NULL, NULL);
+
+  orig = walk = gst_registry_pool_feature_list (GST_TYPE_URI_HANDLER);
+
+  while (walk) {
+    handler = GST_URI_HANDLER (walk->data);
+
+    if (g_str_has_prefix (uri, handler->uri))
+      break;
+
+    walk = g_list_next (walk);
+  }
+  g_list_free (orig);
+
+  return handler;
+}
+
+GstElement*
+gst_uri_handler_create (GstURIHandler *factory, const gchar *name)
+{
+  GstElement *element = NULL;
+
+  g_return_val_if_fail (factory != NULL, NULL);
+
+  element = gst_element_factory_make (factory->element, name);
+
+  return element;
+}
+
+GstElement*
+gst_uri_handler_make_by_uri (const gchar *uri, const gchar *name)
+{
+  GstElement *element = NULL;
+  GstURIHandler *handler;
+
+  g_return_val_if_fail (uri != NULL, NULL);
+
+  handler = gst_uri_handler_find_by_uri (uri);
+  if (handler) {
+    element = gst_uri_handler_create (handler, name);
+    if (element) {
+      g_object_set (G_OBJECT (element), handler->property, uri, NULL);
+    }
+  }
+  return element;
+}
+
+
+
diff --git a/gst/gsturi.h b/gst/gsturi.h
new file mode 100644 (file)
index 0000000..929e425
--- /dev/null
@@ -0,0 +1,71 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ *                    2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstscheduler.h: Header for default scheduler code
+ *
+ * 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.
+ */
+
+
+#ifndef __GST_URI_H__
+#define __GST_URI_H__
+
+#include <glib.h>
+#include <gst/gstelement.h>
+#include <gst/gstpluginfeature.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_URI_HANDLER           (gst_uri_handler_get_type ())
+#define GST_URI_HANDLER(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_URI_HANDLER, GstURIHandler))
+#define GST_IS_URI_HANDLER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_URI_HANDLER))
+#define GST_URI_HANDLER_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_URI_HANDLER, GstURIHandlerClass))
+#define GST_IS_URI_HANDLER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_URI_HANDLER))
+#define GST_URI_HANDLER_GET_CLASS(obj)         (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_URI_HANDLER, GstURIHandlerClass))
+
+typedef struct _GstURIHandler GstURIHandler;
+typedef struct _GstURIHandlerClass GstURIHandlerClass;
+
+struct _GstURIHandler {
+  GstPluginFeature feature;
+
+  gchar *uri;              /* The uri that is described */
+  gchar *longdesc;         /* description of the uri */
+  gchar *element;          /* The element that can handle this uri */
+  gchar *property;         /* The property on the element to set the uri */
+};
+
+struct _GstURIHandlerClass {
+  GstPluginFeatureClass parent;
+};
+
+GType                  gst_uri_handler_get_type        (void);
+
+GstURIHandler*         gst_uri_handler_new             (const gchar *name, 
+                                                        const gchar *uri, const gchar *longdesc, 
+                                                        const gchar *element, gchar *property);
+void                    gst_uri_handler_destroy                (GstURIHandler *factory);
+
+GstURIHandler*         gst_uri_handler_find            (const gchar *name);
+GstURIHandler*         gst_uri_handler_find_by_uri     (const gchar *uri);
+
+GstElement*            gst_uri_handler_create          (GstURIHandler *factory, const gchar *name);
+GstElement*            gst_uri_handler_make_by_uri     (const gchar *uri, const gchar *name);
+
+G_END_DECLS
+
+#endif /* __GST_SCHEDULER_H__ */
index 8b5337b..0c243e6 100644 (file)
@@ -34,6 +34,7 @@
 #include <gst/gsttype.h>
 #include <gst/gstscheduler.h>
 #include <gst/gstautoplug.h>
+#include <gst/gsturi.h>
 
 #include "gstxmlregistry.h"
 
@@ -770,6 +771,30 @@ gst_xml_registry_parse_index_factory (GMarkupParseContext *context, const gchar
 }
 
 static gboolean
+gst_xml_registry_parse_uri_handler (GMarkupParseContext *context, const gchar *tag, const gchar *text,
+                                    gsize text_len, GstXMLRegistry *registry, GError **error)
+{
+  GstURIHandler *handler = GST_URI_HANDLER (registry->current_feature);
+
+  if (!strcmp (tag, "name")) {
+    registry->current_feature->name = g_strndup (text, text_len);
+  }
+  else if (!strcmp (tag, "uri")) {
+    handler->uri = g_strndup (text, text_len);
+  }
+  else if (!strcmp (tag, "longdesc")) {
+    handler->longdesc = g_strndup (text, text_len);
+  }
+  else if (!strcmp (tag, "element")) {
+    handler->element = g_strndup (text, text_len);
+  }
+  else if (!strcmp (tag, "property")) {
+    handler->property = g_strndup (text, text_len);
+  }
+  return TRUE;
+}
+
+static gboolean
 gst_xml_registry_parse_padtemplate (GMarkupParseContext *context, const gchar *tag, const gchar *text,
                                     gsize text_len, GstXMLRegistry *registry, GError **error)
 {
@@ -865,6 +890,7 @@ gst_xml_registry_start_element (GMarkupParseContext *context,
        }
        if (feature) {
          xmlregistry->current_feature = feature;
+
          if (GST_IS_ELEMENT_FACTORY (feature)) {
            GstElementFactory *factory = GST_ELEMENT_FACTORY (feature);
 
@@ -873,17 +899,24 @@ gst_xml_registry_start_element (GMarkupParseContext *context,
            factory->padtemplates = NULL;
            factory->rank = 0;
            xmlregistry->parser = gst_xml_registry_parse_element_factory;
+           break;
          }
-         else if (GST_IS_TYPE_FACTORY (feature))
+         else if (GST_IS_TYPE_FACTORY (feature)) {
            xmlregistry->parser = gst_xml_registry_parse_type_factory;
+         }
          else if (GST_IS_SCHEDULER_FACTORY (feature)) {
            xmlregistry->parser = gst_xml_registry_parse_scheduler_factory;
             GST_SCHEDULER_FACTORY (feature)->type = 0;
          }
-         else if (GST_IS_AUTOPLUG_FACTORY (feature))
+         else if (GST_IS_AUTOPLUG_FACTORY (feature)) {
            xmlregistry->parser = gst_xml_registry_parse_autoplug_factory;
-         else if (GST_IS_INDEX_FACTORY (feature))
+         }
+         else if (GST_IS_INDEX_FACTORY (feature)) {
            xmlregistry->parser = gst_xml_registry_parse_index_factory;
+         }
+         else if (GST_IS_URI_HANDLER (feature)) {
+           xmlregistry->parser = gst_xml_registry_parse_uri_handler;
+         }
          else {
             g_warning ("unkown feature type");
          }
@@ -1411,6 +1444,14 @@ gst_xml_registry_save_feature (GstXMLRegistry *xmlregistry, GstPluginFeature *fe
   else if (GST_IS_INDEX_FACTORY (feature)) {
     PUT_ESCAPED ("longdesc", GST_INDEX_FACTORY (feature)->longdesc);
   }
+  else if (GST_IS_URI_HANDLER (feature)) {
+    GstURIHandler *handler = GST_URI_HANDLER (feature);
+
+    PUT_ESCAPED ("uri", handler->uri);
+    PUT_ESCAPED ("longdesc", handler->longdesc);
+    PUT_ESCAPED ("element", handler->element);
+    PUT_ESCAPED ("property", handler->property);
+  }
   return TRUE;
 }