/* Shutdown all the UPnP interfaces */ void upnp_deinit(UPNP_CONTEXT *context) { UPNP_INTERFACE *ifp; while ((ifp = context->iflist) != 0) { context->focus_ifp = ifp; /* Unhook device database */ upnp_device_detach(context, ifp->device); /* shutdown interface protocol */ upnp_http_shutdown(context); ssdp_del_multi(context); /* Drop this link and free */ context->iflist = ifp->next; free(ifp); } /* Shutdown the mutlicast receive socket */ ssdp_shutdown(context); upnp_syslog(LOG_INFO, "UPnP daemon stopped"); free(context); return; }
/* Process the UPnP request message */ void upnp_request_handler(UPNP_CONTEXT *context) { int len; UPNP_REQUEST *request; UPNP_DEVICE *device = 0; UPNP_INTERFACE *ifp = context->focus_ifp; UPNP_DEVCHAIN *chain; /* Read message */ len = read_request(context); if (len <= 0) return; request = (UPNP_REQUEST *)context->buf; if (get_device_from_reqcmd(request->cmd)) { int i; for (i = 0; (device = upnp_device_table[i]) != 0; i++) { if (strcmp(device->root_device_xml, request->url) == 0) break; } if (device == 0) return; } /* Switch the operation */ switch (request->cmd) { case UPNP_REQ_DEV_ADD: upnp_syslog(LOG_INFO, "UPNP_CMD_DEV_ADD"); upnp_device_attach(context, device); break; case UPNP_REQ_DEV_DEL: upnp_syslog(LOG_INFO, "UPNP_CMD_DEV_DEL"); upnp_device_detach(context, device); break; case UPNP_REQ_GET_STATE_VAR: request->status = soap_get_state_var( context, request->url, request->var[0].statevar, &request->var[0].value); upnp_request_response(context, request); break; case UPNP_REQ_SET_EVENT_VAR: gena_event_alarm(context, request->url, request->num, request->var); break; case UPNP_REQ_GENA_NOTIFY: gena_event_alarm(context, request->url, 0, 0); break; default: upnp_syslog(LOG_INFO, "Device command."); for (chain = ifp->device_chain; chain; chain = chain->next) { if (chain->device == device) { ifp->focus_devchain = chain; device->request(context, request); break; } } break; } return; }