#include "util.h"
typedef struct _stanza_error_st {
char *name;
char *type;
char *code;
} *stanza_error_t;
static struct _stanza_error_st _stanza_errors[] = {
{ "bad-request", "modify", "400" },
{ "conflict", "cancel", "409" },
{ "feature-not-implemented", "cancel", "501" },
{ "forbidden", "auth", "403" },
{ "gone", "modify", "302" },
{ "internal-server-error", "wait", "500" },
{ "item-not-found", "cancel", "404" },
{ "jid-malformed", "modify", "400" },
{ "not-acceptable", "cancel", "406" },
{ "not-allowed", "cancel", "405" },
{ "payment-required", "auth", "402" },
{ "recipient-unavailable", "wait", "404" },
{ "redirect", "modify", "302" },
{ "registration-required", "auth", "407" },
{ "remote-server-not-found", "cancel", "404" },
{ "remote-server-timeout", "wait", "502" },
{ "resource-constraint", "wait", "500" },
{ "service-unavailable", "cancel", "503" },
{ "subscription-required", "auth", "407" },
{ "undefined-condition", NULL, "500" },
{ "unexpected-request", "wait", "400" },
{ NULL, NULL, "401" },
{ NULL, NULL, NULL }
};
nad_t stanza_error(nad_t nad, int elem, int err) {
int ns;
assert((int) nad);
assert((int) (elem >= 0));
assert((int) (err >= 100 && err < stanza_err_LAST));
err = err - 100;
nad_set_attr(nad, elem, -1, "type", "error", 5);
elem = nad_insert_elem(nad, elem, NAD_ENS(nad, elem), "error", NULL);
if(_stanza_errors[err].code != NULL)
nad_set_attr(nad, elem, -1, "code", _stanza_errors[err].code, 0);
if(_stanza_errors[err].type != NULL)
nad_set_attr(nad, elem, -1, "type", _stanza_errors[err].type, 0);
if(_stanza_errors[err].name != NULL) {
ns = nad_add_namespace(nad, uri_STANZA_ERR, NULL);
nad_insert_elem(nad, elem, ns, _stanza_errors[err].name, NULL);
}
return nad;
}
nad_t stanza_tofrom(nad_t nad, int elem) {
int attr;
char to[3072], from[3072];
assert((int) nad);
to[0] = '\0';
from[0] = '\0';
attr = nad_find_attr(nad, elem, -1, "to", NULL);
if(attr >= 0)
snprintf(to, 3072, "%.*s", NAD_AVAL_L(nad, attr), NAD_AVAL(nad, attr));
attr = nad_find_attr(nad, elem, -1, "from", NULL);
if(attr >= 0)
snprintf(from, 3072, "%.*s", NAD_AVAL_L(nad, attr), NAD_AVAL(nad, attr));
nad_set_attr(nad, elem, -1, "to", from[0] != '\0' ? from : NULL, 0);
nad_set_attr(nad, elem, -1, "from", to[0] != '\0' ? to : NULL, 0);
return nad;
}