/******************************************************************************** * upnp_igd_send_action * * Description: * Send an Action request to the specified service of a device. * * Parameters: * igd_ctxt -- The upnp igd context * device_node -- The device * service -- The service * actionname -- The name of the action. * param_name -- An array of parameter names * param_val -- The corresponding parameter values * param_count -- The number of parameters * fun -- Callback function * cookie -- Callback cookie * ********************************************************************************/ int upnp_igd_send_action(upnp_igd_context* igd_ctxt, upnp_igd_device_node *device_node, int service, const char *actionname, const char **param_name, const char **param_val, int param_count, Upnp_FunPtr fun, const void *cookie) { IXML_Document *actionNode = NULL; int ret = 0; int param; if (0 == param_count) { actionNode = UpnpMakeAction(actionname, IGDServiceType[service], 0, NULL); } else { for (param = 0; param < param_count; param++) { if (UpnpAddToAction(&actionNode, actionname, IGDServiceType[service], param_name[param], param_val[param]) != UPNP_E_SUCCESS) { upnp_igd_print(igd_ctxt, UPNP_IGD_ERROR, "ERROR: upnp_igd_send_action: Trying to add action param"); } } } ret = UpnpSendActionAsync(igd_ctxt->upnp_handle, device_node->device.services[service].control_url, IGDServiceType[service], NULL, actionNode, fun, cookie); if (ret != UPNP_E_SUCCESS) { upnp_igd_print(igd_ctxt, UPNP_IGD_ERROR, "Error in UpnpSendActionAsync -- %d", ret); ret = -1; } if (actionNode) ixmlDocument_free(actionNode); return ret; }
/******************************************************************************** * TvCtrlPointSendAction * * Description: * Send an Action request to the specified service of a device. * * Parameters: * service -- The service * devnum -- The number of the device (order in the list, * starting with 1) * actionname -- The name of the action. * param_name -- An array of parameter names * param_val -- The corresponding parameter values * param_count -- The number of parameters * ********************************************************************************/ int TvCtrlPointSendAction( int service, int devnum, const char *actionname, const char **param_name, char **param_val, int param_count) { struct TvDeviceNode *devnode; IXML_Document *actionNode = NULL; int rc = TV_SUCCESS; int param; ithread_mutex_lock(&DeviceListMutex); rc = TvCtrlPointGetDevice(devnum, &devnode); if (TV_SUCCESS == rc) { if (0 == param_count) { actionNode = UpnpMakeAction(actionname, TvServiceType[service], 0, NULL); } else { for (param = 0; param < param_count; param++) { if (UpnpAddToAction (&actionNode, actionname, TvServiceType[service], param_name[param], param_val[param]) != UPNP_E_SUCCESS) { SampleUtil_Print ("ERROR: TvCtrlPointSendAction: Trying to add action param\n"); /*return -1; // TBD - BAD! leaves mutex locked */ } } } rc = UpnpSendActionAsync(ctrlpt_handle, devnode->device. TvService[service].ControlURL, TvServiceType[service], NULL, actionNode, TvCtrlPointCallbackEventHandler, NULL); if (rc != UPNP_E_SUCCESS) { SampleUtil_Print("Error in UpnpSendActionAsync -- %d\n", rc); rc = TV_ERROR; } } ithread_mutex_unlock(&DeviceListMutex); if (actionNode) ixmlDocument_free(actionNode); return rc; }
/******************************************************************************** * WscUPnPCPSendAction * * Description: * Send an Action request to the specified service of a device. * * Parameters: * devnum -- The number of the device (order in the list, * starting with 1) * actionname -- The name of the action. * param_name -- An array of parameter names * param_val -- The corresponding parameter values * param_count -- The number of parameters * ********************************************************************************/ int WscUPnPCPSendAction( IN uint32 ipAddr, IN char *actionname, IN char **param_name, IN char **param_val, IN int param_count) { struct upnpDeviceNode *devnode; IXML_Document *actionNode = NULL; int rc = WSC_SYS_SUCCESS; int param; rc = WscUPnPCPGetDevice(ipAddr, &devnode); if (rc == WSC_SYS_SUCCESS) { if (param_count == 0) { actionNode = UpnpMakeAction(actionname, WscServiceTypeStr, 0, NULL); } else { for (param = 0; param < param_count; param++) { rc = UpnpAddToAction(actionNode, actionname, WscServiceTypeStr, param_name[param], param_val[param]); if (rc != UPNP_E_SUCCESS ) { DBGPRINTF(RT_DBG_ERROR, "ERROR: WscUPnPCPSendAction: Trying to add action param, rc=%d!\n", rc); //return -1; // TBD - BAD! leaves mutex locked } } } DBGPRINTF(RT_DBG_INFO, "ControlURL=%s!\n", devnode->device.services.ControlURL); rc = UpnpSendActionAsync( WscCPHandle, devnode->device.services.ControlURL, WscServiceTypeStr, NULL, actionNode, WscUPnPCPDeviceHandler, NULL); if (rc != UPNP_E_SUCCESS) { DBGPRINTF(RT_DBG_ERROR, "Error in UpnpSendActionAsync -- %d\n", rc); rc = WSC_SYS_ERROR; } } else { DBGPRINTF(RT_DBG_ERROR, "WscUPnPCPGetDevice failed!\n"); } if (actionNode) ixmlDocument_free(actionNode); return rc; }