|
int wftk_notify (void * session, XML * context, XML * alert) {
WFTK_ADAPTOR * ad;
WFTK_ADAPTORLIST * adlist;
XML * user = context;
XML * from;
const char * preferred_modality = "";
const char * always_list;
char buf[1024]; /* TODO: the usual. */
if (strcmp (context->name, "user")) {
wftk_value_interpret (session, context, xml_attrval (alert, "to"), buf, sizeof(buf));
user = xml_firstelem (user);
while (user) {
if (!strcmp (user->name, "user") && !strcmp (xml_attrval (user, "id"), buf)) break;
user = xml_nextelem (user);
}
}
if (*xml_attrval (alert, "from")) {
wftk_value_interpret (session, context, xml_attrval (alert, "from"), buf, sizeof(buf));
from = wftk_user_retrieve (session, context, buf);
preferred_modality = xml_attrval (from, "notifyvia");
if (!*preferred_modality) preferred_modality = config_get_value (session, "notify.default");
if (*preferred_modality) {
xml_set (alert, "from_addr", xml_attrval (from, preferred_modality));
}
xml_set (alert, "from_name", xml_attrval (from, "name"));
} else {
xml_set (alert, "from_addr", config_get_value (session, "notify.system_from"));
wftk_value_interpret (session, context, config_get_value (session, "notify.system_name"), buf, sizeof(buf));
xml_set (alert, "from_name", buf);
}
if (user) {
wftk_user_synch (session, user);
preferred_modality = xml_attrval (user, "notifyvia");
if (!*preferred_modality) preferred_modality = config_get_value (session, "notify.default");
if (*preferred_modality) {
xml_set (alert, "to_addr", xml_attrval (user, preferred_modality));
xml_set (alert, "to_name", xml_attrval (user, "name"));
sprintf (buf, "notify.%s", preferred_modality);
ad = wftk_get_adaptor (session, NOTIFY, config_get_value (session, buf));
if (ad) {
wftk_call_adaptor (ad, "send", context, alert);
wftk_free_adaptor (session, ad);
}
}
} else {
preferred_modality = config_get_value (session, "notify.default");
wftk_value_interpret (session, context, xml_attrval (alert, "to"), buf, sizeof(buf));
xml_set (alert, "to_addr", buf);
sprintf (buf, "notify.%s", preferred_modality);
ad = wftk_get_adaptor (session, NOTIFY, config_get_value (session, buf));
if (ad) {
wftk_call_adaptor (ad, "send", context, alert);
wftk_free_adaptor (session, ad);
}
}
adlist = wftk_get_adaptorlist (session, NOTIFY);
if (adlist) {
wftk_call_adaptorlist (adlist, "send", context, alert);
wftk_free_adaptorlist (session, adlist);
}
return 1;
}
|