session-pool: make vmethod to create a session
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 11 Jul 2013 14:28:09 +0000 (16:28 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 11 Jul 2013 14:28:09 +0000 (16:28 +0200)
Make a vmethod to create a sessions so that subclasses can create
custom session objects

gst/rtsp-server/rtsp-session-pool.c
gst/rtsp-server/rtsp-session-pool.h

index f0b65dc..393ce65 100644 (file)
@@ -56,6 +56,8 @@ static void gst_rtsp_session_pool_set_property (GObject * object, guint propid,
 static void gst_rtsp_session_pool_finalize (GObject * object);
 
 static gchar *create_session_id (GstRTSPSessionPool * pool);
+static GstRTSPSession *create_session (GstRTSPSessionPool * pool,
+    const gchar * id);
 
 G_DEFINE_TYPE (GstRTSPSessionPool, gst_rtsp_session_pool, G_TYPE_OBJECT);
 
@@ -79,6 +81,7 @@ gst_rtsp_session_pool_class_init (GstRTSPSessionPoolClass * klass)
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   klass->create_session_id = create_session_id;
+  klass->create_session = create_session;
 
   GST_DEBUG_CATEGORY_INIT (rtsp_session_debug, "rtspsessionpool", 0,
       "GstRTSPSessionPool");
@@ -279,6 +282,12 @@ create_session_id (GstRTSPSessionPool * pool)
   return g_strndup (id, 16);
 }
 
+static GstRTSPSession *
+create_session (GstRTSPSessionPool * pool, const gchar * id)
+{
+  return gst_rtsp_session_new (id);
+}
+
 /**
  * gst_rtsp_session_pool_create:
  * @pool: a #GstRTSPSessionPool
@@ -330,7 +339,10 @@ gst_rtsp_session_pool_create (GstRTSPSessionPool * pool)
         goto collision;
     } else {
       /* not found, create session and insert it in the pool */
-      result = gst_rtsp_session_new (id);
+      if (klass->create_session)
+        result = create_session (pool, id);
+      if (result == NULL)
+        goto too_many_sessions;
       /* take additional ref for the pool */
       g_object_ref (result);
       g_hash_table_insert (priv->sessions,
index 5132562..82468b1 100644 (file)
@@ -22,7 +22,6 @@
 #ifndef __GST_RTSP_SESSION_POOL_H__
 #define __GST_RTSP_SESSION_POOL_H__
 
-
 G_BEGIN_DECLS
 
 typedef struct _GstRTSPSessionPool GstRTSPSessionPool;
@@ -57,11 +56,13 @@ struct _GstRTSPSessionPool {
  * GstRTSPSessionPoolClass:
  * @create_session_id: create a new random session id. Subclasses can create
  *    custom session ids and should not check if the session exists.
+ * @create_session: make a new session object.
  */
 struct _GstRTSPSessionPoolClass {
   GObjectClass  parent_class;
 
-  gchar * (*create_session_id)   (GstRTSPSessionPool *pool);
+  gchar *          (*create_session_id)   (GstRTSPSessionPool *pool);
+  GstRTSPSession * (*create_session)      (GstRTSPSessionPool *pool, const gchar *id);
 };
 
 /**
@@ -108,7 +109,7 @@ GType                 gst_rtsp_session_pool_get_type          (void);
 /* creating a session pool */
 GstRTSPSessionPool *  gst_rtsp_session_pool_new               (void);
 
-/* counting sessionss */
+/* counting sessions */
 void                  gst_rtsp_session_pool_set_max_sessions  (GstRTSPSessionPool *pool, guint max);
 guint                 gst_rtsp_session_pool_get_max_sessions  (GstRTSPSessionPool *pool);