static gssize
g_socket_input_stream_read (GInputStream  *stream,
                            void          *buffer,
                            gsize          count,
                            GCancellable  *cancellable,
                            GError       **error)
{
  GSocketInputStreamX *input_stream = G_SOCKET_INPUT_STREAM (stream);

  return g_socket_receive_with_blocking (input_stream->priv->socket,
					 buffer, count, TRUE,
					 cancellable, error);
}
Beispiel #2
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;
}