WEBPART.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:5k
源码类别:

操作系统开发

开发平台:

DOS

  1. #include <rtos.h>
  2. #include <net.h>
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include <string.h>
  6. #include <graph.h>
  7. #include <httpd.h>
  8. #include <math.h>
  9. #include <strlst.h>
  10. #include <stdlib.h>
  11. /*
  12.  *
  13.  */
  14. int maxvalue = 10;
  15. int newdata( void )
  16. {
  17.     int y;
  18.     static int pos = 0;
  19.     int period = 10;
  20.     y = (int)((long)maxvalue * pos++)/period;
  21.     if ( pos > period ) pos = 0;
  22.     return( y );
  23. }
  24. /*-----------------------------------------------------------------------*
  25.  * Sample Data Collector                                                 *
  26.  *                                                                       *
  27.  * This code is mostly in charge of aging the data history               *
  28.  * every 5 seconds.                                                      *
  29.  *                                                                       *
  30.  * It is placed in a separate thread so it is easy to read               *
  31.  *-----------------------------------------------------------------------*/
  32. #define POINTS 20
  33. static int last_n_points[ POINTS ];    /* this is the series over time */
  34. int curhits;                    /* this is the value in this period */
  35. crit_x *collector_cs = NULL;
  36. void collector( DWORD param )
  37. {
  38.     int i;
  39.     /* clear history */
  40.     memset( last_n_points, 0, sizeof( last_n_points ));
  41.     /* clear counter */
  42.     curhits = 0;
  43.     /* we will use a critical section so that collector and
  44.      * reporter are not interrupting each other
  45.      */
  46.     collector_cs = cs_alloc();
  47.     do {
  48.         rt_sleep( 1000 );    /* sample every second */
  49.         /* react to that collected data
  50.          * start by locking it
  51.          */
  52.         cs_enter( collector_cs );
  53.         /* remove the last one from history */
  54.         for ( i = 0 ; i < POINTS - 2 ; ++i )
  55.             last_n_points[ i ] = last_n_points[ i + 1 ];
  56.         /* and include the most recent */
  57.         last_n_points[ POINTS - 2 ] = curhits;
  58.         /* and reset the input to 0 for next round */
  59.         curhits = 0;
  60.         /* now add some data */
  61.         curhits = newdata();
  62.         cs_exit( collector_cs );
  63.     } while ( 1 );
  64. }
  65. /* graph code */
  66. crit_x *graph_cs = NULL;
  67. void web_graph( tcp_Socket *s )
  68. {
  69.     graph_x *g;
  70.     kblock();
  71.     if ( graph_cs == NULL )
  72.         graph_cs = cs_alloc();
  73.     kunblock();
  74.     cs_enter( graph_cs );
  75. #define GRWIDTH 200
  76. #define GRHEIGHT 50
  77.     g = gr_alloc( GRWIDTH, GRHEIGHT);
  78.     if ( g != NULL ) {
  79.         gr_background( g, 7 );
  80.         /* put a title on the graph */
  81.         gr_text_at( g , "Some Time Function", GRWIDTH/5, GRHEIGHT - 10, 0 );
  82.         /* we need to lock the data for this time */
  83.         cs_enter( collector_cs );
  84.         last_n_points[ POINTS - 1 ] = curhits;
  85.         gr_linegraph( g, POINTS, last_n_points, NULL, "now", 0, 1 );
  86.         /* we don't need the lock on the data anymore */
  87.         cs_exit( collector_cs );
  88.         sock_mode( s, TCP_MODE_BINARY );
  89.         sock_mode( s, TCP_MODE_BINARY | TCP_MODE_NONAGLE );
  90.         gr_gif( s, g );     /* write the graph out as a GIF file */
  91.         gr_free( g );
  92.     }
  93.     cs_exit( graph_cs );
  94. }
  95. /*-----------------------------------------------------------------------*
  96.  * Change Parameters of the scope                                        *
  97.  *-----------------------------------------------------------------------*/
  98. void web_setparms( tcp_Socket *s )
  99. {
  100.     stringlist *sl;
  101.     char *p, *q;
  102.     char buf[ 64 ];
  103.     sl = cgi_getstrings( s );
  104.     if ( (p = strlst_findfirst( sl, "NUMBER", NULL, &q )) != NULL )
  105.         maxvalue = atoi( q );
  106.     cgi_freestrings( sl );
  107.     html_hdr(s,"Parameters");
  108.     sock_puts( s, "<p>Changes made on this screen will affect the"
  109.                   "graph appearing in the frame on the right</p>");
  110.     sock_puts( s, "<form method="post" action="setparms">"
  111.                   "Amplitude "
  112.                   "<input type="TEXT" name="NUMBER" value="");
  113.     itoa( maxvalue, buf, 10 );
  114.     sock_puts( s, buf );
  115.     sock_puts( s, "">"
  116.                   "<input type="submit" value="Submit">"
  117.                   "<input type="reset"  value="Reset">"
  118.                   "</form>");
  119.     html_tail( s );
  120. }
  121. /***********************************************************************
  122.  * - the web server calls this proc for each web request               *
  123.  * - it is called in the context of *one* of the HTTPD threads,        *
  124.  *   though which is not known or important                            *
  125.  * - multiple threads may be in the same proc at the same time         *
  126.  ***********************************************************************/
  127. void user_proc( tcp_Socket *s, char *cmd, char *file, char *ext,
  128.     stringlist *cookies )
  129. {
  130.     char *p, *q;
  131.     /* prepare output */
  132.     if ( !stricmp( ext, "gif"))  {
  133.         if ( !strnicmp( file, "/graph", 6 )) {
  134.             /* short expiry (1 sec) so it re-loads */
  135.             html_datestring( s, "Expires: content="%s"", 1);
  136.             sock_puts( s, "Content-Type: image/gifrn");
  137.             web_graph( s );
  138.         } else
  139.             http_dump( s, "web", file,ext );
  140.     } else {
  141.         /* non gif stuff */
  142.         sock_puts( s, "Content-Type: text/htmlrn");
  143.         if ( !strcmp( file, "/setparms" ))
  144.             web_setparms( s );
  145.         else if ( !stricmp( file, "/" ))
  146.             http_dump( s, "web", "index","htm" );
  147.         else
  148.             http_dump( s, "web", file, ext );
  149.     }
  150. }