static struct xmldoc *generate_desc(struct upnp_device_descriptor *device_def) { struct xmldoc *doc; struct xmlelement *root; struct xmlelement *child; struct xmlelement *parent; doc = xmldoc_new(); root=xmldoc_new_topelement(doc, "root", "urn:schemas-upnp-org:device-1-0"); child=gen_specversion(doc,1,0); xmlelement_add_element(doc, root, child); parent=xmlelement_new(doc, "device"); xmlelement_add_element(doc, root, parent); add_value_element(doc,parent,"deviceType", device_def->device_type); add_value_element(doc,parent,"presentationURL", device_def->presentation_url); add_value_element(doc,parent,"friendlyName", device_def->friendly_name); add_value_element(doc,parent,"manufacturer", device_def->manufacturer); add_value_element(doc,parent,"manufacturerURL", device_def->manufacturer_url); add_value_element(doc,parent,"modelDescription", device_def->model_description); add_value_element(doc,parent,"modelName", device_def->model_name); add_value_element(doc,parent,"modelNumber", device_def->model_number); add_value_element(doc,parent,"modelURL", device_def->model_url); add_value_element(doc,parent,"UDN", device_def->udn); //add_value_element(doc,parent,"serialNumber", device_def->serial_number); //add_value_element(doc,parent,"UPC", device_def->upc); if (device_def->icons) { child=gen_desc_iconlist(doc,device_def->icons); xmlelement_add_element(doc,parent,child); } child=gen_desc_servicelist(device_def, doc); xmlelement_add_element(doc, parent, child); return doc; }
void add_value_element_int(struct xmldoc *doc, struct xmlelement *parent, const char *tagname, int value) { char *buf; if (asprintf(&buf,"%d",value) >= 0) { add_value_element(doc, parent, tagname, buf); free(buf); } }
void add_value_element_long(struct xmldoc *doc, struct xmlelement *parent, const char *tagname, long long value) { char *buf; asprintf(&buf,"%lld",value); add_value_element(doc, parent, tagname, buf); free(buf); }
static struct xmlelement *gen_desc_iconlist(struct xmldoc *doc, struct icon **icons) { struct xmlelement *top; struct xmlelement *parent; struct icon *icon_entry; top=xmlelement_new(doc, "iconList"); for (int i = 0; (icon_entry=icons[i]); i++) { parent=xmlelement_new(doc, "icon"); add_value_element(doc,parent,"mimetype", icon_entry->mimetype); add_value_element_int(doc,parent,"width",icon_entry->width); add_value_element_int(doc,parent,"height",icon_entry->height); add_value_element_int(doc,parent,"depth",icon_entry->depth); add_value_element(doc,parent,"url",icon_entry->url); xmlelement_add_element(doc, top, parent); } return top; }
static struct xmlelement *gen_desc_servicelist(struct device *device_def, struct xmldoc *doc) { int i; struct service *srv; struct xmlelement *top; struct xmlelement *parent; top=xmlelement_new(doc, "serviceList"); for (i=0; (srv = device_def->services[i]); i++) { parent=xmlelement_new(doc, "service"); add_value_element(doc,parent,"serviceType",srv->type); add_value_element(doc,parent,"serviceId", srv->service_name); add_value_element(doc,parent,"SCPDURL", srv->scpd_url); add_value_element(doc,parent,"controlURL", srv->control_url); add_value_element(doc,parent,"eventSubURL", srv->event_url); xmlelement_add_element(doc, top, parent); } return top; }