📄 upnp_tv_ctrlpt.c
字号:
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" ); //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", rc ); rc = TV_ERROR; } } ithread_mutex_unlock( &DeviceListMutex ); if( actionNode ) ixmlDocument_free( actionNode ); return rc;}/******************************************************************************** * TvCtrlPointSendActionNumericArg * * Description:Send an action with one argument to a device in the global device list. * * Parameters: * devnum -- The number of the device (order in the list, starting with 1) * service -- TV_SERVICE_CONTROL or TV_SERVICE_PICTURE * actionName -- The device action, i.e., "SetChannel" * paramName -- The name of the parameter that is being passed * paramValue -- Actual value of the parameter being passed * ********************************************************************************/intTvCtrlPointSendActionNumericArg( int devnum, int service, char *actionName, char *paramName, int paramValue ){ char param_val_a[50]; char *param_val = param_val_a; sprintf( param_val_a, "%d", paramValue ); return TvCtrlPointSendAction( service, devnum, actionName, ¶mName, ¶m_val, 1 );}intTvCtrlPointSendPowerOn( int devnum ){ return TvCtrlPointSendAction( TV_SERVICE_CONTROL, devnum, "PowerOn", NULL, NULL, 0 );}intTvCtrlPointSendPowerOff( int devnum ){ return TvCtrlPointSendAction( TV_SERVICE_CONTROL, devnum, "PowerOff", NULL, NULL, 0 );}intTvCtrlPointSendSetChannel( int devnum, int channel ){ return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_CONTROL, "SetChannel", "Channel", channel );}intTvCtrlPointSendSetVolume( int devnum, int volume ){ return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_CONTROL, "SetVolume", "Volume", volume );}intTvCtrlPointSendSetColor( int devnum, int color ){ return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetColor", "Color", color );}intTvCtrlPointSendSetTint( int devnum, int tint ){ return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetTint", "Tint", tint );}intTvCtrlPointSendSetContrast( int devnum, int contrast ){ return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetContrast", "Contrast", contrast );}intTvCtrlPointSendSetBrightness( int devnum, int brightness ){ return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetBrightness", "Brightness", brightness );}/******************************************************************************** * TvCtrlPointGetDevice * * Description: * Given a list number, returns the pointer to the device * node at that position in the global device list. Note * that this function is not thread safe. It must be called * from a function that has locked the global device list. * * Parameters: * devnum -- The number of the device (order in the list, * starting with 1) * devnode -- The output device node pointer * ********************************************************************************/intTvCtrlPointGetDevice( int devnum, struct TvDeviceNode **devnode ){ int count = devnum; struct TvDeviceNode *tmpdevnode = NULL; if( count ) tmpdevnode = GlobalDeviceList; while( --count && tmpdevnode ) { tmpdevnode = tmpdevnode->next; } if( !tmpdevnode ) { SampleUtil_Print( "Error finding TvDevice number -- %d", devnum ); return TV_ERROR; } *devnode = tmpdevnode; return TV_SUCCESS;}/******************************************************************************** * TvCtrlPointPrintList * * Description: * Print the universal device names for each device in the global device list * * Parameters: * None * ********************************************************************************/intTvCtrlPointPrintList( ){ struct TvDeviceNode *tmpdevnode; int i = 0; ithread_mutex_lock( &DeviceListMutex ); SampleUtil_Print( "TvCtrlPointPrintList:" ); tmpdevnode = GlobalDeviceList; while( tmpdevnode ) { SampleUtil_Print( " %3d -- %s", ++i, tmpdevnode->device.UDN ); tmpdevnode = tmpdevnode->next; } SampleUtil_Print( "" ); ithread_mutex_unlock( &DeviceListMutex ); return TV_SUCCESS;}/******************************************************************************** * TvCtrlPointPrintDevice * * Description: * Print the identifiers and state table for a device from * the global device list. * * Parameters: * devnum -- The number of the device (order in the list, * starting with 1) * ********************************************************************************/intTvCtrlPointPrintDevice( int devnum ){ struct TvDeviceNode *tmpdevnode; int i = 0, service, var; char spacer[15]; if( devnum <= 0 ) { SampleUtil_Print ( "Error in TvCtrlPointPrintDevice: invalid devnum = %d", devnum ); return TV_ERROR; } ithread_mutex_lock( &DeviceListMutex ); SampleUtil_Print( "TvCtrlPointPrintDevice:" ); tmpdevnode = GlobalDeviceList; while( tmpdevnode ) { i++; if( i == devnum ) break; tmpdevnode = tmpdevnode->next; } if( !tmpdevnode ) { SampleUtil_Print ( "Error in TvCtrlPointPrintDevice: invalid devnum = %d -- actual device count = %d", devnum, i ); } else { SampleUtil_Print( " TvDevice -- %d", devnum ); SampleUtil_Print( " | " ); SampleUtil_Print( " +- UDN = %s", tmpdevnode->device.UDN ); SampleUtil_Print( " +- DescDocURL = %s", tmpdevnode->device.DescDocURL ); SampleUtil_Print( " +- FriendlyName = %s", tmpdevnode->device.FriendlyName ); SampleUtil_Print( " +- PresURL = %s", tmpdevnode->device.PresURL ); SampleUtil_Print( " +- Adver. TimeOut = %d", tmpdevnode->device.AdvrTimeOut ); for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { if( service < TV_SERVICE_SERVCOUNT - 1 ) sprintf( spacer, " | " ); else sprintf( spacer, " " ); SampleUtil_Print( " | " ); SampleUtil_Print( " +- Tv %s Service", TvServiceName[service] ); SampleUtil_Print( "%s+- ServiceId = %s", spacer, tmpdevnode->device.TvService[service]. ServiceId ); SampleUtil_Print( "%s+- ServiceType = %s", spacer, tmpdevnode->device.TvService[service]. ServiceType ); SampleUtil_Print( "%s+- EventURL = %s", spacer, tmpdevnode->device.TvService[service]. EventURL ); SampleUtil_Print( "%s+- ControlURL = %s", spacer, tmpdevnode->device.TvService[service]. ControlURL ); SampleUtil_Print( "%s+- SID = %s", spacer, tmpdevnode->device.TvService[service].SID ); SampleUtil_Print( "%s+- ServiceStateTable", spacer ); for( var = 0; var < TvVarCount[service]; var++ ) { SampleUtil_Print( "%s +- %-10s = %s", spacer, TvVarName[service][var], tmpdevnode->device.TvService[service]. VariableStrVal[var] ); } } } SampleUtil_Print( "" ); ithread_mutex_unlock( &DeviceListMutex ); return TV_SUCCESS;}/******************************************************************************** * TvCtrlPointAddDevice * * Description: * If the device is not already included in the global device list, * add it. Otherwise, update its advertisement expiration timeout. * * Parameters: * DescDoc -- The description document for the device * location -- The location of the description document URL * expires -- The expiration time for this advertisement * ********************************************************************************/voidTvCtrlPointAddDevice( IXML_Document * DescDoc, char *location, int expires ){ char *deviceType = NULL; char *friendlyName = NULL; char presURL[200]; char *baseURL = NULL; char *relURL = NULL; char *UDN = NULL; char *serviceId[TV_SERVICE_SERVCOUNT] = { NULL, NULL }; char *eventURL[TV_SERVICE_SERVCOUNT] = { NULL, NULL }; char *controlURL[TV_SERVICE_SERVCOUNT] = { NULL, NULL }; Upnp_SID eventSID[TV_SERVICE_SERVCOUNT]; int TimeOut[TV_SERVICE_SERVCOUNT] = { default_timeout, default_timeout }; struct TvDeviceNode *deviceNode; struct TvDeviceNode *tmpdevnode; int ret = 1; int found = 0; int service, var; ithread_mutex_lock( &DeviceListMutex ); /* Read key elements from description document */ UDN = SampleUtil_GetFirstDocumentItem( DescDoc, "UDN" ); deviceType = SampleUtil_GetFirstDocumentItem( DescDoc, "deviceType" ); friendlyName = SampleUtil_GetFirstDocumentItem( DescDoc, "friendlyName" ); baseURL = SampleUtil_GetFirstDocumentItem( DescDoc, "URLBase" ); relURL = SampleUtil_GetFirstDocumentItem( DescDoc, "presentationURL" );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -