[gstreamermm] Added multifdsink plug-in.



commit f9273ab523a24fec9acb91cd6eda4ce50bccc93d
Author: José Alburquerque <jaalburqu svn gnome org>
Date:   Tue Jun 30 00:23:51 2009 -0400

    Added multifdsink plug-in.

 ChangeLog                                          |   17 +++
 configure.ac                                       |    3 +-
 gstreamer/src/Makefile_list_of_hg.am_fragment      |    2 +-
 gstreamer/src/enums.hg                             |    9 +-
 gstreamer/src/gst_enums.defs                       |   25 ++++
 gstreamer/src/gst_enums.defs.patch                 |   57 ++++++----
 .../extra_defs_gen/generate_plugin_gmmproc_file.cc |  120 ++++++++++++++++++--
 tools/m4/plugingen_base.m4                         |   60 +++++++++-
 8 files changed, 247 insertions(+), 46 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 481ae1e..b59e542 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2009-06-30  José Alburquerque  <jaalburqu svn gnome org>
+
+	* configure.ac:
+	* gstreamer/src/Makefile_list_of_hg.am_fragment: Added multifdsink
+	plug-in.
+	* gstreamer/src/gst_enums.defs:
+	* gstreamer/src/gst_enums.defs.patch: Fixed patch to include
+	handwritten enum for multifdsink plugin.
+
+	* tools/m4/plugingen_base.m4: Added and Modified macros to enable the
+	plug-in generator to generate enum code for plug-in enums used in
+	signals.
+	* tools/extra_defs_gen/generate_plugin_gmmproc_file.cc: Modified
+	plug-in generator to generate enum code for enum specific plug-ins.
+	* gstreamer/src/enums.hg: Corrected comments about plug-in specific
+	enums used in signals not being able to be generated.
+
 2009-06-29  José Alburquerque  <jaalburqu svn gnome org>
 
 	* configure.ac:
diff --git a/configure.ac b/configure.ac
index 57ae40b..c3b2345 100644
--- a/configure.ac
+++ b/configure.ac
@@ -195,7 +195,8 @@ cdparanoiasrc=CdParanoiaSrc clockoverlay=ClockOverlay decodebin=DecodeBin \
 decodebin2=DecodeBin2 \
 ffmpegcolorspace=FfmpegColorSpace gdpdepay=GDPDepay gdppay=GDPPay \
 giosink=GioSink giosrc=GioSrc giostreamsink=GioStreamSink \
-giostreamsrc=GioStreamSrc oggdemux=OggDemux oggmux=OggMux \
+giostreamsrc=GioStreamSrc multifdsink=MultiFdSink oggdemux=OggDemux \
+oggmux=OggMux \
 playbin=PlayBin playbin2=PlayBin2 \
 tcpclientsink=TCPClientSink tcpclientsrc=TCPClientSrc \
 tcpserversrc=TCPServerSrc \
diff --git a/gstreamer/src/Makefile_list_of_hg.am_fragment b/gstreamer/src/Makefile_list_of_hg.am_fragment
index ad1ee27..e29e011 100644
--- a/gstreamer/src/Makefile_list_of_hg.am_fragment
+++ b/gstreamer/src/Makefile_list_of_hg.am_fragment
@@ -40,7 +40,7 @@ files_all_plugin_hg = capsfilter.hg fakesink.hg fakesrc.hg fdsink.hg fdsrc.hg \
 		  cdparanoiasrc.hg clockoverlay.hg decodebin.hg decodebin2.hg \
 		  ffmpegcolorspace.hg gdpdepay.hg gdppay.hg giosink.hg \
 		  giosrc.hg giostreamsink.hg giostreamsrc.hg \
-		  oggdemux.hg oggmux.hg playbin.hg playbin2.hg \
+		  multifdsink.hg oggdemux.hg oggmux.hg playbin.hg playbin2.hg \
 		  tcpclientsink.hg tcpclientsrc.hg tcpserversrc.hg \
 		  textoverlay.hg textrender.hg theoradec.hg theoraenc.hg \
 		  timeoverlay.hg videorate.hg videoscale.hg \
diff --git a/gstreamer/src/enums.hg b/gstreamer/src/enums.hg
index 487363a..3bf2a4a 100644
--- a/gstreamer/src/enums.hg
+++ b/gstreamer/src/enums.hg
@@ -22,8 +22,9 @@
 
 _DEFS(gstreamermm,gst)
 
