static void upnpc_desc_received(struct evhttp_request * req, void * pvoid) { size_t len; unsigned char * data; struct evbuffer * input_buffer; struct IGDdatas igd; struct xmlparser parser; upnpc_device_t * d = (upnpc_device_t *)pvoid; if(req == NULL) { debug_printf("%s(%p, %p) NULL argument !\n", __func__, req, pvoid); return; } input_buffer = evhttp_request_get_input_buffer(req); len = evbuffer_get_length(input_buffer); data = evbuffer_pullup(input_buffer, len); debug_printf("%s %d (%d bytes)\n", __func__, evhttp_request_get_response_code(req), (int)len); if(evhttp_request_get_response_code(req) != HTTP_OK) { d->parent->ready_cb(evhttp_request_get_response_code(req), d->parent, d, d->parent->cb_data); return; } if(data == NULL) { d->parent->ready_cb(UPNPC_ERR_ROOT_DESC_ERROR, d->parent, d, d->parent->cb_data); return; } debug_printf("%.*s\n", (int)len, (char *)data); memset(&igd, 0, sizeof(struct IGDdatas)); memset(&parser, 0, sizeof(struct xmlparser)); parser.xmlstart = (char *)data; parser.xmlsize = len; parser.data = &igd; parser.starteltfunc = IGDstartelt; parser.endeltfunc = IGDendelt; parser.datafunc = IGDdata; parsexml(&parser); #ifdef DEBUG printIGD(&igd); #endif /* DEBUG */ d->control_conn_url = build_url_string(igd.urlbase, d->root_desc_location, igd.first.controlurl); d->event_conn_url = build_url_string(igd.urlbase, d->root_desc_location, igd.first.eventsuburl); d->conn_service_type = strdup(igd.first.servicetype); d->control_cif_url = build_url_string(igd.urlbase, d->root_desc_location, igd.CIF.controlurl); d->event_cif_url = build_url_string(igd.urlbase, d->root_desc_location, igd.CIF.eventsuburl); d->cif_service_type = strdup(igd.CIF.servicetype); debug_printf("control_conn_url='%s'\n (service_type='%s')\n", d->control_conn_url, d->conn_service_type); debug_printf("event_conn_url='%s'\n", d->event_conn_url); debug_printf("control_cif_url='%s'\n (service_type='%s')\n", d->control_cif_url, d->cif_service_type); if((d->cif_service_type == NULL) || (strlen(d->cif_service_type) == 0) || (!COMPARE(d->cif_service_type, "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:"))) { d->parent->ready_cb(UPNPC_ERR_NOT_IGD, d->parent, d, d->parent->cb_data); } else { d->state |= UPNPC_DEVICE_GETSTATUS; upnpc_get_status_info(d); } }
/* ready callback */ static void ready(int code, upnpc_t * p, upnpc_device_t * d, void * data) { (void)data; (void)p; if(code == 200) { printf("READY ! %d\n", code); printf(" root_desc_location='%s'\n", d->root_desc_location); /* 1st request */ #ifdef ENABLE_UPNP_EVENTS upnpc_event_subscribe(d); #else upnpc_get_status_info(d); #endif /* ENABLE_UPNP_EVENTS */ } else { printf("DISCOVER ERROR : %d\n", code); switch(code) { case UPNPC_ERR_NO_DEVICE_FOUND: printf("UPNPC_ERR_NO_DEVICE_FOUND\n"); break; case UPNPC_ERR_ROOT_DESC_ERROR: printf("UPNPC_ERR_ROOT_DESC_ERROR\n"); break; case 404: printf("Root desc not found (404)\n"); break; default: printf("unknown error\n"); } } }