Esempio n. 1
0
void
ccnet_processor_send_update(CcnetProcessor *processor, 
                            const char *code,
                            const char *code_msg,
                            const char *content, int clen)
{
    ccnet_client_send_update (processor->session, UPDATE_ID(processor->id), 
                              code, code_msg, content, clen);
}
Esempio n. 2
0
static char *
invoke_service (CcnetClient *session,
                const char *peer_id,
                const char *service,
                const char *fcall_str,
                size_t fcall_len,
                size_t *ret_len)
{
    struct CcnetResponse *rsp;
    uint32_t req_id;
    GString *buf;

    req_id = ccnet_client_get_rpc_request_id (session, peer_id, service);
    if (req_id == 0) {
        *ret_len = 0;
        return NULL;
    }

    ccnet_client_send_update (session, req_id,
                              SC_CLIENT_CALL, SS_CLIENT_CALL,
                              fcall_str, fcall_len);

    if (ccnet_client_read_response (session) < 0) {
        *ret_len = 0;
        ccnet_client_clean_rpc_request (session, req_id);
        return NULL;
    }
    rsp = &session->response;

    if (memcmp (rsp->code, SC_SERVER_RET, 3) == 0) {
        *ret_len = (size_t) rsp->clen;
        return g_strndup (rsp->content, rsp->clen);
    } else if (memcmp (rsp->code, SC_SERVER_MORE, 3) != 0) {
        g_warning ("[Sea RPC] Bad response: %s %s.\n", rsp->code, rsp->code_msg);
        *ret_len = 0;
        return NULL;
    }

    buf = g_string_new_len (rsp->content, rsp->clen);
    while (1) {
        ccnet_client_send_update (session, req_id,
                                  SC_CLIENT_MORE, SS_CLIENT_MORE,
                                  fcall_str, fcall_len);

        if (ccnet_client_read_response (session) < 0) {
            *ret_len = 0;
            ccnet_client_clean_rpc_request (session, req_id);
            g_string_free (buf, TRUE);
            return NULL;
        }
        rsp = &session->response;

        if (memcmp (rsp->code, SC_SERVER_RET, 3) == 0) {
            g_string_append_len (buf, rsp->content, rsp->clen);
            *ret_len = buf->len;
            return g_string_free (buf, FALSE);
        } else if (memcmp (rsp->code, SC_SERVER_MORE, 3) == 0) { 
            g_string_append_len (buf, rsp->content, rsp->clen);
        } else {
            g_warning ("[Sea RPC] Bad response: %s %s.\n",
                       rsp->code, rsp->code_msg);
            *ret_len = 0;
            g_string_free (buf, TRUE);
            return NULL;
        }
    }

    /* Never reach here. */
    return NULL;
}