-// Plug-in C enums used in the plug-in signals need to be handwritten.  This
-// one is used in the "autoplug-select" signal of the decodebin2 plug-in:
+// Plug-in C enums used in the plug-in signals that are shared need to be
+// declared.  This one is is shared between decodebin2 and uridecodebin so it
+// is difficult for it to be generated.
 enum GstAutoplugSelectResult
 {
   GST_AUTOPLUG_SELECT_TRY,
@@ -37,8 +38,8 @@ namespace Gst
 _WRAP_ENUM(MiniObjectFlags, GstMiniObjectFlags)
 _WRAP_ENUM(State, GstState)
 
-// Plug-in non-genereated enums (some are shared, others are used in plug-in
-// signals and there's no way of knowing whether to generate them or not):
+// Plug-in non-genereated enums.  Handled manually (and not generated because
+// they are shared by more than one plug-in):
 _WRAP_ENUM(AutoplugSelectResult, GstAutoplugSelectResult)
 _WRAP_ENUM(TCPProtocol, GstTCPProtocol)
 
diff --git a/gstreamer/src/gst_enums.defs b/gstreamer/src/gst_enums.defs
index 77204cc..7c307b6 100644
--- a/gstreamer/src/gst_enums.defs
+++ b/gstreamer/src/gst_enums.defs
@@ -35,6 +35,18 @@
   )
 )
 
+;; From /usr/src/jhbuild-sources/gstreamer/gst/gstbufferlist.h
+
+(define-enum-extended BufferListItem
+  (in-module "Gst")
+  (c-name "GstBufferListItem")
+  (values
+    '("continue" "GST_BUFFER_LIST_CONTINUE" "0")
+    '("skip-group" "GST_BUFFER_LIST_SKIP_GROUP" "1")
+    '("end" "GST_BUFFER_LIST_END" "2")
+  )
+)
+
 ;; From /usr/src/jhbuild-sources/gstreamer/gst/gstbus.h
 
 (define-enum-extended BusFlags
@@ -1660,6 +1672,7 @@
     '("x-receding-playlistchange" "GST_RTSP_HDR_X_RECEDING_PLAYLISTCHANGE" "72")
     '("x-rtp-info" "GST_RTSP_HDR_X_RTP_INFO" "73")
     '("x-startupprofile" "GST_RTSP_HDR_X_STARTUPPROFILE" "74")
+    '("timestamp" "GST_RTSP_HDR_TIMESTAMP" "75")
   )
 )
 
@@ -1941,6 +1954,7 @@
     '("pink-noise" "GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE" "6")
     '("sine-tab" "GST_AUDIO_TEST_SRC_WAVE_SINE_TAB" "7")
     '("ticks" "GST_AUDIO_TEST_SRC_WAVE_TICKS" "8")
+    '("gaussian-white-noise" "GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE" "9")
   )
 )
 
@@ -2344,3 +2358,14 @@
     '("full" "GST_PARANOIA_MODE_FULL" "0xff")
   )
 )
+
+;; Handwritten for MultiFdSink plugin (taken from gstmultifdsink.c):
+(define-enum-extended FDSetMode
+  (in-module "Gst")
+  (c-name "GstFDSetMode")
+  (values
+    '("select" "GST_FD_SET_MODE_SELECT" "0")
+    '("poll" "GST_FD_SET_MODE_POLL" "1")
+    '("epoll" "GST_FD_SET_MODE_EPOLL" "2")
+  )
+)
diff --git a/gstreamer/src/gst_enums.defs.patch b/gstreamer/src/gst_enums.defs.patch
index 24d2989..9d5920a 100644
--- a/gstreamer/src/gst_enums.defs.patch
+++ b/gstreamer/src/gst_enums.defs.patch
@@ -1,5 +1,5 @@
---- gst_enums.defs.orig	2009-06-18 01:02:24.000000000 -0400
-+++ gst_enums.defs	2009-06-18 01:16:27.000000000 -0400
+--- gst_enums.defs	2009-06-30 00:09:54.000000000 -0400
++++ gst_enums.defs.new	2009-06-30 00:06:00.000000000 -0400
 @@ -1,3 +1,5 @@
 +;; Apply gst_enums.defs.patch after regenerating.
 +
