home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 February / CHIP_2_98.iso / software / pelne / optionp / iis4_07.cab / HTML.CPP < prev    next >
Text File  |  1997-10-25  |  11KB  |  701 lines

  1. /*++
  2.  
  3. Copyright (c) 1997  Microsoft Corporation
  4.  
  5. Module Name:    html.cpp
  6.  
  7. Abstract:
  8.  
  9.    This module contains simple HTML authoring functions.
  10.  
  11.  
  12. --*/
  13.  
  14. #define WIN32_LEAN_AND_MEAN
  15. #include <windows.h>
  16. #include <httpext.h>
  17.  
  18. #include <stdio.h>
  19. #include <stdarg.h>
  20.  
  21. #include "html.h"
  22.  
  23.  
  24. void
  25. WriteString( 
  26.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  27.     IN LPCSTR lpsz
  28. )
  29. {
  30.     DWORD dwBytesWritten;
  31.  
  32.     dwBytesWritten = lstrlen( lpsz );
  33.     pECB->WriteClient( pECB->ConnID, (PVOID) lpsz, &dwBytesWritten, 0 );
  34. }
  35.  
  36.  
  37. void 
  38. HtmlCreatePage( 
  39.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  40.     IN LPCSTR lpszTitle
  41. )
  42. {
  43.     WriteString( pECB, "<HTML>\r\n\r\n" );
  44.  
  45.     if ( lpszTitle ) {
  46.         WriteString( pECB, "<HEAD><TITLE>" );
  47.         HtmlWriteText( pECB, lpszTitle );
  48.         WriteString( pECB, "</TITLE></HEAD>\r\n\r\n" );
  49.     }
  50.     WriteString( pECB, "<BODY>\r\n\r\n" );
  51. }
  52.  
  53.  
  54. void 
  55. HtmlEndPage( 
  56.     IN EXTENSION_CONTROL_BLOCK * pECB
  57. )
  58. {
  59.     WriteString( pECB, "</BODY>\r\n\r\n" );
  60.     WriteString( pECB, "</HTML>\r\n" );
  61. }
  62.  
  63.  
  64. void 
  65. HtmlHeading( 
  66.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  67.     IN int nHeading,
  68.     IN LPCSTR lpszText
  69. )
  70. {
  71.     HtmlBeginHeading( pECB, nHeading );
  72.     HtmlWriteText( pECB, lpszText );
  73.     HtmlEndHeading( pECB, nHeading );
  74. }
  75.  
  76.  
  77. void 
  78. HtmlBeginHeading( 
  79.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  80.     IN int nHeading
  81. )
  82. {
  83.     char szCode[16];
  84.  
  85.     wsprintf( szCode, "<H%i>", nHeading );
  86.     WriteString( pECB, szCode );
  87. }
  88.  
  89.  
  90. void 
  91. HtmlEndHeading( 
  92.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  93.     IN int nHeading
  94. )
  95. {
  96.     char szCode[16];
  97.  
  98.     wsprintf( szCode, "</H%i>", nHeading );
  99.     WriteString( pECB, szCode );
  100. }
  101.  
  102.  
  103. void 
  104. HtmlWriteTextLine( 
  105.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  106.     IN LPCSTR lpsz
  107. )
  108. {
  109.     HtmlWriteText( pECB, lpsz );
  110.     WriteString( pECB, "\r\n" );
  111. }
  112.  
  113.  
  114. void 
  115. HtmlWriteText( 
  116.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  117.     IN LPCSTR lpsz
  118. )
  119. {
  120.     char szBuf[1028];
  121.     int nLen;
  122.     int i;
  123.  
  124.     // 
  125.     // Build up enough data to make call to WriteString
  126.     // worthwhile; convert special chars too.
  127.     // 
  128.     nLen = 0;
  129.     for ( i = 0; lpsz[i]; i++ ) {
  130.         if ( lpsz[i] == '<' )
  131.             lstrcpy( &szBuf[nLen], "<" );
  132.         else if ( lpsz[i] == '>' )
  133.             lstrcpy( &szBuf[nLen], ">" );
  134.         else if ( lpsz[i] == '&' )
  135.             lstrcpy( &szBuf[nLen], "&" );
  136.         else if ( lpsz[i] == '\"' )
  137.             lstrcpy( &szBuf[nLen], """ );
  138.         else {
  139.             szBuf[nLen] = lpsz[i];
  140.             szBuf[nLen + 1] = 0;
  141.         }
  142.  
  143.         nLen += lstrlen( &szBuf[nLen] );
  144.  
  145.         if ( nLen >= 1024 ) {
  146.             WriteString( pECB, szBuf );
  147.             nLen = 0;
  148.         }
  149.     }
  150.  
  151.     if ( nLen )
  152.         WriteString( pECB, szBuf );
  153. }
  154.  
  155.  
  156. void 
  157. HtmlEndParagraph( 
  158.     IN EXTENSION_CONTROL_BLOCK * pECB 
  159. )
  160. {
  161.     WriteString( pECB, "<P>\r\n" );
  162. }
  163.  
  164.  
  165. //
  166. // HtmlHyperLink adds a hyptertext link.  lpszDoc is the destination
  167. // document, and lpszText is the display text.
  168. // 
  169. // HtmlHyperLinkAndBookmark adds a hyperlink with a bookmark link.
  170. // HtmlBookmarkLink adds only a bookmark link.
  171. // 
  172.  
  173. void 
  174. HtmlHyperLink( 
  175.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  176.     IN LPCSTR lpszDoc, 
  177.     IN LPCSTR lpszText
  178. )
  179. {
  180.     WriteString( pECB, "<A HREF=\"" );
  181.     HtmlWriteText( pECB, lpszDoc );
  182.     WriteString( pECB, "\">" );
  183.     HtmlWriteText( pECB, lpszText );
  184.     WriteString( pECB, "</A>\r\n" );
  185. }
  186.  
  187. void 
  188. HtmlHyperLinkAndBookmark( 
  189.     IN EXTENSION_CONTROL_BLOCK * pECB,
  190.     IN LPCSTR lpszDoc, 
  191.     IN LPCSTR lpszBookmark,
  192.     IN LPCSTR lpszText
  193. )
  194. {
  195.     WriteString( pECB, "<A HREF=\"" );
  196.     if ( lpszDoc )
  197.         HtmlWriteText( pECB, lpszDoc );
  198.     WriteString( pECB, "#" );
  199.     HtmlWriteText( pECB, lpszBookmark );
  200.     WriteString( pECB, "\">" );
  201.     HtmlWriteText( pECB, lpszText );
  202.     WriteString( pECB, "</A>\r\n" );
  203. }
  204.  
  205.  
  206. void 
  207. HtmlBookmarkLink( 
  208.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  209.     IN LPCSTR lpszBookmark,
  210.     IN LPCSTR lpszText
  211. )
  212. {
  213.     HtmlHyperLinkAndBookmark( pECB, NULL, lpszBookmark, lpszText );
  214. }
  215.  
  216.  
  217. //
  218. // The following support list formatting.
  219. // 
  220.  
  221. void 
  222. HtmlBeginUnnumberedList( 
  223.     IN EXTENSION_CONTROL_BLOCK * pECB 
  224. )
  225. {
  226.     WriteString( pECB, "<UL>\r\n" );
  227. }
  228.  
  229.  
  230. void 
  231. HtmlBeginListItem( 
  232.     IN EXTENSION_CONTROL_BLOCK * pECB 
  233. )
  234. {
  235.     WriteString( pECB, "<LI>" );
  236. }
  237.  
  238.  
  239. void 
  240. HtmlEndUnnumberedList( 
  241.     IN EXTENSION_CONTROL_BLOCK * pECB 
  242. )
  243. {
  244.     WriteString( pECB, "</UL>" );
  245. }
  246.  
  247.  
  248. void 
  249. HtmlBeginNumberedList( 
  250.     IN EXTENSION_CONTROL_BLOCK * pECB 
  251. )
  252. {
  253.     WriteString( pECB, "<OL>" );
  254. }
  255.  
  256.  
  257. void 
  258. HtmlEndNumberedList( 
  259.     IN EXTENSION_CONTROL_BLOCK * pECB 
  260. )
  261. {
  262.     WriteString( pECB, "</OL>" );
  263. }
  264.  
  265.  
  266. void 
  267. HtmlBeginDefinitionList( 
  268.     IN EXTENSION_CONTROL_BLOCK * pECB 
  269. )
  270. {
  271.     WriteString( pECB, "<DL>" );
  272. }
  273.  
  274.  
  275. void 
  276. HtmlEndDefinitionList( 
  277.     IN EXTENSION_CONTROL_BLOCK * pECB 
  278. )
  279. {
  280.     WriteString( pECB, "</DL>" );
  281. }
  282.  
  283.  
  284. void 
  285. HtmlDefinition( 
  286.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  287.     IN LPCSTR lpszTerm,
  288.     IN LPSTR lpszDef
  289. )
  290. {
  291.     int nStart, nEnd, nLen;
  292.     char tcHolder;
  293.  
  294.     WriteString( pECB, "<DT> " );
  295.     HtmlWriteText( pECB, lpszTerm );
  296.     WriteString( pECB, "\r\n" );
  297.     WriteString( pECB, "<DD> " );
  298.  
  299.     nStart = 0;
  300.     nLen = lstrlen( lpszDef );
  301.     do {
  302.         nEnd = nStart + 70;
  303.         if ( nEnd >= nLen ) {
  304.             HtmlWriteText( pECB, &lpszDef[nStart] );
  305.             WriteString( pECB, "\r\n" );
  306.             break;
  307.         }
  308.         while ( nEnd > nStart )
  309.             if ( lpszDef[nEnd] == ' ' )
  310.                 break;
  311.  
  312.         if ( nEnd == nStart )
  313.             // too long!
  314.             nEnd = nStart + 70;
  315.  
  316.         // write defintion segment
  317.         tcHolder = lpszDef[nEnd];
  318.         lpszDef[nEnd] = 0;
  319.         HtmlWriteText( pECB, &lpszDef[nStart] );
  320.         WriteString( pECB, "\r\n" );
  321.         lpszDef[nEnd] = tcHolder;
  322.         nStart = nEnd;
  323.  
  324.         // skip excess whitespace
  325.         while ( lpszDef[nStart] == ' ' )
  326.             nStart++;
  327.  
  328.         // pretty formatting
  329.         if ( nStart < nLen )
  330.             WriteString( pECB, "     " );
  331.     } while ( nStart < nLen );
  332. }
  333.  
  334.  
  335. // For complex defintions
  336. void 
  337. HtmlBeginDefinitionTerm( 
  338.     IN EXTENSION_CONTROL_BLOCK * pECB 
  339. )
  340. {
  341.     WriteString( pECB, "<DT>" );
  342. }
  343.  
  344.  
  345. void 
  346. HtmlBeginDefinition( 
  347.     IN EXTENSION_CONTROL_BLOCK * pECB 
  348. )
  349. {
  350.     WriteString( pECB, "<DD>" );
  351. }
  352.  
  353.  
  354. //
  355. // Text formatting
  356. // 
  357.  
  358. void 
  359. HtmlBeginPreformattedText( 
  360.     IN EXTENSION_CONTROL_BLOCK * pECB 
  361. )
  362. {
  363.     WriteString( pECB, "<PRE>" );
  364. }
  365.  
  366.  
  367. void 
  368. HtmlEndPreformattedText( 
  369.     IN EXTENSION_CONTROL_BLOCK * pECB 
  370. )
  371. {
  372.     WriteString( pECB, "</PRE>" );
  373. }
  374.  
  375.  
  376. void 
  377. HtmlBeginBlockQuote( 
  378.     IN EXTENSION_CONTROL_BLOCK * pECB 
  379. )
  380. {
  381.     WriteString( pECB, "<BLOCKQUOTE>" );
  382. }
  383.  
  384.  
  385. void 
  386. HtmlEndBlockQuote( 
  387.     IN EXTENSION_CONTROL_BLOCK * pECB 
  388. )
  389. {
  390.     WriteString( pECB, "</BLOCKQUOTE>" );
  391. }
  392.  
  393.  
  394. void 
  395. HtmlBeginAddress( 
  396.     IN EXTENSION_CONTROL_BLOCK * pECB 
  397. )
  398. {
  399.     WriteString( pECB, "<ADDRESS>" );
  400. }
  401.  
  402.  
  403. void 
  404. HtmlEndAddress( 
  405.     IN EXTENSION_CONTROL_BLOCK * pECB 
  406. )
  407. {
  408.     WriteString( pECB, "</ADDRESS>" );
  409. }
  410.  
  411.  
  412. void 
  413. HtmlBeginDefine( 
  414.     IN EXTENSION_CONTROL_BLOCK * pECB 
  415. )
  416. {
  417.     WriteString( pECB, "<DFN>" );
  418. }
  419.  
  420.  
  421. void 
  422. HtmlEndDefine( 
  423.     IN EXTENSION_CONTROL_BLOCK * pECB 
  424. )
  425. {
  426.     WriteString( pECB, "</DFN>" );
  427. }
  428.  
  429.  
  430. void 
  431. HtmlBeginEmphasis( 
  432.     IN EXTENSION_CONTROL_BLOCK * pECB 
  433. )
  434. {
  435.     WriteString( pECB, "<EM>" );
  436. }
  437.  
  438.  
  439. void 
  440. HtmlEndEmphasis( 
  441.     IN EXTENSION_CONTROL_BLOCK * pECB 
  442. )
  443. {
  444.     WriteString( pECB, "</EM>" );
  445. }
  446.  
  447.  
  448. void 
  449. HtmlBeginCitation( 
  450.     IN EXTENSION_CONTROL_BLOCK * pECB 
  451. )
  452. {
  453.     WriteString( pECB, "<CITE>" );
  454. }
  455.  
  456.  
  457. void 
  458. HtmlEndCitation( 
  459.     IN EXTENSION_CONTROL_BLOCK * pECB 
  460. )
  461. {
  462.     WriteString( pECB, "</CITE>" );
  463. }
  464.  
  465.  
  466. void 
  467. HtmlBeginCode( 
  468.     IN EXTENSION_CONTROL_BLOCK * pECB 
  469. )
  470. {
  471.     WriteString( pECB, "<CODE>" );
  472. }
  473.  
  474.  
  475. void 
  476. HtmlEndCode( 
  477.     IN EXTENSION_CONTROL_BLOCK * pECB 
  478. )
  479. {
  480.     WriteString( pECB, "</CODE>" );
  481. }
  482.  
  483.  
  484. void 
  485. HtmlBeginKeyboard( 
  486.     IN EXTENSION_CONTROL_BLOCK * pECB 
  487. )
  488. {
  489.     WriteString( pECB, "<KBD>" );
  490. }
  491.  
  492.  
  493. void 
  494. HtmlEndKeyboard( 
  495.     IN EXTENSION_CONTROL_BLOCK * pECB 
  496. )
  497. {
  498.     WriteString( pECB, "</KBD>" );
  499. }
  500.  
  501.  
  502. void 
  503. HtmlBeginStatus( 
  504.     IN EXTENSION_CONTROL_BLOCK * pECB 
  505. )
  506. {
  507.     WriteString( pECB, "<SAMP>" );
  508. }
  509.  
  510.  
  511. void 
  512. HtmlEndStatus( 
  513.     IN EXTENSION_CONTROL_BLOCK * pECB 
  514. )
  515. {
  516.     WriteString( pECB, "</SAMP>" );
  517. }
  518.  
  519.  
  520. void 
  521. HtmlBeginStrong( 
  522.     IN EXTENSION_CONTROL_BLOCK * pECB 
  523. )
  524. {
  525.     WriteString( pECB, "<STRONG>" );
  526. }
  527.  
  528.  
  529. void 
  530. HtmlEndStrong( 
  531.     IN EXTENSION_CONTROL_BLOCK * pECB 
  532. )
  533. {
  534.     WriteString( pECB, "</STRONG>" );
  535. }
  536.  
  537.  
  538. void 
  539. HtmlBeginVariable( 
  540.     IN EXTENSION_CONTROL_BLOCK * pECB 
  541. )
  542. {
  543.     WriteString( pECB, "<VAR>" );
  544. }
  545.  
  546.  
  547. void 
  548. HtmlEndVariable( 
  549.     IN EXTENSION_CONTROL_BLOCK * pECB 
  550. )
  551. {
  552.     WriteString( pECB, "</VAR>" );
  553. }
  554.  
  555.  
  556. void 
  557. HtmlBold( 
  558.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  559.     IN LPCSTR lpszText
  560. )
  561. {
  562.     HtmlBeginBold( pECB );
  563.     HtmlWriteText( pECB, lpszText );
  564.     HtmlEndBold( pECB );
  565. }
  566.  
  567.  
  568. void 
  569. HtmlBeginBold( 
  570.     IN EXTENSION_CONTROL_BLOCK * pECB 
  571. )
  572. {
  573.     WriteString( pECB, "<B>" );
  574. }
  575.  
  576.  
  577. void 
  578. HtmlEndBold( 
  579.     IN EXTENSION_CONTROL_BLOCK * pECB 
  580. )
  581. {
  582.     WriteString( pECB, "</B>" );
  583. }
  584.  
  585.  
  586. void 
  587. HtmlItalic( 
  588.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  589.     IN LPCSTR lpszText
  590. )
  591. {
  592.     HtmlBeginItalic( pECB );
  593.     HtmlWriteText( pECB, lpszText );
  594.     HtmlEndItalic( pECB );
  595. }
  596.  
  597.  
  598. void 
  599. HtmlBeginItalic( 
  600.     IN EXTENSION_CONTROL_BLOCK * pECB 
  601. )
  602. {
  603.     WriteString( pECB, "<I>" );
  604. }
  605.  
  606.  
  607. void 
  608. HtmlEndItalic( 
  609.     IN EXTENSION_CONTROL_BLOCK * pECB 
  610. )
  611. {
  612.     WriteString( pECB, "</I>" );
  613. }
  614.  
  615.  
  616. void 
  617. HtmlFixed( 
  618.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  619.     IN LPCSTR lpszText
  620. )
  621. {
  622.     HtmlBeginFixed( pECB );
  623.     HtmlWriteText( pECB, lpszText );
  624.     HtmlEndFixed( pECB );
  625. }
  626.  
  627.  
  628. void 
  629. HtmlBeginFixed( 
  630.     IN EXTENSION_CONTROL_BLOCK * pECB 
  631. )
  632. {
  633.     WriteString( pECB, "<TT>" );
  634. }
  635.  
  636.  
  637. void 
  638. HtmlEndFixed( 
  639.     IN EXTENSION_CONTROL_BLOCK * pECB 
  640. )
  641. {
  642.     WriteString( pECB, "</TT>" );
  643. }
  644.  
  645.  
  646. void 
  647. HtmlLineBreak( 
  648.     IN EXTENSION_CONTROL_BLOCK * pECB 
  649. )
  650. {
  651.     WriteString( pECB, "<BR>\r\n" );
  652. }
  653.  
  654.  
  655. void 
  656. HtmlHorizontalRule( 
  657.     IN EXTENSION_CONTROL_BLOCK * pECB 
  658. )
  659. {
  660.     WriteString( pECB, "\r\n<HR>\r\n" );
  661. }
  662.  
  663.  
  664. void 
  665. HtmlImage( 
  666.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  667.     IN LPCSTR lpszPicFile,
  668.     IN LPCSTR lpszAltText
  669. )
  670. {
  671.     WriteString( pECB, "<IMG SRC = \"" );
  672.     HtmlWriteText( pECB, lpszPicFile );
  673.     WriteString( pECB, "\"" );
  674.     if ( lpszAltText ) {
  675.         WriteString( pECB, " ALT = \"" );
  676.         HtmlWriteText( pECB, lpszAltText );
  677.         WriteString( pECB, "\"" );
  678.     }
  679.     WriteString( pECB, ">\r\n" );
  680. }
  681.  
  682.  
  683. void 
  684. HtmlPrintf( 
  685.     IN EXTENSION_CONTROL_BLOCK * pECB, 
  686.     IN LPCSTR lpszFormat,
  687.     ...
  688. )
  689. {
  690.     char szBuf[8192];
  691.  
  692.     va_list list;
  693.  
  694.     va_start( list, lpszFormat );
  695.  
  696.     vsprintf( szBuf, lpszFormat, list );
  697.     WriteString( pECB, szBuf );
  698.  
  699.     va_end( list );
  700. }
  701.