home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / BBS / CDROMDOC.ZIP / CDROM.DOC next >
Text File  |  1994-10-04  |  32KB  |  939 lines

  1. original version 20 Aug 94
  2.  
  3. reversion <G> 4 Oct 94
  4.  
  5.  changes:  typos and grammar <sigh>
  6.        put in advice about very large files
  7.  
  8. CDROM by Dan Creagan 
  9. internet: dan.creagan@laka.com   
  10. BBS: 316-788-9392  
  11.  
  12.  
  13. Thus starts the documentation from hell:
  14.  
  15. READ THIS FILE.  I have not provided a working program.  I have
  16. only described how to do it and included some source to get you
  17. going.   This is a 'do-it-yourself' CDROM door! (once you do one, 
  18. you will be unlikely to go back to your old program... you will
  19. be very proud of your new creation!).  I have tried to explain 
  20. everything at least twice (different words) so you have a chance 
  21. to track it all.
  22.  
  23. If you want to see the following door/code at work (just to prove 
  24. it does work before you go any further) .. call my BBS at 316-788-9392.  
  25. This is not a gimmick to get new callers .. if you trust me that 
  26. the following works then press on.  If not, give the board a call 
  27. and check it out in operation  ( although I do like new callers .. I'm
  28. really a very friendly sysop <G>). I have made a special security level
  29. that will give you one week's access without needing to call back.
  30. ( I think you have to answer about 6 questions .. 3 of them are y/n )
  31.  
  32. Unless you have prepared your directories in advance ( as with 
  33. any CDROM door tool ), you will not be successful. Each CD is different. 
  34. You will be expected to deal with these differences by changing 
  35. the program you make for each CD.  (not hard .. after the first one
  36. is made, it only takes an hour or so to modify it so it will work on 
  37. another CD .. easier than most CD Doors).  A list of improvements will
  38. be a seperate config file for the door so you don't have to recompile
  39. each time.  (WAAaaay down the road .. in fact, you should do this
  40. since I probably won't EVER get to it).
  41.  
  42. It isn't hard, but you will have to understand the process 
  43. so you can make any changes... so study the following .. get a feel
  44. for it.. and code up your own door..
  45.  
  46. This file has source code but it has been hacked up a bit for 
  47. instructional purposes.. it is reasonably close to what I am using, 
  48. but I won't make any guarantees about typos. I have implemented a 
  49. better search algorithm on my operational door, but the one I show here
  50. is easier to explain (You start at the top and read lines until you
  51. find the file... it's called 'the brute force' method <G>)
  52.  
  53.  
  54. Assumptions you should *NOT* make about me:
  55.  
  56.    I am a programmer
  57.    I have spent many hours on this document
  58.    My code is bug free 
  59.    My code is structured or at least pretty
  60.    My code is efficient (ha!)
  61.  
  62. Assumptions you *should* make:
  63.  
  64.    You can do a better job than I have if you just read this
  65.       file and get started.
  66.    
  67.    My code works for me and has (or is) working on my BBS.
  68.    
  69.    This document and all supporting programs are free.
  70.  
  71.    You should read EVERY line of the source code and make changes
  72.       as necessary for your situation.
  73.    
  74.    The examples herein are made with good intentions (I want to
  75.       share what I have in the hopes others will contribute also)
  76.    
  77.    There is an element of Artificial Intelligence associated
  78.       with the program... if you use it and/or make it better the 
  79.       program figures it out and will lock up on you until you
  80.       share your experience/code with others.
  81.  
  82.  
  83. Opening Exposition:
  84.  
  85. The 'shareware author wannabes' are flooding the market.  With 
  86. WcCode, most utilities that folks are asking unreasonable prices 
  87. for are at your fingertips. Couple this with the announce- 
  88. ment by MSI that WcCode apps are not guaranteed upward or backward 
  89. compatible for any release.. This means you should ALWAYS have the 
  90. source code for your WcCode apps. If you want a new door .. build 
  91. it yourself! 
  92.  
  93. The following explains one of the doors that I am working on .. it is 
  94. not complete .. but it is very functional and has transferred many 
  95. megs of data to my users. It is but one example of a useful utility 
  96. that you can program if you want to spend a few hours learning WcCode
  97. and then spend a small amount of time *thinking* before you settle 
  98. in to coding your program (awfully condescending ain't I?).
  99.  
  100. Have you wanted to program your own CDROM doors and been hesitant to 
  101. start the process?  Have you got a CDROM door now and getting fed up
  102. with the poor support or expensive updates?  Well... Why don't you 
  103. use WcCode and make your own?  It's relatively simple (takes a couple 
  104. of evenings of programming) and you are then on your way.  In the 
  105. following paragraphs, I will explain my way of looking at CDROMs and
  106. how I implemented a door to read them.  You may choose to do the job
  107. differently for your own BBS, but if you do, let me know what you did.
  108. Let's share some information here!
  109.  
  110.  
  111. Checklist (All topics are covered in more detail later)
  112.  
  113. 1.  Make a directory for your CDROM door to reside in.
  114.  
  115. 2.  Copy all the PC Board directories from your CD ROM into the directory
  116.     you just made. Strip off any header information from the PC Board
  117.     files.
  118.  
  119. 3.  Make an allfiles.txt file (all file descriptions in one blob) by
  120.     getting it off the CD or by stacking a copy of all the PC Board 
  121.     directories together.
  122.  
  123. 4.  Make an alldirs.txt file that has all the pathnames to all the files
  124.     and the filenames.  A typical line would be:  
  125.     
  126.     e:\disc1\windows\zip4win.zip
  127.  
  128.     This may be on the CD... if not, then you must make it. (a Qbasic
  129.     program to do it is shown below).  Note that the drive letter is 
  130.     appended to the front of each line.  This should be the drive 
  131.     letter of YOUR CDROM.
  132.  
  133. 5.  Put the keyword/phrase search tool in the directory (included in this
  134.     package)
  135.  
  136. 6.  Make a work directory (c:\wildcat\wcwork\temp)
  137.  
  138. 7.  Put the 'search.bat' file .. in your Wildcat! directory. (included in
  139.     this package)
  140.  
  141. 8.  Put all the menus and '.BBS' files in the Wildcat directory (all
  142.     included in this package)
  143.  
  144. 9.  Compile a MODIFIED copy of the WcCode that is on here.
  145.  
  146. 10.  Make a WcCode test hook from your main menu so you can try the code.
  147.  
  148. 11.  Debug it.
  149.  
  150. 12.  Make a menu item for your users.
  151.  
  152. 13.  Sit back, have a brew, and pat yourself on the back.
  153.  
  154.  
  155.           OK... Now for the LONG Explanation
  156.  
  157. *******************************************
  158. STEP ONE  'look for the keys to the CDROM':
  159. *******************************************
  160.  
  161. Most CDROM doors have three capabilities.  Keyword search, Directory Browse
  162. and File Download.  We will arrange the CD directories so we can do these
  163. three things reasonably efficiently... sort of <G>.
  164.  
  165. Since all a CDROM door is, is a database management tool, then we should 
  166. look for the keys to the database.  The CDROM makers usually provide 
  167. several different styles, but I have found that the PC Board listings 
  168. are the easiest to manipulate and there is often a PC Board main menu
  169. that you can convert to your own main menu.
  170.  
  171. Look at the CD you want to bring on line.  The following code assumes
  172. that the CD has PC Board file descriptions.  PC Board file descriptions
  173. are easy to spot.  They all begin with DIR and end with a one or two
  174. digit number.  Sometimes, just to make programming hard, CDROM makers
  175. make ALL the PC Board file descriptions 4 or 5 digits long.  Like thus:
  176.  
  177.     directory 1 :  instructions  is in    DIR1 or DIR01
  178.     directory 99:  zmodem        is in    DIR99
  179.  
  180. If your CD DOESN'T have PC Board file listings, then you will have to
  181. make them from Wildcat files.bbs lists (or modify my code to do it your
  182. way).  
  183.  
  184. If your CD doesn't have PC Board file listings, and you choose to make 
  185. some, then I suggest you just use the files.bbs list that should be in
  186. each directory.  You must rename each one to the appropriate DIRxx.  
  187. Keep track of the order you assign the directories so you can make a 
  188. main menu and a path search tool (see below for these).
  189.  
  190. CAUTION:  Some directory listings will have 5 or 6 extra lines at the
  191. top that have header information... some directory listings DON'T.  You
  192. should strip all these extra lines off so that the only thing in the files
  193. are file descriptions.
  194.  
  195. **************************************************************************
  196. STEP TWO 'arrange the keys so they are useful for your program (3 parts)':
  197. **************************************************************************
  198.  
  199. Make a directory where all this stuff is going to reside.  You will need
  200. about a meg or so of space for each CD you do. Copy the PC Board dir files
  201. (DIR1 through DIRxx) into a subdirectory called DIRS.   This is a generic
  202. approach and in my example, you will only need this one directory.  There
  203. are cases (which I will explain after the example is done) where you may
  204. want to add more directories for clarity reasons.
  205.  
  206.                  root
  207.                   |
  208.               CDROM Directory
  209.                   |
  210.     ----------------------------------------------
  211.     |
  212.   DIRS
  213.  
  214.  
  215. Most CDROM doors have three capabilities.  Keyword search, Directory Browse
  216. and File Download.  We will arrange the CD directories so we can do these
  217. three things.  
  218.  
  219. First:  Keyword search.  The file descriptions (usually available in the
  220. allfiles.txt of the CD .. if not available, then just stack the DIRxx on
  221. top of one another to make one big file) can be single or multiple line.
  222. Your search tool must find a key word provided by the user in any line
  223. and then back up and print the whole description down to the next file
  224. description.  If you only have single line descriptions, then a search
  225. tool (like GREP) would be sufficient.  However, I immediately ran into
  226. the worse case when I started my program (the files descriptions were 
  227. sometimes 25 lines long).  So I wrote a C program that will search the
  228. file called 'ALLFILES.TXT' for keywords and write out all descriptions
  229. to the screen.  This program can be redirected to a data file for later
  230. viewing by the user.  The C code to do the job follows (I have included
  231. the compiled source in this package so if you don't have a C compiler
  232. you aren't screwed).
  233.  
  234. First program: Grep.exe  (sorry Unix geeks .. your Grep sucks for this
  235. job .. so I wrote my own):
  236.  
  237. This program will be called by a shell from your WcCode program.  It 
  238. expects a keyword or phrase as a command line parameter and it outputs 
  239. all file descriptions that have the keyword or phrase to the screen.  
  240. In use, the output is redirected to a data file.  You can test it with
  241. out calling it from WcCode. Just have an allfiles.txt list in the
  242. current directory,  invoke the program with:  grep <search string>. It
  243. ignores case.
  244.  
  245. #include <stdio.h>
  246. #include <string.h>
  247. char buffer[40][120]; /* 120 is a bit fat ....  guess I was paranoid when I made this <G> */
  248. char dummy[120];     /*  80 would probably be fine (but ya never know)  */
  249. char buffercount, buffercount2,tempcounter, tempcounter2;
  250.  
  251. main(int argc, char *argv[])
  252. {
  253.   FILE *fp;
  254.  
  255.   if (argc <= 1)
  256.     {
  257.      printf("\nError... you must supply a command line argument.");
  258.      printf("\nThis file reads 'ALLFILES.TXT' and searches for");
  259.      printf("\nall the occurances of the string you input on the CL.");
  260.      printf("\nIt is built to display all lines of a multiline file");
  261.      printf("\ndescription.");
  262.      return(1);
  263.     }
  264.   strupr(argv[1]);    /* convert keyword to upper case */
  265.   buffercount=0;      /* start counting number of lines read in */
  266.   fp=fopen("allfiles.txt","r");
  267.     if(!fp)
  268.       {
  269.     printf("\nError opening allfiles.txt.");
  270.     return(1);
  271.       }
  272.     while(fgets(buffer[buffercount], 119, fp) != NULL)    /* read through the whole file */
  273.       {
  274.     buffercount++;
  275.     if(buffercount>39)                    /* if a single file description is this long, there was a mistake */
  276.       {
  277.        printf("\n Exceeded array limits buffercount = %d",buffercount);
  278.        return(1);
  279.       }
  280.     if ((strstr(buffer[buffercount-1],"|")==NULL) && (buffercount!=1))   
  281.      {                                             /*  a bar '|' is a continuance line for file descriptions (seems 
  282.                     to be common for all file descriptions) .. if there is no
  283.                     bar and the first line was already read in, then we have a new
  284.                     description so we can check our buffer[] for keywords,
  285.                     print out the buffer if it has key words, and then reset
  286.                     the buffer and go back for more descriptions to look at */
  287.       buffercount2=buffercount;
  288.       for (tempcounter=0;tempcounter<(buffercount2-1);tempcounter++)
  289.         {
  290.           strcpy(dummy,buffer[tempcounter]);
  291.           strupr(dummy);                    /* this is awkward.  What we are doing is setting
  292.                              the buffer to uppercase for the search, but we
  293.                               are not disturbing the original data.  That way
  294.                              it looks prettier when we show the output to
  295.                              the user */
  296.           if (strstr(dummy,argv[1]))
  297.            {
  298.         for(tempcounter2=0;tempcounter2<(buffercount2-1);tempcounter2++)
  299.            printf("%s",buffer[tempcounter2]);
  300.         strcpy(buffer[0],buffer[buffercount2-1]);  /* after flushing, we put the last line read
  301.                             into the lowest postion in the buffer and
  302.                             start over again.  */
  303.         buffercount2=0;
  304.            }   /*end if*/
  305.  
  306.         } /*end for*/
  307.       strcpy(buffer[0],buffer[buffercount-1]);                /* see the above comment */
  308.       buffercount=1;
  309.     } /*end if*/
  310.       } /*end while*/
  311.  
  312.   return(0);
  313. }
  314.  
  315.  
  316. The above is why C is such a difficult language.  Even documented it is hard
  317. to understand what the hell is going on.
  318.  
  319. For use on the program I describe here, the output is redirected to a file
  320. called 'data.dat' in the CDROM directory on your hard disk.  It is then
  321. opened by the WcCode program and displayed to the user.
  322.  
  323.  grep mykeywordstring > data.dat
  324.  
  325. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  326.  
  327. There.  You've completed one of the hard parts.  (there are a couple more)
  328.  
  329. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  330.  
  331.  
  332. Second:  Directory Viewing/Browsing.  Most users like to Browse directories of 
  333. data to see if there are any kewl programs they can grab.  (I know I 
  334. do).  A CDROM door should let you do this.  In the easiest of worlds,
  335. the number of directories will not be huge and you can get all names on
  336. one screen (the big exception to this is SIMTEL which has 122 directories
  337. on one of its CDs).  For the example, we will use a CD that has a
  338. reasonable number of directories -- So Much Shareware 3 (25 dirs).  If you use
  339. the PC Board menu (it comes with most CDROMs) then you have a ready made tool
  340. for the user to select the directory they want to browse.  SMS 3 looks like
  341. this after I cleaned up the PC Board menu that came on the disk:
  342.  
  343.  
  344. @0E@@CLS@@0E@   @08@█@07@███████████████████████████████████████████████████████████████████████@0E@
  345. @0E@   @08@█@1E@                      @9A@ON LINE@1E@ So Much Shareware 3                     @07@█
  346.  @0E@  @08@█@1E@                                                                      @07@█@0E@
  347. @0E@   @08@█@1E@  1  Games & Entertainment           14  Pascal Programming           @07@█@0E@
  348. @0E@   @08@█@1E@  2  Educational & Learning          15  General Programming/Utils    @07@█@0E@
  349. @0E@   @08@█@1E@  3  SoundBlaster, Music, Demos      16  Printing, Laser, Fonts       @07@█@0E@
  350. @0E@   @08@█@1E@  4  MIDI Music & Utilities          17  Windows Printing/TrueType    @07@█@0E@
  351. @0E@   @08@█@1E@  5  Graphics, Drawing, Animation    18  Word Processing / Editors    @07@█@0E@
  352. @0E@   @08@█@1E@  6  Clipart & Desktop Publishing    19  Networking Utilities         @07@█@0E@
  353. @0E@   @08@█@1E@  7  Home Finance And Budget         20  Desktop Aids & Utilities     @07@█@0E@
  354. @0E@   @08@█@1E@  8  Financial And Business          21  General Utilities            @07@█@0E@
  355. @0E@   @08@█@1E@  9  General Interest                22  Windows Applications         @07@█@0E@
  356. @0E@   @08@█@1E@ 10  Hobby And Sports                23  Windows NT Applications      @07@█@0E@
  357. @0E@   @08@█@1E@ 11  DataBase And Information        24  OS/2 Applications / Utilites @07@█@0E@
  358. @0E@   @08@█@1E@ 12  C & Assembler Programming       25  Communications /BBS programs @07@█@0E@
  359. @0E@   @08@█@1E@ 13  Visual/QuickBasic Programming                                    @07@█
  360.  @0E@  @08@█@1E@                                                                      @07@█
  361.  @0E@  @08@█@1E@     (D)ownload, (C)hoose Directory, (S)earch, (H)elp, (Q)uit         @07@█
  362.  @0E@  @08@███████████████████████████████████████████████████████████████████████@07@█
  363.  
  364.  
  365. As you can see, the user can (C)hoose a Directory for viewing.  When the
  366. user does that, they are prompted for a directory number and the number
  367. is changed to a string, added to the word "DIR" and you have the filename
  368. of the directory you want to browse. In WcCode, it would look like
  369. this. 
  370.  
  371.  
  372. sub choosedir
  373.  
  374. ' this sub uses a global variable called cdrompath which is the
  375. ' path to your CDROM door directory
  376.  
  377. dim dirnum as integer
  378. dim path as string, temp as string
  379. dirnum=0
  380. print
  381. print
  382.  
  383. 'get a valid directory number .. this check changes with each CDROM you
  384. 'install (the number of directories is always different)
  385.  
  386. while ((dirnum<1) OR (dirnum>25))
  387.   locate 22,24
  388.   print"                                ";
  389.   locate 22,24
  390.   input"Enter Dir # (0=Quit) ";dirnum
  391.   if dirnum=0 then exit sub
  392. wend
  393. '
  394. 'convert the number to a string, trim it, and make it a PC Board
  395. 'directory listing filename
  396. '
  397. path=str(dirnum)
  398. ltrim(path)
  399. if len(path)=1 then path="0"+path
  400. path="dirs\dir"+path
  401. path=cdrompath+path
  402. cls
  403. '
  404. 'if it exists (and it should if you've done your homework) then open
  405. 'it and view it.  MorePrompt is On.  You could insert code here to
  406. 'stop or download after each screen is shown (a mod I have done to
  407. 'other versions of this door).
  408. '
  409.  
  410. if exists(path) then
  411.   open path for input as 1
  412.   while not eof(1)
  413.     input #1,temp
  414.     print temp
  415.   wend
  416.   close
  417.   waitenter
  418. else
  419.   print"path not found..."
  420.   waitenter
  421. end if
  422. end sub
  423.  
  424.  
  425. Third:  Downloading (yesss!!)
  426.  
  427. When the user presses 'D' at the menu prompt (see menu above), a screen
  428. is offered  for them to enter the filename to download.  A few simple
  429. checks are made to ensure it is a proper file, and then a search is made
  430. for the filename.  You must prepare the directory you have made with a 
  431. list of all the filenames and their paths to the CDROM that you have 
  432. mounted.  NOTE: the drive letter of the CDROM should be tacked to the head 
  433. of each path/filename!! This is usually easy enough to do...just takes some 
  434. thought and a few lines of Quickbasic to make the file.  Sometimes the
  435. file is already available on the CDROM. (be sure to look for it before
  436. you make it... saves time <G>). If it is there, then you must put the drive 
  437. letter of your CD on the front of each line! If you have a list of directory 
  438. paths that are in order (but no filenames associated with them), you can 
  439. simply make a Basic program that reads in a directory path, attaches it 
  440. to each filename in the allfiles list, and prints it to a file called 
  441. ALLDIRS.DAT.
  442.  
  443.  
  444. Again:
  445.  
  446. You have a file (called dirs.txt) of all the directory paths that looks 
  447. like this:
  448.  
  449. \disc1\windows
  450. \disc1\progming
  451. \disc1\catjuglg
  452. <etc>
  453.  
  454. This file is usually on CDROMs... but not always.  If it isn't, then you
  455. will have to make it if you use the system I'm about to describe.
  456.  
  457. If your DIRxx files are in the same order as the above listing (ie: DIR01
  458. files are all in \disc1\windows) then the following program will work:
  459.  
  460. ' This is a QBASIC! program
  461. '
  462. ' expects DIRS.TXT and all the DIRX files for PCB BBS
  463. ' DIRS.TXT has all the pathnames to the directories in it
  464. ' makes one list of all files with pathname set before them
  465. ' with SMS3 the directory names are all 4 digits long
  466. '
  467. OPEN "alldirs.txt" FOR OUTPUT AS 2
  468. OPEN "dirs.txt" FOR INPUT AS 3
  469. drive$ = "E:"  :' drive that your CDROM is on
  470. FOR x = 1 TO 25
  471.   
  472.    'create the logical directory name that corresponds to the first
  473.    'path in the dirs.txt list.
  474.    '
  475.   temp$ = LTRIM$(STR$(x))
  476.   IF LEN(temp$) < 2 THEN temp$ = "0" + temp$
  477.   filename$ = "DIR" + temp$
  478.   '  
  479.    'open it and read in all the filenames
  480.    'trim them, if they are valid, then make an
  481.    'entry in the alldirs.txt file of the filename with the
  482.    'path attached to it
  483.    '
  484.   
  485.   OPEN filename$ FOR INPUT AS 1
  486.   LINE INPUT #3, path$
  487.   path$ = LTRIM$(path$)
  488.   path$ = RTRIM$(path$)
  489.   
  490.   WHILE NOT EOF(1) 
  491.     LINE INPUT #1, a$
  492.     a$ = LEFT$(a$, 12)
  493.     IF LEFT$(a$, 2) = "  " THEN GOTO 20
  494.     a$ = LTRIM$(a$)
  495.     IF LEN(a$) < 4 THEN GOTO 20
  496.     PRINT #2, drive$ + path$ + "\" + a$
  497. 20  
  498.   wend
  499.   close 1
  500. NEXT x
  501.  
  502. This produces a file of all the filenames with the path to the CDROM
  503. attached to their front.  (if you use this as is, be sure to modify
  504. it for your CDROM path).  How do you like all them GOTOs Mr. Wirth? <G>
  505.  
  506. After you run it, check the alldirs.txt in a few places to make sure
  507. you have aligned the right directories with the right filenames.
  508.  
  509. You have now prepared your work area and are ready to write the 
  510. WcCode to make your CDROM door.
  511.  
  512.  
  513. ****************************************************
  514. STEP THREE: Have a beer .. relax...  Make the WcCode
  515. ****************************************************
  516.  
  517. For the most part, the following code is reusable for all your CD
  518. ROM installations.  You will have to tweak the paths and some of the
  519. other aspects of it, but it isn't long so the job isn't hard.  It 
  520. takes me less time to set this up on a new CD than it takes to do
  521. one for my 'mature' CDROM door that I paid hard cash for.
  522.  
  523.  
  524. YOU MUST MAKE A TEMP DIRECTORY UNDER WCWORK on YOUR BBS for this 
  525. part to work!!!  (or else change it so the program doesn't look there
  526. for the files it grabs off the CDs)
  527.  
  528. You must do this:
  529.  
  530. cd \wildcat\wcwork
  531. md temp
  532.  
  533. then you should be about ready to use this:
  534.  
  535.  
  536.  
  537.  
  538. '
  539. 'This program has three main subroutines. They are choosedir, search, 
  540. 'and downloadfile.  All the rest of the subs are just support programs
  541. 'for these three main subs
  542. '
  543. cls
  544. dim filename as string
  545. dim answer as string
  546. dim x as integer, y as integer
  547. dim cdrompath as string
  548. dim dummy2 as string
  549.  
  550. 'YOU MUST SET THE FOLLOWING PATH ON YOUR MACHINE!!
  551. 'THE TRAILING BACKSLASH IS IMPORTANT WITH MY EXAMPLE!!!
  552. '
  553.  
  554. cdrompath="u:\bbsfiles\sms3\"
  555.  
  556. declare sub downloadfile
  557.  
  558.  
  559. sub audittrail
  560.  
  561. 'This sub opens an audit trail (duh!) and appends whatever is in string
  562. 'DUMMY2 to the current user's name along with date and time.  This is
  563. 'useful for debug, for tracking pests, for building a file to check
  564. 'for duplicate phone numbers (CBV only), and for just seeing what the
  565. 'door is doing for you.  Since WcCode app selection is not recorded in
  566. 'the Activity log, this replaces that void .. plus a little.  I realize 
  567. 'there is an update utility in WcCode for the activity log.  But I use this 
  568. 'technique with the other half dozen or so utilities I have made and 
  569. 'I use the same log file for all of them.  I can make it as verbose as I
  570. 'like and kill it each day (I don't kill the activity logs daily ). The 
  571. 'morning log file is almost as good reading as the message base!
  572.  
  573. rem if user.seclevel="SYSOP" then exit sub :'take off this rem after debug
  574.  
  575. Const DateMask = "mm/dd/yyyy"
  576. Const TimeMask = "hh:mm:ss"
  577. Dim today as date
  578. dim timenow as time
  579. currentdate(today)
  580. currenttime(timenow)
  581. open "wclog.dat" for append as 1
  582. print #1,user.name ;dummy2;" at "formattime(timenow,timemask)" on "formatdate(today,datemask)
  583. close
  584.  
  585. end sub
  586.  
  587. sub readfile
  588. '
  589. 'generic screen reader ..
  590. '
  591. 'reads in the menu screens and the prompt screens (download prompt, 
  592. 'search prompt.  It expects the global variable 'filename' to be
  593. 'initialized
  594. '
  595. dim temp as string
  596.   MorePrompt Off
  597. open filename for input as 1
  598. readfile1:
  599. while not eof(1)
  600.   input #1, temp
  601.   print temp
  602. wend
  603. close
  604. end sub
  605.  
  606. '**************************************
  607. '  Main Sub #1  'DOWNLOADFILE'
  608. '**************************************
  609.  
  610.  
  611. sub downloadfile
  612. '
  613. 'sends file to user
  614. 'uses global variable  "cdrompath" initialized to the cdrom path
  615. '
  616. dim temp as string
  617. dim tempfilename as string
  618. dim counter as integer
  619. dim pdone as integer
  620. dim dummy as string
  621.  
  622. down1:
  623. filename="down.bbs":' included with this package.. it's just a small screen
  624. readfile
  625. temp=""
  626. locate 12,26
  627. input temp
  628. cls
  629. temp=ucase(temp)
  630. if temp="Q" then exit sub
  631. if len(temp)<5 then
  632.   locate 12,6
  633.   print"Invalid filename"
  634.   waitenter
  635.   goto down1
  636. end if
  637.  
  638. locate 12,6
  639. print"Standby ... searching for file (takes up to 1 minute)"
  640. locate 13,6
  641. print"Percent of filenames searched = 00";
  642. counter=1
  643. pdone = 0
  644. open cdrompath+"dirs\alldirs.txt" for input as 1
  645. while (not eof(1))
  646.   input #1, tempfilename
  647.   counter=counter+1
  648. '  
  649. ' while searching it is nice to update the screen so the user doesn't
  650. ' become antsy.
  651. '
  652.   if counter=450 then
  653.      counter=1
  654.      pdone=pdone+10
  655.      locate 13,6
  656. '     
  657. 'the following is not really a percent .. just an estimate
  658. '
  659.      print "Percent of filenames searched = ";pdone;
  660.   end if
  661. '  
  662. 'if file found, then verify it (this may not be necessary)
  663. '
  664.   if instr(tempfilename,temp)>0 then
  665.       cls
  666.       locate 12,6
  667.       print tempfilename;
  668.       if inputYesNo(" <---- Is this your file (y/n) ? ") then
  669.      locate 13,6
  670.      close
  671. '
  672. ' and send it ... 
  673. '        locate 13,6
  674.      print"Standby .. fetching from CD .. don't hit any keys"
  675.      open"temp.bat" for output as 1
  676.      print #1,"copy "+tempfilename+" u:\wildcat\wcwork\temp"
  677.      close
  678.      
  679. '         
  680. '  I have found some very large files don't like the shell to copy them
  681. '  from the CD.  In that case, you will have to check to see how big 
  682. '  the file is and tell the user to request it offline if it is over say
  683. '  700k
  684. '
  685.      open tempfilename for input as 1
  686.      if lof(1) > 700000 then
  687.         close
  688.         print"File too large for copy buffer. Please request from"
  689.         print"Sysop as an offline program."
  690.         dummy2=" file too big to transfer "+tempfilename+" "
  691.         audittrail
  692.         exit sub
  693.      end if
  694.      close
  695.      shell "temp.bat"
  696.      pushcommand "Y"
  697.      if sendfile("u:\wildcat\wcwork\temp\"+temp) then
  698.         print"success.."
  699.         waitenter
  700.       else
  701.         print"download failure...."
  702.      end if
  703.      exit sub
  704.       end if
  705.    end if
  706.  wend
  707.  close
  708. end sub
  709.  
  710. '************************************
  711. '  Main sub #2  CHOOSEDIR
  712. '************************************
  713.  
  714. sub choosedir
  715. '
  716. 'Choose a directory to view.  This is the basic routine. It should be
  717. 'modified so that when a screen is shown, the user can choose to 
  718. 'quit , continue, or download  (modify it after you get it working<G>)
  719. '
  720. 'it uses the global variable cdrompath (which is the path to your 
  721. ' cdrom info on your hard drive)
  722. '
  723.  
  724.  
  725. dim dirnum as integer
  726. dim path as string, temp as string
  727. dirnum=0
  728. print
  729. print
  730. while ((dirnum<1) OR (dirnum>25))
  731.   locate 22,24
  732.   print"                                ";
  733.   locate 22,24
  734.   input"Enter Dir # (0=Quit) ";dirnum
  735.   if dirnum=0 then exit sub
  736. wend
  737.  
  738. path=str(dirnum)
  739. ltrim(path)
  740.  
  741. '
  742. 'expects the DIRXX files to all be 4 digits long. (DIR01, DIR02, DIR99)
  743. 'if they are variable (DIR1, DIR2, DIR99) then take off the next line
  744. '
  745.  
  746. if len(path)=1 then path="0"+path
  747. path="dirs\dir"+path
  748. path=cdrompath+path
  749. cls
  750. '
  751. 'if you change this so you keep track of the screens (and not rely
  752. 'on the '(S)top (C)ontinue etc of the board) then enter
  753. 'MorePrompt Off .. so the board won't hack up your screen reads
  754. '
  755.  
  756. if exists(path) then
  757.   open path for input as 1
  758.   while not eof(1)
  759.     input #1,temp
  760.     print temp
  761.   wend
  762.   close
  763.   waitenter
  764. else
  765.   print"path not found..."
  766.   waitenter
  767. end if
  768. end sub
  769.  
  770. '**********************************************
  771. ' Main sub #3  SEARCH
  772. '**********************************************
  773.  
  774. sub search
  775.  
  776. dim temp as string
  777. dim templine as string,templine2 as string
  778. dim x1 as integer
  779. dim counter as integer
  780. '
  781. 'uses global variable cdrompath
  782. '
  783.  
  784. x1=1
  785. search1:
  786.  
  787. filename="search.bbs"  :'generic and simple menu screen that asks for
  788.                :'keyword for search (included in this package)
  789. readfile
  790.  
  791. temp=""
  792. locate 12,26
  793. input temp
  794. cls
  795. temp=ucase(temp)
  796. if temp="Q" then exit sub
  797. if len(temp)<3 then
  798.   locate 12,6
  799.   print"Please search for strings longer than 2 letters"
  800.   waitenter
  801.   goto search1
  802. end if
  803. locate 13,6
  804. print"Don't touch any keys! I'll be right back!"
  805.  
  806. shell "u:\wildcat\search.bat "+cdrompath+"dirs "+temp
  807. cls
  808.  
  809. ' the following prints out the hits that the GREP utility (which was 
  810. ' implemented by the batch file above) has found.  The reason it is
  811. ' so complicated is that it highlights the string when it finds it
  812. ' in any of the text lines.
  813.  
  814. open cdrompath+"dirs\data.dat" for input as 1
  815.    counter=1
  816.    while (not eof(1))
  817.     input #1,templine
  818.     templine2=templine
  819.     templine2=ucase(templine)
  820.     if(instr(templine2,temp)>1) then
  821.        print "@0F@"+left(templine,instr(templine2,temp)-1);
  822.      end if
  823.     if (instr(templine2,temp)<>0) then
  824.        print "@0E@"temp"@0F@";
  825.        print right(templine,len(templine)-((instr(templine2,temp)+len(temp)-1)))
  826.     else
  827.        print templine
  828.     end if
  829.     MorePrompt Off
  830.     counter=counter+1
  831.     if counter>19 then
  832.       counter=1
  833.       print
  834.       input"@0E@Press <Enter> for more, Q for quit, D for download ";templine
  835.       print
  836.       print
  837.       templine=ucase(templine)
  838.       if templine="Q" then
  839.         close
  840.         exit sub
  841.       end if
  842.       if templine="D" then
  843.          close
  844.          downloadfile
  845.          exit sub
  846.       end if
  847.     end if
  848.    wend
  849.  
  850. close
  851. print"End of search"
  852. waitenter
  853. exit sub
  854.  
  855. end sub
  856.  
  857. '***********************************************
  858. ' OPENMAINMENU  (where all the choices are made)
  859. '***********************************************
  860.  
  861. sub OpenMainMenu
  862. '
  863. 'here's where we open the main cdrom menu and ask for choices
  864. '
  865. dim choice as string
  866.  
  867.  
  868. choice=""
  869. while(choice<>"Q")
  870.  filename = "mainsms3.bbs" :'example included in this package
  871.  readfile
  872.  locate 22,24
  873.  print"Enter a choice (D,C,S,Q,H) ";
  874.  choice=""
  875.    while(choice="")
  876.      choice=inkey()
  877.    wend
  878.  choice=ucase(choice)
  879.  if choice="D" then downloadfile
  880.  if choice="C" then choosedir
  881.  if choice="S" then search
  882.  if choice="H" then
  883.    filename="CDHELP.BBS"  :'example included in this package
  884.    readfile
  885.    waitenter
  886.  end if
  887. wend
  888.  
  889.  
  890. end sub
  891. '
  892. '   **********************  BEGIN MAIN PROGRAM HERE  *********************
  893. '
  894. '
  895. 'Opening screens and help
  896. '
  897. answer=""
  898. dummy2=" entered CDROM5 door "
  899. audittrail
  900. OpenMainMenu
  901. dummy2=" exited CDROM5 door "
  902. audittrail
  903. end
  904.  
  905. *********************************************************************
  906. End of WcCode
  907. *********************************************************************
  908.  
  909. Well, that was it.  This will work if you read through it and
  910. try to understand what's happening.  Understand it before you 
  911. program it and you'll be ok.
  912.  
  913. Improvements:
  914.  
  915. The search routine for the filename to download is very slow.  I have
  916. since speeded it up by sorting the alldirs.txt file and using a better
  917. algorithm (besides just a brute force one).  It is a bit more complicated
  918. than what I wanted to tackle with this first cut at showing how to 
  919. build the door.  I'll send it over as an update if anyone wants to see
  920. how.
  921.  
  922. A problem that I have often run into is that some CDs just have too 
  923. many directories.  In cases like this, you will have to get creative 
  924. with your code and program modifications to the main menu.  In one case,
  925. I made 'combined DIR files' that had the menus from several directories
  926. in one combined directory (like all APPSUTILS or WINDOWS).  When the
  927. user selected that directory, he was really looking at several at one
  928. time. If you dial my board, you can see this in effect on two CDs. One,
  929. the Night OWL 12 CD has the combined directories.  The SIMTEL2 CD does
  930. not.  See which you would prefer to do. 
  931.  
  932. All kinds of improvements to this are possible.  Don't be alarmed at
  933. the length of this.  It is really easy to do once you start.  If I were
  934. you, I wouldn't even use this code... I'ld build my own... heck.. that's
  935. why we all got WcCode in the first place.  What independence this thing
  936. gives us!
  937.  
  938.  
  939.