@@ -21,7 +21,7 @@
    )
  )
  
-@@ -33,6 +41,8 @@
+@@ -45,6 +53,8 @@
    (in-module "Gst")
    (c-name "GstBusFlags")
    (values
@@ -30,7 +30,7 @@
    )
  )
  
-@@ -85,6 +95,13 @@
+@@ -97,6 +107,13 @@
    (in-module "Gst")
    (c-name "GstClockFlags")
    (values
@@ -44,7 +44,7 @@
    )
  )
  
-@@ -126,10 +143,18 @@
+@@ -138,10 +155,18 @@
    )
  )
  
@@ -63,7 +63,7 @@
    )
  )
  
-@@ -137,6 +162,10 @@
+@@ -149,6 +174,10 @@
    (in-module "Gst")
    (c-name "GstElementFlags")
    (values
@@ -74,7 +74,7 @@
    )
  )
  
-@@ -233,40 +262,6 @@
+@@ -245,40 +274,6 @@
    )
  )
  
@@ -115,7 +115,7 @@
  (define-enum-extended SeekType
    (in-module "Gst")
    (c-name "GstSeekType")
-@@ -364,6 +359,9 @@
+@@ -376,6 +371,9 @@
    (in-module "Gst")
    (c-name "GstIndexFlags")
    (values
@@ -125,7 +125,7 @@
    )
  )
  
-@@ -464,7 +462,7 @@
+@@ -476,7 +474,7 @@
      '("async-done" "GST_MESSAGE_ASYNC_DONE" "1 << 21")
      '("request-state" "GST_MESSAGE_REQUEST_STATE" "1 << 22")
      '("step-start" "GST_MESSAGE_STEP_START" "1 << 23")
@@ -134,7 +134,7 @@
    )
  )
  
-@@ -571,6 +569,12 @@
+@@ -583,6 +581,12 @@
    (in-module "Gst")
    (c-name "GstPadFlags")
    (values
@@ -147,7 +147,7 @@
    )
  )
  
-@@ -590,6 +594,8 @@
+@@ -602,6 +606,8 @@
    (in-module "Gst")
    (c-name "GstPadTemplateFlags")
    (values
@@ -156,7 +156,7 @@
    )
  )
  
-@@ -982,13 +988,13 @@
+@@ -994,13 +1000,13 @@
    (in-module "Gst")
    (c-name "GstFakeSinkStateError")
    (values
@@ -177,7 +177,7 @@
    )
  )
  
-@@ -998,14 +1004,14 @@
+@@ -1010,14 +1016,14 @@
    (in-module "Gst")
    (c-name "GstFakeSrcOutputType")
    (values
@@ -200,7 +200,7 @@
    )
  )
  
-@@ -1013,8 +1019,8 @@
+@@ -1025,8 +1031,8 @@
    (in-module "Gst")
    (c-name "GstFakeSrcDataType")
    (values
@@ -211,7 +211,7 @@
    )
  )
  
-@@ -1022,9 +1028,9 @@
+@@ -1034,9 +1040,9 @@
    (in-module "Gst")
    (c-name "GstFakeSrcSizeType")
    (values
@@ -224,7 +224,7 @@
    )
  )
  
-@@ -1032,11 +1038,23 @@
+@@ -1044,11 +1050,23 @@
    (in-module "Gst")
    (c-name "GstFakeSrcFillType")
    (values
@@ -253,7 +253,7 @@
    )
  )
  
-@@ -1051,6 +1069,16 @@
+@@ -1075,6 +1093,16 @@
    )
  )
  
@@ -270,7 +270,7 @@
  ;; From /usr/src/jhbuild-sources/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.h
  
  (define-enum-extended BaseAudioSinkSlaveMethod
-@@ -1867,10 +1895,10 @@
+@@ -1892,10 +1920,10 @@
    (in-module "Gst")
    (c-name "GstAudioConvertDithering")
    (values
@@ -285,7 +285,7 @@
    )
  )
  
-@@ -1878,11 +1906,11 @@
+@@ -1903,11 +1931,11 @@
    (in-module "Gst")
    (c-name "GstAudioConvertNoiseShaping")
    (values
@@ -302,7 +302,7 @@
    )
  )
  
