static void on_pipe_read (CockpitPipe *pipe, GByteArray *data, gboolean end_of_data, gpointer user_data) { CockpitTextStream *self = user_data; CockpitChannel *channel = user_data; GBytes *message; GBytes *clean; if (data->len || !end_of_data) { /* When array is reffed, this just clears byte array */ g_byte_array_ref (data); message = g_byte_array_free_to_bytes (data); clean = check_utf8_and_force_if_necessary (message); cockpit_channel_send (channel, clean); g_bytes_unref (message); g_bytes_unref (clean); } /* Close the pipe when writing is done */ if (end_of_data && self->open) { g_debug ("%s: end of data, closing pipe", self->name); cockpit_pipe_close (pipe, NULL); } }
static void cockpit_text_stream_recv (CockpitChannel *channel, GBytes *message) { CockpitTextStream *self = COCKPIT_TEXT_STREAM (channel); GBytes *clean; clean = check_utf8_and_force_if_necessary (message); cockpit_pipe_write (self->pipe, clean); g_bytes_unref (clean); }
/** * cockpit_channel_send: * @self: a pipe * @payload: the message payload to send * @trust_is_utf8: set to true if sure data is UTF8 * * Called by implementations to send a message over the transport * on the right channel. * * This message is queued, and sent once the transport can. */ void cockpit_channel_send (CockpitChannel *self, GBytes *payload, gboolean trust_is_utf8) { GBytes *encoded = NULL; GBytes *validated = NULL; if (!trust_is_utf8) { if (!self->priv->binary_ok) payload = validated = check_utf8_and_force_if_necessary (payload); } if (self->priv->base64_encoding) payload = encoded = base64_encode (payload); cockpit_transport_send (self->priv->transport, self->priv->id, payload); if (encoded) g_bytes_unref (encoded); if (validated) g_bytes_unref (validated); }