示例#1
0
/* 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;
}
示例#2
0
/* 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;
}