summaryrefslogtreecommitdiffstats
path: root/uca-net-server.c
diff options
context:
space:
mode:
Diffstat (limited to 'uca-net-server.c')
-rw-r--r--uca-net-server.c203
1 files changed, 0 insertions, 203 deletions
diff --git a/uca-net-server.c b/uca-net-server.c
deleted file mode 100644
index 853319c..0000000
--- a/uca-net-server.c
+++ /dev/null
@@ -1,203 +0,0 @@
-#include <string.h>
-#include "uca-net-protocol.h"
-
-static UcaNetHandlers handlers;
-
-static void
-send_reply (GOutputStream *output, gpointer data, gsize size, GError **error)
-{
- gsize written;
-
- if (!g_output_stream_write_all (output, data, size, &written, NULL, error))
- return;
-
- if (!g_output_stream_flush (output, NULL, error))
- return;
-}
-
-static void
-prepare_error_reply (GError *error, UcaNetErrorReply *reply)
-{
- if (error != NULL) {
- reply->occurred = TRUE;
- reply->code = error->code;
- strncpy (reply->domain, g_quark_to_string (error->domain), sizeof (error->domain));
- strncpy (reply->message, error->message, sizeof (reply->message));
- g_error_free (error);
- }
- else {
- reply->occurred = FALSE;
- }
-}
-
-static void
-uca_net_server_handle_get_property (GOutputStream *output, UcaNetMessageGetPropertyRequest *request, GError **error)
-{
- UcaNetMessageGetPropertyReply reply = { .type = UCA_NET_MESSAGE_GET_PROPERTY };
-
- handlers.get_property (handlers.user_data, request->property_name, reply.property_value);
- send_reply (output, &reply, sizeof (reply), error);
-}
-
-static void
-uca_net_server_handle_set_property (GOutputStream *output, UcaNetMessageSetPropertyRequest *request, GError **stream_error)
-{
- UcaNetDefaultReply reply = { .type = UCA_NET_MESSAGE_SET_PROPERTY };
- GError *error = NULL;
-
- handlers.set_property (handlers.user_data, request->property_name, request->property_value, &error);
- prepare_error_reply (error, &reply.error);
- send_reply (output, &reply, sizeof (reply), stream_error);
-}
-
-static void
-handle_default (GOutputStream *output, UcaNetMessageType type,
- void (*handler) (gpointer user_data, GError **error), GError **stream_error)
-{
- UcaNetDefaultReply reply = { .type = type };
- GError *error = NULL;
-
- handler (handlers.user_data, &error);
- prepare_error_reply (error, &reply.error);
- send_reply (output, &reply, sizeof (reply), stream_error);
-}
-
-static void
-uca_net_server_handle_start_recording (GOutputStream *output, GError **stream_error)
-{
- handle_default (output, UCA_NET_MESSAGE_START_RECORDING, handlers.start_recording, stream_error);
-}
-
-static void
-uca_net_server_handle_stop_recording (GOutputStream *output, GError **stream_error)
-{
- handle_default (output, UCA_NET_MESSAGE_STOP_RECORDING, handlers.start_recording, stream_error);
-}
-
-static void
-uca_net_server_handle_start_readout (GOutputStream *output, GError **stream_error)
-{
- handle_default (output, UCA_NET_MESSAGE_START_READOUT, handlers.start_readout, stream_error);
-}
-
-static void
-uca_net_server_handle_stop_readout (GOutputStream *output, GError **stream_error)
-{
- handle_default (output, UCA_NET_MESSAGE_STOP_READOUT, handlers.stop_readout, stream_error);
-}
-
-static void
-uca_net_server_handle_trigger (GOutputStream *output, GError **stream_error)
-{
- handle_default (output, UCA_NET_MESSAGE_TRIGGER, handlers.trigger, stream_error);
-}
-
-static void
-uca_net_server_handle_grab (GOutputStream *output, UcaNetMessageGrabRequest *request, GError **stream_error)
-{
- UcaNetDefaultReply reply = { .type = UCA_NET_MESSAGE_GRAB };
- gsize bytes_left;
- GError *error = NULL;
- static gsize size = 0;
- static gchar *buffer = NULL;
-
- if (buffer == NULL || size != request->size) {
- buffer = g_realloc (buffer, request->size);
- size = request->size;
- }
-
- handlers.grab (buffer, handlers.user_data, &error);
- prepare_error_reply (error, &reply.error);
- send_reply (output, &reply, sizeof (reply), stream_error);
-
- /* send data if no error occured during grab */
- if (!reply.error.occurred) {
- bytes_left = size;
-
- while (bytes_left > 0) {
- gssize written;
-
- written = g_output_stream_write (output, &buffer[size - bytes_left], bytes_left, NULL, stream_error);
-
- if (written < 0)
- return;
-
- bytes_left -= written;
- }
- }
-}
-
-void
-uca_net_server_register_handlers (UcaNetHandlers *new_handlers)
-{
- memcpy (&handlers, new_handlers, sizeof (UcaNetHandlers));
-}
-
-void
-uca_net_server_handle (GSocketConnection *connection)
-{
- GInputStream *input;
- GOutputStream *output;
- gchar *buffer;
- gboolean active;
-
- buffer = g_malloc0 (4096);
- input = g_io_stream_get_input_stream (G_IO_STREAM (connection));
- output = g_io_stream_get_output_stream (G_IO_STREAM (connection));
- active = TRUE;
-
- while (active) {
- UcaNetMessageDefault *message;
- GError *error = NULL;
-
- /* looks dangerous */
- g_input_stream_read (input, buffer, 4096, NULL, &error);
- message = (UcaNetMessageDefault *) buffer;
-
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_BROKEN_PIPE)) {
- g_error_free (error);
- active = FALSE;
- break;
- }
-
- switch (message->type) {
- case UCA_NET_MESSAGE_GET_PROPERTY:
- uca_net_server_handle_get_property (output, (UcaNetMessageGetPropertyRequest *) buffer, &error);
- break;
- case UCA_NET_MESSAGE_SET_PROPERTY:
- uca_net_server_handle_set_property (output, (UcaNetMessageSetPropertyRequest *) buffer, &error);
- break;
- case UCA_NET_MESSAGE_START_RECORDING:
- uca_net_server_handle_start_recording (output, &error);
- break;
- case UCA_NET_MESSAGE_STOP_RECORDING:
- uca_net_server_handle_stop_recording (output, &error);
- break;
- case UCA_NET_MESSAGE_START_READOUT:
- uca_net_server_handle_start_readout (output, &error);
- break;
- case UCA_NET_MESSAGE_STOP_READOUT:
- uca_net_server_handle_stop_readout (output, &error);
- break;
- case UCA_NET_MESSAGE_TRIGGER:
- uca_net_server_handle_trigger (output, &error);
- break;
- case UCA_NET_MESSAGE_GRAB:
- uca_net_server_handle_grab (output, (UcaNetMessageGrabRequest *) buffer, &error);
- break;
- case UCA_NET_MESSAGE_CLOSE_CONNECTION:
- active = FALSE;
- break;
- default:
- g_warning ("Message type not known");
- }
-
- if (error != NULL) {
- g_warning ("Error handling requests: %s", error->message);
- g_error_free (error);
- active = FALSE;
- }
- }
-
- g_free (buffer);
-}