summaryrefslogtreecommitdiffstats
path: root/ucad.c
diff options
context:
space:
mode:
authorMatthias Vogelgesang <matthias.vogelgesang@kit.edu>2016-02-18 12:08:42 +0100
committerMatthias Vogelgesang <matthias.vogelgesang@kit.edu>2016-02-18 12:08:42 +0100
commit01fdd893ced1f534eea2de39dc363c9e1f43d391 (patch)
tree133b0b8227d022e9daabfc16453c0c621c819e6a /ucad.c
parent508973808a736a563e54034f86dda39335d629f4 (diff)
downloaduca-net-01fdd893ced1f534eea2de39dc363c9e1f43d391.tar.gz
uca-net-01fdd893ced1f534eea2de39dc363c9e1f43d391.tar.bz2
uca-net-01fdd893ced1f534eea2de39dc363c9e1f43d391.tar.xz
uca-net-01fdd893ced1f534eea2de39dc363c9e1f43d391.zip
Proxy custom camera properties to the client
Diffstat (limited to 'ucad.c')
-rw-r--r--ucad.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/ucad.c b/ucad.c
index 649ef28..490964a 100644
--- a/ucad.c
+++ b/ucad.c
@@ -104,6 +104,66 @@ prepare_error_reply (GError *error, UcaNetErrorReply *reply)
}
}
+static gboolean
+serialize_param_spec (GParamSpec *pspec, UcaNetMessageProperty *prop)
+{
+ strncpy (prop->name, g_param_spec_get_name (pspec), sizeof (prop->name));
+ strncpy (prop->nick, g_param_spec_get_nick (pspec), sizeof (prop->nick));
+ strncpy (prop->blurb, g_param_spec_get_blurb (pspec), sizeof (prop->blurb));
+
+ prop->value_type = pspec->value_type;
+ prop->flags = pspec->flags;
+
+#define CASE_NUMERIC(type, storage, typeclass) \
+ case type: \
+ prop->spec.storage.minimum = ((typeclass *) pspec)->minimum; \
+ prop->spec.storage.maximum = ((typeclass *) pspec)->maximum; \
+ prop->spec.storage.default_value = ((typeclass *) pspec)->default_value;
+
+ switch (pspec->value_type) {
+ case G_TYPE_BOOLEAN:
+ prop->spec.gboolean.default_value = ((GParamSpecBoolean *) pspec)->default_value;
+ break;
+ CASE_NUMERIC (G_TYPE_INT, gint, GParamSpecInt)
+ break;
+ CASE_NUMERIC (G_TYPE_UINT, guint, GParamSpecUInt)
+ break;
+ CASE_NUMERIC (G_TYPE_FLOAT, gfloat, GParamSpecFloat)
+ break;
+ CASE_NUMERIC (G_TYPE_DOUBLE, gdouble, GParamSpecDouble)
+ break;
+ default:
+ g_warning ("Unsupported property type");
+ return FALSE;
+ }
+
+#undef CASE_NUMERIC
+
+ return TRUE;
+}
+
+static void
+handle_get_properties_request (GSocketConnection *connection, UcaCamera *camera, gpointer message, GError **error)
+{
+ UcaNetMessageGetPropertiesReply reply = { .type = UCA_NET_MESSAGE_GET_PROPERTIES };
+ GParamSpec **pspecs;
+ guint num_properties;
+
+ pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (camera), &num_properties);
+ reply.num_properties = num_properties - N_BASE_PROPERTIES + 1;
+
+ send_reply (connection, &reply, sizeof (reply), error);
+
+ for (guint i = N_BASE_PROPERTIES - 1; i < num_properties; i++) {
+ UcaNetMessageProperty property;
+
+ if (serialize_param_spec (pspecs[i], &property))
+ send_reply (connection, &property, sizeof (property), error);
+ }
+
+ g_free (pspecs);
+}
+
static void
handle_get_property_request (GSocketConnection *connection, UcaCamera *camera, gpointer message, GError **error)
{
@@ -277,6 +337,7 @@ serve_connection (GSocketConnection *connection, UcaCamera *camera)
gboolean active;
HandlerTable table[] = {
+ { UCA_NET_MESSAGE_GET_PROPERTIES, handle_get_properties_request },
{ UCA_NET_MESSAGE_GET_PROPERTY, handle_get_property_request },
{ UCA_NET_MESSAGE_SET_PROPERTY, handle_set_property_request },
{ UCA_NET_MESSAGE_START_RECORDING, handle_start_recording_request },