upnp_tv_device.c

来自「基于LINUX/UNIX的UPN库,是智能家具的用的底层库.」· C语言 代码 · 共 2,039 行 · 第 1/5 页

C
2,039
字号
                          OUT IXML_Document ** out,                          OUT char **errorString ){    return IncrementContrast( 1, in, out, errorString );}/****************************************************************************** * TvDeviceDecreaseContrast * * Description:  *      Decrease the contrast. * * Parameters: *           *    IXML_Document * in -  action request document *    IXML_Document **out - action result document *    char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/intTvDeviceDecreaseContrast( IXML_Document * in,                          IXML_Document ** out,                          char **errorString ){    return IncrementContrast( -1, in, out, errorString );}/****************************************************************************** * TvDeviceSetBrightness * * Description:  *       Change the brightness, update the TvDevice picture service *       state table, and notify all subscribed control points of the *       updated state. * * Parameters: *   brightness -- The brightness value to change to. * *****************************************************************************/intTvDeviceSetBrightness( IN IXML_Document * in,                       OUT IXML_Document ** out,                       OUT char **errorString ){    char *value = NULL;    int brightness = -1;    ( *out ) = NULL;    ( *errorString ) = NULL;    if( !( value = SampleUtil_GetFirstDocumentItem( in, "Brightness" ) ) ) {        ( *errorString ) = "Invalid Brightness";        return UPNP_E_INVALID_PARAM;    }    brightness = atoi( value );    if( brightness < MIN_BRIGHTNESS || brightness > MAX_BRIGHTNESS ) {        SampleUtil_Print( "error: can't change to brightness %d\n",                          brightness );        ( *errorString ) = "Invalid Brightness";        return UPNP_E_INVALID_PARAM;    }    /*       Vendor-specific code to set the volume goes here      */    if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE,                                    TV_PICTURE_BRIGHTNESS, value ) ) {        if( UpnpAddToActionResponse( out, "SetBrightness",                                     TvServiceType[TV_SERVICE_PICTURE],                                     "NewBrightness",                                     value ) != UPNP_E_SUCCESS ) {            ( *out ) = NULL;            ( *errorString ) = "Internal Error";            free( value );            return UPNP_E_INTERNAL_ERROR;        }        free( value );        return UPNP_E_SUCCESS;    } else {        free( value );        ( *errorString ) = "Internal Error";        return UPNP_E_INTERNAL_ERROR;    }}/****************************************************************************** * IncrementBrightness * * Description:  *       Increment the brightness.  Read the current brightness from the state *       table, add the increment, and then change the brightness. * * Parameters: *   incr -- The increment by which to change the brightness. *    *    IXML_Document * in -  action request document *    IXML_Document **out - action result document *    char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/intIncrementBrightness( IN int incr,                     IN IXML_Document * in,                     OUT IXML_Document ** out,                     OUT char **errorString ){    int curbrightness,      newbrightness;    char *actionName = NULL;    char value[TV_MAX_VAL_LEN];    if( incr > 0 ) {        actionName = "IncreaseBrightness";    } else {        actionName = "DecreaseBrightness";    }    ithread_mutex_lock( &TVDevMutex );    curbrightness = atoi( tv_service_table[TV_SERVICE_PICTURE].                          VariableStrVal[TV_PICTURE_BRIGHTNESS] );    ithread_mutex_unlock( &TVDevMutex );    newbrightness = curbrightness + incr;    if( newbrightness < MIN_BRIGHTNESS || newbrightness > MAX_BRIGHTNESS ) {        SampleUtil_Print( "error: can't change to brightness %d\n",                          newbrightness );        ( *errorString ) = "Invalid Brightness";        return UPNP_E_INVALID_PARAM;    }    /*       Vendor-specific code to set the channel goes here      */    sprintf( value, "%d", newbrightness );    if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE,                                    TV_PICTURE_BRIGHTNESS, value ) ) {        if( UpnpAddToActionResponse( out, actionName,                                     TvServiceType[TV_SERVICE_PICTURE],                                     "Brightness",                                     value ) != UPNP_E_SUCCESS ) {            ( *out ) = NULL;            ( *errorString ) = "Internal Error";            return UPNP_E_INTERNAL_ERROR;        }        return UPNP_E_SUCCESS;    } else {        ( *errorString ) = "Internal Error";        return UPNP_E_INTERNAL_ERROR;    }}/****************************************************************************** * TvDeviceIncreaseBrightness * * Description:  *       Increase brightness. * * Parameters: * *    IXML_Document * in -  action request document *    IXML_Document **out - action result document *    char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/intTvDeviceIncreaseBrightness( IN IXML_Document * in,                            OUT IXML_Document ** out,                            OUT char **errorString ){    return IncrementBrightness( 1, in, out, errorString );}/****************************************************************************** * TvDeviceDecreaseBrightness * * Description:  *       Decrease brightnesss. * * Parameters: *    IXML_Document * in -  action request document *    IXML_Document **out - action result document *    char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/intTvDeviceDecreaseBrightness( IN IXML_Document * in,                            OUT IXML_Document ** out,                            OUT char **errorString ){    return IncrementBrightness( -1, in, out, errorString );}/****************************************************************************** * TvDeviceCallbackEventHandler * * Description:  *       The callback handler registered with the SDK while registering *       root device.  Dispatches the request to the appropriate procedure *       based on the value of EventType. The four requests handled by the  *       device are:  *                   1) Event Subscription requests.   *                   2) Get Variable requests.  *                   3) Action requests. * * Parameters: * *   EventType -- The type of callback event *   Event -- Data structure containing event data *   Cookie -- Optional data specified during callback registration * *****************************************************************************/intTvDeviceCallbackEventHandler( Upnp_EventType EventType,                              void *Event,                              void *Cookie ){    switch ( EventType ) {        case UPNP_EVENT_SUBSCRIPTION_REQUEST:            TvDeviceHandleSubscriptionRequest( ( struct                                                 Upnp_Subscription_Request                                                 * )Event );            break;        case UPNP_CONTROL_GET_VAR_REQUEST:            TvDeviceHandleGetVarRequest( ( struct Upnp_State_Var_Request                                           * )Event );            break;        case UPNP_CONTROL_ACTION_REQUEST:            TvDeviceHandleActionRequest( ( struct Upnp_Action_Request * )                                         Event );            break;            /*               ignore these cases, since this is not a control point              */        case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:        case UPNP_DISCOVERY_SEARCH_RESULT:        case UPNP_DISCOVERY_SEARCH_TIMEOUT:        case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:        case UPNP_CONTROL_ACTION_COMPLETE:        case UPNP_CONTROL_GET_VAR_COMPLETE:        case UPNP_EVENT_RECEIVED:        case UPNP_EVENT_RENEWAL_COMPLETE:        case UPNP_EVENT_SUBSCRIBE_COMPLETE:        case UPNP_EVENT_UNSUBSCRIBE_COMPLETE:            break;        default:            SampleUtil_Print                ( "Error in TvDeviceCallbackEventHandler: unknown event type %d\n",                  EventType );    }    /*       Print a summary of the event received      */    SampleUtil_PrintEvent( EventType, Event );    return ( 0 );}/****************************************************************************** * TvDeviceStop * * Description:  *       Stops the device. Uninitializes the sdk.  * * Parameters: * *****************************************************************************/intTvDeviceStop(){    UpnpUnRegisterRootDevice( device_handle );    UpnpFinish();    SampleUtil_Finish();    ithread_mutex_destroy( &TVDevMutex );    return UPNP_E_SUCCESS;}/****************************************************************************** * TvDeviceStart * * Description:  *      Initializes the UPnP Sdk, registers the device, and sends out  *      advertisements.   * * Parameters: * *   ip_address - ip address to initialize the sdk (may be NULL) *                if null, then the first non null loopback address is used. *   port       - port number to initialize the sdk (may be 0) *                if zero, then a random number is used. *   desc_doc_name - name of description document. *                   may be NULL. Default is tvcombodesc.xml *   web_dir_path  - path of web directory. *                   may be NULL. Default is ./web (for Linux) or ../tvdevice/web *                   for windows. *   pfun          - print function to use.   * *****************************************************************************/intTvDeviceStart( char *ip_address,               unsigned short port,               char *desc_doc_name,               char *web_dir_path,               print_string pfun ){    int ret = UPNP_E_SUCCESS;    char desc_doc_url[DESC_URL_SIZE];    ithread_mutex_init( &TVDevMutex, NULL );    SampleUtil_Initialize( pfun );    SampleUtil_Print(        "Initializing UPnP Sdk with\n"        "\tipaddress = %s port = %u\n",        ip_address, port );    if( ( ret = UpnpInit( ip_address, port ) ) != UPNP_E_SUCCESS ) {        SampleUtil_Print( "Error with UpnpInit -- %d\n", ret );        UpnpFinish();        return ret;    }    if( ip_address == NULL ) {        ip_address = UpnpGetServerIpAddress();    }    if( port == 0 ) {        port = UpnpGetServerPort();    }    SampleUtil_Print(        "UPnP Initialized\n"	"\tipaddress= %s port = %u\n",        ip_address, port );    if( desc_doc_name == NULL ) {        desc_doc_name = "tvcombodesc.xml";    }    if( web_dir_path == NULL ) {        web_dir_path = DEFAULT_WEB_DIR;    }    snprintf( desc_doc_url, DESC_URL_SIZE, "http://%s:%d/%s", ip_address,              port, desc_doc_name );    SampleUtil_Print( "Specifying the webserver root directory -- %s\n",                      web_dir_path );    if( ( ret =          UpnpSetWebServerRootDir( web_dir_path ) ) != UPNP_E_SUCCESS ) {        SampleUtil_Print            ( "Error specifying webserver root directory -- %s: %d\n",              web_dir_path, ret );        UpnpFinish();        return ret;    }    SampleUtil_Print(        "Registering the RootDevice\n"        "\t with desc_doc_url: %s\n",        desc_doc_url );    if( ( ret = UpnpRegisterRootDevice( desc_doc_url,                                        TvDeviceCallbackEventHandler,                                        &device_handle, &device_handle ) )        != UPNP_E_SUCCESS ) {        SampleUtil_Print( "Error registering the rootdevice : %d\n", ret );        UpnpFinish();        return ret;    } else {        SampleUtil_Print(            "RootDevice Registered\n"            "Initializing State Table\n");        TvDeviceStateTableInit( desc_doc_url );        SampleUtil_Print("State Table Initialized\n");        if( ( ret =              UpnpSendAdvertisement( device_handle, default_advr_expire ) )            != UPNP_E_SUCCESS ) {            SampleUtil_Print( "Error sending advertisements : %d\n", ret );            UpnpFinish();            return ret;        }        SampleUtil_Print("Advertisements Sent\n");    }    return UPNP_E_SUCCESS;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?