4 #include "wsc_common.h"
7 static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
8 static const char cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq";
11 extern int wsc_debug_level;
14 void DBGPRINTF(int level, char *fmt, ...)
19 if (level <= wsc_debug_level)
27 void wsc_hexdump(char *title, char *ptr, int len)
33 if (RT_DBG_PKT <= wsc_debug_level)
35 printf("\n---StartOfMsgHexDump:%s\n", title);
36 for(i = 0; i < len; i++)
40 printf("%02x ", tmp[i] & 0xff);
42 printf("\n---EndOfMsgHexDump!\n");
50 wsc_PrintEventType( IN Upnp_EventType S )
54 case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:
55 printf( "UPNP_DISCOVERY_ADVERTISEMENT_ALIVE\n" );
57 case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:
58 printf( "UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE\n" );
60 case UPNP_DISCOVERY_SEARCH_RESULT:
61 printf( "UPNP_DISCOVERY_SEARCH_RESULT\n" );
63 case UPNP_DISCOVERY_SEARCH_TIMEOUT:
64 printf( "UPNP_DISCOVERY_SEARCH_TIMEOUT\n" );
70 case UPNP_CONTROL_ACTION_REQUEST:
71 printf( "UPNP_CONTROL_ACTION_REQUEST\n" );
73 case UPNP_CONTROL_ACTION_COMPLETE:
74 printf( "UPNP_CONTROL_ACTION_COMPLETE\n" );
76 case UPNP_CONTROL_GET_VAR_REQUEST:
77 printf( "UPNP_CONTROL_GET_VAR_REQUEST\n" );
79 case UPNP_CONTROL_GET_VAR_COMPLETE:
80 printf( "UPNP_CONTROL_GET_VAR_COMPLETE\n" );
86 case UPNP_EVENT_SUBSCRIPTION_REQUEST:
87 printf( "UPNP_EVENT_SUBSCRIPTION_REQUEST\n" );
89 case UPNP_EVENT_RECEIVED:
90 printf( "UPNP_EVENT_RECEIVED\n" );
92 case UPNP_EVENT_RENEWAL_COMPLETE:
93 printf( "UPNP_EVENT_RENEWAL_COMPLETE\n" );
95 case UPNP_EVENT_SUBSCRIBE_COMPLETE:
96 printf( "UPNP_EVENT_SUBSCRIBE_COMPLETE\n" );
98 case UPNP_EVENT_UNSUBSCRIBE_COMPLETE:
99 printf( "UPNP_EVENT_UNSUBSCRIBE_COMPLETE\n" );
102 case UPNP_EVENT_AUTORENEWAL_FAILED:
103 printf( "UPNP_EVENT_AUTORENEWAL_FAILED\n" );
105 case UPNP_EVENT_SUBSCRIPTION_EXPIRED:
106 printf( "UPNP_EVENT_SUBSCRIPTION_EXPIRED\n" );
112 void wsc_printEvent(IN Upnp_EventType EventType,
115 printf( "\n\n\n======================================================================\n" );
116 printf( "----------------------------------------------------------------------\n" );
117 wsc_PrintEventType( EventType );
119 switch ( EventType ) {
124 case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:
125 case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:
126 case UPNP_DISCOVERY_SEARCH_RESULT:
128 struct Upnp_Discovery *d_event = ( struct Upnp_Discovery * )Event;
130 printf( "ErrCode = %d\n", d_event->ErrCode );
131 printf( "Expires = %d\n", d_event->Expires );
132 printf( "DeviceId = %s\n", d_event->DeviceId );
133 printf( "DeviceType = %s\n", d_event->DeviceType );
134 printf( "ServiceType = %s\n", d_event->ServiceType );
135 printf( "ServiceVer = %s\n", d_event->ServiceVer );
136 printf( "Location = %s\n", d_event->Location );
137 printf( "OS = %s\n", d_event->Os );
138 printf( "Ext = %s\n", d_event->Ext );
142 case UPNP_DISCOVERY_SEARCH_TIMEOUT:
143 // Nothing to print out here
149 case UPNP_CONTROL_ACTION_REQUEST:
151 struct Upnp_Action_Request *a_event = ( struct Upnp_Action_Request * )Event;
152 char *xmlbuff = NULL;
154 printf( "ErrCode = %d\n", a_event->ErrCode );
155 printf( "ErrStr = %s\n", a_event->ErrStr );
156 printf( "ActionName = %s\n", a_event->ActionName );
157 printf( "UDN = %s\n", a_event->DevUDN );
158 printf( "ServiceID = %s\n", a_event->ServiceID );
159 if( a_event->ActionRequest ) {
160 xmlbuff = ixmlPrintDocument( a_event->ActionRequest );
162 printf( "ActRequest = %s\n", xmlbuff );
164 ixmlFreeDOMString( xmlbuff );
167 printf( "ActRequest = (null)\n" );
170 if( a_event->ActionResult ) {
171 xmlbuff = ixmlPrintDocument( a_event->ActionResult );
173 printf( "ActResult = %s\n", xmlbuff );
175 ixmlFreeDOMString( xmlbuff );
178 printf( "ActResult = (null)\n" );
183 case UPNP_CONTROL_ACTION_COMPLETE:
185 struct Upnp_Action_Complete *a_event = ( struct Upnp_Action_Complete * )Event;
186 char *xmlbuff = NULL;
188 printf( "ErrCode = %d\n", a_event->ErrCode );
189 printf( "CtrlUrl = %s\n", a_event->CtrlUrl );
190 if( a_event->ActionRequest ) {
191 xmlbuff = ixmlPrintDocument( a_event->ActionRequest );
193 printf( "ActRequest = %s\n", xmlbuff );
195 ixmlFreeDOMString( xmlbuff );
198 printf( "ActRequest = (null)\n" );
201 if( a_event->ActionResult ) {
202 xmlbuff = ixmlPrintDocument( a_event->ActionResult );
204 printf( "ActResult = %s\n", xmlbuff );
206 ixmlFreeDOMString( xmlbuff );
209 printf( "ActResult = (null)\n" );
214 case UPNP_CONTROL_GET_VAR_REQUEST:
216 struct Upnp_State_Var_Request *sv_event = ( struct Upnp_State_Var_Request * )Event;
218 printf( "ErrCode = %d\n", sv_event->ErrCode );
219 printf( "ErrStr = %s\n", sv_event->ErrStr );
220 printf( "UDN = %s\n", sv_event->DevUDN );
221 printf( "ServiceID = %s\n", sv_event->ServiceID );
222 printf( "StateVarName= %s\n", sv_event->StateVarName );
223 printf( "CurrentVal = %s\n", sv_event->CurrentVal );
227 case UPNP_CONTROL_GET_VAR_COMPLETE:
229 struct Upnp_State_Var_Complete *sv_event =
230 ( struct Upnp_State_Var_Complete * )Event;
232 printf( "ErrCode = %d\n", sv_event->ErrCode );
233 printf( "CtrlUrl = %s\n", sv_event->CtrlUrl );
234 printf( "StateVarName= %s\n", sv_event->StateVarName );
235 printf( "CurrentVal = %s\n", sv_event->CurrentVal );
242 case UPNP_EVENT_SUBSCRIPTION_REQUEST:
244 struct Upnp_Subscription_Request *sr_event = ( struct Upnp_Subscription_Request * )Event;
246 printf( "ServiceID = %s\n", sr_event->ServiceId );
247 printf( "UDN = %s\n", sr_event->UDN );
248 printf( "SID = %s\n", sr_event->Sid );
252 case UPNP_EVENT_RECEIVED:
254 struct Upnp_Event *e_event = ( struct Upnp_Event * )Event;
255 char *xmlbuff = NULL;
257 printf( "SID = %s\n", e_event->Sid );
258 printf( "EventKey = %d\n", e_event->EventKey );
259 xmlbuff = ixmlPrintDocument( e_event->ChangedVariables );
260 printf( "ChangedVars = %s\n", xmlbuff );
261 ixmlFreeDOMString( xmlbuff );
266 case UPNP_EVENT_RENEWAL_COMPLETE:
268 struct Upnp_Event_Subscribe *es_event = (struct Upnp_Event_Subscribe *)Event;
270 printf( "SID = %s\n", es_event->Sid);
271 printf( "ErrCode = %d\n", es_event->ErrCode);
272 printf( "TimeOut = %d\n", es_event->TimeOut);
276 case UPNP_EVENT_SUBSCRIBE_COMPLETE:
277 case UPNP_EVENT_UNSUBSCRIBE_COMPLETE:
279 struct Upnp_Event_Subscribe *es_event = (struct Upnp_Event_Subscribe *)Event;
281 printf( "SID = %s\n", es_event->Sid );
282 printf( "ErrCode = %d\n", es_event->ErrCode );
283 printf( "PublisherURL= %s\n", es_event->PublisherUrl );
284 printf( "TimeOut = %d\n", es_event->TimeOut );
288 case UPNP_EVENT_AUTORENEWAL_FAILED:
289 case UPNP_EVENT_SUBSCRIPTION_EXPIRED:
291 struct Upnp_Event_Subscribe *es_event = ( struct Upnp_Event_Subscribe * )Event;
293 printf( "SID = %s\n", es_event->Sid );
294 printf( "ErrCode = %d\n", es_event->ErrCode );
295 printf( "PublisherURL= %s\n", es_event->PublisherUrl );
296 printf( "TimeOut = %d\n", es_event->TimeOut );
301 printf( "----------------------------------------------------------------------\n" );
302 printf( "======================================================================\n\n\n\n" );
307 /* encode 3 8-bit binary bytes as 4 '6-bit' characters */
308 void ILibencodeblock( unsigned char in[3], unsigned char out[4], int len )
310 out[0] = cb64[ in[0] >> 2 ];
311 out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ];
312 out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '=');
313 out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '=');
316 /*! \fn ILibBase64Encode(unsigned char* input, const int inputlen, unsigned char** output)
317 \brief Base64 encode a stream adding padding and line breaks as per spec.
319 \b Note: The encoded stream must be freed
320 \param input The stream to encode
321 \param inputlen The length of \a input
322 \param output The encoded stream
323 \returns The length of the encoded stream
325 int ILibBase64Encode(unsigned char* input, const int inputlen, unsigned char** output)
330 *output = (unsigned char*)malloc(((inputlen * 4) / 3) + 5);
334 if (input == NULL || inputlen == 0)
340 while ((in+3) <= (input+inputlen))
342 ILibencodeblock(in, out, 3);
346 if ((input+inputlen)-in == 1)
348 ILibencodeblock(in, out, 1);
352 if ((input+inputlen)-in == 2)
354 ILibencodeblock(in, out, 2);
359 return (int)(out-*output);
362 /* Decode 4 '6-bit' characters into 3 8-bit binary bytes */
363 void ILibdecodeblock( unsigned char in[4], unsigned char out[3] )
365 out[ 0 ] = (unsigned char ) (in[0] << 2 | in[1] >> 4);
366 out[ 1 ] = (unsigned char ) (in[1] << 4 | in[2] >> 2);
367 out[ 2 ] = (unsigned char ) (((in[2] << 6) & 0xc0) | in[3]);
370 /*! \fn ILibBase64Decode(unsigned char* input, const int inputlen, unsigned char** output)
371 \brief Decode a base64 encoded stream discarding padding, line breaks and noise
373 \b Note: The decoded stream must be freed
374 \param input The stream to decode
375 \param inputlen The length of \a input
376 \param output The decoded stream
377 \returns The length of the decoded stream
379 int ILibBase64Decode(unsigned char* input, const int inputlen, unsigned char** output)
381 unsigned char* inptr;
387 if (input == NULL || inputlen == 0)
393 *output = (unsigned char*)malloc(((inputlen * 3) / 4) + 4);
397 while( inptr <= (input+inputlen) )
399 for( len = 0, i = 0; i < 4 && inptr <= (input+inputlen); i++ )
402 while( inptr <= (input+inputlen) && v == 0 ) {
403 v = (unsigned char) *inptr;
405 v = (unsigned char) ((v < 43 || v > 122) ? 0 : cd64[ v - 43 ]);
407 v = (unsigned char) ((v == '$') ? 0 : v - 61);
410 if( inptr <= (input+inputlen) ) {
413 in[ i ] = (unsigned char) (v - 1);
422 ILibdecodeblock( in, out );
427 return (int)(out-*output);