-@@ -2203,17 +2231,6 @@
+@@ -2229,17 +2257,6 @@
    )
  )
  
@@ -320,7 +320,7 @@
  ;; From /usr/src/jhbuild-sources/gst-plugins-base/ext/pango/gsttextoverlay.h
  
  (define-enum-extended TextOverlayVAlign
-@@ -2241,9 +2258,9 @@
+@@ -2267,9 +2284,9 @@
    (c-name "GstTextOverlayWrapMode")
    (values
      '("none" "GST_TEXT_OVERLAY_WRAP_MODE_NONE" "-1")
@@ -333,7 +333,7 @@
    )
  )
  
-@@ -2251,9 +2268,9 @@
+@@ -2277,9 +2294,9 @@
    (in-module "Gst")
    (c-name "GstTextOverlayLineAlign")
    (values
@@ -346,7 +346,7 @@
    )
  )
  
-@@ -2283,21 +2300,35 @@
+@@ -2309,21 +2326,46 @@
    (in-module "Gst")
    (c-name "GstTextRenderLineAlign")
    (values
@@ -390,3 +390,14 @@
 +    '("full" "GST_PARANOIA_MODE_FULL" "0xff")
 +  )
 +)
++
++;; Handwritten for MultiFdSink plugin (taken from gstmultifdsink.c):
++(define-enum-extended FDSetMode
++  (in-module "Gst")
++  (c-name "GstFDSetMode")
++  (values
++    '("select" "GST_FD_SET_MODE_SELECT" "0")
++    '("poll" "GST_FD_SET_MODE_POLL" "1")
++    '("epoll" "GST_FD_SET_MODE_EPOLL" "2")
++  )
++)
diff --git a/tools/extra_defs_gen/generate_plugin_gmmproc_file.cc b/tools/extra_defs_gen/generate_plugin_gmmproc_file.cc
index a5567e9..3a8d51d 100644
--- a/tools/extra_defs_gen/generate_plugin_gmmproc_file.cc
+++ b/tools/extra_defs_gen/generate_plugin_gmmproc_file.cc
@@ -22,6 +22,7 @@
 #include <gst/gst.h>
 #include <glibmm.h>
 #include <iostream>
+#include <sstream>
 
 static gchar* nmspace = 0;
 static gchar* defsFile = 0;
