static gssize
g_socket_output_stream_pollable_write_nonblocking (GPollableOutputStream  *pollable,
        const void             *buffer,
        gsize                   size,
        GError                **error)
{
    GSocketOutputStream *output_stream = G_SOCKET_OUTPUT_STREAM (pollable);

    return g_socket_send_with_blocking (output_stream->priv->socket,
                                        buffer, size, FALSE,
                                        NULL, error);
}
static gssize
g_socket_output_stream_write (GOutputStream  *stream,
                              const void     *buffer,
                              gsize           count,
                              GCancellable   *cancellable,
                              GError        **error)
{
    GSocketOutputStream *onput_stream = G_SOCKET_OUTPUT_STREAM (stream);

    return g_socket_send_with_blocking (onput_stream->priv->socket,
                                        buffer, count, TRUE,
                                        cancellable, error);
}
Пример #3
0
static char         *_s52_send_cmd(const char *command, const char *params)
{
    // debug
    //g_print("s52ais:_s52_send_cmd(): start:%s\n", params);

    if (NULL == _s52_connection) {
        g_print("s52ais:_s52_send_cmd(): fail - no conection\n");
        return NULL;
    }

    GSocket *socket = g_socket_connection_get_socket(_s52_connection);
    if (NULL == socket) {
        g_print("s52ais:_s52_send_cmd(): fail - no socket\n");
        return NULL;
    }

    GError *error = NULL;
    guint   n     = 0;

    // build a full JSON object
    n = g_snprintf(_response, BUFSZ, "{\"id\":%i,\"method\":\"%s\",\"params\":[%s]}\n", _request_id++, command, params);
    if (n > BUFSZ) {
        g_print("s52ais:_s52_send_cmd():g_snprintf(): no space in buffer\n");
        return NULL;
    }
    _response[n] = '\0';

    //g_print("s52ais:_s52_send_cmd(): sending:%s", _response);

    gssize szsnd = g_socket_send_with_blocking(socket, _response, n, FALSE, NULL, &error);
    if ((NULL!=error) || (0==szsnd) || (-1==szsnd)) {
        //  0 - connection was closed by the peer
        // -1 - on error
        if (NULL == error)
            g_print("s52ais:_s52_send_cmd():ERROR:g_socket_send_with_blocking(): connection close [%s]\n", _response);
        else
            g_print("s52ais:_s52_send_cmd():ERROR:g_socket_send_with_blocking(): %s [%i:%s]\n", error->message, error->code, _response);

        _s52_connection = NULL; // reset connection

        return NULL;
    }

    //g_print("s52ais:_s52_send_cmd(): sended:%s", _response);

    // wait response - blocking socket
    int szrcv = g_socket_receive_with_blocking(socket, _response, BUFSZ, TRUE, NULL, &error);
    //gssize szrcv = g_socket_receive_with_blocking(socket, _response, BUFSZ, FALSE, NULL, &error);
    //if ((NULL!=error) || (0==szrcv) || (-1==szrcv)) {
    if (NULL != error) {
        g_print("s52ais:_s52_send_cmd():ERROR:g_socket_receive_with_blocking(): %s [%i:%s]\n", error->message, error->code, _response);

        _s52_connection = NULL; // reset connection

        return NULL;
    }
    if ((0==szrcv) || (-1==szrcv)) {
        //  0 - connection was closed by the peer
        // -1 - on error

        g_print("s52ais:_s52_send_cmd():ERROR:g_socket_receive_with_blocking(): szrcv:%i\n", szrcv);
        _s52_connection = NULL; // reset connection
        return NULL;
    }
    _response[szrcv] = '\0';

    //g_print("s52ais:_s52_send_cmd(): received:%s\n", _response);

    gchar *result = g_strrstr(_response, "result");
    if (NULL == result) {
        g_print("s52ais:_s52_send_cmd():no result [_response:'%s']\n", _response);
        return NULL;
    }


    return _response;
}