1/////////////////////////////////////////////////////////////////////////// 2// 3// Copyright (c) 2000-2003 Intel Corporation 4// All rights reserved. 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions are met: 8// 9// * Redistributions of source code must retain the above copyright notice, 10// this list of conditions and the following disclaimer. 11// * Redistributions in binary form must reproduce the above copyright notice, 12// this list of conditions and the following disclaimer in the documentation 13// and/or other materials provided with the distribution. 14// * Neither name of Intel Corporation nor the names of its contributors 15// may be used to endorse or promote products derived from this software 16// without specific prior written permission. 17// 18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR 22// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 23// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 24// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 26// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 27// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29// 30/////////////////////////////////////////////////////////////////////////// 31 32#include "config.h" 33#if EXCLUDE_GENA == 0 34#include "gena.h" 35#include "gena_device.h" 36#include "gena_ctrlpt.h" 37 38#include "httpparser.h" 39#include "httpreadwrite.h" 40#include "statcodes.h" 41#include "unixutil.h" 42 43/************************************************************************ 44* Function : error_respond 45* 46* Parameters: 47* IN SOCKINFO *info: Structure containing information about the socket 48* IN int error_code: error code that will be in the GENA response 49* IN http_message_t* hmsg: GENA request Packet 50* 51* Description: 52* This function send an error message to the control point in the case 53* incorrect GENA requests. 54* 55* Returns: int 56* UPNP_E_SUCCESS if successful else appropriate error 57***************************************************************************/ 58void 59error_respond( IN SOCKINFO * info, 60 IN int error_code, 61 IN http_message_t * hmsg ) 62{ 63 int major, 64 minor; 65 66 // retrieve the minor and major version from the GENA request 67 http_CalcResponseVersion( hmsg->major_version, 68 hmsg->minor_version, &major, &minor ); 69 70 http_SendStatusResponse( info, error_code, major, minor ); 71} 72 73/************************************************************************ 74* Function : genaCallback 75* 76* Parameters: 77* IN http_parser_t *parser: represents the parse state of the request 78* IN http_message_t* request: HTTP message containing GENA request 79* INOUT SOCKINFO *info: Structure containing information about the socket 80* 81* Description: 82* This is the callback function called by the miniserver to handle 83* incoming GENA requests. 84* 85* Returns: int 86* UPNP_E_SUCCESS if successful else appropriate error 87***************************************************************************/ 88void 89genaCallback( IN http_parser_t * parser, 90 IN http_message_t * request, 91 INOUT SOCKINFO * info ) 92{ 93 xboolean found_function = FALSE; 94 95 if( request->method == HTTPMETHOD_SUBSCRIBE ) { 96 DEVICEONLY( found_function = TRUE; 97 if( httpmsg_find_hdr( request, HDR_NT, NULL ) == NULL ) 98 { 99 // renew subscription 100 gena_process_subscription_renewal_request 101 ( info, request );} 102 else 103 { 104 // subscribe 105 gena_process_subscription_request( info, request );} 106 107 DBGONLY( UpnpPrintf 108 ( UPNP_ALL, GENA, __FILE__, __LINE__, 109 "got subscription request\n" ); ) 110 ) 111 } 112 else 113 if( request->method == HTTPMETHOD_UNSUBSCRIBE ) { 114 DEVICEONLY( found_function = TRUE; 115 // unsubscribe 116 gena_process_unsubscribe_request( info, 117 request ); ) 118 } else if( request->method == HTTPMETHOD_NOTIFY ) { 119 CLIENTONLY( found_function = TRUE; 120 // notify 121 gena_process_notification_event( info, request ); ) 122 } 123 124 if( !found_function ) { 125 // handle missing functions of device or ctrl pt 126 error_respond( info, HTTP_NOT_IMPLEMENTED, request ); 127 } 128 } 129#endif // EXCLUDE_GENA 130