@@ -180,10 +181,11 @@ Glib::ustring get_property_wrap_statements(Glib::ustring& includeMacroCalls,
 
         if((G_TYPE_IS_ENUM(propertyGType) || G_TYPE_IS_FLAGS(propertyGType)))
         {
+          Glib::ustring enumPrefix = propertyCType.substr(0, 3);
           Glib::ustring propertyCppType = propertyCType.substr(3);
 
-          enumWrapStatements += "_WRAP_PLUGIN_ENUM(" + propertyCppType +
-            ", " + propertyCType + ")\n";
+          enumWrapStatements += "_WRAP_PLUGIN_ENUM(" + enumPrefix + "," +
+            propertyCppType + ")";
 
           Glib::ustring enumGetTypeFunctionName =
             get_cast_macro(propertyCType).lowercase() + "_get_type";
@@ -222,8 +224,56 @@ Glib::ustring get_method_name(const Glib::ustring& signalName)
   return result;
 }
 
+Glib::ustring get_c_enum_definition_macro(GType enumGType,
+  Glib::ustring& enumCType)
+{
+  Glib::ustring result;
+
+  if((G_TYPE_IS_ENUM(enumGType)))
+  {
+    GEnumClass* enumClass = G_ENUM_CLASS(g_type_class_ref(enumGType));
+    if(enumClass)
+    {
+      result += "_C_ENUM_DEFINITION(" + enumCType + ",";
+      for(guint i = 0; i < enumClass->n_values; i++)
+      {
+        std::stringstream stream;
+        result += (Glib::ustring) enumClass->values[i].value_nick + ",";
+        stream << enumClass->values[i].value;
+        result += stream.str();
+        if(i < enumClass->n_values - 1)
+          result += ",";
+      }
+      result += ")";
+    }
+    g_type_class_unref(enumClass);
+  }
+  else
+  {
+    GFlagsClass* flagsClass = G_FLAGS_CLASS(g_type_class_ref(enumGType));
+    if(flagsClass)
+    {
+      result += "_C_ENUM_DEFINITION(" + enumCType + ",";
+      for(guint i = 0; i < flagsClass->n_values; i++)
+      {
+        std::stringstream stream;
+        result += (Glib::ustring) flagsClass->values[i].value_nick + ",";
+        stream << flagsClass->values[i].value;
+        result += stream.str();
+        if(i < flagsClass->n_values - 1)
+          result += ",";
+      }
+      result += ")";
+    }
+    g_type_class_unref(flagsClass);
+  }
+  return result;
+}
+
 Glib::ustring get_signal_wrap_statements(Glib::ustring& includeMacroCalls,
-  Glib::ustring& cClassSignalDeclarations)
+  Glib::ustring& cEnumDefinitions, Glib::ustring& enumWrapStatements,
+  Glib::ustring& cClassSignalDeclarations,
+  Glib::ustring& enumGTypeFunctionDefinitions)
 {
   Glib::ustring wrapStatements;
 
@@ -263,7 +313,27 @@ Glib::ustring get_signal_wrap_statements(Glib::ustring& includeMacroCalls,
       Glib::ustring  returnCType = g_type_name(returnGType) +
         (Glib::ustring) (gst_type_is_a_pointer(returnGType) ?  "*" : "");
 
-      if(gst_type_is_a_pointer(returnGType))
+      if((G_TYPE_IS_ENUM(returnGType) || G_TYPE_IS_FLAGS(returnGType)))
+      // Check for an enum first and attempt to generate _WRAP_ENUM() and
+      // _TRANSLATION() macros if it is not wrapped (see plugingen_base.m4
+      // file for docs).
+      {
+        Glib::ustring enumPrefix = returnCType.substr(0, 3);
+        Glib::ustring returnCppType = returnCType.substr(3);
+
+        enumWrapStatements += "_WRAP_PLUGIN_ENUM(" + enumPrefix + "," +
+          returnCppType + ")";
+
+        Glib::ustring enumGetTypeFunctionName =
+          get_cast_macro(returnCType).lowercase() + "_get_type";
+
+        enumGTypeFunctionDefinitions +=
+          "_PLUGIN_ENUM_GET_TYPE_FUNC(" + returnCType + ")";
+
+        cEnumDefinitions += get_c_enum_definition_macro(returnGType,
+          returnCType);
+      }
+      else if(gst_type_is_a_pointer(returnGType))
       {
         if(g_type_is_a(returnGType, G_TYPE_BOXED))
         // Boxed type returns for signals need special conversions because
@@ -337,9 +407,29 @@ Glib::ustring get_signal_wrap_statements(Glib::ustring& includeMacroCalls,
           includeMacroCalls += "_TRANSLATION_INCLUDE(" + paramCType + ")dnl\n";
 
           // Include wrapping conversions for signal parameters.  (Unwrapping
-          // conversions will already probably be defined in the global convert
-          // file):
+          // conversions will already probably be defined in the global
+          // convert file).  Also try to wrap plug-in specific enums:
 
+          if((G_TYPE_IS_ENUM(paramGType) || G_TYPE_IS_FLAGS(paramGType)))
+          // Check for an enum first and attempt to generate _WRAP_ENUM() and
+          // _TRANSLATION() macros and other necessary code if it is not
+          // wrapped (see plugingen_base.m4 file for docs).
+          {
+            Glib::ustring enumPrefix = paramCType.substr(0, 3);
+            Glib::ustring paramCppType = paramCType.substr(3);
+
+            enumWrapStatements += "_WRAP_PLUGIN_ENUM(" + enumPrefix + "," +
+              paramCppType + ")";
+
+            Glib::ustring enumGetTypeFunctionName =
+              get_cast_macro(paramCType).lowercase() + "_get_type";
+
+            enumGTypeFunctionDefinitions +=
+              "_PLUGIN_ENUM_GET_TYPE_FUNC(" + paramCType + ")";
+
+            cEnumDefinitions += get_c_enum_definition_macro(paramGType,
+              paramCType);
+          }
           if(gst_type_is_a_pointer(paramGType))
           {
             if(paramGType == GST_TYPE_TAG_LIST)
@@ -422,6 +512,7 @@ Glib::ustring get_interface_macros(Glib::ustring& includeMacroCalls,
 }
 
 void generate_hg_file(const Glib::ustring& includeMacroCalls,
+  const Glib::ustring& cEnumDefinitions,
   const Glib::ustring& enumWrapStatements,
   const Glib::ustring& cppExtends,
   const Glib::ustring& interfaceMacros,
@@ -438,11 +529,17 @@ void generate_hg_file(const Glib::ustring& includeMacroCalls,
   std::cout << "_DEFS(" << target << "," << defsFile << ")" << std::endl <<
     std::endl;
 
+  if(!cEnumDefinitions.empty())
+  {
+    std::cout << "// Plug-in C enums used in signals:" << std::endl;
+    std::cout << cEnumDefinitions;
+  }
+
   std::cout << "namespace " << nmspace << std::endl;
   std::cout << "{" << std::endl << std::endl;
 
   if(!enumWrapStatements.empty())
-    std::cout << enumWrapStatements << std::endl;
+    std::cout << enumWrapStatements;
 
   std::cout << "/** " << nmspace << "::" << cppTypeName << " - " << pluginName << " plugin." << std::endl;
   std::cout << " * Please note that, though using the underlying GObject is "
@@ -722,6 +819,7 @@ int main(int argc, char* argv[])
     if(hgFile || ccgFile)
     {
       Glib::ustring includeMacroCalls;
+      Glib::ustring cEnumDefinitions;
       Glib::ustring enumWrapStatements;
       Glib::ustring propertyWrapStatements;
       Glib::ustring signalWrapStatements;
@@ -732,7 +830,8 @@ int main(int argc, char* argv[])
         enumWrapStatements, enumGTypeFunctionDefinitions);
 
       signalWrapStatements = get_signal_wrap_statements(includeMacroCalls,
-        cClassSignalDeclarations);
+        cEnumDefinitions, enumWrapStatements, cClassSignalDeclarations,
+        enumGTypeFunctionDefinitions);
 
       if(hgFile)
       {
@@ -741,8 +840,9 @@ int main(int argc, char* argv[])
 
         interfaceMacros = get_interface_macros(includeMacroCalls, cppExtends);
 
-        generate_hg_file(includeMacroCalls, enumWrapStatements, cppExtends,
-          interfaceMacros, propertyWrapStatements, signalWrapStatements);
+        generate_hg_file(includeMacroCalls, cEnumDefinitions,
+          enumWrapStatements, cppExtends, interfaceMacros,
+          propertyWrapStatements, signalWrapStatements);
       }
       else
       {
diff --git a/tools/m4/plugingen_base.m4 b/tools/m4/plugingen_base.m4
index 00425b3..4f29e28 100644
--- a/tools/m4/plugingen_base.m4
+++ b/tools/m4/plugingen_base.m4
@@ -6,9 +6,15 @@ dnl
 dnl __HASH variable borrowed form glibmm's convert_base.m4 file
 define(`__HASH',`__`'translit(`$*',`ABCDEFGHIJKLMNOPQRSTUVWXYZ<>[]&*, ',`abcdefghijklmnopqrstuvwxyzVBNMRSC_')`'')
 
+dnl _CAMEL_TO_UNDERSCORE(GtkWidget) -> gtk_widget.  Adapted from glibmm's
+dnl _GET_TYPE_FUNC() macro (see glibmm's convert_base.m4 file for docs).
+define(`_CAMEL_TO_UNDERSCORE',`dnl
+translit(substr(patsubst(patsubst(`$1',`[A-Z][A-Z]+',`_\&'),`[A-Z][a-z]',`_\&'),1),`[A-Z]',`[a-z]')`'dnl
+')
+
 dnl _GET_TYPE_FUNC(GtkWidget) -> gtk_widget_get_type().  Borrowed from glibmm's convert_base.m4 file (see glibmm's m4 file for docs).
 define(`_GET_TYPE_FUNC',`dnl
-translit(substr(patsubst(patsubst(`$1',`[A-Z][A-Z]+',`_\&'),`[A-Z][a-z]',`_\&'),1),`[A-Z]',`[a-z]')_get_type()`'dnl
+_CAMEL_TO_UNDERSCORE($1)_get_type()`'dnl
 ')
 
 dnl Macro to insert left quote
@@ -49,7 +55,7 @@ ifdef(`IFC'__HASH(`$1'),,`dnl
 ifdef(`IF'__HASH(`$1'),`dnl
 #include indir(`IF'__HASH(`$1'))
 dnl
-define(`IFC'__HASH(`$1'),`complete')dnl
+define(`IFC'__HASH(`$1'))dnl
 ')`'dnl
 ')`'dnl
 ')dnl
@@ -97,15 +103,18 @@ define(`_ENUM_IS_WRAPPED',`dnl
 define(`EIW'__HASH(`$1'))dnl
 ')dnl
 
-dnl _WRAP_PLUGIN_ENUM(CppEnumType, CEnumType)
+dnl _WRAP_PLUGIN_ENUM(prefix, CppEnumType)
 dnl
 dnl Attempts to generate a _WRAP_ENUM() and a _TRANSLATION() macro for an enum
 dnl used by a plug-in.  If the enum has been flagged as wrapped by the
 dnl _ENUM_IS_WRAPPED() macro nothing will be generated.
 define(`_WRAP_PLUGIN_ENUM',`dnl
-ifdef(`EIW'__HASH(`$2'),,`dnl
-_WRAP_ENUM($1,$2)dnl
-_TRANSLATION(`$2',`$1',`$1')dnl
+ifdef(`EIW'__HASH(`$1$2'),,`dnl
+_TRANSLATION(`$1$2',`$1::$2',`$1::$2')dnl
+_WRAP_ENUM($2,$1$2)
+_CONV_ENUM($1,$2)
+
+_ENUM_IS_WRAPPED($1$2)dnl
 ')`'dnl
 ')dnl
 
@@ -114,15 +123,52 @@ dnl
 dnl Attempts to generate a *_get_type() function for an enum specific to a
 dnl plug-in.  If the enum has been flagged as wrapped by the
 dnl _ENUM_IS_WRAPPED() macro it is taken taken to be a non-plugin enum and
-dnl nothing will be generated.
+dnl nothing will be generated.  Only one function is generated no matter how
+dnl many times the macro is used.
 define(`_PLUGIN_ENUM_GET_TYPE_FUNC',`dnl
 ifdef(`EIW'__HASH(`$1'),,`dnl
+ifdef(`EGTF'__HASH(`$1'),,`dnl
 static GType _GET_TYPE_FUNC($1)
 {
   static GType const type = g_type_from_name("$1");
   return type;
 }
 
+define(`EGTF'__HASH(`$1'))dnl
+')`'dnl
+')`'dnl
+')dnl
+
+dnl _C_ENUM_VALUES(CAPS_UNDERSCORE_C_ENUM_TYPE, nick1, val1, nick2, val2, ...)
+dnl
+dnl Generates the enum values of a C enum definition from the C enum type name
+dnl and the list of nicknames and values of the enum.  The enum type name must
+dnl be converted from camel to caps/underscore format.
+define(`_C_ENUM_VALUES',`dnl
+ifelse(eval(`$# < 3'),`1',,eval(`$# == 3'),`1',`dnl
+  $1_`'translit(translit(`$2',`a-z',`A-Z'),`-',`_') = $3
+',`dnl
+  $1_`'translit(translit(`$2',`a-z',`A-Z'),`-',`_') = $3,
+_C_ENUM_VALUES(`$1',shift(shift(shift($@))))dnl
+')`'dnl
+')dnl
+
+dnl _C_ENUM_DEFINITION(CEnumType, nick1, val1, nick2, val2, ...)
+dnl
+dnl Generates a C enum definition from the C enum type name and the list of
+dnl nicknames and values of the enum if the enum has not been flagged as
+dnl wrapped with the _ENUM_IS_WRAPPED() macro.  Only one definition is
+dnl generated per multiple calls.
+define(`_C_ENUM_DEFINITION',`dnl
+ifdef(`EIW'__HASH(`$1'),,`dnl
+ifdef(`CED'__HASH(`$1'),,`dnl
+enum $1
+{
+_C_ENUM_VALUES(translit(_CAMEL_TO_UNDERSCORE(`$1'),`a-z',`A-Z'),shift($@))dnl
+};
+
+define(`CED'__HASH(`$1'))dnl
+')`'dnl
 ')`'dnl
 ')dnl
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]