ODTJ9402.TXT 85 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244
  1. ÚÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¿
  2. ³ Ü Ü Ü ³ Volume 94 Issue 2 ³
  3. ³ÜÛÜ Û Ûßß ÜÜÜ ÛßÛ Ûßß ÛÛÜ ÜÜÛ ÜÜÜ ÜÜÜ ÜÜÜ Ûßß ³ September 23, 1994 ³
  4. ³ Û ÛßÛ Ûß Û Û ÛÜÛ Ûß Û Þ Û Û Û Û Û Û Û ßßÛ ³ ³
  5. ³ ÛÛ Û Û ÛÛÛ ÛÛÛ Û ÛÛÛ Û Þ ÛÛÛ ÛÛÛ ÛÛÛ Û ÛÛÛ ³ "The greatest thing ³
  6. ³ Ü Ü Ü ³ to happen to ³
  7. ³ÜÛÜ Ûßß ÜÜÜ Û Û ÜÜÜ Û Û ÜÜÜ ÛÛÜ ßßÛ Û ³ journalism since ³
  8. ³ Û Ûß Û ÛßÛ Ý Û Û Û Û Û Û Û Þ ÛßÛ Û ³ Real People!" ³
  9. ³ ÛÛ ÛÛÛ ÛÛÛ Û Û ÛÛÛ ÛÛÛ ÛÛÛ Û Û Þ ÛÛÛ ÛÛÛ ³ ³
  10. ³ ³ Ed: Scott Burkett ³
  11. ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  12. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  13. In this action-packed issue:
  14. - A Word from the Editor
  15. - OpenDoors 5.0 Released!
  16. - OpenDoors 5.0 Changes
  17. - Bits 'n Bytes 'n Data types
  18. - Adding InterBBS Capabilities to OpenDoors programs
  19. - Opendoors Tech Corner - Inside OD 5.0's Internal Async Routines
  20. - Opendoors Tech Corner - Adding Local Mode Functionality
  21. - Opendoors Tech Corner - Finding physical cursor position in OD 5.0
  22. - Opendoors Tech Corner - Using UP/DOWN Arrow Keys in OD 5.0
  23. - Opendoors Tech Corner - Drawing bar graphs with OD!
  24. - Opendoors Tech Corner - Obtaining Names/Passwords in ASCII Mode
  25. - Opendoors Tech Corner - Files Transfers under OpenDoors
  26. - Opendoors Tech Corner - Comparing file stamps
  27. - Opendoors Tech Corner - Generating Fidonet *.MSG Messages
  28. - Code Snippets!
  29. - Opendoors Release Notice: BCHECKERS v1.2
  30. - Opendoors Release Notice: BFE 4.00.2r
  31. - Opendoors Release Notice: GIF View Preview Door v1.0
  32. - Opendoors Release Notice: Operation: Office v.05
  33. - OpenDoors Tech Journal Information
  34. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  35. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  36. ܳ A Word from the Editor ³
  37. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  38. ßßßßßßßßßßßßßßßßßßßßßßßßß
  39. By: Scott Burkett
  40. After many months of toiling, sweating, complaining, and otherwise
  41. groveling - it is now official - OpenDoors v5.0 has arrived! Brian has
  42. once again displayed his ability to provide his customers with simply
  43. the best C-based door kit in existence.
  44. I've moved! Actually, I'm still moving. My wife and I just moved to
  45. the Tampa Bay, Florida area and so far, so good! Actually, the author
  46. of RemoteAccess, Andrew Milner lives in Clearwater now - supposedly owns
  47. his own bar. I would go looking him up, but I'm afraid what might
  48. happen if Andrew and I spent too much time together with his alcohol
  49. supply. Such is life.
  50. If you haven't noticed by now, this issue is big - no, huge is more like
  51. it. I've been saving bits and pieces here and there. Actually, I was
  52. waiting on OD 5.0 to be released, and the pile just kept growing. I
  53. am convinced that the only reason Brian finally released 5.0, was to
  54. diminish my growing stack of code snippets.... :-)
  55. Just a reminder, but please be sure to send me any release notices for
  56. your latest OpenDoors creations! Without being notified, chances are,
  57. it won't appear in ODTJ. Free advertising is nice, isn't it.... :-)
  58. Alles Klaar und spater! (Until the next issue...)
  59. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  60. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  61. ܳ OpenDoors 5.0 Released! ³
  62. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  63. ßßßßßßßßßßßßßßßßßßßßßßßßßß
  64. By: Brian Pirie
  65. This edition of the ODTJ marks the release of OpenDoors 5.00. Version 5.00
  66. embodies some major steps forward for OpenDoors, including built-in
  67. asynchronous serial I/O capabilities, support for non-Borland C compilers
  68. such as Microsoft C, and a set of new advanced screen, window and popup menu
  69. functions. Many small enhancements have also been made, along with many
  70. efficiency improvements. As the long "new features and enhancements" list for
  71. version 5.00 will testify, this new release is one of the largest upgrades
  72. ever made to the capabilities of OpenDoors. Version 5.00 has also been more
  73. extensively tested than any previous version of OpenDoors, making it one of
  74. the most stable and efficient foundations on which you could choose to build
  75. your on-line software.
  76. Yet, even with all of the improvements that have been made for OpenDoors
  77. 5.00, work is already going ahead for version 5.10. The aim of version 5.10
  78. won't be so much to add new features, as to improve on already existing
  79. features. More efficiency improvements and greater flexibility is the goal of
  80. OpenDoors 5.10.
  81. What will come after OpenDoors 5.10? More than anything else, the future
  82. directions of OpenDoors is guided by the programmers who work with it. Your
  83. suggestions, ideas and even bug reports will determine what enhancements will
  84. continue to be made to OpenDoors. Please don't hesitate to pass along any
  85. changes that you would like to see in future versions of OpenDoors! I am also
  86. interested to find out how much interest there would be in the following:
  87. - An OS/2-specific version of OpenDoors
  88. - A Windows-specific version of OpenDoors
  89. - Graphics-mode RIP support
  90. - A programmer-configurable door installation/configuration utility
  91. that would work in conjunction with the OpenDoors configuration file
  92. system.
  93. - A multi-node file system that would facilitate easy implementation
  94. of multi-node doors with the ability to send messages between nodes
  95. and control concurrent access to configuration and user files.
  96. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  97. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  98. ܳ OpenDoors 5.0 Released! ³
  99. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  100. ßßßßßßßßßßßßßßßßßßßßßßßßßß
  101. By: Brian Pirie
  102. Version 5.00 represents several major steps forward for OpenDoors. In
  103. addition to numerous bug fixes and minor improvements, a number of major
  104. new features have been added to this version. These include an optional
  105. multiple personality system which allow the sysop to choose the status
  106. line and function key style they prefer. This version also adds
  107. text-mode support for RIP (Remote Imaging Protocol) graphics, and adds a
  108. group of advanced ANSI/AVATAR/RIP functions for scrolling areas of the
  109. screen, saving and restoring portions of the screen and creating pop-up
  110. windows and menus. Also new in this version is support for compilers
  111. other than Borland/Turbo C(++), such as compilers from Microsoft.
  112. Version 5.00 also adds built-in communications support, making the use
  113. of a FOSSIL driver optional. Furthermore, direct support for additional
  114. BBS systems has been added.
  115. The list below provides more detail of the changes and new features in
  116. version 5.00. For a summary of changes made for previous versions of
  117. OpenDoors, refer to the OpenDoors History file that is available from my
  118. system.
  119. - The nonstop key ([=]) now works correctly during FILES.BBS
  120. listing.
  121. - New door information file formats now supported include: RA 2.00
  122. EXITINFO.BBS.
  123. - If the TASK environment variable is set, OpenDoors will now use
  124. its value to determine the current node number.
  125. - The od_control.od_spawn_freeze_time variable now works correctly.
  126. Previously, the user's time would always be frozen during
  127. od_spawn...() execution, regardless of the value of this
  128. variable.
  129. - A new feature known as the "Multiple Personality System" has been
  130. added to this version. If you choose to include the Multiple
  131. Personality System in a door, the sysop will be able to specify
  132. which of a number of "personalities" should be used. Each
  133. personality defines the statusline appearance and function keys
  134. seen by the sysop, and has no effect on the door's operation from
  135. the user's standpoint. OpenDoors 5.00 includes personality
  136. definitions for WildCat, RemoteAccess, PC-Board, and it's own
  137. simplified RA style status lines. You can also define your own
  138. personalities by writing a personality definition function. If
  139. your choose not to include the Multiple Personality System in a
  140. door, you will still be able to define which single personality
  141. you wish OpenDoors to use.
  142. - This version of OpenDoors can be used with a larger variety of
  143. compilers than where supported by the previous version. OpenDoors
  144. 5.00 is known to work with all versions of Turbo C, Turbo C++,
  145. Borland C++, Microsoft C, Microsoft C++, Quick C and Visual C++.
  146. It should also work with any other MS-DOS based ANSI C compiler
  147. that supports the Microsoft/DOS .OBJect and .LIBrary file
  148. formats.
  149. - A new diagnostics feature has been added to OpenDoors, which
  150. allows you to determine the reason for the most recent OpenDoors
  151. function failure. When any OpenDoors function returns a failure
  152. condition, it also sets the new od_control.od_error variable to
  153. indicate the reason for the failure.
  154. - Added additional definitions to OPENDOOR.H, to map names of
  155. OpenDoors functions and variables with the word "colour" from the
  156. U.S. spelling "color". In other words, both od_set_colour() and
  157. od_set_color() are now recognized by OpenDoors.
  158. - The od_list_files() now supports more intelligent path
  159. specifications. If the parameter to od_list_files() is NULL or
  160. empty, it will search for a FILES.BBS file in the current
  161. directory. If a directory path is specified, it will look for a
  162. FILES.BBS in that directory. If a full directory and filename are
  163. specified, the specified filename will be used in place of
  164. FILES.BBS.
  165. - To save space, the compact memory model library is no longer
  166. included in the normal OpenDoors package. The compact memory
  167. model library is now available seperately.
  168. - A new function, od_set_dtr(), has been added to allow the DTR
  169. line to the modem to be manually controlled. This can be useful
  170. in writing programs where you wish to force the modem to hangup,
  171. such as a call-back verification door.
  172. - Added additional support for various DOS multitasking
  173. environments. OpenDoors is now specifically Microsoft Windows
  174. aware. OpenDoors also now gives up time to other waiting tasks
  175. when it is idle during chat mode.
  176. - The od_edit_str() "M" mode now capitializes a character following
  177. a dash '-' character.
  178. - When transmitting more than one character at a time, OpenDoors
  179. now uses the FOSSIL trasfer block function, instead of multiple
  180. calls to the transfer character function. This should help to
  181. improve performance over high speed connections when running on
  182. slow PCs or under multitasking environments.
  183. - OpenDoors 4.10 would not correctly change the display colour from
  184. high-intensity back to low-intensity. This problem has been
  185. fixed.
  186. - OpenDoors now recognizes DORINFO?.DEF filenames with alphabetical
  187. identifiers (ie, DORINFOA.DEF thru DORINFOZ.DEF) for nodes 10
  188. thru 35.
  189. - Improvements have been made to the logfile system. An exit at
  190. errorlevel zero no longer causes garbage to be written to the
  191. logfile. The logfile functions have been made more reliable when
  192. operating under low stack availability conditions. In the past,
  193. if a large number of local variables where allocated on the
  194. stack, the logfile functions would fail, often writing garbage to
  195. the logfile. When the user pages the sysop for chat, the user's
  196. reason for wishing a chat is also written to the logfile.
  197. - Support for text-mode RIP (Remote Imaging Protocol) graphics has
  198. been added. Because this version of OpenDoors always operates in
  199. DOS text-mode, none of the graphics mode RIP features (such as
  200. drawing lines, circles and displaying icons) will appear on the
  201. local screen. Plans for a version of OpenDoors that will operate
  202. in graphics mode and optionally display graphics locally are
  203. currently under consideration. In this version, RIP support
  204. includes a number of new features. OpenDoors will now recognize
  205. the RIP setting passed in an RA 2.00 EXITINFO.BBS file and
  206. WildCat DOOR.SYS file, and also allows the RIP setting to be
  207. specified in a custom door information file. The od_send_file()
  208. and od_hotkey_menu() functions will now search for files with
  209. .RIP, .AVT, .ANS and .ASC extensions. When displaying RIP
  210. graphics to the remote user, a pop-up window appears on the local
  211. screen, indicating to the sysop which file is being displayed.
  212. - A set of new functions have been added to permit advanced screen
  213. manipulations. These functions include od_gettext() and
  214. od_puttext() to save and restore portions of the screen, and
  215. od_save_screen() and od_restore_screen() to save and restore the
  216. entire screen. od_scroll() can be used to scroll any portion of
  217. the screen upwards or downwards. od_save_screen() and
  218. od_restore_screen() will operate in any mode, but the other
  219. functions require ANSI/AVATAR/RIP mode to be available.
  220. - Three additional functions, od_window_create(),
  221. od_window_remove() and od_popup_menu(), have been added to
  222. facilitate the creation of popup windows and menus. When such a
  223. window or menu is removed from the screen, the are of the screen
  224. "under" the window is returned to it's original state. This
  225. allows you to create multiple overlapping windows within a door
  226. program. The od_popup_menu() function creates a popup window with
  227. a menu from a simple menu definition string. The user can select
  228. an option from this menu by pressing the key associated with an
  229. option, or by moving a menu selection bar using their arrow keys.
  230. These three functions require an ANSI/AVATAR/RIP mode to be
  231. available.
  232. - A new function, od_chat() has been added, to allow you to
  233. explicitly invoke the OpenDoors chat mode from within your
  234. program.
  235. - A new setting variable, od_control.od_always_clear has been
  236. added. When set to TRUE, od_clr_scr() will always clear the
  237. screen, regardless of the user's screen clearing setting. When
  238. set to FALE, od_clr_scr() will only clear the screen if the user
  239. has screen clearing enabled.
  240. - It is now possible to configure the errorlevels OpenDoors exits
  241. with under various circumstances, such as when the user runs out
  242. of time remaining online. See the od_control.od_errorlevel
  243. variable
  244. - A new setting variable, od_control.od_force_local, can be used to
  245. easily force OpenDoors to operate in local mode. Using this
  246. variable you can easily add a command line parameter such as
  247. "-local" to allow the sysop to force your door to operate in
  248. local mode. When OpenDoors is forced into local mode using this
  249. variable, it does not look for a door information file, and uses
  250. default settings for the user's name, etc.
  251. - OPENDOOR.H now sets structure packing to single byte alignment
  252. for the od_control structure when Borland and Microsoft compilers
  253. are being used. In the past, programmers using OpenDoors have
  254. experienced difficulties the od_control structure when the
  255. compiler has been set to use word packing.
  256. - OpenDoors now closes the FOSSIL driver prior to performing a
  257. spawn or sysop DOS shell. This allows doors or other
  258. communications programs which use the FOSSIL driver to be
  259. executed while the door's execution is suspended.
  260. - When used with a FOSSIL driver, OpenDoors normally changes the
  261. BPS rate to that passed from the BBS (if the BBS passes a valid
  262. FOSSIL BPS rate). This BPS rate setting may now be disabled by
  263. setting the DIS_BPS_SETTING bit of the od_control.od_disable
  264. variable.
  265. - A function hook has been added to allow you to install a function
  266. to be called whenever od_kernel() executes
  267. (od_control.od_ker_exec). Another function hook,
  268. od_control.od_time_msg_func, can be installed to override
  269. OpenDoor's time limit warning messages.
  270. - A new array, od_control.od_hot_function, allows the you to define
  271. functions to be called when any of the programmer-defined sysop
  272. hotkeys have been pressed.
  273. - A function hook, od_control.od_no_file_func, has been added. This
  274. function will be called whenever OpenDoors is unable to find or
  275. read a door information file. This allows you to add your own
  276. door information file reader, or to provide a local login prompt
  277. when no door information file is present.
  278. - Previously, OpenDoors would stop correctly updating the user's
  279. remaining time at midnight when running under certain BIOSes.
  280. This problem has been fixed.
  281. - The current display colour attribute can now be accessed through
  282. an control structure member, od_control.od_cur_attrib.
  283. - od_send_file() and od_hotkey_menu() no longer pause with a
  284. "Continue?" prompt prematurely in files that have line lengths
  285. greater than 254 characters.
  286. - The local keyboard may now be disabled by setting the
  287. DIS_LOCAL_INPUT bit of od_control.od_disable. This only affects
  288. the sysop's input in circumstances that input is also accepted
  289. from the remote user; this setting has no effect on the sysop
  290. function keys.
  291. A new function hook:
  292. void (*od_control.od_local_input)(int);
  293. has been added. If set, this function will be called whenever the
  294. sysop presses a non-sysop-function key on the local keyboard.
  295. - od_control.od_clear_on_exit now controls whether the screen is
  296. cleared before shelling or executing od_spawn...(), in addition
  297. to before OpenDoors shuts down.
  298. - od_page() now restores the original display colour before
  299. returning.
  300. - It is now possible to display an entire string of characters with
  301. terminal emulation, using the new function od_disp_emu().
  302. - OpenDoors will now display a small popup window when
  303. disconnecting the current connection.
  304. - A new variable, od_control.od_in_buf_size, can now be set prior
  305. to calling any OpenDoors function to set the size of OpenDoors
  306. combined local/remote keyboard input buffer. By default, this
  307. buffer is 256 bytes in size.
  308. - Previously, there were a number of OpenDoors API functions that
  309. would not correctly initialize OpenDoors if they were the first
  310. function called in the program. This has been fixed.
  311. - To facilitate setting of bps rates up to 115,200, od_control.baud
  312. is now an unsigned long.
  313. - A new setting, od_control.od_no_ra_codes, has been added to
  314. disable the use of RemoteAccess/QuickBBS control codes by
  315. od_send_file()/od_hotkey_menu()/od_disp_emu(). The
  316. RemoteAccess/QuickBBS ASCII 1 "pause for key" is also now
  317. recognized.
  318. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  319. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  320. ܳ Bits and Bytes and Data Types ³
  321. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  322. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  323. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  324. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  325. ܳ InterBBS Capabilities are Here! ³
  326. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  327. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  328. *** Editor's Note: The following is the press release for Brian's
  329. InterBBS add-on library for OpenDoors. It can be obtained by FREQ'ing
  330. IBBS from either his system or mine. Enjoy!
  331. BBS "door" programs have always allowed operators of online computer
  332. services, such as electronic bulletin board systems, to easily expand the
  333. services provided by their systems. Doors have greatly increased the
  334. flexibility and usability of BBS systems. A recent trend in door development
  335. has been to allow doors running on one BBS system to be linked to doors
  336. running on other systems, often through existing mail networks. While these
  337. networks have traditionally provided private and conference (echo) mail
  338. services and file sharing capabilities, they can also be useful in providing
  339. links between special applications that wish to share information with one
  340. another.
  341. By taking advantage of existing mail network technology, BBS door developers
  342. have been able to add a new dimension to the software they create. Among the
  343. new ideas that have proven successful have been distributed BBS listing
  344. services, distributed file listing services and games that share top-score
  345. lists or even allow players to compete with people playing the game hundreds
  346. or thousands of miles away. The possibilities are really limited only by the
  347. imagination of the door software developer.
  348. This package is designed to assist in writing Inter-BBS door programs that
  349. can communicate across FTSC-compatible mail networks, such as FidoNet. Using
  350. this package, you can:
  351. - Send information messages through any FTSC-compatible mailer
  352. that supports *.MSG format netmail, including FrontDoor,
  353. InterMail, BinkleyTerm, D'Bridge, and others.
  354. - Send messages containing either textual or binary data. This
  355. information is stored in the message body, to allow the message
  356. to be sent either directly (CrashMail) or by routed netmail.
  357. - Easily send information to just one other system, or all
  358. systems running the door. This allows you to implement both
  359. centralized and de-centralized information distribution
  360. schemes.
  361. This package includes the source code for an example skiing game door that
  362. maintains a high score list across multiple BBSes. This game requires the
  363. OpenDoors door programming toolkit to be compiled. However, the Inter-BBS
  364. Toolkit itself can also be use in doors that are not written with OpenDoors.
  365. The Inter-BBS Toolkit is available free of charge, and the package includes
  366. the complete C source code. This source code has been written for Borland C
  367. and C++ compilers, but may easily be modified for use with other C compilers.
  368. With the source code, you are able to customize or expand the capabilities of
  369. the Inter-BBS Toolkit as you wish.
  370. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  371. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  372. ܳ OpenDoors Tech Corner ³
  373. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  374. ßßßßßßßßßßßßßßßßßßßßßßßß
  375. -----------------------------------------------------------------------------
  376. Inside OD 5.0's Internal Async Routines
  377. By: Brian Pirie/Scott Burkett
  378. -----------------------------------------------------------------------------
  379. > Just a quick thought, but it would be nice if we could have
  380. > access to the low level communication functions (both fossil and
  381. > internal). The standard od...() functions work great for doors,
  382. > but for critical timing matters such as protocols, etc, it
  383. > doesn't fly. I am using my own fossil system for the timing
  384. > essential portions of BFE, for example.
  385. I will consider adding these functions to the documented OpenDoors interface. In
  386. the meantime, they are as follows:
  387. int _com_carrier(void); /* TRUE if DCD is high */
  388. void _com_clear_inbound(void); /* Clears outbound buffer */
  389. void _com_clear_outbound(void); /* Clears inbound buffer */
  390. void _com_close(void); /* Closes serial port */
  391. void _com_dtr(char high); /* TRUE raises DTR, FALSE lowers DTR */
  392. char _com_getchar(void); /* Returns next char from modem */
  393. void _com_ini(void); /* Opens serial port */
  394. char _com_inbound(void); /* FALSE if inbound buffer is empty */
  395. char _com_outbound(void); /* FALSE if outbound buffer is empty */
  396. void _com_sendchar(char ch); /* Sends character to modem */
  397. /* Sends multiple chars to modem */
  398. void _com_send_buf(char *buffer,int size);
  399. These functions assume that the door is not operating in local mode. Do not
  400. call com_getchar() unless the _com_inbound() returns TRUE.
  401. -----------------------------------------------------------------------------
  402. Adding Local Mode Functionality
  403. By: Brian Pirie
  404. -----------------------------------------------------------------------------
  405. OpenDoors 5.00 now permits you to easily force your door to operate in local
  406. mode by setting the od_force_local variable. Normally OpenDoors will use a
  407. default user name, but you can also use this feature to easily provide a
  408. local login prompt for your door. The following example shows how you might
  409. do this:
  410. (This code might look long, but keep in mind that most of it is comments!)
  411. #include "opendoor.h"
  412. int main(int argc, char *argv[])
  413. {
  414. int counter;
  415. char valid_login = TRUE;
  416. /* Check for /LOCAL command-line parameter */
  417. for(counter = 1; counter < argc; ++counter)
  418. {
  419. strupr(argv[counter]); /* Do this with care! */
  420. if(strcmp(argv[counter], "/LOCAL")==0)
  421. {
  422. /* We are operating in local mode */
  423. od_control.od_force_local = TRUE;
  424. /* Let user login */
  425. do {
  426. /* Prompt for user name */
  427. printf("User Name : ");
  428. /* Get name from user. Note that it would be better */
  429. /* to use a console input routine that limits the */
  430. /* number of characters that can be inputted by the */
  431. /* user, to prevent od_user_name from being overrun. */
  432. /* I use gets() here for simplicity. */
  433. gets(od_control.od_user_name);
  434. /* At this point, if you have a user file for your door */
  435. /* you might want to check whether the user's name is */
  436. /* valid. If it is not valid, you can set valid_login */
  437. /* to false, to cause door to prompt for a new name. */
  438. /* (Keep in mind that you should provide some way for a */
  439. /* new user to log in locally!) */
  440. } while(!valid_login);
  441. /* Perform main door operations */
  442. doormain();
  443. /* Exit program */
  444. return(0);
  445. }
  446. }
  447. /* If we get to this point, then there is no /LOCAL parameter. So, */
  448. /* we should operate normally */
  449. /* Perform main door operations */
  450. doormain();
  451. /* Exit program */
  452. return(0);
  453. }
  454. void doormain(void)
  455. {
  456. /* Initialize OpenDoors */
  457. od_init();
  458. /* Door's main processing, common to remote and local modes, */
  459. /* here */
  460. }
  461. -----------------------------------------------------------------------------
  462. Finding physical cursor position in OD 5.0
  463. -----------------------------------------------------------------------------
  464. (Brian Pirie)
  465. > Quick question: Is there a method to determine the current
  466. > location of the cursor, without keeping track of it manually? I
  467. > vaguely recall a thread about this subject, but can't find it
  468. > for the life of me...
  469. In 5.00, the following two variables:
  470. extern unsigned char phys_curx;
  471. extern unsigned char phys_cury;
  472. store the current location of the cursor on the local screen.
  473. -----------------------------------------------------------------------------
  474. Using UP/DOWN Arrow Keys in OpenDoors 5.0
  475. -----------------------------------------------------------------------------
  476. (Taken from the OPENDOORS echo)
  477. > Any news on when the next beta will be out, and also do you plan
  478. > on allowing support for use of the UP/DOWN arrow keys?
  479. This has been fixed in the 5.00/beta-8 package. The following program
  480. demonstrates a door which displays a simple message when the up or down arrow
  481. key is pressed. Since OpenDoors defaults to using the up and down arrow keys
  482. for adjusting the user's time limit, such a program has to use different keys
  483. for this purpose. This program reassigns the [Page Up] and [Page Down] keys
  484. to be used for adjusting the user's remaining time.
  485. /* Simple program to demonstrate using arrow keys within an OpenDoors door */
  486. /* program. Since the arrow keys are normally used locally to adjust the */
  487. /* user's time up or down, you must choose different keys to adjust the */
  488. /* time limit. This program simply loops, displaying the word "up" if the */
  489. /* up arrow is pressed, "down" if the down arrow is pressed, and exiting */
  490. /* if the enter key is pressed. */
  491. #include "opendoor.h"
  492. main()
  493. {
  494. int choice;
  495. char pressed;
  496. long timer;
  497. /* Notice call to od_init() here! */
  498. od_init();
  499. /* Reassign PageUp and PageDown to increase/decrease time */
  500. /* Remember to do this after od_init() or your first call to any OpenDoors */
  501. /* function. */
  502. od_control.key_lesstime = 0x5100; /* Scan code for Page Down */
  503. od_control.key_moretime = 0x4900; /* Scan code for Page Up */
  504. od_disp_str("Press up and down arrows keys. Press Enter when done\r\n");
  505. for(;;)
  506. {
  507. pressed = od_get_key(TRUE);
  508. /* Check for ANSI arrow key sequences */
  509. if(pressed==27)
  510. {
  511. timer=(*(long far *)0x46cL)+2L;
  512. while(timer>*(long far *)0x46cL && (pressed=od_get_key(FALSE))==0)
  513. {
  514. od_kernel();
  515. }
  516. if(pressed != '[')
  517. {
  518. continue;
  519. }
  520. else
  521. {
  522. timer=(*(long far *)0x46cL)+9L;
  523. while(timer>*(long far *)0x46cL && (pressed=od_get_key(FALSE))==0)
  524. {
  525. od_kernel();
  526. }
  527. if(pressed == 0) continue;
  528. switch(pressed)
  529. {
  530. case 'A':
  531. goto up_arrow;
  532. case 'B':
  533. goto down_arrow;
  534. }
  535. }
  536. }
  537. /* Check for doorway / local arrow key sequences */
  538. else if(pressed==0)
  539. {
  540. /* Get the next key from the keyboard */
  541. timer=(*(long far *)0x46cL)+9L;
  542. while(timer>*(long far *)0x46cL && (pressed=od_get_key(FALSE))==0)
  543. {
  544. od_kernel();
  545. }
  546. if(pressed == 0) continue;
  547. /* Respond appropriately */
  548. switch(pressed)
  549. {
  550. case 0x48:
  551. up_arrow:
  552. od_disp_str("Up Arrow.\r\n");
  553. break;
  554. case 0x50:
  555. down_arrow:
  556. od_disp_str("Down Arrow.\r\n");
  557. break;
  558. }
  559. }
  560. /* exit program if user presses CR or LF */
  561. else if (pressed == '\n' || pressed == '\r')
  562. {
  563. break;
  564. }
  565. }
  566. /* Note that od_exit() is now optional in OpenDoors 5.00/beta-8 */
  567. /* If you allow the program to return from the main() function without */
  568. /* first calling od_exit(), the od_exit() code will automatically be */
  569. /* performed. Note, however, that this does not allow OpenDoors to */
  570. /* determine the errorlevel being used, in order to report the */
  571. /* errorlevel in the logfile. */
  572. return(0);
  573. }
  574. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  575. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  576. ܳ Drawing Bar Graphs with OD! ³
  577. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  578. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  579. By: Brian Pirie
  580. Many different types of programs can be enhanced by the use of graphical
  581. information. Often, this graphical information can take the form of
  582. horizontal bar graphs.
  583. An easy way to draw horizontal bars in door programs written with
  584. OpenDoors, is to use the od_repeat() function. Not only does od_repeat()
  585. allow you to easily form a bar by repeating a particular character the
  586. specified number of times, but it is also a very efficient way to do so.
  587. od_repeat() will take advantage of terminal emulation optimizations,
  588. when available. For instance, a character can be repeated any number of
  589. times with AVATAR by sending a short 3-byte sequence that specifies the
  590. character and number of times to repeat.
  591. How do you calculate the number of character to use to form a bar in
  592. your graph? The DrawHorizontalBar() function, which is provided below,
  593. will do this calculation for you. Simply provide the value to be
  594. represented by this bar, the minimum and maximum possible values, and
  595. the maximum number of character to use to draw the bar. For example, if
  596. you are graphing percentages (which could range from 0% to 100%), and
  597. wanted the graph to fit in a space of 40 columns, you would use:
  598. DrawHorizontalBar(nPercent, 0, 100, 40);
  599. Below the listing for the DrawHorizontalBar() function is a complete program
  600. which demonstrates the DrawHorizontalBar() function as called from another
  601. function that will create complete horizontal bar graphs. This second function,
  602. DrawGraphOfPercentages(), takes an array of titles, and array of values
  603. corresponding to each title, and draws a complete bar graph from this
  604. information.
  605. /* Function to draw a horizontal bar, given a value, the minimum and maximum */
  606. /* possible values, and the number of characters the horizontal bar should */
  607. /* extended for the maximum value. */
  608. void DrawHorizontalBar(int nValue, int nMinValue, int nMaxValue,
  609. int nMaxChars)
  610. {
  611. /* Determine lenght of bar */
  612. int nBarChars = ((nValue - nMinValue) * nMaxChars) / nMaxValue;
  613. if(od_control.user_ansi || od_control.user_avatar)
  614. {
  615. /* If ANSI or AVATAR graphics are available, assume that IBM extended */
  616. /* ASCII is also available. This function uses character 220 to form */
  617. /* bars that are 1/2 the height of the line. You might also want to */
  618. /* try character 119, which will form bars that are the entire height */
  619. /* of the line. */
  620. od_repeat(220, nBarChars);
  621. }
  622. else
  623. {
  624. /* In ASCII mode, the bar is formed by the '=' character. */
  625. od_repeat('=', nBarChars);
  626. }
  627. }
  628. ----- ex_graph.c example program follows ------------------------------
  629. /* Includes */
  630. #include "opendoor.h"
  631. /* Function prototypes. */
  632. void DrawHorizontalBar(int nValue, int nMinValue, int nMaxValue,
  633. int nMaxChars);
  634. void DrawGraphOfPercentages(int nItems, int *panPercentages,
  635. char **papszTitles, char bTitleColor, char bGraphColor,
  636. int nTitleWidth, int nGraphWidth);
  637. /* Main function - program execution begins here. */
  638. main()
  639. {
  640. char *apszTitles[7] = {"Sunday", "Monday", "Tuesday", "Wednesday",
  641. "Thursday", "Friday", "Saturday"};
  642. int anValues[7] = {50, 75, 100, 25, 83, 0, 43};
  643. od_printf("`bright green`Test graph:\n\r");
  644. DrawGraphOfPercentages(7, anValues, apszTitles, 0x02, 0x0f, 20, 50);
  645. od_get_key(TRUE);
  646. return(0);
  647. }
  648. /* Function to draw horizontal graph of percentages with titles, to */
  649. /* demonstrate the use of the DrawHorizontalBar() function. */
  650. /* No titles should have more than nTitleWidth characters. */
  651. void DrawGraphOfPercentages(int nItems, int *panPercentages,
  652. char **papszTitles, char bTitleColor, char bGraphColor,
  653. int nTitleWidth, int nGraphWidth)
  654. {
  655. int nCurrentItem;
  656. /* Loop for each item (line) in the graph. */
  657. for(nCurrentItem = 0; nCurrentItem < nItems; ++nCurrentItem)
  658. {
  659. /* Set display color for title text. */
  660. od_set_attrib(bTitleColor);
  661. /* Add spaces to right-align all titles. */
  662. od_repeat(' ', nTitleWidth - strlen(papszTitles[nCurrentItem]));
  663. /* Display the title. */
  664. od_disp_str(papszTitles[nCurrentItem]);
  665. /* Add space between title and graph. */
  666. od_printf(" ");
  667. /* Set display color for graph. */
  668. od_set_attrib(bGraphColor);
  669. /* Draw bar graph for this line. */
  670. DrawHorizontalBar(panPercentages[nCurrentItem], 0, 100, nGraphWidth);
  671. /* Move to the next line. */
  672. od_printf("\n\r");
  673. }
  674. }
  675. /* Function to draw a horizontal bar, given a value, the minimum and maximum */
  676. /* possible values, and the number of characters the horizontal bar should */
  677. /* extended for the maximum value. */
  678. void DrawHorizontalBar(int nValue, int nMinValue, int nMaxValue,
  679. int nMaxChars)
  680. {
  681. /* Determine lenght of bar */
  682. int nBarChars = ((nValue - nMinValue) * nMaxChars) / nMaxValue;
  683. if(od_control.user_ansi || od_control.user_avatar)
  684. {
  685. /* If ANSI or AVATAR graphics are available, assume that IBM extended */
  686. /* ASCII is also available. This function uses character 220 to form */
  687. /* bars that are 1/2 the height of the line. You might also want to */
  688. /* try character 119, which will form bars that are the entire height */
  689. /* of the line. */
  690. od_repeat(220, nBarChars);
  691. }
  692. else
  693. {
  694. /* In ASCII mode, the bar is formed by the '=' character. */
  695. od_repeat('=', nBarChars);
  696. }
  697. }
  698. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  699. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  700. ܳ Obtaining Names/Passwords in ASCII Mode ³
  701. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  702. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  703. By: Brett Barnes, THE TOWER BBS 071 636 3957, England
  704. #include <stdio.h>
  705. #include <string.h>
  706. #include "opendoor.h"
  707. void Get_Password(char *string, int length);
  708. void Get_Full_Name(char *string, int length);
  709. void Get_Password(char *string, int length)
  710. {
  711. int key;
  712. int count = 0;
  713. od_clear_keybuffer();
  714. while((key = od_get_key(TRUE)) != 13)
  715. {
  716. if(key == 0)
  717. od_get_key(TRUE);
  718. if(key >= 32 && key <= 127 && count < length)
  719. {
  720. string[count++] = key;
  721. od_putch('*');
  722. }
  723. if(key == '\b' && count > 0)
  724. {
  725. od_putch('\b');
  726. od_putch(' ');
  727. od_putch('\b');
  728. count--;
  729. string[count] = '\0';
  730. }
  731. }
  732. strupr(string);/*make string uppercase*/
  733. }
  734. void Get_Full_Name(char *string, int length)
  735. {
  736. int key;
  737. int count = 0;
  738. od_clear_keybuffer();
  739. while((key = od_get_key(TRUE)) != 13)/* Drops out when Enter key*/
  740. {
  741. if(key == 0)
  742. od_get_key(TRUE);/*cancels prob with DEL key*/
  743. /*If key = valid ascii code */
  744. if(key >= 32 && key <= 127 && count < length)
  745. {
  746. /*if uppercase */ if(key >= 65 && key <= 90)
  747. key = key+32;/*convert to lowercase*/
  748. if(count == 0 && key >= 97 && key <= 122)
  749. key = key-32;/*convert to uppercase*/
  750. else
  751. if(string[count-1] == ' ' && key >= 97 && key <= 122)
  752. key = key-32;/*convert to uppercase*/
  753. /*Stop spaces being put in first*/
  754. if(key != 32)
  755. {
  756. string[count++] = key;
  757. od_putch(key);
  758. }
  759. else if(count > 0)
  760. {
  761. string[count++] = key;
  762. od_putch(key);
  763. }
  764. }
  765. if(key == '\b' && count > 0)/*If Backspace*/
  766. {
  767. od_putch('\b');
  768. od_putch(' ');
  769. od_putch('\b');
  770. count--;
  771. string[count] = '\0';
  772. }
  773. }
  774. }
  775. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  776. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  777. ܳ File Transfers Under OpenDoors ³
  778. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  779. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  780. By: Brian Pirie, taken from the OPENDOORS echomail conference:
  781. Often, it can be useful or necessary to send and receive files between
  782. a program using OpenDoors, and the remote user's system. To allow file
  783. uploading and downloadeding, you can either implement the common file
  784. transfer protocols as part of your program, or you can call an external
  785. file transfer program, such as DSZ. This tip demonstrates how you can
  786. call DSZ using OpenDoors.
  787. In order to see this program in action, you should run a terminal
  788. program on one machine, and connect to second machine that will run this
  789. example program. (You could also do this in two different windows on one
  790. machine.) The demonstration program will ask whether you want to upload
  791. or download files, and will then prompt you for the file transfer protocol
  792. to use and the filename to transfer. Once this is done, DSZ is invoked
  793. to perform the file transfer. As such, DSZ will need to be installed on
  794. the machine that will run the example program.
  795. The tip2.c program provides a function that you can use to perform file
  796. transfers. This function is defined as follows:
  797. int TransferFile(char *pszFilename, eProtocol Protocol, char bReceive)
  798. The first parameter should contain the name of the file or files to be
  799. transfered. The second parameter should specify the file transfer
  800. protocol to use, and should be one of the following enumerated
  801. constants:
  802. XModem
  803. XModemCRC
  804. XModem1K
  805. YModem
  806. YModemG
  807. ZModem
  808. The third parameter specifies whether the file is being send (FALSE) or
  809. received (TRUE). From the user's perspective, sending the file means
  810. downloading, and receiving the file means uploading.
  811. The TransferFile() function returns TRUE if the file transfer was
  812. completed, and FALSE if it was not.
  813. If the DSZ program is not present in the system's PATH or the current
  814. directory, then the global variable szDSZFilename must be set to the
  815. full path and filename of the DSZ program. This could be done by adding
  816. a custom OpenDoors configuration file line with a keyword such as
  817. "DSZPath".
  818. The first part of the tip2.c program discussed in the previous message
  819. follows:
  820. /* tip2.c - Example program to demonstrate how to send or receive files */
  821. /* using DSZ, from within an OpenDoors program. */
  822. /* Include required header files. */
  823. #include <stdio.h>
  824. #include <assert.h>
  825. #include "opendoor.h"
  826. /* File transfer protocol enumeration. */
  827. typedef enum
  828. {
  829. XModem,
  830. XModemCRC,
  831. XModem1K,
  832. YModem,
  833. YModemG,
  834. ZModem
  835. } eProtocol;
  836. /* Function prototypes. */
  837. int TransferFile(
  838. char *pszFilename,
  839. eProtocol Protocol,
  840. char bReceive);
  841. eProtocol ChooseProtocol(void);
  842. void AddParameter(
  843. char **papszArguments,
  844. int *pnCount,
  845. char *pszNewArgument);
  846. /* Manifest constants. */
  847. #define ARGS_ARRAY_SIZE 10
  848. /* Global variable with DSZ filename. */
  849. char szDSZFilename[80] = "DSZ";
  850. /* Program's execution begins here. */
  851. main()
  852. {
  853. char chAnswer;
  854. char bReceive;
  855. eProtocol Protocol;
  856. char szFilename[73];
  857. int bSuccess;
  858. od_printf("OpenDoors file transfer demo.\n\r\n\r");
  859. /* Get file transfer direction from user. */
  860. od_printf("Do you wish to [U]pload or [D]ownload? ");
  861. chAnswer = od_get_answer("UD");
  862. if(chAnswer == 'U')
  863. {
  864. od_printf("Upload\n\r\n\r");
  865. bReceive = TRUE;
  866. }
  867. else
  868. {
  869. od_printf("Download\n\r\n\r");
  870. bReceive = FALSE;
  871. }
  872. /* Get file transfer protocol from user. */
  873. Protocol = ChooseProtocol();
  874. /* Get filename. */
  875. od_printf("\n\rEnter filename(s) : ");
  876. od_input_str(szFilename, 72, ' ', 255);
  877. od_printf("\n\r");
  878. /* Perform file transfer. */
  879. bSuccess = TransferFile(szFilename, Protocol, bReceive);
  880. /* Display result of file transfer to user. */
  881. od_clr_scr();
  882. if(bSuccess)
  883. {
  884. od_printf("File transfer successful.\n\r");
  885. }
  886. else
  887. {
  888. od_printf("File transfer not completed.\n\r");
  889. }
  890. /* Prompt user to exit program. */
  891. od_printf("Press [Enter] to return to BBS.\n\r");
  892. od_get_answer("\n\r");
  893. /* Return control to calling BBS software. */
  894. od_exit(0, FALSE);
  895. return(0);
  896. }
  897. /* Function to allow user to choose a file transfer protocol. */
  898. eProtocol ChooseProtocol(void)
  899. {
  900. eProtocol Protocol;
  901. char chAnswer;
  902. od_printf("Available file transfer protocols:\n\r");
  903. od_printf(" [X] XModem\n\r");
  904. od_printf(" [C] XModem/CRC\n\r");
  905. od_printf(" [1] XModem/1K\n\r");
  906. od_printf(" [Y] YModem\n\r");
  907. od_printf(" [G] YModem-G\n\r");
  908. od_printf(" [Z] ZModem\n\r\n\r");
  909. od_printf("Please select a protocol: ");
  910. chAnswer = od_get_answer("XC1YGZ");
  911. switch(chAnswer)
  912. {
  913. case 'X':
  914. od_printf("XModem\n\r");
  915. Protocol = XModem;
  916. break;
  917. case 'C':
  918. od_printf("XModem/CRC\n\r");
  919. Protocol = XModemCRC;
  920. break;
  921. case '1':
  922. od_printf("XModem/1K\n\r");
  923. Protocol = XModem1K;
  924. break;
  925. case 'Y':
  926. od_printf("YModem\n\r");
  927. Protocol = YModem;
  928. break;
  929. case 'G':
  930. od_printf("YModem-G\n\r");
  931. Protocol = YModemG;
  932. break;
  933. case 'Z':
  934. default:
  935. od_printf("ZModem\n\r");
  936. Protocol = ZModem;
  937. break;
  938. }
  939. return(Protocol);
  940. }
  941. /* Function to send or receive a file to/from remote system. */
  942. int TransferFile(
  943. char *pszFilename,
  944. eProtocol Protocol,
  945. char bReceive)
  946. {
  947. char szPort[7];
  948. char *apszArguments[ARGS_ARRAY_SIZE];
  949. int nArgCount = 0;
  950. /* Filename cannot be NULL. */
  951. assert(pszFilename != NULL);
  952. /* Ensure that we are not operating in local mode. */
  953. if(od_control.baud == 0)
  954. {
  955. od_printf("Operating in local mode;"
  956. " file transfer not possible.\n\r");
  957. return(FALSE);
  958. }
  959. /* Generate DSZ command line */
  960. /* Begin with executable filename. */
  961. AddParameter(apszArguments, &nArgCount, szDSZFilename);
  962. /* Add port parameter. */
  963. AddParameter(apszArguments, &nArgCount, "port");
  964. sprintf(szPort, "%d", od_control.port + 1);
  965. AddParameter(apszArguments, &nArgCount, szPort);
  966. /* Restrict inbound files to current drive and directory. */
  967. AddParameter(apszArguments, &nArgCount, "restrict");
  968. /* Generate DSZ protocol parameters from specified protocol. */
  969. if(bReceive)
  970. {
  971. switch(Protocol)
  972. {
  973. case XModem:
  974. case XModem1K:
  975. AddParameter(apszArguments, &nArgCount, "rx");
  976. break;
  977. case XModemCRC:
  978. AddParameter(apszArguments, &nArgCount, "rc");
  979. break;
  980. case YModem:
  981. AddParameter(apszArguments, &nArgCount, "rb");
  982. break;
  983. case YModemG:
  984. AddParameter(apszArguments, &nArgCount, "rb");
  985. AddParameter(apszArguments, &nArgCount, "-g");
  986. break;
  987. case ZModem:
  988. AddParameter(apszArguments, &nArgCount, "rz");
  989. break;
  990. default:
  991. assert(FALSE);
  992. }
  993. }
  994. else
  995. {
  996. switch(Protocol)
  997. {
  998. case XModem:
  999. case XModemCRC:
  1000. AddParameter(apszArguments, &nArgCount, "sx");
  1001. break;
  1002. case XModem1K:
  1003. AddParameter(apszArguments, &nArgCount, "sx");
  1004. AddParameter(apszArguments, &nArgCount, "-k");
  1005. break;
  1006. case YModem:
  1007. case YModemG:
  1008. AddParameter(apszArguments, &nArgCount, "sb");
  1009. break;
  1010. case ZModem:
  1011. AddParameter(apszArguments, &nArgCount, "sz");
  1012. break;
  1013. default:
  1014. assert(FALSE);
  1015. }
  1016. }
  1017. /* Add filename parameter to command line. */
  1018. AddParameter(apszArguments, &nArgCount, pszFilename);
  1019. /* Display prompt to user providing */
  1020. od_printf("Begin your transfer now,"
  1021. " or press [Ctrl]-[X] several times to abort.\n\r");
  1022. /* Execute command using the OpenDoors od_spawn() function. */
  1023. return(od_spawnvpe(P_WAIT, apszArguments[0], apszArguments,
  1024. NULL) == 0);
  1025. }
  1026. /* Function to add next parameter to array of parameters to pass to */
  1027. /* od_spawnvpe(). */
  1028. void AddParameter(
  1029. char **papszArguments,
  1030. int *pnCount,
  1031. char *pszNewArgument)
  1032. {
  1033. assert(*pnCount < ARGS_ARRAY_SIZE - 1);
  1034. assert(papszArguments != NULL);
  1035. assert(pnCount != NULL);
  1036. assert(pszNewArgument != NULL);
  1037. /* Add next argument to array. */
  1038. papszArguments[(*pnCount)++] = pszNewArgument;
  1039. /* Ensure that the array is always NULL-terminated. */
  1040. papszArguments[*pnCount] = NULL;
  1041. }
  1042. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  1043. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  1044. ܳ Comparing File Stamps ³
  1045. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  1046. ßßßßßßßßßßßßßßßßßßßßßßßß
  1047. By: Brian Pirie, taken from the OPENDOORS echomail conference:
  1048. > I am trying to find a way to basically look at a files date and
  1049. > then determine if it is older than say 10 days old?
  1050. > I looked thru all of my manuals, and sample programs and could
  1051. > find no examples, so I thought I would turn to the experts here.
  1052. > If anyone can give me help I would greatly appreciate it!
  1053. For others who were wondering about this problem, the program below will
  1054. display the names of all files in the current directory that are more than
  1055. 10 days old.
  1056. If you ran the program at 10:35:20 on Friday, August 5th, a file dated
  1057. 10:35:20 on Tuesday, July 26th (or later) would not be displayed, but a file
  1058. dated 10:35:18 on Tuesday, July 26th (or earlier) would be displayed.
  1059. (DOS's file time is only accurate to the nearest 2 seconds.)
  1060. **** Editor's Note: To further explain Brian's information, here is a
  1061. brief explanation of why DOS file time stamps are only accurate to the
  1062. nearest two seconds. The file's time field is set when you create the file,
  1063. and updated thereafter whenever you close the file, but *only* if
  1064. information has been written to the file. This field is not updated if
  1065. the file is merely read, copied, or renamed. When the time field gets
  1066. updated, though, the new time is retrieved from the system clock. The
  1067. following is a breakdown of the meaning of each bit in the time field:
  1068. FEDCAB98 76543210
  1069. xxxxx = Hours
  1070. xxx xxx = Minutes
  1071. xxxxx = Two second increments
  1072. The hour is contained in five bits (on a 24 hour clock), and the minutes
  1073. in six bits. Because this only leaves 5 bits in which to store the
  1074. seconds, DOS divides the actual value by two (2). A little known fact
  1075. about the file time field, is that if all bits in both bytes are set to
  1076. zero (0), the DIR command will not show any time. Ok, back to Brian's
  1077. snippet (sorry!).
  1078. Included in this file is a function named DIRToCTime(), which converts the
  1079. DOS file time format to the C time_t format.
  1080. /* This example program will display the names of all files that are */
  1081. /* more than ten days old. */
  1082. #include <dir.h>
  1083. #include <dos.h>
  1084. #include <time.h>
  1085. #include <stdlib.h>
  1086. time_t DIRToCTime(unsigned uDate, unsigned uTime);
  1087. #define SECONDS_PER_DAY (60 * 60 * 24)
  1088. main()
  1089. {
  1090. struct ffblk DirEntry;
  1091. time_t CurrentTime = time(NULL);
  1092. time_t FileTime;
  1093. double dElapsedSeconds;
  1094. double dElapsedDays;
  1095. if(!findfirst("*.*", &DirEntry, FA_ARCH))
  1096. {
  1097. do
  1098. {
  1099. /* This loop repeats for every found file ... */
  1100. /* Convert the file's time as returned by findfirst() to a time_t. */
  1101. FileTime = DIRToCTime(DirEntry.ff_fdate, DirEntry.ff_ftime);
  1102. /* Determine the number of seconds that have elapsed between the */
  1103. /* two times. */
  1104. dElapsedSeconds = difftime(CurrentTime, FileTime);
  1105. /* Determine the number of days that have elapsed. */
  1106. dElapsedDays = dElapsedSeconds / SECONDS_PER_DAY;
  1107. /* If more than ten 24-hour periods have elapsed, display filename. */
  1108. if(dElapsedDays > 10)
  1109. {
  1110. printf("%s is more than ten days old.\n", DirEntry.ff_name);
  1111. }
  1112. } while(!findnext(&DirEntry));
  1113. }
  1114. return(0);
  1115. }
  1116. time_t DIRToCTime(unsigned uDate, unsigned uTime)
  1117. {
  1118. struct tm TimeStruct;
  1119. TimeStruct.tm_sec = (uTime & 0x001f) * 2;
  1120. TimeStruct.tm_min = (uTime & 0x07e0) >> 5;
  1121. TimeStruct.tm_hour = (uTime & 0xf800) >> 11;
  1122. TimeStruct.tm_mday = uDate & 0x001f;
  1123. TimeStruct.tm_mon = ((uDate & 0x01e0) >> 5) - 1;
  1124. TimeStruct.tm_year = 80 + ((uDate & 0xfe00) >> 9);
  1125. return(mktime(&TimeStruct));
  1126. }
  1127. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  1128. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  1129. ܳ Generating Fidonet *.MSG Messages ³
  1130. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  1131. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  1132. By: Mark Williamson, taken from the OPENDOORS echomail conference:
  1133. /* NETMAIL.C : This little jewel will write send a netmail message to
  1134. the names and addresses listed in NAMES.LST. This file
  1135. has the format of:
  1136. First Lastname
  1137. Zone Node Net Point (point is optional)
  1138. example:
  1139. Mark Williamson
  1140. 1 202 750 <0>
  1141. When the program loads, it will load the editor EDIT.EXE.
  1142. Just change the line system("EDIT.EXE") to load your editor.
  1143. This program expects to find a file NET.MSG.
  1144. This program is public domain <G>.
  1145. The attribute used in this program is CRASH KILL SENT.
  1146. Look in the Fidonet Technical Specifications for the full
  1147. structures and meaning of each field.
  1148. */
  1149. #include <dos.h>
  1150. #include <stdio.h>
  1151. #include <time.h>
  1152. #include <stdlib.h>
  1153. #include <fcntl.h>
  1154. #include <alloc.h>
  1155. #include <bp.h>
  1156. #include <string.h>
  1157. static char msghdr[50],year[5],msgfile[80],firstname[30];
  1158. char *msgtext,select;
  1159. void writefido(void);
  1160. char *strrep(char *str, char *oldstr, char *newstr)
  1161. {
  1162. int OldLen, NewLen;
  1163. char *p, *q;
  1164. if(NULL == (p = strstr(str, oldstr)))
  1165. return p;
  1166. OldLen = strlen(oldstr);
  1167. NewLen = strlen(newstr);
  1168. memmove(q = p+NewLen, p+OldLen, strlen(p+OldLen)+1);
  1169. memcpy(p, newstr, NewLen);
  1170. return q;
  1171. }
  1172. /* *.MSG format: */
  1173. struct {
  1174. char from[36],
  1175. to[36],
  1176. subject[72],
  1177. datetime[20];
  1178. int timesread,
  1179. destnode,
  1180. orignode,
  1181. cost,
  1182. orignet,
  1183. destnet,
  1184. destzone,
  1185. origzone,
  1186. destpoint,
  1187. origpoint,
  1188. replyto,
  1189. attribute,
  1190. nextreply;
  1191. } Msg;
  1192. char buffer[89];
  1193. void main(void)
  1194. {
  1195. FILE *fp,*fp2;
  1196. struct tm *time_now;
  1197. time_t secs_now;
  1198. char zone[10],node[10],net[10],point[10];
  1199. /* load your editor to create/change the message. */
  1200. system("EDIT C:\\NET.MSG");
  1201. if(access("C:\\NET.MSG",0)!=0) return;
  1202. /* open the name list */
  1203. fp=fopen("C:\\NAMES.LST","rt");
  1204. if(fp==NULL) return;
  1205. time(&secs_now);
  1206. Msg.timesread=0;
  1207. Msg.cost=0;
  1208. strcpy(Msg.from,"Mark Williamson");
  1209. strcpy(Msg.subject,"Labtest Beta Message"); /* remember, the subject */
  1210. /* for a file attach message */
  1211. /* is the full path and file */
  1212. /* name of the file(s) to send
  1213. */
  1214. /* be sure to set the correct
  1215. */
  1216. /* message attribute to send */
  1217. /* or request files. */
  1218. Msg.attribute=0x0183;
  1219. /* change this to your fido address */
  1220. Msg.orignode=750;
  1221. Msg.orignet=202;
  1222. Msg.origzone=1;
  1223. Msg.origpoint=0;
  1224. Msg.replyto=0;
  1225. Msg.nextreply=0;
  1226. time_now=localtime(&secs_now);
  1227. strftime(Msg.datetime,20,"%a %d %b %y %X",time_now);
  1228. while(!feof(fp))
  1229. {
  1230. Msg.destnode=Msg.destpoint=Msg.destnet=0;
  1231. Msg.destzone=1;
  1232. if(fgets(buffer,88,fp)==NULL) break;
  1233. buffer[strlen(buffer)-1]=0;
  1234. strcpy(Msg.to,buffer);
  1235. if(fgets(buffer,88,fp)==NULL) break;
  1236. buffer[strlen(buffer)-1]=0;
  1237. zone[0]=point[0]=node[0]=net[0]=0;
  1238. sscanf(buffer,"%s %s %s %s",zone,net,node,point);
  1239. Msg.destnode=atoi(node);
  1240. Msg.destpoint=atoi(point);
  1241. Msg.destzone=atoi(zone);
  1242. Msg.destnet=atoi(net);
  1243. ultoa(bp(Msg.to,199309),registerkey,10);
  1244. fp2=fopen("C:\\NET.MSG","rb");
  1245. msgtext=(char *)malloc(filelength(fp)+1000);
  1246. memset(msgtext,0,filelength(fp)+1000);
  1247. fread(msgtext,filelength(fp),1,fp2);
  1248. fclose(fp2);
  1249. sscanf(Msg.to,"%s",firstname);
  1250. /* here are some macros to make auto replacement easier. */
  1251. /* this is great for form letters, kinda personnalizes the */
  1252. /* message.*/
  1253. strrep(msgtext,"@FIRST@",firstname);
  1254. printf("\nWriting message to: %s, %s:%s/%s%s%s",
  1255. Msg.to,
  1256. zone,net,
  1257. node,Msg.
  1258. destpoint!=0?".":"",
  1259. Msg.destpoint!=0?point:"");
  1260. writefido();
  1261. free(msgtext);
  1262. }
  1263. fclose(fp);
  1264. }
  1265. void writefido(void)
  1266. {
  1267. int count=250; /* this controls the starting point. */
  1268. /* this function will count down until */
  1269. /* finds a *.MSG. It will then increment */
  1270. /* by one and write the message. There */
  1271. /* is probably a better way, but you know. */
  1272. /* set this number higher if you have lots */
  1273. /* of netmail messages. */
  1274. char firstname[20];
  1275. FILE *fp;
  1276. tzset();
  1277. /* Fido *.msgs use a MSGID line which is preceded by */
  1278. /* a CONTROL-A. Then your fido address, a carriage */
  1279. /* return, CONTROL-A and the name of the program that */
  1280. /* created the message and version number, then another */
  1281. /* carriage return. */
  1282. strcpy(msghdr,"\x01MSGID: 1:202/750\r\x01PID: MM 1.0\r");
  1283. /* this begins our loop to find the last written */
  1284. /* netmail message in your netmail directory */
  1285. sprintf(msgfile,"C:\\RA\\MAIL\\%d.MSG",count);
  1286. while(access(msgfile,0))
  1287. sprintf(msgfile,"C:\\RA\\MAIL\\%d.MSG",--count);
  1288. /* got this far, we have a number! */
  1289. /* increment it by one to get the next available slot */
  1290. sprintf(msgfile,"C:\\RA\\MAIL\\%d.MSG",++count);
  1291. fp=fopen(msgfile,"wb");
  1292. if(fp==NULL) puts("\nError opening file...");
  1293. else
  1294. {
  1295. fwrite(&Msg,sizeof(Msg),1,fp);
  1296. fwrite(&msghdr,strlen(msghdr),1,fp);
  1297. fwrite(msgtext,strlen(msgtext),1,fp);
  1298. fwrite("\0x00",1,1,fp);
  1299. fclose(fp);
  1300. }
  1301. }
  1302. That's it! This is a simple program I wrote to send form letters to numerous
  1303. people who needed to have the same information. This could be done in
  1304. Frontdoor with the ALT-L forward command, but then it was much more fun
  1305. creating something and knowing watching it work!
  1306. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  1307. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  1308. ܳ Code Snippets! ³
  1309. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  1310. ßßßßßßßßßßßßßßßßß
  1311. Sample code to validate credit card numbers
  1312. Posted in the OPENDOORS echo by Robert La Ferte,
  1313. Original by Andrue Carr
  1314. /*
  1315. ** Testcard.c 1.0 Copyright (C) 1993 by DruId Software.
  1316. */
  1317. #include <conio.h>
  1318. #include <stdio.h>
  1319. #include <stdlib.h>
  1320. #include <string.h>
  1321. int formula(char card[23],int len);
  1322. // actual formula for creditcard!
  1323. // this can be used to build the last CRC digit by changing the len by 1
  1324. // it is mainly used to make sure the card is a correct card by verifying
  1325. // the last CRC digit against the rest of the card.
  1326. // the formula will run all the numbers in the card but the last one
  1327. // which is the CRC digit. if the number the formula kicks out is the
  1328. // same as the last digit of the card then it is a valid credit card
  1329. // if not then its not correct. this is what a ZON machine uses to
  1330. // determine if it is a good number or not. If you need more help
  1331. // let me know and i can explain this better:
  1332. // Andrue Carr: fido: 1:331/201, SL_net: 250:502/1294, ISG 91:5/201
  1333. // Acmenet: 400:508/201
  1334. // box 473, West Tisbury, mass 02575 (Over Board BBS (508)693-5344)
  1335. int formula(char card[23], int len)
  1336. {
  1337. int x,
  1338. xcard = 0,
  1339. y;
  1340. for(x = 0; x <= len; x++)
  1341. {
  1342. if(len % 2)
  1343. {
  1344. if(x % 2)
  1345. y = (card[x] - 48) * 2;
  1346. else
  1347. y = (card[x] - 48);
  1348. }
  1349. else
  1350. {
  1351. if(x % 2)
  1352. y = (card[x] - 48);
  1353. else
  1354. y = (card[x] - 48) * 2;
  1355. }
  1356. if(y >= 10)
  1357. y = (y - 10) + 1;
  1358. xcard += y;
  1359. }
  1360. x = (10 - (xcard % 10));
  1361. if(x == 10)
  1362. x = 0;
  1363. return(x); // send back the computed check digit!
  1364. }
  1365. void main(int argc, char *argv[])
  1366. {
  1367. int i = 0,
  1368. size = 0;
  1369. if(argc < 2)
  1370. {
  1371. // testcard.exe [cardnumber] if no card# then error
  1372. cputs("\007No credit card entered");
  1373. exit(1);
  1374. }
  1375. size = strlen(argv[1]);
  1376. i = formula(argv[1], (size - 2));
  1377. // check for all but crc digit
  1378. // if the number returned from formula() isnt the last digit
  1379. // of the actual card number then it isnt valid!
  1380. if(i != (argv[1][size - 1] - 48))
  1381. cputs("\007 -> Invalid Card!");
  1382. else
  1383. cputs(" -> Valid Card");
  1384. exit(0);
  1385. }
  1386. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  1387. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  1388. ܳ OpenDoors Release Notice: BCHECKERS 1.2! ³
  1389. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  1390. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  1391. BCHECKERS -- Version 1.2 -- is released!
  1392. ========================================
  1393. ** NOW SUPPORTS RA 2.00+! **
  1394. As a sysop of a FidoNet BBS, I was disappointed in the lack of a good,
  1395. non-interactive checkers door. Sure, there were some that allowed inter-
  1396. node play and the like, but these were expensive and few offered any
  1397. decent ANSI graphics and the simple ability to have callers make moves
  1398. on alternate logons. I also wanted to try my hand at programming in C,
  1399. having learned a number of other programming languages. BCheckers is the
  1400. result of this effort; and at only $10 is a bargain in shareware.
  1401. BCheckers offers the following sysop features (and more I've probably
  1402. overlooked in these docs):
  1403. - As you would expect, BCheckers monitors carrier detect functions, to
  1404. automatically recover when a user drops carrier.
  1405. - Includes a fully-adjustable inactivity timeout monitor. A warning is
  1406. sent 5 seconds before the caller is ejected.
  1407. - Share-aware file i/o for use in multi-node BBS systems. You must have
  1408. DOS's SHARE.EXE loaded for multi-node use.
  1409. - Supports most popular BBS door information files, such as DORINFO1.DEF,
  1410. EXITINFO.BBS, CHAIN.TXT, DOOR.SYS, etc.
  1411. - Displays and updates a QuickBBS-style status line, with information
  1412. available to the sysop such as user name, location, baud rate, time left,
  1413. function keys, ANSI and AVATAR settings, and so on.
  1414. - Keeps track of a user "wants-chat" indicator, just like the one in
  1415. RemoteAccess, QuickBBS and other BBS systems. Allows for sysop page from
  1416. the door, and integrated chat mode.
  1417. - Provides the sysop with all the standard function keys for adjusting user
  1418. time, hanging up on or even locking out the user -- and sysop shell to DOS.
  1419. - Full support for locked baud-rates of up to 38,400 baud, using the FOSSIL
  1420. driver for maximum compatibility with any system. If a FOSSIL is not
  1421. available, BCheckers will use its own communications routines. Auto-detect
  1422. of local operation.
  1423. - BCheckers is also DesqView and Windows aware.
  1424. New features:
  1425. - Minor bug fix to the Hall of Fame generation and key recognition code.
  1426. - Minor cosmetic improvements.
  1427. - Altered prompts slightly to alleviate problems with some modems when
  1428. using XON/XOFF handshaking.
  1429. BCHECKERS is coming soon to a DOORNET or DDSDOORS distribution site in your
  1430. area, or you can freq the latest version directly from the author at FidoNet
  1431. node 1:231/710 using the "magic name" of BCHECK. Alternatively, the door can
  1432. be downloaded from the H.O.M.E. BBS at (317)539-6579. The next release will
  1433. have a "play against the computer" mode! Upgrades will be free, but a new
  1434. registration will increase by $5. Register now, while it's still cheap!
  1435. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  1436. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  1437. ܳ OpenDoors Release Notice: BFE v4.00.2r ³
  1438. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  1439. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  1440. BFE v4.00.2r, the flexible telecommunications front end system from
  1441. Southeastern DataLINK, is now available!
  1442. BFE is a BBS front-end system that was designed to provide sysops with a
  1443. fast, efficient method of "connecting" things at the front end of their
  1444. site.
  1445. BFE features include:
  1446. * Custom multi-level menus, with RIP graphics support
  1447. * Item and/or menu level password protection with daily scheduling
  1448. * Hotkey items or SlashCommand(tm) mode
  1449. * Attractive internal menuing scheme to ease your work load
  1450. * Support for custom user menus (for aspiring sysops and artists)
  1451. * Support for popup lightbar menus
  1452. * Design and employ interactive full-screen data entry forms
  1453. * Full Multinode/Multiuser Compatibility
  1454. * Internal DOS-to-UNIX gateway! Give your users the power of UNIX.
  1455. * The gateway services can also be used to gate calls to a packet radio
  1456. * Client/server approach to the UNIX gateway. Provide interactive access
  1457. * Provide *REAL* UUCP sessions from your UNIX server to your DOS callers
  1458. * Intuitive menu-driven setup and customization facility (BFE/Setup)
  1459. * Feature packed "C" like Script system
  1460. * Run automated scripts, even offline in a maintenance role.
  1461. * WFC (Wait-For-Caller) module to handle non-mailer sites (reg. only)
  1462. * DESQview *and* MS-Windows aware
  1463. * Configurable for security concerns
  1464. * Complete carrier monitoring and timeout checking
  1465. * Use any of 11 standard dropfiles, or define custom ones
  1466. * Run as a normal door or as a frontend (Dropfile not required!)
  1467. * Complete support for ANSI/ASCII/AVATAR/RIP users
  1468. * Configurable automatic ANSI and RIP detection schemes
  1469. * File transfer system with support for external protocols
  1470. * Run remote jobs, such as batch files, programs, other doors, etc.
  1471. * Internal remote shells to the operating system
  1472. * Built in chat/paging system with hourly/daily time restrictions
  1473. * Split screen chat mode, along with line chat mode for TTY users
  1474. * *Total* configurability
  1475. What's changed since the last release?
  1476. o New mailing address and contact information for Southeastern
  1477. DataLINK:
  1478. Address: 13500 Feather Sound Circle West
  1479. Suite 1313
  1480. Clearwater, FL 34622
  1481. Data: (813) 572-6817
  1482. Voice: (813) 573-5078
  1483. Internet: [email protected] - Scott Burkett
  1484. [email protected] - Sales Q/A
  1485. [email protected] - Technical support
  1486. Fidonet: 1:3603/500
  1487. o BFE now supports "Before" and "After" scripts for each menu option
  1488. in your control files. The BEFORE scripts are called
  1489. immedicately after the user presses the key corresponding to
  1490. the menu option, but before the menu option's actions are
  1491. carried out. The AFTER scripts are executed upon completion
  1492. of the menu item selected, and before returning to the BFE
  1493. menu system. These scripts should be located in the SCRIPTS
  1494. directory (configured in BFE/Setup), and should be named as
  1495. per the following naming convention:
  1496. BEFORE scripts: <CTLFILENAME>.B<HOTKEY>
  1497. AFTER scripts: <CTLFILENAME>.A<HOTKEY>
  1498. For example, if in your MAIN control file, you have a menu
  1499. option which uses the "1" key as the hotkey, the BEFORE and
  1500. AFTER scripts would be named "MAIN.B1" and "MAIN.A1".
  1501. o NEW SCRIPT COMMANDS:
  1502. CompareStr() - Compares a string with the contents of the
  1503. internal script buffer.
  1504. o NEW SAMPLE SCRIPTS:
  1505. GETPASS.SCR - Demonstrates the use of the CompareStr()
  1506. function call.
  1507. o BFE's menu handler now sports a rudimentary line noise "filter".
  1508. o All of the text used during user system logins is now
  1509. configurable in the language file.
  1510. * BFE's internal comm routines now supports all IRQ lines from
  1511. 1 to 15. In addition, full support for 16550A FIFO buffers is
  1512. in place as well.
  1513. * The RA "personality" now accurately mimics the latest version
  1514. of the RA status line.
  1515. * Quite a bit of code cleanup in this release.
  1516. * Several additional checks are now in place for the BFE setup
  1517. sanity check, which verifies the BFE path setup.
  1518. * When opening a .CTL file under BFE/Setup, it now defaults to open
  1519. an "existing" .CTL file, instead of creating a new one. (Thanks
  1520. to George Bynum for this suggestion).
  1521. * Quite a few changes and additions in the BFE user manual (including
  1522. WFC, BFE/Gateway, and BFE/Setup).
  1523. * The "p" identifier has been removed from the end of the normal
  1524. archive naming convention, as it was confusing OS/2 users. It
  1525. has been replaced by an "r", which means "public (r)elease".
  1526. * The fossil buffers are now flushed before every gateway session
  1527. is initiated. This was inserted in order to make BFE's internal
  1528. serial gateway more "friendly" towards packet radio systems.
  1529. (Thanks to Mark Stanchin).
  1530. * A popup "dialog" box will appear whenever BFE is dropping
  1531. carrier, informing you of such.
  1532. * The WFC module for registered users will now place both the
  1533. COM port number *and* the fossil port number into the
  1534. DOBBSx.BAT files.
  1535. ! The displayfile() script function should no longer give erroneous
  1536. password prompts if a password was used to get into the script
  1537. to begin with. (Thanks to Mark Stanchin).
  1538. o A new dot command has been added to BFE/Formgen. The ".type"
  1539. keyword will direct Formgen to output information in either
  1540. "delimited" format (default), or "linear". Thanks to Dana
  1541. Meli-Wischman.
  1542. ! In certain situations, BFE would force the caller to hit a key
  1543. twice before the keystroke was registered. Squashed.
  1544. ! BFE/Gateway sessions should now properly monitor the caller's
  1545. carrier signal.
  1546. ! ANSI detection would fail under certain situations. Squashed.
  1547. o The BFE registration system has been revamped completely. If you
  1548. are a previously registered user of BFE, please contact us for your
  1549. new key file.
  1550. o Marketing strategy has been updated, and now includes three very
  1551. distinct levels of BFE registration.
  1552. o New Module: BFE/Node Monitor for DESQview systems. BFEMON is a
  1553. compact monitoring system designed for sites running BFE in a
  1554. multinode environment. This module is made available free of charge
  1555. to registered users of BFE. (+)
  1556. o New Module: BFE/WFC - The Wait For Caller module is designed to
  1557. provide a flexible method of handling inbound calls on non-mailer
  1558. nodes. It's features include:
  1559. - DESQview/Win31/OS2 Aware
  1560. - Intuitive menu-driven setup and windowed environment
  1561. - Internal screen blanker
  1562. - Full support for 50 line VGA mode
  1563. - Designed with multinode systems in mind
  1564. - Custom connect strings for FAX, UUCP, etc.
  1565. - FOSSIL driven, for maximum compatibility
  1566. - Full internal event system
  1567. The WFC module is made available free of charge to registered users
  1568. of BFE. (+)
  1569. o New subsystem: BFE/FormGen - a powerful full screen data entry form
  1570. designer is now included as part of the base BFE package.
  1571. o BFE/Setup now includes an internal user file editor. :-)
  1572. o BFE now supports non-fossil sites by providing an internal serial
  1573. communications system. This adds three new command line switches:
  1574. -i = No fossil! Use internal routines
  1575. -u = COMx Base Address (i.e. -u03F8)
  1576. -v = COMx IRQ Line (i.e. -v4)
  1577. o The time adjustment sysop keys (formerly cursor up/down) have been
  1578. remapped to pageup and pagedown.
  1579. o Multiline descriptions with embedded colors are now available. In
  1580. BFE/Setup, the description field is now two lines long. Also, BFE
  1581. now supports embedded color tokens in the description field, thus
  1582. allowing you to highlight certain portions of the description of
  1583. each menu item. ** NOTE: BFE will not automatically align the
  1584. two lines of text if the first one wraps around! This will be
  1585. taken care of in a future release, but for now, you will have to
  1586. space them out accordingly.
  1587. o When using BFE's internal files system for providing downloads,
  1588. the file "FILES.BBS" is no longer assumed. :-) Now, you must
  1589. provide the full path *AND* filename of the file to be used as the
  1590. list file. This allows you to keep your list files in one shared
  1591. directory. In addition, the full path is no longer needed in the
  1592. list files. If the path is not given, BFE will look for each file
  1593. in the directory the list file resides in.
  1594. o New Language File Keywords (Thanks to Michael Stumpp)
  1595. PASSWORD - "Enter password" prompt - Default is "Password:"
  1596. Y_CONTINUE - Key used to continue in "more" prompting
  1597. N_CONTINUE - Key used to stop in "more" prompting
  1598. S_CONTINUE - Key used to go nonstop in "more" prompting
  1599. o BFE's internal user system now has an additional mode of operation.
  1600. This "Exclusive" mode is identical to the full user system, but
  1601. will not allow new users at all. This may come in handy if you
  1602. wish to allow only "registered" users on certain nodes, or if you
  1603. run a "member's only" BBS. (Thanks to Dana Meli-Wischman).
  1604. o NEW SCRIPT COMMANDS:
  1605. FormGen() - Processes a BFE/FormGen Entry Form
  1606. SaveScreen() - Saves contents of current screen
  1607. RestoreScreen() - Restores contents of saved screens
  1608. PopupMenu() - Creates a configurable popup menu
  1609. RemoveFile() - Removes the passed filename (deletes it)
  1610. MakeCustomSem() - Creates a CUSTOM.nnn semaphore in the
  1611. IPC directory.
  1612. RemCustomSem() - Removes CUSTOM.nnn semaphore from IPC dir.
  1613. NoConsoleLogging() - Temporarily disables console logging
  1614. while in a BFE gateway session. (+)
  1615. ConsoleLogging() - Re-enables console logging in BFE gateway
  1616. sessions. (+)
  1617. DisableServerStr() - Temporarily disables BFE's remote server
  1618. strings. (+)
  1619. EnableServerStr() - Re-enables remote server strings. (+)
  1620. SetAccess() - Adjusts the caller's security level
  1621. UpdateUserRecord() - Update's user's record in user file
  1622. o RIP support updated - when BFE is displaying a RIP file to user,
  1623. the appropriate ANSI or ASCII version will be displayed locally
  1624. on the sysop's console. Note that this doesn't include the
  1625. default BFE internal menus, although it will in the future.
  1626. o A new utility called COLORUPD.EXE has been provided. This program
  1627. will read the default color configuration stored in the GLOBALS.CFG
  1628. file, and will update the color maps of all .CTL files in the
  1629. current directory. This program is distributed in the \UTILS
  1630. subdirectory in the distribution archive. The source (COLORUDP.C)
  1631. is located in the \DEVKIT subdirectory. Thanks to Keith Ross for
  1632. this suggestion.
  1633. o If using the BFE User System, BFE will now export the user's name
  1634. and password to two environment variables in the DOS master
  1635. environment upon exiting on an errorlevel (USERNAME and PASSWORD
  1636. are the new environment variables) This should make automatic
  1637. logins through BFE a bit easier, as you can now pass the name and
  1638. password on the command line to your BBS packages.
  1639. o Now, a special "log text" field is attached to each menu item.
  1640. This field serves two purposes:
  1641. - It is used in the log file for the task to describe each
  1642. event.
  1643. - It is used in the menu item selector screen in BFE/Setup,
  1644. in place of the description field.
  1645. If no log text is supplied, the normal description will be used.
  1646. o The macro system has been completely revamped, and the following
  1647. new macros are available:
  1648. %U = User's name
  1649. %W = User's password
  1650. %H = User's handle
  1651. o BFE will now periodically perform an Integrity check, to ensure
  1652. that pertinent system files have not been altered by viruses or
  1653. intruders.
  1654. o Some sample .CTL files are now included under (\SAMPLES\CTL).
  1655. These will be updated further as more features are added to the
  1656. product.
  1657. o New networking semaphore files implemented (nnn = node number):
  1658. SHELL.nnn - User/sysop in DOS shell
  1659. XFER.nnn - User transferring a file
  1660. CHAT.nnn - User either paging or in a chat session
  1661. FORMGEN.nnn - User in a BFE/FormGen Entry Form
  1662. CUSTOM.nnn - Custom user-defined semaphores
  1663. o New fields in BFE/Setup:
  1664. Default .CTL file Path (for BFE control files)
  1665. Default .FRM file Path (for BFE/Formgen files)
  1666. Default .SCR file Path (for BFE/Script files)
  1667. Default .ANS file Path (for ANS/ASC/AVT/RIP files)
  1668. o New script hook: This script will be executed automatically
  1669. if it exists when a new user has logged into the system.
  1670. * The graphics detection routines have been replaced, and should
  1671. perform much smoother now.
  1672. * Three new fields have been added to the user file. They are
  1673. handle, home phone, and work phone.
  1674. * The documentation has been completely reorganized.
  1675. * BFE will no longer automatically put a divider line in between
  1676. normal and global commands when using the internal menus. If you
  1677. want a divider line, you can just add it to the top of your
  1678. global menu. :-)
  1679. * When displaying standard ASCII files, BFE will now default to light
  1680. gray on black. In previous releases, the color of the text would
  1681. appear in the color of the user input.
  1682. * When running external processes (other doors, in particular), BFE
  1683. will now de-initialize the fossil driver, and re-initialize it upon
  1684. re-entry. This was due to the fact that some doors left the fossil
  1685. driver in quite a shabby state after exiting, so bad, in fact, that
  1686. BFE would function normally, but not be seen on the remote end!
  1687. * Gateway sessions will now flow much smoother. So smooth, in fact,
  1688. that we actually ran a SCO/UNIX UUCP session through it. :-) (+)
  1689. * BFE now tries to avoid the use of high bit ascii characters when
  1690. running with ASCII callers. If any of you have seen ANSI emulation
  1691. under UNIX terminal packages, you know why... :-)
  1692. * Password protection now covers an entire file list when downloading
  1693. from protected areas. In previous releases, the user had to enter
  1694. the password for each file. Sounds stupid, doesn't it? It was.
  1695. * Rewrote the import message file routines when using external
  1696. editors. You should no longer lose characters under certain
  1697. word wrapping conditions.
  1698. FREQ: BFE from: Southeastern DataLINK Zoom 28.8 1:3603/500 (813) 572-6817
  1699. 345K in size
  1700. FTP: ftp.csn.org:~/crlhq/bfe4002r.zip
  1701. Previously registered users of BFE should contact us through the normal
  1702. support channels (email, netmail, dialup) to request your new serialization
  1703. keys.
  1704. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  1705. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  1706. ܳ OpenDoors Release Notice: GIF View Preview Door v1.0 ³
  1707. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  1708. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  1709. Greetings All, from Lone Wolf Software!
  1710. ****************************************************************
  1711. * GIF View Preview Door *
  1712. * FileName: VUGIF10.ZIP FileSize: 590k *
  1713. ****************************************************************
  1714. FEATURES............
  1715. o Tag up to 50 GIFs for download.
  1716. o Users can convert GIF files to JPG files for fast file transfers.
  1717. o Internal file base engine for super quick file handling.
  1718. o RIPterm users can view the JPG files while ON LINE!
  1719. o Converts large GIF files to small (often less than 10k) JPG files
  1720. that transfer fast. RIPterm users can tag, convert and view GIFs
  1721. while on line in under 30 seconds at 14,400 baud.
  1722. o Non RIPterm users (ANSI callers) can use many popular graphic
  1723. file viewers like CShow or The Graphics Work Shop to view JPG
  1724. preview files to see if they want to download the actual GIF.
  1725. o State of the art sysop management tools, file base editor, and
  1726. built in GIF graphic file viewer.
  1727. o Others may say "On Line GIF Viewing", but they require you to log
  1728. off to view the graphic file, that's not on line viewing. This
  1729. door actually lets RIPterm users view the JPG / GIF while still
  1730. on line.
  1731. o Extensive use of RIP through out, both to the user and the sysop.
  1732. o Option to disable RIP on either local or remote end.
  1733. FREQ the file VUGIF10.ZIP from 1:3813/309 or call the board at
  1734. 1-918-687-1612 at speeds up to 19,200.
  1735. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  1736. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  1737. ܳ OpenDoors Release Notice: Operation: Office v0.5 ³
  1738. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  1739. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  1740. Operation: Office v0.5
  1741. ----------------------
  1742. An OmniWare Product
  1743. -------------------
  1744. by Mike Aleksiuk
  1745. Get your latest copy from...
  1746. Name: C.R.I.S.I.S. HQ
  1747. Number: 686-0449
  1748. Node Number: 1:134/31
  1749. Magic Name: OPOFF
  1750. File Name: OPOFFV05.ZIP
  1751. Place: Calgary, AB, Canada
  1752. In this exciting new game, we have you set in the unexciting
  1753. role of an "office worker". But last night you overheard your boss
  1754. talking to someone... and for no apparent reason, you decide to kill
  1755. him! The challenge is about to begin...
  1756. Supports all major dropfiles (DOOR.SYS, DORINFO?.DEF, etc).
  1757. Configure specific game settings. Usable player editor for registered
  1758. users. Unregistered users may only delete/look at the player information.
  1759. Features
  1760. --------
  1761. - chat with other players in a "one-liner" fashion
  1762. - use the phone
  1763. - listen to the radio
  1764. - many different enemies to fight, many different things to buy
  1765. - work to make money
  1766. Beta Gamma Wanna-Be
  1767. -------------------
  1768. Version 0.5 is the "Beta Gamma Wanna-Be" version of Operation:
  1769. Office. In other words, it is a gamma/wide beta, for all to test. It
  1770. is fully functioning, but still needs to be refined.
  1771. A Few Future Features
  1772. ---------------------
  1773. - personal player phone numbers!
  1774. - much more detailed fight method!
  1775. - more enemies!
  1776. Please send all comments/bug reports via FidoNet netmail to
  1777. 1:134/21.10, or conventional mail at the address stated within the
  1778. SysOp documentation. Unfortunately, I don't have the time/money to
  1779. return all of your messages... Sorry!
  1780. Mike Aleksiuk, Author of "O:O"
  1781. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  1782. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  1783. ܳ OpenDoors Tech Journal Information ³
  1784. ÛÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  1785. ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  1786. Editors: Scott Burkett
  1787. Southeastern DataLINK BBS
  1788. 1:3603/[email protected]
  1789. [email protected] (Internet EMail)
  1790. [email protected] (Internet EMail)
  1791. (813) 572-6817 28.8 Zoom!
  1792. 13500 Feather Sound Circle West
  1793. Suite #1313
  1794. Clearwater, FL 34622
  1795. Brian Pirie
  1796. BP ECOMM Systems
  1797. 1:243/[email protected]
  1798. [email protected] (Internet EMail)
  1799. 75122,2303 (Compuserve)
  1800. (613) 526-4466 14.4
  1801. 1416 - 2201 Riverside Drive
  1802. Ottawa, Ontario
  1803. Canada
  1804. K1H 8K9
  1805. Published by and for programmers and users of the OpenDoors Door
  1806. Programming Toolkit. It is a compilation of tips, reviews, and tidbits
  1807. pertaining to BBS programming and general usage. The opinions expressed
  1808. in this publication do not necessarily represent those of its editors,
  1809. the OpenDoors author, or other contributors.
  1810. OBTAINING COPIES: The latest copy of the OpenDoors Tech Journal will always
  1811. be available under the magic name of ODTJ.
  1812. SUBMISSIONS: You are encouraged to submit articles for publication in the
  1813. journal. Please send all items to one of the afore-mentioned systems via BBS
  1814. upload or mailer file/attach.
  1815. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  1816. ->< End of The OpenDoors Tech Journal - Volume 94 Issue Number 2 ><-
  1817. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