diff options
author | defanor <defanor@uberspace.net> | 2020-03-12 12:53:32 +0300 |
---|---|---|
committer | defanor <defanor@uberspace.net> | 2020-03-12 12:53:32 +0300 |
commit | 7b3d46b995bc7cc8ac02533822cadaa3e3b4458b (patch) | |
tree | 98c29598a7479eafa597a26ba510524002315374 /src/rexmpp.c | |
parent | bc8aecf0c58fba2c04df2e04089562f311fea8f1 (diff) |
Add feature configuration
Many features may better be handled by an application rather than by a
library, yet for less sophisticated clients it is better if a library
implements those.
A common solution is to implement optional features as loadable
modules (e.g., a collection of hooks and some state), which is also a
nice way to structure them. But module APIs tend to be restrictive, or
ad hoc (aiming to cover just the desired modules), or flexible and
reminiscent of "Greenspun's tenth rule", particularly when done in C.
The solution chosen here for now is to introduce configurable flags:
an application can enable or disable features that way, while the
control flow inside the library should be more explicit and not
restrictive.
Diffstat (limited to 'src/rexmpp.c')
-rw-r--r-- | src/rexmpp.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/rexmpp.c b/src/rexmpp.c index 7e48bab..f57c611 100644 --- a/src/rexmpp.c +++ b/src/rexmpp.c @@ -79,6 +79,8 @@ rexmpp_err_t rexmpp_init (rexmpp_t *s, s->manual_direct_tls = 0; s->socks_host = NULL; s->server_host = NULL; + s->enable_carbons = 1; + s->enable_service_discovery = 1; s->send_buffer = NULL; s->send_queue = NULL; s->server_srv = NULL; @@ -225,9 +227,6 @@ void rexmpp_cleanup (rexmpp_t *s) { s->server_srv_tls_cur = NULL; } s->sm_state = REXMPP_SM_INACTIVE; - if (s->carbons_state != REXMPP_CARBONS_DISABLED) { - s->carbons_state = REXMPP_CARBONS_INACTIVE; - } } /* Frees the things that persist through reconnects. */ @@ -1021,7 +1020,7 @@ void rexmpp_discovery_info (rexmpp_t *s, xmlNodePtr req, xmlNodePtr response) { if (rexmpp_xml_match(child, "http://jabber.org/protocol/disco#info", "feature")) { char *var = xmlGetProp(child, "var"); - if (s->carbons_state != REXMPP_CARBONS_DISABLED && + if (s->enable_carbons && strcmp(var, "urn:xmpp:carbons:2") == 0) { xmlNodePtr carbons_enable = xmlNewNode(NULL, "enable"); xmlNewNs(carbons_enable, "urn:xmpp:carbons:2", NULL); @@ -1039,10 +1038,12 @@ void rexmpp_stream_is_ready(rexmpp_t *s) { s->stream_state = REXMPP_STREAM_READY; rexmpp_resend_stanzas(s); rexmpp_send(s, xmlNewNode(NULL, "presence")); - xmlNodePtr disco_query = xmlNewNode(NULL, "query"); - xmlNewNs(disco_query, "http://jabber.org/protocol/disco#info", NULL); - rexmpp_iq_new(s, "get", jid_bare_to_host(s->initial_jid), - disco_query, rexmpp_discovery_info); + if (s->enable_service_discovery) { + xmlNodePtr disco_query = xmlNewNode(NULL, "query"); + xmlNewNs(disco_query, "http://jabber.org/protocol/disco#info", NULL); + rexmpp_iq_new(s, "get", jid_bare_to_host(s->initial_jid), + disco_query, rexmpp_discovery_info); + } } /* Resource binding, |