void cometd_handle_advice(const cometd* h, cometd_advice* advice) { if (advice == NULL) return; if (cometd_advice_is_handshake(advice)) cometd_handshake(h, NULL); }
gboolean cometd_should_handshake(const cometd* h) { cometd_conn* conn = h->conn; if (cometd_conn_is_state(conn, COMETD_HANDSHAKE_SUCCESS | COMETD_CONNECTED)) return FALSE; return conn->advice == NULL || cometd_advice_is_handshake(conn->advice); }
long cometd_get_backoff(const cometd* h, long attempt) { cometd_config* config = h->config; cometd_advice* advice = h->conn->advice; long backoff = config->backoff_increment; if (advice == NULL) backoff = cometd_impl_compute_backoff(config, attempt); else if (cometd_impl_should_backoff(advice, attempt)) backoff = cometd_impl_compute_backoff(config, attempt-1); // offset attempt else if (cometd_advice_is_handshake(advice) || cometd_advice_is_retry(advice)) backoff = advice->interval; else if (cometd_advice_is_none(advice)) backoff = -1; return backoff; }