home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 May / PCO_5_97.ISO / FilesBBS / OS2 / WEBEXADD.ARJ / WEBEXADD / WEBEXADD.ZIP / webexadd.cmd
Encoding:
Text File  |  1996-04-18  |  9.2 KB  |  276 lines

  1. /* WEBEXADD.CMD by William J. Hinkle CIS [75300,2050]                       */
  2. /* This is freeware, ok to use and redistribute, but keep my header please! */
  3. /*
  4.    This Rexx script adds a new external viewer type to
  5.    IBM WebExplorer v1.0X
  6.    Just run it from an OS/2 command line or a desktop program object:
  7.    WEBEXADD mimeapp extension appfile params
  8.  
  9.    for example, to add Adobe Acrobat support:
  10.    WEBEXADD application/pdf pdf C:\ACROREAD\ACROREAD.EXE
  11. */
  12. SIGNAL ON HALT
  13.  
  14. /* get the command-line (or passed) arguments */
  15. PARSE ARG mimetype extension appfile appparams
  16. IF (mimetype = "") | (extension = "") THEN DO
  17.     SAY "Usage:"
  18.     SAY
  19.     SAY "WEBEXADD mimetype extensions [appfile [parameters...]]"
  20.     SAY "Notes:   mimetype is in the form name/type.  Example: application/fu"
  21.     SAY "         extensions can be a comma-delimited list. Example: fu,bar"
  22.     SAY "         appfile and parameters are optional"
  23.     SAY "         If no appfile, then extensions are defined for existing mimetype"
  24.     RETURN 1
  25. END
  26. IF (appfile <> "") THEN DO
  27.     IF STREAM(appfile,"C","QUERY EXISTS") = "" THEN DO
  28.         CALL BEEP 440,50
  29.         SAY
  30.         SAY "Warning! The viewer file" appfile "doesn't seem to exist!"
  31.         SAY
  32.     END
  33. END
  34. /* add necessary %s parameter if not mentioned */
  35. IF POS("%s",appparams) = 0 THEN appparams = appparams "%s"
  36. /* break up extension list into words */
  37. extension = TRANSLATE(extension,"  ",",;")
  38.  
  39. etcdefault = "C:\TCPIP\ETC\"
  40. etcpath = VALUE("ETC",,"OS2ENVIRONMENT")
  41. inifname = "EXPLORE.INI"
  42. inibname = "EXPLORE.IBK"
  43. iniok = ""
  44. DO UNTIL iniok = "READY:"
  45.     IF iniok <> "" THEN DO
  46.         SAY inifqpname "could not be found!"
  47.         SAY "Please enter the drive:directory to the" inifname "file:"
  48.         SAY "Just [Enter] for" etcdefault "or [Ctrl+C][Enter] to quit: ";
  49.         SAY
  50.         PARSE PULL etcpath
  51.         SAY
  52.         etcpath = STRIP(etcpath,"B")
  53.     END
  54.     IF etcpath = "" THEN
  55.         etcpath = etcdefault
  56.     ELSE DO
  57.         IF RIGHT(etcpath,1) <> "\" AND RIGHT(etcpath,1) <> ":" THEN DO
  58.             etcpath = etcpath || "\"
  59.         END
  60.     END
  61.     inifqpname = etcpath || inifname
  62.     iniok = STREAM(inifqpname,"C","OPEN READ")
  63. END
  64.  
  65. /* scan for the [advanced] section of the INI file */
  66. prelines = 0
  67. DO WHILE CHARS(inifqpname) > 0
  68.     strdat = LINEIN(inifqpname)
  69.     prelines = prelines + 1
  70.     IF TRANSLATE(WORD(strdat,1)) = "[ADVANCED]" THEN LEAVE
  71. END
  72. IF CHARS(inifqpname) <= 0 THEN DO
  73.     SAY "The" inifname" file doesn't seem to be in the expected format."
  74.     RETURN 2
  75. END
  76. /* capture all lines of [advanced] section */
  77. advanced.0 = 0
  78. trailblanks = 0
  79. midlines = 0
  80. DO WHILE CHARS(inifqpname) > 0
  81.     strdat = STRIP(LINEIN(inifqpname),"B")
  82.     IF LEFT(strdat,1) = "[" THEN LEAVE
  83.     advanced.0 = advanced.0 + 1
  84.     ix = advanced.0
  85.     advanced.ix = strdat
  86.     IF strdat = "" THEN trailblanks = trailblanks + 1
  87.     ELSE trailblanks = 0
  88.     midlines = midlines + 1
  89. END
  90. IF trailblanks > 0 THEN advanced.0 = advanced.0 - trailblanks
  91.  
  92. /* find the mailcap and extmap lines, if any */
  93. mailcap.advix = 0
  94. extmap.advix = 0
  95. DO ix = 1 TO advanced.0
  96.  /* skip blank and comment lines */
  97.  IF (advanced.ix = "") | LEFT(advanced.ix,1) == ";" THEN ITERATE
  98.  PARSE VAR advanced.ix varname "=" varvalue
  99.  varname = TRANSLATE(varname)
  100.  IF varname = "MAILCAP" THEN DO
  101.     mailcap.advix = ix
  102.     mailcap.fname = varvalue
  103.  END
  104.  ELSE IF varname = "EXTMAP" THEN DO
  105.     extmap.advix = ix
  106.     extmap.fname = varvalue
  107.  END
  108. END
  109.  
  110. mailcap.ok = ""
  111. mailcap.opened = 0
  112. mailcap.newfile = 0
  113. /* check for mailcap reference, generate one if none yet */
  114. IF (mailcap.advix = 0) | (mailcap.fname = "") THEN DO
  115.     mailcap.fname = etcpath || "EXPLORE.CAP"
  116.     mailcap.newfile = 1
  117. END
  118. /* open mailcap file if possible */
  119. mailcap.ok = STREAM(mailcap.fname,"C","OPEN"/*read & write*/)
  120. IF mailcap.ok = "READY:" THEN mailcap.opened = 1
  121. ELSE SAY mailcap.fname "(mailcap= in" inifname || ") won't open:" mailcap.ok
  122.  
  123. extmap.ok = ""
  124. extmap.opened = 0
  125. extmap.newfile = 0
  126. /* check for extmap reference, generate one if none yet */
  127. IF (extmap.advix = 0) | (extmap.fname = "") THEN DO
  128.     extmap.fname = etcpath || "EXPLORE.EXT"
  129.     extmap.newfile = 1
  130. END
  131. /* open extmap file if possible */
  132. extmap.ok = STREAM(extmap.fname,"C","OPEN"/*read & write*/)
  133. IF extmap.ok = "READY:" THEN extmap.opened = 1
  134. ELSE SAY extmap.fname "(extmap= in" inifname || ") won't open:" extmap.ok
  135.  
  136. IF (mailcap.ok = "READY:") & (extmap.ok = "READY:") THEN DO
  137.     /* first check for existing definition of this mimetype */
  138.     /* note that we don't handle \-terminated extended lines. Tough! */
  139.     DO WHILE CHARS(mailcap.fname) > 0
  140.         strdat = STRIP(LINEIN(mailcap.fname),"B")
  141.         IF LEFT(strdat,1) == "#" THEN ITERATE    /* skip comments */
  142.         IF TRANSLATE(WORD(strdat,1)) = (TRANSLATE(mimetype) || ";") THEN DO
  143.             IF (appfile <> "") & (TRANSLATE(WORD(strdat,2)) <> TRANSLATE(appfile)) ,
  144.             THEN SAY "Warning!   '" || WORD(strdat,2) || "' is already defined for '" || mimetype || "'"
  145.             ELSE SAY "No update: '" || WORD(strdat,2) || "' is already defined for '" || mimetype || "'"
  146.                  SAY "        in " mailcap.fname ||"."
  147.             mailcap.ok = "DEFINED:"
  148.             LEAVE
  149.         END
  150.     END
  151.     /* now check for existing definition of these extensions */
  152.     /* note that we don't handle \-terminated extended lines. Tough! */
  153.     DO WHILE CHARS(extmap.fname) > 0
  154.         strdat = STRIP(LINEIN(extmap.fname),"B")
  155.         IF LEFT(strdat,1) == "#" THEN ITERATE    /* skip comments */
  156.         ix = WORDS(strdat)
  157.         DO WHILE ix > 1
  158.             DO eix = 1 TO WORDS(extension)
  159.                 thisext = WORD(extension,eix)
  160.                 IF TRANSLATE(WORD(strdat,ix)) = TRANSLATE(thisext) THEN DO
  161.                     IF (TRANSLATE(WORD(strdat,1)) <> TRANSLATE(mimetype)) ,
  162.                     THEN SAY "Warning!   '" || WORD(strdat,1) || "' is already defined for '" || thisext || "'"
  163.                     ELSE SAY "No update: '" || WORD(strdat,1) || "' is already defined for '" || thisext || "'"
  164.                          SAY "        in " extmap.fname ||"."
  165.                     extension = DELWORD(extension,eix,1)
  166.                     eix = eix - 1
  167.                 END
  168.             END
  169.             ix = ix - 1
  170.         END
  171.         IF WORDS(extension) = 0 THEN LEAVE
  172.     END
  173.     IF WORDS(extension) = 0 THEN extmap.ok = "DEFINED:"
  174. END
  175.  
  176. /* write the new definition for mimetype */
  177. IF (mailcap.ok = "READY:") & (appfile <> "") THEN DO
  178.     mailcap.ok = STREAM(mailcap.fname,"C","SEEK < 0")
  179.     if (mailcap.ok = "") | (DATATYPE(mailcap.ok) = "NUM") THEN DO
  180.         mailcap.ok = "DEFINED:"
  181.         IF LINEOUT(mailcap.fname, mimetype || ";" appfile appparams) > 0 THEN mailcap.ok = ""
  182.     END
  183.     IF mailcap.ok <> "DEFINED:" THEN SAY "Can't write to" mailcap.fname
  184.     ELSE SAY "Defined '" || mimetype || "' in the" mailcap.fname "file."
  185. END
  186.  
  187. /* write the new definition extension */
  188. IF extmap.ok = "READY:" THEN DO
  189.     extension = STRIP(extension,"B")
  190.     IF mailcap.ok = "DEFINED:" THEN DO
  191.         extmap.ok = STREAM(extmap.fname,"C","SEEK < 0")
  192.         if (extmap.ok = "") | (DATATYPE(extmap.ok) = "NUM") THEN DO
  193.             extmap.ok = "DEFINED:"
  194.             IF LINEOUT(extmap.fname, mimetype extension) > 0 THEN extmap.ok = ""
  195.         END
  196.         IF extmap.ok <> "DEFINED:" THEN SAY "Can't write to" extmap.fname
  197.         ELSE SAY "Defined '" || extension || "' in the" extmap.fname "file."
  198.     END
  199.     ELSE SAY "Can't define '" || extension || "' with '" || mimetype || "' undefined in" mailcap.fname || "."
  200. END
  201.  
  202. /* now write the file info, if needed, to the INI file */
  203. IF mailcap.newfile | extmap.newfile THEN DO
  204.     SAY "Updating the" inifname "file..."
  205.  
  206.     ix = mailcap.advix
  207.     IF ix = 0 THEN DO    /* we must add a MAILCAP line */
  208.         ix = advanced.0 + 1
  209.         advanced.0 = ix
  210.     END
  211.     advanced.ix = "mailcap=" || mailcap.fname
  212.  
  213.     ix = extmap.advix
  214.     IF ix = 0 THEN DO    /* we must add an EXTMAP line */
  215.         ix = advanced.0 + 1
  216.         advanced.0 = ix
  217.     END
  218.     advanced.ix = "extmap=" || extmap.fname
  219.  
  220.     /* preserve the current INI file as a backup */
  221.     inibackup = etcpath || inibname
  222.     ADDRESS "CMD" "@COPY" inifqpname inibackup ">nul"
  223.     IF RC > 0 THEN SAY "Can't back up" inifname ", so I give up..."
  224.     ELSE DO    /* close and re-open input file, now backup */
  225.         CALL STREAM inifqpname,"C","CLOSE"
  226.         IF STREAM(inibackup,"C","OPEN READ") = "READY:" THEN DO
  227.             /* kill off original file */
  228.             ADDRESS "CMD" "@ERASE" inifqpname ">nul"
  229.             IF RC > 0 THEN SIGNAL noiniup
  230.  
  231.             IF STREAM(inifqpname,"C","OPEN WRITE") = "READY:" THEN DO
  232.                 /* copy first part of EXPLORE.INI */
  233.                 DO ix = 1 to prelines
  234.                     strdat = LINEIN(inibackup)
  235.                     IF LINEOUT(inifqpname,strdat) > 0 THEN SIGNAL noiniup
  236.                 END
  237.                 /* write new advanced section */
  238.                 DO ix = 1 to advanced.0
  239.                     IF LINEOUT(inifqpname,advanced.ix) > 0 THEN SIGNAL noiniup
  240.                 END
  241.                 CALL LINEOUT inifqpname, ""    /* tack on a blank line */
  242.                 /* wind past old advanced section */
  243.                 DO ix = 1 to midlines
  244.                     call LINEIN(inibackup)
  245.                 END
  246.                 /* copy last part of EXPLORE.INI */
  247.                 DO WHILE CHARS(inibackup) > 0
  248.                     strdat = LINEIN(inibackup)
  249.                     IF LINEOUT(inifqpname,strdat) > 0 THEN SIGNAL noiniup
  250.                 END
  251.  
  252.                 SAY "Update of the" inifname "file was successful!"
  253.             END
  254.             ELSE SIGNAL noiniup
  255.         END
  256.         ELSE SIGNAL noiniup
  257.     END
  258. END
  259.  
  260. noiniup:
  261. CALL STREAM inifqpname,"C","CLOSE"
  262. IF DATATYPE(SIGL) = "NUM" THEN DO
  263.     SAY "Error at " SIGL "while updating the" inifname "file! Restoring from backup..."
  264.     ADDRESS "CMD" "@COPY" inibackup inifqpname ">nul"
  265. END
  266.  
  267. /* close all files */
  268. IF mailcap.opened THEN CALL STREAM mailcap.fname,"C","CLOSE"
  269. IF extmap.opened  THEN CALL STREAM  extmap.fname,"C","CLOSE"
  270.  
  271. IF (mailcap.advix > 0) & (extmap.advix > 0) THEN RETURN 0
  272. ELSE RETURN 2
  273.  
  274. HALT:
  275. EXIT 1
  276.