summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2013-07-12 12:38:54 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2013-07-12 12:38:54 +0200
commita1e96c226960ef5ba2a01cdcd0fddbb4591abb9f (patch)
tree8f25329985e75d7372f5aa56969b300ad570faa4
parente1628a0515a37b1551258bdf9113dd63e42202ec (diff)
client: add state push/pop
-rw-r--r--gst/rtsp-server/rtsp-client.c55
-rw-r--r--gst/rtsp-server/rtsp-client.h3
2 files changed, 54 insertions, 4 deletions
diff --git a/gst/rtsp-server/rtsp-client.c b/gst/rtsp-server/rtsp-client.c
index b8b96a6..e451d0a 100644
--- a/gst/rtsp-server/rtsp-client.c
+++ b/gst/rtsp-server/rtsp-client.c
@@ -1829,7 +1829,7 @@ client_session_finalized (GstRTSPClient * client, GstRTSPSession * session)
}
}
-static GPrivate state_key;
+static GPrivate current_state;
/**
* gst_rtsp_client_state_get_current:
@@ -1842,7 +1842,54 @@ static GPrivate state_key;
GstRTSPClientState *
gst_rtsp_client_state_get_current (void)
{
- return g_private_get (&state_key);
+ GSList *l;
+
+ l = g_private_get (&current_state);
+ if (l == NULL)
+ return NULL;
+
+ return (GstRTSPClientState *) (l->data);
+
+}
+
+/**
+ * gst_rtsp_client_state_push_current:
+ * @state: a ##GstRTSPClientState
+ *
+ * Pushes @state onto the state stack. The current
+ * state can then be received using gst_rtsp_client_state_get_current().
+ **/
+void
+gst_rtsp_client_state_push_current (GstRTSPClientState * state)
+{
+ GSList *l;
+
+ g_return_if_fail (state != NULL);
+
+ l = g_private_get (&current_state);
+ l = g_slist_prepend (l, state);
+ g_private_set (&current_state, l);
+}
+
+/**
+ * gst_rtsp_client_state_pop_current:
+ * @state: a #GstRTSPClientState
+ *
+ * Pops @state off the state stack (verifying that @state
+ * is on the top of the stack).
+ **/
+void
+gst_rtsp_client_state_pop_current (GstRTSPClientState * state)
+{
+ GSList *l;
+
+ l = g_private_get (&current_state);
+
+ g_return_if_fail (l != NULL);
+ g_return_if_fail (l->data == state);
+
+ l = g_slist_delete_link (l, l);
+ g_private_set (&current_state, l);
}
static void
@@ -1864,7 +1911,7 @@ handle_request (GstRTSPClient * client, GstRTSPMessage * request)
state.request = request;
state.response = &response;
state.auth = priv->auth;
- g_private_set (&state_key, &state);
+ gst_rtsp_client_state_push_current (&state);
if (gst_debug_category_get_threshold (rtsp_client_debug) >= GST_LEVEL_LOG) {
gst_rtsp_message_dump (request);
@@ -1947,7 +1994,7 @@ handle_request (GstRTSPClient * client, GstRTSPMessage * request)
}
done:
- g_private_set (&state_key, NULL);
+ gst_rtsp_client_state_pop_current (&state);
if (session)
g_object_unref (session);
if (uri)
diff --git a/gst/rtsp-server/rtsp-client.h b/gst/rtsp-server/rtsp-client.h
index 8c2dd76..d624638 100644
--- a/gst/rtsp-server/rtsp-client.h
+++ b/gst/rtsp-server/rtsp-client.h
@@ -86,6 +86,9 @@ struct _GstRTSPClientState {
};
GstRTSPClientState * gst_rtsp_client_state_get_current (void);
+void gst_rtsp_client_state_push_current (GstRTSPClientState * state);
+void gst_rtsp_client_state_pop_current (GstRTSPClientState * state);
+
/**
* GstRTSPClientSendFunc: