123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805 |
- ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÜ
- ÛÛÛßßßßÛÛÛ ÛÛÛßßßÛÛÛ
- ÛÛÛ ÛÛÛ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÛÛÛ ÛÛÛ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜÜ
- ÛÛÛ ÛÛÛ ÛÛÛßÛÛÛ ÛÛÛßÛÛÛ ÛÛÛßÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛßÛÛÛ ÛÛÛßÛÛÛ ÛÛÛßßß ÛÛÛßßßß
- ÛÛÛÜÜÜÜÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛßßßß ÛÛÛ ÛÛÛ ÛÛÛÜÜÜÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ßßßßÛÛÛ
- ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛÛÛÛÛß ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛ ÛÛÛÛÛÛÛ
- ÛÛÛ
- ÛÛÛ
- ßßß Online Software Programming Toolkit
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- Programmer's Manual
- Version 6.00
- DOS and Win32 Editions
- NOTE: Since you will likely want to refer to this manual while
- working with OpenDoors, it is highly recommended that you take
- the time to print it out. Simply type COPY OPENDOOR.TXT PRN
- from your DOS prompt. With the exception of this title page,
- this document contains only 7-bit ASCII characters.
- (C) Copyright 1991 - 1996 by Brian Pirie. All Rights Reserved.
- TABLE OF CONTENTS
- CHAPTER 1 - INTRODUCTION TO OPENDOORS.......................................5
- WELCOME! ...............................................................5
- FEATURES OF THE OPENDOORS TOOLKIT ......................................6
- CHAPTER 2 - ABOUT THIS EVALUATION COPY AND ORDERING.........................9
- THE EVALUATION COPY & BENEFITS OF REGISTERING ..........................9
- HOW TO ORDER ...........................................................10
- HOW TO ORDER BY MAIL ...................................................11
- SENDING YOUR ORDER FEE IN THE MAIL .....................................12
- ORDERING BY CREDIT CARD ................................................14
- HOW YOU CAN RECEIVE YOUR ORDER .........................................15
- ORDERING THE SOURCE CODE ...............................................17
- OPENDOORS 6.00 ORDER FORM ..............................................18
- OPENDOORS 6.00 FEEDBACK FORM ...........................................19
- TERMS OF REGISTRATION AND SOURCE CODE USE ..............................20
- CHAPTER 3 - OPENDOORS TUTORIAL..............................................21
- ABOUT THIS MANUAL ......................................................21
- COMPILING A PROGRAM WITH OPENDOORS .....................................22
- LINKING WITH OPENDOORS USING A DOS COMPILER ............................23
- LINKING WITH OPENDOORS USING A WINDOWS COMPILER ........................24
- RUNNING A DOOR PROGRAM WRITTEN WITH OPENDOORS ..........................26
- RUNNING DOS-BASED DOOR PROGRAMS ........................................26
- RUNNING WINDOWS 95/NT DOOR PROGRAMS ....................................26
- BASICS OF DOOR PROGRAMMING WITH OPENDOORS ..............................29
- TOUR OF A SAMPLE DOOR PROGRAM: "EX_VOTE" ...............................33
- OTHER EXAMPLE PROGRAMS INCLUDED WITH OPENDOORS .........................38
- CHAPTER 4 - THE OPENDOORS API FUNCTIONS.....................................40
- OVERVIEW ...............................................................40
- TABLE OF MOST COMMONLY USED FUNCTIONS ..................................41
- TABLE OF ALL FUNCTIONS .................................................42
- OD_ADD_PERSONALITY() ...................................................47
- OD_AUTODETECT() ........................................................48
- OD_CHAT() ..............................................................50
- OD_CARRIER() ...........................................................51
- OD_CLEAR_KEYBUFFER() ...................................................53
- OD_CLR_LINE() ..........................................................55
- OD_CLR_SCR() ...........................................................57
- OD_COLOR_CONFIG() ......................................................59
- OD_DISP() ..............................................................60
- OD_DISP_EMU() ..........................................................62
- OD_DISP_STR() ..........................................................63
- OD_DRAW_BOX() ..........................................................65
- OD_EDIT_STR() ..........................................................68
- OD_EXIT() ..............................................................79
- OD_GET_ANSWER() ........................................................81
- OD_GET_INPUT() .........................................................82
- OD_GET_KEY() ...........................................................85
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 2
- OD_GETTEXT() ...........................................................89
- OD_HOTKEY_MENU() .......................................................90
- OD_INIT() ..............................................................92
- OD_INPUT_STR() .........................................................95
- OD_KERNEL() ............................................................97
- OD_LIST_FILES() ........................................................98
- OD_LOG_WRITE() .........................................................100
- OD_MULTILINE_EDIT() ....................................................101
- OD_PAGE() ..............................................................104
- OD_PARSE_CMD_LINE() ....................................................105
- OD_POPUP_MENU() ........................................................107
- OD_PRINTF() ............................................................110
- OD_PUTCH() .............................................................115
- OD_PUTTEXT() ...........................................................116
- OD_REPEAT() ............................................................118
- OD_RESTORE_SCREEN() ....................................................120
- OD_SAVE_SCREEN() .......................................................121
- OD_SCROLL() ............................................................123
- OD_SEND_FILE() .........................................................124
- OD_SET_ATTRIB() ........................................................128
- OD_SET_COLOR() .........................................................131
- OD_SET_CURSOR() ........................................................134
- OD_SET_DTR() ...........................................................135
- OD_SET_PERSONALITY() ...................................................136
- OD_SET_STATUSLINE() ....................................................137
- OD_SLEEP() .............................................................139
- OD_SPAWN() .............................................................141
- OD_SPAWNVPE() ..........................................................143
- OD_WINDOW_CREATE() .....................................................145
- OD_WINDOW_REMOVE() .....................................................147
- CHAPTER 5 - THE OPENDOORS CONTROL STRUCTURE.................................148
- INTRODUCTION TO THE CONTROL STRUCTURE ..................................148
- CONTROL STRUCTURE - DOOR INFO FILE STATS ...............................150
- CONTROL STRUCTURE - SERIAL PORT SETTINGS ...............................153
- CONTROL STRUCTURE - BBS AND CALLER INFORMATION .........................158
- CONTROL STRUCTURE - DOOR SETTINGS ......................................182
- CONTROL STRUCTURE - DIAGNOSTICS ........................................185
- CONTROL STRUCTURE - OPENDOORS CUSTOMIZATION ............................187
- CONTROL STRUCTURE - FUNCTION KEYS ......................................212
- CONTROL STRUCTURE - COLOR CUSTOMIZATION ................................216
- CONTROL STRUCTURE - TEXT CUSTOMIZATION .................................217
- CHAPTER 6 - SPECIAL TOPICS..................................................220
- ADDITIONAL INFORMATION ON THE WIN32 VERSION ............................220
- CONFIGURATION FILE SYSTEM ..............................................225
- DEFINING CUSTOM DOOR INFORMATION FILE FORMATS ..........................230
- MULTIPLE PERSONALITY SYSTEM ............................................233
- LOG FILE SYSTEM ........................................................235
- MAKING DOORS MULTI-NODE-AWARE ..........................................237
- CHAPTER 7 - TROUBLESHOOTING AND GETTING ASSISTANCE WITH OPENDOORS...........242
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 3
- ABOUT THIS CHAPTER .....................................................242
- TROUBLESHOOTING PROBLEMS ...............................................242
- SOLUTIONS TO COMMON PROBLEMS ...........................................244
- OPENDOORS SUPPORT ......................................................245
- THE OPENDOORS SUPPORT BBS ..............................................245
- THE OPENDOORS WORD WIDE WEB SITE .......................................246
- THE OPENDOORS CONFERENCE ...............................................246
- GETTING IN TOUCH WITH ME ...............................................247
- APPENDIX A - CONTENTS OF PACKAGE............................................249
- APPENDIX B - CHANGES FOR THIS VERSION.......................................250
- APPENDIX C - FUTURE VERSIONS................................................254
- APPENDIX D - SPECIAL THANKS.................................................255
- GLOSSARY....................................................................256
- INDEX.......................................................................267
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 4
- 11
- 111
- 11
- 11
- 11
- 11
- 1111
- -------------------------------------------------------------------------------
- CHAPTER 1 - INTRODUCTION TO OPENDOORS
- WELCOME!
- -------------------------------------------------------------------------------
- Welcome to OpenDoors! OpenDoors is a POWERFUL and EASY TO USE
- online software programming toolkit for C and C++. While
- OpenDoors is most often used to create add-on "door" programs
- that run under BBS systems, it can also be used for many other
- online software applications. By using OpenDoors, you are
- joining over 500 other programmers from around the world who
- have used it since it was first released to the public in 1991.
- Over the years, OpenDoors has grown from a simple BBS door
- programming library to what is perhaps the most sophisticated,
- widely used and supported package of its type.
- What exactly is OpenDoors? OpenDoors provides a complete system
- that allows you to quickly and easily write spectacular,
- professional quality interactive online software. With
- OpenDoors, you can write software such as BBS door programs just
- as you would write any other program - without having to worry
- about the many of the internal details of door programming.
- OpenDoors looks after communicating through the modem, providing
- ANSI/AVATAR/RIP terminal support and interfacing with a wide
- variety of BBS packages through door information files (such as
- DOOR.SYS, DORINFO1.DEF, etc.). OpenDoors also looks after status
- lines and sysop function keys for DOS shells, chatting, hanging
- up, and so on. In addition, OpenDoors carries out all the work
- involved in keeping track of carrier detection, user timeouts
- and much, much more. OpenDoors is also highly flexible, allowing
- you to take as little or as much control of your program's
- behavior as you wish.
- This package includes both DOS and Win32 versions of OpenDoors.
- This allows you to build a plain-DOS version of your program to
- run under a variety of platforms (DOS, DesqView, Windows 3.x,
- NT, 95 and OS/2), to build a Win32 version that takes special
- advantage of Windows 95 / NT, or build both versions of your
- program - the choice is yours. The DOS version of OpenDoors
- performs its serial I/O using either a FOSSIL driver, or built-
- in serial I/O capabilities, making the use of a FOSSIL driver
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 5
- optional. The Win32 version takes special advantage of 32-bit
- programming, multithreading and the Windows GUI, and allows you
- to access many services that are provided by Windows, such as
- ODBC (for database access) and MAPI (for email and messaging).
- Both the DOS and Win32 versions of OpenDoors can be run under
- both DOS and Windows-based BBS packages. The DOS version of
- OpenDoors can also be run under OS/2-based BBS packages.
- The following section provides more detailed information on the
- features and capabilities that OpenDoors provides.
- FEATURES OF THE OPENDOORS TOOLKIT
- -------------------------------------------------------------------------------
- You will find that OpenDoors provides a solid platform to build
- BBS door programs and other online software on top of. You may
- want to write simple utility door programs, on-line games or
- sophisticated applications. Perhaps you are interested in
- getting into the market of selling online software, or perhaps
- you just wish to write some custom door programs for a
- particular BBS system. With OpenDoors, you can accomplish all of
- these things - and do it much more easily than ever before. Some
- of the features that OpenDoors provides to :
- - OpenDoors handles all the "dirty" work involved in writing
- BBS door programs. Since OpenDoors looks after all the door-
- related operations for you, you need do next to nothing
- different when writing door programs than you would when
- writing any other program. You simply call OpenDoor's simple
- functions to input, output and control door operation. In
- fact, many people have converted non-door programs to door
- programs in only a matter of minutes using OpenDoors. One of
- the most common comments I receive about OpenDoors is how
- easy it is to use.
- - OpenDoors allows you to write software that DIRECTLY support
- a wide variety of BBS systems, including RemoteAccess,
- QuickBBS, PC-Board, Maximus, Opus, Wildcat!, WWIV, Spitfire,
- SuperBBS, Telegard, TriBBS, GAP, and others.
- - As you would expect, OpenDoors flawlessly monitors the
- modem's carrier detect signal, to automatically recover when
- a user hangs up - without your having to do anything extra in
- your program. OpenDoors also monitors how much time the user
- has left in the door, and provides a fully adjustable
- inactivity timeout monitor.
- - OpenDoors takes care of all the work involved in reading and
- writing BBS door information files, such as DORINFO1.DEF,
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 6
- EXITINFO.BBS, CHAIN.TXT, DOOR.SYS, etc. If the particular
- information is available to OpenDoors, it will provide you
- with just about everything you could ever want to know about
- the user on-line, the system your door is running under, and
- so on. In addition to the many door information file formats
- supported by OpenDoors, you are also able to define your own
- custom formats.
- - OpenDoors also does all the work involved in displaying and
- automatically updating the door's status line, with
- information available to the sysop such as user name,
- location, baud rate, time left, function keys,
- ANSI/AVATAR/RIP settings, and so on. Using OpenDoors, you can
- choose from a number of different "personalities". These
- personalities allows OpenDoors to mimic the status lines and
- sysop function keys used in various BBS packages. OpenDoors
- includes personalities that mimic RemoteAccess, PC-Board and
- Wildcat! OpenDoors also allows you to create your own
- personalities to mimic any other BBS system.
- - OpenDoors automatically provides the sysop with all the
- standard function keys for adjusting user time, hanging up on
- or even locking out the user, and so on. OpenDoors also
- provides you with a chat mode, which is available to the
- sysop by pressing Alt-C. In addition, OpenDoors has full
- support for sysop shell to DOS, activated by the Alt-J key.
- - What's more, OpenDoors is designed to be very easy to use.
- Even the most novice 'C' programmers are able to write
- professional-quality doors with OpenDoors. It takes care of
- just about every detail for you, yet still gives you the
- ability to completely control and customize every detail of
- your door's behavior. There are even people who begin door
- programming with OpenDoors, having never programmed in C in
- the past.
- - OpenDoors supports both FOSSIL-based and built-in serial I/O
- capabilities. FOSSIL-based serial I/O can be used for maximum
- compatibility with various systems and serial ports,
- including multiple-port serial cards such as DigiBoard.
- OpenDoors can also operate without a FOSSIL driver, using
- it's own serial I/O capabilities. OpenDoor's built-in
- asynchronous communications supports baud rates of up to
- 115,200 and non-standard serial port configurations.
- OpenDoors also has the ability to automatically detect which
- of the two serial I/O methods should be used on a particular
- system.
- - OpenDoors also automatically detects when the BBS system is
- operating in local mode, and supports full local mode
- operations itself.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 7
- - Other OpenDoors functions include a built in sysop-page
- function that will ask the user why they wish to chat, and
- then proceed to page the sysop, just as any BBS package
- would. OpenDoors also provides screen clearing functions
- (which will detect whether the user has screen clearing
- turned on), and various ANSI/AVATAR/RIP control functions
- (which again detect if the user has graphics mode turned on).
- - In addition to the basic display features of OpenDoors there
- are also a number of advanced screen control functions. These
- include functions to save and restore the entire screen,
- along with functions to save, restore or scroll portions of
- the screen. Other functions allow you to provide overlapping
- windows and pop-up menus with highlighted selection bars.
- - OpenDoors provides a multi-line text editor that you can use
- to allow the user to enter or edit text files, email
- messages, or any other text that spans multiple lines. You
- can customize many of the editor's settings to suit your
- needs.
- - OpenDoors has a number of special sub-systems that you may
- elect to include in your doors. Among these, is a log-file
- system that allows you to add log file support to your doors
- with only a single line of programming.
- - Another valuable OpenDoors sub-system is the configuration
- file system. Again using only a single line of code, you can
- add configuration file support to your doors. OpenDoors
- configuration files permit the sysop using the door to
- customize the door's behavior to their own preferences.
- - OpenDoors can also be fully customized in order that you may
- write door programs that use languages other than English.
- - Among the ANSI/AVATAR/RIP features found in OpenDoors is the
- ability to send ANSI/AVATAR/RIP files from disk. This allows
- you to easily design program screens, and incorporate them
- into your doors.
- - OpenDoors also comes with the source code for a number of
- example doors, which you can modify, or simply extract bits
- and pieces for use in your own doors. Plus, this manual
- contains many examples of C source code, to help you in
- writing nearly any door program you might wish to build.
- - You may also elect to purchase the source code for OpenDoors,
- which will permit you to make modifications to any portion of
- OpenDoors, use any portions of the OpenDoors source code in
- other programs you write, or merely learn how communications-
- type programs are written.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 8
- 2222
- 22 22
- 22
- 22
- 22
- 22
- 222222
- -------------------------------------------------------------------------------
- CHAPTER 2 - ABOUT THIS EVALUATION COPY AND ORDERING
- THE EVALUATION COPY & BENEFITS OF REGISTERING
- -------------------------------------------------------------------------------
- OpenDoors is distributed and sold using the conventional
- "shareware" approach. This complete package can be freely
- distributed, both online (through BBS systems and the Internet)
- and on CD-ROMs or other media. This gives you the chance to try
- OpenDoors before you buy it. Unlike traditional commercial
- software, you have the opportunity to see OpenDoors first-hand,
- and determine whether it meets your needs without first paying
- for it. However, before registering you are only permitted to
- use it under the following conditions:
- 1.)You may only use this package for a one month period, and
- for evaluation purposes only.
- 2.) Programs written with this package may not be distributed.
- Also, before registering, any program written with OpenDoors
- will display a message to the user indicating that OpenDoors is
- not registered. Of course, this message is removed once you have
- registered.
- If you decided to register OpenDoors, you will become the
- licensed owner of a powerful tool for creating BBS door programs
- and other online software. Registered (licensed) owners of
- OpenDoors are entitled to:
- 1.)Virtually unlimited use of OpenDoors. You may write as many
- programs as you wish using OpenDoors, and do what you please
- with these programs. They may be freely distributed, or even
- sold. What's more, there are no additional royalty fees.
- Your one time purchase of OpenDoors entitles you to use it
- as you please.
- 2.)Your registration entitles you to use both the DOS and Win32
- versions of OpenDoors.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 9
- 3.)You will also be entitled to free upgrades to newer versions
- of OpenDoors. In addition to the great many features and the
- quality that this version of OpenDoors has to offer, I am
- currently working on a great many additions and enhancements
- for the next version. (See the end of this document for an
- outline of features currently "in the works".) Any programs
- you write using this version will also automatically take on
- many of these new features when you upgrade to the new
- version.
- Perhaps the best news of all is the price of OpenDoors. Similar
- packages sell for $50, $75, or even more. However, this version
- of OpenDoors will only cost you $28 US Dollars, $34 Canadian
- Dollars, or the equivalent in your country's currency! (Note
- that this price will increase in future versions. By registering
- now, you will save by being able to upgrade to all future
- versions at no additional charge.)
- Also, the source code for OpenDoors is now available to licensed
- users for an additional $28US / $34CDN / equivalent. Ordering a
- copy of the source code will allow you to customize OpenDoors
- for your own use, making any changes or additions that you wish.
- It also gives you the opportunity to see how OpenDoors works,
- and to use any portions of the OpenDoors code in any other
- programs you wish to write. If you think you might be interested
- in ordering the OpenDoors source code, please be sure to read
- the section entitled "Ordering The Source Code", located on page
- 20.
- HOW TO ORDER
- -------------------------------------------------------------------------------
- There are to ways of ordering and OpenDoors license
- (registration):
- -The most common way to order is by mailing the OpenDoors order
- form along with a cheque, money order or cash to the address
- on this order form.
- - You may order using a major credit card. OpenDoors credit card
- orders are handled by a third-party credit card order service,
- named PsL.
- The following sections provide more information on how to order
- using each of these options.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 10
- HOW TO ORDER BY MAIL
- -------------------------------------------------------------------------------
- To order OpenDoors by mailing a cheque, money order or cash,
- simply follow these three steps:
- 1.) Fill out the registration form. Information on filling out
- the form is located on page 15.
- 2.) Send the appropriate payment, $28US/$34CDN/equivalent for
- the registration or $56US/$68CDN/equivalent for both the
- registration and source code. If you wish more detailed
- instructions on sending the registration fee, see the
- section that begins page on 12. Included in that section is
- a list of equivalent prices for a number of other
- countries.
- 3.) Send the above two items to me at:
- Brian Pirie
- 117 Cedarock Drive
- Kanata ON K2M 2H5
- Canada
- Many people who register OpenDoors also order the source code
- package. You may wish to consider the benefits of having the
- OpenDoors source code - it allows you to learn how OpenDoors and
- communications software is written, it allows you to modify and
- customize OpenDoors to suit your own preferences, and it also
- allows you to use portions of OpenDoors for other non-door
- programming projects. If you think you might also be interested
- in the OpenDoors source code, be sure to read the section on the
- source code, which begins on page 20.
- Also, you may wish to send the OpenDoors feedback form (located
- on page 19), along with your registration. The feedback form
- gives you a chance to tell me what you think of OpenDoors, and
- what changes you would like to see in future versions. In fact,
- the majority of suggestions made on these forms in the past have
- already been implemented in the current version of OpenDoors.
- If you have printed the OpenDoors manual, you can simply remove
- and mail the forms on pages 18 and 19. If you have not already
- printed a copy of the manual, and you have a printer, you can
- quickly print these forms by printing the ORDER.FRM file
- included in the OpenDoors distribution archive. (Type COPY
- ORDER.FRM PRN from your DOS prompt.)
- NO PRINTER? Alternatively, if you do not have a printer, simply send a hand-
- written version of the order form.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 11
- If you have any special instructions for me, or anything that
- you would like to say when you register, feel free to write this
- on the back of the registration form, or on a separate piece of
- paper.
- When filling out the OpenDoors registration form, be sure to
- indicate how you would prefer to receive your OpenDoors
- registration key and/or source code. The following options are
- available:
- - Having me send the registration and/or source code
- by conventional mail
- - Internet E-Mail (the fastest option)
- - By Fax
- - Having me call to your BBS
- - You calling the OpenDoors support BBS
- - FidoNet "CrashMail"
- Once you have decided which means you would prefer to receive
- your order by, please read the detailed instructions on your
- order method, below. Also, if you are ordering the source code,
- please be sure to read the section on ordering the source code,
- which begins on page 20.
- SENDING YOUR ORDER FEE IN THE MAIL
- -------------------------------------------------------------------------------
- The price of OpenDoors is 34 Canadian Dollars, 28 U.S. Dollars,
- or equivalent for the registration. The source code costs an
- additional 34 Canadian Dollars, 28 U.S. Dollars, or equivalent.
- For your convenience, the equivalent value in a number of other
- country's currencies, at the time of this writing, is as
- follows:
- -----------------------------------------------
- REGISTRATION
- REGISTRATION ONLY AND SOURCE CODE
- -----------------------------------------------
- 34 Canadian Dollars 68 Canadian Dollars
- 28 US Dollars 56 US Dollars
- 18 British Pounds 36 British Pounds
- 150 French Francs 300 French Francs
- 44 German Marks 88 German Marks
- 50 Netherland Gilders 100 Netherland Gilders
- 39 Australian Dollars 78 Australian Dollars
- -----------------------------------------------
- If you are ordering by mail, this order fee may be paid using
- any of the following methods:
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 12
- -Cheque or Money Order in Canadian currency, drawn upon a
- Canadian bank. In this case, your order fee will be either
- $34CDN for just the registration, or $68CDN for both the
- registration and source code.
- -Cheque or Money Order in U.S. currency, drawn upon a U.S. bank.
- In this case, your order fee will be either $28US for just the
- registration, or $56US for both the registration and source
- code.
- -An International Money Order or International Bank Draft
- (available from your bank, post office or companies such as
- American Express), in Canadian currency. Depending on the
- particular case, your order fee MAY be sent to me by the postal
- service, and you will mail your order form by itself. You
- should have the money order drawn in either $34CDN for just the
- registration, or $68CDN for both the registration and source
- code.
- -A cheque drawn on any bank in the world, IN THAT COUNTRY'S
- CURRENCY, equivalent to 34 Canadian dollars. For instance, a
- cheque for the appropriate number of British Pounds, drawn on a
- British bank, is perfectly acceptable. However, I am unable to
- accept a cheque for $34 Canadian dollars, drawn on a British
- Bank. UNFORTUNATELY, THE BANKS IN CANADA ARE CURRENTLY
- UNWILLING TO ACCEPT EUROCHEQUES.
- -Cash. Please note that it is not usually recommended that cash
- be sent in the mail, and that I cannot be responsible for any
- cash lost in the mail. Simply put, if you wish to order by
- cash, it is your responsibility to get the cash to me. However,
- if I do receive your order in the form of cash, it will be
- perfectly acceptable to me. I would like to mention that many
- people have already ordered OpenDoors by sending cash, and I
- have yet to run across any case of cash being lost in the mail.
- Nonetheless, if you wish to send cash, you may wish to consider
- doing so by registered mail, for your added security.
- If you are ordering OpenDoors from within Canada, you will most
- likely choose the first option (a Canadian cheque or money
- order). If you are ordering OpenDoors from within the United
- States, you will most likely choose the second option (an
- American cheque or money order). If you are ordering from
- outside Canada and the U.S., it would be ideal if you could send
- your fee by an international money order. However, it should be
- noted that any of the above order methods will be acceptable
- from any location. Also, it is quite possible that I may be able
- to accept other means of sending your order fee. If you are
- unsure about sending your order fee, please feel free to get in
- touch with me by any of the means listed on page 247.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 13
- ORDERING BY CREDIT CARD
- -------------------------------------------------------------------------------
- This information applies to CREDIT CARD ORDERS ONLY. Please read
- this entire section before ordering OpenDoors by credit card.
- In order to cover the additional costs of processing credit card
- orders, an $8 shipping and handling fee applies to all OpenDoors
- orders made through PsL. As such, the total prices you will pay
- are:
- - Just registration ($28 + $8 Handling) = $36 U.S.
- - Registration and Source Code ($56 + $8 Handling) = $64 U.S.
- (All prices will be charged to your credit card in U.S.
- Dollars.)
- You can order OpenDoors with MC, Visa, Amex, or Discover from
- Public (software) Library by calling 800-2424-PsL or 713-524-6394
- or by FAX to 713-524-6398 or by CIS Email to 71355,470. You can
- also order online through the World Wide Web. For more
- information on how to do this, visit the OpenDoors Web site.
- (Information on the OpenDoors web site is provided on page 246.)
- You can also mail credit card orders to PsL at P.O.Box 35705,
- Houston, TX 77235-5705. When ordering by phone, you must call
- between 6:00am and 6:00pm CST on Monday to Thursday, or between
- 6:00am and 12:30pm on Fridays.
- THE ABOVE NUMBERS ARE FOR CREDIT CARD ORDERS ONLY.
- THE AUTHOR OF THIS PROGRAM CANNOT BE REACHED AT THESE NUMBERS.
- Any questions about the status of the shipment of the order,
- refunds, registration options, product details, technical
- support, volume discounts, dealer pricing, site licenses, non-
- credit card orders, etc., must be directed to:
- Brian Pirie
- 117 Cedarock Drive
- Kanata ON K2M 2H5
- Canada
- To insure that you get the latest version, PsL will notify me the
- day of your order and I will ship OpenDoors directly to you. I
- will send OpenDoors by conventional mail unless I have previously
- heard from you, asking me to send your order by some other means.
- When ordering by credit card through PsL, please be sure to
- indicate whether you wish to order just the OpenDoors
- registration, or both the registration and source code. Also,
- please be sure to include your credit card billing address.
- Without this information, PsL will be unable to process your
- order.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 14
- HOW YOU CAN RECEIVE YOUR ORDER
- -------------------------------------------------------------------------------
- For your convenience, I can send your OpenDoors registration key
- and/or source code by any of the following methods. If you are
- ordering OpenDoors by mail, simply check one of these options on
- your order form. If you are ordering through the third-party
- credit card service, I will automatically send your order by
- Internet email or conventional mail unless I receive a message
- from you before you order, asking me to send it by some other
- means.
- -------------------------------------------------------------------------------
- RECEIVING If you wish to receive your OpenDoors registration key by
- ORDER BY Internet E-Mail (including Internet E-Mail to a CompuServe
- INTERNET account), fill out the order form and mail it along with your
- E-MAIL payment as described below. Be sure to include your e-mail
- address on your order form. Note that the source code cannot be
- sent via Internet e-mail.
- -------------------------------------------------------------------------------
- RECEIVING In order to receive your OpenDoors registration key and/or
- ORDER source code by conventional mail, simply fill out the order
- BY MAIL form and mail it along with your payment as described below. I
- will cover the cost of postage. If your address contains non-
- Roman characters, also enclose a self-addressed envelope or
- mailing label.
- -------------------------------------------------------------------------------
- RECEIVING If you wish to receive your OpenDoors registration key by
- ORDER BY FAX, fill out the order form and mail it along with your payment
- FAX as described below. Be sure to include your fax number on your
- order form. Do to choose this method if you are ordering the
- source code.
- -------------------------------------------------------------------------------
- RECEIVING You may choose to receive your OpenDoors registration and/or
- ORDER BY source code by calling the OpenDoors BBS after your registration
- CALLING form and order fee have been received here. If you are unable to
- OPENDOORS receive your order by any other electronic means (such as a call
- BBS to your BBS, or by electronic mail), this may be the quickest
- way for you to receive your registration information and/or
- source code. The obvious disadvantage with to option is the fact
- that you will have to estimate when your order will arrive here
- in order to receive it as quickly as possible. You may end up
- calling the OpenDoors BBS more than once before your order has
- arrived. After your order form has arrived, your registration
- key and/or source code will be placed on hold for you, and you
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 15
- will be able to receive it on your first call to the BBS. The
- phone number of the BBS is:
- +1 (613) 599-5554
- -------------------------------------------------------------------------------
- RECEIVING In order to receive your OpenDoors registration key and/or
- ORDER BY source code by a message and/or upload to your BBS, fill out
- CALL TO the order form and mail it along with your payment as described
- YOUR BBS below. Be sure to include the phone number, baud rate, and my
- login and password for the BBS to which you would like me to
- call. As always, I will cover any long distance costs. If, for
- some reason, I am unable to connect to your BBS (not because it
- is busy, but, for example, if your BBS is no longer online), I
- will send your order by conventional mail instead.
- -------------------------------------------------------------------------------
- RECEIVING In order to receive your OpenDoors registration key and/or
- ORDER BY source code by FidoNet CrashMail, simply fill out the order
- FIDONET form and mail it along with your payment as described below.
- CRASHMAIL Be sure to include the FidoNet node address to which you wish to
- have your registration key and/or source code sent to (via
- CrashMail). Again I will cover any long distance costs. If, for
- some reason, I am unable to connect to your FidoNet system, I
- will send your order by conventional mail instead.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 16
- ORDERING THE SOURCE CODE
- -----------------------------------------------------------------------------
- Many people also choose to order the source code along with
- their OpenDoors registration. Ordering the source code will
- allow you to customize OpenDoors for your own use, use parts of
- the OpenDoors source code in other programs, and learn more
- about how OpenDoors works. If you have any ideas for changes
- that you would like to see in OpenDoors, either large or small,
- ordering the source code will allow you to makes these changes
- yourself, creating your own customized version of OpenDoors. You
- will be able to remove copyright notices, change the way certain
- OpenDoors functions work, or add new capabilities to OpenDoors
- in surprisingly little time. You will also be able to use any of
- the OpenDoors source code, be it the DesqView-aware code,
- EMS/disk swapping routines, configuration file system,
- communications routines, or anything else, in any other programs
- that you write. Also, ordering the OpenDoors source code will
- allow you to learn more about how OpenDoors works, and how to
- program communications software and BBS door programs.
- When you order the OpenDoors source code, you will receive the
- source code package. The source code package also includes a
- short "Source Code Manual", with a description of how the
- OpenDoors source code is organized, instructions on how to
- recompile the source code, and more. If you choose to receive
- the source code package electronically, you will receive it in
- the form of a single .ZIP file. If you choose to receive the
- source code package by mail, you will receive it on a 3-1/2"
- diskette.
- REQUIREMENTS Due to the wide variety of compilers that are available, and the
- differences between them, I have been unable to test the
- OpenDoors source code with every compiler. This means that you
- may need to make some changes to the source code in order to
- compile it with certain compilers.
- In order to compile the DOS version of OpenDoors, you must be
- using a compiler that supports inline assembly language
- keywords. This includes all Borland compilers released since
- 1991, and many other compilers. The one notable exception is
- Watcom's compiler, which does not support inline assembly
- language at the time of this writing.
- For your information, the DOS OpenDoors libraries included with
- this package were compiled using Turbo C++ 1.0 Professional. The
- Win32 libraries included with this package were compiled using
- Microsoft Visual C++ 2.0. This means that you can be reasonably
- certain that OpenDoors will compile with these compilers and any
- more recent compilers by these companies without any changes.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 17
- --------------------------------------------------------------------------
- OPENDOORS 6.00 ORDER FORM
- --------------------------------------------------------------------------
- REGISTRATION NAME : _______________________________ (AS SHOULD APPEAR IN
- REGISTRATION)
- YOUR NAME : _______________________________ (IF DIFFERENT)
- POSTAL ADDRESS : ______________________________________________________
- ______________________________________________________
- ______________________________________________________
- E-MAIL ADDRESSES : ____________________________________ (IF APPLICABLE)
- ADDITIONAL INFO : ______________________________________________________
- (EG FAX/BBS PHONE NUMBER & BRIAN'S PASSWORD, IF NEEDED)
- I WISH TO RECEIVE MY ORDER BY:
- ___ ___
- | | - INTERNET E-MAIL (FASTEST) | | - I WILL CALL BRIAN'S BBS
- |___| |___|
- ___ ___
- | | - CONVENTIONAL MAIL | | - CALL TO MY BBS
- |___| |___| (INCLUDE LOGIN INFO)
- ___ ___
- | | - FAX (INCLUDE FAX #) | | - FIDONET "CRASHMAIL"
- |___| |___|
- ___
- I WOULD LIKE TO ORDER: | | - BOTH REGISTRATION KEY AND SOURCE CODE
- |___| ($56 US, $68 CANADIAN, OR EQUIVALENT FUNDS)
- ___
- | | - JUST MY REGISTRATION KEY
- |___| ($28 US, $34 CANADIAN, OR EQUIVALENT FUNDS)
- ___
- | | - UPGRADE TO SOURCE CODE (ONLY IF ALREADY
- |___| REGISTERED) ($28 US, $34 CANADIAN OR EQUIV.)
- I AGREE TO THE REGISTRATION TERMS, ____________________________
- SET FORTH ON PAGE 20 OF THE MANUAL (SIGNATURE)
- MAKE CHEQUES PAYABLE TO: BRIAN PIRIE
- 117 CEDAROCK DRIVE
- KANATA ON K2M 2H5
- CANADA
- +-- OFFICIAL USE ONLY ----------------------------------------------------+
- | |
- | S.N. : _____________ SENT : _________________________________________ |
- +-------------------------------------------------------------------------+
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 18
- --------------------------------------------------------------------------
- OPENDOORS 6.00 FEEDBACK FORM
- --------------------------------------------------------------------------
- YOUR NAME : _______________________________
- WHICH OPENDOORS LIBRARY(S) DO YOU EXPECT TO USE:
- ___
- | | - DOS VERSION, MEMORY MODELS: _________________________
- |___|
- ___
- | | - WINDOWS (WIN32) VERSION
- |___|
- HOW DID YOU FIRST LEARN OF OPENDOORS?
- ____________________________________________________________
- WHICH COMPILER(S) AND VERSION(S) ARE YOU USING?
- ____________________________________________________________
- WHAT DO YOU LIKE MOST ABOUT OPENDOORS?
- ____________________________________________________________
- ____________________________________________________________
- WHAT CHANGES OR ADDITIONS WOULD YOU LIKE TO SEE IN FUTURE VERSIONS?
- ____________________________________________________________
- ____________________________________________________________
- DO YOU HAVE ANY ADDITIONAL COMMENTS?
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- -----------------------------------------------------------------------------
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 19
- TERMS OF REGISTRATION AND SOURCE CODE USE
- -----------------------------------------------------------------------------
- When you purchase an OpenDoors registration and/or source code
- license, you are entitled to almost unlimited use of all
- versions of OpenDoors. However, in order to protect my
- investment of time and effort in developing OpenDoors, you must
- also agree to the terms outlined below when licensing OpenDoors
- and/or the source code. These terms are intended to be very
- reasonable, and are in no way intended to limit your use of
- OpenDoors. The primary intent of these terms is that you are not
- permitted to disclose your OpenDoors registration information,
- or the OpenDoors source code, to other individuals. The terms of
- registration and source code use are as follows:
- For the purpose of these terms, "OpenDoors" is defined to be the
- library files, header files, example programs and programmer's
- manual of all versions, past and present, for all languages and
- platforms of the OpenDoors online software programming toolkit.
- In the case of a source code license, OpenDoors also refers to
- the source code that is used to build OpenDoors. Upon licensing
- OpenDoors, the individual or organization named on the order
- form (the licensee) is entitled to use of all versions of
- OpenDoors, within the terms set forth below. Violation of these
- terms will be considered copyright infringement, and grounds for
- the termination of the registration agreement. The licensee is
- entitled, at no additional cost, to use, distribute or sell the
- executable (.EXE or .COM) files that are built from OpenDoors.
- The licensee is also entitled to use, distribute or sell the
- example programs, example configuration files and portions of
- the manual. If licensing the source code, the licensee is also
- entitled to distribute or sell any executable files that result
- from using altered versions of the source code, or portions
- thereof, provided that it is not possible for other programmers
- to access the OpenDoors API functions through this executable
- file. The licensee is NOT entitled to distribute the
- registration key number that is provided by Brian Pirie, nor any
- portions of the OpenDoors source code. For the purposes of these
- terms, an organization is considered to be a company or non-
- profit organization. If the licensee is an organization, the
- registration key and source code may be shared among members of
- the organization, under the condition that these individuals are
- using the registration and/or source code only for official
- activities of that organization. These terms in no way suggest
- an agreement on the part of Brian Pirie to develop any future
- versions of OpenDoors, or fix any bugs in current versions of
- OpenDoors. OpenDoors is offered "as is", and no warrantees are
- expressed or implied. In no event shall Brian Pirie be liable
- for any loss of profit or any other damage, including but not
- limited to special, incidental, consequential or other damages.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 20
- 3333
- 33 33
- 33
- 333
- 33
- 33 33
- 3333
- -------------------------------------------------------------------------------
- CHAPTER 3 - OPENDOORS TUTORIAL
- ABOUT THIS MANUAL
- -------------------------------------------------------------------------------
- The OpenDoors programmer's manual is intended to serve as a
- complete tutorial, guide and reference to writing programs with
- OpenDoors. Chapter 1 of this manual, beginning on page 5,
- provides an introduction and overview of the features of
- OpenDoors. If you are unsure of what OpenDoors will do for you,
- begin with Chapter 1. Chapter 2, beginning on page 9, provides
- important information related to this evaluation copy of
- OpenDoors, and how to register your copy. Chapter 3 serves as a
- tutorial on OpenDoors and BBS door programming in general.
- Chapter 4 provides a reference to the OpenDoors API functions
- which you can use in your programs. Chapter 5 provides a
- reference to the "OpenDoors control structure", which gives you
- access to a wide array of information, and allows you to
- customize OpenDoor's appearance and behavior. Chapter 6 provides
- information on special OpenDoors features and advanced door
- programming topics. Among the subjects discussed in chapter 6
- are the Win32 version of OpenDoors, configuration files, multi-
- node operation, RIP graphics, logfile support, defining custom
- door information file formats, and more.
- Chapter 7 (which begins on page 242) gives instructions on
- troubleshooting programs written with OpenDoors, lists solutions
- to common difficulties, and has information about the many
- sources for OpenDoors support. If at any time you are having
- difficulty with OpenDoors, be sure to refer to this chapter for
- complete step-by-step instruction on tracing the source of your
- problem, and for solutions to common difficulties with
- OpenDoors. This chapter also directs you to some of the major
- sources of support, including information on the OpenDoors email
- conference, the OpenDoors support BBS, and how to get in touch
- with me.
- You will also find many useful tools in this manual, which will
- no doubt come in useful while working with OpenDoors. Beginning
- on page 2 is a basic table of contents, showing you how the
- manual is organized, and helping you to locate general topics.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 21
- At the end of the manual, beginning on page 267, is an index to
- help you locate more information on specific topics. The manual
- also includes a glossary, on page 256, which will help you in
- understanding new terms that you may come across while reading
- the manual. At the end of the manual, you will also find several
- useful sections, such as information on what is new in this
- version, information on how to contact me, and information about
- new OpenDoors features currently in the works.
- You will likely want to print this manual, to make reading and
- reference while programming easier. To print this manual, simply
- type the following line from your DOS prompt. If you are worried
- about the size of this manual, you might consider using a
- utility that can print multiple pages of a text file on a single
- sheet of paper. Printing two manual pages per side of paper
- should certainly be legible, and even four-up would give you
- text about the size of average newspaper text. Printing on both
- sides, you should be able to fit the manual on about 34 sheets
- of paper (269/8 < 34).
- COMPILING A PROGRAM WITH OPENDOORS
- -------------------------------------------------------------------------------
- The process of compiling a program written with OpenDoors is
- very similar to that of compiling any other program. However,
- there are two additional steps which you must be sure to
- remember:
- 1.) You must include the OPENDOOR.H header file.
- 2.) You must link your program with the appropriate OpenDoors
- library file.
- All programs written with OpenDoors, must "include" the
- OPENDOOR.H header file. If you have placed the OPENDOOR.H header
- file in the same directory as your program's source code, place
- the following line at the beginning of your .C or .CPP file(s):
- #include "opendoor.h"
- If you have placed the OPENDOOR.H header file in the same
- directory as other standard header files (such as stdio.h),
- place the following line at the beginning of your .C or .CPP
- file(s):
- #include <opendoor.h>
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 22
- In addition to including the OpenDoors header file in your
- source code modules, you must also "link" the appropriate
- OpenDoors library file with your program. The procedure for
- doing this depends upon which compiler you are using. The
- following sections describe how to link with the OpenDoors
- libraries using various compilers.
- LINKING WITH OPENDOORS USING A DOS COMPILER
- -------------------------------------------------------------------------------
- This section describes how to link with the provided OpenDoors
- library files under a variety of DOS compilers. If you are using
- a compiler other than those described here, refer to your
- compiler's manual for information on how to link with third-
- party libraries.
- If you are using Borland Turbo C 2.00 or earlier, you can cause
- your compiler to link your program with the OpenDoors library by
- creating a text file with a .PRJ extension. In this text file,
- you should list the names of your program's .C modules, along
- with the name of the appropriate OpenDoors library file, as
- listed in the table at the end of this section. You should then
- select this Project file from within the Turbo C IDE prior to
- compiling your program.
- If you are using Turbo C++ or Borland C++, you can set your
- compiler to link your program with the OpenDoors library by
- creating a project file from within the IDE. To do this, choose
- the Open Project command from the Project menu, and enter the
- name for your new project file in the Load Project dialog box.
- Then add the names of your program's .C/.CPP modules, along with
- the name of the appropriate OpenDoors library file, by pressing
- [Insert] in the project window. When you return to Turbo C++ or
- Borland C++ again, you can work with the same project file by
- using the Open command from the Project menu.
- If you are using any Microsoft C compiler, such as Quick C,
- Microsoft C or Visual C++, you can set your compiler to link
- your program with the OpenDoors library by creating a makefile.
- You can create a new project file from within Quick C by using
- the Set Program List option from the Make menu. You can do this
- from within Visual C++ by using the New command from the Project
- menu. You should add the names of your program's .C/.CPP source
- files, along with the name of the appropriate OpenDoors library
- file, to the newly create makefile.
- There are several different DOS library files included with
- OpenDoors, each one for use with a different memory model. The
- following chart lists the library file names, along with their
- corresponding memory model. It is important that you use the
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 23
- library file which corresponds to the memory model you are
- using. Whenever you change your compiler to use a different
- memory model, it is important to rebuild all of your source
- files (using the "Build All" or "Rebuild All" command) in
- addition to changing the library that your program is being
- linked with. If you are unfamiliar with the concept of memory
- models, you should refer to your compiler's manuals. If you are
- unsure as to what memory model your compiler is currently using,
- check this setting in the compile options dialog box or command
- line reference information.
- +------------------------------------------------+
- | Library | Memory |
- | Filename | Model |
- |-------------|----------------------------------|
- | ODOORS.LIB | DOS small memory model library |
- | | |
- | ODOORM.LIB | DOS medium memory model library |
- | | (Available separately) |
- | | |
- | ODOORC.LIB | DOS compact memory model library |
- | | (Available separately) |
- | | |
- | ODOORL.LIB | DOS large memory model library |
- | | |
- | ODOORH.LIB | DOS huge memory model library |
- +------------------------------------------------+
- To understand how to compile a program written with OpenDoors,
- it is a good idea to try compiling one of the example programs,
- such as ex_hello.c, that are included in the OpenDoors package.
- LINKING WITH OPENDOORS USING A WINDOWS COMPILER
- -------------------------------------------------------------------------------
- The Win32 version of OpenDoors resides in a DLL, ODOORS60.DLL.
- In order to use OpenDoors from a Win32 program, you will
- typically link to an import library (although it is also
- possible to use load-time dynamic linking through the use of
- LoadLibrary() and GetProcAddress()). The OpenDoors package
- includes a COFF-format import library for use Microsoft
- compilers, named ODOORW.LIB. If you are using a compiler that
- uses OMF-format object files, such as a Borland compiler, you
- will need to create your own version of the odoorw.lib import
- library, by using the implib utility provided with your
- compiler.
- When compiling an OpenDoors program with a Windows compiler, be
- sure that either the WIN32 or __WIN32__ constant is defined.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 24
- Microsoft and Borland compilers define one of these constants by
- default. However, if you are using a compiler from another
- company, you may need to explicitly configure your compiler to
- define one of these preprocessor constants.
- If you are using Microsoft Visual C++ 2.0 or later, you can
- setup your compiler to link with the OpenDoors import library by
- creating a makefile (choose File|New|Project) and adding both
- your program's .C/.CPP source file(s) and the odoorw.lib import
- library to the project. When prompted for the Project type,
- choose "Application", not a "MFC AppWizard". If you are using
- Visual C++ 2.0, then you must manually edit the .mak file using
- a text editor. In this file, replace all occurrences of
- "/SUBSYSTEM:windows" with "/SUBSYSTEM:windows,4.0". This
- instructs the linker to create an executable file that is
- targeted for Windows 95. If you do not do this, some of the
- OpenDoors visual elements will not appear correctly. Later
- versions of Microsoft's compiler default to using
- "/SUBSYSTEM:windows,4.0", and so this step is no longer
- necessary with those compilers.
- If you are using Borland C++ 4.50 or later, you must create an
- OpenDoors import library for ODOORS60.DLL before you can compile
- your first OpenDoors program. To do this, go to the directory
- where ODOORS60.DLL is located, move the original odoorw.lib to a
- backup location, and issue the command:
- IMPLIB ODOORW.LIB ODOORS60.DLL
- This will create a new import library (ODOORW.LIB) which you can
- then use with your compiler. To compile an OpenDoors program
- from the command line, issue the command:
- BCC32 -tW your_program.c ODOORW.LIB
- To compile an OpenDoors program from within the IDE, create a
- new project file, and add both your program's source file(s) and
- the OpenDoors import library to that project. If you are
- compiling from within the IDE, check the TargetExpert and be
- sure that you are using the multithreaded version of the the
- runtime libraries. By default, the Borland IDE compiles single-
- threaded, which will not work with OpenDoors.
- Additional information on the Win32 version of OpenDoors is
- provided in chapter 6.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 25
- RUNNING A DOOR PROGRAM WRITTEN WITH OPENDOORS
- -------------------------------------------------------------------------------
- This section provides information on how to run a BBS door
- program that has been written with OpenDoors. If you are using
- OpenDoors to write some other form of online software, the
- information provided here will apply to different degrees,
- depending on the nature of your program.
- OpenDoors supports both local and remote modes. In the normal
- mode of operation, remote mode, your program's output will be
- displayed to both the local screen and the remote user's screen.
- To run your program in remote mode, you will usually set it up
- to run under some BBS package. However, for testing purposes, it
- is often convenient to run your program in local mode.
- There are several ways to start your program in local mode. The
- first method is to place the example DORINFO1.DEF file in the
- same directory as your program. If your program uses the
- OpenDoors command line processing function, od_parse_cmd_line(),
- then you can start your program in local mode by simply
- specifying -local on your program's command line. For example,
- you can try the example program include with OpenDoors by
- issuing the command VOTEDOS -LOCAL (for the DOS version) or
- VOTEWIN -LOCAL (for the Windows 95/NT version). OpenDoors will
- also run in local mode if you set it up to run under a BBS
- package, and log into the BBS in local mode. When the BBS runs
- your door program, OpenDoors will automatically run in local
- mode.
- To run your program in remote mode, you will probably want to
- run it under a BBS system. If you don't have a BBS package for
- testing purposes, you might want to obtain a popular BBS package
- such as Wildcat!, Maximus (which is free) or RemoteAccess.
- RUNNING DOS-BASED DOOR PROGRAMS
- -------------------------------------------------------------------------------
- DOS BBS packages typically run door programs using one of two
- methods. Either the BBS package directly loads and executes the
- program, or it exits to a DOS batch file, which in turn executes
- the door program. In either case, the BBS package produces a
- door information file, common called a "drop file", which
- provides information to the door program such as the name of the
- current user. OpenDoors automatically supports the common drop
- file formats, including DORINFOx.DEF and DOOR.SYS.
- RUNNING WINDOWS 95/NT DOOR PROGRAMS
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 26
- -------------------------------------------------------------------------------
- This section provides information specific to running door
- programs that are compiled with the Win32 version of OpenDoors.
- Please feel free to include this information in your program's
- manual.
- Since the Win32 version of OpenDoors resides in a DLL,
- ODOORS60.DLL, this file must be present on any system where your
- program will be run. Although Windows 95/NT will find this file
- if it is located in the same directory as your program's
- executable file, it is a good idea to install this DLL into the
- Windows system directory. This way, all programs using the Win32
- version of OpenDoors can share the same copy of the DLL,
- reducing the amount of disk space that is used.
- The required setup for a Windows 95/NT door will depend upon
- what BBS system it is being run under. If you the program is
- being run under a native Windows 95/NT BBS system, then ideally
- that BBS system will provide the ability to pass a live serial
- port handle to the door program, on the program's command line.
- Otherwise, you should run the door from a batch file, following
- the instructions provided below for running the program under a
- DOS-based BBS system. If the BBS system is able to pass a live
- Window communications handle on the door's command line, and you
- are using the OpenDoors standard command-line processing
- function (od_parse_cmd_line()), then you can just setup the BBS
- to run the program directly, using the command line:
- YourProgramName.exe -handle xxxxxxxxxx
- where xxxxxxxxx is the serial port handle, in decimal format.
- You do not need to use the start command, nor the DTRON utility,
- and you do not have to change the COM<n>AutoAssign setting in
- the system.ini file.
- If you are running the Win32 door program under a DOS-based BBS
- system, or a Windows-based BBS system that is unable to pass a
- live serial port handle to the door program, then follow these
- steps:
- 1.Add a line of the form "COM<n>AutoAssign=<x>" to the [386Enh]
- section of your system.ini file. Here, <n> specifies the
- serial port number that the BBS's modem is connected to, and
- <x> will usually be 0. For example, if your modem is
- connected to COM1, you would add a line such as
- "COM1AutoAssign=0" (sans quotes). You will then have to re-
- start your computer for this change to take effect. If you do
- not do this, the Windows-based door program will not be able
- to access the modem.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 27
- 2.Setup the BBS software to run the Windows-based door program
- just as you would any other door program. You will probably
- want to do this from a batch file. The command line that runs
- the Windows program should be of the form:
- start /w /m YourProgramName.exe [any command line
- parameters]
- This will cause the Windows-based door program to start in
- minimized mode, and cause the calling MS-DOS session to wait
- until the Windows program exits before continuing. If you do
- not wish the program to be started in minimized mode, remove
- the /m from the command line. If you attempt to start the
- door program by calling it directly, rather than using the
- "start /w" command, the BBS software will immediately start
- again, cause it to attempt to run simultaneously with the
- door program.
- 3.After running the start command, use DTRON.EXE or a similar
- utility to re-enable DTR detection by the modem. Normally,
- this command line will be of the form:
- dtron /port x /bps y
- Where x is the serial port number (0 for COM1, 1 for COM2,
- etc.) and y is the locked bps rate. For example, if your
- serial port is locked at 38400 bps and is connected to COM2,
- you would use:
- dtron /port 1 /bps 38400
- For full information on the DTRON utility, simply type the
- command line:
- dtron /help
- You may freely redistribute the DTRON utility that is
- included in this package with your program.
- Additional information on the Win32 version of OpenDoors, and
- further explanation of some of these steps, is provided in
- chapter 6.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 28
- BASICS OF DOOR PROGRAMMING WITH OPENDOORS
- -------------------------------------------------------------------------------
- This section provides a complete tutorial to the basics of
- writing BBS door programs using OpenDoors. If you are using
- OpenDoors to write other online software, much of this
- information will still be relevant.
- In addition to reading this section, I would encourage you to
- look at the example programs included int the OpenDoors
- packages. These programs, which are described beginning on page
- 38, will give you a much better idea of what an OpenDoors
- program will look like. These programs can also serve as a great
- starting point for writing your own programs using OpenDoors.
- Probably the best means of introduction to door programming with
- OpenDoors is by doing it yourself. As such, I strongly encourage
- you to try compiling and running the simple introduction program
- below. For instructions on compiling programs written with
- OpenDoors, see page 22.
- DOS version:
- #include "opendoor.h"
- main()
- {
- od_printf("Welcome to my first door program!\n\r");
- od_printf("Press a key to return to BBS!\n\r");
- od_get_key(TRUE);
- od_exit(0, FALSE);
- }
- Win32 version:
- #include "opendoor.h"
- int WINAPI WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)
- {
- od_printf("Welcome to my first door program!\n\r");
- od_printf("Press a key to return to BBS!\n\r");
- od_get_key(TRUE);
- od_exit(0, FALSE);
- }
- Keep in mind that even this simple program will automatically
- have all of the door capabilities we have already mentioned.
- Notice the line that reads #include "opendoor.h". All programs
- written with OpenDoors must include the OPENDOOR.H header file
- in order to compile correctly. The first two lines in the
- main/WinMain function simply call the OpenDoors od_printf()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 29
- function. od_printf() is similar to the printf() function that C
- programmers will already be familiar with. However, unlike
- printf(), the od_printf() function sends the output to both the
- modem and the local screen. Notice that the lines of text
- displayed by the od_printf() function end with a "\n\r"
- sequence, instead of the normal "\n". This is because the
- terminal emulation software that is running on the remote user's
- system usually requires both a carriage return and a line feed
- to correctly begin a new line. The next line in our example
- program is the OpenDoors single-key input function,
- od_get_key(). The TRUE value causes OpenDoors to wait for a key
- to be pressed (again, either from remote or local keyboard)
- before returning. The last line of the main/WinMain function is
- a call to od_exit(). Any program using OpenDoors should call
- this function. For the time being, you can always use the (0,
- FALSE) parameters.
- Once again, you are encouraged to try compiling and running this
- program, as described above. Congratulations, you have written
- your first door program! Feel free to make any changes to this
- program, and see what effects your changes have.
- To simplify this example, separate versions of this program are
- shown for the DOS and Win32 versions of OpenDoors. However, you
- would typically write your program so that it could be compiled
- using either the DOS or Win32 versions of OpenDoors, by
- beginning the mainline function as follows:
- #ifdef ODPLAT_WIN32
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE
- hPrevInstance,
- LPSTR lpszCmdLine, int nCmdShow)
- #else
- int main(int argc, char *argv[])
- #endif
- In case you are not entirely familiar with the operation of door
- programs, we will now provide an introduction to the internals
- of a door's operation. Keep in mind that OpenDoors automatically
- carries out most of these tasks for you. When any door program
- starts up, one of the first things it must do is to read the
- door information file(s) (sometimes called a "drop file") passed
- to it by the BBS. When a user is on-line, and wishes to run a
- door, they will most likely select a command from a menu. At
- this point, the BBS system (such as RemoteAccess, Maximus, PC-
- Board or whatever), will create a file of information about the
- system, who is currently on-line, and so on. Various BBS
- packages produce various styles of door information files.
- OpenDoors automatically recognizes and reads a wide variety of
- door information file formats. As a result, your doors will be
- able to run on a almost any BBS system.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 30
- Fortunately, OpenDoors takes care of all the work involved in
- detecting and reading the door information file, and then
- initializing and communicating with the serial port for you. In
- order to carry out these tasks, along with setting up the status
- line, and so on, OpenDoors provides a function called od_init().
- If you do not explicitly call this function, the first call to
- any other OpenDoors function (such as the first time your door
- program outputs anything) will automatically cause the od_init()
- function to be called. As a result, upon the first call to an
- OpenDoors function, all of the initialization tasks for the door
- will automatically be carried out. However, there may be times
- when you will want your program to have access information about
- the user who is on-line, or carry out other actions which
- require od_init() to have been executed - prior to the point
- where you call any other OpenDoors functions. In this case, you
- will have to call od_init() yourself before you do any of these
- things.
- OpenDoors provides you with a C/C++ structure, by the name of
- od_control, which allows you to access all the available
- information about the user who is on-line, the system your door
- is running on, and also allows you to adjust various OpenDoors
- parameters. Depending on what BBS system your door is running
- under, the actual information available from the od_control
- structure will vary. For more information on the od_control
- structure, see the section on the control structure, beginning
- on page 148.
- Once the door has initialized itself, it will then begin
- communications with the user who is online. OpenDoors takes care
- of all communications, through its various input and display
- functions. When the door has finished, it will then write any
- information that has changed back to the door information file
- (if applicable), finish communicating with the modem, and return
- to the BBS. In OpenDoors, these shut-down operations are
- automatically performed you call the od_exit() function. This
- function will terminate the door's activity, OPTIONALLY hang up
- on the user (allowing you to provide either return to BBS or
- logoff options for exiting), and then exit with the specified
- errorlevel.
- One other important OpenDoors function that you should be aware
- of is the od_kernel() function. od_kernel() is the central
- OpenDoors control function, and is responsible for much of
- OpenDoor's updating of the status line, monitoring the carrier
- detect and user timeout status, responding to sysop function
- keys, and so on. The od_kernel() function is called
- automatically by OpenDoors, within the other OpenDoors
- functions. As a result, since most door programs will call some
- OpenDoors function on a regular basis, you will most often have
- no need to call the od_kernel() function yourself. However, if
- your door is going to perform some action, such as updating data
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 31
- files, during which it will not call any OpenDoors function for
- more than a few seconds, you should then call the od_kernel()
- function yourself. For more information on the od_kernel()
- function, see page 97.
- For more information on the functions available from OpenDoors,
- or the control structure, see the corresponding sections in this
- manual.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 32
- TOUR OF A SAMPLE DOOR PROGRAM: "EX_VOTE"
- ------------------------------------------------------------------------------
- One of the best ways to see how OpenDoors works, and the
- potential that it has, is to look at the example programs
- included in the OpenDoors package. A brief description of each
- of these programs can be found on page 38. This section takes a
- closer look at one of the example programs, EX_VOTE.C. Unlike
- our simple example in the previous section, EX_VOTE.C is a much
- more complicated program, taking advantage of many of the
- advanced features of OpenDoors. Even if you do not understand
- everything that EX_VOTE.C does, you should be able to make use
- of various elements demonstrated here, in your own programs.
- The OpenDoors package includes a two compiled versions of
- EX_VOTE. VOTEDOS.EXE is a plain-DOS program which can run under
- DOS, Windows or OS/2. VOTEWIN.EXE was compiled using the Win32
- version of OpenDoors, and so it runs only on Windows 95/NT. The
- OpenDoors package also contains a sample door information file,
- DORINFO1.DEF. You can use this file to test any doors in local
- mode. If you wish to manually create your own DORINFO1.DEF file,
- you can do so very easily. The DORINFO1.DEF door information
- file is a simple text file which lists a different piece of
- information on each line, in the following format:
- +----------------------------------------------------------+
- | LINE NUMBER | DESCRIPTION | EXAMPLE |
- +-------------+------------------------+-------------------|
- | 1 | Name of the BBS | MY OWN BBS |
- | 2 | Sysop's first name | BRIAN |
- | 3 | Sysop's last name | PIRIE |
- | 4 | Com Port modem is on | COM0 |
- | 5 | Baud rate, etc. | 0 BAUD,N,8,1 |
- | 6 | Unused | 0 |
- | 7 | User's first name | JOHN |
- | 8 | User's last name | PUBLIC |
- | 9 | Caller's location | OTTAWA, ON |
- | 10 | ANSI mode (0=off, 1=on)| 1 |
- | 11 | User's security level | 32000 |
- | 12 | User's time left | 60 |
- +----------------------------------------------------------+
- Feel free to make any changes you wish to EX_VOTE.C, and
- recompile it. One of the most effective and enjoyable ways to
- learn OpenDoors is by experimenting. If you are a registered
- owner of OpenDoors, you may even distribute your own versions of
- this door. Also, you may find that EX_VOTE.C serves as a good
- framework for building your own door programs.
- The EX_VOTE.C door behaves similarly to most other door
- programs, and will have a fair bit in common with any other door
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 33
- you write in OpenDoors. What you see in the output window is
- identical to what a remote user will be seeing. If the user has
- ANSI, AVATAR or RIP mode turned on, you will see the same colors
- as they do, and if they have screen clearing turned on, your
- screen will be cleared when theirs is. The status line at the
- bottom of the window will list the name of the user currently
- on-line (if you are using the sample DORINFO1.DEF file, the
- user's name will be "The Sysop"), the user's location, and the
- user's baud rate (0 if the door is operating in local mode). The
- local display also shows how much time the user has left,
- whether the user has paged the system operator for a chat, and
- other information.
- There are a number of special commands that are only available
- to the system operator on the local keyboard. These commands
- allow the system operator to hang up on the user, adjust the
- amount of time the user may remain online, enter chat mode with
- the user, enter a DOS shell (in the DOS version), and so on. In
- the DOS version, help on these commands is available on the
- status line by pressing the [F9] key. In the Windows version,
- these commands are listed on the menu that appears at the top of
- the window.
- Now, let us take a closer look at the actual source code for the
- EX_VOTE.C door. If you have not already printed out a copy of
- this manual, and possibly the EX_VOTE.C file as well, it would
- probably be a good idea to do so now.
- Notice that near the top of the program, along with all the
- standard header files, the OPENDOOR.H file is included. This
- file must be included in all programs written under OpenDoors.
- If you are placing the OPENDOOR.H file in the same directory as
- the door you are compiling, simply include the line:
- #include "opendoor.h"
- in your program.
- The main()/WinMain() function of the EX_VOTE.C program has a
- for(;;) loop that repeatedly displays the main menu, obtains a
- choice from the user and responds to the command, until the user
- chooses to exit the program. Before the main menu is displayed,
- the screen is cleared by calling od_clr_scr(). The od_clr_scr()
- function will clear both the local and remote screens, but only
- if the user has screen clearing enabled. Refer to page 57 for
- information on how to force the screen to be cleared, regardless
- of the user's screen clearing setting. The main menu is
- displayed using the od_printf() function, one of the most common
- OpenDoors functions you will use. Next, od_get_answer() is used
- to obtain a menu choice from the user from the specified set of
- keys. Next, a switch() statement is used to respond to the
- user's command appropriately. If the user presses the P key to
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 34
- page the system operator, od_page() is called. If the user
- chooses to return to the BBS, od_exit() is called to terminate
- OpenDoor's activities and return control to the BBS. The FALSE
- parameter passed to od_exit() indicates that OpenDoors should
- not disconnect (hangup) before exiting. If the user chooses to
- log off, EX_VOTE.C first confirms this action with the user, and
- then calls od_exit() with the TRUE parameter. The numerical
- parameter passed to od_exit() sets the errorlevel that OpenDoors
- will exit with.
- In its ChooseQuestion() function, EX_VOTE.C uses the OpenDoors
- function od_get_key(). This function is similar to the
- od_get_answer() function that we have already seen. However,
- unlike od_get_answer() which will wait until the user presses
- some key from the list of possibilities you provide,
- od_get_key() will allow the user to press any key. od_get_key()
- accepts a single parameter. If this parameter is TRUE,
- od_get_key() will wait for the user to press a key before
- returning. If this parameter is FALSE, od_get_key() will return
- immediately with a value of 0 if there are no keys waiting in
- the inbound buffer, and returning the next key if there are
- characters waiting.
- In a number of places, EX_VOTE.C also uses the od_input_str()
- function. Unlike od_get_key() and od_get_answer() which return a
- single character, od_input_str() allows the user to input and
- edit a string of many characters. You will only receive the
- string entered by the user after they press the enter key.
- od_input_str() accepts four parameters: the string where the
- user's input should be stored, the maximum number of characters
- to input, the minimum character value to accept and the maximum
- character value to accept.
- Another new feature of OpenDoors that is used by EX_VOTE.C is
- the OpenDoors control structure, od_control. This global
- structure is documented in chapter 5 of this manual. The
- OpenDoors control structure allows you to access a wide variety
- of information about the user who is currently online, the BBS
- system your program is running on, and also allows you to
- control various OpenDoors settings. For example, EX_VOTE.C
- compares the current user name (od_control.od_user_name) with
- the name of the system operator (od_control.od_sysop_name) to
- determine whether it is the system operator who using the
- program.
- EX_VOTE.C uses two data files, the first of which contains a
- record for every user, and the second of which contains a record
- for every question. EX_VOTE.C accesses these data files in a
- controlled manner in order to permit the program to be running
- simultaneously on multiple lines on a multi-node BBS system.
- When EX_VOTE.C needs to update a data file, it opens it for
- exclusive access, so that only one node can access the file at
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 35
- any given time. Since the data file could have been changed by
- another node since the time that EX_VOTE.C last read the file,
- it always reads a record, makes changes to it and then re-writes
- the record while it has the file open for exclusive access. It
- then closes the file as soon as possible after opening the file,
- in order to permit other nodes to once again access the file.
- Because EX_VOTE.C keeps track of which questions each user has
- voted on, along with the questions and results of voting on each
- question, its data file format is more complex than many door
- programs (although not as complex as others).
- EX_VOTE.C also uses color. One of the easiest ways to use
- different colors in an OpenDoors program is to use the
- OpenDoor's print color-setting extensions. You can change the
- color of text display at any point in an od_printf() format
- string using by enclosing the name of new display color in back
- quote characters (`, not '). For example:
- od_printf("`red`This is in red `green`This is green\n\r");
- Would cause the words "This is in red" to be displayed in red,
- and the words "This is in green" to be displayed in green.
- EX_VOTE.C also takes advantage of a number of OpenDoors
- capabilities that you can optionally choose to include in your
- door programs. You will notice that there are a number of new
- lines at the beginning of the main() function, all of which
- change settings in the OpenDoors control structure. The line:
- od_control.od_config_file = INCLUDE_CONFIG_FILE;
- causes the OpenDoors configuration file system to be included in
- your program. Using this system, OpenDoors automatically reads a
- configuration file that can be used by the system operator to
- change various program settings. Refer to the included door.cfg
- file for an example OpenDoors configuration file. In addition to
- the configuration file settings automatically supported by the
- configuration file system, you can also add your own
- configuration file settings. To do this, you simply supply
- OpenDoors with a callback function that it will call whenever it
- encounters an unrecognized keyword in the configuration file.
- The line:
- od_control.od_config_function = CustomConfigFunction;
- Causes OpenDoors to call the function CustomConfigFunction() in
- EX_VOTE.C for this purpose. You will notice that the
- CustomConfigFunction() receives two parameters - the first is
- the unrecognized keyword, and the second is any parameters that
- follow the keyword in the configuration file. EX_VOTE.C checks
- for two special configuration file lines - one to set whether or
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 36
- not users can add questions, and one to set whether or not users
- can view the results of a question before voting on it.
- The next line in the main() function,
- od_control.od_mps = INCLUDE_MPS;
- causes the OpenDoors "Multiple Personality System" to be
- included in program. This allows the sysop to choose from a
- number of status line / sysop function key "personalities" that
- mimic a number of different BBS systems, using the Personality
- setting in the configuration file.
- The line:
- od_control.od_logfile = INCLUDE_LOGFILE;
- causes the OpenDoors log file system to be included in the
- program. The OpenDoors log file system automatically records the
- date and time of program startup, exit and other major actions
- in the specified file. EX_VOTE.C also writes its own log file
- entries by calling the od_log_write() function.
- EX_VOTE.C also provides the ability for the sysop to provide
- their own ASCII/ANSI/AVATAR/RIP files to be displayed in place
- of the normal main menu. EX_VOTE.C uses the od_hotkey_menu()
- function to display a VOTE.ASC/.ANS/.AVT/.RIP file for the main
- menu, if such a file exists. If the file is not available, the
- normal EX_VOTE.C menu is used instead. The od_hotkey_menu()
- function will automatically select the appropriate file
- (.ASC/.ANS/.AVT/.RIP) for the current display mode, and the user
- is able to make a menu choice at any time. If a menu choice is
- made before the menu is entirely displayed, the function will
- stop displaying the menu and return immediately.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 37
- OTHER EXAMPLE PROGRAMS INCLUDED WITH OPENDOORS
- ------------------------------------------------------------------------------
- In addition to the EX_VOTE.C program, which is discussed in
- detail in the previous section, a number of other example
- programs are included with OpenDoors. These programs help to
- demonstrate what is possible with OpenDoors. They can also serve
- as excellent tools to help you learn OpenDoors. In addition, you
- are free to include any portions of any of these example
- programs in your own programs. Below is a summary of each of
- these example programs:
- -------------------------------------------------------------------------------
- EX_HELLO.C This an example of a very simple door program that displays a
- short message and prompts for the user to press a key. After the
- user presses a key, the door exits and control is returned to
- the main BBS software. Despite the fact that it only consists of
- a few lines of code, EX_HELLO remains a fully functional door
- program. For information on compiling an OpenDoors door program,
- see the section that begins on page 22.
- -------------------------------------------------------------------------------
- EX_CHAT.C This program is an example of a multi-window full-screen chat
- door written with OpenDoors. EX_CHAT demonstrates the ease of
- using sophisticated ANSI / AVATAR / RIP terminal features within
- OpenDoors programs. For instructions on how to compile this
- program, see the section that begins on page 22.
- This program create two windows on the screen, separated by a
- bar with user name / sysop name information. This program
- permits communication between the local sysop and remote user by
- displaying the text typed by the user in one window, and the
- text typed by the sysop in the other window. When either
- person's typing reaches the bottom of the window, the contents
- of the window is scrolled up to provide more room for typing.
- Words are also wrapped when either typist reaches the end of a
- line. The advantage of a split-screen chat program is that it
- permits both sysop and user to type at the same time without
- difficulty. The chat function automatically invokes OpenDoor's
- internal chat mode if ANSI, AVATAR or RIP modes are not
- available. The display colors, window sizes and locations, and
- distance to scroll a window's contents are configurable by
- setting the appropriate variables, below. When the Sysop invokes
- a DOS shell, a pop-up window is displayed to indicate to the
- user that the door program has been suspended.
- The chat feature of this program can also be easily integrated
- into other doors you write, and may be used to replace the
- existing OpenDoors line-oriented chat system.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 38
- -------------------------------------------------------------------------------
- EX_MUSIC.C This example door demonstrates how to play "ANSI" music and
- sound effects in an OpenDoors door. Included in this program is
- a function to send "ANSI" music to the remote system, and a
- function to text the remote system's ability to play "ANSI"
- music. You may use both of these functions in your own doors, if
- you wish to add music or sound effect capabilities. This program
- can be compiled by following the instructions that begin on page
- 22.
- -------------------------------------------------------------------------------
- EX_SKI.C This is a simple but addictive online game that is written using
- OpenDoors. In this action game, the player must control a skier
- through a downhill slalom course. The user may turn the skier
- left or right, and the game ends as soon as the player skis
- outside the marked course. The game begins at an easy level, but
- quickly becomes more and more difficult as the course to be
- navigated becomes more and more narrow. The game maintains a
- list of players with high scores, and this list may be viewed
- from the main menu.
- -------------------------------------------------------------------------------
- EX_VOTE.C The EX_VOTE.C file contain the source code for the Vote example
- door, as is described beginning on page 38. The Vote example
- door allows users to vote on up to 200 different "polls", view
- the results of voting on each question, and optionally add their
- own questions for other users to answer.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 39
- 444
- 4444
- 44 44
- 44444444
- 44
- 44
- 44
- -------------------------------------------------------------------------------
- CHAPTER 4 - THE OPENDOORS API FUNCTIONS
- OVERVIEW
- ------------------------------------------------------------------------------
- OpenDoors provides a wide set of features that you can take
- advantage of in your program. You control these features and
- access OpenDoors from your program using two facilities - the
- OpenDoors API functions, and the OpenDoors control structure. In
- general, the API functions are used to actually accomplish a
- task, such as displaying something to the user, or retrieving
- input from the user. The OpenDoors control structure, on the
- other hand, is used to alter OpenDoors settings or retrieve
- specific information.
- Any program written with OpenDoors makes use of the OpenDoors
- API functions for all of its door-related input and output. In
- addition to the common input and output tasks, the OpenDoors API
- functions provide access to many special capabilities, such as
- displaying ASCII/ANSI/AVATAR/RIP files, providing pop-up windows
- and menus, and much more. Much of the information about the user
- who is online, information about the system your door is running
- on, and settings which customize OpenDoor's behavior are
- controlled through the OpenDoors control structure. The control
- structure is described in the section beginning on page 148.
- This chapter is divided into the following sections:
- i.) TABLE OF MOST COMMONLY USED FUNCTIONS (Page 41)
- ii.) TABLE OF ALL OPENDOORS FUNCTIONS (Page 42)
- iii.) DETAILED INFORMATION ON EACH FUNCTION (Pages 47 - 147)
- The two tables list the names of the OpenDoors functions, along
- with a brief description of the task performed by each function,
- and the page number on which the detailed description of that
- function can be found. The first table lists only the most
- commonly used OpenDoors functions, to allow you to quickly find
- the function you are most likely looking for. The second table
- lists all of the OpenDoors functions, grouped according to
- general categories of functionality.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 40
- The section containing detailed information lists all of the
- functions in alphabetical order, with the information about each
- function beginning on a new page. This section includes a brief
- description of each function's purpose, a detailed description
- of how to use the function, the function call format, a list of
- related functions, and in many cases example source code showing
- you a typical use of the function.
- TABLE OF MOST COMMONLY USED FUNCTIONS
- ------------------------------------------------------------------------------
- od_printf() Displays text, with the ability to change
- display color. (page 110)
- od_clr_scr() Clears the screen. (Page 57)
- od_input_str() Inputs a string of one or more characters
- from the user. (Page 95)
- od_get_answer() Inputs a single key from a list of possible
- choices ignoring upper/lower case. (Page 81)
- od_get_key() Inputs any single key from the user.
- (Page 82)
- od_set_cursor() Positions the cursor in ANSI/AVATAR/RIP
- modes. (Page 134)
- od_hotkey_menu() Displays an ASCII/ANSI/AVATAR/RIP file, with
- the option of watching for a keypress from
- the user. (Page 90)
- od_popup_menu() Displays a popup menu in ANSI/AVATAR/RIP
- modes. (Page 105)
- od_window_create() Creates a popup window in ANSI/AVATAR/RIP
- modes. (Page 145)
- od_window_remove() Removes a popup window in, restoring screen
- contents "underneath" window. (Page 147)
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 41
- TABLE OF ALL FUNCTIONS
- -------------------------------------------------------------------------------
- OUTPUT TEXT DISPLAY FUNCTIONS
- FUNCTIONS ----------------------
- od_disp_str() Displays a normal, NULL-terminated
- string. (page 63)
- od_disp() Sends the specified number of
- characters to the modem, with or
- without local echo. (page 60)
- od_printf() Performs formatted output, as the
- printf() function does. Also allows
- imbedded codes to change display color.
- (page 110)
- od_putch() Displays a single character. (page 115)
- od_disp_emu() Displays a string, interpreting
- imbedded ANSI/AVATAR terminal emulation
- codes. (page 62)
- od_repeat() Displays the same character any number
- of times, using AVATAR optimization, if
- possible. (page 118)
- COLOR AND CURSOR CONTROL
- ------------------------
- od_set_color() Sets current color to specified
- foreground and background settings.
- (page 131)
- od_set_attrib() Sets current color to specified IBM-PC
- display attribute. (page 128)
- od_set_cursor() Sets the position of the cursor, if
- ANSI/AVATAR/RIP mode is enabled. (page
- 134)
- SCREEN MANIPULATION
- -------------------
- od_clr_scr() Clears the screen, if user has screen
- clearing enabled. (page 57)
- od_save_screen() Stores the current contents of the
- screen, to be later redisplayed using
- od_restore_screen(). Works in all
- display modes. (page 121)
- od_restore_screen() Restores the contents of the screen, as
- previously stored using
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 42
- od_save_screen(). Works in all display
- modes. (page 120)
- BLOCK MANIPULATION
- ------------------
- od_clr_line() Clears the remainder of current line.
- (page 55)
- od_gettext() Stores any area of the screen, to later
- be displayed by od_puttext(). Requires
- ANSI/AVATAR/RIP graphics mode. (page
- 89)
- od_puttext() Displays text with color information,
- as previously stored using
- od_gettext(). Requires ANSI/AVATAR/RIP
- graphics mode. (page 116)
- od_scroll() Scrolls a portion of the screen in
- ANSI/AVATAR/RIP graphics modes. (page
- 123)
- POPUP WINDOWS AND MENUS
- -----------------------
- od_draw_box() Draws a box on the screen in
- ANSI/AVATAR/RIP graphics mode. (page
- 65)
- od_window_create() Displays a popup window, storing the
- screen contents "under" the window.
- Requires ANSI/AVATAR/RIP graphics mode.
- (page 145)
- od_window_remove() Removes a popup window displayed with
- od_window_create(), restoring the
- original screen contents "under" the
- window. Requires ANSI/AVATAR/RIP
- graphics mode. (page 147)
- od_popup_menu() Displays a menu in a popup window,
- allowing the user to choose menu items
- either by pressing a "hot" key, or
- moving a highlighted selection bar.
- After menu selection, the menu may be
- removed, restoring the original screen
- contents "under" the window. Requires
- ANSI/AVATAR/RIP graphics mode. (page
- 105)
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 43
- FILE DISPLAY FUNCTIONS
- ----------------------
- od_send_file() Displays an ASCII/ANSI/AVATAR/RIP file
- (for instance, an .ANS file created by
- a program such as "TheDraw" (page 124)
- od_hotkey_menu() Displays an ASCII/ANSI/AVATAR/RIP menu
- file, with hotkeys active. (page 90)
- od_list_files() Lists the files available for download
- in an area, using a FILES.BBS file.
- (page 98)
- -------------------------------------------------------------------------------
- INPUT od_get_answer() Inputs a single key from the keyboard,
- FUNCTIONS allowing only particular responses.
- (page 81)
- od_get_input() A more flexible version of
- od_get_key(), that also supports
- extended keys such as arrow keys,
- insert, etc. (page 82)
- od_get_key() Inputs a single key from the keyboard,
- optionally waiting if a key is not
- available. (page 82)
- od_input_str() Inputs a string of specified length,
- from the keyboard. (page 95)
- od_edit_str() Formatted string editing function,
- requiring ANSI/AVATAR/RIP graphics.
- (page 68)
- od_multiline_edit() Provides a text editor that allows the
- user to enter or edit text that spans
- multiple lines, such as email messages
- or text files. (page 101)
- od_clear_keybuffer() Removes any waiting keys from the
- keyboard input queue. (page 53)
- -------------------------------------------------------------------------------
- COMMON od_page() Allows the user to page the sysop.
- DOOR (page 101)
- ACTIVITY
- FUNCTIONS od_spawn() OpenDoors "quick" spawn function.
- Executes an external program (eg. file
- compressor, external protocol, etc.) on
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 44
- a separate screen, restoring the
- OpenDoors screen afterwards. (page 139)
- od_spawnvpe() OpenDoors full-featured spawn function.
- Executes an external program on a
- separate screen, searching the path for
- the program, allowing you to specify an
- environment to pass to the child
- process, and returning the errorlevel
- returned by the child process. (page
- 143)
- od_log_write() Adds an entry to the end of the log
- file. (page 100)
- od_parse_cmd_line() Handle standard command line options.
- (page 105)
- -------------------------------------------------------------------------------
- SPECIAL od_init() Begins door operation by setting up
- CONTROL the OpenDoors control structure,
- FUNCTIONS setting up the local screen,
- initializing the serial port (if
- applicable), and reading the door
- information file. (page 92)
- od_color_config() Transfers a color configuration line to
- a color attribute value. (page 59)
- od_add_personality() Adds a custom status line/control key
- personality to OpenDoors. (page 47)
- od_set_statusline() Temporarily alters the setting of the
- current OpenDoors status line. (page
- 137)
- od_autodetect() Automatically determines the remote
- terminal software's graphical
- capabilities. (page 48)
- od_kernel() The central OpenDoors control function,
- which should be executed every few
- seconds. (page 97)
- od_exit() Ends door operations, closing the
- serial port driver, re-writing the door
- information file, and optionally
- returning control to the BBS. (page 79)
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 45
- od_carrier() Allows detection of carrier signal in
- programs that have disabled OpenDoors
- internal checking. (page 51)
- od_set_dtr() Controls the DTR signal to the modem.
- Can be used to manually disconnect a
- remote user, in order to perform
- activities such as call back
- verification. (page 135)
- od_chat() Forces OpenDoors to enter chat mode,
- even if sysop did not press the "chat"
- key. (page 50)
- od_sleep() Suspends program execution, yielding
- control to other tasks in a
- multitasking environment. (page 139)
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 46
- OD_ADD_PERSONALITY()
- -------------------------------------------------------------------------------
- PURPOSE Installs a custom status line / sysop function key personality
- into OpenDoors.
- FORMAT BOOL od_add_personality(char *pszName, BYTE btOutputTop,
- BYTE btOutputBottom, OD_PERSONALITY_PROC *pfPerFunc);
- RETURNS TRUE on success
- FALSE on failure
- DESCRIPTION If used, this function should be called before any other
- OpenDoors API functions. This function installs a new
- personality into OpenDoors. The first parameter specifies the
- string that will be used to identify the personality. This is
- the string that the user will be able to supply in the
- configuration file to select this personality, and is also the
- string that can be passed to od_set_personality() to manually
- switch to this personality. The second and third parameters
- specify the 1-based to and bottom line numbers of the output
- window to be used with this personality. For instance, a top
- value of 1 and bottom value of 23 would cause all door output to
- be displayed on the first 23 lines of the screen, leaving the
- bottom two lines for use by the personality's status line. The
- last parameter is a pointer to the personality function, which
- OpenDoors will call to perform various operations with that
- involve the personality. For more information on personalities
- and the OpenDoors Multiple Personality System, see the section
- which begins on page 233.
- This function only has an effect under the DOS version of
- OpenDoors.
- SEE ALSO od_set_personality(), od_set_statusline()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 47
- OD_AUTODETECT()
- -------------------------------------------------------------------------------
- PURPOSE Attempts to automatically determine the terminal capabilities of
- the remote system.
- FORMAT void od_autodetect(int nFlags);
- RETURNS N/A
- DESCRIPTION This function can be used to determine whether or not the remote
- terminal supports ANSI and/or RIP (Remote Imaging Protocol)
- graphics modes. This information is usually supplied to the door
- by the BBS software, through the door information file. For this
- reason, most door programs do not need to make used of this
- function. However, if your door will be running under any BBS
- software that does not report the ANSI or RIP capabilities of
- the remote system, you may wish to use this function.
- od_autodetect() will set either of the following OpenDoors
- control structure variables to TRUE if the corresponding
- graphics mode is detected:
- od_control.user_ansi - TRUE if ANSI mode is available
- od_control.user_rip - TRUE if RIP mode is available
- However, if either of these variables have previously been set
- to TRUE (either explicitly by your program, or due to the
- corresponding modes being enabled in the door information file),
- and od_autodetect() does not detect the corresponding graphics
- mode, they will not be set to FALSE. Not all terminal software
- that supports ANSI or RIP graphics mode will necessarily have
- the ability to report their graphics mode capabilities to the
- door. For this reason, failure to detect either of these modes
- does not necessarily indicate that they are not available.
- However, if these modes are detected by od_autodetect(), it is
- safe to assume that the remote system does support the detected
- mode.
- The nFlags parameter is reserved for future use, and should
- always be set to DETECT_NORMAL.
- This function cannot auto-detect AVATAR mode, because there is
- no standard means of determining whether a remote system
- supports AVATAR mode.
- EXAMPLE Below is an example of using od_autodetect() in determining the
- remote terminal's graphics capabilities. Since not all terminal
- software supports auto-detection, this example will also prompt
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 48
- the user to determine their software's capabilities if
- od_autodetect() fails to detect ANSI mode. This code assumes
- that if the terminal software supports the autodetection of ANSI
- mode, that it will also support the autodetection of RIP mode.
- OpenDoors assumes that ANSI mode is always available in
- conjunction with RIP mode.
- /* Call the automatic terminal detection function */
- od_autodetect();
- /* If ANSI mode was not detected, ask the user about
- if(!od_control.user_ansi)
- {
- /* Prompt the user for ANSI capabilities */
- od_clr_scr();
- od_printf("Does your system support ANSI graphics?");
- od_printf(" (Y/N)");
- /* If the user chooses [Y]es */
- if(od_get_answer("YN") == 'Y')
- {
- /* Turn on ANSI mode */
- od_control.user_ansi = TRUE;
- /* Since ANSI mode is present, RIP mode may also */
- /* be available. Prompt the user for RIP. */
- od_printf("\r\n\n");
- od_printf("Does your system support RIP graphics?");
- od_printf(" (Y/N)");
- /* If the user chooses [Y]es */
- if(od_get_answer("YN") == 'Y')
- /* Turn on RIP mode */
- od_control.user_rip = TRUE;
- /* Since ANSI mode is present, AVATAR mode may */
- /* also be available. Prompt the user for AVATAR. */
- od_printf("\r\n\n");
- od_printf("Does your system support AVATAR ");
- od_printf("graphics? (Y/N)");
- /* If the user chooses [Y]es */
- if(od_get_answer("YN") == 'Y')
- /* Turn on AVATAR mode */
- od_control.user_avatar = TRUE;
- }
- od_printf("\r\n\n");
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 49
- OD_CHAT()
- -------------------------------------------------------------------------------
- PURPOSE Manually invokes sysop chat mode.
- FORMAT void od_chat(void);
- RETURNS N/A
- DESCRIPTION Normally, the OpenDoors sysop chat mode will only be invoked
- when the sysop explicitly requests it using the sysop chat key.
- However, there may be some cases where you wish to manually
- invoke the sysop chat mode. One example is when you are
- replacing the OpenDoors built-in chat mode with your own, but
- still wish to use the OpenDoors chat mode under some
- circumstances. For instance, you may wish to use your own split-
- screen chat routine if ANSI, AVATAR or RIP graphics mode is
- available, and use the OpenDoors line-oriented chat mode if only
- ASCII mode is available.
- SEE ALSO od_page()
- EXAMPLE For an example of using the od_chat() function, see the
- ex_chat.c example door, which is described on page 38.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 50
- OD_CARRIER()
- -------------------------------------------------------------------------------
- PURPOSE To determine the status of the carrier detect signal, in
- programs where OpenDoors' internal carrier detection has been
- disabled.
- FORMAT BOOL od_carrier(void);
- RETURNS TRUE if a carrier is present, or
- FALSE if no carrier is present, or in local mode.
- DESCRIPTION Usually, you will not have any use for the od_carrier()
- function, as OpenDoors automatically monitor's the carrier
- detect signal, and will correctly recover if the carrier detect
- signal is lost while the door is operating in remote mode.
- However, in some programs, you may wish to disable OpenDoors'
- internal carrier detection routines, using the
- od_control.od_disable variable. Two such cases in which you
- might want to do this, are a call-back verification door, which
- disconnects the user and attempts to call them back, or in a
- terminal program, which is in fact not a door at all (and as
- such you would not want to have OpenDoors exit when the carrier
- detect signal is lost). In cases like these, you will then be
- able to use the od_carrier() function in order to determine the
- state of the carrier detect signal.
- This function will return a Boolean value (for more information
- on Boolean values, see the Glossary which begins on page 256),
- of either TRUE or FALSE. If a carrier detect signal is present
- when the function is called, it will return TRUE, and if no
- carrier detect signal is detected, it will return FALSE. Since
- there is no remote connection, and thus no carrier when
- OpenDoors is operating in local mode, this function will always
- return a value of FALSE in local mode.
- SEE ALSO od_set_dtr()
- EXAMPLE As an example of the use of this function, let us consider a
- call back verification door, which hangs up on the user, and
- then calls the user back at their entered phone number, in order
- to verify the correctness of that number. This program would
- probably contain a function that is responsible for
- disconnecting the user, waiting for the connection to be broken,
- and then phoning the user. At some point in this function,
- likely just prior to the point where the function hangs up on
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 51
- the user, you would disable OpenDoors' internal carrier
- detection, using the line:
- od_control.od_disable |= DIS_CARRIERDETECT;
- You would then want to have a piece of code which would simply
- wait up to a given amount of time for the carrier signal to
- drop. If this occurs, you would continue to place the call, and
- if it does not occur, you would probably try your hangup
- procedure one or two more times. In this example, the function
- will return with a value of FALSE if the carrier signal does not
- drop, and will return a value of TRUE if it does.
- char hangup(void)
- {
- clock_t timer;
- char to_return = FALSE;
- od_set_dtr(FALSE); /* Hangup modem */
- /* Wait up to 30secs */
- timer = clock() + CLOCKS_PER_SEC * 30;
- while(timer >= clock())
- { /* If carrier has been lost, return with success */
- if(!od_carrier())
- {
- to_return = TRUE;
- break;
- }
- }
- od_set_dtr(TRUE); /* Re-enable DTR signal */
- return(to_return);
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 52
- OD_CLEAR_KEYBUFFER()
- -------------------------------------------------------------------------------
- PURPOSE Function to clear the input keyboard buffer
- FORMAT void od_clear_keybuffer(void);
- RETURNS N/A
- DESCRIPTION OpenDoors maintains its own keyboard input buffer, in order to
- permit the user to "type ahead" - to send input to the door
- prior to the time when it is ready to process those key presses.
- For example, the user could begin to type a command while a menu
- is still being displayed, and when your door reaches the point
- of inputting the menu command, the characters already typed by
- the user will already be waiting for the OpenDoors input
- functions. Note that the keyboard input buffer will include both
- the keys hit by the user on-line, and the non-function keys (ie,
- Alt-C will not appear in the OpenDoors keyboard buffer), hit by
- the sysop. This allows both the user on-line and the sysop to
- control the door at any time. If the sysop wishes to temporarily
- prevent the user from having any control over the door, the
- sysop may use the Alt-K (user-keyboard off) key. The key strokes
- placed in the OpenDoors type-ahead buffer will be retrieved by
- the od_get_key() and od_input_str() functions. The keyboard
- buffer can contain a maximum of 64 user keystrokes in this
- version of OpenDoors, after which any additional keystrokes will
- simply be discarded by OpenDoors.
- There are times, however, when you will want to erase any keys
- that have been hit by the user, to prevent them from typing
- ahead. For example, if your door has been busy doing some
- processing for a few moments, they user may have been pressing
- keys on their keyboard - perhaps in the hope that doing so will
- speed things up. These keys will be waiting in the type-ahead
- buffer, and if one of the keys the user entered was a valid
- response to the next prompt in your door, the user may find that
- they have accidentally made a choice they did not wish to. A
- well designed door will simply erase the contents of the type-
- ahead buffer after any long period of internal processing, etc.
- Keep in mind that too much use of the od_clear_keybuffer()
- function can be just as undesirable as not using it all, as
- there are times when the presence of the keyboard buffer can
- prove to be very useful for the user of a door.
- To erase the contents of the type-ahead buffer, you simply call
- the od_clear_keybuffer() function. This function takes no
- parameters, and does not return any value.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 53
- SEE ALSO od_get_key(), od_input_str(), od_edit_str()
- EXAMPLE For one example of the use of the od_clear_keybuffer() function,
- see the example program EX_VOTE.C, which is described beginning
- on page 38. Below is another example of using this function. In
- this case, we present a simple function, wait_for_return(),
- which simply pauses for the user to press their [Enter]/[Return]
- key. The function begins by displaying a prompt asking for the
- [Enter] or [Return] key to be pressed. The function then clears
- the keyboard input buffer, and waits until the user presses the
- carriage return key, using the od_get_key() function. Note also
- that this function will only continue if the user has pressed
- the correct key. This is a good idea in all door programs, as it
- allows your door to distinguish between a character pressed by
- the user, and a "line noise" character.
- void wait_for_return(void)
- { /* Display prompt */
- od_disp_str("Please Press [Enter] to continue...\n\r");
- od_clear_keybuffer(); /* Clear keyboard buffer */
- while(od_get_key(TRUE) != 13); /* Wait for Enter key */
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 54
- OD_CLR_LINE()
- -------------------------------------------------------------------------------
- PURPOSE Clears the rest of the current display line
- FORMAT void od_clr_line(void);
- RETURNS N/A
- DESCRIPTION This function clears the line that the cursor is on, from the
- cursor position to the end of the line. After the rest of the
- line is cleared, the cursor is automatically returned to the
- position it was at prior to issuing the command. Hence, if the
- display line the cursor was located on looked as follows, with
- the underscore (_) character representing the cursor position:
- This is a_line of text!
- With the cursor between the words "a" and "line", after the
- od_clr_line command is issued, the line would appear as follows:
- This is a_
- With the cursor directly following the word "a". Note that this
- function places a space character at the cursor location, and
- every location up to the end of the line.
- When the door is running in plain ASCII mode, this command will
- simply clear the rest of the line by manually sending a series
- of space and backspace characters. When ANSI, AVATAR or RIP
- modes are active, the corresponding ANSI/AVATAR control sequence
- will be sent in order to accomplish the line clear. Since the
- graphics mode sequences are much shorter than the sequence that
- would be required to clear the line manually, the use of this
- function will cause your door's graphics to display much more
- quickly when ANSI, AVATAR or RIP modes are active. Also note
- that in ANSI, AVATAR or RIP graphics modes, the line will be
- cleared with the currently selected color attribute. Thus, if
- you wanted to place a blue background on a particular line, you
- would use the od_set_color() (or od_set_attrib()) function, then
- use the od_set_cursor() function to locate the cursor at the
- beginning of the desired line, followed by the od_clr_line()
- function. Just such a procedure is demonstrated in the example,
- below.
- SEE ALSO od_clr_scr(), od_set_cursor()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 55
- EXAMPLE Below, is an example of a function that clears an entire line
- with a specified color. Since this function performs operations
- that require ANSI, AVATAR or RIP graphics mode, it should only
- be used in a case where these modes are known to be available.
- For example, this function would be useful in a full-screen
- editor or viewer, or when performing ANSI animations. The
- function accepts three parameters: the line to be cleared (where
- 1 is the first line, 2 the second, and so on), the foreground
- color of this line, and the background color of this line.
- This function differs from the od_clr_line() function itself in
- several important manners. First of all, this function clears
- the entire line, whereas the od_clr_line() function can be used
- to clear only the remaining characters of the line, after any
- particular location. Also, as mentioned before, this function
- selects a color to clear the line to, and moves the cursor to
- the line which is to be cleared - neither of which is done by
- the od_clr_line() function.
- void clear_line(char line_number,char foreground,char
- background)
- {
- od_set_cursor(line_number,1); /* move to correct line */
- od_set_color(foreground,background); /* set color */
- od_clr_line(); /* clear entire line */
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 56
- OD_CLR_SCR()
- ------------------------------------------------------------------------------
- PURPOSE The OpenDoors clear screen function
- FORMAT void od_clr_scr(void);
- RETURNS N/A
- DESCRIPTION The od_clr_scr() function can be used to clear the output
- screen. (ie, the user's screen and local screen with the
- exception of the status line are cleared.) This function will
- only clear the screen if screen clearing is enabled. If your
- program will be running under BBS systems that do not pass the
- user's screen clearing setting to the door, you may wish to
- determine yourself whether or not the user's system supports
- screen clearing codes, during the first time the user uses the
- door. You will then be able to store this setting in a data
- file. The example below demonstrates how to detect whether or
- not the user's system supports screen clearing.
- You should note that the ability for the user's terminal to
- support screen clearing codes is independent of the user's ANSI
- / AVATAR / RIP graphics mode settings.
- For more information on the user's screen clearing setting,
- please refer to the user_attrib variable in the OpenDoors
- Control Structure chapter of this manual. If you wish to force a
- screen clear, regardless of the user's screen clearing setting,
- simply use the function call:
- od_disp_emu("\xc", TRUE);
- SEE ALSO od_clr_line()
- EXAMPLE Below is an example of a function which determines whether or
- not the user's system supports screen clearing. This function
- will return a value of TRUE if screen clearing is supported, and
- will return a value of FALSE if screen clearing is not
- supported:
- int user_supports_screen_clearing(void)
- {
- char answer;
- /* display instructions to user */
- od_disp_str("In order for this door to function\n\r");
- od_disp_str("correctly, we must know whether or not\n\r");
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 57
- od_disp_str("your system supports screen clearing.\n\r");
- od_disp_str("In a moment, we will attempt to clear\n\r");
- od_disp_str(
- "your screen in order to test your system's\n\r");
- od_disp_str("capabilities.\n\r\n\r");
- od_disp_str("Please press [Enter]/[Return] when you\n\r");
- od_disp_str("are ready to perform this test.\n\r");
- while(od_get_key(TRUE)!=13); /* wait for [Return] key */
- od_clr_scr(); /* attempt to clear screen */
- /* ask user if their screen cleared */
- od_disp_str("Did your screen just clear? (Y/N)\n\r");
- for(;;) /* loop until user chooses [Y]es or [N]o */
- {
- answer=od_get_key(TRUE); /* Get user's answer */
- if(answer=='y' || answer=='Y') return(TRUE);
- if(answer=='n' || answer=='N') return(FALSE);
- }
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 58
- OD_COLOR_CONFIG()
- -------------------------------------------------------------------------------
- PURPOSE Parses a color configuration line from the configuration file,
- generating a color attribute value.
- FORMAT BYTE od_color_config(char *pszColorDesc);
- RETURNS Color attribute value
- DESCRIPTION This function will be of use if you are using the configuration
- file system of OpenDoors, and wish to allow the sysop to specify
- text colors to be used in your door. While OpenDoors
- automatically recognizes color configuration settings for things
- such as sysop chat mode and FILES.BBS listings, you may wish to
- add additional color configuration options. In this case, you
- could call the od_color_config() function from your custom line
- function. For more information on the custom line function, see
- the section on the OpenDoors configuration file system, which
- begins on page 224.
- To use this function, simply pass the configuration file line
- you wish to have parsed to the function in it's single
- parameter. The function will then return a color attribute value
- in the same format that is used but the od_set_attrib()
- function. Colors are specified using a string of the format:
- {Flashing} {Bright} [foreground] on [background]
- Where "Flashing" is an optional keyword indicating that the text
- should be flashing. "Bright" is an optional keyword indicating
- that the foreground color should be bright. Foreground is the
- name of a foreground color, and background is the name of a
- background color. Case (upper or lower) is not significant.
- The color keywords are language configurable, using the array
- od_control.od_color_names.
- EXAMPLE See the example accompanying in the section on the OpenDoors
- configuration file system, which begins on page 224.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 59
- OD_DISP()
- ------------------------------------------------------------------------------
- PURPOSE Sends a buffer of text with optional local echo
- FORMAT void od_disp(char *pachBuffer, INT nSize, BOOL bLocalEcho);
- RETURNS N/A
- DESCRIPTION This function allows you to send a buffer of text of any
- specified length, with the option of enabling or disabling local
- echo. You will probably have little use for this function -
- instead you will most likely display strings using either the
- od_disp_str() or od_printf() functions, depending on whether or
- not you wish to use printf()'s formatting options. For a
- breakdown of the uses of the various OpenDoors display
- functions, see the description of the od_disp_str() function, on
- page 63.
- There are two cases when this function will come in useful:
- 1.)If you wish to display a buffer of characters of known
- length, which may contain null (ASCII 0) characters.
- Since this character is used by the C language to
- indicate the end of a string, the other two string
- display functions (od_disp_str() and od_printf()) will
- not send this character to the remote system.
- 2.)If you wish to send text to the remote system without
- having it displayed on the local screen, or if you wish
- to send strings to the modem when it is in command
- mode, without having these characters displayed on the
- local screen.
- The od_disp() function is called with three parameters. The
- first parameter, pachBuffer, is a pointer to a buffer of
- characters you wish to have displayed. The second parameter,
- nSize, is simply the number of characters in the buffer to be
- displayed. If the third parameter, bLocalEcho, is set to TRUE,
- then all characters sent to the modem will also be displayed on
- the local screen. If the third parameter is set to FALSE, then
- the buffer will be sent to the modem without being echoed to the
- sysop's screen.
- SEE ALSO od_disp_str(), od_printf(), od_putch(), od_repeat(),
- od_disp_emu()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 60
- EXAMPLES The following are a few examples of the use of the od_disp()
- function:
- In order to display a single character, contained in the
- variable "character", without echo to the local screen:
- od_disp(&character,1,FALSE);
- In order to send a command to the modem (only if you know that
- the modem is in command mode), with the command contained in the
- null-terminated string "string":
- od_disp(string,strlen(string),FALSE);
- In order to send exactly 5 characters from the buffer "buffer",
- WITH echo to the local screen:
- od_disp(buffer,5,TRUE);
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 61
- OD_DISP_EMU()
- -------------------------------------------------------------------------------
- PURPOSE Displays a string with ANSI/AVATAR terminal emulation
- FORMAT void od_disp_emu(char *pszToDisplay, BOOL bRemoteEcho);
- RETURNS N/A
- DESCRIPTION The od_disp_emu() function allows you to display your own ANSI /
- AVATAR graphics sequences. This function passes the characters
- you wish to display to the OpenDoors terminal emulator, which is
- fully documented in the description of the od_send_file()
- function, on page 124. This function can be used to send these
- control sequences to the user's terminal, and also have them
- displayed on the local screen as they will appear to the user.
- The string passed to od_disp_emu() contains any stream of text
- to display, and may include both normal text and terminal
- emulation control sequences. If the bRemoteEcho parameter is set
- to TRUE, the string passed to od_disp_emu() will be sent to the
- remote terminal in addition to being displayed locally. If this
- parameter is set to FALSE, the string will only be displayed
- locally.
- Note that if you wish to display an entire file containing
- ANSI/AVATAR/RIP graphics sequences (perhaps as your program's
- menu or title screen), you can use the od_send_file() function.
- SEE ALSO od_send_file(), od_disp(), od_disp_str() od_printf().
- For a breakdown of the uses of the various OpenDoors display
- functions, see the od_disp_str() function, on page 63.
- EXAMPLE For an example of the use of the od_disp_emu() function, see the
- SpaceRight() and MoveLeft() functions included in the example
- program ex_ski.c.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 62
- OD_DISP_STR()
- -------------------------------------------------------------------------------
- PURPOSE Displays a string to the screen (remote and local)
- FORMAT od_disp_str(char *pszToDisplay);
- RETURNS N/A
- DESCRIPTION The two functions most often used for displaying strings within
- a door are the od_disp_str() and od_printf() functions. The
- od_printf() function allows for formatted output, whereas the
- od_disp_str function simply displays the actual contents of the
- string passed to it. If you wish to display a single character,
- use the od_putch() function. If you wish to send a string or
- buffer to the modem without local echo, use the od_disp()
- function. If you wish to send a sequence of the same character
- to the modem, the od_repeat() function will use graphics control
- codes, if available to display the sequence much faster than
- simply sending the same character in repetition. Also, if you
- wish to send ANSI, AVATAR or RIP graphics control codes, and
- have them emulated on the local screen, use the od_disp_emu()
- function.
- The od_disp_str() function displays the contents of the null-
- terminated string pointed to by *string. Display is sent to both
- the local screen and modem (presuming the door is not running in
- local mode).
- An important thing to keep in mind when using the od_disp_str()
- function, is that you should use "/n/r" instead of simply "/n"
- for a new line. This is due to the fact that terminal programs
- usually require a carriage-return line-feed sequence (/n/r),
- instead of just a line-feed (/n). For example, instead of using:
- od_disp_str("Hello world!\n");
- You should use:
- od_disp_str("Hello world!\n\r");
- To change the cursor color or location of output with the
- od_disp_str() function, refer to the od_set_cursor() and the
- od_set_attrib() functions.
- SEE ALSO od_disp(), od_printf(), od_putch(), od_repeat(), od_disp_emu()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 63
- EXAMPLES Below are a few examples of various uses of the od_disp_str()
- function:
- Displaying three string constants on separate lines:
- od_disp_str("This is an example\n\r");
- od_disp_str("of the OpenDoors\n\r");
- od_disp_str("od_disp_str() function\n\r");
- Displaying three string constants on the same line:
- od_disp_str("Another ");
- od_disp_str("od_disp_str() ");
- od_disp_str("example\n\r");
- Displaying a string variable:
- char string[80];
- strcpy(string,"This is a string!\n\r");
- od_disp_str(string);
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 64
- OD_DRAW_BOX()
- -------------------------------------------------------------------------------
- PURPOSE Draws a box on the screen in ANSI, AVATAR or RIP graphics modes.
- FORMAT BOOL od_draw_box(BYTE btLeft, BYTE btTop, BYTE btRight, BYTE
- btBottom);
- RETURNS TRUE on success, FALSE on failure
- DESCRIPTION This function is for use in ANSI, AVATAR or RIP graphics modes.
- This function will draw a box in the current display attribute,
- at the specified location on the screen. The boarder of the box
- is made up of the characters specified in the od_control.
- od_box_chars[] array. If AVATAR graphics mode is available, this
- function uses AVATAR control codes to display the box in less
- than 1/10 the length of time required to display the box in ANSI
- mode.
- The first two parameters of this function, btLeft and btTop,
- specify the coordinates of the top, left-hand corner of the box
- to be draw. The third and fourth parameters, btRight and
- btBottom, specify the coordinates of the bottom, left-hand
- corner of the box. Like the values passed to the od_set_cursor()
- function, these coordinates are relative to the upper left-hand
- corner of the screen, with the position (1,1) being this corner.
- As mentioned above, this function will display the window in the
- current text color. Thus, before calling this function, you
- should use either the od_set_color() or the od_set_attrib()
- function to specify the color in which you would like to have
- the window displayed.
- Normally, the boarder of the window will be displayed using the
- IBM extended ASCII characters which produce a single line
- boarder. However, you may wish to have the boarder displayed
- using different characters. In this case, the characters used to
- display the boarder can be specified by the od_control.
- od_box_chars variable, described in the OpenDoors control
- structure section of this manual.
- SEE ALSO od_set_color(), od_set_attrib(), od_clr_scr(), od_edit_str(),
- od_set_cursor()
- EXAMPLE As an example of the use of the od_draw_box() function in
- conjunction with the od_edit_str() function, we show a portion
- of a program which displays a window, and allows the user to
- input the name of a file they would like to upload, a
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 65
- description of the file, and whether they want it to be a
- private upload. The user is able to move among fields using the
- tab key, and select a "continue" button when they are finished.
- The function returns TRUE if the user selects continue, and
- FALSE if the user presses [ESCape].
- // Main "dialog box" function
- int get_information(char *filename, char *description,
- char *private)
- {
- char current_field=1; // Currently selected field
- int choice; // User's choice
- od_set_color(L_WHITE,D_BLUE); // Display window
- od_draw_box(10,5,70,13);
- od_set_cursor(5,25); // Display window title
- od_set_color(L_GREEN,D_BLUE);
- od_disp_str(" ENTER FILENAME INFORMATION ");
- od_set_color(L_CYAN,D_BLUE); // Display fields and titles
- od_set_cursor(6,15);
- od_disp_str("FILENAME : ");
- od_repeat(176,13);
- od_set_cursor(7,12);
- od_disp_str("DESCRIPTION : ");
- od_repeat(176,43);
- od_set_cursor(8,16);
- od_disp_str("PRIVATE : ");
- od_repeat(176,2);
- draw_button();
- filename[0]='\0'; // Blank out contents of input variables
- description[0]='\0';
- private[0]='\0';
- for(;;) // Main dialog box loop
- {
- if(current_field==4) // If field is the button
- {
- od_set_color(L_GREEN,D_BLUE); // Highlight button
- draw_button();
- do // Loop until user presses [TAB], [ENTER], or [ESC]
- {
- choice=od_get_key(TRUE);
- } while(choice!=9 && choice!=13 && choice!=27);
- od_set_color(L_CYAN,D_BLUE); // Un-highlight button
- draw_button();
- if(choice==13) return(TRUE); // If [ENTER] was pressed
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 66
- if(choice==27) return(FALSE); // If [ESC] was pressed
- current_field=1; // Otherwise, [TAB] was pressed
- }
- switch(current_field) // According to selected field
- { // Input from the appropriate line
- case 1:
- choice=od_edit_str(filename,"FFFFFFFFFFFF",6,26,
- 0x1b,0x1a,176,
- EDIT_FLAG_EDIT_STRING|
- EDIT_FLAG_ALLOW_CANCEL|
- EDIT_FLAG_FIELD_MODE|
- EDIT_FLAG_KEEP_BLANK);
- break;
- case 2:
- choice=od_edit_str(description,
- "*******************",
- 7,26,0x1b,0x1a,176,
- EDIT_FLAG_EDIT_STRING|
- EDIT_FLAG_ALLOW_CANCEL|
- EDIT_FLAG_FIELD_MODE|
- EDIT_FLAG_KEEP_BLANK);
- break;
- case 3:
- choice=od_edit_str(private,"Y",8,26,
- 0x1b,0x1a,176,
- EDIT_FLAG_EDIT_STRING|
- EDIT_FLAG_ALLOW_CANCEL|
- EDIT_FLAG_FIELD_MODE);
- }
- // If user pressed [ESCape]
- if(choice==EDIT_RETURN_CANCEL) return(FALSE);
- // If user choice to go to previous field
- if(choice==EDIT_RETURN_PREVIOUS)
- {
- if(current_field==1) // If at first field
- current_field=4; // Go to last field
- else // If not at first field
- --current_field; // Go to previous field
- }
- else // If user chose next field
- ++current_field; // Go to next field
- }
- }
- void draw_button(void) // Function to display the button
- {
- od_draw_box(12,10,23,12); // Draw box for button
- od_set_cursor(11,14);
- od_disp_str("Continue"); // Display text in button
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 67
- OD_EDIT_STR()
- -------------------------------------------------------------------------------
- PURPOSE Allows you to perform formatted input with full line editing
- features, etc., in ANSI/AVATAR/RIP graphics mode.
- FORMAT WORD od_edit_str(char *pszInput, char *pszFormat, INT nRow,
- INT nColumn, BYTE btNormalColor, BYTE btHighlightColor,
- char chBlank, WORD nFlags);
- RETURNS This function will return one of the following values:
- EDIT_RETURN_ERROR Indicates that an error has occurred,
- and the edit function was unable to
- run. This will occur if there is an
- error in one of the parameters, or if
- ANSI/AVATAR/RIP graphics is not
- available
- EDIT_RETURN_CANCEL Indicates that the user pressed the
- cancel key [ESC], and that the string
- was left unaltered.
- EDIT_RETURN_ACCEPT Indicates that the user pressed the
- accept key [Enter], or that the auto-
- enter feature was activated.
- EDIT_RETURN_PREVIOUS Indicates that the user wishes to move
- to the previous field, by pressing [UP
- ARROW], [SHIFT]-[TAB], etc.
- EDIT_RETURN_NEXT Indicates that the user wishes to move
- to the next field, by pressing [DOWN
- ARROW], [TAB], etc.
- DESCRIPTION To perform string input within OpenDoors, one of two functions
- can be used, od_input_str() and od_edit_str(). The first
- function, od_input_str(), allows simple line input and editing,
- and can be used in ASCII, ANSI, AVATAR and RIP modes. The second
- function, od_edit_str(), allows many formatted input options,
- advanced line editing, and other features, but requires the use
- of ANSI, AVATAR or RIP terminal modes.
- As mentioned above, the od_edit_str() function allows for
- advanced line editing, such as inputting and deleting text from
- the middle of the string (whereas the od_input_str() function
- only allows editing from the end of the string, such as
- backspacing to erase a mistake). The edit functions available
- from the od_edit_str() are listed below. Note that some of these
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 68
- functions may or may not be available, depending upon the
- capabilities of the user's terminal program. While there is no
- single standard used for the transmission of special edit keys
- such as the arrow keys, the od_edit_str() function makes as much
- effort as possible to make all of the edit features available to
- most terminal programs. Many of the edit functions can be
- accesses using either [CONTROL]-key combinations or special keys
- such as the arrow keys, delete key, and so on. OpenDoors will
- recognize most of these special control keys when sent as either
- an ANSI control sequence (which is sent by most terminal
- programs), or as a DoorWay style scan code / ASCII code sequence
- (which is also available from many terminal programs, but is not
- usually required). The od_edit_str() edit functions are as
- follows. Note that all edit functions are always available from
- the local keyboard.
- HOME - Moves the cursor to the beginning of the line being
- edited. Press the [HOME] key, either in DoorWay mode
- or from the local keyboard.
- END - Moves the cursor to the end of the line being edited.
- Press the [END] key, either in DoorWay mode or from
- the local keyboard.
- DELETE CHARACTER - Deletes the character under the cursor. Press
- [DELete] on the local keyboard, in DoorWay mode, and
- under many terminal programs without DoorWay mode.
- Alternatively, press [CONTROL]-[G].
- BACKSPACE - Deletes the character left of the cursor. Press
- [BACKSPACE] or [CONTROL]-[H].
- TOGGLE INSERT MODE - Switches the od_edit_str() function between
- insert mode and overwrite mode. Press [INSert], either
- in DoorWay mode, or from the local keyboard.
- Alternatively, press [CONTROL]-[V].
- CURSOR LEFT - Moves the cursor left one character. Press [LEFT
- ARROW] on the local keyboard, in DoorWay mode, and
- under many terminal programs without DoorWay mode.
- Alternatively, press [CONTROL]-[S].
- CURSOR RIGHT - Moves the cursor right one character. Press
- [RIGHT ARROW] on the local keyboard, in DoorWay mode,
- and under many terminal programs without DoorWay mode.
- Alternatively, press [CONTROL]-[D].
- ERASE ENTIRE LINE - Press [CONTROL]-[Y].
- ACCEPT INPUT - Press the [ENTER] / [RETURN] line to accept the
- input. Alternatively, press [CONTROL]-[Z]. Note that
- this key will only work when the current input is
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 69
- "valid" (ie, it conforms to the format string, which
- is described below)
- CANCEL INPUT - Only available if specifically enabled on the
- od_edit_str() command line. Press [ESCape].
- NEXT FIELD - If enabled, allows the user to move to the next
- field in a dialog box / form. Press [DOWN ARROW] in
- DoorWay mode and under many terminal programs without
- DoorWay mode. Alternatively, press [TAB]. Note that
- the [DOWN ARROW] key is NOT usually available from the
- local keyboard, as it is usually used to adjust the
- user's remaining time.
- PREVIOUS FIELD - If enabled, allows the user to move to the
- previous field in a dialog box / form. Press [UP
- ARROW] in DoorWay mode and under many terminal
- programs without DoorWay mode. Alternatively, press
- [SHIFT]-[TAB] on the local keyboard or in DoorWay
- mode. Again, note that the [UP ARROW] key is NOT
- usually available from the local keyboard, as it is
- usually used to adjust the user's remaining time.
- Let us now look at the parameters which the od_edit_str()
- function accepts. The first parameter, pszInput, is a pointer to
- the string where the user's input should be stored. It is
- important that this string be long enough to accommodate the
- longest input your format string will permit, including the '\0'
- C string terminator (ie, the string should be one character
- greater than the length of the format string, not including the
- format string's ' and " characters).
- The second parameter, pszFormat, is a pointer to a string which
- specifies the format and maximum length of the input the
- od_edit_str() function should accept. Using the format string,
- not only do you specify the length of the input field, but you
- can also force the user's input into certain formats. For
- example, if you wished to input a North American style phone
- number, you could use a format string of "###-###-####". Then
- regardless of whether the user typed any dash character or not,
- their input would be converted, as they type, to the format of
- the phone number 613-599-5554. You could also specify a format
- string such of "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", which would
- permit the user to enter a name of up to 30 characters. Note
- that since the cursor can be moved to the position immediately
- following the last character, a the input field for a 30
- character string will occupy 31 columns on the screen. The
- od_edit_str() function would then automatically capitalize the
- name, so that the first character of each word is capitalized,
- and the remain characters of the word is in lower case. Even if
- the user were to move the cursor to the middle of the string
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 70
- they had entered, and add or delete a space (and thus either
- make one work two or two words one), od_edit_str() would re-
- format the string to reflect the change. The valid characters
- for the format sting, along with their meanings, are listed
- below. Note that the format string is NOT case sensitive (except
- for literal strings delimited by the '' or "" characters), and
- space characters can be added at any point to increase
- legibility.
- # Indicates that numeric characters from '0' to '9' are valid
- for this position
- % Indicates that numeric characters from '0' to '9', and the
- space character (' ') are valid for this position.
- 9 Indicates that numeric characters from '0' to '9', along
- with '.', '-' and '+' are valid for this position. This
- format style is intended for floating-point numeric input.
- ? Indicates that any character is valid for this position.
- * Indicates that any printable character, from ASCII 32 to
- ASCII 127, is valid for this position.
- A Indicates that alphabetical characters 'A' to 'Z', 'a' to
- 'z' and space (' ') are valid for this position.
- C Indicates that city name characters are valid for this
- position. As with the 'M' format character, words are
- automatically capitalized so that the first letter is in
- upper case, and all subsequent letters are in lower case.
- In addition to permitting alphabetical characters and the
- space (' ') character, the ',' and '.' characters are also
- accepted in this position.
- D Indicates that date characters '0' to '9', '-' and '/' are
- valid for this position.
- F Indicates that MS-DOS filename characters are valid for
- this position.
- H Indicates that hexidecimal character '0' to '9', 'A' to 'F'
- and 'a' to 'f' are valid for this position.
- L Indicates that only lower case alphabetical characters 'a'
- to 'z', and the space (' ') character is valid for this
- position. However, if the user attempts to enter an upper
- case alphabetical character in this position, it will
- automatically be converted to the lower case equivalent.
- M Indicates that name characters are valid for this position.
- These characters are the alphabetical characters 'A' to
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 71
- 'Z', 'a' to 'z', and the space character (' '). A
- character's case is converted such that the first character
- of a word is in upper case, and all other letters are in
- lower case.
- T Indicates that telephone number character '0' to '9', '(',
- ')', '-' and ' ' are valid for this position.
- U Indicates that only upper case alphabetical characters 'A'
- to 'Z', and the space (' ') character is valid for this
- position. However, if the user attempts to enter a lower
- case alphabetical character in this position, it will
- automatically be converted to the upper case equivalent.
- W Indicates that MS-DOS filename characters are permitted in
- this position, including the '*' and '?' wildcard
- characters.
- X Indicates that alphanumeric characters 'A' to 'Z', 'a' to
- 'z', '0' to '9' and ' ' are valid for this position.
- Y Indicates that yes/no characters 'Y', 'N', 'y', 'n' are
- valid for this position. The characters are automatically
- converted to upper case.
- '/" Single or double quotes can be used to specify sequences of
- characters that should appear at the same location in the
- input string (referred to elsewhere as "literal strings").
- When the user is entering the string, these characters are
- automatically supplied, and the user is not required to
- type them. Literal strings must begin and end with the same
- quote character. Remember that the double quote (")
- character must be imbedded in C strings by preceding the
- quote character with a \ (backslash) character.
- The third and fourth parameters, nRow and nColumn specify the
- location on the screen where the first (left most) character of
- the input field should be located. These parameters are
- identical to the nRow and nColumn parameters passed to the
- od_set_cursor() function. In other words, nRow specifies the
- line number on the screen, where 1 is the first line, and
- nColumn specifies the column across the screen, where 1 is the
- first column.
- The fifth and sixth parameters, btNormalColor and
- btHighlightColor, allow you to specify the color of the input
- field. The fifth parameter, btNormalColor, specifies the color
- of the input field when input is not taking place and the sixth
- parameter, btHighlightColor, specifies the color of the field
- while input is taking place. Thus, if you had several input
- fields on the screen at one time, you would be able to make is
- easier for the user to identify the currently active field by
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 72
- having the field currently accepting input highlighted in a
- color distinct from the other fields. When the od_edit_str()
- function begins, it will change the current color of the field
- from the normal color to the highlighted color. Then, when the
- od_edit_str() function exits, it will change the current color
- of the field back to its normal color. If you do not wish to
- have the field highlighted, you can set both of these parameters
- to the same value, and disable field re-drawing by using the
- eighth parameter, flags.
- The seventh parameter accepted by the od_edit_str() function,
- chBlank, will serve one of two purposes. Normally, this
- parameter will specify a background character to display in the
- unfilled portion at the end of the input field. This can be set
- to a character, such as the ASCII 177 grey block character, to
- produce a visual background to the field. Doing this will show
- the user visually how long the field is, and how many character
- they will be permitted to type into the field. Normally, this
- field will be displayed during input, and removed when the
- od_edit_str() function exits. However, you may cause the
- background to remain in place using the eighth parameter, flags.
- If you do not wish to have this "background" visual field
- effect, simply set the character parameter to a space (ASCII
- 32). In password input mode, this parameter will instead specify
- the character to display in place of characters typed by the
- user. In this case, the background display character defaults to
- the space (ASCII 32) character.
- The eighth, and last, parameter accepted by the od_edit_str()
- function is the nFlags parameter. This parameter is a bit-mapped
- flags variable which allows you to control special features of
- the od_edit_str() function. More than one of these settings may
- be specified by listing a chain of the values, separated by the
- bitwise-or (|) operator. If you do not wish to turn on any of
- these modes, simply pass the EDIT_FLAG_NORMAL value as the flags
- parameter.
- EDIT_FLAG_NORMAL - Default setting, use this value of none of
- the other flags below are active.
- EDIT_FLAG_NO_REDRAW - When set, prevents the od_edit_str()
- function from re-drawing the input string and field
- when it starts up and exits. If you set this flag, the
- normal color and highlight color should contain the
- same value. If background character (the character
- parameter) is not a space (ASCII 32) character, you
- must draw the field background prior to calling
- od_edit_str(). Also, if you are calling od_edit_str()
- with the EDIT_FLAG_EDIT_STRING flag set, you must
- display the existing string in the field prior to
- calling od_edit_str().
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 73
- EDIT_FLAG_FIELD_MODE - Setting this flag specifies that
- od_edit_str() should operate in field input mode. In
- field input mode, the user may finish entering their
- input by pressing the previous field or next field
- button (arrow keys, tab keys, etc.), as described
- above. If the user chooses to finish and accept their
- input by pressing one of these keys, the od_edit_str()
- return value will reflect which choice they made. This
- will allow you to make it possible for the user to
- move between a number of input fields in a form /
- dialog box, as demonstrated in the example
- accompanying the od_draw_box() function.
- EDIT_FLAG_EDIT_STRING - Setting this flag specifies that
- od_edit_str() should edit a pre-existing string,
- instead of starting with a blank string. In this case,
- the input_string parameter MUST point to an
- initialized string. This string may either contain
- some text, or be empty, but od_edit_str() will expect
- to find a string terminator ('\0') character, and will
- begin editing the contents of the string prior to that
- character. If you do not set the EDIT_FLAG_EDIT_STRING
- flag, the previous contents of the input_string
- parameter is not significant, as od_edit_str() will
- automatically start with a blank string.
- EDIT_FLAG_STRICT_INPUT - Setting this flag causes the
- od_edit_str() function to operate in "strict" input
- mode, which may be desirable if your input format
- contains more than one type of input. Normally, if you
- were inputting such a string, the user would be able
- to move to the middle of the string, and insert any
- text. Doing so would cause the rest of the input line
- to shift right. However, in cases where your format
- string specifies different types of character to be
- permitted in different positions, this can cause the
- input to be changed so that it no longer conforms to
- the format string. In this case, the user's input will
- no longer be valid, and the user will not be able to
- exit the function by pressing [ENTER] (although
- [ESCAPE] will still be available, if you activated it)
- until they change their input. However, when strict
- input mode is turned on, od_edit_str() will restrict
- the ways in which the user is permitted to edit the
- string, to prevent just such a case from occurring.
- EDIT_FLAG_PASSWORD_MODE - Setting this flag causes the
- od_edit_str() function to operate in "password" mode.
- In password mode, the characters typed by the user
- will be hidden, displayed instead as the blank
- character specified in the "character" parameter.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 74
- EDIT_FLAG_ALLOW_CANCEL - When this flag is set, the user will be
- able to cancel their current input and abort the
- editing process by pressing their [ESCAPE] key. When
- they do so, any changes they have made to the input
- field will be canceled, and replaced by the original
- contents of the string. The od_edit_str() function
- will then exit, indicating that the user has canceled
- their input.
- EDIT_FLAG_FILL_STRING - When set, this flag will force the user
- to enter a string that fills the entire length of the
- format string. Normally, the user will be able to
- enter a string of any length up to the maximum length
- specified by the format string. However in some cases,
- such as when inputting a date, you will want to have
- the input field filled. (Otherwise, the user would be
- able to enter only the first part of the date.)
- EDIT_FLAG_AUTO_ENTER - When set, this flag will cause the
- od_edit_str() function to automatically simulate
- pressing of the [ENTER] key when the string is filled.
- This can be used to cause the od_edit_str() function
- to finish inputting as soon as a valid string is
- entered, instead of having to wait for the user to
- press [ENTER] / [RETURN].
- EDIT_FLAG_AUTO_DELETE - When set, along with the
- EDIT_FLAG_EDIT_STRING flag, this flag will activate
- the auto-delete feature of the od_edit_str() function.
- When auto-delete is active, if the first key pressed
- by the user is not an edit control key, the existing
- text will automatically be deleted, and a totally new
- string accepted from the user. This could be useful
- when you are allowing the user to go back to edit a
- previous input. If the user wishes to only change part
- of the old string, they can move the cursor to the
- location where they wish to make the change, and
- perform their editing. However, if the user wishes to
- completely replace the old string with a new one, they
- can simply begin to type, and the old string will
- automatically be deleted, and the new string accepted.
- EDIT_FLAG_KEEP_BLANK - Normally, OpenDoors will only display the
- input field background (as passed in the "character"
- parameter) while the user is editing the string, and
- will remove it when the od_edit_str() function exits.
- However, you may wish to continue having this field
- displayed after input has taken place, and the
- od_edit_str() function has exited. In this case,
- setting this flag will cause the background characters
- to remain visible after input has finished.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 75
- EDIT_FLAG_PERMALITERAL - When the format string contains literal
- characters (such as forcing a ':' character to be
- added to a time input by using the format string
- "##':'##':'##"), the od_edit_str() function can
- operate in one of two modes. In the default mode, the
- literal characters will only be displayed when they
- have been automatically added to the string. For
- instance, if you were inputting the current time using
- the above format string, this mode would result in the
- input field initially being blank. When the user types
- the first digit of the time, that number would appear.
- When the user types the second digit of the time, that
- number will appear, and then the colon character will
- automatically be added by OpenDoors. However, you can
- also set the od_edit_str() function to operate in
- "PermaLiteral" mode, by setting this flag. When the
- EDIT_FLAG_PERMALITERAL flag is set, the input field
- will initially contain the literal characters (ie, the
- colons in our example), with the cursor still located
- at the leftmost position in the input field. In this
- mode, the literal character become a permanent part of
- the input field, and can not be moved or deleted by
- the user - instead the cursor simply skips over the
- literal character's position.
- EDIT_FLAG_LEAVE_BLANK - This flag applies to the special case
- where the first character or characters of the format
- string are literals. By default, the od_edit_str()
- function will always return a string containing at
- least these first literal characters. However, you can
- alter this behaviors by setting this flag. When set,
- if no non-literal characters have been entered in the
- string, od_edit_str() will return an empty string.
- EDIT_FLAG_SHOW_SIZE - Normally, od_edit() adds an extra blank to
- the end of the input field, to give the cursor a space
- to move into when the field is full. However, you may
- prefer to have the input field be shown as exactly the
- maximum size of input that is permitted. Setting
- EDIT_FLAG_SHOW_SIZE does just this. In this case, the
- cursor will be positioned immediately past the end of
- the input field when the maximum number of characters
- have been entered.
- SEE ALSO od_input_str(), od_get_char(), od_clear_keybuffer()
- EXAMPLE Below are several examples of typical uses of the od_edit_str()
- function. For the sake of simplicity, all of these examples
- perform their input beginning at the top, left hand corner of
- the screen, and store the user's input in the string variable
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 76
- named "string". For an example of the user of the od_edit_str()
- function in a dialog-box / form entry application, see the
- example accompanying the od_draw_box() function.
- To input a name with a maximum of 25 characters, having the
- first letter of each word automatically capitalized:
- od_edit_str(string, "MMMMMMMMMMMMMMMMMMMMMMMMM", 1, 1,
- 0x03, 0x21, 176, EDIT_FLAG_NORMAL);
- To input a North American style phone number, requiring that all
- digits be filled, and running in "strict input" mode:
- od_edit_str(string, "###'-'###'-'####",
- 1, 1, 0x03, 0x21, 176,
- EDIT_FLAG_FILL_STRING|
- EDIT_FLAG_STRICT_INPUT);
- To allow the user to edit a previously entered 20 character
- string, with auto-delete mode on. Any characters will be
- permitted in the string. Remember that when the
- EDIT_FLAG_EDIT_STRING flag is set, the string must be
- initialized prior to calling the od_edit_str() function.
- od_edit_str(string, "????????????????????",
- 1, 1, 0x03, 0x21, 176,
- EDIT_FLAG_EDIT_STRING|
- EDIT_FLAG_AUTO_DELETE);
- To input a password of up to 16 characters from the user. Here,
- the password will only be permitted to contain upper case
- characters, and the od_edit_str() password mode is used, with a
- small block displayed in place of any characters typed:
- od_edit_str(string, "UUUUUUUUUUUUUUUU",
- 1, 1, 0x03, 0x21, 254,
- EDIT_FLAG_PASSWORD_MODE);
- To input a two-digit number from the user, requiring that both
- digits be filled, and automatically accepting the input after
- the two digits have been entered (not requiring the user to
- press [ENTER]):
- od_edit_str(string, "##", 1, 1, 0x03, 0x21, 176,
- EDIT_FLAG_FILL_STRING|
- EDIT_FLAG_AUTO_ENTER);
- To input a filename to download, as a field in a dialog box.
- Here, the filename will be permitted to contain valid filename
- characters, and the od_input_str() function will operate in
- field mode, with the cancel [ESCape] key enabled. Also, string
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 77
- edit mode will be enabled, allowing the user to edit a
- previously entered line, and the EDIT_FLAG_KEEP_BLANK flag will
- be set, causing the field background to remain displayed after
- the user exits. This time, however, auto-delete mode will not be
- used. Note that this combination of parameters expects that the
- field and it's contents will have already been displayed, prior
- to calling the od_edit_str() function.
- od_edit_str(string, "WWWWWWWWWWWW",
- 1, 1, 0x03, 0x21, 176,
- EDIT_FLAG_EDIT_STRING|
- EDIT_FLAG_FIELD_MODE|
- EDIT_FLAG_ALLOW_CANCEL|
- EDIT_FLAG_KEEP_BLANK);
- To input a string without the field background and line
- redrawing before and after input takes place:
- od_edit_str(string, "******************************",
- 1, 1, 0x07, 0x07, ' ',
- EDIT_FLAG_NO_REDRAW);
- To input a date, using PermaLiteral mode. Here, the month is
- entered by a three digit short form ("JAN", "FEB", etc.), and
- the literal characters such as the '-' and the "19" are a
- permanent part of the input field:
- od_edit_str(string,"UUU'-'##'-19'##",
- 1, 1, 0x03, 0x21, 176,
- EDIT_FLAG_PERMALITERAL|
- EDIT_FLAG_FILL_STRING);
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 78
- OD_EXIT()
- -------------------------------------------------------------------------------
- PURPOSE The OpenDoors program termination function
- FORMAT void od_exit(INT nErrorLevel, BOOL bTermCall);
- RETURNS N/A
- DESCRIPTION You MUST USE THIS FUNCTION when you want your program to exit.
- This function will close the serial port, re-write changed
- information to the door information (drop), call your end-of-
- program function (if any), and then exit with the errorlevel
- specified in the first parameter.
- Also, if the second parameter, bTermCall, is set to TRUE,
- od_exit() will also log the user off (for options such as
- logging off within the door - as shown in the example below).
- This is accomplished by lowering the DTR line to the modem,
- causing the modem to hangup. When control is returned to the
- BBS, it will then detect that the user is no longer online, and
- will carry out its own logoff processing.
- If you wish for your program to always perform any activities
- prior to exiting, such as updating or closing data files, you
- should set a function to be executed from within the od_exit()
- function. This is accomplished by using the od_control.
- od_before_exit variable, as described in the section on the
- OpenDoors control structure in chapter 5. Use of this variable
- will allow your program to always carry out these activates,
- even if OpenDoors decides to call the od_exit() function itself,
- such as when a user hangs up on the door.
- Note that in special cases, you may use the
- od_control.od_disable variable to prevent the od_exit() function
- from re-writing the door information file. Also, you may use the
- od_control.od_noexit variable to shutdown door operations
- without actually exiting your program. Both of these variables
- are described in chapter 5.
- SEE ALSO od_init()
- EXAMPLE The example below demonstrates a function which a door could
- execute when the user chooses to exit the door. This function
- will ask the user whether they wish to exit the door and return
- to the BBS, simply logoff of the BBS, or continue using the
- door. The example function will then call od_exit() if the user
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 79
- wishes to exit the door, or return control to the function which
- called it, if the user does not wish to exit:
- void goodbye(void)
- {
- char pressed;
- /* Display choices to user */
- od_disp_str("You have chosen to exit this door.\n\r");
- od_disp_str("Do you wish to:\n\r");
- od_disp_str(" [R]eturn to the BBS\n\r");
- od_disp_str(" [L]ogoff of the BBS\n\r");
- od_disp_str(" [C]ontinue using the door\n\r");
- for(;;) /* loop until user makes valid choice */
- {
- pressed=od_get_key(TRUE); /* Get key from user */
- /* If user selects R, exit without hanging up */
- if(pressed=='R' || pressed=='r') od_exit(40,FALSE);
- /* If user selects L, hangup and then exit */
- if(pressed=='L' || pressed=='l') od_exit(41,TRUE);
- /* If user selects C, return and allow door to continue */
- if(pressed=='C' || pressed=='c') return;
- }
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 80
- OD_GET_ANSWER()
- -------------------------------------------------------------------------------
- PURPOSE Function to allow the user to respond to a prompt using only
- certain keys.
- FORMAT char od_get_answer(char *pszOptions);
- RETURNS Character that user entered
- DESCRIPTION This function can be used to get a response from the user, when
- only particular responses should be accepted. The parameter to
- the od_get_answer() function is simply a string listing the
- valid responses. The function will wait until the user selects
- one of the valid responses, and then return that response. The
- function is case insensitive, and will return the character in
- the same case that was supplied to it in the string.
- SEE ALSO od_get_key(), od_hotkey_menu()
- EXAMPLES od_get_answer("YN");
- - If the user presses 'y', will return 'Y'.
- od_get_answer("yn");
- - If the user presses 'y', will return 'y'.
- od_get_answer("ABC 123\n\rZ");
- - Valid responses will be: [A], [B], [C], [SPACE],
- [1], [2], [3], [ENTER], [Z]
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 81
- OD_GET_INPUT()
- -------------------------------------------------------------------------------
- PURPOSE This function allows a single input event (e.g. keystroke) to be
- retrieved, optionally translating extended key sequences such as
- arrow keys and the insert key.
- FORMAT BOOL od_get_input(tODInputEvent *pInputEvent,
- tODMilliSec TimeToWait, WORD wFlags);
- RETURNS TRUE on success, FALSE if no input event was retrieved.
- DESCRIPTION Like od_get_key(), od_get_input() can be used to retrieve a
- single key of input from the user. However, od_get_input() has
- been designed to be easily extended in future versions of
- OpenDoors. The information retrieved by this new function is
- placed in a structure, which contains information on whether the
- input event was generated by the remote user or the local
- console, and what type of input event it was. This function also
- has built-in the ability to recognize and translate the multiple-
- character sequences that are generated when the user presses
- extended keys such as arrow keys, insert, delete, etc.
- The first parameter points to a tODInputEvent structure, which is
- defined as follows:
- typedef struct
- {
- tODInputEventType EventType;
- BOOL bFromRemote;
- char chKeyPress;
- } tODInputEvent;
- When od_get_input() successfully retrieves an input event, this
- structure is filled with information about the input. The
- EventType member can be either EVENT_CHARACTER (indicating a
- single character keystroke) or EVENT_EXTENDED_KEY (indicating an
- extended key, such as an arrow key). In the case of
- EVENT_CHARACTER, chKeyPress is set to the character that was
- received. In the case of EVENT_EXTENDED_KEY, chKeyPress is set to
- one of the following values:
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 82
- +------------------+---------------+-------------------------+
- | chKeyPress Value | Meaning | Control Key Alternative |
- +------------------+---------------+-------------------------+
- | OD_KEY_F1 | [F1] | None |
- | OD_KEY_F2 | [F2] | None |
- | OD_KEY_F3 | [F3] | None |
- | OD_KEY_F4 | [F4] | None |
- | OD_KEY_F5 | [F5] | None |
- | OD_KEY_F6 | [F6] | None |
- | OD_KEY_F7 | [F7] | None |
- | OD_KEY_F8 | [F8] | None |
- | OD_KEY_F9 | [F9] | None |
- | OD_KEY_F10 | [F10] | None |
- | OD_KEY_UP | [UP ARROW] | [CTRL]-[E] |
- | OD_KEY_DOWN | [DOWN ARROW] | [CTRL]-[X] |
- | OD_KEY_LEFT | [LEFT ARROW] | [CTRL]-[S] |
- | OD_KEY_RIGHT | [RIGHT ARROW] | [CTRL]-[D] |
- | OD_KEY_INSERT | [INSERT] | [CTRL]-[V] |
- | OD_KEY_DELETE | [DELETE] | [CTRL]-[G] |
- | OD_KEY_HOME | [HOME] | None |
- | OD_KEY_END | [END] | None |
- | OD_KEY_PGUP | [PAGE UP] | None |
- | OD_KEY_PGDN | [PAGE DOWN] | None |
- | OD_KEY_SHIFTTAB | [SHIFT]-[TAB] | None |
- +------------------+---------------+-------------------------+
- The bFromRemote member of the tODInputEvent structure will be set
- to TRUE if the input event originated from the remote system, or
- FALSE if the event originated from the local system.
- The second parameter, TimeToWait specifies how long the function
- should wait for input before returning, in milliseconds. A value
- of 0 causes the function to return immediately if no input is
- waiting in OpenDoor's internal input buffer. The is equivalent to
- a value of FALSE being passed to the od_get_key() function. A
- value of OD_NO_TIMEOUT causes this function to wait and only
- return after the next input event has been received. This is
- equivalent to a value of TRUE being passed to the od_get_key()
- function. An other value specifies the maximum number of
- milliseconds that od_get_input() should wait for input. If input
- is received before this time elapses, od_get_key() will return
- immediately with a value of TRUE, and the tODInputEvent structure
- will be fill accordingly. If no input is received before this
- time elapses, od_get_key() will return FALSE. The number of
- milliseconds to wait is rounded to the nearest 55 milliseconds in
- the DOS version of OpenDoors.
- The third parameter allows you to specify flags to further
- control the behavior of od_get_input(). Normally, this parameter
- will be set to GETIN_NORMAL. However, you can disable all
- translation of extended keystrokes by setting this value to
- GETIN_RAW. In this mode, od_get_input() works just like
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 83
- od_get_key(), returning every individual character received from
- the remote system.
- Since extended keys are not directly supported by all terminal
- programs, od_get_input() provides alternatives for some of the
- extended keys, in the form of control-key combinations. The
- control key combinations recognized by od_get_input() are listed
- in the table above. However, these control key alternatives can
- be ignored by setting the GETIN_RAWCTRL flag.
- The od_get_input() function is used internally by
- od_popup_menu(), od_edit_str() and od_multiline_edit().
- SEE ALSO od_get_key(), od_clear_keybuffer()
- EXAMPLE The following example shows the structure of how od_get_input()
- might be used in your program:
- tODInputEvent InputEvent;
- od_get_input(&InputEvent, OD_NO_TIMEOUT, GETIN_NORMAL);
- if(InputEvent.EventType == EVENT_EXTENDED_KEY)
- {
- switch(InputEvent.chKeyPress)
- {
- case OD_KEY_UP:
- /* The up arrow key has been pressed. */
- break;
- case OD_KEY_DOWN:
- /* The down arrow key has been pressed. */
- break;
- }
- }
- else if(InputEvent.EventType == EVENT_CHARACTER)
- {
- /* A single character key has been pressed, and is */
- /* stored in InputEvent.chKeyPress. */
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 84
- OD_GET_KEY()
- -------------------------------------------------------------------------------
- PURPOSE Function to input a key from the user
- FORMAT char od_get_key(BOOL bWait);
- RETURNS The next key waiting from the keyboard, or 0 if none.
- DESCRIPTION This function retrieves the next key waiting in the OpenDoors
- keyboard buffer (see the description of the od_clear_keybuffer()
- function, on page 53, for more information on the OpenDoors
- keyboard buffer). The od_get_key() function allows your door to
- retrieve both those keystrokes pressed by the user, and the
- keystrokes pressed on the sysop keyboard (other than the sysop
- function keys), in the sequence they were pressed. Since input
- is accepted from both sources, it is possible for the sysop, as
- well as the remote user, to make selections and control the
- door.
- Door input with OpenDoors can be accomplished with this
- function, with the od_input_str() function or with the
- od_edit_str() function. The od_input_str() and od_edit_str()
- functions is used to input an entire sequence of characters from
- the user (a string), and requires the user to press the [Enter]
- key when they are finished typing their input. On the other
- hand, the od_get_key() function is used to input a single
- keystroke (one character) from the user, and allows the user to
- make choices without having to press the enter key.
- The od_get_key() function accepts a single parameter, which
- determines whether or not it should wait for the user to press a
- key, if they have not already done so. If you pass a FALSE value
- to od_get_key(), then the function will not wait for a key to be
- pressed at the keyboard, but instead return a 0 if there are no
- keys waiting in the buffer. If you pass a TRUE value to
- od_get_key(), then this function will instead wait for a key to
- be pressed. Also, while waiting for the user to press a key, the
- od_get_key() function will give up the processor to other
- waiting programs, if you door is running under DesqView.
- If you are waiting for the user to make a choice from a menu or
- list of options, you will most likely pass a TRUE to the
- od_get_key() function, indicating that you wish for it to wait
- until a key is pressed. However, if you wish to continue other
- processing if no key is yet available from the keyboard, you
- should pass a FALSE to the od_get_key() function. For example,
- if you are displaying a screen of text, and wish to allow the
- user to pause or abort the display, you would simply call the
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 85
- od_get_key() function every few moments, passing it a value of
- FALSE. You would then be able to check if any control keys have
- been pressed, and if not, continue displaying text.
- The od_get_key() function returns the ASCII value representing
- the keystroke that was made. If you are waiting for the user to
- make a particular choice, perhaps from a menu, you will most
- likely store the value returned by od_get_key() in a variable of
- type char. For example:
- char key;
- ...
- key=od_get_key(TRUE);
- You would then be able to determine which key the user pressed
- by testing the value of key, either by comparing it's numerical
- ASCII value, or by comparing it to a character constant. If you
- are testing for a non-character key, such as [ESCape], [Tab] or
- [Return], you may wish to use the ASCII value of that key. For
- example, if you wished to take some action in the case that the
- user presses the [Enter]/[Return] key, who's ASCII value is 13,
- you could do:
- key=od_get_key(TRUE); /* Get keypress from user */
- if(key==13) /* If key was [Enter]/[Return] */
- {
- ... /* Whatever you want to do */
- }
- If you wish, instead, to respond to the user pressing a
- character key (perhaps as a choice from a menu), you can do so
- by using character constants, such as 'c', '6', or 'F'. Also,
- when testing for an alphabetical character, you will probably
- want to check for the user pressing either the upper or lower-
- case version of the letter. For example, if you wished to have
- the user press the [Y] key to continue, you could test for
- either an upper or lower-case Y as follows:
- key=od_get_key(TRUE); /* Get keypress from user */
- if(key=='y' || key=='Y') /* If key was [y]/[Y] */
- {
- ... /* Whatever you want to do */
- }
- The charts on the following page lists the decimal value and corresponding
- keystroke(s) of each of the ASCII values from 0 to 127.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 86
- ASCII KEYSTROKE | ASCII KEYSTROKE
- ----- ------------------------------ | ----- ----------------------
- 0 [Control]-[@] | 15 [Control]-[O]
- 1 [Control]-[A] | 16 [Control]-[P]
- 2 [Control]-[B] | 17 [Control]-[Q]
- 3 [Control]-[C] | 18 [Control]-[R]
- 4 [Control]-[D] | 19 [Control]-[S]
- 5 [Control]-[E] | 20 [Control]-[T]
- 6 [Control]-[F] | 21 [Control]-[U]
- 7 [Control]-[G] | 22 [Control]-[V]
- 8 [Control]-[H]/[Backspace] | 23 [Control]-[W]
- 9 [Control]-[I]/[Tab] | 24 [Control]-[X]
- 10 [Control]-[J] | 25 [Control]-[Y]
- 11 [Control]-[K] | 26 [Control]-[Z]
- 12 [Control]-[L] | 27 [ESCape]
- 13 [Control]-[M]/[Enter]/[Return] | 32 [SpaceBar]
- 14 [Control]-[N] |
- ASCII KEYSTROKE | ASCII KEYSTROKE | ASCII KEYSTROKE | ASCII KEYSTROKE
- ----- --------- | ----- --------- | ----- --------- | ----- ---------
- 33 '!' | 57 '9' | 80 'P' | 104 'h'
- 34 '"' | 58 ':' | 81 'Q' | 105 'i'
- 35 '#' | 59 ';' | 82 'R' | 106 'j'
- 36 '$' | 60 '<' | 83 'S' | 107 'k'
- 37 '%' | 61 '=' | 84 'T' | 108 'l'
- 38 '&' | 62 '>' | 85 'U' | 109 'm'
- 39 '\'' (') | 63 '?' | 86 'V' | 110 'n'
- 40 '(' | 64 '@' | 87 'W' | 111 'o'
- 41 ')' | 65 'A' | 88 'X' | 112 'p'
- 42 '*' | 66 'B' | 89 'Y' | 113 'q'
- 43 '+' | 67 'C' | 90 'Z' | 114 'r'
- 44 ',' | 68 'D' | 91 '[' | 115 's'
- 45 '-' | 69 'E' | 92 '\\' (\) | 116 't'
- 46 '.' | 70 'F' | 93 ']' | 117 'u'
- 47 '/' | 71 'G' | 94 '^' | 118 'v'
- 48 '0' | 72 'H' | 95 '_' | 119 'w'
- 49 '1' | 73 'I' | 96 '`' | 120 'x'
- 50 '2' | 74 'J' | 98 'b' | 121 'y'
- 51 '3' | 75 'K' | 99 'c' | 122 'z'
- 52 '4' | 76 'L' | 100 'd' | 123 '{'
- 53 '5' | 77 'M' | 101 'e' | 124 '|'
- 54 '6' | 78 'N' | 102 'f' | 125 '}'
- 55 '7' | 79 'O' | 103 'g' | 126 '~'
- 56 '8' | | | 127 [DELete]
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 87
- SEE ALSO od_get_input(), od_input_str(), od_edit_str(),
- od_clear_keybuffer()
- EXAMPLE For examples of the use of the od_get_key() function, see the
- examples in the description portion, above, and the examples for
- the od_exit() and od_clear_keybuffer() functions. For further
- examples of this function, see the example program EX_VOTE.C,
- described in the section beginning on page 38.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 88
- OD_GETTEXT()
- -------------------------------------------------------------------------------
- PURPOSE Stores a rectangular region of the screen in an array, to later
- be redrawn using od_puttext(). Requires ANSI, AVATAR or RIP
- modes.
- FORMAT BOOL od_gettext(INT nLeft, INT nTop, INT nRight, INT nBottom,
- void *pBlock);
- RETURNS TRUE on success
- FALSE on failure
- DESCRIPTION This function stores the contents (both text and color
- information) of the rectangular portion of the screen denoted by
- the variables nLeft, nTop, nRight and nBottom into the buffer
- pointed to by pBlock. The saved portion of the screen may then
- be restored using od_puttext(). The buffer must be large enough
- to store two bytes for every character in the specified
- rectangle. In other words, the required size of the buffer, in
- bytes, is:
- length * width * 2
- The parameters nLeft and nRight are column numbers from 1 to 80,
- and the parameters nTop and nBottom are row numbers between 1
- and 23.
- This function has no effect on the current text color or cursor
- position. ANSI, AVATAR or RIP mode is required for this
- function. If you wish to save and restore the entire screen, you
- may use the od_save_screen() and od_restore_screen() functions,
- which can be used in all display modes.
- If this function fails for any reason, a value of FALSE is
- returned, and the od_control.od_error variable is set to
- indicate the reason for the failure. For more information on the
- od_control.od_error variable, see page 185.
- SEE ALSO od_puttext(), od_save_screen(), od_restore_screen(),
- od_scroll(), od_window_create(), od_window_remove()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 89
- OD_HOTKEY_MENU()
- -------------------------------------------------------------------------------
- PURPOSE Function to display a menu file with hotkeys
- FORMAT char od_hotkey_menu(char *pszFileName, char *pszHotKeys, BOOL
- bWait);
- RETURNS Key pressed in response to menu, or '\0' if none.
- DESCRIPTION This function can be used to display a menu from an ASCII, ANSI,
- AVATAR or RIP file, allowing the user to select an option at any
- time while the menu is being displayed. The od_hotkey_menu()
- function is quite similar to the od_send_file() function, and
- you should probably familiarize yourself with that function if
- you are going to use od_hotkey_menu(). Like od_send_file(),
- od_hotkey_menu() will display the file specified by pszFileName,
- using the appropriate terminal emulation. If no extension is
- provided for the filename, OpenDoors will automatically search
- for matching files ending in .ASC, .ANS and .AVT extensions.
- OpenDoors will the select the appropriate file to display, based
- on the available files and available terminal emulation.
- The second parameter, pszHotKeys, is a string specifying the
- valid responses to the menu, in the same format as the string
- passed to the od_get_answer() function. If any of the characters
- listed in this string are pressed, either uppercase or lowercase
- versions, OpenDoors will immediately stop displaying the menu,
- and return with the value of the key pressed. The case (upper or
- lower) returned will always be identical to the case used in the
- hotkeys string. You can include the [ENTER] key as a valid hot
- key by including the \n character in the hotkey string.
- The third parameter passed to od_hotkey_menu(), bWait, specifies
- whether OpenDoors should wait after displaying the menu for the
- user to make a valid selection from the menu (TRUE), or if it
- should exit immediately (FALSE). Normally, you will want to use
- the TRUE value when calling this function. This will allow you
- to use a single function call that will display the menu and
- always return the user's selection. If you wish to gain control
- as soon as OpenDoors has displayed the menu, you may specify
- FALSE for this parameter. In this case, if the user does not
- press any of the valid hot keys while the menu is being sent,
- the function will return the character '\0'.
- SEE ALSO od_send_file(), od_get_answer()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 90
- EXAMPLE As an example of the use of the od_hotkey_menu() function,
- consider the following code fragment:
- for(;;) /* Main program loop */
- { /* Display menu and get user's choice */
- char choice=od_hotkey_menu("MAINMENU","123Q",TRUE");
- switch(choice) /* Perform the appropriate action */
- {
- case '1':
- od_printf("You selected one.\n\r");
- break;
- case '2':
- od_printf("You selected two.\n\r");
- break;
- case '3':
- od_printf("You selected three.\n\r");
- break;
- case 'Q':
- od_exit(FALSE,10);
- }
- }
- This is an example of the main menu loop of a simple door that
- uses the od_hotkey_menu() function. The program will continue
- executing the for(;;) loop until the user chooses to exit the
- door. On each iteration of the loop, the od_hotkey_menu()
- function is called, to display the door's menu from the file
- MAINMENU.A??. The appropriate .ASC/.ANS/.AVT file will be chosen
- and displayed as the menu. The possible choices that may be made
- from the menu are specified by the string "123Q". Thus, whenever
- the user presses one of the keys [1], [2], [3] or [Q], the
- od_hotkey_menu() function will return immediately with the value
- of the key pressed. If the menu is still being displayed at the
- time when the key was pressed, menu display will cease at that
- moment. The program then executes a case statement, to respond
- to the user's key appropriately. If the user presses [1], [2] or
- [3] this door will output a simple message to the screen. If the
- user presses the [Q] key, the door will pass control back to the
- BBS.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 91
- OD_INIT()
- -------------------------------------------------------------------------------
- PURPOSE To initialize OpenDoors activities
- FORMAT void od_init(void);
- RETURNS N/A
- DESCRIPTION This function initializes OpenDoors. This function must be
- called manually if you wish to access data about the user, etc.,
- before you call any other OpenDoors functions. However, if you
- do not explicitly call the od_init() function, it will be called
- automatically on the first call to most other OpenDoors
- functions. The only functions that should be called before
- od_init() are od_add_personality() and od_parse_cmd_line(). The
- od_init() function reads information from the door information
- file, initializes communications with the modem, displays the
- status line, and sets up OpenDoors' internal data structures.
- For more information on what data is and is not available before
- od_init() has been called, please refer to the chapter on the
- OpenDoors control structure, which begins on page 148.
- The od_init() function will read the door information file which
- is located in the directory specified by the variable
- od_control.info_path. If this variable has not been set prior to
- calling the od_init() function, OpenDoors will expect to find
- the door information file in the current directory. Thus, if you
- wish your door to be able to be run in a directory other than
- the BBS system directory, it would be a good idea to allow the
- sysop using your door to specify the location of the door
- information file. For an example of setting the
- od_control.info_path variable, please see the example program
- located on page 150.
- Also note that you can prevent the od_init() function from
- carrying out some of it's normal activities, such as attempting
- to read a door information file, by the use of the
- od_control.od_disable variable, as described in the section on
- the OpenDoors control structure, which begins on page 148.
- SEE ALSO od_exit()
- EXAMPLE At times, you may wish to write a door program which will
- require a maintenance utility to be run on a regular basis. For
- example, a game door may have to have its system files updated
- on a daily basis, by having a utility program run in a system
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 92
- event each day at midnight. One way of accomplishing this would
- be to have your door package include two .EXE files, one being
- the actual door program, and the other being a utility program.
- However, another option would be to have both the door and
- maintenance functions to be accessible from a single .EXE file,
- in order to simplify use of the door for the sysop. In this
- case, you would want to test the command line to determine
- whether your program should run in door mode or maintenance
- mode. You would then only execute the od_init() function, along
- with the rest of your door code, if you program were running in
- "door mode".
- The program below demonstrates one method of doing just this. In
- this case, the program would include two functions, door(),
- which would carry out all of the door-related activities, and
- maint(), which would carry out all of the maintenance-related
- activities. In this simple example, if the command line includes
- a "-M" or "/M", the program will run in maintenance mode,
- otherwise it will run in door mode. Also, if it is running in
- door mode, the program will take the first command-line
- parameter, if any, as a path to the location of the door
- information file.
- #include "opendoor.h"
- void door(void);
- void maint(void);
- int main(int argc, char *argv[])
- {
- int counter;
- /* Check any command line parameters for /M or -M */
- for(counter=1;counter<argc;++counter)
- {
- if((argv[counter])[1]=='m' || (argv[counter])[1]=='M')
- {
- maint(); /* Then carry out maintenance */
- exit(20); /* And exit */
- }
- }
- /* If there was no -M or /M, then run in door mode */
- /* If there are any command-line parameters take the first */
- /* as the path to the door information file */
- if(argc>1) strncpy(od_control.info_path,argv[1],59);
- od_init(); /* call the od_init() function */
- door(); /* Run the door portion of the program */
- od_exit(30,FALSE); /* Shutdown the door */
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 93
- }
- void maint(void)
- {
- ... /* Carry out maintenance activities here */
- }
- void door(void)
- {
- ... /* Carry out door activities here */
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 94
- OD_INPUT_STR()
- -------------------------------------------------------------------------------
- PURPOSE Inputs a string from the user
- FORMAT void od_input_str(char *pszInput, INT nMaxLength,
- unsigned char chMin, unsigned char chMax);
- RETURNS N/A
- DESCRIPTION To perform string input within OpenDoors, one of two functions
- can be used, od_input_str() and od_edit_str(). The first
- function, od_input_str(), allows simple line input and editing,
- and can be used in ASCII, ANSI, AVATAR and RIP modes. The second
- function, od_edit_str(), allows many formatted input options,
- advanced line editing, and other features, but requires the use
- of ANSI, AVATAR or RIP graphics modes.
- The od_input_str() function allows you to input a string from
- the user. The string will be permitted to have up to the number
- of characters specified by the max_len parameter, and all
- characters must be between the values of the min_char and
- max_char parameters. This function will wait until the user
- presses the [Enter] key to finish inputting the string.
- The first parameter passed to this function should be a pointer
- to the string where the user's input should be stored. So, if
- you wanted to store a string of up to 30 characters inputted by
- the user, you might define this string as follows:
- char input_string[31];
- Notice here than the string must be long enough to hold the
- thirty characters which can be entered by the user, along with
- the additional "null" character which is used to indicate the
- end of a string in C. Hence, the length of the string should
- always be at least one greater than the total number of
- characters the user is permitted to enter, passed in the
- nMaxLength parameter.
- The second parameter passed to the od_input_str() function
- should be an integer value indicating the maximum number of
- characters which can be input by the user. For example, if this
- parameter had a value of 10, the user would be able to enter a
- string containing any number of characters up to and including
- 10 characters. If this parameter had a value of 1, the user
- would only be able to enter a single character. However, the
- user would be able to backspace, change the character, and press
- [Enter] when they were satisfied with their entry. Note that
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 95
- even if you only ask the od_input_str() function to input a
- single character, it will still expect a STRING to be passed to
- it, and will return a string with either zero or one character,
- followed by a null (string terminator) character.
- The third and fourth parameters passed to this function allow
- you to control what characters the user will be permitted to
- enter as part of the string. For example, you could set the
- minimum character to the '0' character and the maximum character
- to the '9' character, permitting the user to only enter numeric
- characters. On the other hand, you could permit the user to
- enter all ASCII characters in the range from 32 to 127. The
- od_input_str() function will permit characters in the range
- beginning with the character passed as minchar, up to and
- including the character passed as maxchar.
- SEE ALSO od_edit_str(), od_get_key(), od_clear_keybuffer()
- EXAMPLE Below are a number of examples of the use of the od_input_str()
- function in various applications:
- - To input a two character number (only digits from 0-9):
- od_input_str(string, 2, '0', '9');
- - To input a 35 character name (characters from Space to
- ASCII 127):
- od_input_str(string, 35, 32, 127);
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 96
- OD_KERNEL()
- -------------------------------------------------------------------------------
- PURPOSE The OpenDoors Central Control function.
- FORMAT void od_kernel(void);
- RETURNS N/A
- DESCRIPTION In the DOS version of OpenDoors, the od_kernel() function is
- responsible for many vital OpenDoors tasks, such as monitoring
- the carrier detect signal, monitoring the amount of time that
- the user has remaining, updating the status line, responding to
- sysop hotkeys, and reading characters which are received from
- the modem. The od_kernel() function is automatically called on a
- frequent basis by the other OpenDoors functions, so most often
- you will not need to be concerned with this function. However,
- in order that OpenDoors can carry out the activities mentioned
- above with a quick response, it is important that od_kernel(),
- or some other OpenDoors function be called at least once every
- second. Thus, if your program will be carrying out some
- processing, in which it will not be calling any OpenDoors
- functions for more than a second or so, you should call the
- od_kernel() function yourself. The example below demonstrates
- one method of doing just this.
- Note that if for some reason or other, it is not possible for
- your program to call the od_kernel() function, or any other
- OpenDoors functions for a period of several seconds, this will
- not cause your door to crash or fail in any way. The only
- problem will be that OpenDoors will not be able to respond to
- any action, such as the sysop pressing a function key, or the
- user dropping carrier, until such time as you next call
- od_kernel(), or some OpenDoors function. Hence, use of the
- od_kernel() function will improve the quality and response time
- of your program, but calling it or some OpenDoors function on a
- regular basis is not absolutely vital.
- This function has no effect in the Win32 version of OpenDoors.
- SEE ALSO od_sleep()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 97
- OD_LIST_FILES()
- -------------------------------------------------------------------------------
- PURPOSE Lists files in a particular file area (using FILES.BBS)
- FORMAT BOOL od_list_files(char *pszFileSpec);
- RETURNS TRUE if successful, FALSE if unsuccessful
- DESCRIPTION This function allows you to display a list of files available
- for download from a particular file area, as any BBS system
- would. The file names and descriptions are taken from the
- FILES.BBS located in the directory pointed to by pszFileSpec.
- Thus, to list the files available for download in
- C:\BBS\FILES\UPLOADS, simply:
- od_list_files("C:\\BBS\\FILES\\UPLOADS");
- OpenDoors uses a third-generation FILES.BBS format, that is
- compatible with other FILES.BBS formats, but adds some
- additional features. Each line in the FILES.BBS file lists a
- filename, along with it's description. Thus, a typical FILES.BBS
- file might look as follows:
- PKZ110.EXE PKZip file compressor, version 1.10
- ODOORS60.ZIP The newest version of OpenDoors
- REC*.ZIP A Record file
- C:\BBS\*.* All BBS files.
- When displayed, OpenDoors will list the size of each file found
- in the FILES.BBS file beside it's name, if the file is found. If
- the file does not exist, then a "[OFFLINE]" string is displayed
- in the file size column. Title lines may also be added to the
- FILES.BBS, by indenting them one or more columns. Thus, you
- could have something like:
- NEWEST UPLOADS
- ~~~~~~~~~~~~~~
- PKZ110.EXE PKZip file compressor, version 1.10
- ODOORS60.ZIP The newest version of OpenDoors
- REC*.ZIP A Record file
- C:\BBS\*.* All BBS files.
- In addition to this standard FILES.BBS format, OpenDoors will
- also permit wildcards to be used in FILES.BBS filenames (ie
- FNEWS???.*), or full directory paths to allow files from several
- different directories to be included in the same files area.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 98
- You may alter the colors used to display the various portions of
- the files list using the od_control variables:
- od_control.od_list_title_col
- od_control.od_list_name_col
- od_control.od_list_size_col
- od_control.od_list_comment_col
- od_control.od_list_offline_col
- which are documented in the OpenDoors control structure section
- on this manual, which begins on page 148.
- SEE ALSO od_send_file()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 99
- OD_LOG_WRITE()
- -------------------------------------------------------------------------------
- PURPOSE Function to write an entry to the log file
- FORMAT BOOL od_log_write(char *pszMessage);
- RETURNS TRUE on success, or FALSE on failure
- DESCRIPTION This function can be used to write entries to the log file. If
- the logfile has not already been opened when you call this
- function for the first time, OpenDoors will automatically open
- the log file at that time.
- To create an entry in the log file, simply call the
- od_log_write() function, passing to it the string of the text
- you wish to write. You should not include any control characters
- in this string, simply the text that should appear on the line.
- OpenDoors will automatically format the log file, adding the
- time information and other control characters. It is recommended
- that the length of the string passed to od_log_write() not
- exceed 67 characters, in order that logfile lines will all be
- less than 80 characters in length.
- Log file entries do not usually contain periods or other
- punctuation at the end of the line. Also, log file entries are
- usually written in the present tense. The first character of the
- entry is usually upper-case, with all other entries in lower
- case. Also, since excessive numbers or lengths of log file
- entries can quickly use a lot of disk space, it is best to think
- carefully about what events should be recorded in the log file.
- It is also a good idea to minimize the number of words used in
- the entry, without being too cryptic. As an example, "User
- entering options menu" should be used instead of "user entered
- the options menu."
- SEE ALSO Page 224.
- EXAMPLE Calling the od_log_write() function is as simple as follows:
- od_log_write("Awarding user with 5 minutes more time");
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 100
- OD_MULTILINE_EDIT()
- -------------------------------------------------------------------------------
- PURPOSE Provides a multiple line text editor which can be used for
- entering editing any text that spans more than one line, such as
- messages or text files.
- FORMAT INT od_multiline_edit(char *pszBufferToEdit, UINT unBufferSize,
- tODEditOptions *pEditOptions);
- RETURNS OD_MULTIEDIT_SUCCESS on success, or OD_MULTIEDIT_ERROR on
- failure
- DESCRIPTION This function provides a text editor with optional word wrap
- capabilities. This editor can be used for entering or editing
- text files, messages or other information that spans multiple
- lines. The editor can be configured to operate in full-screen
- mode, or to occupy any smaller area of the screen that you
- specify. It provides the navigation (home / end / page up / arrow
- keys) features and editing features (insert / overwrite mode,
- Ctrl-Y to delete a line, etc.) that you would expect.
- The od_multiline_edit() function is designed to be both easy to
- use and very flexible. To that end, the function only takes three
- parameters. The first two parameters are required, and the third
- parameter is an optional options structure. The first parameter,
- pszBufferToEdit, is a pointer to the buffer of text to edit. This
- buffer must always be a '\0'-terminated string. This buffer must
- be initialized before calling od_multiline_edit(). The second
- parameter, unBufferSize, indicates the size of the buffer that is
- passed in pszBufferToEdit. Note that this should be the total
- amount of space that is available in the buffer for text entered
- by the user, not the length of data that is actually initially in
- the buffer. If you do not wish to customize any of the
- od_multiline_edit() options, then you may simply set the third
- parameter to 0. Hence, a simple example of how to use
- od_multiline_edit() is:
- char szMyEditBuffer[4000] = "";
- od_multiline_edit(szMyEditBuffer, sizeof(szMyEditBuffer),
- NULL);
- If you wish to customize od_multiline_edit(), you should pass a
- pointer to a tODEditOptions structure as the third parameter. You
- should initialize this entire structure to zeros before
- attempting to use it. You can then set any values of this
- structure which you wish to change from their default. Any values
- that are left at 0 will automatically revert to their defaults.
- For example, if you wanted to specify a text format other than
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 101
- the default, you could create, initialize and pass in a
- tODEditOptions structure as follows:
- char szMyEditBuffer[4000] = "";
- tODEditOptions MyEditOptions;
- memset(&MyEditOptions, 0, sizeof(MyEditOptions));
- MyEditOptions.TextFormat = FORMAT_LINE_BREAKS;
- od_multiline_edit(szMyEditBuffer, sizeof(szMyEditBuffer),
- &MyEditOptions);
- The definition of the tODEditOptions structure is as follows:
- typedef struct
- {
- INT nAreaLeft;
- INT nAreaTop;
- INT nAreaRight;
- INT nAreaBottom;
- tODEditTextFormat TextFormat;
- tODEditMenuResult (*pfMenuCallback)(void *pUnused);
- void * (*pfBufferRealloc)(void *pOriginalBuffer,
- UINT unNewSize);
- DWORD dwEditFlags;
- char *pszFinalBuffer;
- UINT unFinalBufferSize;
- } tODEditOptions;
- nAreaLeft, nAreaTop, nAreaRight, nAreaBottom allows you to
- specify the portion of the screen that the text editor should
- use. This defaults to 1, 1 - 80, 23.
- TextFormat allows you to specify what format the text should be
- stored in the buffer using. The default is
- FORMAT_PARAGRAPH_BREAKS, which specifies that a line break only
- appears at the end of each paragraph, and that the contents of a
- paragraph are word wrapped. FORMAT_LINE_BREAKS specifies that a
- line break appears at the end of each line of text on the screen,
- and that newly entered text is word wrapped. FORMAT_NO_WORDWRAP
- is equivalent to FORMAT_LINE_BREAKS, except that newly entered
- text is not word wrapped. Instead, lines may be arbitrarily long.
- For each of these text formats, od_multiline_edit() automatically
- decides whether line breaks should take the form of a carriage
- return ('\r'), line feed ('\n'), or some combination of these,
- based on what it sees in the buffer that you supply. If no line
- breaks are found in the buffer, then the default is to use just a
- line feed ('\n') character. FORMAT_FTSC_MESSAGE specifies a FTSC-
- compliant message, such as is used in a *.MSG message file. Among
- other things, this specifies that carriage returns ('\r') end
- paragraphs, and that line feeds ('\n') should be ignored.
- pfMenuCallback allows you to provide a callback function that
- will be called when the user presses the escape (or control-Z)
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 102
- key. This allows you to provide a menu that can be accessed from
- within the text editor. This function should return
- EDIT_MENU_DO_NOTHING if the editor should continue normally, or
- EDIT_MENU_EXIT_EDITOR if the od_multiline_edit() should return.
- If no menu callback function is provided, then
- od_multiline_edit() always returns when the escape or control-z
- key is pressed.
- pfBufferRealloc allows you to provide a function which will
- attempt to reallocate a larger buffer if the user enters more
- text than will fit in the originally supplied buffer. You should
- only do this if you have dynamically allocated the buffer that
- you initially passed into od_multiline_edit(). If you allocated
- the buffer using malloc() or calloc(), then pfBufferRealloc can
- be set to point to the realloc() function. If you allocated the
- buffer using the C++ new operator, then you must write a your own
- reallocation function which obeys the same semantics as the C
- realloc() function. If no buffer reallocation function is
- provided, then od_multiline_edit() will never allow the user to
- enter more text than will fit in the buffer that you initially
- supply. If you are using the buffer reallocation option, you can
- obtain a pointer to the final buffer, and the size of the final
- buffer, from the pszFinalBuffer and unFinalBufferSize members.
- SEE ALSO od_input_str(), od_edit_str(), od_get_input()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 103
- OD_PAGE()
- -------------------------------------------------------------------------------
- PURPOSE Function to allow user to page the sysop
- FORMAT void od_page(void);
- RETURNS N/A
- DESCRIPTION This function can be called to allow the user to page the sysop.
- This function will ask the user why they wish to chat with the
- sysop, and then page the sysop. The sysop will then be free to
- break into chat at any time. Sysop paging will also be aborted
- by the user, simply by pressing [Enter] when asked for a reason
- for chat. When the user pages the sysop, the [Wants-Chat]
- indicator will begin to flash on the main status line, and the
- status line will switch to show the user's reason for wanting to
- chat. Also, the user's total number of pages will be
- incremented.
- Depending upon the setting of the od_control.od_okaytopage
- variable, this function will also optionally check sysop paging
- hours, and only allow the user to page the sysop during valid
- paging hours. For information on the variables containing the
- user's total number of pages, the user's want-chat status, valid
- sysop paging hours, and the od_control.od_okaytopage variable,
- see the section on the OpenDoors control structure, which begins
- on page 148.
- EXAMPLE For an example of the use of the od_page() function, see the
- EX_VOTE.C example program, which is described beginning on page
- 38.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 104
- OD_PARSE_CMD_LINE()
- -------------------------------------------------------------------------------
- PURPOSE Handles standard command line options.
- FORMAT Under DOS Version:
- void od_parse_cmd_line(INT nArgCount, char *papszArguments[]);
- Under Win32 Version:
- void od_parse_cmd_line(LPSTR pszCmdLine);
- RETURNS N/A
- DESCRIPTION This is the only OpenDoors function that uses a different
- calling format in the DOS and Win32 versions of OpenDoors. The
- reason for this is that od_parse_cmd_line() always allows you to
- pass command line parameters in the same format that the
- operating system passes them to you. Under the DOS version of
- OpenDoors, you should pass the argc and argv values that were
- passed to your main function as the two parameters to
- od_parse_cmd_line(). Under the Win32 version of OpenDoors, you
- should pass the pszCmdLine values that were passed to your
- WinMain() function as the one parameter to od_parse_cmd_line().
- The od_parse_cmd_line() function should be called before your
- first call to any other OpenDoors function, with the possible
- exception of the od_add_personality() function.
- It is recommended that any program which uses OpenDoors call
- od_parse_cmd_line() as part of its startup procedure. This
- allows your program to automatically handle many common command
- line options that will make it easier to setup and run your
- program. Among the helpful command line options processed by
- od_parse_cmd_line() are options to set serial port information
- (including information on non-standard serial port setups),
- specify the location of configuration and drop files, force the
- program to run in silent mode (without no local display), pass
- in user information, and the ability to start the program in
- local mode without a drop file. For a complete list of the
- options supported by od_parse_cmd_line(), run the example Vote
- door that is included in the OpenDoors packages, specifying -
- help on the command line.
- If you wish to process your own command line parameters in
- addition to those supported by OpenDoors, simply check the
- command-line for your own parameters after calling
- od_parse_cmd_line(). You can do this in the same way that you
- would handle command line options if you weren't using
- od_parse_cmd_line(). The od_parse_cmd_line() function does not
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 105
- generate an error message if it encounters unrecognized command
- line options. You can supply your own text to display when the
- user chooses the /Help option by setting
- od_control.od_cmd_line_help to point to your own string. Separate
- lines in your string with the \n character, and align text using
- the \t character.
- SEE ALSO od_init()
- EXAMPLE The following example shows how a program that uses
- od_parse_cmd_line() should be structured in order to compile
- under either DOS or Win32 versions of OpenDoors:
- #include "opendoor.h"
- /* main() or WinMain() function - Program begins here. */
- #ifdef ODPLAT_WIN32
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
- LPSTR lpszCmdLine, int nCmdShow)
- #else
- int main(int argc, char *argv[])
- #endif
- {
- #ifdef ODPLAT_WIN32
- #endif
- /* Set program's name for use by OpenDoors. */
- #ifdef ODPLAT_WIN32
- /* In Windows, pass in nCmdShow value to OpenDoors. */
- od_control.od_cmd_show = nCmdShow;
- /* Call od_parse_cmd_line. */
- od_parse_cmd_line(lpszCmdLine);
- #else
- od_parse_cmd_line(argc, argv);
- #endif
- /* Start the rest of your program here. */
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 106
- OD_POPUP_MENU()
- -------------------------------------------------------------------------------
- PURPOSE Creates a popup menu which allows the user to make a selection
- by pressing a single key, or selecting the item with a highlight
- bar. After the user has made a selection, the menu may be
- removed from the screen, restoring the original screen contents
- "beneath" the window.
- FORMAT INT od_popup_menu(char *pszTitle, char *pszText, INT nLeft,
- INT nTop, INT nLevel, WORD uFlags);
- RETURNS POPUP_ERROR On error (od_control.od_error is set to
- indicate type of error).
- POPUP_ESCAPE If user exited menu by pressing [ESCape].
- POPUP_LEFT If user exited menu by pressing the left arrow
- key.
- POPUP_RIGHT If user exited menu by pressing the right arrow
- key.
- Or, a postive integer indicating the menu item that was chosen
- if a selection was made.
- DESCRIPTION od_popup_menu() creates a popup window with a menu of choices,
- for use in ANSI/AVATAR/RIP modes. The user is able to choose an
- item from the menu by moving the highlighted selection bar with
- the arrow keys, or by pressing a key associated with a
- particular menu item. The contents of the menu are defined by
- the string pointed to by the pszText parameter. This menu
- definition string contains each menu option, separated by a '|'
- (pipe) character. Keys associated with each menu entry can be
- defined by proceeding the letter with a '^' (carat) character.
- For example, the string:
- "^Save|^Load|E^xit"
- would produce a menu with three options: Save, Load and Exit.
- The user would be able to select the Save option by pressing the
- [S] key, the Load option by pressing the [L] key, and the Exit
- option by pressing the [X] key. Furthermore, the characters
- corresponding to each menu item would be displayed in a
- highlighted color.
- Menus displayed with od_popup_menu() may optionally have a
- title, as specified by the pszTitle parameter. If this parameter
- is set to NULL, no title will be displayed. If this parameter is
- not NULL, the specified string will be displayed as a title on
- the window.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 107
- The nLeft and nTop parameters specify the left and top locations
- of the menu window, were 1, 1 is the upper right corner of the
- screen. The bottom and right corners of the menu are
- automatically determined by the size and number of menu entries
- in the menu definition string.
- The nLevel parameter specifies the menu level, an integer from 0
- to 10. Unless you are using the MENU_KEEP flag, this parameter
- can always be 0.
- The uFlags parameter specifies one or more of the following
- options, joined by the bitwise-OR operator (|).
- MENU_NORMAL Has no effect.
- MENU_ALLOW_CANCEL Allow user to exit menu with [ESCape].
- MENU_PULLDOWN Allow exit with arrow keys.
- MENU_KEEP Leave menu active on selection.
- MENU_DESTROY Remove a currently active menu.
- If you are not using any of the other flags, you can use
- MENU_NORMAL as a place-holder for this parameter. If you specify
- MENU_ALLOW_CANCEL, the user will be able to exit the menu
- without making a selection by pressing the [ESCape] key. If the
- user presses [ESCape], od_popup_menu() returns POPUP_ESCAPE.
- You can use the MENU_PULLDOWN option with od_popup_menu() to
- implement a set of pulldown menus. In this case, if the user
- presses the left arrow key or right arrow key while the menu is
- being displayed, od_popup_menu() returns with POPUP_LEFT or
- POPUP_RIGHT, allowing you to display a different menu.
- Normally, od_popup_menu() will remove the menu from the screen
- as soon as the user makes a selection. However, there may be
- some cases when you want the menu to continue to be visible
- after the user makes a selection. For example, you may want some
- menu options to lead to further sub-menus, or you may wish to
- display a popup window, and return to this menu after the user
- has exited from the popup window. If the MENU_KEEP flag is
- specified, the menu will remain active (on-screen) after the
- user makes a selection. However, the menu will still be
- destroyed if the user cancels out of the menu (this will only
- happen if you have specified MENU_ALLOW_CANCEL), or if the user
- moves to another menu by pressing the left or right arrow keys
- (this will only happen if you have specified MENU_PULLDOWN). If
- MENU_KEEP has been specified, and the user makes a selection,
- you must eventually either return to the menu, or destroy it by
- calling MENU_DESTROY. If you want to return to the menu, simply
- call od_popup_menu() again with the same level value that was
- used to originally create the menu. The user will now be able to
- make another selection from the menu, and od_popup_menu() will
- once again return that selection to you. If you want to destroy
- the menu, simply call od_popup_menu() with the MENU_DESTROY flag
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 108
- set, and the same level value that was used to create the
- original menu. If you wish to create another popup menu while
- the first one is still active, simply call od_popup_menu()
- again, this time with a different level value. The colors used
- by the od_popup_menu() function are set by the following
- OpenDoors control structure settings:
- char od_control.od_menu_title_col;
- char od_control.od_menu_border_col;
- char od_control.od_menu_text_col;
- char od_control.od_menu_key_col;
- char od_control.od_menu_highlight_col;
- char od_control.od_menu_highkey_col;
- SEE ALSO od_window_create(), od_window_remove(), od_draw_box(),
- od_hotkey_menu()
- EXAMPLE The following example shows the use of multiple-level menus:
- #include <stdlib.h>
- #include "opendoor.h"
- main()
- {
- for(;;)
- {
- switch(od_popup_menu("Main Menu",
- "^Files|^Electronic Mail|^News|E^xit",
- 20, 5, 0, MENU_NORMAL | MENU_KEEP))
- {
- case 1:
- od_popup_menu("Files Menu",
- "^Search For Files|^Download|^Upload",
- 30, 7, 2, MENU_NORMAL | MENU_ALLOW_CANCEL);
- break;
- case 2:
- od_popup_menu("EMail Menu",
- "Get ^New Mail|^Send Mail|Send ^Fax",
- 30, 8, 1, MENU_NORMAL | MENU_ALLOW_CANCEL);
- break;
- case 3:
- od_popup_menu("News Menu",
- "Choose News^Group|^Read News|^Post News",
- 30, 9, 1, MENU_NORMAL | MENU_ALLOW_CANCEL);
- break;
- case 4:
- od_popup_menu(NULL, NULL, 0, 0, 0, MENU_DESTROY);
- return(0);
- }
- }
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 109
- OD_PRINTF()
- -------------------------------------------------------------------------------
- PURPOSE Performs formatted output (remote & local), with the ability to
- change display colors.
- FORMAT void od_printf(char * pszFormat,...);
- RETURNS N/A
- DESCRIPTION This is one of two OpenDoors function which allows you to
- display a string of characters, the other being the
- od_disp_str() function. For a complete comparison of the various
- OpenDoors display function, see the description of the
- od_disp_str() function, on page 63. Like the od_disp_str()
- function, the od_printf() function will display its output both
- on the local screen, and on the remote user's screen (if the
- door is not operating in local mode). However, the od_printf()
- function also allows for formatted output, just as the printf()
- function does. In addition to providing all of the features of
- the normal C printf() function, the od_printf() function allows
- you to include codes to change the color of the display of text.
- This unique feature allows you to display multi-colored text,
- without having to use chains of alternating od_disp_str() and
- od_set_color() calls.
- As with the printf() function, the od_printf() function accepts
- one or more parameters, the first parameter being the format
- string to be displayed, and the additional parameters being data
- to be displayed within the string. The OpenDoors od_printf()
- function recognizes all of the control characters and options
- recognized by the normal printf() function. For example, to
- display the amount of time that a user has left online, the
- following line would be a valid use of the od_printf() function:
- od_printf("Time Left:%d\n\r", od_control.user_timelimit);
- Note that a full discussion of the printf() function is beyond
- the scope of this manual. For more information on using
- printf(), please see your Turbo C(++) / Borland C++ manuals.
- In addition to the normal control sequences, such as "%s", "%d",
- or "%12.12s", the od_printf() function also allows you to
- include special color-setting codes within the format string.
- These color code sequences BEGIN and END with a delimiter
- character, which is used to indicate that the sequence is a
- color setting. Consider, for example, the following line of
- code, which displays text in various colors:
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 110
- od_printf("`blue`Blue `green`Green `red`Red \n\r");
- In this case (assuming of course that a color monitor is being
- used) the word "Blue" will be displayed in the color blue, the
- word "Green" will be displayed in the color green, and the word
- "Red" will be displayed in the color red. In this case, the
- sequence `blue` sets the display color to dark blue on black.
- Here, the back-quote (`) is the delimiter character which
- indicates the beginning and end of the color sequence. Be sure
- not to confuse the back-quote character (`) with the normal
- forward quote ('). THIS IS THE MOST COMMON DIFFICULTY
- EXPERIENCED WITH THE OD_PRINTF() FUNCTION. The text between the
- back-quote characters indicates the color that should be set.
- This text can include the name of the foreground color, the name
- of the background color, the "bright" keyword and the "flashing"
- keyword. The first color mentioned is taken to be the foreground
- color, and the second the background color. Case is not
- sensitive, additional words can be included for legibility.
- Thus:
- `bright white cyan`
- is equivalent to:
- `Bright white on a cyan background`.
- The "bright" keyword indicates that the foreground color should
- be displayed in high intensity, and the "flashing" keyword
- indicates that the text should be flashing. If no background is
- specified, the background color defaults to black. If no
- foreground or background colors are specified, the color
- defaults to white on black.
- The od_printf() function will automatically determine whether
- the user has ANSI, AVATAR or RIP graphics enabled, and will send
- the appropriate color codes to change the color of displayed
- text. If the user does not have either ANSI or AVATAR graphics
- modes turned on, then the od_printf() function will not send any
- color codes. Thus, a door program using color codes would work
- just as well when ANSI/AVATAR/RIP graphics are not available,
- except that all text will appear in the same color.
- You may prefer to set colors by using the od_set_color() or
- od_set_attrib() functions, instead of using these cryptic color
- codes imbedded in od_printf() functions. In some cases, however,
- it will be much more advantageous to place the color codes
- within your od_printf() strings. As a case in point, consider
- the single od_printf() statement in the example, above. To
- accomplish the same result using the od_disp_str() and
- od_set_color() functions, you would have to use the following
- SIX function calls:
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 111
- od_set_color(D_BLUE,D_BLACK);
- od_disp_str("Blue ");
- od_set_color(D_GREEN,D_BLACK);
- od_disp_str("Green ");
- od_set_color(D_RED,D_BLACK);
- od_disp_str("Red \n\r");
- While this method MAY be easier understand, it certainly
- requires many more line of code to accomplish. However, either
- method will work, and the choice is up to you as to which method
- you prefer. Keep in mind, however, that if the color to be set
- is stored in a variable, instead of always being the same color,
- you must use either the od_set_color() or od_set_attrib()
- function to set the display color.
- While the back-quote (`) character is normally used to delimit a
- color sequence in the od_printf() function, you may wish to be
- able to print a back-quote character using the od_printf()
- function. In this case, you may configure OpenDoors to use a
- different character to represent color code sequences. To do
- this, simply use the od_control.od_color_delimiter variable,
- which is described in the OpenDoors control structure section,
- beginning on page 148. For example, if you wished to use the
- tilde (~) character instead of the back-quote character to
- change colors, simply place the following line within your
- program, at some point after having called od_init() or some
- OpenDoors function:
- od_control.od_color_delimiter='~';
- Also, you may disable the color code interpretation within the
- od_printf() function altogether, by setting the
- od_control.od_color_delimiter variable to 0.
- Note that the od_printf() function interprets the color codes
- AFTER parsing the other control sequences, such as "%d" or "%s".
- Thus, if you used the command:
- od_printf("%s",string);
- Any color codes contained in the string "string" would also be
- interpreted. If you did not wish to have any color code
- characters which might be contained in the string "string"
- treated as such, you could again disable od_printf()'s color
- code interpretation, by setting the od_control.od_color_char
- variable to 0.
- Note that the string to be displayed by od_printf() should not
- exceed 511 characters in size, including the size of color
- sequences and expanded % fields.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 112
- SEE ALSO od_disp_str(), od_disp(), od_putch(), od_repeat(), od_disp_emu()
- EXAMPLE Below is a simple example of a user statistics door program,
- which displays various pieces of information to the user, by
- using the od_printf() function. Notice the use of color code
- sequences in order to display the titles in a different color
- from the information fields. Note that since the information
- available to this door will depend on the BBS system under which
- it is running, not all of the information displayed by this door
- will be available under all BBS systems. For a description of
- what information is available under what BBS systems, see the
- OpenDoors control structure portion of this manual, which begins
- on page 148.
- #include "opendoor.h"
- int main(int argc,char *argv[])
- {
- od_init(); /* Begin OpenDoors program */
- od_printf("`bright white` YOUR STATISTICS\n\r"); /* Display title */
- od_printf("---------------\n\r\n\r");
- /* Display statistics */
- od_printf("`red`NAME : `blue`%s\n\r",od_control.user_logintime);
- od_printf("`red`LOCATION : `blue`%s\n\r",od_control.user_location);
- od_printf("`red`PHONE NUMBER : `blue`%s\n\r",od_control.user_homephone);
- od_printf("`red`LAST CALL : `blue`%s\n\r",od_control.user_lastdate);
- od_printf("`red`NUMBER OF CALLS : `blue`%u\n\r",od_control.user_numcalls);
- od_printf("`red`NUMBER OF PAGES : `blue`%u\n\r",od_control.user_numpages);
- od_printf("`red`REMAINING TIME : `blue`%d\n\r",od_control.user_timelimit);
- od_printf("`red`# OF DOWNLOADS : `blue`%u\n\r",od_control.user_downloads);
- od_printf("`red`# OF UPLOADS : `blue`%u\n\r",od_control.user_uploads);
- od_printf("`red`KBYTES DL TODAY : `blue`%u\n\r",od_control.user_todayk);
- /* Ask user to press [Enter] */
- od_printf("`bright green on green`Press [Enter] to return to BBS...\n\r");
- while(od_get_key(TRUE)!=13); /* Wait for user to press [Enter] */
- od_exit(20,FALSE); /* Return to BBS */
- }
- HELPFUL This section demonstrates use of the od_printf() color
- HINT sequences imbedded directly in the printf() format string, such
- as:
- od_printf("Hello `bright green` there!");
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 113
- However, there are also other ways that you can take advantage
- of this feature. For example, the C programming language
- concatenates string constants that are separated only by white
- space or carriage returns. For instance,
- "Hello " "`bright green`" " there!"
- is equivalent to:
- "Hello `bright green` there!"
- For this reason, you can create macros for common color
- sequences in your program, such as:
- #define HIGHLIGHT "`bright green`"
- You can then use such constants when calling the od_printf()
- function, as follows:
- od_printf("Hello " HIGHLIGHT " there!");
- You may find this method of setting the display color to be
- easier to read, and more easily configurable than including the
- color sequence directly in the format string. Below another use
- of the color sequences is describe, which allows the colors used
- by od_printf() not be "hard-wired".
- Since color control sequences are evaluated by od_printf() after
- it evaluates all format sequences (such as "%d"). For this
- reason, it is possible to change the display color using a
- string variable, instead of using a fixed color in the string.
- For example, if you program had the variable:
- char highlight[40];
- which was set at some point to be equal to:
- "`bright green`"
- you would be able to use od_printf() as follows:
- od_printf("Hello %s there!", highlight);
- The display color would then be changed at the location where
- the "%s" appears in the od_printf() format string. The advantage
- of using this method to change display colors is that unlike
- other methods, the value of the highlight variable can be
- changed. This could be used, for example, to allow the sysop to
- configure the colors they wish your door to use. You would only
- need to change the value of the highlight variable in order to
- change the color set by od_printf().
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 114
- OD_PUTCH()
- -------------------------------------------------------------------------------
- PURPOSE Function to display a single character.
- FORMAT void od_putch(int chToDisplay);
- RETURNS N/A
- DESCRIPTION This function performs a similar function to the other OpenDoors
- display functions. For information on the uses of the various
- OpenDoors display functions, see the description of the
- od_disp_str() function, on page 63. This function is most
- similar to the od_disp() and od_disp_str() functions, except
- that it only displays a single character at a time.
- This function will display the character passed to it at the
- cursor position in the output window, and then advance the
- cursor to the next display position. If OpenDoors is not
- operating in local mode, the character will also be sent to the
- modem, and thus displayed on the user's screen in the same
- manner that it is displayed on the local screen. If ANSI, AVATAR
- or RIP graphics mode is activated the character will be
- displayed in the current color.
- SEE ALSO od_disp_str(), od_disp(), od_printf(), od_repeat(),
- od_disp_emu()
- EXAMPLE Below is an example of the use of the od_putch() function. This
- example is a function which you could use in place of the
- od_get_key() function. This function inputs a single character
- from the keyboard, just as the od_get_key() function does.
- However, if the character entered is a printable character, the
- function will also echo the character to the local screen, using
- the od_putch() function.
- char get_key_with_echo(int wait)
- {
- char pressed=od_get_key(wait); /* Get key from user */
- if(pressed>=32 && pressed<=126) /* If key is printable */
- {
- od_putch(pressed); /* Display the character */
- }
- return(pressed); /* Return key pressed by user */
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 115
- OD_PUTTEXT()
- -------------------------------------------------------------------------------
- PURPOSE Displays a rectangular region of text and color information, as
- previously stored using od_gettext()
- FORMAT BOOL od_puttext(INT nLeft, INT nTop, INT nRight, INT nBottom,
- void *pBlock);
- RETURNS TRUE on success
- FALSE on failure
- DESCRIPTION This function "pastes" a rectangular block of text and color
- information that has been previously retrieved using
- od_gettext(). The block is placed at the screen location
- indicated by the variables nLeft, nTop, nRight and nBottom,
- where nLeft and nRight are column numbers from 1 - 80, and nTop
- and nBottom are row numbers from 1 - 23. The length and width of
- the rectangle specified by nLeft, nTop, nRight and nBottom must
- be the same as the length and width of the rectangle passed to
- od_gettext() when storing the block of text.
- This function attempts to display the pasted block as quickly as
- possible, only transmitting information on portions of the block
- that are different than the original screen contents. When this
- function returns, it leaves the cursor at its original position,
- and the display color at its original setting. This function
- requires ANSI or AVATAR mode.
- The control structure variable od_control.od_full_put may be set
- to TRUE to force od_puttext() to always send all characters in
- the block to be displayed, instead of only displaying the
- portions of the block that differ from the original screen
- contents. If you wish to save and restore the entire screen, you
- can use od_save_screen() and od_restore_screen(), which work in
- all display modes.
- You may also use the od_puttext() to display a rectangular block
- of text that you generate manually, instead of retrieving using
- od_gettext(). To do this, you pass an array which contains the
- text and color information for the rectangular area to be
- painted, in the pBlock parameter. The array passed to
- od_puttext() contains a two-byte sequence of information for
- each character in the rectangle. The first byte contains the
- ASCII code of the character to be displayed. The second byte
- contains the color attribute value of the character, in the same
- format as used by the od_set_attrib() function (described on
- page 128). These two byte sequences are stored in the order in
- which English is written; the array begins with the two byte
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 116
- sequences for all of the characters on the first line, from left
- to right, followed by the characters for the second line, and so
- on. The length of each line must be exactly equal to the width
- of the rectangular region to be painted.
- SEE ALSO od_gettext(), od_save_screen(), od_restore_screen(),
- od_scroll(), od_window_create(), od_window_remove()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 117
- OD_REPEAT()
- -------------------------------------------------------------------------------
- PURPOSE Repeatedly display the specified character any number of times,
- using special graphics codes for greater speed, if possible.
- FORMAT void od_repeat(char chValue, BYTE btTimes);
- RETURNS N/A
- DESCRIPTION This display function will repeatedly display the character
- chValue, btTimes times. For a complete breakdown of the various
- OpenDoors display functions, see the description of the
- od_disp_str() function, located on page 63.
- The advantage of using this function to display a series of
- identical characters is that this function will use special
- graphics-mode control sequences to display the repeated
- character very efficiently, if the required graphics mode is
- available. For example, in AVATAR mode, this function can
- display an entire line of one character, by sending a control
- sequence to the modem that is only three characters long. If
- graphics mode is not turned on, then the od_disp_str() function
- will simply send the specified character the appropriate number
- of times. As with the other display functions, the output of
- this function is sent to both the local and remote screens.
- SEE ALSO od_putch(), od_disp_str(), od_disp(), od_printf(), od_disp_emu()
- EXAMPLE The example function below demonstrates the use of the
- od_repeat() function in drawing a window (a square box) on the
- screen. This function is essentially a simplified version of the
- od_draw_box() function, which is described on page 65. Unlike
- this function, the od_draw_box() function allows the
- customization of the characters used to draw the box's boarder,
- and if possible uses additional AVATAR graphics codes to display
- the window even faster than this function does. Thus, the
- function below is really provided for demonstration purposes
- only.
- This function accepts four parameters, which indicate the
- location of the upper left and lower right corners of the window
- to be displayed. The function then displays the window with the
- current color attribute settings. Since this function uses the
- od_repeat() function, if AVATAR graphics are available, it can
- display the entire window in a fraction of a second, even if it
- is displaying a window the size of the entire screen at slow
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 118
- baud rates. Note that this window display function requires that
- the user has ANSI, AVATAR or RIP graphics mode enabled.
- void draw_window(char left, char top, char right, char bottom)
- {
- char line_counter; /* Number of current line being drawn */
- char between_size=(right-left)-1; /* X size of window */
- od_set_cursor(top,left); /* move to top corner */
- od_putch(218); /* display corner character */
- od_repeat(196,between_size); /* display top line */
- od_putch(191); /* display corner character */
- /* loop through middle lines of window */
- for(line_counter=top+1;line_counter<bottom;++line_counter)
- {
- od_set_cursor(line_counter,left); /* move to line start */
- od_putch(179); /* display left line char */
- od_repeat(' ',between_size); /* display blank area */
- od_putch(179); /* display right line char */
- }
- od_set_cursor(bottom,left); /* move to bottom corner */
- od_putch(192); /* display corner character */
- od_repeat(196,between_size); /* display bottom line */
- od_putch(217); /* display corner character */
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 119
- OD_RESTORE_SCREEN()
- -------------------------------------------------------------------------------
- PURPOSE Restores the screen contents as previous saved using the
- od_save_screen() function. This function can be used in any
- display mode.
- FORMAT BOOL od_restore_screen(void *pBuffer);
- RETURNS TRUE on success
- FALSE on failure
- DESCRIPTION This function restores the entire contents of the screen, along
- with the current cursor position and display color, which was
- previously stored using the od_save_screen() function. Unlike
- the od_get_text() and od_put_text() functions, the
- od_save_screen() and od_restore_screen() functions will work in
- all display modes (ASCII, ANSI, AVATAR and RIP).
- The pBuffer parameter must point to the buffer previously passed
- to od_save_screen(). Note that the od_save_screen() and
- od_restore_screen() functions save the stored information in
- different formats than the od_getttext() and od_puttext()
- functions. For this reason, you cannot save the screen contents
- with od_gettext() and restore them with od_restore_screen(), or
- visa-versa.
- If this function fails for any reason, a value of FALSE is
- returned, and the od_control.od_error variable is set to
- indicate the reason for the failure. For more information on the
- od_control.od_error variable, see page 185.
- SEE ALSO od_save_screen(), od_gettext(), od_puttext(), od_clr_scr()
- EXAMPLE For an example of how to use the od_restore_screen() function,
- see the example which accompanies the od_save_screen() function,
- on page 121.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 120
- OD_SAVE_SCREEN()
- -------------------------------------------------------------------------------
- PURPOSE Saves the contents of the screen, to later be restored using
- od_restore_screen(). Can be used in any display mode.
- FORMAT BOOL od_save_screen(void *pBuffer);
- RETURNS TRUE on success
- FALSE on failure
- DESCRIPTION This function saves the entire contents of the screen, along
- with the current cursor position and display color, to be later
- restored using the od_restore_screen() function. Unlike the
- od_get_text() and od_put_text() functions, the od_save_screen()
- and od_restore_screen() functions will work in all display modes
- (ASCII, ANSI, AVATAR and RIP).
- The pBuffer parameter should point to a buffer where the current
- screen information is to be stored. This buffer must be at least
- 4004 bytes in size.
- Note that the od_save_screen() and od_restore_screen() functions
- save the stored screen information in different formats than the
- od_getttext() and od_puttext() functions. For this reason, you
- cannot save the screen contents with od_save_screen() and
- restore them with od_puttext(), or visa-versa.
- Also, note that when used in RIP graphics mode, this function
- only saves and restores textual information, and not bit-mapped
- graphical information.
- If this function fails for any reason, a value of FALSE is
- returned, and the od_control.od_error variable is set to
- indicate the reason for the failure. For more information on the
- od_control.od_error variable, see page 185.
- SEE ALSO od_restore_screen(), od_gettext(), od_puttext(), od_clr_scr()
- EXAMPLE One case where you might wish to save and restore the contents
- of the screen is when sysop chat mode is activated. This can be
- accomplished by using the od_control.od_cbefore_chat and
- od_control.od_cafter_chat variables. The following example
- causes the screen contents to be saved and the entire screen
- cleared, prior to entering sysop chat mode when the sysop
- presses the "chat key". When the sysop ends chat mode, the
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 121
- user's original screen is restored, and the user will be able to
- continue working in the door as though nothing had happened.
- Code to perform screen saving and restoring:
- /* Function prototypes */
- void before_chat_function(void);
- void after_chat_function(void);
- /* Buffer to hold contents of screen prior to chat */
- char before_chat_buffer[4004];
- /* Variable to store whether screen save was successful */
- char before_chat_saved = FALSE;
- /* Function which is called prior to entering chat mode */
- void before_chat_function(void)
- {
- /* Store current screen contents */
- before_chat_saved = od_save_screen(before_chat_buffer);
- /* Present a blank screen for chat mode */
- od_clr_scr();
- }
- /* Function which is called after exiting chat mode */
- void after_chat_function(void)
- {
- /* If screen was successfully saved prior to chat */
- if(before_chat_saved)
- {
- /* Restore original screen contents */
- od_restore_screen(before_chat_buffer);
- }
- }
- Code included in main() function to enable screen saving and
- restoring code:
- od_control.od_cbefore_chat = before_chat_function;
- od_control.od_cafter_chat = after_chat_function;
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 122
- OD_SCROLL()
- -------------------------------------------------------------------------------
- PURPOSE Scrolls any rectangular area of the screen a specified number of
- lines upwards or downwards. Requires ANSI/AVATAR/RIP graphics
- mode to be active.
- FORMAT BOOL od_scroll(INT nLeft, INT nTop, INT nRight, INT nBottom,
- INT nDistance, WORD nFlags);
- RETURNS TRUE on success
- FALSE on FAILURE
- DESCRIPTION This function scrolls a rectangular area of the screen described
- by the parameters nLeft, nTop, nRight and nBottom. The
- parameters nLeft and nRight are column numbers from 1 - 80, and
- the parameters nTop and nBottom are row numbers from 1 - 23.
- The parameter nDistance indicates the direction and number of
- lines to scroll the text in the specified area. Positive values
- denote moving the text upwards, and negative values denote
- moving the text downwards.
- The new lines created by scrolling text will appear in the
- current color. When this function returns, it leaves the cursor
- at its original position, and the display color at its original
- setting. This function requires ANSI or AVATAR modes. If ANSI
- mode is active, this function is equivalent to calling
- od_gettext(), od_puttext(), and then sending addition codes to
- the modem clear the newly created lines. In ANSI mode, scrolling
- can be accomplished more quickly if the area to be scrolled is
- equal in width to the entire screen. This is because the
- clearing of newly created lines is done by sending a simple
- control sequence, instead of a line of space characters. If
- AVATAR mode is active, scrolling of the window is accomplished
- by sending a single 6-byte control sequence.
- The last parameter to od_scroll(), nFlags, should normally be
- set to SCROLL_NORMAL. However, if you set nFlags to
- SCROLL_NO_CLEAR, the newly created lines at the top or bottom of
- the screen are not cleared if it would take longer to do so.
- SEE ALSO od_gettext(), od_puttext(), od_window_create(),
- od_window_remove()
- EXAMPLE For an example of a program which uses the od_scroll() function,
- see the ex_chat.c example program, described on page 38.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 123
- OD_SEND_FILE()
- -------------------------------------------------------------------------------
- PURPOSE Sends an ASCII/ANSI/AVATAR/RIP file from disk, using terminal
- emulation.
- FORMAT BOOL od_send_file(char *pszFileName);
- RETURNS TRUE if the file was successfully sent
- FALSE if OpenDoors was unable to send the file
- DESCRIPTION: This powerful function will display any ASCII, ANSI, AVATAR or
- RIP file. The od_send_file() function can be used to display
- existing BBS text files, such as a "logoff screen", before your
- door hangs up on the user. You can also make use of the
- od_send_file() function to build many of your door screens as
- external files. This will allow you to easily create these
- screens in an ANSI editor program, such as "TheDraw". It will
- could also optionally allow sysops to customize your door for
- use on their own BBS.
- The od_send_file() function is called with the full path and
- filename of the file you wish to have displayed. Thus, if you
- wished to send the ANSI file MAINMENU.SCR, you would simply
- call:
- od_send_file("MAINMENU.SCR");
- In many cases, instead of having just one file that you want
- displayed in particular, you will have several different files,
- and will want a different one displayed according to the user's
- graphics mode. For example, you might have the four files,
- MAINMENU.ASC, MAINMENU.ANS, MAINMENU.AVT and MAINMENU.RIP; the
- .ASC file containing no special control codes, the .ANS file
- containing ANSI control codes, the .AVT file containing AVATAR
- control codes, and the .RIP file containing RIP graphics control
- codes. In this case, you can have the od_send_file() function
- automatically select the appropriate file according to the
- user's current display mode, by omitting the extension
- altogether. Thus, a call to:
- od_send_file("MAINMENU");
- would cause OpenDoors to automatically send the appropriate
- file, according to the user's graphics mode settings. When the
- od_send_file() function is used in this "automatic mode" (where
- you do not specify a filename extension), it will look for one
- of the four filename extensions listed below.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 124
- +----------------------------------------------------------+
- | Extension| File type |
- +----------+-----------------------------------------------|
- | .ASC | Does not require any graphics mode to display |
- | .ANS | Requires ANSI graphics mode to display |
- | .AVT | Requires AVATAR graphics mode to display |
- | .RIP | Requires RIP graphics mode to be displayed |
- +----------------------------------------------------------+
- If the user has RIP graphics enabled, od_send_file() will first
- search for the .RIP file. If no file exists with the specified
- filename and a .RIP extension, od_send_file() will then search
- for .AVT, then .ANS, and if not found .ASC. If the user has only
- ANSI graphics enabled, od_send_file() will attempt first to
- display the .ANS file, and if not found will search for .ASC. In
- the case that the user is using plain-ASCII mode, this function
- will attempt only to display the .ASC file.
- When displaying a .RIP file to the remote system, OpenDoors will
- attempt to locate and display a corresponding .AVT/.ANS/.ASC
- file on the local system. If no such file can be found, a window
- will be displayed, indicating the name of the .RIP file that is
- being sent to the remote system. When a .RIP file is being
- displayed, page pausing is disabled.
- When displaying .AVT/.ANS/.ASC files, od_send_file() will send
- any ANSI or AVATAR codes in the file directly to the remote
- terminal, and interpret them to display on the local screen
- (regardless of the actual filename extension). This
- interpretation is accomplished by OpenDoor's built in terminal
- emulator. The terminal emulator fully supports all ANSI and
- AVATAR level 0 and level 0+ control codes. The terminal emulator
- will also translate Remote Access/QuickBBS style control codes,
- if enabled by setting od_control.od_no_ra_codes to FALSE. The
- control codes supported by OpenDoors are listed in the chart on
- the following pages. When these control codes are inserted into
- the file, OpenDoors will replace them with various pieces of
- user or system information.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 125
- +-----------------------------------------------------+
- | CONTROL | ASCII | |
- | CODE | VALUE | DESCRIPTION |
- +---------+-------+-----------------------------------|
- | ^FA | 06,65 | Displays the user's full name |
- | ^FB | 06,66 | Location the user is calling from |
- | ^FC | 06,67 | Displays the user's password |
- | ^FD | 06,68 | Business/data phone number |
- | ^FE | 06,69 | Home/voice phone number |
- | ^FF | 06,70 | Date of the user's last call |
- | ^FG | 06,71 | Time of day of the last call |
- | ^FH | 06,72 | The user's `A' flags settings |
- | ^FI | 06,73 | The user's `B' flags settings |
- | ^FJ | 06,74 | The user's `C' flags settings |
- | ^FK | 06,75 | The user's `D' flags settings |
- | ^FL | 06,76 | User's remaining netmail credit |
- | ^FM | 06,77 | Number of messages posted by user |
- | ^FN | 06,78 | Last read message number by user |
- | ^FO | 06,79 | Displays security level of user |
- | ^FP | 06,80 | Number of times user has called |
- | ^FQ | 06,81 | Total # of uploads by user |
- | ^FR | 06,82 | Total KBytes uploaded by user |
- | ^FS | 06,83 | Total # of downloads by user |
- | ^FT | 06,84 | Total Kbytes downloaded by user |
- | ^FU | 06,85 | # of minute user has used today |
- | ^FV | 06,86 | User's screen length setting |
- | ^FW | 06,87 | User's first name only |
- | ^FX | 06,88 | User's ANSI setting |
- | ^FY | 06,89 | User's "continue?" prompt setting |
- | ^FZ | 06,90 | Does user have screen clearing on |
- | ^F0 | 06,48 | User's Full-screen editor setting |
- | ^F1 | 06,49 | User's Quiet mode setting |
- | ^F2 | 06,50 | User's hot-keys setting |
- | ^F3 | 06,51 | Displays the user's alias |
- | ^F4 | 06,52 | The date of the User's first call |
- | ^F5 | 06,53 | The user's date of birth |
- | ^F6 | 06,54 | User's subscription expiry date |
- | ^F7 | 06,55 | Number of days until expiry |
- | ^F8 | 06,56 | User's AVATAR setting |
- | ^F9 | 06,57 | The user's upload:download ratio |
- | ^F: | 06,58 | User's Upload K:download K ratio |
- +-----------------------------------------------------+
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 126
- +-----------------------------------------------------+
- | CONTROL | ASCII | |
- | CODE | VALUE | DESCRIPTION |
- +---------+-------+-----------------------------------|
- | ^F; | 06,59 | Full-screen message reader |
- | ^KA | 11,65 | Total # of calls BBS has received |
- | ^KB | 11,66 | Name of the last caller to BBS |
- | ^KC | 11,67 | Total # of active messages on BBS |
- | ^KD | 11,68 | Displays # of the first message |
- | ^KE | 11,69 | Displays # of the last message |
- | ^KF | 11,70 | # of times user has paged sysop |
- | ^KG | 11,71 | Full name of the current weekday |
- | ^KH | 11,72 | Displays total number of users |
- | ^KI | 11,73 | Displays the current time |
- | ^KJ | 11,74 | Displays the current date |
- | ^KK | 11,75 | Minutes the user has been online |
- | ^KL | 11,76 | Seconds the user has been online |
- | ^KM | 11,77 | Minutes the user has used today |
- | ^KN | 11,78 | Seconds the user has used today |
- | ^KO | 11,79 | Minutes remaining for user today |
- | ^KP | 11,80 | Seconds remaining for user today |
- | ^KQ | 11,81 | The user's daily time limit |
- | ^KR | 11,82 | Displays the current baud rate |
- | ^KS | 11,83 | The current weekday in short-form |
- | ^KT | 11,84 | The user's daily download limit |
- | ^KU | 11,85 | # of minutes until the next event |
- | ^KV | 11,86 | Time of the next system event |
- | ^KW | 11,87 | # of node user is currently on |
- | ^KX | 11,88 | Disconnects the user |
- +-----------------------------------------------------+
- SEE ALSO od_disp_emu(), od_list_files(), od_hotkey_menu()
- EXAMPLE For an example of the use of the od_send_file() function in
- displaying a custom door menu, see the EX_VOTE.C example
- program, which is described beginning on page 38.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 127
- OD_SET_ATTRIB()
- -------------------------------------------------------------------------------
- PURPOSE Function to change the text color in ANSI or AVATAR mode, using
- a single IBM-PC color attribute value.
- FORMAT void od_set_attrib(INT nColor);
- RETURNS N/A
- DESCRIPTION od_set_attrib() is one of two functions which change the color
- of the currently displayed text. This function allows you to set
- the text color using a single IBM-PC style color attribute. On
- the other hand, the od_set_color() function allows you to set
- the display color by specifying a foreground and background text
- color. Generally speaking, which of these two functions you use
- will be only a matter of personal preference. You will, however,
- most likely find it more convenient to use the od_set_color()
- function for changing display color. However the od_set_attrib()
- offers the advantage of allowing you to manipulate the color to
- be displayed as a single value, instead of two separate values.
- This could be convenient, for example, when displaying text in a
- user configured color. Using a single byte to represent the
- color will likely be easier than using two. An alternative
- method of setting the color of displayed text is to include the
- color codes within a string displayed by the od_printf()
- function. The benefits of doing this, along with instructions on
- how to do this, are described in the section on the od_printf()
- function, which begins on page 110.
- This function will only have an effect if the user has ANSI,
- AVATAR or RIP modes enabled. As a result, you can use this
- function within your door program, and have your text
- automatically displayed in multiple colors if graphics mode is
- available, and displayed without colors if graphics mode is not
- available.
- Note that the color to be set is passed to this function as an
- IBM-style screen attribute. Hence, you can set the color of text
- to be displayed by a single hexidecimal value, encoded as
- follows:
- +------------- Background color
- |
- 0x7f
- |
- +------------ Foreground color
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 128
- Where the left digit (most significant nibble) of the
- hexidecimal number represents the background color, and the
- right digit (least significant nibble) represents the foreground
- color. Each of the possible colors, along with their
- corresponding hexidecimal values, are listed in the charts,
- below.
- +-----------------------+ +--------------------------+
- | Foreground colors | | Background | Flashing |
- +-----------------------| +---------------+----------|
- | 0 | Black | | 0 | Black | Off |
- | 1 | Blue | | 1 | Blue | Off |
- | 2 | Green | | 2 | Green | Off |
- | 3 | Cyan | | 3 | Cyan | Off |
- | 4 | Red | | 4 | Red | Off |
- | 5 | Magenta | | 5 | Magenta | Off |
- | 6 | Brown | | 6 | Brown | Off |
- | 7 | White (grey) | | 7 | White | Off |
- | 8 | Bright Black | | 8 | Black | On |
- | 9 | Bright Blue | | 9 | Blue | On |
- | a | Bright Green | | a | Green | On |
- | b | Bright Cyan | | b | Cyan | On |
- | c | Bright Red | | c | Red | On |
- | d | Bright Magenta | | d | Magenta | On |
- | e | Yellow | | e | Brown | On |
- | f | White (bright) | | f | White | On |
- +-----------------------+ +--------------------------+
- SEE ALSO od_set_color(), od_disp_emu(), od_clr_scr(), od_clr_line(),
- od_set_cursor()
- EXAMPLE At times, you may wish to allow the user to select the color of
- text they wish to have displayed, perhaps to configure your door
- for the ideal colors to be displayed on their system. To
- demonstrate the use of the od_set_attrib() function, we show
- another function, which shows the user all 256 possible colors
- that can be displayed, and allows the user to choose which color
- they prefer. The function will then return the color attribute
- value of the user's chosen color.
- unsigned char choose_color(void)
- {
- register unsigned char counter; /* for displaying colors */
- char string[4]; /* string input by user */
- od_set_attrib(0x07); /* display title */
- od_disp_str("Available colors:\n\r\n\r");
- for(counter=0;counter<=255;) /* loop through all colors */
- {
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 129
- od_set_attrib(counter); /* set appropriate color */
- od_printf("%03.3u",counter); /* display color's number */
- if(((++counter)%16)==0) /* after every 16 colors ... */
- {
- od_set_attrib(0x07); /* ... reset display color ... */
- od_disp_str("\n\r"); /* ... and start a new line */
- }
- }
- od_set_attrib(0x07); /* Allow user to choose color */
- od_disp_str("Which color do you prefer : ");
- od_input_str(string,3,'0','9');
- return(atoi(string)); /* Return chosen color */
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 130
- OD_SET_COLOR()
- -------------------------------------------------------------------------------
- PURPOSE Function to change the current display color in ANSI, AVATAR or
- RIP modes, using foreground and background color values.
- FORMAT void od_set_color(INT nForeground, INT nBackground);
- RETURNS N/A
- DESCRIPTION od_set_color() is one of two functions which change the color of
- the currently displayed text. This function allows you to set
- the text color using separate foreground an background text
- colors, whereas od_set_attrib() allows you to set the text color
- using a single IBM-PC style color attribute. Generally speaking,
- which of these two functions you use is only a matter of
- personal preference. An alternative method of setting the color
- of displayed text is to include the color codes within a string
- displayed by the od_printf() function. The benefits of doing
- this, along with instructions on how to do this, are described
- in the section on the od_printf() function, which begins on page
- 110.
- This function will only have an effect if the user has ANSI,
- AVATAR or RIP mode turned on. As a result, you can use this
- function within your door program, and have your text
- automatically displayed in multiple colors if graphics mode is
- available, and displayed without colors if graphics mode is not
- available.
- The od_set_color() function accepts two parameters, the first
- parameter being the foreground color to be used in displaying
- text, and the second parameter being the background color to be
- used in displaying text. For example,
- od_set_color(L_WHITE,D_BLACK);
- would set the current color to Light White on Dark Black. The
- foreground and background text colors can be any one of the
- color values listed on the following page.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 131
- +-------------------+-----------+
- | Foreground Color | Value |
- +-------------------+-----------+
- | Dark Black | D_BLACK |
- | Dark Blue | D_BLUE |
- | Dark Green | D_GREEN |
- | Dark Cyan | D_CYAN |
- | Dark Red | D_RED |
- | Dark Magenta | D_MAGENTA |
- | Dark Brown | D_BROWN |
- | Grey (Dark White) | D_GREY |
- | Light Black (Grey)| L_BLACK |
- | Light Blue | L_BLUE |
- | Light Green | L_GREEN |
- | Light Cyan | L_CYAN |
- | Light Red | L_RED |
- | Light Magenta | L_MAGENTA |
- | Yellow | L_YELLOW |
- | White | L_WHITE |
- +-------------------+-----------+
- +-------------------+-----------+
- | Background Color | Value |
- +-------------------+-----------+
- | Black | D_BLACK |
- | Blue | D_BLUE |
- | Green | D_GREEN |
- | Cyan | D_CYAN |
- | Red | D_RED |
- | Magenta | D_MAGENTA |
- | Brown | D_BROWN |
- | Grey | D_GREY |
- | Blinking Black | B_BLACK |
- | Blinking Blue | B_BLUE |
- | Blinking Green | B_GREEN |
- | Blinking Cyan | B_CYAN |
- | Blinking Red | B_RED |
- | Blinking Magenta | B_MAGENTA |
- | Blinking Brown | B_BROWN |
- | Blinking Grey | B_WHITE |
- +-------------------+-----------+
- SEE ALSO od_set_attrib(), od_disp_emu(), od_clr_scr(), od_clr_line(),
- od_set_cursor()
- EXAMPLE As an example of using the od_set_color() function to set the
- color of displayed text, we show a pair of two functions. These
- functions will allow a program to set the foreground OR
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 132
- background color of text, without setting the other. In
- contrast, the od_set_color() function sets both the foreground
- and background color at the same time. These function presume
- that they are the only functions used within the door to set the
- color of displayed text, and that the original text color prior
- to calling either of these functions is dark white on black.
- These function must also have access to the two global variables
- "current_foreground" and "current_background", as defined below.
- void set_foreground(char foreground);
- void set_background(char background);
- unsigned char current_foreground=D_BLACK;
- unsigned char current_background=D_GREY;
- void set_foreground(char foreground)
- { /* set new text color */
- od_set_color(foreground, current_background);
- current_foreground=foreground; /* save new foreground */
- }
- void set_background(char background)
- { /* set new text color */
- od_set_color(current_foreground, background);
- current_background=background; /* save new background */
- }
- Using these functions, you would then be able to set just the
- foreground text color by a function call like:
- set_foreground(L_YELLOW);
- Or set just the background text color by a function call like:
- set_background(D_GREY);
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 133
- OD_SET_CURSOR()
- -------------------------------------------------------------------------------
- PURPOSE Function to reposition the text cursor in ANSI, AVATAR or RIP
- mode
- FORMAT void od_set_cursor(INT nRow, INT nColumn);
- RETURNS N/A
- DESCRIPTION This function repositions the cursor to the specified row and
- column on the screen. nRow can have a value of 1 to 23, and
- nColumn can have a value of 1 to 80. ANSI, AVATAR or RIP mode
- must be active.
- SEE ALSO od_disp_emu(), od_clr_scr(), od_clr_line(), od_set_color(),
- od_set_attrib()
- EXAMPLE Below is a simple example that demonstrates the use of the
- od_set_cursor() function. Note that this example detects whether
- or not graphics mode is available, and if it is not, will carry
- out the same task without the use of od_set_cursor().
- od_init(); /* Initialize door operations */
- od_clr_scr(); /* Clear the screen */
- if(od_control.user_ansi || od_control.user_avatar)
- { /* If graphics mode is available */
- od_set_cursor(1,1); /* Display demo */
- od_disp_str("Top, Left Corner");
- od_set_cursor(1,70);
- od_disp_str("Top, Right Corner");
- od_set_cursor(15,1);
- od_disp_str("Fifteenth line\n\r");
- }
- else /* If graphics mode is not available */
- { /* Display demo */
- od_disp_str("Top, Left Corner");
- od_repeat(' ', 54);
- od_disp_str("Top, Right Corner\n\r");
- od_disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n");
- od_disp_str("Fifteenth line\n\r");
- }
- od_get_key(TRUE); /* Wait for user to press key */
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 134
- OD_SET_DTR()
- -------------------------------------------------------------------------------
- PURPOSE Controls the DTR (Data Terminal Ready) signal to the modem. Used
- primarily to cause the modem to "hang up".
- FORMAT void od_set_dtr(BOOL bHigh);
- RETURNS N/A
- DESCRIPTION In certain circumstances (such as call back verification doors),
- you may wish to "hang up" the modem without exiting your door
- program. This can be accomplished with most modems by
- controlling the DTR (Data Terminal Ready) signal to the modem.
- Passing a FALSE value to od_set_dtr() causes the DTR signal to
- be set low, and passing a TRUE value causes the DTR signal to be
- set high. Normally, OpenDoors maintains the DTR signal in its
- high state. Since most (but not all) modems are configured to
- disconnect from the remote modem when the DTR signal is set low,
- calling od_set_dtr(FALSE) can be used to hangup the modem. When
- hanging up by this method, you should be sure to set the DTR
- signal high again, after the carrier detect signal has
- disappeared. For more information on determining the state of
- the carrier detect signal, see the od_carrier() function, which
- is described on page 51. Note that not all modems will
- disconnect from the remote user in response to your lowering the
- DTR signal. If your software may be used with such modems, you
- may wish to also provide the option of disconnecting the modem
- by sending a "hang up" command sequence to the modem.
- Since OpenDoors normally monitors the carrier detect signal, and
- exits when this signal disappears, you will have to disable
- OpenDoor's carrier detection if you wish your program to
- continue executing after hanging up the modem. OpenDoor's
- automatic carrier detection can be disabled using the
- od_control.od_disable OpenDoors control structure variable, as
- follows:
- od_control.od_disable |= DIS_CARRIERDETECT;
- SEE ALSO od_carrier(), od_exit()
- EXAMPLE For an example of using the od_set_dtr() function to "hang up"
- the modem, see the example that accompanies the od_carrier()
- function, which is described on page 52.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 135
- OD_SET_PERSONALITY()
- -------------------------------------------------------------------------------
- PURPOSE Sets the current status line / sysop function key personality to
- be used.
- FORMAT BOOL od_set_personality(char *pszName);
- RETURNS TRUE on success
- FALSE on failure
- DESCRIPTION This function changes the current status line / sysop function
- key personality. The pszName parameter should contain the string
- which uniquely identifies the personality to be set. This
- function may only be used by OpenDoors programs which include
- the OpenDoors "Multiple Personality System". To enable use of
- the MPS, include the following line before your first call to
- any OpenDoors function:
- od_control.od_mps=INCLUDE_MPS;
- OpenDoors includes a number of built-in personalities.
- Additional personalities may be added using the
- od_add_personality() function, which is described on page 47.
- The following personalities are included with this version of
- OpenDoors:
- Name Description
- -----------------------------------------------------------
- Standard OpenDoors style, similar to RA 1.11
- PCBoard Similar to PC-Board
- RemoteAccess Similar to RemoteAccess 2.x
- Wildcat Similar to Wildcat!
- Personality names are not case sensitive. For more information
- on the OpenDoors Multiple Personality System, see the section
- which begins on page 233.
- This function returns TRUE on success, or FALSE on failure. In
- the case of a failure, the od_control.od_error variable is set
- to indicate the nature of the failure. For more information on
- the od_control.od_error variables, see page 185.
- SEE ALSO od_add_personality(), od_set_statusline()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 136
- OD_SET_STATUSLINE()
- -------------------------------------------------------------------------------
- PURPOSE To set the currently displayed status line.
- FORMAT void od_set_statusline(INT nSetting);
- RETURNS N/A
- DESCRIPTION If you have the OpenDoors status line enabled within your door
- program (as is the default), the sysop will be able to control
- the setting of the status line using the F1 - F10 keys on the
- keyboard. These function keys are as follows:
- [F1] - Display basic door and user information
- [F2] - Display phone numbers and important dates
- [F3] - Display security flags and up/download info
- [F4] - Display system information and current time
- [F5] - Display message info and user's settings
- [F6] - Display chat reason and sysop's comment
- [F9] - Display help information for sysop
- [F10] - Turn off the status line
- Using the od_set_statusline() function, you can manually set
- which of these status line settings is currently selected. The
- od_set_statusline() accepts a single parameter, which should be
- one of the values listed below, which indicates which status
- line you would like to have selected:
- +---------------+---------------+------------------------------+
- | | Corresponding | |
- | Value | Function Key | Meaning |
- +---------------+---------------+------------------------------+
- | STATUS_NORMAL | [F1] | Basic door and user info |
- | STATUS_NONE | [F10] | Turn off status line |
- | STATUS_HELP | [F9] | Displays help for the sysop |
- | STATUS_USER1 | [F2] | Phone Numbers and dates |
- | STATUS_USER2 | [F3] | Security flags & up/downloads|
- | STATUS_USER3 | [F5] | Message info & user settings |
- | STATUS_USER4 | [F6] | Chat reason and sysop comment|
- | STATUS_SYSTEM | [F4] | System info & current time |
- +---------------+---------------+------------------------------+
- (Note that these keys may be customized using variables in the
- OpenDoors control structure.)
- Keep in mind that the od_set_statusline() function only
- temporarily changes the current status line setting, and that
- the sysop will still be able to change the status line to any of
- the other settings using the function keys. For instance, if you
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 137
- wished to allow the sysop to normally see all 25 lines of text
- displayed by your door, but at the same time to still allow the
- sysop to turn on the status line at any time, you could place
- the line
- od_set_statusline(STATUS_NONE);
- at the beginning of your program. Similarly, when the user pages
- the sysop, OpenDoors itself calls
- od_set_statusline(STATUS_USER4);
- in order to display the status line which shows the user's
- reason for chat, while still allowing the sysop to switch back
- to any of the other status lines.
- If you wish to permanently turn off the OpenDoor's status line,
- without allowing the sysop to be able to turn it back on using
- the sysop function keys, simply set the
- "od_control.od_status_on" variable to FALSE. This variable is
- described in the OpenDoors control structure section of this
- manual, which begins on page 148.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 138
- OD_SLEEP()
- -------------------------------------------------------------------------------
- PURPOSE Suspends program execution, yielding control to other tasks in a
- multitasking environment.
- FORMAT void od_sleep(tODMilliSec Milliseconds);
- RETURNS N/A
- DESCRIPTION od_sleep() suspends execution of your program for the specified
- number of milliseconds. Note that under the DOS version of
- OpenDoors, this value is rounded to the nearest 55 milliseconds.
- While the program's execution is suspended, od_sleep() yields
- control of the processor to other tasks in a multitasking
- environment.
- Calling od_sleep() with a sleep time of 0 causes control to be
- yielded to other waiting processes without imposing a minimum
- sleep time. If no other processes are waiting to execute, the
- function returns immediately. OpenDoors automatically calls
- od_sleep(0) itself in most of the situations where there is a
- need to do so. However, there may be circumstances under which
- od_sleep(0) can be used to improve performance. In particular,
- od_sleep(0) can be used to improve the performance of other
- applications that are also running at the same time as yours. By
- calling od_sleep(0), you are essentially telling the operating
- system that your program doesn't currently need all of the
- processing time that has been allocated to it. While appropriate
- use of od_sleep(0) can improve overall system performance,
- overusing od_sleep(0) can dramatically degrade the performance
- of your own program. The only way to determine the optimal use
- of od_sleep(0) is by trial and error.
- The most common situation where you might want to use
- od_sleep(0) is when your program cannot do anything useful until
- you receive input from the user, but for some reason you cannot
- call od_get_key(TRUE). Rather than sitting in a tight loop,
- repeatedly checking where the user has pressed a key yet, it is
- better to call od_sleep(0) to let other tasks run for a while
- before checking again. OpenDoors calls od_sleep(0) itself under
- any of the following circumstances:
- - When transmitting characters, if the outbound serial
- buffer is full, OpenDoors yields while waiting for some
- of the characters in the buffer to be sent.
- - During od_get_key(), if called with the wait parameter
- set to TRUE.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 139
- - While waiting for input, during the execution of any of
- the following input functions: od_get_answer(),
- od_hotkey_menu() (after menu has been displayed),
- od_popup_menu(), od_edit_str(), od_input_str().
- - While pausing at the end of a screen during
- od_send_file(), od_list_files(), od_hotkey_menu().
- - During chat mode.
- SEE ALSO od_kernel()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 140
- OD_SPAWN()
- -------------------------------------------------------------------------------
- PURPOSE To facilitate easy execution of child tasks from doors.
- FORMAT BOOL od_spawn(char *pszCommandLine);
- RETURNS TRUE on success,
- FALSE on failure
- DESCRIPTION This function allows you to easily run other programs from
- within your door programs, such as external file transfer
- utilities, compression utilities, and so on.
- This function will attempt to swap OpenDoors and your entire
- door to expanded memory or disk. OpenDoors swapping can be
- controlled by the OpenDoors control structure variables,
- od_swapping_disable, od_swapping_ems and od_swap_path. The
- od_spawn...() functions first attempt to swap OpenDoors to EMS
- memory. If enough EMS 3.2 or later memory is available, it will
- be used. If not, OpenDoors will swap to a disk file in the
- directory specified by the od_control.od_swap_path variable.
- Unlike the other Turbo C(++) / Borland C++ library functions
- such as system() or spawnf(), this function will automatically
- store the door screen prior to executing the sub-program, and
- will restore the screen upon return. This function will also
- store the current drive and directory settings prior to
- executing the program, and restore them after the program has
- returned.
- Normally, the user's time will continue to be decreased during
- the execution of the od_spawn() function. However, you can
- freeze the user's time during the spawn process by using the
- OpenDoors control structure variable od_spawn_freeze_time.
- SEE ALSO od_spawnvpe()
- EXAMPLE Below are a few examples of various uses of the od_spawn()
- function:
- To run the command processor from within your door program, to
- allow the sysop access to the DOS shell, simply use the
- following line of code:
- od_spawn(getenv("COMSPEC"));
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 141
- The following function is an example of using the od_spawn()
- function to call DSZ, allowing the user to download a file. You
- pass the name of the file that you wish to send to the user.
- This function will then ask the user what transfer protocol they
- would like to use, generate the appropriate DSZ command line,
- and then transmit the file to the user. Note that in order to
- use a door which implements this function, the external file
- transfer program "DSZ" must be available in the current search
- path. As an alternative, you may want to allow the sysop to
- specify the location of the DSZ file from within a configuration
- program. If you wish to receive a file (allow the user to
- upload), instead of sending one, simply change the "s" in the
- command line to a "r".
- char download(char *filename)
- {
- char commandline[80];/* string containing DSZ command line */
- char protocol; /* character representing chosen protocol */
- /* display protocol menu */
- od_printf("Select File Transfer Protocol:\n\r");
- od_printf(" [X] XModem\n\r");
- od_printf(" [Y] YModem\n\r");
- od_printf(" [Z] ZModem\n\r");
- od_printf("or press [A] to abort transfer\n\r");
- do /* loop until valid protocol has been chosen */
- {
- protocol=od_get_key(); /* get key */
- /* abort if [A] key is pressed */
- if(protocol=='a' || protocol=='A') return(FALSE);
- } while(protocol!='x' && protocol!='y' && protocol!='z' &&
- protocol!='X' && protocol!='Y' && protocol!='Z');
- od_printf("Begin receiving file now or press [CTRL]-[X] to
- abort\n\r");
- /* generate DSZ command line */
- sprintf(commandline,"dsz port %d s%c %s",
- od_control.port+1,
- protocol,
- filename);
- return(od_spawn(commandline)); /* spawn to DSZ */
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 142
- OD_SPAWNVPE()
- -------------------------------------------------------------------------------
- PURPOSE To facilitate easy execution of child tasks from doors. Allows
- specification of child's environment, returns errorlevel
- returned by child task, and searches path for the executable
- file.
- FORMAT INT16 od_spawnvpe(INT16 nModeFlag, char *pszPath,
- char *papszArg[], char *papszEnv[]);
- RETURNS -1 on failure
- errorlevel returned by child process on success
- DESCRIPTION This function behaves very similarly to the od_spawn() function.
- Thus, to save space in the manual, I will not recapitulate what
- is already said in the description of the od_spawn() function.
- Instead, this description concentrates on the additional
- features available through the od_spawnvpe() function. If you
- are not already familiar with the od_spawn() function, take a
- moment now to review the description of that function.
- The od_spawn() function (the OpenDoors "quick-spawn" function)
- is designed to be quick and easy to use, but does not have all
- of the features available in the od_spawnvpe() function. In
- addition to the features of the od_spawn() function, the
- od_spawnvpe() function also provides the following features:
- - od_spawnvpe() will search the "path" for the file
- to be executed.
- - od_spawnvpe() allows you to pass an altered
- environment to the child process.
- - od_spawnvpe() returns the errorlevel returned by
- the child process.
- The parameters passed to the od_spawnvpe() function are
- identical to those passed to the C spawnvpe() function. The
- first parameter should usually the be P_WAIT flag. The second
- parameter is the name of the child program to execute. If a full
- path to the child program is not specified, and the child
- program does not exist in the current directory, OpenDoors will
- search the directories listed by the PATH environment variable.
- Also, if the .EXE or .COM extension is not provide, OpenDoors
- will look first for a .COM file, and if not found, for a .EXE
- file. The third parameter is an array of arguments to pass to
- the child process, or NULL if no arguments are to be passed. The
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 143
- fourth parameter is the environment to be passed to the child
- process, or NULL if the a copy of the current environment should
- be used.
- SEE ALSO od_spawn()
- EXAMPLE For an example of the use of the od_spawn...() functions, see
- the example accompanying the od_spawn() function. As a specific
- example of the od_spawnvpe function, consider the following code
- which executes the "TEST.EXE" program.
- od_spawnvpe(P_WAIT,"TEST.EXE",NULL,NULL);
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 144
- OD_WINDOW_CREATE()
- -------------------------------------------------------------------------------
- PURPOSE Creates a popup window of the specified size and color, storing
- the contents of the screen "under" the window. The window can
- later be removed from the screen, restoring the original
- contents of the screen "under" the window, using the
- od_window_remove() function. Requires ANSI, AVATAR or RIP mode.
- FORMAT void *od_window_create(INT nLeft, INT nTop, INT nRight, INT
- nBottom,
- char *pszTitle, BYTE btBorderCol, BYTE btTitleCol,
- BYTE btInsideCol, INT nReserved);
- RETURNS Pointer to newly allocated window structure on success
- NULL on failure
- DESCRIPTION This function creates a pop-up window on the remote and local
- screens. The contents of the screen beneath the window are
- stored, to allow the window to later be removed from the screen
- using the od_window_remove() function. The window is drawn using
- the boarder characters defined in the already existing
- od_control.od_box_chars[] array. The boarder is displayed using
- the color attribute specified in btBorderCol. The working area
- of the window is created in the color specified in btInsideCol.
- A title may optionally be displayed on the window by specifying
- a string in pszTitle. This title will be displayed in the color
- specified by btTitleCol. If you do not wish a title to be
- displayed, pass an empty string or NULL pointer in pszTitle. On
- success, od_window_create() will return a pointer to a buffer
- which was allocated to store information on the window and the
- contents of the screen "under" the window. This pointer should
- at some point be passed in a call to od_window_remove().
- This function requires ANSI, AVATAR or RIP graphics mode. If
- AVATAR mode is active, this function will take advantage of
- special AVATAR control sequences to display the window much
- faster than is possible in ANSI mode. In ANSI mode, window
- display will be slightly faster if btBorderCol and btTitleCol
- are equal. Note that the nReserved parameter of this function is
- not currently used. To preserve compatibility with future
- versions of OpenDoors, this parameter should always be set to 0.
- Currently, the size of the buffer allocated to store the window
- information will be (length*width*2) + 4 bytes in size.
- If od_window_create() fails for any reason, a value of NULL is
- returned, and the od_control.od_error variable is set to
- indicate the reason for the failure. For more information on the
- od_control.od_error variable, see page 185.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 145
- SEE ALSO od_window_remove(), od_draw_box(), od_gettext(), od_puttext(),
- od_save_screen(), od_restore_screen(), od_scroll()
- EXAMPLE For an example of the use of the od_window_create() function,
- see the included ex_chat.c example program.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 146
- OD_WINDOW_REMOVE()
- -------------------------------------------------------------------------------
- PURPOSE Removes a window previously created using od_window_create(),
- restoring the original screen background.
- FORMAT BOOL od_window_remove(void *pWinInfo);
- RETURNS TRUE on success
- FALSE on failure
- DESCRIPTION The od_window_remove() function removes a window from the screen
- which was previously created by od_window_create(), and
- deallocates the memory which was allocated to store the window
- information. The contents of the screen beneath the window is
- restored to appear as it did prior to the call to
- od_window_create(). pWinInfo must point to the value returned by
- od_window_create().
- Note that overlapping windows must be removed in the reverse
- order from which they were created for proper display results.
- The last window to be created must be the first window to be
- removed.
- If od_window_remove() fails for any reason, a value of FALSE is
- returned, and the od_control.od_error variable is set to
- indicate the reason for the failure. For more information on the
- od_control.od_error variable, see page 185.
- SEE ALSO od_window_create(), od_draw_box(), od_gettext(), od_puttext(),
- od_save_screen(), od_restore_screen(), od_scroll()
- EXAMPLE For an example of the use of the od_window_remove() function,
- see the included ex_chat.c example program.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 147
- 555555
- 55
- 55
- 55555
- 55
- 55
- 55555
- -------------------------------------------------------------------------------
- CHAPTER 5 - THE OPENDOORS CONTROL STRUCTURE
- INTRODUCTION TO THE CONTROL STRUCTURE
- -------------------------------------------------------------------------------
- The OpenDoors "Control Structure" is used by OpenDoors in order
- to provide you with a wide range of information about the system
- on which you door is running, and the user who is currently
- using the door, along with providing you a means by which to
- customize much of OpenDoor's behavior. Using the OpenDoors
- control structure, you can access or alter information about the
- user who is online, information about the system on which your
- door is running, and information about OpenDoors itself. You can
- also use the control structure to customize all of the text
- displayed by OpenDoors, the function keys to which it responds,
- and many other aspects of OpenDoor's behavior.
- The OpenDoors control structure is quite simply a normal C
- "struct", named od_control, and is defined in the OPENDOOR.H
- file. This "struct" contains many different variables, which
- provide you access to the information provided by the control
- structure. Hence, to access the contents of a control structure
- variable, for example the variable "system_name" which contains
- the name of the BBS the door is running under, you would use:
- od_control.system_name
- The following section of this chapter contains a complete
- reference to all of the variables which make up the OpenDoors
- control structure. This reference includes the name, type and
- complete description of the use of each variable. The reference
- is divided into the following categories of variables, with the
- reference to the variables in each section beginning on the
- listed page.
- Door Information File Statistics..................150
- Modem Settings....................................153
- BBS and Caller Information........................158
- Door Settings.....................................182
- OpenDoors Behavior Customization..................187
- Function Keys Customization.......................212
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 148
- Color Customization...............................237
- Text Customization................................217
- Within each section, variables are listed alphabetically by
- name.
- Also, in order to make use of some of the variables in the
- OpenDoors control structure, it is important to understand the
- concepts of Boolean (TRUE/FALSE), and bit-mapped flag variables.
- If you are not familiar with these two terms, they are described
- in detail in the glossary, located towards the end of this
- manual.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 149
- CONTROL STRUCTURE - DOOR INFO FILE STATS
- -------------------------------------------------------------------------------
- The following OpenDoors control structure variables provide your
- program with information concerning the door information file
- from which OpenDoors obtained the BBS and caller information
- that is found elsewhere in the control structure. The following
- control structure items are listed in this section:
- info_path Sets the location and, optionally, the
- name of the door information file
- od_info_type Type of door information file that was
- found
- od_node Node number the door is running under
- user_timeofcreation The time at which the door information
- file was created
- -------------------------------------------------------------------------------
- info_path char od_control.info_path[60];
- If used, this variable should be set prior to calling od_init()
- or any other OpenDoors function. This variable allows you to
- control where OpenDoors will look for the door information (drop
- file). By default, OpenDoors searches for the door information
- file in the current directory. If this variable is set to the
- name of some other directory, OpenDoors will first search for
- any door information files in that directory. If you only wish
- OpenDoors to look for a particular type of door information file
- (for instance, you want OpenDoors to only read a DORINFO1.DEF,
- and ignore any DOOR.SYS file), you can specify the full path and
- filename of the file you wish OpenDoors to use.
- It is usually a good idea to design your door to allow the
- system operator to set the location of the door information
- file. This will allow the sysop to place your door in its own
- directory, and will facilitate the use of your door on multi-
- line BBS systems. If you are using the OpenDoors configuration
- file system, then the system operator can set the door
- information file location and/or name using the BBSDir keyword.
- However, you may also wish to allow the location of the door
- information file to be set on the command line. The following
- example illustrates a method of reading and setting the location
- of the door information file from the door's command line:
- #include "opendoor.h"
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 150
- main(int argc, char *argv[])
- {
- if(argc>1) strncpy(od_control.info_path,argv[1],59);
- od_disp_str("This is a sample OpenDoors door.\n\r");
- od_disp_str("Press any key to continue...\n\r");
- od_get_key(TRUE);
- od_exit(20);
- }
- -------------------------------------------------------------------------------
- od_info_type char od_control.od_info_type;
- This variable indicates the type of information file from which
- OpenDoors has obtained the BBS and caller information that is
- found elsewhere in the OpenDoors control structure. This
- variable will have one of the following values, indicating that
- the door information file was of the corresponding type:
- +----------------+----------------------------+
- | od_info_type | Door Information File Type |
- | Value | |
- +----------------+----------------------------+
- | DORINFO1 | DORINFO?.DEF |
- | EXITINFO | EXITINFO.BBS (Normal) |
- | RA1EXITINFO | EXITINFO.BBS (Extended) |
- | RA2EXITINFO | EXITINFO.BBS (RA 2.x) |
- | QBBS275EXITINFO| EXITINFO.BBS (QuickBBS) |
- | CHAINTXT | CHAIN.TXT |
- | SFDOORSDAT | SFDOORS.DAT |
- | CALLINFO | CALLINFO.BBS |
- | DOORSYS_GAP | DOOR.SYS (GAP/PC-Board) |
- | DOORSYS_DRWY | DOOR.SYS (Doorway style) |
- | DOORSYS_WILDCAT| DOOR.SYS (WildCat standard)|
- | CUSTOM | Custom door information |
- | | file, defined in config |
- | | file. |
- | NO_DOOR_FILE | No drop file was found. |
- +----------------+----------------------------+
- The value of this variable is only valid AFTER od_init() or some
- OpenDoors function has been called.
- Note that this variable should be treated as a read-only
- variable, and should not normally be altered by your program.
- Altering this variable may cause OpenDoors to re-write a
- different type of door information file upon exiting, than was
- read upon startup.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 151
- -------------------------------------------------------------------------------
- od_node char od_control.od_node;
- This variable indicates the node number that the door is running
- under. If this information is supplied by the BBS in the door
- information file, the node number will be automatically by
- OpenDoors. Specifically, the node number can be determined
- automatically from systems that produce an SFDOORS.DAT, PC-
- Board/GAP style DOOR.SYS or Wildcat style DOOR.SYS door
- information file. If this information is not supplied in the
- door information file, but is provided by the sysop in the
- door's configuration file, OpenDoors will use the value found
- there. Alternatively, you can set this variable manually.
- On systems that produce a DORINFO?.DEF file, OpenDoors will use
- this variable to determine which DORINFO?.DEF file to search
- for. For instance, if od_control.od_node is set to 3, OpenDoors
- will first search for a DORINFO3.DEF file. If this file is not
- found, OpenDoors will then default to the DORINFO1.DEF filename.
- -------------------------------------------------------------------------------
- user char od_control.user_timeofcreation[6];
- _timeof
- creation This variable contains the time of day at which the door
- information file was created. This variable is available only
- when the door is running under a system that produces an
- EXITINFO.BBS file. To determine what type of door information
- file your door is running under, see the od_control.od_info_type
- variable, below.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 152
- CONTROL STRUCTURE - SERIAL PORT SETTINGS
- -------------------------------------------------------------------------------
- The following OpenDoors control structure items store the
- communications settings that OpenDoors uses to communicate with
- the modem. These values are normally set upon the first call to
- an OpenDoors function, during the od_init() procedure. However,
- you may need to manual set this variables if:
- - you wish to allow greater configurability of your door
- - you are reading the door information file yourself
- - you are using the OpenDoors to write a non-door
- program
- Some of these variables are always used by OpenDoors, while
- others are only relevant if OpenDoor's built-in serial
- communications code is being used instead of a FOSSIL driver.
- Those that are only used when no FOSSIL driver is present are
- denoted by an [*] in the list below.
- The control structure variables controlling OpenDoor's serial
- port settings are as follows:
- od_control.baud Serial Port BPS rate
- od_control.od_connect_sppedThe modem connection BPS rate
- od_control.od_com_address Serial Port address [*]
- " " .od_com_fifo_trigger 16550A FIFO trigger size
- " " .od_com_flow_control Type of flow control to use.
- od_control.od_com_irq Serial Port IRQ number [*}
- od_control.od_com_method Is FOSSIL or built-in serial I/O
- being used
- od_control.od_com_no_fifo Disables use of 16550A FIFOs [*]
- od_control.od_com_rx_buf Size of receive buffer [*]
- od_control.od_com_tx_buf Size of transmit buffer [*]
- od_control.od_no_fossil Prevents OpenDoors from using a
- FOSSIL driver, even if one is
- available.
- od_control.od_open_handle Allows a live serial port handle to
- be passed to OpenDoors.
- od_control.port Serial port number, 0 based.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 153
- -------------------------------------------------------------------------------
- baud unsigned long od_control.baud;
- This variable contains the BPS rate at which the computer is
- communicating with the modem, not to be confused with the BPS
- rate at which the local modem is communicating with the remote
- modem.
- A value of 0 indicates that the program is operating in local
- mode.
- If a FOSSIL driver is being used for serial I/O, this value is
- ignored if it does not correspond to one of the baud rates that
- an application can directly set a FOSSIL driver to. The BPS
- rates recognized by FOSSIL drivers are: 300, 600, 1200, 2400,
- 4800, 9600, 19200, 38400. If any other BPS rate is to be used,
- the FOSSIL driver must be locked at that BPS from the FOSSIL
- driver command-line. When locked, FOSSIL drivers ignore any
- attempt by an application to change the BPS rate of the locked
- port. For this reason, the od_control.baud setting has no effect
- on the FOSSIL driver if it is locked.
- -------------------------------------------------------------------------------
- od_com_ int od_control.od_com_address;
- address
- This variable is only used when OpenDoors is NOT performing
- serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
- used, the serial port address can be set from the FOSSIL driver
- command line).
- This variable may optionally be set to specify the base address
- of the serial port to be used. For ports COM1: through COM4:,
- OpenDoors can normally determine the serial port address
- automatically. However, for other serial ports, the port address
- must be specified using this variable. If you are not specifying
- a serial port address with this variable, do not change it's
- default value of 0.
- -------------------------------------------------------------------------------
- od_com_ char od_control.od_com_fifo_trigger;
- fifo_trigger
- This variable is only used when OpenDoors is NOT performing
- serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
- used, the IRQ line can be set from the FOSSIL driver command
- line).
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 154
- This variable sets the number of bytes that will be placed in
- the 16550A UART FIFO buffers before an interrupt is triggered,
- if the 16550A UART FIFOs are used. Valid values are 1, 4, 8 and
- 14.
- -------------------------------------------------------------------------------
- od_com_ unsigned char od_control.od_com_flow_control;
- flow_control
- This variable sets the type of serial I/O flow control to use.
- By default, this variable is set to COM_DEFAULT_FLOW, which
- specifies the default mode of flow control. Most often, this
- will be RTS/CTS flow control. A value of COM_RTSCTS_FLOW
- explicitly enables RTS/CTS flow control. A value of COM_NO_FLOW
- disables all flow control. If you are going to change the value
- of this variable, it should be set prior to your first call to
- any OpenDoors function.
- -------------------------------------------------------------------------------
- od_com_ unsigned char od_control.od_com_irq;
- irq
- This variable is only used when OpenDoors is NOT performing
- serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
- used, the IRQ line can be set from the FOSSIL driver command
- line).
- This variable may optionally be set to specify the IRQ line to
- be used for the serial port. By default, OpenDoors uses the
- normal IRQ 4 line for ports COM1: and COM3:, and IRQ 3 for ports
- COM2: and COM4:. To override this default, the IRQ line can be
- set using this variable. If you are not specifying an IRQ line
- with this variable, do not change it's default value of 0.
- -------------------------------------------------------------------------------
- od_com_ char od_control.od_com_method;
- method
- This read-only variable reports the method that OpenDoors is
- using for serial I/O. This variable is set during od_init() or
- the first call to an OpenDoors function. This variable can be
- one of the following values:
- COM_FOSSIL - Indicates that a FOSSIL driver is being
- used
- COM_INTERNAL - Indicates that OpenDoor's internal serial I/O
- code is being used.
- COM_WIN32 - Indicates that the Win32 communication system
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 155
- is being used.
- -------------------------------------------------------------------------------
- od_com_ char od_control.od_com_no_fifo;
- no_fifo
- This variable is only used when OpenDoors is NOT performing
- serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
- used, the receive buffer size can be set from the FOSSIL driver
- command line).
- Normally, OpenDoors will use a 16550A FIFO buffer if a 16550A
- UART is installed. You can disable the use of the 16550A FIFO
- buffer by setting this variable to TRUE.
- -------------------------------------------------------------------------------
- od_com_ unsigned int od_control.od_com_rx_buf;
- rx_buf
- This variable is only used when OpenDoors is NOT performing
- serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
- used, the receive buffer size can be set from the FOSSIL driver
- command line).
- This variable allows you to set the size of OpenDoor's serial
- I/O receive buffer. If you do not set this buffer size, a
- default value of 256 characters is used. Normally, this buffer
- size is more than large enough for door programs. However, if
- you find that inbound characters are lost before they can be
- processed by your program, you may wish to increase the size of
- this buffer.
- This variable should only be changed before your first call to
- od_init() or any other OpenDoors function.
- -------------------------------------------------------------------------------
- od_com_ unsigned int od_control.od_com_tx_buf;
- tx_buf
- This variable is only used when OpenDoors is NOT performing
- serial I/O using a FOSSIL driver. (When a FOSSIL driver is being
- used, the receive buffer size can be set from the FOSSIL driver
- command line).
- This variable allows you to set the size of OpenDoor's serial
- I/O transmit buffer. If you do not set this buffer size, a
- default value of 1024 characters is used.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 156
- This variable should only be changed before your first call to
- od_init() or any other OpenDoors function.
- -------------------------------------------------------------------------------
- od_connect_ DWORD od_control.od_connect_speed;
- speed
- This variable contains the best guess at the current modem
- connection speed. This information is currently only accurate if
- a DOOR.SYS file is being used. In other situations, it will
- always be set to be equal to od_control.baud.
- -------------------------------------------------------------------------------
- od_open_ DWORD od_control.od_open_handle;
- handle
- Under platforms where this is supported (currently only the
- Win32 version of OpenDoors), this variable can be used to pass a
- live serial port handle to OpenDoors, which OpenDoors will use.
- OpenDoors will not close this handle when it exits. If this
- value is set to 0, OpenDoors will open and close the serial port
- itself.
- -------------------------------------------------------------------------------
- port char od_control.port;
- This variable contains the serial port number that the modem is
- connected. This number is 0 based, so that a value of 0
- corresponds to COM1:, a value of 1 corresponds to COM2:, and so
- on. This value will normally be set by the od_init() function,
- when the door information file is read, and should not be
- changed after modem initialization has been carried out by the
- od_init() function.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 157
- CONTROL STRUCTURE - BBS AND CALLER INFORMATION
- -------------------------------------------------------------------------------
- As we have already described, there are two types of variables
- in the OpenDoors control structure. Some of the variables are
- simply used to allow you to customize OpenDoor's various
- features, such as altering colors, prompts, timeouts, etc. Other
- variables in the OpenDoors control structure serve to provide
- you with information about the user who is online and the BBS
- system your door is running under. This section deals with those
- variables that provide you with information about the BBS and
- the user.
- The information in these variables is read from the door
- information file, a small file created by the BBS specifically
- for the purpose of communicating with door programs. Depending
- on what BBS system your door is running under, the type of door
- information file will vary. Since different door information
- files do not all provide the same pieces of information, some
- variables in this section will only be available when your door
- is running under particular BBS systems. Other variables will
- be available with many or all BBS systems. In the description of
- each variable in this section, we indicate under which door
- information files the particular variable will be . So, if you
- wish to access a variable that is only under certain door
- information files, your program should test whether or not the
- required information is available under the particular door
- information file that was found. In order to determine which
- door information file your door is running under, you should use
- the od_control.od_info_type variable. This variable is described
- in the section which begins on page 150. If you test the value
- of the od_control.od_info_type variable, and find that the
- required information is not available, you may wish to simply
- use some sort of default value for the variable, or
- alternatively, not allow your door to run under certain BBS
- systems. Another possibility, if the required information is not
- available, is imply to obtain this information from the user
- yourself. For example, if you wished to know the length of the
- user's screen, when this information is not available from the
- door information file, you could simply prompt the user for
- their screen length the first time they use your door. This
- information could then be stored in your door's data files for
- future reference.
- As an example of testing what door information file your door is
- running under, consider the case where you wanted to display the
- user's birthday. The example below will display the user's
- birthday if it is known, and otherwise, print the string
- "unknown".
- if(od_control.od_info_type == RA1EXITINFO
- od_control.od_info_type == RA2EXITINFO)
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 158
- {
- od_disp_str(od_control.user_birthday);
- }
- else
- {
- od_disp_str("Unknown");
- }
- The chart below lists the door information file formats that
- OpenDoors recognizes, along with example BBS systems that
- produce these files and a reference letter for each type. Thus,
- an OpenDoors door can run DIRECTLY under ANY BBS SYSTEM that
- produces one of these files formats, and under ANY OTHER BBS
- system when used in conjunction with a door information file
- conversion utility.
- +--------------------------+----------------------------------------+
- | FILE FORMAT | EXAMPLE BBS SYSTEMS |
- +--------------------------+----------------------------------------+
- | CHAIN.TXT | WWIV |
- +--------------------------+----------------------------------------+
- | DORINFO1.DEF | RBBS-PC |
- +--------------------------+----------------------------------------+
- | DORINFO1.DEF | QuickBBS |
- | & | Remote Access (versions 0.01-0.04) |
- | EXITINFO.BBS (Std. Ver.) | |
- +--------------------------+----------------------------------------+
- | DOOR.SYS (DoorWay Style) | Remote Access |
- +--------------------------+----------------------------------------+
- | DOOR.SYS (PCB/GAP Style) | PC-Board |
- | | GAP |
- +--------------------------+----------------------------------------+
- | DOOR.SYS (WildCat Style) | Wildcat 3.00 and above |
- | | Telegard |
- +--------------------------+----------------------------------------+
- | SFDOORS.DAT | Spitfire |
- | | TriBBS |
- +--------------------------+----------------------------------------+
- | CALLINFO.BBS | WildCat 2.xx |
- +--------------------------+----------------------------------------+
- | DORINFO1.DEF | Remote Access (versions 1.00 and later)|
- | & | |
- | EXITINFO.BBS (Ext. Ver.) | |
- +--------------------------+----------------------------------------+
- The chart on the following page lists all of the OpenDoors
- control structure variables in this section, along with a brief
- description of their use. The variables are then described in
- detail, below.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 159
- +-----------------------+-----------------------------------------------+
- | VARIABLE NAME | VARIABLE CONTENTS |
- +-----------------------+-----------------------------------------------+
- | EMSI INFORMATION | Information on current IEMSI session |
- | event_status | The status of the next system event |
- | event_starttime | The start time of the next system event |
- | event_errorlevel | The errorlevel of the next system event |
- | event_days | The days of the week to execute the event |
- | event_force | Whether the next system event is forced |
- | event_last_run | When the next system event was last run |
- | sysop_name | The name of the BBS's sysop |
- | system_calls | Total number of calls BBS has received |
- | system_last_caller | The name of the last caller to the BBS |
- | system_last_handle | The handle (alias) of the last caller |
- | system_name | The name of the BBS |
- | TIMELOG VARIABLES | The times at which the BBS has been most busy |
- | user_ansi | Whether the user has ANSI graphics mode on |
- | user_attribute | User attribute bit-mapped flags |
- | user_attrib2 | Second set of user attribute bit-mapped flags |
- | user_attrib3 | Third set of user attribute flags |
- | user_avatar | Whether the user has AVATAR graphics mode on |
- | user_birthday | The date the user was born |
- | user_callsign | The user's amateur radio call sign |
- | user_combinedrecord | The user's combined message areas settings |
- | user_comment | Sysop's comment about the user |
- | user_credit | Amount of NetMail credit the user has |
- | user_dataphone | The user's data phone number |
- | user_date_format | Format user wishes to have dates displayed in |
- | user_deducted_time | Total time that has been subtracted from user |
- | user_downk | Total Kilobytes downloaded by the user |
- | user_downlimit | User's daily download limit |
- | user_downloads | Total number of files downloaded by the user |
- | user_echomailentered | Whether or not the user has entered EchoMail |
- | user_error_free | Whether or not connection is error-free |
- | user_file_area | The user's current file area |
- | user_firstcall | Date of the user's first call to the BBS |
- | user_flags | User's sysop-defined flag settings |
- | user_forward_to | Name to forward user's mail to |
- | user_group | User's group number |
- | user_handle | User's alias |
- | user_homephone | User's home telephone number |
- | user_language | User's language setting |
- | user_last_pwdchange | Total calls since last password change |
- | user_lastdate | Date of the user's last call |
- | user_lastread | Highest message number read by user |
- | user_lasttime | Time of the user's last call |
- | user_location | Name of the city where the user lives |
- | user_logindate | Date on which the current call began |
- +-----------------------+-----------------------------------------------+
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 160
- +-----------------------+-----------------------------------------------+
- | VARIABLE NAME | VARIABLE CONTENTS |
- +-----------------------+-----------------------------------------------+
- | user_loginsec | User's security at the beginning of this call |
- | user_logintime | Time at which the current call began |
- | user_logonpassword | User's password at the beginning of this call |
- | user_menustack | Contents of the user's current menu stack |
- | user_menustackpointer | Pointer to the top of the menu stack |
- | user_messages | Total number of messages written by the user |
- | user_msg_area | The user's current message area |
- | user_name | The user's name |
- | user_net_credit | The user's remaining netmail credit |
- | user_netmailentered | Whether or not the user has entered NetMail |
- | user_num | The user's record number in the user file |
- | user_numcalls | Number of calls the user has made to the BBS |
- | user_numpages | Number of times the user has paged the sysop |
- | user_password | The user's current password |
- | user_pending | The value of unsent NetMail written by user |
- | user_reasonforchat | The reason the user wishes to chat with sysop |
- | user_rip_ver | RIP protocol version being used |
- | user_screen_length | The length of the user's screen |
- | user_screenwidth | The width of the user's screen |
- | user_security | The user's security access level |
- | user_sex | The user's gender |
- | user_subdate | The date the user's subscription expires |
- | user_timelimit | The user's daily time limit |
- | user_todayk | Kilobytes downloaded by the user today |
- | user_upk | Total Kilobytes uploaded by the user |
- | user_uploads | Total number of files uploaded by the user |
- | user_wantchat | Whether or not the user wishes to chat |
- | user_xi_record | The user's record in the USERSXI.BBS file |
- +-----------------------+-----------------------------------------------+
- -------------------------------------------------------------------------------
- EMSI char od_control.ra_emsi_session;
- INFORMATION char od_control.ra_emsi_crtdef[41];
- char od_control.ra_emsi_protocols[41];
- char od_control.ra_emsi_capabilities[41];
- char od_control.ra_emsi_requests[41];
- char od_control.ra_emsi_software[41];
- char od_control.ra_hold_attr1;
- char od_control.ra_hold_attr2;
- char od_control.ra_hold_len;
- These variables provide your door with information pertaining to
- an interactive EMSI session that has been established. Note that
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 161
- these variables are only available under systems that produce an
- RA 1.00 and later style extended EXITINFO.BBS door information
- file.
- If an IEMSI session has been established, the Boolean variable
- od_control.ra_emsi_session will be TRUE, and if no session has
- not been established, this variable will be FALSE.
- A full discussion of the IEMSI protocol is beyond the scope of
- this manual. Specifications for the IEMSI protocol are available
- from the OpenDoors support BBS.
- -------------------------------------------------------------------------------
- event_days unsigned char od_control.event_days;
- This variable is a bit-mapped flag of the days of the week on
- which the next system event is run. The bit-map bits are as
- follows:
- +-----+------+-----------+
- | BIT | MASK | MEANING |
- +-----+------+-----------+
- | 0 | 0x01 | Sunday |
- | 1 | 0x02 | Monday |
- | 2 | 0x04 | Tuesday |
- | 3 | 0x08 | Wednesday |
- | 4 | 0x10 | Thursday |
- | 5 | 0x20 | Friday |
- | 6 | 0x40 | Saturday |
- | 7 | 0x80 | All Days |
- +-----+------+-----------+
- For more information on bit-mapped flags, see the glossary item
- entitled "BIT-MAPPED FLAGS".
- This variable is only available under systems that produce an
- EXITINFO.BBS door information file.
- -------------------------------------------------------------------------------
- event_ unsigned char od_control.event_errorlevel;
- errorlevel
- This variable contains the ErrorLevel associated with the next
- system event. This variable is only available under systems that
- produce an EXITINFO.BBS door information file.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 162
- -------------------------------------------------------------------------------
- event char od_control.event_force;
- _force
- This variable indicates whether the next system event should be
- forced to run at a particular time. If this variable contains a
- value of TRUE, then the user should be forced off-line in order
- to accommodate the event, and if this variable is false, then
- the event can wait until after the user logs off normally. This
- variable is only available under systems that produce an
- EXITINFO.BBS file.
- -------------------------------------------------------------------------------
- event char od_control.event_last_run[9];
- _last_run
- This variable contains a string representing the date on which
- the next system event was last run, and is in the same format as
- the user_lastdate variable. This variable is only available
- under systems that produce an EXITINFO.BBS file.
- -------------------------------------------------------------------------------
- event char od_control.event_starttime[6];
- _starttime
- This variable contains a string representing the time at which
- the next system event is scheduled to start, in the same format
- as the user_lasttime variable. This variable is only available
- under systems that produce an EXITINFO.BBS or Wildcat style
- DOOR.SYS door information file.
- -------------------------------------------------------------------------------
- event unsigned char od_control.event_status;
- _status
- This variable represents the status of the next system event,
- and will be equal to the value
- ES_ENABLED
- if and only if the other event information contained in the
- control structure is valid. This variable is only available
- under systems that produce an EXITINFO.BBS file.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 163
- -------------------------------------------------------------------------------
- sysop_name char od_control.sysop_name[40];
- The od_control.sysop_name variable contains the name of the
- sysop of the BBS under which your door is running. This variable
- is available under any BBS system that produces a DORINFO?.DEF
- (including RA & QBBS which process both DORINFO1.DEF and
- EXITINFO.BBS files), or Wildcat style DOOR.SYS file.
- -------------------------------------------------------------------------------
- system_calls long od_control.system_calls;
- This variable contains the total number of calls that have been
- placed to the BBS, and is available under any BBS which produces
- an EXITINFO.BBS file.
- -------------------------------------------------------------------------------
- system_last char od_control.system_last_caller[36];
- _caller
- This string contains the name of the previous caller to the BBS,
- on any line, and is available under EXITINFO.BBS.
- -------------------------------------------------------------------------------
- system_last char od_control.system_last_handle[36];
- _handle
- This string contains the handle (alias) of the previous caller
- to the BBS, on any line, and is available under EXITINFO.BBS.
- -------------------------------------------------------------------------------
- system_name char od_control.system_name[40];
- The od_control.system_name variable contains the name of the BBS
- under which your door is running. This variable is available
- under any BBS system that produces a DORINFO?.DEF (including RA
- & QBBS which process both DORINFO1.DEF and EXITINFO.BBS files).
- -------------------------------------------------------------------------------
- TIMELOG char od_control.timelog_start_date[9];
- VARIABLES
- This string contains the date of the beginning of the time
- period for which the time log is recorded. This variable is
- available under any system that produces an EXITINFO.BBS file.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 164
- int od_control.timelog_busyperhour[24];
- This variable is an array of 24 elements, with each element
- indicating the total number of times the BBS was in use during
- each of the 24 hours of the day. Element 0 corresponds to the
- time period of 0:00-1:00, element 1 corresponds to the time
- period of 1:00-2:00, and so on. In order to determine the
- frequency of system use during any hour as a percentage, simply
- calculate the total of all 24 entries in the array, and divide
- any given entry by the total, in order to come up with an
- average. This variable is available under any system that
- produces an EXITINFO.BBS file.
- int od_control.timelog_busyperday[7];
- This variable is an array of 7 elements, with each element
- indicating the total number of times the BBS was in use during
- each of the 7 days of the week. Here, elements 0 corresponds to
- Sunday, element 1 to Monday, and so on. In order to calculate
- the frequency of system use during any day of the week, use the
- same method as for calculating the frequency of calls during
- each hour, as described above. This is only available under
- systems that produces an EXITINFO.BBS file. Note that at least
- some, if not all, versions of RemoteAccess do not maintain this
- variable correctly, and thus even with the presence of an
- EXITINFO.BBS file, this array may contain all zero entries.
- -------------------------------------------------------------------------------
- user_ansi char od_control.user_ansi;
- This variable contains a Boolean value, indicating whether or
- not the user has ANSI mode turned on. If ANSI graphics mode is
- enabled, this variable will contain a value of TRUE, and if ANSI
- graphics mode is disabled, this variable will contain a value of
- FALSE. Many of the OpenDoors functions test the setting of this
- variable in order to determine whether or not they should send
- ANSI-graphics control characters. Also, if this variable
- contains a TRUE value, OpenDoors will display an "[ANSI]"
- indicator on the status line.
- You may change the value of this variable at any time after the
- first call to od_init() or any other OpenDoors functions.
- Depending upon what BBS system your door is running under,
- changes to this variable may or may not result in changes to the
- user's ANSI setting upon return to the BBS.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 165
- This variable is available under all door information file
- formats.
- -------------------------------------------------------------------------------
- user_ unsigned char od_control.user_attribute;
- attribute
- This variable is a bitmap of eight flags, each of which
- represent individual pieces of information pertaining to the
- user that is currently online. These flags are as follows:
- +-----+------+-----------------------+
- | BIT | MASK | DESCRIPTION |
- +-----+------+-----------------------+
- | 0 | 0x01 | Is the user deleted |
- | 1 | 0x02 | Is screen clearing on |
- | 2 | 0x04 | Is "more" prompt on |
- | 3 | 0x08 | Is ANSI mode on |
- | 4 | 0x10 | User no-kill setting |
- | 5 | 0x20 | Transfer-priority |
- | 6 | 0x40 | Full screen editor |
- | 7 | 0x80 | Quiet mode |
- +-----+------+-----------------------+
- For more information on using and setting bit-mapped flags,
- please see the entry entitled "BITMAPED FLAGS" in the glossary
- of this manual.
- Note that this variable is only available under systems that
- produce and EXITINFO.BBS format door information file.
- -------------------------------------------------------------------------------
- user_ unsigned char od_control.user_attrib2;
- attrib2
- See the user_attrib variable for more information. This variable
- is like the user_attrib variable, except that it contains
- different information. The bit-mapped flags for the
- od_control.user_attrib2 variable are as follows:
- +-----+------+-----------------------+
- | BIT | MASK | DESCRIPTION |
- +-----+------+-----------------------+
- | 0 | 0x01 | User hot-keys setting |
- | 1 | 0x02 | Is AVATAR graphics on |
- | 2 | 0x04 | Full screen reader |
- | 3 | 0x08 | Hidden from userlist |
- +-----+------+-----------------------+
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 166
- Note that this variable is only available under systems that
- produce an EXITINFO.BBS door information file.
- -------------------------------------------------------------------------------
- user_ unsigned char od_control.user_attrib3;
- attrib3
- This variable contains user attribute flags when a RA 2.50 or
- later EXITINFO.BBS file is used.
- -------------------------------------------------------------------------------
- user_avatar char od_control.user_avatar;
- This variable is a Boolean value indicating whether or not
- AVATAR graphics mode is on. If AVATAR graphics is available,
- then many of the OpenDoors functions will make use of AVATAR
- graphics codes for greater display speed. If AVATAR graphics
- mode is on, a [AVT] indicator will appear on the status line. If
- your door is running under a system which produces an RA 1.00+
- style extended EXITINFO.BBS door information file, the
- user_avatar variable is set automatically. If the extended
- EXITINFO.BBS file is not available, this value will default to
- FALSE. In this case, you may wish to ask the user whether or not
- they wish to use AVATAR graphics, and thus set this variable
- yourself.
- -------------------------------------------------------------------------------
- user char od_control.user_birthday[9];
- _birthday
- This variable is a string, in the same format as the
- od_control.user_lastcall variable, which stores the date of the
- user's birthday, if it is available. This variable is only
- available under systems that produce an RA 1.00 and later style
- extended EXITINFO.BBS or Wildcat style DOOR.SYS file.
- -------------------------------------------------------------------------------
- user char od_control.user_callsign[12];
- _callsign
- This variable is a string which contains the user's amateur
- radio call sign, if any. This variable is only available under
- systems that produce a CHAIN.TXT file.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 167
- -------------------------------------------------------------------------------
- user_combined unsigned char od_control.user_combinedrecord[25];
- record
- This variable is an array of bit-mapped flags, with each flag
- corresponding to an individual message area. In this case, the
- first bit of od_control.ra_combinedrecord[0] corresponds to the
- first message area, the second bit to the second message area,
- and so on. If any given bit-flag is turned on, then the user has
- corresponding message area enabled for combined access, and if
- the bit is turned off, the user does not have the area enabled
- for combined access. A detailed description of the combined
- message access is beyond the scope of this manual. This variable
- is only available under systems that produce an RA 1.00 or later
- style extended EXITINFO.BBS door information file.
- -------------------------------------------------------------------------------
- user_comment char od_control.user_comment[81];
- This variable is a string which contains the sysop's comment
- about the user that is currently online. This comment may be
- displayed on the OpenDoors status line, if this variable is
- available. This variable is available under systems that produce
- an RA 1.00 and later style extended EXITINFO.BBS or Wildcat
- style DOOR.SYS file.
- -------------------------------------------------------------------------------
- user_credit unsigned int od_control.user_credit;
- This variable contains the total amount of NetMail credit that
- the caller has left. Changes to this variable will be by the BBS
- when your door exits and control is returned to the BBS. This
- variable is only available under systems that produce an
- EXITINFO.BBS door information file.
- -------------------------------------------------------------------------------
- user_ char od_control.user_dataphone[13];
- dataphone
- This string contains the user's data or business phone number,
- if available. This value is only available under system that
- produce EXITINFO.BBS, PC-Board/GAP style DOOR.SYS and WildCat
- DOOR.SYS format door information files.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 168
- -------------------------------------------------------------------------------
- user int od_control.user_deducted_time;
- _deducted
- _time This variable contains a signed integer value, which indicates
- the total amount of time that has been deducted from the user
- during this call. This variable is only available under systems
- that produce an RA 1.00 and later style extended EXITINFO.BBS
- door information file.
- -------------------------------------------------------------------------------
- user_downk unsigned int od_control.user_downk;
- This variable contains the total kilobytes of files that the
- current user has downloaded from the BBS, and is available under
- systems that produce EXITINFO.BBS, Wildcat style DOOR.SYS or
- SFDOORS.DAT format door information files.
- -------------------------------------------------------------------------------
- user unsigned int od_control.user_downlimit;
- _downlimit
- This variable contains the total number of kilobytes that the
- caller is permitted to download during this call. If your door
- allows files do be downloaded, you will probably want to compare
- the value of this variable to the size of any file to be
- transferred and the total kilobytes already downloaded, as
- stored in the od_control.user_todayk variable. This variable is
- only available under systems that produce an EXITINFO.BBS file.
- -------------------------------------------------------------------------------
- user unsigned int od_control.user_downloads;
- _downloads
- This variable contains the total number of files that the
- current user has downloaded from the BBS, and is available under
- systems that produce EXITINFO.BBS, PC-Board/GAP style DOOR.SYS,
- WildCat style DOOR.SYS or SFDOORS.DAT format door information
- files.
- -------------------------------------------------------------------------------
- user_echo char od_control.user_echomailentered;
- mailentered
- This variable is a Boolean value, indicating whether or not the
- user has entered new EchoMail during this call. If this variable
- has a value of TRUE, then EchoMail has been entered, and if it
- has a value of FALSE, then EchoMail has not been entered. This
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 169
- variable will contain a valid value only after od_init() or some
- OpenDoors function has been called. Any changes made to this
- variable will be reflected within the BBS software when control
- is returned to the BBS. This variable is accessible only under
- systems which produce an EXITINFO.BBS door information file.
- -------------------------------------------------------------------------------
- user_error char od_control.user_error_free;
- _free
- This variable contains a Boolean value indicating whether or not
- the user is connected to the BBS via an error free connection
- (eg. a V.42/MNP or similar modem protocol). This variable is
- only available under systems that produce an SFDOORS.DAT,
- Wildcat style DOOR.SYS or RA 1.00 or later style extended
- EXITINFO.BBS door information file.
- -------------------------------------------------------------------------------
- user_first char od_control.user_firstcall[9];
- call
- This variable is a string which contains the date of the user's
- first call, in the same format as the od_control. user_lastcall
- variable. This variable is only available under systems which
- produce an RA 1.00 and later style extended EXITINFO.BBS door
- information file.
- -------------------------------------------------------------------------------
- user_ unsigned char od_control.user_flags[4];
- flags
- The od_control.user_flags variable is an array of four sysop
- defined bit-mapped flags, which represent some sort of
- information about the user. od_control.user_flags[0] stores
- flags A1 - A8 in bits 0 through 7, respectively. Likewise,
- od_control.user_flags[1] stores flags B1 - B8, and so on. This
- variable is only available under systems that produce
- EXITINFO.BBS format door information files.
- -------------------------------------------------------------------------------
- user_handle char od_control.user_handle[36];
- This variable contains the user's alias or handle name, if any.
- If the user does not have and alias or handle, this variable
- will be blank. This variable is only available under systems
- that produce a CHAIN.TXT, RA 1.00 and later extended
- EXITINFO.BBS or Wildcat style DOOR.SYS door information file.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 170
- -------------------------------------------------------------------------------
- user_ char od_control.user_homephone[13];
- homephone
- This string contains the user's home or data phone number, if
- available. This value is only available under system that
- produce one of the following door information files:
- EXITINFO.BBS, PC-Board/GAP style DOOR.SYS, WildCat style
- DOOR.SYS or SFDOORS.DAT.
- -------------------------------------------------------------------------------
- user unsigned char od_control.user_last_pwdchange;
- _last
- _pwdchange This variable contains the number of calls that the user has
- made since they last changed their password. This variable is
- only available under EXITINFO.BBS files.
- -------------------------------------------------------------------------------
- user char od_control.user_lastdate[9];
- _lastdate
- This variable is a string containing the date of the user's last
- call to the BBS, and should always be of the format:
- "MM-DD-YY"
- Where MM is two digits representing the number of the month of
- the user's call, with 1 being January, 2 being February, and so
- on. DD should be two digits representing the day of the month of
- the user's last call, beginning with 1, and MM should be the
- last two digits of the year of the user's last call.
- This variable is only available under systems that produce one
- of the following door information files: CHAIN.TXT,
- EXITINFO.BBS, PC-Board/GAP style DOOR.SYS or WildCat style
- DOOR.SYS files.
- -------------------------------------------------------------------------------
- user_ unsigned int od_control.user_lastread;
- lastread
- This variable contains the number of the highest message number
- that the user has read, and is only available under EXITINFO.BBS
- format door information files.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 171
- -------------------------------------------------------------------------------
- user char od_control.user_lasttime[6];
- _lasttime
- This variable contains a string representing the time of the
- user's last call to the BBS, and should always be of the format:
- "HH:MM"
- Where HH is two digits representing the 24-hour format hour of
- the user's last call, and MM is two digits representing the
- minute of the user's last call. Thus, the following strings
- would be valid entries for this string:
- "00:01" (12:01 am)
- "03:47" (3:47 am)
- "18:20" (6:20 pm)
- This variable is only available under systems that produce an
- EXITINFO.BBS or Wildcat style DOOR.SYS format door information
- file.
- -------------------------------------------------------------------------------
- user char od_control.user_location[26];
- _location
- This string contains the name of the location from which the
- current user is calling from. This will usually be the name of
- the city, region (province, state, etc.) and sometimes country
- where the user lives. The contents of this variable are
- displayed on the OpenDoors status line. The value of this
- variable is valid after od_init() or any other OpenDoors
- function has been called. Also, you may change the value of this
- variable if you wish. However, not that these changes may not
- immediately be reflected in the status line, and may or may not
- cause the setting to be changed after the user returns to the
- BBS. This variable is available under systems that produce one
- of the following door information files: DORINFO?.DEF,
- EXITINFO.BBS, PC-Board/GAP style DOOR.SYS, WildCat style
- DOOR.SYS SFDOORS.DAT and CALLINFO.BBS, but is not available
- under CHAIN.TXT or DoorWay style DOOR.SYS files.
- -------------------------------------------------------------------------------
- user char od_control.caller_logindate[9];
- _logindate
- This variable contains a string representing the date on which
- the current call to the BBS began. This variable is in the same
- format as the od_control.user_lastdate variable, described
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 172
- below. This variable is only available under systems which
- produce an EXITINFO.BBS file.
- -------------------------------------------------------------------------------
- user long od_control.user_loginsec;
- _loginsec
- This variable contains the user's security at login, and can be
- used to detect changes by the sysop or other programs during the
- course of the call, by comparing it's value with the
- od_control.user_security variable. This variable is only
- available under systems which produce an EXITINFO.BBS file.
- -------------------------------------------------------------------------------
- user char od_control.user_logintime[6];
- _logintime
- This variable contains a string representing the time of day at
- which the current call to the BBS began. This variable is in the
- same format as the od_control.user_lasttime variable, which is
- also described below. This variable is available under systems
- which produce an EXITINFO.BBS, a Wildcat style DOOR.SYS, or an
- SFDOORS.DAT file.
- -------------------------------------------------------------------------------
- user char od_control.user_logonpassword[16];
- _logon
- password This variable is a string which contains the user's password
- at the time at which the current call to the BBS began. This
- variable can be used to detect changes by the sysop or other
- programs to the user's password, which have taken place during
- the course of the call. In order to detect such changes, simply
- compare the contents of this string with the contents of the
- od_control.user_password variable. This variable is only
- available under systems which produce an EXITINFO.BBS format
- door information file.
- -------------------------------------------------------------------------------
- user char od_control.user_menustack[50][9];
- _menustack
- This variable is an array of 50 strings, containing the stack of
- BBS menus that have been executed, and is used to record the
- current position of the user within the BBS's menu system. Each
- string contains just the base portion of the filename of the
- menu, without the extension. The od_control.ra_menustackpointer
- variable points to the top of the menu stack. However, a
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 173
- complete discussion of the menu stack is beyond the scope of
- this manual. This variable is only available under systems that
- produce an RA 1.00 and later style extended EXITINFO.BBS door
- information file.
- -------------------------------------------------------------------------------
- user unsigned char od_control.user_menustackpointer;
- _menustack
- pointer This variable points to the top of the current menu stack. For
- more information on the menu stack, please refer to the
- od_control.ra_menustack variable, above. This variable is only
- available under systems that produce an RA 1.00 and later style
- extended EXITINFO.BBS door information file.
- -------------------------------------------------------------------------------
- user unsigned int od_control.user_messages;
- _messages
- This variable contains a value representing the total number of
- messages that have been written by the user, and is available
- under EXITINFO.BBS or Wildcat style DOOR.SYS format door
- information files.
- -------------------------------------------------------------------------------
- user_name char od_control.user_name[36];
- This string contains the name of the user that is currently on-
- line, and is used by OpenDoors to display the current user name
- on the status line, and will most likely be used by your door
- for differentiating among different users. In most cases, you
- should probably not change the value of this variable, as a
- user's name does not usually change, and doing so could results
- in problems when returning to some BBS systems. For an example
- of using this variable, see the EX_VOTE.C example program. This
- variable is available under all BBS systems.
- -------------------------------------------------------------------------------
- user_net_ unsigned int od_control.user_net_credit;
- credit
- This variable contains the amount of NetMail credit that the
- current user has to his or her name. This variable is only
- available under systems that produce an EXITINFO.BBS file.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 174
- Note that if you wish to change the value of the user's
- remaining NetMail credit, you should use the od_control.
- user_credit variable, instead of this variable.
- -------------------------------------------------------------------------------
- user_net char od_control.user_netmailentered;
- mailentered
- This variable is a Boolean value, indicating whether or not the
- user has entered new NetMail or GroupMail during this call. If
- this variable has a value of TRUE, then NetMail/GroupMail has
- been entered, and if it has a value of FALSE, then
- NetMail/GroupMail has not been entered. This variable will
- contain a valid value only after od_init() or some OpenDoors
- function has been called. Any changes made to this variable will
- be reflected within the BBS software when control is returned to
- the BBS. This variable is accessible only under systems which
- produce an EXITINFO.BBS door information file.
- -------------------------------------------------------------------------------
- user_num unsigned int od_control.user_num;
- This variable contains the number of the user's record in the
- user database file, where 0 is the first record. This can be
- useful for changing user settings that are not re-read by the
- BBS, such as the user's phone number or security level which
- might be altered by a call back verification door. However, the
- value of this variable itself should not be altered.
- This variable is available under systems which produce any of
- the following door information file formats: CHAIN.TXT, PC-
- Board/GAP style DOOR.SYS, Wildcat style DOOR.SYS SFDOORS.DAT and
- EXITINFO.BBS.
- -------------------------------------------------------------------------------
- user_ unsigned int od_control.user_numcalls;
- numcalls
- This variable contains the total number of calls that the
- current user has placed to the BBS, and is available under
- systems that produce EXITINFO.BBS or PC-Board/GAP and Wildcat
- style DOOR.SYS door information files.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 175
- -------------------------------------------------------------------------------
- user unsigned int od_control.user_numpages;
- _numpages
- The value of this variable contains the total number of times
- that the user has paged the sysop, and can be used to limit the
- number of times that the user is permitted to page the sysop.
- OpenDoors increments this variable every time that the user
- pages the sysop, via the od_page() function. This variable is
- used with all types of door information files. However, this
- variable will only reflect the value within the BBS if an
- EXITINFO.BBS file is produced. Otherwise, the variable will only
- contain the number of times that the user has paged within the
- door, but not the total number of times the user has paged.
- Under EXITINFO.BBS systems, changes to the value of this
- variable will be reflected within the BBS upon return by the
- DOOR.
- -------------------------------------------------------------------------------
- user char od_control.user_password[16];
- _password
- This variable contains the user's password for accessing the
- BBS. OpenDoors does not use this value itself. This variable
- will contain a valid value only after od_init() or some
- OpenDoors function has been called. You may change the value of
- this variable. Note, however, that changes in this variable may
- or may not cause the setting to be changed when control returns
- to the BBS - this will depend upon the particular BBS system
- your door is running under. This variable is only available
- under systems that produce one of the following door information
- files: EXITINFO.BBS, PC-Board/GAP and Wildcat style DOOR.SYS,
- SFDOORS.DAT, and CALLINFO.BBS.
- -------------------------------------------------------------------------------
- user_pending unsigned int od_control.user_pending;
- This variable represents the total value of NetMail that has
- been written by the current user, but not yet exported from the
- message base. This variable is only available under systems that
- produce an EXITINFO.BBS door information file.
- -------------------------------------------------------------------------------
- user_reason char od_control.user_reasonforchat[78];
- forchat
- This variable is a string, containing the reason for which the
- user wishes to chat with the sysop, as they entered at the time
- of paging the sysop. This variable will contain an empty string
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 176
- if the user has not paged the sysop, or if the reason the user
- wishes to chat is unknown. See also the od_control.user_wantchat
- variable. This variable is available under all BBS systems,
- regardless of what style of door information file they produce.
- However, this variable will not be passed between the door and
- BBS, and thus the user's reason for chat within the door will
- not necessarily correspond to their reason for chat outside the
- door.
- -------------------------------------------------------------------------------
- user_rip char user_rip;
- This variable is set to TRUE if the user has RIP (Remote Imaging
- Protocol) graphics enabled, and FALSE if they do not. This
- setting can be determined from the door information (drop) file
- in many cases. In other cases, you can automatically determine
- whether or not the user's system supports RIP graphics using the
- od_autodetect() function (see page 48).
- -------------------------------------------------------------------------------
- user_rip_ver BYTE user_rip_ver;
- This variable contains the version of the RIP protocol that is
- in use. This variable is only available under a RemoteAccess
- 2.50 EXITINFO.BBS file.
- -------------------------------------------------------------------------------
- user unsigned int od_control.user_screen_length;
- _screen
- _length This value of this variable represents the total number of
- lines that can be displayed on the user's screen at once, and is
- usually either 24 or 25. You may wish to make use of this
- variable to allow your door to pause the display of long pieces
- of text after every screen length, in order to allow the user to
- read this information before it passes off of their screen. In
- this case, you would simply maintain a counter of the total
- number of lines displayed, and when this value reaches one less
- than the length of the user screen, display a prompt asking the
- user to whether or not they wish to continue.
- This variable is set to the user's setting within the BBS under
- systems that produce any of the following door information file
- formats: CHAIN.TXT, EXITINFO.BBS, PC-Board/GAP and Wildcat style
- DOOR.SYS and CALLINFO.BBS files.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 177
- This variable is used by the OpenDoors function,
- od_list_files(). If this variable contains a valid value,
- OpenDoors will pause the listing of files after every screen,
- and give the user the option of continuing, aborting, or
- disabling the "Continue?" prompt for the rest of the file
- listing. Thus, if you are using the od_list_files() under a
- system that does not produce one of the door information files
- listed above, you may wish to obtain the user's screen length
- from the user themselves. If the screen length is not available
- from the particular type of door information file that is found,
- and you do not set this value yourself, this variable will
- default to 23. If you are going to set the value of this
- variable yourself, you should do so after having called
- od_init() or some OpenDoors function.
- -------------------------------------------------------------------------------
- user_ unsigned char od_control.user_screenwidth;
- screenwidth
- This variable contains a value representing the width of the
- user's screen, and will most often be equal to 80. This variable
- is only available under systems that produce a CHAIN.TXT or RA
- 1.00 and later style extended EXITINFO.BBS door information
- file.
- -------------------------------------------------------------------------------
- user unsigned int od_control.user_security;
- _security
- This variable contains a numerical value representing the user's
- security access level on the BBS. You may wish to use this value
- to determine whether or not the current user of your door should
- have access to certain sysop-only functions. In this case, you
- may wish to have a configuration file used by your door, in
- which the sysop may define the minimum security level for sysop
- access. You would then be able to compare this configuration
- setting to the security level stored in this variable, in order
- to determine whether or not sysop function should be available.
- An alternative method, used by the EX_VOTE.C sample door, of
- determining whether or not the current user is the sysop is to
- compare the user's name with the value of the
- od_control.sysop_name variable. This method has the advantage of
- not requiring a configuration program, but the disadvantage that
- the door will not function correctly under all BBS systems, as
- the od_control.sysop_name variable is not available under all
- BBS systems.
- The od_control.user_security variable is available under BBS
- systems that produce any of the following door information file
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 178
- formats: CHAIN.TXT, EXITINFO.BBS, PC-Board/GAP and Wildcat style
- DOOR.SYS, SFDOORS.DAT or CALLINFO.BBS.
- -------------------------------------------------------------------------------
- user_sex char od_control.user_sex;
- This variable contains a single character representing the
- gender of the user that is currently online. This variable will
- contain an upper-case 'F' if the user is female, and an upper-
- case 'M' if the user is male. This variable is available under
- systems that produce a CHAIN.TXT or RA 2.x style EXITINFO.BBS
- file.
- -------------------------------------------------------------------------------
- user_subdate char od_control.user_subdate[9];
- This variable is a string, in the same format as the
- od_control.user_lastdate variable, which stores the date of
- expiry of the user's subscription to the BBS. This variable is
- only available under systems which produce a PC-Board/GAP and
- Wildcat style DOOR.SYS or RA 1.00 and later style extended
- EXITINFO.BBS door information file.
- -------------------------------------------------------------------------------
- user int od_control.user_timelimit;
- _timelimit
- This variable contains the amount of time, in minutes, that the
- user has left in the door. Note that this value may or may not
- be equal to the total amount of time that the user has left on
- the BBS, depending upon whether the BBS or a third-party door
- manager program only allows a limited amount of time in this
- door. This variable contains a valid value after od_init() or
- some OpenDoors function has been called. OpenDoors uses this
- variable to keep track of how much time the user has left in the
- door, and will automatically warn the user when nearly all of
- his or her time has been used up. OpenDoors will also force the
- user out of the door when their time in the door has expired.
- OpenDoors automatically subtracts one minute from this variable
- every minute that OpenDoors is active, unless chat mode has been
- activated (in which case the user's time will freeze), and also
- adjusts the value of this variable when the sysop uses the time
- adjustment function keys. Hence, you will not normally have any
- need to alter the value of this variable yourself. However,
- there may be some cases in which you wish to subtract a penalty
- or add a bonus to the user's time, such as in a "timebank" door
- or a door game that permits the user to "gamble time".
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 179
- Depending on which BBS system your door is running under, the
- value of this variable may or may not effect the user's time
- left upon return to the BBS. The BBS system will either reset
- the user's time to the value re-written to the door information
- file (this variable), or will always subtract the amount of time
- spent in the door from the user's remaining time.
- This variable is available under all door information file
- formats.
- -------------------------------------------------------------------------------
- user unsigned int od_control.user_todayk;
- _todayk
- This variable contains the total kilobytes of files that the
- current user has downloaded from the BBS during the current day,
- and is available under systems that produce EXITINFO.BBS, PC-
- Board/GAP and Wildcat style DOOR.SYS, or SFDOORS.DAT format door
- information files.
- -------------------------------------------------------------------------------
- user_upk unsigned int od_control.user_upk;
- This variable contains the total kilobytes of files that the
- current user has uploaded to the BBS, and is available under
- systems that produce EXITINFO.BBS, Wildcat style DOOR.SYS or
- SFDOORS.DAT files.
- -------------------------------------------------------------------------------
- user_uploads unsigned int od_control.user_uploads;
- This variable contains the total number of files that the
- current user has uploaded to the BBS, and is available under
- systems that produce EXITINFO.BBS, PC-Board/GAP and Wildcat
- style DOOR.SYS, or SFDOORS.DAT format door information files.
- -------------------------------------------------------------------------------
- user char od_control.user_wantchat;
- _wantchat
- This variable is a Boolean value which indicates whether or not
- the user wishes to chat with the sysop (ie, the user has paged
- the sysop, but has yet to receive a chat with the sysop). This
- variable is used under all door information file formats.
- However, changes to this variable are only reflected on the BBS
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 180
- when the door is running under a system that produces an
- EXITINFO.BBS door information file.
- This variable is automatically turned on (ie., set to TRUE),
- when the user begins to page the sysop for chat, within the
- od_page() function, and is automatically turned off (ie., set to
- FALSE), when the sysop breaks in for chat via the chat function
- key. Also, setting this variable to TRUE will turn on the
- flashing want-chat indicator on the OpenDoors status line.
- -------------------------------------------------------------------------------
- user unsigned int od_control.user_xi_record;
- _xi_record
- This variable contains the number of the user's record in the
- USERXI.BBS file, if any. This variable is only available under
- system that produce a Remote Access 1.00 and later style
- extended door information file.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 181
- CONTROL STRUCTURE - DOOR SETTINGS
- -------------------------------------------------------------------------------
- This section deals with those variables in the OpenDoors control
- structure which reflect the current door settings. These
- variables are as follows:
- od_cur_attrib The current display attribute, or -1 if
- unknown.
- od_okaytopage Controls whether the user is currently
- permitted to page the sysop.
- od_pageendmin End of valid paging hours.
- od_pagestartmin Start of valid paging hours.
- od_silent_mode Turns off local user interface.
- od_user_keyboard_on Controls whether OpenDoors will
- currently accept input from the remote
- user's keyboard.
- od_update_status_now Forces immediate update of the status
- line.
- sysop_next Indicates whether or not the sysop has
- reserved use of the system after the
- current calls.
- -------------------------------------------------------------------------------
- od_cur int od_control.od_cur_attrib;
- _attrib
- This read-only values stores the current display color
- attribute, or the value -1 if the current display color is
- unknown (such as when the door first begins execution).
- -------------------------------------------------------------------------------
- od char od_control.od_okaytopage;
- _okaytopage
- This variable allows you to control whether or not the user is
- currently permitted to page the sysop via the od_page()
- function. A value of PAGE_ENABLE indicates that paging is
- currently permitted, regardless of the sysop page hours setting.
- A value of PAGE_DISABLE indicates that paging is not current
- permitted. A value of PAGE_USE_HOURS indicates that the
- od_page() function should check the values of the
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 182
- od_pagestartmin and od_pageendmin variables in order to
- determine whether or not paging should be permitted.
- The od_okaytopage variable should only be set after you call
- od_init() or some other OpenDoors function. The default value is
- PAGE_USE_HOURS. For more information on the od_page() function
- itself, see page 101.
- -------------------------------------------------------------------------------
- od unsigned int od_control.od_pageendmin;
- _pageendmin
- This variable can be used to set the beginning of valid sysop
- paging hours within the od_page() function. If the
- od_control.od_okaytopage variable (which is described above) is
- set to MAYBE, then OpenDoors will check the value of this
- variable prior to paging the sysop via the od_page() function.
- This variable should contain the time at which the valid sysop
- paging hours end, represented as the a number of minutes since
- midnight. For more information on the od_page() function itself,
- see page 101.
- -------------------------------------------------------------------------------
- od unsigned int od_control.od_pagestartmin;
- _pagestartmin
- This variable can be used to set the beginning of valid sysop
- paging hours within the od_page() function. If the
- od_control.od_okaytopage variable (which is described above) is
- set to MAYBE, then OpenDoors will check the value of this
- variable prior to paging the sysop via the od_page() function.
- This variable should contain the time at which the valid sysop
- paging hours begin, represented as the a number of minutes since
- midnight. For more information on the od_page() function itself,
- see page 101.
- -------------------------------------------------------------------------------
- od_silent BOOL od_control.od_silent_mode;
- _mode
- If this variable is set to TRUE prior to the first call to any
- OpenDoors function, OpenDoors will operate in silent mode, where
- the local display and sysop commands are not used. Silent mode
- is automatically disabled if the program is running in local
- mode.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 183
- -------------------------------------------------------------------------------
- od_update char od_control.od_update_status_now;
- _status_now
- Setting this variable to TRUE forces OpenDoors to update the
- status line during the next od_kernel() execution. When the
- status line is updated, this variable is reset to its default
- value of FALSE.
- -------------------------------------------------------------------------------
- od_user char od_control.od_user_keyboard_on;
- _keyboard_on
- This variable is a Boolean value, indicating whether OpenDoors
- will currently accept input from a remote user. OpenDoors
- provides a function key (usually [ALT]-[K], unless you have
- changed the default), which will allow the sysop to temporarily
- prevent the user from having any control over the door. When the
- sysop activates this feature, a flashing [Keyboard-Off]
- indicator will appear on the status line, and this variable will
- be set to FALSE. When the sysop presses the [ALT]-[K]
- combination a second time, to toggle the user's keyboard back
- on, the flashing indicator will disappear, and this variable
- will be set back to TRUE.
- -------------------------------------------------------------------------------
- sysop_next char od_control.sysop_next;
- This variable is a Boolean value, indicating whether or not the
- "sysop next" feature has been activated. The "sysop next"
- feature, which reserves the system for the sysop after the call
- has ended, can be toggled on and off within OpenDoors by use of
- a function key (Alt-N by default). Also, when the "sysop next"
- feature has been activated, an indicator will appear on the
- OpenDoors status line. This variable is only available under
- systems that produce an SFDOORS.DAT or RA 1.00 and later style
- extended EXITINFO.BBS door information file. For more
- information on testing the type of door information file
- available, please see page 158.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 184
- CONTROL STRUCTURE - DIAGNOSTICS
- -------------------------------------------------------------------------------
- To help in diagnosing problems in your OpenDoors programs,
- OpenDoors stores information on the most recent error which
- occurred. When any of the OpenDoors functions return an "error"
- or "failure" state, the reason for this failure is recorded.
- The following OpenDoors control structure variable provides
- diagnostics information:
- od_error Stores a "reason code" for the last
- failed OpenDoors API function call.
- -------------------------------------------------------------------------------
- od_error int od_control.od_error;
- When any of the OpenDoors API functions return an "error" or
- "failure" state (usually denoted by either of the values FALSE
- or NULL), the reason for the failure is recorded in this
- variable. Since successful function calls do not alter the value
- of the od_control.od_error variable, you must be careful not
- only to check the value of the od_control.od_error variable, but
- also to check the OpenDoors function return codes, in order to
- determine which function failed.
- This variable will always store the reason for the most recent
- function call failure, or ERR_NONE if no functions have failed.
- od_error may take on any of the following values:
- ERR_NONE Indicates that no error has occurred
- yet.
- ERR_MEMORY Function was unable to allocate
- required memory. This usually indicates
- that there is not enough available
- memory. This failure may also be due to
- memory corruption caused by your
- program inadvertently overwriting heap
- structures. If your program has been
- compiled in either the small or the
- medium memory model, try recompiling it
- in the compact, large, or huge memory
- models. If your program is already
- compiled in the compact, large, or huge
- memory models, try making more system
- memory available to your program.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 185
- ERR_NOGRAPHICS This setting indicates that the
- function called requires ANSI, AVATAR
- or RIP graphics mode, but none of these
- modes are active.
- ERR_PARAMETER An invalid parameter was passed to an
- OpenDoors functions. Check the
- function's description in chapter four,
- to determine the required values for
- each function parameter.
- ERR_FILEOPEN OpenDoors was unable to open a file.
- This can be due to the specified
- filename not existing, due to the file
- being locked for exclusive access by
- another process, or due to a hardware
- failure.
- ERR_FILEREAD OpenDoors was able to open the
- specified file, but unable to read the
- required data from the file. This error
- may be due to an invalid file format,
- due to a portion of the file being
- locked by another process, or due to a
- hardware failure.
- ERR_LIMIT An internal function limit has been
- exceeded. Refer to the function's
- description in chapter four for
- information on the function's
- limitations.
- ERR_NOREMOTE Indicates that a function has been
- called which is not valid in local
- mode, such as od_carrier() or
- od_set_dtr().
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 186
- CONTROL STRUCTURE - OPENDOORS CUSTOMIZATION
- -------------------------------------------------------------------------------
- The OpenDoors control structure provides many variables which
- allow you to customize OpenDoor's behavior and appearance. These
- customization variables fit into one of the following
- categories:
- General Behavior Customization Variables
- Sysop Function Keys Customization Variables
- Color Customization Variables
- Language-Specific Prompts Customization Variables
- This section deals with those variables that fit into the first
- category, "General Behavior Customization Variables". The other
- categories are dealt with in the following sections of this
- chapter.
- Below is a brief overview of the variables grouped into this
- section of the OpenDoors control structure. Following the
- overview is a detailed description of each of these variables.
- od_app_icon Program icon for Win32 version.
- od_box_chars Array of characters used by the
- od_draw_box() function.
- od_before_exit Function to call prior to exiting.
- od_cafter_chat Function to call after sysop chat.
- od_cafter_shell Function to call after DOS shell.
- od_cbefore_chat Function to call prior to sysop chat.
- od_cbefore_shell Function to call prior to DOS shell.
- od_cfg_lines Sets the configuration file's custom
- door information file line keywords.
- od_cfg_text Sets the built-in configuration file
- keywords that OpenDoors will recognize.
- od_chat_active Controls whether or not sysop chat mode
- is active.
- od_clear_on_exit Controls whether the screen is cleared
- upon door exit.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 187
- od_color_delimiter Indicates what character should delimit
- imbedded color codes for the
- od_printf() function.
- od_color_names Strings which OpenDoors recognizes as
- the names of various text colors.
- od_config_file Used to enable or disable the OpenDoors
- configuration file system.
- od_config_filename Sets the filename that will be read by
- the configuration file system.
- od_config_function The callback function that OpenDoors
- will call to allow your program to
- process custom configuration file
- entries.
- od_default_personality Sets the default personality to be used
- with the OpenDoors Multiple Personality
- System, and also sets the personality
- to use when the MPS is not active.
- od_default_rip_win Whether OpenDoors should use the
- default 43-line RIP window for ANSI
- text (TRUE), or a 23-line window
- (FALSE).
- od_disable Disable OpenDoors activities such as
- reading door information file and
- monitoring carrier detect / remaining
- time.
- od_disable_dtr Specifies the string that will be sent
- to the modem to prevent the modem from
- hanging up when DTR is lowered.
- od_emu_simluate_modem Simulates modem display speed for
- emulation functions such as
- od_send_file(), od_disp_emu() and
- od_hotkey_menu().
- od_errorlevel Sets the errorlevel OpenDoors exits
- with under various conditions.
- od_force_local Forces door to operate in local mode,
- ignoring any door information file and
- using default user settings.
- od_help_callback Allows you to provide a help menu item
- under the Win32 version of OpenDoors
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 188
- od_in_buf_size Sets size of OpenDoor's internal
- local/remote inbound buffer.
- od_inactive_warning Number of seconds before hanging up
- that OpenDoors displays the inactivity
- timeout warning.
- od_inactivity Controls user inactivity timeout.
- od_ker_exec Is called whenever od_kernel()
- executes.
- od_last_input Indicates whether the last input came
- from the remote user (==0) or the local
- sysop (==1).
- od_list_pause Controls whether or not the user may
- pause display within the
- od_list_files() and od_send_file()
- functions by using the [P] key.
- od_list_stop Controls whether or not the user may
- terminate display within the
- od_list_files() and od_send_file()
- functions using [S], [CTRL]-[K], etc.
- od_logfile Enables or disables the OpenDoors log
- file system.
- od_logfile_disable Prevents the logfile from being opened,
- even if the logfile is enabled by
- od_logfile.
- od_logfile_messages Array of message strings that OpenDoors
- will use when writing log file entries.
- od_logfile_name Contains the filename and possibly path
- of the logfile.
- od_maxtime Indicates the maximum length of time
- any user is permitted to use the door.
- od_maxtime_deduction Indicates the amount of time that has
- temporarily been taken away from the
- user's remaining time, as a result of
- the maximum door time setting.
- od_mps Enables or disables the OpenDoors
- Multiple Personality System.
- od_no_file_func Called when no door information file
- can be read.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 189
- od_no_ra_codes Disables translation of RA/QBBS control
- codes.
- od_nocopyright Prevents OpenDoors from displaying it's
- name and version number when a door
- program begins execution.
- od_noexit Prevents OpenDoors from exiting when
- the od_exit() function is called.
- od_page_len Controls length of the sysop page beep.
- od_page_pausing Enables or disables page pausing in
- od_send_file(), od_hotkey_menu() and
- od_list_files() functions.
- od_page_startmin Indicates the time of day at which
- sysop paging is first enabled.
- od_page_statusline Which status line (if any) is activated
- when the user pages the sysop.
- od_page_endmin Indicates the time of day at which
- sysop paging is disabled.
- od_prog_name Stores the name of your program.
- od_prog_version Stores the version number of your
- program.
- od_prog_copyright Place your copyright information here.
- od_reg_key Stores the registration key that you
- receive when purchasing OpenDoors.
- od_reg_name Stores your name or your companies name
- when you have purchased an OpenDoors
- license (registration).
- od_spawn_freeze_time Indicates whether the user's time
- remaining continues to be decreased
- during the execution of the
- od_spawn...() functions (FALSE), or if
- the timer should be "frozen" (TRUE).
- od_swapping_disable Disables swapping during DOS shell and
- od_spawn...() functions.
- od_swapping_noems Prevents swapping form being done to
- EMS expanded memory.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 190
- od_swapping_path Location where disk swap file should be
- created.
- od_status_on Controls whether the status line sub-
- system is active.
- od_time_msg_func Called instead of displaying time limit
- warning messages.
- -------------------------------------------------------------------------------
- od_app HICON od_control.od_app_icon;
- _icon
- Normally, the Win32 version of OpenDoors displays its own icon
- on the application title bar, on the Windows taskbar, and in the
- help|about dialog box. You can supply your own icon by setting
- this variable to point to the handle of the icon, as returned by
- LoadIcon();
- -------------------------------------------------------------------------------
- od_box char od_control.od_box_chars[8];
- _chars
- This variable allows you to specify which character the
- od_draw_box() function uses in drawing the boarder of a window.
- The elements of this array are as follows:
- od_box_chars[BOX_UPPERLEFT] - Upper left corner of box
- od_box_chars[BOX_TOP] - Top horizontal line
- od_box_chars[BOX_UPPERRIGHT] - Upper right corner of box
- od_box_chars[BOX_LEFT] - Left Vertical line
- od_box_chars[BOX_LOWERLEFT] - Lower left corner of box
- od_box_chars[BOX_LOWERRIGHT] - Lower right corner of box
- od_box_chars[BOX_BOTTOM] - Bottom horizontal line
- od_box_chars[BOX_RIGHT] - Right horizontal line
- -------------------------------------------------------------------------------
- od_before void (*od_control.od_before_exit)();
- _exit
- This variable contains a pointer to a function which OpenDoors
- should call prior to exiting, or NULL if you do not wish to have
- any function called at exit time. For an example of the use of
- this variable, see the description of the EX_VOTE.C example
- program, which begins on page 38.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 191
- -------------------------------------------------------------------------------
- od_cafter void (*od_control.od_cafter_chat)();
- _chat
- The function pointed to by this variable will be called after
- sysop chat mode has ended. This may be useful for allowing you
- to save the user's screen contents prior to chat, and restoring
- the afterwards. If this variable contains its default value of
- NULL, no function will be called. To alter the string of text
- which is displayed after sysop chat, see the
- od_control.od_after_chat variable, which is described in the
- section on the prompts customization portion of the control
- structure.
- -------------------------------------------------------------------------------
- od_cafter void (*od_control.od_cafter_shell)();
- _shell
- The function pointed to by this variable will be called after
- the sysop has returned from a DOS shell. If this variable
- contains its default value of NULL, no function will be called.
- To alter the string of text which is displayed after a DOS
- shell, see the od_control.od_after_shell variable, which is
- described in the section on the prompts customization portion of
- the control structure.
- -------------------------------------------------------------------------------
- od_cbefore void (*od_control.od_cbefore_chat)();
- _chat
- The function pointed to by this variable will be called prior to
- entering sysop chat mode. This may be useful for allowing you to
- save the user's screen contents prior to chat, and restoring the
- afterwards. If this variable contains its default value of NULL,
- no function will be called. To alter the string of text which is
- displayed prior to sysop chat, see the od_control.od_before_chat
- variable, which is described in the section on the prompts
- customization portion of the control structure. To replace the
- OpenDoors sysop chat facility with your own, simply activate
- your chat mode when this function is called. Your chat mode
- facility should remain active until OpenDoors sets the
- od_control.od_chat_active variable to FALSE. If you wish to
- terminate chat mode prior to this variable being set to FALSE,
- you should set this variable to FALSE yourself if you do not
- wish OpenDoors to activate its own chat mode.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 192
- -------------------------------------------------------------------------------
- od_cbefore void (*od_control.od_cbefore_shell)();
- _shell
- The function pointed to by this variable will be called prior to
- executing a sysop DOS shell. If this variable contains its
- default value of NULL, no function will be called. To alter the
- string of text which is displayed before a DOS shell, see the
- od_control.od_before_shell variable, which is described in the
- section on the prompts customization portion of the control
- structure.
- -------------------------------------------------------------------------------
- od_cfg_lines char od_control.cfg_lines[25][33];
- This array contains the strings for the keywords that represent
- various lines in the definition of a custom door information
- file. Each keyword must be 32 character or less in length. These
- keywords are not case sensitive. See page 230 for more
- information on defining custom door information (drop) file
- formats. The default values for this array are as follows:
- [0] "Ignore"
- [1] "ComPort"
- [2] "FossilPort"
- [3] "ModemBPS"
- [4] "LocalMode"
- [5] "UserName"
- [6] "UserFirstName"
- [7] "UserLastName"
- [8] "Alias"
- [9] "HoursLeft"
- [10] "MinutesLeft"
- [11] "SecondsLeft"
- [12] "ANSI"
- [13] "AVATAR"
- [14] "PagePausing"
- [15] "ScreenLength"
- [16] "ScreenClearing"
- [17] "Security"
- [18] "City"
- [19] "Node"
- [20] "SysopName"
- [21] "SysopFirstName"
- [22] "SysopLastName"
- [23] "SystemName"
- [24] "RIP"
- If you wish to change any of these variable, you must do so
- before calling any OpenDoors functions.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 193
- -------------------------------------------------------------------------------
- od_cfg_text char od_control.od_cfg_text[47][33];
- This array of strings contains the built-in configuration file
- keywords that are recognized by OpenDoors. These keywords may be
- up to 32 characters in size, and are not case sensitive. If you
- wish to change any of these settings, you must do so before
- calling any OpenDoors functions. The default values for this
- array are as follows:
- [0] "Node"
- [1] "BBSDir"
- [2] "DoorDir"
- [3] "LogFileName"
- [4] "DisableLogging"
- [5] "SundayPagingHours"
- [6] "MondayPagingHours"
- [7] "TuesdayPagingHours"
- [8] "WednesdayPagingHours"
- [9] "ThursdayPagingHours"
- [10] "FridayPagingHours"
- [11] "SaturdayPagingHours"
- [12] "MaximumDoorTime"
- [13] "SysopName"
- [14] "SystemName"
- [15] "SwappingDisable"
- [16] "SwappingDir"
- [17] "SwappingNoEMS"
- [18] "LockedBPS"
- [19] "SerialPort"
- [20] "CustomFileName"
- [21] "CustomFileLine"
- [22] "InactivityTimeout"
- [23] "PageDuration"
- [24] "ChatUserColor"
- [25] "ChatSysopColor"
- [26] "FileListTitleColor"
- [27] "FileListNameColor"
- [28] "FileListSizeColor"
- [29] "FileListDescriptionColor"
- [30] "FileListOfflineColor"
- [31] "Personality"
- [32] "NoFossil"
- [33] "PortAddress"
- [34] "PortIRQ"
- [35] "ReceiveBuffer"
- [36] "TransmitBuffer"
- [37] "PagePromptColor"
- [38] "LocalMode"
- [39] "PopupMenuTitleColor"
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 194
- [40] "PopupMenuBorderColor"
- [41] "PopupMenuTextColor"
- [42] "PopupMenuKeyColor"
- [43] "PopupMenuHighlightColor"
- [44] "PopupMenuHighKeyColor"
- [45] "NoFIFO"
- [46] "FIFOTriggerSize"
- [47] "DiableDTR"
- [48] "NoDTRDisable"
- -------------------------------------------------------------------------------
- od_chat char od_control.od_chat_active;
- _active
- This variable is set to TRUE when sysop chat mode is active, and
- is set to FALSE when sysop chat mode is not active. This
- variable can be used to determine whether or not chat mode is
- active, and to force chat mode to end. When the sysop presses
- the chat mode key ([ALT]-[C] if the default personality is being
- used) while chat mode is active, this variable is set to FALSE.
- -------------------------------------------------------------------------------
- od_clear char od_control.od_clear_on_exit;
- _on_exit
- This variable contains a Boolean value, which indicates whether
- or not you wish OpenDoors to clear the screen prior to exiting.
- This variable defaults to a value of TRUE, which causes the
- screen to be cleared when a door program exits. However, you may
- wish to set this variable to a value of FALSE, which will cause
- the contents of the screen to remain unchanged when the door
- exits. While setting this variable to FALSE will probably result
- in a messy display if the door is to return control to a batch
- file, if the door returns directly to the BBS, it will result in
- a smoother transition from the door back to the BBS (as the
- sysop is not left with a blank screen). If your door has a
- configuration file or configuration program, you may wish to
- have an option which will allow the individual sysop to
- determine whether or not the screen should be cleared when the
- door exits.
- -------------------------------------------------------------------------------
- od_color char od_control.od_color_delimiter;
- _delimiter
- This variable sets the character that is used to delimit color
- codes in the od_printf() function, and defaults to the back-
- quote (`) character. If you wish to be able to display the back-
- quote (`) character using the od_printf() function, and thus
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 195
- wish to use a different character to delimit color codes in the
- od_printf() function, simply set this variable to the
- alternative character you wish to use. If you wish to disable
- the imbedded color codes feature of the od_printf() function,
- simply set this variable to a value of zero. For more
- information on od_printf() imbedded color codes, see the
- description of the od_printf() function, which begins on page
- 110.
- -------------------------------------------------------------------------------
- od_color char od_control.od_color_names[12][33];
- _names
- This array sets the strings that OpenDoors will recognize as
- color description keywords. These are the keywords that can be
- imbedded in od_printf() format strings, and are also the
- keywords that can be used to change color settings in the
- OpenDoors configuration file. If you wish to change these
- keywords, you will normally do so before calling any OpenDoors
- functions. These keywords should always be supplied in upper-
- case characters. The defaults values for this array are as
- follows:
- [0] "BLACK"
- [1] "BLUE"
- [2] "GREEN"
- [3] "CYAN"
- [4] "RED"
- [5] "MAGENTA"
- [6] "YELLOW"
- [7] "WHITE"
- [8] "BROWN"
- [9] "GREY"
- [10] "BRIGHT"
- [11] "FLASHING"
- -------------------------------------------------------------------------------
- od_config void (*od_control.od_config_file)(void);
- _file
- Set this variable to INCLUDE_CONFIG_FILE to enable the OpenDoors
- configuration file system, or set it to NO_CONFIG_FILE to
- disable the configuration file system. This variable should only
- be set prior to your first call to an OpenDoors function. For
- more information on the OpenDoors configuration file system, see
- page 224.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 196
- -------------------------------------------------------------------------------
- od_config char *od_control.od_config_filename;
- _filename
- If set, this variable should point to a string containing the
- filename that you wish the OpenDoors configuration file system
- to read. If this variable has its default value of NULL, the
- filename DOOR.CFG will be used by default.
- -------------------------------------------------------------------------------
- od_config void (*od_control.od_config_function)(char *keyword, char
- _function *options);
- If set, this variable should point to the function that
- OpenDoors should call when lines with unrecognized keywords are
- encountered in the configuration file. This allows you to add
- your own configuration file keywords. The first parameter to
- this function will be a pointer to a string containing the
- unrecognized keywords, and the second parameter will be a
- pointer to a string containing any options that were specified
- after the keyword. If no options were specified after the
- keyword, this string will have a length of 0.
- -------------------------------------------------------------------------------
- od_default void (*od_control.od_default_personality)(unsigned char
- _personality operation);
- This variable sets the default personality that OpenDoors will
- use if the multiple personality system is active. If the
- multiple personality system is not active, the personality set
- by this variable will be the only personality available. This
- variable should only be set prior to calling an OpenDoors
- function. This variable can be set to point to your own
- personality function, or it can be set to one of the manifest
- constants that represent one of the built-in personalities:
- PER_OPENDOORS
- PER_PCBOARD
- PER_RA
- PER_WILDCAT
- For more information on the OpenDoors Multiple Personality
- System, see page 230.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 197
- -------------------------------------------------------------------------------
- od_default char od_control.od_default_rip_win;
- _rip_win
- This variable defaults to FALSE. When set to FALSE, OpenDoors
- resets the RIP text window to a 23-line window that is most
- appropriate for doors that support both RIP-graphics and non-RIP
- mode. When this variable is set to TRUE, OpenDoors will use the
- default sized text output window, 43 lines in size.
- -------------------------------------------------------------------------------
- od_disable unsigned int od_control.od_disable;
- This variable is a bit-mapped flag which can be used to disable
- certain OpenDoors features which are normally active, in order
- to allow for maximum customization of OpenDoors. Each bit of
- this variable represents a different feature that can be
- disabled. To DISABLE a feature, you set the bit that corresponds
- to the particular feature. To ENABLE the feature, the bit is
- reset. Each bit is represented by a keyword, as follows:
- DIS_INFOFILE - Setting the DIS_INFOFILE bit of the
- od_control.od_disable variable allows you to prevent
- OpenDoors from reading or re-writing a door information
- file. If you wish to disable OpenDoors' reading of the door
- information file, you must do so prior to calling
- od_init() or any other OpenDoors door-driver functions. At
- the same time, you must also manually set any required
- variables that are normally set by the information obtained
- from the door information file, such as the comm port
- number, baud rate, user name, and so on. You may wish to
- disable reading of the door information file in a number of
- cases. For example, you may wish to manually read another
- format of door information file not supported by OpenDoors,
- or to obtain the necessary door information from your
- program's command line. Also, if you are using OpenDoors to
- write a non-door communications program, such as a terminal
- program, you want to prevent OpenDoors from attempting to
- read a door information file on startup.
- DIS_CARRIERDETECT - Setting this bit allows you to prevent
- OpenDoors from exiting when it the carrier detect signal
- from the modem disappears. This bit may be set or rest at
- any time. If you use this bit to disable OpenDoors' carrier
- detection, you will probably want to monitor the state of
- the carrier detect signal yourself, using the od_carrier()
- function, which is described on page 51.
- DIS_TIMEOUT - This flag allows you to prevent OpenDoors from
- exiting when the user runs out of time. As with the
- DIS_CARRIERDETECT flag, you may set or reset this bit at
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 198
- any time. You will most often want to use this setting when
- writing a non-door program, which you would not want to
- have exit after a particular amount of time has elapsed. Be
- sure that you do not confuse this flag with the user's
- inactivity timeout. To disable the inactivity timeout, set
- the do_control.od_inactivity variable to 0.
- DIS_LOCAL_OVERRIDE - This setting affects OpenDoors' behavior
- when a locked BPS rate is specified in the configuration
- file, and another BPS rate is specified in the door
- information file. By default, OpenDoors will initialize the
- modem at the BPS rate specified in the configuration file,
- unless the BPS rate specified in the door information file
- is 0. In this case, the 0 BPS rate is used to indicate that
- the door is operating in local mode, and will override the
- BPS rate specified in the configuration file. Setting this
- flag disables the local mode override, causing the modem to
- always be initialized at the locked BPS rate, even when the
- door information file specifies that local mode should be
- used.
- DIS_BPS_SETTING - When used with a FOSSIL driver, OpenDoors
- normally changes the BPS rate to that passed from the BBS
- (if the BBS passes a valid FOSSIL BPS rate). Setting the
- DIS_BPS_SETTING flag disables this BPS rate setting.
- DIS_LOCAL_INPUT - The local keyboard may be disabled by setting
- this bit. This only affects the sysop's input in
- circumstances that input is also accepted from the remote
- user; this setting has no effect on the sysop function
- keys.
- DIS_SYSOP_KEYS - This setting also disables the local keyboard.
- However, unlike the DIS_LOCAL_INPUT, this function disables
- both sysop function keys and door input from the local
- keyboard.
- DIS_DTR_DISABLE - This setting prevents OpenDoors from
- disabiling DTR response from the modem. Even if not
- specified, OpenDoors only disables DTR response in the when
- exiting under the Win32 version if an open serial port
- handle was not provided to OpenDoors at startup.
- DIS_NAME_PROMPT - Prevents OpenDoors from prompting for a user
- name when operating in automatic local mode (by setting
- od_force_local to TRUE or specifying -local on the command
- line).
- Note that in order to disable the OpenDoors status line, the
- od_control.od_status_on variable is used, instead of the
- od_disable variable. You may also disable the user's inactivity
- timeout by setting the od_control.od_inactivity variable to 0.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 199
- The od_control.od_status_on variable is described later in this
- section.
- -------------------------------------------------------------------------------
- od_disable_ char od_control.od_disable_dtr[40];
- dtr
- Unles the DIS_DTR_DISABLE od_disable flag is set, the Win32
- version of OpenDoors will attempt to disable DTR response by the
- modem when closing the serial port, if the serial port was
- opened by OpenDoors. This is done by sending a series of
- commands to the modem, and possibly waiting for responses to the
- command. The string format specifies each command, followed by
- the required response. The command and response is separated by
- a single space character. If no response is required between two
- commands, then those commands may be separated by two space
- characters. A '|' character is translated into a carriage
- return, and a '~' character is translated into a one second
- pause. The default value of this string is "~+++~ AT&D0 ATO".
- -------------------------------------------------------------------------------
- od_emu_ BOOL od_control.od_emu_simulate_modem;
- simulate_modem
- When this flag is set to its default value of FALSE, the
- OpenDoors terminal emulator displays text at full speed. When
- this flag is set to TRUE, the emulation functions will display
- text at approximately the same speed as it would be displayed
- when sent over the modem, based on the current connect speed. In
- local mode, an average modem speed of 9600bps is assumed. This
- allows animations to be displayed locally at the same speed as
- they would appear on the remote system. This switch affects the
- following functions:
- od_disp_emu()
- od_send_file()
- od_hotkey_menu()
- -------------------------------------------------------------------------------
- od unsigned char od_control.od_errorlevel[8];
- _errorlevel
- Allows you to configure the errorlevel (program exit code) which
- OpenDoors exits with under various circumstances. The elements
- of this array are as follows:
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 200
- [ERRORLEVEL_ENABLE] Enables or disables custom errorlevels
- [ERRORLEVEL_CRITICAL] Critical error errorlevel
- [ERRORLEVEL_NOCARRIER] Carrier lost errorlevel
- [ERRORLEVEL_HANGUP] Sysop manually terminated call
- [ERRORLEVEL_TIMEOUT] User time expired errorlevel
- [ERRORLEVEL_INACTIVITY] Keyboard inactivity timeout errorlevel
- [ERRORLEVEL_DROPTOBBS] Sysop returned user to BBS errorlevel
- [ERRORLEVEL_NORMAL] Door has exited normally
- If you wish to override the default errorlevels used by
- OpenDoors, you should set element [ERRORLEVEL_ENABLE] of this
- array to TRUE, and set the remaining array elements to the
- appropriate errorlevels. Note that the settings in this array
- only affect the errorlevels which OpenDoors uses when it causes
- the door to exit for one of the reasons listed above. This
- setting has no effect on the errorlevel returned when your
- program explicitly exits by calling the od_exit() function, or
- your program returns by calling exit() or returning from the
- main() function.
- -------------------------------------------------------------------------------
- od char od_control.od_force_local;
- _force_local
- This variable defaults to FALSE, which causes OpenDoors to
- behave normally. When this variable is set to TRUE prior to
- calling od_init() or any other OpenDoors functions, OpenDoors
- will operate in local mode. In this case, no door information
- file will be read. Also, the user name will be used if
- od_control.user_name has not been set prior to calling od_init()
- or the first OpenDoors function.
- The default OpenDoors settings when od_control.od_force_local is
- set are as follows:
- - ANSI mode is on
- - Time limit is 60 minutes
- - User's location is the name of the BBS, or "Unknown Location"
- otherwise if BBS name is not known.
- - User name is set to sysop's name ("Sysop" if no sysop name is
- specified in the configuration file).
- You may wish to add a "-local" type parameter to your program's
- command line, which will permit the sysop to easily operate the
- door in local mode, as an interface to the
- od_control.od_force_local setting.
- -------------------------------------------------------------------------------
- od_help void (*od_control.od_help_callback)(void);
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 201
- _callback
- If this variable is set to a non-NULL value, the Win32 version
- of OpenDoors will provide a Contents item on the help menu, and
- call the function pointed to by this variable when the user
- chooses the Contents menu item.
- -------------------------------------------------------------------------------
- od_in_buf unsigned int od_control.od_in_buf_size;
- _size
- Specifies the size, in characters, of the OpenDoor's internal
- local/remote inbound buffer size. Two bytes of storage are
- required for each character in this buffer. This variable should
- only be changed prior to calling od_init() or the first
- OpenDoors function. If not set, this variable defaults to a
- value of 256.
- The buffer corresponding to this variable should not be confused
- with the FOSSIL or internal communications receive buffer (which
- is set by od_control.od_com_rx_buf). Unlike the serial I/O
- receive buffer, which is used only for characters received from
- the remote system, this buffer serves as a queue for input from
- both the remote system and the local keyboard. If you find that
- characters are lost when information is being set to your door
- from the user, you may wish to increase the size of this buffer.
- -------------------------------------------------------------------------------
- od unsigned int od_control.od_inactivity;
- _inactivity
- OpenDoors has a built in user-inactivity timeout facility, which
- will automatically disconnect a user who appears .to be sleeping
- at the keyboard. If the user has not pressed any keys on their
- keyboard for to great a length of time, they will be warned that
- they are about to be disconnected due to inactivity. If they
- still do not respond after another few seconds, OpenDoors will
- automatically disconnect the user and return control to the BBS
- software. The od_control.od_inactivity variable allows you to
- set the maximum length of time, in seconds, after which the user
- will be disconnected for inactivity. This variable defaults to a
- value of 200 seconds. You may disable OpenDoors' inactivity
- timeout altogether, by setting the od_control.od_inactivity
- variable to a value of 0.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 202
- -------------------------------------------------------------------------------
- od_inactive int od_control.od_inactive_warning.
- _warning
- This variable sets the number of seconds prior to hanging up
- that OpenDoors displays the inactivity timeout warning. This
- variable should only be changed after your first call to an
- OpenDoors API function. If not explicitly set by your program,
- this setting defaults to 10 seconds.
- -------------------------------------------------------------------------------
- od_ker_exec void (*od_control.od_ker_exec)(void);
- When od_control.od_ker_exec is set to point to a function,
- OpenDoors will call this function whenever od_kernel() executes.
- This provides any easy way for you to perform your own
- processing on a regular basis during door execution. The
- od_control.od_ker_exec variable defaults to NULL.
- -------------------------------------------------------------------------------
- od_last char od_control.od_last_input;
- _input
- Indicates whether the last key retrieved using the od_get_key()
- function originated from the remote user, or the local sysop. If
- the input originated from the remote, this variable is set to 0.
- If the input originated from the local keyboard, this variables
- is set to 1.
- -------------------------------------------------------------------------------
- od_list char od_control.od_list_pause;
- _pause
- This variable contains a Boolean value, which allows you to
- control whether or not the user may pause displaying within the
- od_list_files() and od_send_file() function. When this variable
- is set to its default value of TRUE, the user will be able to
- pause the display by pressing the [P] key, and resume display by
- pressing any other key. However, the pause feature may be
- disabled by setting this variable to FALSE.
- -------------------------------------------------------------------------------
- od_list char od_control.od_list_stop;
- _stop
- This variable contains a Boolean value, which allows you to
- control whether or not the user may abort displaying within the
- od_list_files() and od_send_file() function. When this variable
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 203
- is set to its default value of TRUE, the user will be able to
- pause the display by pressing the [S], [CTRL]-[K] or [CTRL]-[C]
- keys. However, the stop feature may be disabled by setting this
- variable to FALSE.
- -------------------------------------------------------------------------------
- od_local void (*od_control.od_local_input)(int);
- _input
- If set, this function is called whenever the sysop presses a
- non-sysop-function key on the local keyboard. The key pressed is
- passed to the function in the single int parameter that it
- accepts.
- -------------------------------------------------------------------------------
- od_logfile void *(od_control.od_logfile)(void);
- To make the OpenDoors log file system available in your program,
- set this variable to INCLUDE_LOGFILE, prior to calling any
- OpenDoors functions. If not set, or if set to NO_LOGFILE, the
- OpenDoors log file system will not automatically be enabled.
- -------------------------------------------------------------------------------
- od_logfile char od_control.od_logfile_disable;
- _disable
- This variable defaults to the value of FALSE, unless the
- "LogfileDisable" option is specified in the configuration file,
- in which case the variable will be set to TRUE. If this variable
- is set to TRUE, OpenDoors will not write to a logfile, even if
- the logfile system is enabled using od_control.od_logfile.
- -------------------------------------------------------------------------------
- od_logfile char *od_control.od_logfile_messages[14];
- _messages
- This array of pointers to strings contains the messages that
- OpenDoors will automatically write to the log file, if the log
- file system is enabled. If you wish to change the settings of
- this array, you should do so before calling any OpenDoors
- functions. The default strings for this array are as follows:
- [0] "Carrier lost, exiting door"
- [1] "System operator terminating call, exiting door"
- [2] "User's time limit expired, exiting door"
- [3] "User keyboard inactivity time limit exceeded, exiting door"
- [4] "System operator returning user to BBS, exiting door"
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 204
- [5] "Exiting door with errorlevel %d,
- [6] "Invoking operating system shell"
- [7] "Returning from operating system shell"
- [8] "User paging system operator"
- [9] "Entering sysop chat mode"
- [10] "Terminating sysop chat mode"
- [11] "%s entering door"
- [12] "Reason for chat: %s"
- [13] "Exiting door"
- -------------------------------------------------------------------------------
- od_logfile char od_control.od_logfile_name[80];
- _name
- This variable specifies the filename, and optionally the full
- path of the logfile where OpenDoors should perform logging. This
- variable only has an effect when set prior to calling any
- OpenDoors functions. If the log file name is specified in the
- configuration file, that name will be stored in this variable.
- If you do not set this variable, and the log file name is not
- specified in the configuration file, the default name "DOOR.LOG"
- will be used. If you wish to set this variable, you should do so
- prior to calling od_init() or any OpenDoors function.
- -------------------------------------------------------------------------------
- od_ unsigned int od_control.od_maxtime;
- maxtime
- This variable specifies the maximum length of time that any user
- is permitted to use the door, and is normally set from a
- configuration file option. If upon entering the door, the user's
- time remaining online is greater than the od_maxtime setting,
- their time remaining is temporarily decreased to the maximum
- value. Then upon exit of the door, the number of subtracted
- minutes is added back onto the user's remaining time. If the
- user's remaining time is less than this value, then the setting
- has no effect. A value of 0 disables the maximum time setting
- altogether.
- -------------------------------------------------------------------------------
- od_maxtime int od_control.od_maxtime_deduction;
- _deduction
- This variable store the amount of time that should be added to
- the user's time upon exit of the door, as a result of the
- maximum time deduction, described above. If the maximum time
- feature is not used, this variable will be given a value of 0.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 205
- -------------------------------------------------------------------------------
- od_mps void (*od_control.od_mps)(void);
- To make the OpenDoors Multiple Personality system available in
- your program, set this variable to INCLUDE_MPS before calling
- any OpenDoors functions. If this variable is not set, or is set
- to NO_MPS, the Multiple Personality System will be disabled. For
- more information on the OpenDoors Multiple Personality System,
- see page 233.
- -------------------------------------------------------------------------------
- od_no_ void (*od_control.od_no_file_func)();
- file_func
- If od_no_file_func is set to point to a function, that function
- will be called whenever a door information (drop) file cannot be
- located or read. This provides an easy mechanism to add your own
- door information file reader, or to provide a local login prompt
- when no drop file is present. If you wish the door to operate in
- local mode, you should set od_control.od_force_local to TRUE
- prior to returning from your function. If you have successfully
- read your own door information file format, you should set
- od_control.od_info_type to CUSTOM. If neither of these variables
- are set by the od_no_file_function, OpenDoors will report that
- it is unable to find or read a door information file and will
- exit immediately.
- -------------------------------------------------------------------------------
- od_no_ra char od_control.od_no_ra_codes;
- _codes
- This variable defaults to FALSE. When set to TRUE, the
- translation of the RemoteAccess/QuickBBS control codes by the
- functions od_send_file(), od_hotkey_menu() and od_disp_emu() is
- disabled.
- -------------------------------------------------------------------------------
- od_ char od_control.od_nocopyright;
- nocopyright
- This variable is a Boolean value that allows you to prevent
- OpenDoors from displaying its name, version number, copyright
- notice and registration information when the program begins
- execution. Set this variable to TRUE to disable the display of
- copyright and associated information. When this variable is set
- to TRUE, OpenDoors also does not change the initial display
- color on startup. For obvious reasons, this variable does not
- take effect when OpenDoors is operating in unregistered mode.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 206
- -------------------------------------------------------------------------------
- od_noexit char od_control.od_noexit;
- This variable contains a Boolean value, which allows you to
- prevent OpenDoors from exiting when shutting down. This may be
- useful when you want to have your program to do more processing
- after you have called the od_exit() function, or if you do not
- wish to have your program exit automatically when the user drops
- carrier. Normally, this variable will default to a value of
- FALSE, indicating that OpenDoors will exit normally when the
- od_exit() function is called. However, you may optionally set
- this variable to TRUE after od_init() or some OpenDoors function
- has been called. In this case, when the od_exit() function is
- called, either by your program manually, or automatically by
- OpenDoors in response to the user dropping carrier, etc.,
- OpenDoors will not exit. However, the normal operations of
- closing the serial port and re-writing the door information file
- will be carried out. If you set the od_noexit variable to TRUE,
- you will probably have to provide some mechanism to allow your
- program to detect when OpenDoors shutdowns due to the loss of
- carrier, etc. The best way of doing this is to provide a
- function which is to be called at the beginning of the od_exit()
- function, by setting the od_control.od_before_exit pointer,
- described above.
- -------------------------------------------------------------------------------
- od_page char od_control.od_page_len;
- _len
- This variable allows you to control the length, in seconds, of
- the sysop page beep produced when the user pages the sysop via
- the od_page() function.
- -------------------------------------------------------------------------------
- od_page char od_control.od_page_pausing;
- _pausing
- This variable contains a Boolean value that indicates whether or
- not page pausing is enabled in the od_send_file(),
- od_hotkey_menu() and od_list_files() functions. The default
- value of TRUE indicates that page pausing is enabled. A value of
- FALSE indicates that page pausing is disabled.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 207
- -------------------------------------------------------------------------------
- od_page int od_control.od_pagestartmin;
- startmin int od_control.od_pageendmin;
- od_page These variables indicate the start and end times for sysop
- endmin paging, expressed as the number of minutes past midnight.
- Sysop paging will be available through the od_page() function
- from the start time, up to but not including the end time.
- -------------------------------------------------------------------------------
- od_page char od_control.od_page_statusline;
- _statusline
- This variable controls which status line, if any, is activated
- when the user pages the system operator (via the od_page()
- function). A value between 0 and 9 causes the corresponding
- status line to be activated. A value of -1 prevents any change
- from being made to the current status line setting. This
- variable will normally be set by personality functions (see page
- 233).
- -------------------------------------------------------------------------------
- od_prog_ char od_control.od_prog_copyright[40];
- copyright
- This variable should contain your program's copyright notice,
- such as "(C) Copyright 1996 by Your Name". This information is
- used in the Help|about dialog box under the Win32 version of
- OpenDoors, and may be used in other places in future versions of
- OpenDoors.
- -------------------------------------------------------------------------------
- od_prog_name char od_control.od_prog_name[40];
- This variable should contain the full name of your program, up
- to 39 characters. If not set, OpenDoors will use the string
- "OpenDoors" in place of this variable. If used, this variable
- should be set prior to calling any OpenDoors functions, and
- should not include your program's version number. This
- information is used to write your program's name in the log file
- and to indicate your program's name on various windows, among
- other places.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 208
- -------------------------------------------------------------------------------
- od_prog_version char od_control.od_prog_version[40];
- This variable should contain the version information of your
- program. If used, this variable should be set prior to calling
- any OpenDoors functions. This information is used in the
- Help|About dialog box under the Win32 version of OpenDoors,
- among other places.
- -------------------------------------------------------------------------------
- od_reg_key unsigned log od_control.od_reg_key;
- When you purchase an OpenDoors licence (registration), this
- variable should be set to your registration key, prior to
- calling any OpenDoors functions.
- -------------------------------------------------------------------------------
- od_reg_name char od_control.od_reg_name[36];
- When you purchase an OpenDoors licence (registration), this
- variable should be set to your name, or your company's name, as
- is listed in your OpenDoors registration record.
- -------------------------------------------------------------------------------
- od_spawn char od_control.od_spawn_freeze_time;
- _freeze_time
- This variable is a Boolean value which indicates whether or not
- the user's time remaining is frozen during the execution of one
- of the od_spawn...() functions. If this variable is set to TRUE,
- the user's time remaining will not decrease during the time that
- the od_spawn...() function is executing. However, if this
- variable is set to FALSE, the user's time remaining will
- continue to be subtracted during the execution of the
- od_spawn...() function. The default value of this variable is
- FALSE.
- -------------------------------------------------------------------------------
- od_swapping char od_control.od_swapping_disable;
- _disable
- This variable is a Boolean value which specifies whether or not
- OpenDoors will attempt to swap itself and your entire door upon
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 209
- DOS shell or a call to one of the od_spawn...() functions. This
- variable defaults to FALSE. If set to TRUE, OpenDoors will not
- attempt to perform swapping activities.
- -------------------------------------------------------------------------------
- od_swapping char od_control.od_swapping_noems;
- _noems
- This variable is a Boolean value which can be used to prevent
- OpenDoors from swapping to EMS memory. This variable defaults to
- the value FALSE. If set to TRUE, OpenDoors will not attempt to
- use EMS memory for swapping, and will only swap to disk.
- -------------------------------------------------------------------------------
- od_swapping char od_control.od_swapping_path;
- _path
- This variable specifies the drive and directory where OpenDoors
- should create its disk swapping file, if applicable. More than
- one path can be specified, by separating the paths with a semi-
- colon (;) character.
- -------------------------------------------------------------------------------
- od_status char od_control.od_status_on;
- _on
- This variable is a Boolean value which allows your program to
- completely disable the OpenDoors status line. The variable
- defaults to a value of TRUE, which causes the OpenDoors status
- line to be controllable by function keys, displayed and updated
- as it would normally be. However, if this variable is set to
- FALSE, then OpenDoors will not update the status line, nor will
- it allow the status line to be re-displayed as a result of one
- of the status line ([F1] through [F10]) keys being pressed. When
- you change the value of this variable from FALSE to TRUE,
- OpenDoors will automatically redisplay the status line. Note,
- however, that the status line isn't automatically removed when
- the value of this variable is changed from TRUE to FALSE. In
- order to erase the status line after resetting the value of this
- variable, you should reset the output window to the full screen,
- by calling the function window(1,1,25,80). Then manually erase
- the old status line either by clearing the bottom two lines of
- the screen, or by clearing the entire screen.
- It is important that you do not confuse the use of this variable
- with the od_set_statusline() function, which is described on
- page 137. When the status line is enabled, the sysop can change
- which status line, if any, is being displayed, using the
- function keys [F1] through [F10]. The od_set_statusline()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 210
- function allows your program to make the same changes to the
- status line setting which the sysop can make by pressing one of
- the function keys. The status line can be removed from the
- screen, allowing a full 25 lines of text to be displayed, by
- pressing the [F10] key, or by making the appropriate call to the
- od_set_statusline() function. Note, however, than when this is
- done, the status line is still enabled, and can be turned on by
- pressing any of the other function keys. On the other hand, if
- the status line is turned off using this variable
- (od_control.od_status_on), the status line sub-system will be
- disabled, and pressing function keys will not "bring it back".
- So, if you were writing a program where a status line would be
- undesirable - such as a non-door communications program, you
- would use the od_control.od_status_on variable. On the other
- hand, if you only wanted to temporarily remove the status line -
- say in order that all 25 lines of a door program's output could
- be viewed - while still allowing the status line to be turned on
- with the sysop function keys, you would use the
- od_set_statusline() function. For more information on the
- od_set_statusline() function, see page 137.
- -------------------------------------------------------------------------------
- od_time void (*od_control.od_time_msg_func)(char *string)
- _msg_func
- This variable defaults to a value of NULL. If set to point to a
- function, OpenDoors will call this function INSTEAD OF
- displaying time limit warning messages to the user. The messages
- redirected to this function are:
- - Inactivity timeout warning
- - Inactivity timeout expired
- - Less than 4 minutes left today
- - Daily time limit expired
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 211
- CONTROL STRUCTURE - FUNCTION KEYS
- -------------------------------------------------------------------------------
- Within OpenDoors, as with most BBS software and doors, the sysop
- has access to a number of function keys, which permits the sysop
- to carry out various functions such as entering chat mode,
- hanging up on the user, shelling to DOS, and so on. The
- variables in this section allow you to customize which keys
- carry out the standard sysop functions, allowing you to
- customize your door's interface to mimic any BBS package. By
- default, OpenDoors emulates the function keys used by the Remote
- Access BBS package, but you may choose, for example, to have
- your door use the key combinations used by PC-Board. In
- addition, OpenDoors provides an interface which allows you to
- add your own function keys which will be accepted by the door.
- This could allow you to add additional features, such as giving
- the sysop access to a status screen which displays information
- about your door.
- Many of the variables in this section are unsigned ints, which
- represent a sysop key combination such as [ALT]-[H], [F8], or
- [CTRL]-[P]. These values are in the same format as is returned
- by the Turbo C(++) / Borland C++ bioskey() function. The high-
- order byte represents the scan code of the key, and the low-
- order byte represents the ASCII value, if any, of the key
- combination. Note that a complete tutorial on these key codes is
- beyond the scope of this manual. For more information on these
- key codes, you should see the documentation on the bioskey()
- function, which accompanies your compiler. If you wish to
- determine the key code which corresponds to a particular
- keystroke, there is a simple program, listed below, which you
- can compile and use. This program will simply display the key
- code for any key pressed, until you press the [ESCape] key. So,
- in order to determine the code for [SHIFT]-[F8], you would
- simply run this program, press the [SHIFT]-[F8] key combination
- on your keyboard, and record the value displayed on your screen.
- #include <stdio.h>
- #include <bios.h>
- main()
- {
- int nKey;
- do
- {
- nKey = bioskey(0);
- printf("%d (from: %x, %x)\n",
- nKey, nKey>>8, nKey&0xff);
- } while((nKey & 0xff) != 27);
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 212
- -------------------------------------------------------------------------------
- BUILT IN These variable allow you to customize the sysop function keys
- FUNCTION which control functions such as hanging up on the user, shelling
- KEYS to DOS, and so on. All of these variable will be assigned
- default values, which correspond to the same function keys used
- by the RemoteAccess BBS package. However, you may change the
- values of these variables in order to customize the key
- combinations which carry out these functions in your own door
- program. Remember that if you wish to change the value of any of
- these variables, you must do so after having called od_init() or
- some OpenDoors function. Each of these variables contain a scan-
- code / ASCII-code combination representing a keystroke, as is
- described above. These variables are as follows:
- +---------------------+----------------------------------------+
- | VARIABLE | CORRESPONDING FUNCTION |
- +---------------------+----------------------------------------+
- | od_control. | Enter sysop chat mode |
- | key_chat | (Normally [ALT]-[C] |
- | | |
- | od_control. | Invoke sysop DOS shell |
- | key_dosshell | (Normally [ALT]-[J] |
- | | |
- | od_control. | Return to the BBS without hanging up |
- | key_drop2bbs | (Normally [ALT]-[D]) |
- | | |
- | od_control. | Hangup on the user |
- | key_hangup | (Normally [ALT]-[H]) |
- | | |
- | od_control. | Turn off the user's keyboard |
- | key_keyboardoff | (Normally [ALT]-[K]) |
- | | |
- | od_control. | Decreases the user's remaining time |
- | key_lesstime | (Normally [DOWN-ARROW]) |
- | | |
- | od_control. | Lock the user out of the BBS system |
- | key_lockout | (Normally [ALT]-[L]) |
- | | |
- | od_control. | Increases the user's remaining time |
- | key_moretime | (Normally [UP-ARROW]) |
- | | |
- | od_control. | Array of eight function keys to set the|
- | key_status[8] | current status line. |
- | | (Normally [F1], [F2], [F3], [F4], [F5],|
- | | [F6], [F9], [F10]) |
- | | |
- | od_control. | "Sysop next" toggle key |
- | key_sysopnext | (Normally [ALT]-[N]) |
- +---------------------+----------------------------------------+
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 213
- -------------------------------------------------------------------------------
- CUSTOM In addition to the sysop function keys built into OpenDoors, you
- FUNCTION may wish to add your own function keys to your door. For
- KEYS example, you might wish to have the [ALT]-[Z] combination
- display a window of information about your door, or you may wish
- to add your own user editor to your door, accessible through the
- [ALT]-[E] combination. The four variables:
- unsigned char od_control.od_num_keys;
- unsigned int od_control.od_hot_key[16];
- unsigned int od_control.od_last_hot;
- void (*od_control.od_hot_function[16])(void);
- provide your program with an interface to add your own sysop
- function keys (not accessible by the remote user) to the door
- you have written.
- OpenDoors allows you to define up to sixteen custom sysop
- function keys. The key codes (as described at the beginning of
- this section) are stored in the od_control.od_hot_key[] array,
- and the od_control.od_num_keys variable records the number of
- keys which have been defined. The od_control.od_num_keys
- variable defaults to a value of 0. So, in order to add your own
- function keys, simply place the key codes for these keys in the
- first n elements of the od_control.od_hot_key[] array, and set
- the od_control.od_num_keys variable to the number of keys you
- have defined. OpenDoors will then watch the keyboard for any of
- your predefined sysop function keys being pressed. If one of
- these keys is pressed, OpenDoors will place the key code of the
- pressed key in the od_control.od_last_hot variable. Your program
- will then be able to respond to one of your custom function keys
- being pressed by checking the value of the
- od_control.od_last_hot variable. At any time this variable
- contains a non-zero value. If this is the case, you will then be
- able to determine which of your function keys has been pressed
- by checking the key code contained in this variable. After
- taking the appropriate action for the key pressed, you should be
- sure to reset the value of the od_control.od_last_hot variable
- back to zero, which will indicate to OpenDoors that your program
- has received and responded to the function key which was
- pressed.
- As an alternative to testing the contents of the
- od_control.od_last_hot variable, you can also have your program
- respond to custom sysop function keys by providing a callback
- function in the array: void
- (*od_control.od_hot_function[16])(void);
- The Nth element in this array corresponds to the Nth element in
- the od_control.od_hot_key array. To use this mechanism, simply
- set the appropriate element of this array to point to the
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 214
- function that you wish to have OpenDoors call when the sysop
- presses the corresponding function key. For instance, assume
- that the following function is included in your program's source
- code:
- void addPoints(void)
- {
- /* add ten points to the user's score */
- currentUser->points += 10;
- }
- If you wanted to have this function called when the sysop
- presses the [Page Up] key, you could do the following:
- /* get number of new sysop function key, and increment */
- /* total number of keys */
- int new_key = od_control.od_num_keys++;
- /* Set next sysop hotkey to Page Up */
- od_control.od_hot_key[new_key] = 0x4900;
- /* Set corresponding function to addPoints() */
- od_control.od_hot_function[new_key] = addPoints;
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 215
- CONTROL STRUCTURE - COLOR CUSTOMIZATION
- -------------------------------------------------------------------------------
- These variables allow you to customize the color of text
- displayed by OpenDoors. Each of these variables are assigned
- color attributes, in the format used by od_set_attrib()
- (described on page 128). These variables are as follows:
- +---------------------+----------------------------------------+
- | VARIABLE | WHERE COLOR IS USED |
- +---------------------+----------------------------------------+
- | od_control. | Text typed by the sysop and user in |
- | od_chat_color1 & 2 | chat mode. |
- | | |
- | od_control. | File description fields in FILES.BBS |
- | od_list_comment_col | listings |
- | | |
- | od_control. | Color of page pausing prompt that is |
- | od_continue_col | displayed at the end of each page |
- | | |
- | od_control. | Filename fields in FILES.BBS listings |
- | od_list_name_col | |
- | | |
- | od_control. | "Missing" string in FILES.BBS listings |
- | od_list_offline_col | |
- | | |
- | od_control. | File size fields in FILES.BBS listings |
- | od_list_size_col | |
- | | |
- | od_control. | Title fields in FILES.BBS listings |
- | od_list_title_col | |
- | | |
- | od_control. | Color of the window title as displayed |
- | od_menu_title_col | by od_popup_menu() |
- | | |
- | od_control. | Color of the window border as |
- | od_menu_border_col | displayed by od_popup_menu() |
- | | |
- | od_control. | Color of the normal text displayed |
- | od_menu_text_col | by od_popup_menu() |
- | | |
- | od_control. | Color of the shortcut keys displayed |
- | od_menu_key_col | by od_popup_menu() |
- | | |
- | od_control. | Color of the selection bar as |
- | od_menu_highlight_ | displayed by od_popup_menu() |
- | col | |
- | | |
- | od_control. | Color of the shortcut keys displayed |
- | od_menu_highkey_col | on the selected line by od_popup_menu()|
- +---------------------+----------------------------------------+
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 216
- CONTROL STRUCTURE - TEXT CUSTOMIZATION
- -------------------------------------------------------------------------------
- In addition to the other aspects of OpenDoors which may be
- customized by use of the OpenDoors control structure, all of the
- text displayed by OpenDoors may also be customized. This may be
- done either to create doors with OpenDoors that use languages
- other than English, or to simply give your doors a "personal
- touch". The variables described in this section allow you to
- define what text you want to have displayed by OpenDoors at any
- time. All of these variables are pointers to strings, and are
- set to default values in the od_init() function. Thus, if you
- wish to change the string pointed to by any of these variables,
- you must do so after od_init() or some OpenDoors API function
- has been called. To set any of these variables, you can simply
- set them to point to a string-constant in your program. For
- example, to set the text displayed by OpenDoors prior to a DOS
- shell, you could:
- od_control.od_before_shell=(char *)"\n\rJust a moment...\n\r";
- The chart below lists each of the text customization variables
- (without the "od_control." prefix, for the sake of brevity),
- along with their default strings.
- Note that some of these strings MUST always be the same length
- as their default string. You may not display longer text within
- these strings, and if you wish to display shorter text, you must
- pad the remaining space in the string with spaces, in order to
- preserve its length. Those string which must be of fixed length
- also have their length listed in the chart below. Any strings
- which have an asterisk (*) in their length column may be any
- length.
- Also keep in mind that any string with "printf-style" formatting
- sequences, such as "%s", must retain the same sequences in the
- same order.
- In addition, four of these pointers - od_after_chat,
- od_after_shell, od_before_chat and od_before_shell - can be set
- to a value of NULL. In this case, OpenDoors will not display any
- string where this variable's string is normally displayed.
- +-----------------------+-----+----------------------------------------------+
- | VARIABLE NAME | LEN | DEFAULT VALUE |
- +-----------------------+-----+----------------------------------------------+
- | od_after_chat | * | "\n\rChat mode ended...\n\r\n\r" |
- | | | |
- | od_after_shell | * | "\n\r...Thanks for waiting\n\r\n\r" |
- | | | |
- | od_before_chat | * | "\n\rSysop breaking in for chat...\n\r\n\r" |
- | | | |
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 217
- | od_before_shell | * | "\n\rPlease wait a moment...\n\r" |
- | | | |
- | od_chat_reason | * | " Why would you " |
- | | | "like to chat?\n\r" |
- | | | |
- | od_continue | * | "Continue? [Y/n/=]" |
- | | | |
- | od_continue_no | char| 'N' |
- | | | |
- | od_continue_nonstop | char| '=' |
- | | | |
- | od_continue_yes | char| 'Y' |
- | | | |
- | od_day[0] | 3 | "Sun" |
- | | | |
- | od_day[1] | 3 | "Mon" |
- | | | |
- | od_day[2] | 3 | "Tue" |
- | | | |
- | od_day[3] | 3 | "Wed" |
- | | | |
- | od_day[4] | 3 | "Thu" |
- | | | |
- | od_day[5] | 3 | "Fri" |
- | | | |
- | od_day[6] | 3 | "Sat" |
- | | | |
- | od_hanging_up | * | "Terminating Call" |
- | | | |
- | od_help_text | 80 | " Alt: [C]hat [H]angup [L]ockout [J]Dos " |
- | | | "[K]eyboard-Off [D]rop to BBS " |
- | | | |
- | od_help_text2 | 79 | " OpenDoors 6.00 - (C)Copyright 1992, " |
- | | | "Brian Pirie - Registered Version " |
- | | | |
- | od_inactivity_timeout | * | "User sleeping at keyboard, inactivity " |
- | | | "timeout...\n\r\n\r" |
- | | | |
- | od_inactivity_warning | * | "Warning, only %d minute(s) remaining " |
- | | | "today...\n\r\n\r" |
- | | | |
- | od_month[0] | 3 | "Jan" |
- | | | |
- | od_month[1] | 3 | "Feb" |
- | | | |
- | od_month[2] | 3 | "Mar" |
- | | | |
- | od_month[3] | 3 | "Apr" |
- | | | |
- | od_month[4] | 3 | "May" |
- | | | |
- | od_month[5] | 3 | "Jun" |
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 218
- | | | |
- | od_month[6] | 3 | "Jul" |
- | | | |
- | od_month[7] | 3 | "Aug" |
- | | | |
- | od_month[8] | 3 | "Sep" |
- | | | |
- | od_month[9] | 3 | "Oct" |
- | | | |
- | od_month[10] | 3 | "Nov" |
- | | | |
- | od_month[11] | 3 | "Dec" |
- | | | |
- | od_no_keyboard | 10 | "[Keyboard]" |
- | | | |
- | od_no_sysop | * | "\n\rI'm afraid the sysop is not available " |
- | | | "at this time.\n\r" |
- | | | |
- | od_no_response | * | " No response.\n\r\n\r" |
- | | | |
- | od_no_time | * | "Sorry, you have used up your time for " |
- | | | "today...\n\r\n\r" |
- | | | |
- | od_offline | 10 | "[OFFLINE] " |
- | | | |
- | od_paging | * | "\n\rPaging Sysop for Chat" |
- | | | |
- | od_press_key | * | "Press [Enter] to continue..." |
- | | | |
- | od_sending_rip | * | "\xb4 Sending RIP File \xc3" |
- | | | |
- | od_status_line[0] | 80 | " " |
- | | | " [Node: " |
- | | | |
- | od_status_line[1] | * | "%s of %s at %u BPS" |
- | | | |
- | od_status_line[2] | 79 | "Security: Time: " |
- | | | " [F9]=Help " |
- | | | |
- | od_sysop_next | 5 | "[SN] " |
- | | | |
- | od_time_left | 10 | "%d mins " |
- | | | |
- | od_time_warning | * | "Warning, only %d minute(s) remaining tod" |
- | | | "ay...\n\r\n\r" |
- | | | |
- | od_want_chat | 11 | "[Want-Chat]" |
- +-----------------------+-----+----------------------------------------------+
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 219
- 66
- 66
- 66
- 66666
- 66 66
- 66 66
- 6666
- -------------------------------------------------------------------------------
- CHAPTER 6 - SPECIAL TOPICS
- ADDITIONAL INFORMATION ON THE WIN32 VERSION
- -------------------------------------------------------------------------------
- This section provides additional information on the Win32
- version of OpenDoors that isn't found elsewhere in this manual.
- If you are working with the Win32 version of OpenDoors, you
- should take the time to read this entire section. You should
- also read the sections in chapter 3 that describe how to compile
- and run Win32 programs that use OpenDoors.
- The Win32 version of OpenDoors has been designed to be as
- similar as possible to the DOS version of OpenDoors. This means
- that where possible, you can compile the same source code to
- produce both a DOS and a Windows program. However, if you are
- porting an existing DOS OpenDoors-based program to the Win32
- platform, there are some important things to keep in mind.
- The first thing to note is that under DOS, the program's
- execution begins in the main() function, whereas under Windows,
- it begins in the WinMain() function. To allow the same source
- file to build both DOS and Windows versions you can use
- conditional compilation. OpenDoor.h defines a constant of the
- form ODPLAT_xxx, indicating which version of OpenDoors is being
- used. Currently, this will be either ODPLAT_DOS, or
- ODPLAT_WIN32. However, if a OS/2 or Unix version of OpenDoors
- were created, they would use definitions such as ODPLAT_OS2, or
- ODPLAT_UNIX. Under the Win32 version, you should pass the
- nCmdShow parameter that is passed to WinMain into OpenDoors,
- through od_control.od_cmd_show. If you do not do this, the
- program will always start with the main window maximized,
- regardless of what the user has requested. Also, you will
- probably want to use the new od_parse_cmd_line() function in
- both DOS and Windows programs, to allow standard command-line
- options to be processed. The od_parse_cmd_line() function
- accepts command line information in the same format as it is
- passed to the main or WinMain() function. So, the general
- structure of an OpenDoors program that can be compiled under
- either DOS or Win32 now becomes:
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 220
- /* Add your own #includes here. */
- #include "opendoor.h"
- #ifdef ODPLAT_WIN32
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
- LPSTR lpszCmdLine, int nCmdShow)
- #else
- int main(int argc, char *argv[])
- #endif
- {
- /* Add local variables here. */
- #ifdef ODPLAT_WIN32
- od_control.od_cmd_show = nCmdShow;
- od_parse_cmd_line(lpszCmdLine);
- #else
- od_parse_cmd_line(argc, argv);
- #endif
- /* Add the rest of your program after this point. */
- }
- If you are porting existing OpenDoors programs over to the Win32
- version of OpenDoors, another issue that you will have to pay
- careful attention to is the fact that you are now working in the
- 32-bit world. While 32-bit programming under a flat memory model
- has many advantages (no more 64K segments and related
- limitations, for example), you must be aware that the size of
- basic data types that you are used to using may have changed.
- For example, an int is now 32-bits wide instead of 16-bits wide.
- One of the places where this difference becomes very important
- is if you are performing file-I/O by directly dumping a
- structure to or from disk using functions such as fread() and
- fwrite(). In this case, you must declare your structures using
- types that are of the same size between the 16-bit and 32-bit
- worlds, in order for your file formats to be compatible between
- the DOS and Win32 versions of your program. For example, the
- EX_VOTE.C example program declares its structure using fixed-
- sized types that are always available to any program including
- "opendoor.h". These types are the following size, regardless of
- what platform you are compiling under:
- INT8 - 8-bit signed integer.
- INT16 - 16-bit signed integer.
- INT32 - 32-bit signed integer.
- BYTE - 8-bit unsigned integer.
- WORD - 16-bit unsigned integer.
- DWORD - 32-bit unsigned integer.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 221
- (NOTE: Obviously, the many details of 32-bit programming and
- Windows programming are beyond the scope of this document. For
- more information on the issues discussed here, you will probably
- wish to consult other sources of information on Win32
- programming.)
- As you are probably aware, the Win32 edition of OpenDoors makes
- extensive use of multithreading. The number of threads will
- depend on what mode OpenDoors is operating in. In some
- situations, all of the following threads may exist:
- - The client thread(s), which executes the code that you write
- in your program, along with the OpenDoors API functions.
- - The local screen thread, which is responsible for drawing
- your program's output on the screen, and receiving input from
- the local keyboard.
- - The frame window thread, which handles the OpenDoors menus,
- toolbar, status bar and sysop function keys.
- - The remote input thread, which receives input from the serial
- port and adds it to OpenDoors common local/remote input
- queue.
- - The carrier detection thread, which blocks and only executes
- if the carrier detect signal goes low.
- - The time update thread, which updates the user's time
- remaining online, and monitors user timeouts.
- Since most of these threads only execute when the operating
- system determines that there is actually something for them to
- do, the Win32 version of OpenDoors provides very high
- performance and responsiveness.
- You may also want to make use of multithreading directly within
- your program. If you do this, please note that while you may use
- threads to perform background processing, OpenDoors requires
- that you only call OpenDoors API functions from one thread.
- If you wish to customize the information that is displayed in
- the Help|About dialog box (including your program's name and
- copyright information), provide your own application icon, or
- add online help to the help menu, refer to the sections in the
- manual on the following od_control variables:
- od_control.od_app_icon
- od_control.od_help_callback
- od_control.od_prog_name
- od_control.od_prog_version
- od_control.od_prog_copyright
- The section that describes how to run Windows based door
- programs under DOS-based BBS package indicates that
- COM<n>AutoAssign=0 should be set in the system.ini file. The
- explanation for this is as follows: The default value for this
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 222
- setting in Windows 95 is -1, which prevents any Windows-based
- program from accessing a serial port which has previously been
- used by a non-Windows-based program, until the window that
- program was running in is closed. By setting this value to 0,
- you are allowing the Windows-based door program to immediately
- use the modem, even while the MS-DOS session (VM) is still
- active. A value of <x> greater than 0 will allow Windows-based
- programs to access the serial port, only if the DOS-based
- program has not accessed the serial port for at least <x>
- seconds. For example, the default setting in Windows 3.1 was
- COM1AutoAssign=2, which allowed Windows-based programs to access
- the serial port if no DOS program had used it for at least 2
- seconds.
- The section that describes how to run Windows based door
- programs under DOS-based BBS package also indicates that the
- DTRON utility should be run after the start command returns. The
- reason for this is that when a Windows program exits and closes
- the serial port (by calling the CloseHandle() function), Windows
- 95 lowers the DTR line on the serial port. Most modems are
- configured to respond to this by hanging up on the remote user.
- From talking to other people, it seems that this "feature" (or
- fundamental design flaw, depending on how you want to look at
- it) is unique to Windows 95, and won't effect OpenDoors when
- running under Windows NT. However, the majority of people will
- undoubtedly be using the Win32 version of OpenDoors under
- Windows 95. This is unfortunate, since the Win32 communications
- facilities are otherwise _very_ well designed. There is a rumor
- that Microsoft's next upgrade to Windows 95 will fix this
- problem. However, I must stress that this is only a rumor, and
- that I haven't received any confirmation about this from
- Microsoft.
- OpenDoors currently provides two solutions to this problem.
- First of all, OpenDoors has the ability to use an already open
- serial port handle, if that information is supplied to it.
- Hopefully, all Windows 95-based BBS software will provide the
- option of running a door program with the serial port still
- open, and allow you to pass that serial port handle on the door
- program's command line. OpenDoors allows the serial port handle
- to be passed on the command line, or set directly in the
- od_control structure, as is described later in this manual. On
- BBS systems where this form of hot sharing of the serial port is
- supported, the serial port can remain open at all times, and so
- the CloseHandle() problem is avoided.
- This means that the only situation where the CloseHandle()
- problem still has to be dealt with is when OpenDoors is running
- on a Windows 95 system and OpenDoors has to open the serial port
- itself (and so must close the serial port before exiting). This
- would be the case for most MS-DOS based BBS systems running
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 223
- under Windows 95, unless some intermediate layer is provided. By
- default, in this situation OpenDoors will disable DTR response
- by the modem just before it closes the serial port, by sending
- the AT&D0 command to the modem. The exact sequence of commands
- used by OpenDoors to do this is specified by the
- od_control.od_disable_dtr string. This DTR response disabling
- may be turned off by setting the DIS_DTR_DISABLE
- od_control.od_disable flag. Since many programs (OpenDoors
- included) assume that they can hangup the modem by lowering the
- DTR signal, a small utility will usually be run after the door,
- which first raises the DTR signal again, and then re-enables DTR
- response by the modem. Such a utility is included in this
- package, named DTRON.EXE. I wrote the DTRON utility so that you
- can freely redistributed it with your programs.
- So, to summarize, the DTR disabling by OpenDoors and subsequent
- reenabling by DTRON is only required for the Win32 version of
- OpenDoors running under Windows 95 when the modem is configured
- to hangup if the DTR signal is lowered, and the BBS software
- does not have the ability to pass a live serial port handle to a
- door program. Setting COM<n>AutoAssign in system.ini is only
- required for the Win32 version of OpenDoors when it is being
- called from an MS-DOS session that has previously accessed the
- serial port.
- Note that the Win32 version of OpenDoors requires Windows 95 or
- Windows NT. It will not run under Windows 3.x, even with Win32s.
- This is because OpenDoors makes use of the Windows 95/NT
- multitasking and multithreading services that are not available
- under Win32s.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 224
- CONFIGURATION FILE SYSTEM
- -------------------------------------------------------------------------------
- One of the most useful OpenDoors features that you can
- optionally choose to include in your programs is the OpenDoors
- configuration file system. All that is required to enable the
- configuration file system is to include the following line
- before your first call to any OpenDoors function:
- od_control.od_config_file = INCLUDE_CONFIG_FILE;
- OpenDoors will now search for and read an OpenDoors
- configuration file. If you do not specify the name of this file,
- the default name of DOOR.CFG will be used. Using this
- configuration file, the sysop can set a wide variety of options,
- such as modem and system configuration information, maximum time
- limits for the door, and even define custom door information
- (drop) file formats. The example DOOR.CFG file included in your
- OpenDoors package shows the format and all options that are
- automatically supported by the configuration file system. This
- configuration file format is designed to be easy to use, and the
- example configuration file contains comments which provide a
- complete description of each option. Feel free to redistribute
- DOOR.CFG or a modified version of this file with your door
- programs. In addition to the many configuration file settings
- already supported, you can add your own settings that are
- specific to your particular program.
- To specify your own filename for the configuration file, use the
- od_config_filename control structure variable. For example, the
- following line:
- od_control.od_config_filename = "MYDOOR.CFG"
- causes OpenDoors to look for the configuration file MYDOOR.CFG
- instead of the default DOOR.CFG.
- OpenDoors fill first search for the configuration file in the
- directory specified in the od_config_filename variable, if a
- specific directory name was supplied. If not found, it will then
- search the current directory. If the configuration file system
- is unable to locate a configuration file, or if any settings are
- omitted from the file, the default values for these settings
- will be used automatically. This means that the configuration
- file is always optional, unless your program has custom settings
- that it requires in order to run.
- The format for the configuration file is as follows. Blank lines
- and any text following the semi-colon (;) character are ignored.
- Configuration options are specified using a keyword, possibly
- followed by one or more options. The keywords are not case
- sensitive, but some of the options are. The order of options in
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 225
- the configuration file is not significant, with the exception of
- the "CustomFileLine" option. For more information on the
- "CustomFileLine" setting, see the section that begins on page
- 230. The built-in configuration options are as follow:
- BBSDir - BBS System directory. Indicates where the door
- information file (drop file) can be found.
- DoorDir - The door's working directory. This is where the door's
- system files are located. OpenDoors will automatically
- perform a chdir into this directory at initialization, and
- will return to the original directory on exit.
- LogFileName - Specifies the filename (path optional) where the
- door should record log information.
- DisableLogging - Prevents door from writing to a log file.
- Node - BBS node number that the door is running on. Only used if
- OpenDoors is unable to determine the node number by some
- other means.
- ???dayPagingHours - Specifies sysop paging hours. Sysop paging
- will be permitted beginning at the start time, up until,
- but not including, the end time. Times should be in the 24-
- hour format. To disable paging on a particular day, set the
- paging start and end times to the same time. ???day can be
- one of Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
- or Saturday.
- PageDuration - Duration of sysop page. Value indicates the
- number of beeps that compose the sysop page alarm.
- MaximumDoorTime - Maximum length of time a user is permitted to
- access the door. If the user's total remaining time on the
- BBS is less than this value, the user will only be
- permitted to access the door for this shorter length of
- time. This option is disabled by commenting out the line.
- InactivityTimeout - Specifies the maximum number of seconds that
- may elapse without the user pressing a key, before the user
- will automatically be disconnected. A value of 0 disables
- inactivity timeouts.
- SysopName - Name of the sysop. OpenDoors can usually determine
- the sysop's name from the door information (drop) file.
- How3ever, some BBS packages do not supply this information.
- In such cases, if the sysop's name is required by the door,
- it may be supplied here.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 226
- SystemName - Like the sysop's name, this option can usually be
- determined from the door information file. If it is not
- available, the sysop my supply the information here.
- ChatUserColor - Specifies the color of text typed by the user in
- sysop chat mode. The format of the color name is included
- in the description of the od_color_config() function.
- ChatSysopColor - Specifies the color of test typed by the sysop
- in chat mode.
- FileListTitleColor - Files.BBS listing colors.
- FileListNameColor
- FileListSizeColor
- FileListDescriptionColor
- FileListOfflineColor
- SwappingDir - Directory where disk swapping will be done.
- SwappingNoEMS - Disables swapping to EMS memory.
- SwappingDisable - Disables swapping entirely.
- LockedBPS - BPS rate at which door should communicate with the
- modem. Valid rates are 300, 600, 1200, 2400, 4800, 9600,
- 19200 and 38400. A value of 0 forces the door to always
- operate in local mode. This option is not normally needed,
- as the information is usually available from the door
- information file.
- FossilPort - Specifies the FOSSIL driver port number that the
- modem is connected to. FOSSIL port 0 usually corresponds to
- COM1, port 1 to COM2, and so on. This option is not
- normally needed, as the information is usually available
- from the door information file.
- CustomFileName - Specifies the filename used by the custom door
- information file format. Described in more detail below.
- CustomFileLine - Specifies the contents of a particular line in
- the custom door information file format.
- The last two configuration file options, "CustomFileName" and
- "CustomFileLine" allow you or the system operator using your
- program to define your own door information (drop) file formats.
- For more information on this topic, see the section which begins
- on page 230.
- You can also extend OpenDoor's configuration file format to add
- your own options, by supplying a callback function that will be
- called whenever OpenDoors encounters an unrecognized
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 227
- configuration file keyword. The prototype of this function
- should be as follows:
- custom_line_function(char *keyword, char *options)
- To cause OpenDoors to use your function, you would include the
- following line before your first call to any OpenDoors function:
- od_control.od_config_function = custom_line_function;
- (You can use a different function name if you wish.) When
- OpenDoors encounters unrecognized keyword, it will now call your
- function, passing a pointer to an upper case version the keyword
- string in the first parameter, and a pointer to any options that
- follow the keyword in the second parameter. For instance, if the
- following line were encountered in the configuration file:
- RegisteredTo John Smith ; Sysop's name
- The parameters passed to your function would be:
- char *keyword = "REGISTEREDTO"
- char *options = "John Smith"
- Your custom line function should be written in such a way that
- if OpenDoors passes a configuration option to your function that
- your function does not recognize, that option would simply be
- ignored.
- The example program below demonstrates how to use the custom
- line function to add your own configuration file options. This
- program looks for three custom configuration file options,
- "RegistrationKey", "DefaultColor" and "DisplayWinners". If the
- "RegistrationKey" option is present, the numerical value
- following this option is stored in the global variable "key". If
- the "DefaultColor" option is present, the color description
- (such as "Bright Red on Black") is translated to an
- od_set_attr() color code using od_color_config(). This color
- setting is stored in the global variable default_color. Since
- this variable is initialized to 0x07 (the value for dark white
- on black), if this option is omitted, that color is used by
- default. If the "DisplayWinners" option is included in the
- configuration file, the global variable display_winners is set
- to TRUE, regardless of any options that may follow this keyword.
- #include "opendoor.h" /* Include opendooor.h */
- /* Prototype for custom line function */
- void custom_line_function(char *keyword, char *options);
- unsigned long key=0L; /* Variables for our own config option */
- unsigned char default_color=0x07;
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 228
- char display_winners=FALSE;
- main() /* Program's execution begins here */
- { /* Begin door operations, reading config file */
- od_control.od_config_file = INCLUDE_CONFIG_FILE;
- /* Tell OpenDoors to use custom line function */
- od_control.od_config_function = custom_line_function;
- od_init();
- /* Main program's operations go here */
- od_exit(10, FALSE); /* Exit program */
- }
- /* Code for custom line function */
- void custom_line_function(char *keyword, char *options)
- { /* If option is registration key */
- if(stricmp(keyword,"REGISTRATIONKEY")==0)
- {
- key=atol(options); /* Store key in variable */
- } /* If option is text color */
- else if(stricmp(keyword,"DEFAULTCOLOR")==0)
- { /* Get color value using od_color_config() */
- default_color=od_color_config(options);
- } /* Example of option enabled by just the keyword */
- else if(stricmp(keyword,"DISPLAYWINNERS")==0)
- { /* If keyword is present, turn on option */
- display_winners=TRUE;
- }
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 229
- DEFINING CUSTOM DOOR INFORMATION FILE FORMATS
- -------------------------------------------------------------------------------
- As is mentioned in the previous section, the OpenDoors
- configuration file system provides two settings which allow the
- sysop to define a custom door information file format. This
- permits OpenDoors doors to operate directly on any BBS system
- that produces a door information file format not directly
- supported by OpenDoors. A custom door information file format is
- defined using the "CustomFileName" option, followed by one or
- more lines beginning with the "CustomFileLine" option.
- The "CustomFileName" option specifies the filename used to
- distinguish this file format from other file formats. This
- filename should not include a path. To specify the path where
- the door information file is located, the sysop should use the
- BBSDir configuration file setting. If the filename of the custom
- format is the same as that of one of the built-in formats, the
- custom format will override the built-in format.
- The actual format of the custom file is specified using a number
- of lines that begin with the keyword "CustomFileLine". Each of
- these lines will correspond to a single line in the door
- information file, with the option following the "CustomFileLine"
- keyword specifying the information that can be found on that
- line. This can be one of the following keywords:
- Ignore - Causes the next line in the door information file
- to be ignored. Use on lines for which none of the
- options below apply.
- COMPORT - COM? port the modem is connected to (0 indicates
- local mode)
- FOSSILPORT - Fossil port number the modem is connected to
- MODEMBPS - BPS rate at which to communicate with modem (0
- or non-numerical value indicates local mode)
- LOCALMODE - 1, T or Y if door is operating in local mode
- USERNAME - Full name of the user
- USERFIRSTNAME - First name(s) of the user
- USERLASTNAME - Last name of the user
- ALIAS - The user's pseudonym / handle
- HOURSLEFT - Hours user has left online
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 230
- MINUTESLEFT - Minutes user has left online, or time left
- online in format hh:mm
- SECONDSLEFT - Seconds user has left online, or time left
- online in format hh:mm:ss or format mm:ss (If more
- than one of the above time options are used, the user
- time left is taken to be the total of all of these
- values.)
- ANSI - 1, T, Y or G for ANSI graphics mode
- AVATAR - 1, T or Y for AVATAR graphics mode
- PAGEPAUSING - 1, T or Y if user wishes a pause at end of
- screen
- SCREENLENGTH - Number of lines on user's screen
- SCREENCLEARING - 1, T or Y if screen clearing mode is on
- SECURITY - The user's security level / access level
- CITY - City the user is calling from
- NODE - Node number user is connected to
- SYSOPNAME - Full name of the sysop
- SYSOPFIRSTNAME - The sysop's first name(s)
- SYSOPLASTNAME - The sysop's last name
- SYSTEMNAME - Name of the BBS
- As an example of how to define custom door information file
- formats, consider the following imaginary file format, which we
- will name DROPINFO.TXT:
- Brian Pirie <-- User name
- 0 <-- Local mode
- COM1: <-- Serial port to use
- 9600 <-- BPS rate
- 22:30:15 05-08-95 <-- File creation time
- 35 <-- Time remaining (in minutes)
- 1 <-- ANSI mode
- Ottawa, Canada <-- Location
- This format would be defined in an OpenDoors configuration file
- as follows:
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 231
- CustomFileName DROPINFO.TXT
- CustomFileLine USERNAME
- CustomFileLine LOCALMODE
- CustomFileLine COMPORT
- CustomFileLine MODEMBPS
- CustomFileLine IGNORE
- CustomFileLine MINUTESLEFT
- CustomFileLine ANSI
- CustomFileLine CITY
- Notice that the first "CustomFileLine" keyword in the
- configuration file corresponds to the first line in our
- DROPINFO.TXT file, the second "CustomFileLine" to the second
- line, and so on. Also notice that the keyword "IGNORE" is used
- for the line that contains the file creation time, since there
- is no CustomFileLine keyword that allows you to read this
- information.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 232
- MULTIPLE PERSONALITY SYSTEM
- -------------------------------------------------------------------------------
- The OpenDoors Multiple Personality System allows the DOS
- version of OpenDoors to support multiple sysop function key /
- status line "personalities". Most commonly, you will use this
- feature in conjunction with the "Personality" setting in the
- OpenDoors configuration file, to allow the sysop to choose one
- of the built-in personalities that most closely mimics the BBS
- software they are using. OpenDoors includes the following
- personalities:
- Configuration Keyword Manifest constant
- -----------------------------------------------------------
- Standard PER_OPENDOORS
- PCBoard PER_PCBOARD
- RemoteAccess PER_RA
- Wildcat PER_WILDCAT
- The PCBoard, RemoteAccess and Wildcat personalities mimic the
- status lines and function keys used by the BBS packages with
- those names. The Standard personality, which is the personality
- used by default, is a trimmed down version of the status lines
- provided by OpenDoors 4.10 and earlier.
- In addition to using the personalities supplied with OpenDoors,
- you can create your own personalities. This simply involves
- writing a function which OpenDoors will call to setup the sysop
- function keys and to display the status line.
- Include the following line before your first call to any
- OpenDoors function:
- od_control.od_mps = INCLUDE_MPS;
- to include the multiple personality system in your program. This
- also enables the Personality setting in the configuration file,
- if you are using the configuration file system.
- You can set the default personality to be used by OpenDoors by
- setting od_control.od_default_personality to one of the manifest
- constants listed in the table above. If you have included the
- multiple personality system in your program, this setting will
- determine the personality to use if the "Personality" option is
- not set in the configuration file, and your program does not
- later change the personality using the od_set_personality()
- function. If you do not include the multiple personality system
- in your program, this setting will determine the personality
- that will always be used.
- Creating your own personality involves writing a single
- function.. Whenever OpenDoors needs to perform an operation that
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 233
- involves the personality, it will call this function, passing
- one of the following message values:
- PEROP_INITIALIZE Initialize the personality, installing any
- custom function keys.
- PEROP_DEINITIALIZE Deinitialize the personality, returning any
- changed settings to their original values.
- PEROP_CUSTOMKEY Indicates that a custom function key has
- been pressed.
- PEROP_DISPLAYx Where x is a number from 1 to 10. Indicates
- that the specified status line should be
- drawn from scratch.
- PEROP_UPDATEx Where x is a number from 1 to 10. Indicates
- that the specified status line should be
- updated to reflect any changes.
- If you have enabled the multiple personality system by setting
- od_control.od_mps to INCLUDE_MPS, you can install your
- personality function into OpenDoors by calling
- od_add_personality(). When you call od_add_personality(), you
- supply a string containing the name of the personality, along
- with the top and bottom output line numbers to use. These line
- numbers specify the portion of the screen to use for door
- output, leaving the remainder of the screen available for
- displaying the personality's status line. Once the personality
- has been installed into OpenDoors, it can be selected by the
- sysop using the "Personality" configuration file option, or
- manually activated using the od_set_personality() function. For
- more information on the od_add_personality() function, see page
- 47.
- You can make your personality function the default personality
- by setting od_control.od_default_personality to point to your
- personality function. As is the case with the built-in
- personalities, this setting will be used as the default
- personality if you have enabled the multiple personality system
- by setting od_control.od_mps to INCLUDE_MPS. If you have not
- enabled the multiple personality system in this manner, your
- personality function will become the one and only personality
- used within your program. When creating your own personality,
- you can use the od_control.od_page_statusline variable to set
- which status line (if any) will be activated when the user pages
- the system operator.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 234
- LOG FILE SYSTEM
- -------------------------------------------------------------------------------
- In order for the system operator to monitor system activity and
- diagnose problems that have occurred while the system was
- unattended, it is common for BBS software and door programs to
- record major events in a log file. This log file typically
- records the date and time of evens such as a user logging on or
- off, transferring files, sending messages, paging the system
- operator, and similar activities. Sometimes the system operator
- will configure all of the pieces of software running on a
- particular node to write to a single log file. In other cases,
- the system operator will prefer to have each program write to
- its own log file. However, software serving one line of a multi-
- node BBS system should never attempt to write to the same log
- file that is used by another node.
- OpenDoors uses the "FrontDoor format" log file standard. This
- was chosen as it is a clearly documented format that is quickly
- becoming the standard for bulletin board software log files. A
- segment from a log file produced by OpenDoors is listed below.
- ---------- Thu 25 Feb 93, Vote 6.00
- > 19:42:23 Brian Pirie entering door
- > 19:50:55 User paging system operator
- > 19:51:02 Entering sysop chat mode
- > 20:05:41 Terminating sysop chat mode
- > 20:18:32 User time expired, exiting door
- To enable the OpenDoors log file system, simply include the
- following line before your first call to any OpenDoors function:
- od_control.od_logfile = INCLUDE_LOGFILE;
- When OpenDoors is initialized, it will open the log file and
- begin logging activities, unless logging has been disabled with
- the od_control.od_logfile_disable variable. The log file name
- will be taken from the od_control.od_logfile_name variable,
- which is usually set by the configuration file. If no logfile
- name has been set, OpenDoors will use the logfile named
- DOOR.LOG. Upon opening the log file, OpenDoors will write an
- entry indicating the time at which the use entered the door.
- The od_control.od_prog_name variable sets the program name that
- is written to the log file immediately after the current date
- information. If this variable is not set, OpenDoors will write
- its own name and version information in this place.
- When the OpenDoors log file system is enabled, OpenDoors will
- automatically produce logfile entries for the following events:
- - User paging sysop, beginning of chat, end of chat
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 235
- - Sysop entering or returning from DOS shell
- - User inactivity timeout or user time expired
- - Sysop dropping user back to BBS
- - Sysop hanging up on user, sysop locking out user
- - User hanging up on BBS
- - Your program calling the od_exit() function
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 236
- MAKING DOORS MULTI-NODE-AWARE
- -------------------------------------------------------------------------------
- While the majority of BBS systems have only a single phone line,
- allowing only one user to access the system at a time, there are
- also many multi-node BBS systems. On such systems, it is quite
- possible that more than one user may be using your door program
- simultaneously. OpenDoors itself is designed for both single-
- node and multi-node operation. However, if you want your program
- to operate correctly on multi-node systems, there are a number
- of concurrency issues that you must keep in mind when writing
- your own code.
- Some door programs are designed to behave on multi-node systems
- just as they would on single-line BBSes. Others add special
- features only possible in multi-node environments. For instance,
- you may want to permit users to interact or chat with one
- another in "real time". Many simple doors may not require any
- special attention to multi-node capabilities. However, if your
- door must access any data files or other resources that are to
- be shared among nodes, it is necessary to carefully coordinate
- access to these resources.
- There are two primary issues that are often of concern when
- creating door programs for multi-node systems. The first issue
- discussed below is how to coordinate concurrent file access
- between multiple node. The second topic we will deal with is the
- installation of door programs on multi-node systems.
- CONCURRENT FILE ACCESS
- -------------------------------------------------------------------------------
- One of the most important issues that arises when writing door
- programs for multi-node systems is how to coordinate
- simultaneous access to a single data file by multiple instances
- of your program. While it is generally safe to have multiple
- nodes reading simultaneously from a single file, having multiple
- nodes updating a file without any coordination can lead to lost
- updates and other problems. Consider, for example, the EX_VOTE.C
- example program that is included in your OpenDoors package. When
- the user votes on a poll, EX_VOTE.C must update the total number
- of votes for the user's answer. Such a program that is only
- intended for single node operation could do this by simply
- reading the current number of votes for the appropriate option,
- adding one to this total, and writing the updated total back to
- the file. However, if this approach where to be used on a multi-
- node system, it is quite possible that two users would vote on
- the same poll after both nodes have read the poll record into
- memory. In this situation, one node would add one to the total
- number of votes for the poll record that it has in memory, and
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 237
- write the updated information to the file. The second node would
- then add one to its total, without reading the updated
- information written by the first node. When the second node then
- writes this information to the file, it overwrites the first
- node's total with its own. The final effect is that the second
- user's vote overwrites the first, and so the first user's vote
- is lost.
- The solution to this problem is to lock a file unit for the
- entire update operation, to prevent other nodes from accessing
- the unit at the same time. This unit could be the entire file,
- or only a single record in the file. EX_VOTE.C locks its entire
- file when performing an update operation, but in other cases it
- may be more appropriate to only lock a single record in the
- file. The important thing to understand is that when one node
- locks a file unit, other nodes much wait until the first node is
- finished the update operation. This means that if one node is
- updating information that other nodes could possibly need access
- to, it should always perform the lock, read, write and unlock
- cycle as quickly as possible.
- Let's look again at the approach taken by EX_VOTE.C. After the
- user has indicated which option he/she wishes to vote on, Vote
- attempts to open the file for exclusive access. By doing this,
- EX_VOTE.C in effect locks the entire file for the duration that
- it has the file open. If another node attempts to open the file
- while one node has it locked, the open operation will fail, and
- the C runtime library will set the errno variable to EACCES.
- This, in effect, tells you that another node is currently
- working on the file, and that you must wait your turn. In this
- case, EX_VOTE.C continues to retry the open operation until the
- other node is finished its update, at which time the open
- operation will succeed. This approach will even work when there
- are many nodes that are attempting to update the file at the
- same time. Whichever node first attempts to open the file will
- gain exclusive access to the file, and any additional nodes are
- forced to wait for access to the file. When one node finishes
- with the file, another node will gain access to the file
- (whichever happens to be the next node to re-attempt the open
- operation). This process continues until all waiting nodes have
- had a chance to perform their update. EX_VOTE.C will repeatedly
- try to open the file for up to 20 seconds, after which time it
- will give up, reporting an error which indicate that it is
- unable to access the file. During this waiting process,
- EX_VOTE.C repeatedly calls od_kernel(), so that sysop function
- keys, carrier detection and other essential door operations can
- continue to be performed.
- After EX_VOTE.C has successfully secured exclusive access to the
- file, it first reads the record that it is going to update. It
- is important that this be done after the file unit is locked, in
- order to ensure that the copy of the record in memory matches
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 238
- what is stored in the file. EX_VOTE.C then updates the record
- based on the question on which the user has voted, writes this
- information back to the file. EX_VOTE.C then immediately closes
- the file, allowing other nodes to also access the file.
- EX_VOTE.C is very carefully designed so that the file update
- operation can never be interrupted (for instance, no OpenDoors
- functions are called, which could detect a time-out and
- terminate the program while a file update operation is in
- progress), or delayed until the user makes a response. As such,
- the file unit is always unlocked (in this case, closed) within a
- fraction of a second after it was locked, or order that other
- nodes will never have to wait long for access to the file.
- Here I have presented a detailed account of how EX_VOTE.C
- handles multi-node file access. While all of the details
- involved in coordinating multiple file access can be
- overwhelming at first, they will begin to come naturally to you,
- as you begin to always think in terms of multi-node scenarios.
- To summarize, the important elements that are typically involved
- in multi-node file access are:
- A. Decide on an appropriate file unit to lock for your
- application. In simple cases, this can be the entire file.
- In other cases, you may wish to lock individual file
- records, using the appropriate runtime library functions.
- B. Always perform update operations in lock, read, update,
- write, unlock cycles on individual file units. If there is a
- chance that other nodes will also need to access the file
- unit, ensure that the update operation cannot be interrupted
- or delayed until a user makes a response.
- After you have designed your program for concurrent file access,
- how can you test it? If you don't have a multi-node BBS system
- that you have access to, you can perform most of your testing
- under a multitasking environment, with multiple copies of your
- program running in different windows.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 239
- MULTI-NODE CONFIGURATION
- -------------------------------------------------------------------------------
- A second issue that you may want to bear in mind is how door
- programs are typically setup on multi-node systems.
- Unfortunately, this may differ considerable depending upon which
- BBS software is being used. However, some of the issues that you
- may have to consider discussed below:
- A. Your program must be able to locate the correct door
- information file for the appropriate node. Most BBS systems
- make separate door information files available to each node
- by one of the following means:
- - By naming each node's door information file
- uniquely. (e.g. DORINFO1.DEF, DORINFO2.DEF.)
- - By having a separate directory for each node's door
- information file. (e.g. \NODE1\DOOR.SYS,
- \NODE2\DOOR.SYS, etc.)
- In the first case, OpenDoors can automatically select the
- correct door information file, assuming that it knows which
- node it is running on (see item C, below). In the later
- case, you must tell OpenDoors which directory it must look
- in to find the appropriate door information file. You may do
- this by any of the following means:
- - By specifying the location of the file on the
- command line, if od_parse_cmd_line() is used.
- - By providing a configuration file keyword to set
- the door information file location for each node.
- - By providing a different configuration file for
- each node (See item B, below).
- B. If you are using the OpenDoors configuration file system,
- node-specific options should not be used if each node is
- accessing the same configuration file. While it is possible
- to have a different configuration file for each node (the
- filename can be specified on the command line if
- od_parse_cmd_line() is used), in most cases the same
- configuration file will be used for all nodes. In this case,
- the node number, serial port information, and possible door
- information file location operations should not be used. If
- you are basing your configuration file on the example
- DOOR.CFG file that is included in the OpenDoors package, you
- may want to remove these options from the file.
- C. In many cases, your program must also be able to determine
- which node it is running under. If this information is
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 240
- available in the door information file, or is stored in a
- TASK environment variable, OpenDoors will automatically set
- the appropriate node number in od_control.od_node.
- Otherwise, if your program requires this information, it
- should be specified on the program's command line. The
- od_parse_cmd_line() function supports this option. Reasons
- that your program might need to know the current node number
- include:
- - In order for OpenDoors to display this information
- correctly on the status line.
- - In order to determine which configuration file to
- read or which node directory in which to look for
- the door information file.
- - In order for OpenDoors to know which door
- information file to read (e.g. DORINFO1.DEF,
- DORINFO2.DEF. etc.)
- - In order to provide any form of real-time
- interaction between nodes, such as inter-node chat.
- D. If your program is running under MS-DOS, and multi-node file
- access is being coordinated by locking part or all of a
- file, the SHARE.EXE utility must be installed.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 241
- 7777777
- 77
- 77
- 77
- 77
- 77
- 77
- -------------------------------------------------------------------------------
- CHAPTER 7 - TROUBLESHOOTING AND GETTING ASSISTANCE WITH OPENDOORS
- ABOUT THIS CHAPTER
- -------------------------------------------------------------------------------
- This chapter is perhaps the most important section of this
- entire manual. Here, we provide detailed instructions to help
- you in tracing the source of problems in programs written with
- OpenDoors. Included in this chapter is a step-by-step OpenDoors
- troubleshooting guide and a chart listing common problems and
- their solutions. Also included in this chapter is information on
- the many means available to you for getting more help with
- OpenDoors, including the OpenDoors support BBS, the OpenDoors
- EchoMail conference, and how to get in touch with me. It is
- strongly encouraged that you take the time to read through this
- chapter.
- TROUBLESHOOTING PROBLEMS
- -------------------------------------------------------------------------------
- If you are experiencing difficulty with a program that you are
- writing using OpenDoors, it is suggested that you follow the
- steps listed below in order to quickly solve your problem. Also,
- be sure to check to "solutions to common problems" section of
- this manual. There are many common difficulties which people
- have with OpenDoors, that can easily be fixed using the
- instructions in the "common solutions" section. Also, if you are
- having difficulty solving a problem yourself, do not hesitate to
- get in touch with me, as I am always happy to help with any
- problems. In addition, you may find the other means of OpenDoors
- support (described latter in this chapter), invaluable in
- solving difficulties with OpenDoors.
- Keep in mind that most programs you write will have some "bugs"
- to begin with, and you should expect to spend at least 50% of
- any programming project tracing down and solving errors and
- bugs. While it would be nice if every program written worked
- correctly the first time, it is a fact of life that debugging is
- and always has been an important part of the software life-
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 242
- cycle. In fact, what most often separates the good programs from
- the bad is the amount of time their programmer's spend debugging
- and improving them. Unfortunately, it is difficult, if not
- impossible, to come up with a "magic formula" for debugging
- software. Debugging software is really more of an art than a
- science. However, there are some basic guidelines, which if
- followed, can greatly ease the task of software debugging.
- As with all problem solving, the secret to software debugging
- lies in obtaining as much information about the problem as
- possible. While it is sometimes possible to solve a bug by
- making intuitive changes in your program, or in re-writing a
- piece of code to solve the problem by a different means,
- debugging most often requires more of a "planned attack". This
- planned attack generally involves little more than learning as
- much about what is going wrong as possible. The first step in
- solving a bug usually lies in locating the source of the
- problem. Once you have located the problem, solving it is often
- a relatively simple procedure. In locating the source of your
- bug, the use of a software debugger, such as the one built into
- the Turbo C(++) / Borland C++ integrated development
- environment, can be invaluable.
- When debugging programs written with OpenDoors, you should also
- follow the steps listed below, in order to obtain more
- information related to the problem you are trying to solve:
- 1.) Re-read the section(s) of this manual, your Turbo C(++) /
- Borland C++ manuals and your program's source code, which
- apply to the problem you are experiencing.
- 2.) Check the solutions to common problems section below. The
- most common problems with OpenDoors can be solved using
- this simple chart.
- 3.) Check the value in the od_errno variable, which will often
- provide vital clues as to the source of the problem. Use of
- the od_errno variable is described in the section below.
- 4.) If you are still stuck, please feel more than free to get
- in touch with me! (see the end of this chapter for
- information on reaching me) I am always more than happy to
- help with any OpenDoors or general programming problems!
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 243
- SOLUTIONS TO COMMON PROBLEMS
- -------------------------------------------------------------------------------
- Below, several common difficulties with OpenDoors are listed,
- along with suggested solutions to these problems. If you are
- experiencing any difficulty with a program that you have written
- with OpenDoors, we would suggest that you read this section
- thoroughly. Here, the common problem is listed in the left
- margin, and the solutions listed on the right portion of the
- page.
- -------------------------------------------------------------------------------
- PROGRAM 1.) Check that the compiler is able to locate the OpenDoors
- WON'T header file, "OPENDOOR.H". This can be accomplished either by
- COMPILE placing this header file in the same directory as your other
- header files (such as STDIO.H, etc.), or by placing the header
- file in the current directory.
- 2.) Be sure that you are linking your program with the correct
- library for the memory model you are using. (See the section on
- compiling with OpenDoors). Also be sure that both the source
- code file for your program (such as EX_VOTE.C) and the library
- file are listed in your project file, and that the project file
- is loaded. For more information on compiling programs written
- with OpenDoors, see page 22.
- 3.) If you have tried the above solutions, and your program
- still won't compile, then the problem is most likely an error in
- your source code file. If you are unable to resolve your
- problem, feel free to get in touch with me.
- -------------------------------------------------------------------------------
- SCREEN If you are using the od_clr_scr() function to clear the screen,
- WILL NOT but are not getting any results, this is likely because the user
- CLEAR online has screen clearing turned off. If you wish to force
- screen clearing regardless of the user's screen clearing
- settings (this is probably not a good idea), use the function
- call od_disp_emu("\xc", TRUE);
- -------------------------------------------------------------------------------
- FIXUP This problem was probably caused by a mismatch between your
- OVERFLOW memory model selection in your compiler, and the memory model
- ERROR library you are using. See the section on compiling programs
- with OpenDoors for more information on the correct library you
- should be using for your memory model selection.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 244
- OPENDOORS SUPPORT
- -------------------------------------------------------------------------------
- The powerful and easy to use door toolkit and this comprehensive
- manual are only two portions of how OpenDoors helps you to write
- BBS door and similar programs. The third element of OpenDoors is
- the extensive OpenDoors support mechanisms. The OpenDoors email
- conference and support BBS each give you a chance to share ideas
- and source code with other OpenDoors programmers. A lot of
- information concerning OpenDoors, along with the newest version
- and online registration, is available through the OpenDoors
- World Wide Web site. In addition to these sources, I am also
- more than happy to answer any of your questions, or hear any
- suggestions for future versions of OpenDoors. The remainder of
- this chapter provides more information on the various sources of
- OpenDoors support. Also keep your eyes open for the "OpenDoors
- Tech Journal", that is produced on a regular basis by the users
- of OpenDoors. Included in this newsletter is information on
- OpenDoors and future versions, questions and answers about
- OpenDoors and BBS door / utility programming in general, sample
- source code, and much more.
- THE OPENDOORS SUPPORT BBS
- -------------------------------------------------------------------------------
- One means of receiving OpenDoors support is via the OpenDoors
- BBS. Below is an outline of some of what is available from the
- OpenDoors BBS:
- - The newest version of this package is always available
- for download.
- - Also available for download is example source code and
- other files which you may find helpful when writing
- programs with OpenDoors.
- - Access to the OpenDoors conference where OpenDoors
- programmers can share ideas, source code, and receive
- help with difficulties or with learning OpenDoors.
- - Get in touch with me with any questions, comments,
- suggestions or bug reports.
- - Other files by yours truly, which may be of use in you
- programming, such as a registration key system, and so
- on.
- All users receive full access upon their first call to the
- OpenDoors BBS. The North American phone number for the support
- BBS is:
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 245
- +1 (613) 599-5554
- The OpenDoors support BBS also has a FidoNet address, 1:243/8.
- If you are interested in a list of files available from the
- support BBS, simply file-request "FILES". To receive the newest
- version of OpenDoors, you can file-request "ODOORS".
- THE OPENDOORS WORD WIDE WEB SITE
- -------------------------------------------------------------------------------
- The OpenDoors World Wide Web site has been setup to provide up-
- to-date information on OpenDoors. This includes news concerning
- OpenDoors, OpenDoors tips and techniques, pointers to other
- sources of OpenDoors support, online registration and access to
- the newest version of OpenDoors.
- The current URL (address) of the OpenDoors Web site is:
- http://omega.scs.carleton.ca/~ug930227/opendoor.html
- However, I plan on moving this to a new location some time this
- year. If you are unable to reach the OpenDoors Web site through
- the above URL, please get in touch with me, and I will be able
- to tell you where it has moved to.
- THE OPENDOORS CONFERENCE
- -------------------------------------------------------------------------------
- The OpenDoors conference is devoted to OpenDoors and BBS / door
- / BBS utility programming in general. The OpenDoors conference
- serves as a place where people working with OpenDoors can share
- ideas, source code examples, and other tricks and techniques.
- Through the OpenDoors conference you can receive help with
- OpenDoors and programming in general. Also available through the
- OpenDoors conference is information on future versions of
- OpenDoors and recent developments of concern to BBS door and
- utility programmers. The OpenDoors conference is also a place
- for suggestions for future versions of OpenDoors, OpenDoors bug
- reports, a place to announce the availability of your programs,
- and much more information of interest to programmers working
- with OpenDoors.
- You can become involved in the OpenDoors Conference by the
- following means:
- - The OpenDoors conference is available as an Internet mailing
- list. to subscribe, send email to [email protected] and put
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 246
- SUBSCRIBE OPENDOOR in the message body. For help on using the
- listserver you can send email to [email protected] and put
- HELP in the message body.
- - The OpenDoors conference is available on the FidoNet North
- America echo backbone, and so is available to a large number
- of BBS systems. FidoNet capable systems may also obtain an
- OpenDoors feed directly from the moderator, Brian Pirie.
- GETTING IN TOUCH WITH ME
- -------------------------------------------------------------------------------
- If you have any questions about OpenDoors, would like help with
- any programs that your are writing, or have any suggestions for
- future versions of OpenDoors, please feel free to get in touch
- with me. You can get in touch with me by any of the following
- means:
- - The best way to contact me is by Internet email. My primary
- email address is:
- [email protected]
- If you have difficulty contacting me through this address, I
- may also be reached through the address:
- [email protected]
- - By writing a message to me in the OpenDoors support
- conference. For more information on the OpenDoors conference,
- see the previous section of this chapter.
- - By calling the OpenDoors support BBS. Information on the
- support BBS is provided earlier on in this chapter.
- - By sending your question or comment by Fax. My fax number is:
- +1 (613) 599-5554
- - By FidoNet NetMail. My address is:
- 1:243/8
- While I would like to be able to reply to all NetMail
- messages by CrashMail, I am afraid I simply can not afford to
- do this. So, if you choose to send NetMail, please indicate
- whether you would like me to reply by routed NetMail (this
- may not work, if routed NetMail is not available in your
- area), or to place the message on hold for you to poll and
- pick up.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 247
- - By conventional mail. My postal address is:
- Brian Pirie
- 117 Cedarock Drive
- Kanata ON K2M 2H5
- Canada
- I try to respond to all correspondences as soon as possible.
- If you are having some sort of difficulty with OpenDoors, the
- more detailed information you supply (such as source code to the
- program that is causing the problem, how to duplicate the
- problem, and so on), the more quickly I will be able to
- determine the source of your problem. Also, before you write
- about a problem with OpenDoors, you may wish to be sure that you
- have read and followed the instructions in the section on
- troubleshooting, found on page 242. While I do not mind taking
- the time to answer any questions related to OpenDoors, you may
- be able to save yourself the time of writing and waiting for a
- response - simply by following the instructions in the
- troubleshooting section. More often than not, the answer to
- questions I receive is already in this manual.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 248
- A
- AAA
- AA AA
- AAAAAAA
- AA AA
- AA AA
- AA AA
- -------------------------------------------------------------------------------
- APPENDIX A - CONTENTS OF PACKAGE
- The main OpenDoors package is distributed in the form of a
- single, compressed archive file. Thus, you should have received
- this version of OpenDoors in a file whose name began with
- ODOORS60. The files listed below should be included in your
- OpenDoors package. If any of these files are missing, you will
- probably want to look for the most recent version of OpenDoors
- from another source. Note that the medium and compact memory
- model libraries are now distributed separately from the main
- OpenDoors package.
- MISCALENEOUS FILES
- FILE_ID.DIZ Description of the OpenDoors package
- DORINFO1.DEF Sample door info file for testing programs
- DOOR.CFG Sample OpenDoors configuration file
- EXAMPLE PROGRAMS
- EX_HELLO.C A simple program using OpenDoors
- EX_CHAT.C Split-screen sysop chat program
- EX_MUSIC.C Example of ANSI music in OpenDoors
- EX_SKI.C Simple slalom skiing action game
- EX_VOTE.C Example of an online voting program
- VOTEDOS.EXE Compiled version of EX_VOTE.C - DOS version
- VOTEWIN.EXE EX_VOTE.C compiled - Windows version
- DTRON.EXE Free utility for running Win 95 doors
- THE LIBRARY FILES
- ODOORS.LIB DOS, Small memory model library
- ODOORL.LIB DOS, Large memory model library
- ODOORH.LIB DOS, Huge memory model library
- ODOORW.LIB Win32 import library (Microsoft version)
- ODOORS60.DLL The OpenDoors Win32 DLL
- THE HEADER FILE
- OPENDOOR.H OpenDoors header file
- OPENDOORS DOCUMENATION
- ORDER.TXT Easy-to-print order form
- OPENDOOR.TXT OpenDoors programmer's manual (this file)
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 249
- BBBBBB
- BB BB
- BB BB
- BBBBBB
- BB BB
- BB BB
- BBBBBB
- -------------------------------------------------------------------------------
- APPENDIX B - CHANGES FOR THIS VERSION
- Since version 5.00, a lot of work has gone into OpenDoors. Many
- months were spent cleaning up and restructuring the OpenDoors
- code in a process that has touched nearly every line of the
- OpenDoors code. As well as making the OpenDoors source code
- easier to maintain, this has also involved making OpenDoors more
- easily portable to 32-bit multithreaded platforms.
- After this effort was completed, I began work on a Win32 port of
- OpenDoors. The OpenDoors package now includes both DOS and Win32
- versions of the library, giving you the option of developing for
- one, the other, or both platforms. The Win32 version of
- OpenDoors is highly multithreaded to give you the best possible
- performance. With some exciting new BBS packages that are
- designed specifically for Windows 95/NT in the works, the Win32
- version of OpenDoors gives you a head start on developing
- applications that will integrate smoothly with these new BBS
- packages. Even if your programs will only be used with DOS-based
- BBS packages, the Win32 version of OpenDoors allows you to take
- advantage of the Windows 95 GUI, multithreading capabilities and
- flat 32-bit memory model (no more DOS 64K limitations and
- different memory models to worry about!). It also allows you to
- access services that are only available to Windows based
- programs, such as ODBC for easy database access, and MAPI for
- email, fax and other messaging.
- While this internal restructuring of OpenDoors and the Win32
- port of the package would be enough alone to count as a major
- new version, version 6.00 also includes many exciting new
- features, enhancements and bug fixes:
- - A new option, "silent mode", has been added. When operating
- in silent mode, OpenDoor's local sysop interface is disabled,
- so that no output is displayed on the local screen, and no
- input is accepted from the local keyboard. Silent mode can be
- activated by setting od_control.od_silent_mode = TRUE prior
- to the first call to any OpenDoors function, or by specifying
- -SILENT on the command-line (if od_parse_cmd_line() is used).
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 250
- - OpenDoors now fully supports RTS/CTS flow control, which is
- enabled by default. To disable the use of the RTS/CTS lines
- for flow control, use od_control.od_com_flow_control.
- - In version 5.00, the built-in serial I/O module would be
- unable to initialize the serial port if the "Uses Serial
- Ports" option was turned off in DesqView or other
- multitasking environments. When this option is turned off,
- multitasking environments typically remove the serial port
- information from the BIOS data segment. However, it seems
- that other serial I/O software commonly uses the default
- address for each port if this information is not available
- from the BIOS data area. OpenDoors 6.00 has been changed to
- do the same thing.
- - OpenDoors now provides a standard command-line processing
- function, od_parse_cmd_line(). This function provides a one-
- step method of adding support for many common command-line
- options to your program. This function handles options such
- as serial port information (including non-standard serial
- port configurations), node number information, user
- information, drop file and configuration file locations,
- silent mode (turns off the local interface for efficiency and
- privacy), one step local login without a drop file, and more.
- For details, run the included example program (votedos.exe or
- votewin.exe) with the -help command line option. The
- od_parse_cmd_line() function is particularly helpful in
- several situations:
- - When your program is being used on a multi-node
- system.
- - Allows potential users to try your program in local
- mode by just specifying -local on the command line.
- - Allows door information to be specified on the
- command line, rather than through a drop file, as
- supported by some BBS systems
- - Allows serial port handle to be directly passed to
- the program under Windows-based BBS systems that
- support this.
- - Provides customizable command-line help (in a
- window in the Win32 version of OpenDoors).
- - A new function, od_sleep(), allows you to suspend program
- execution for the specified number of milliseconds, releasing
- time to other processes in a multitasking environment. A call
- of od_sleep(0) will yield control to any other processes
- without forcing program execution to be suspended if no other
- processes are waiting.
- - The sysop page timing mechanism has been reworked. By
- default, od_control.od_okaytopage is set to PAGE_USE_HOURS,
- only allowing the sysop to be paged during the paging hours
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 251
- set by od_pagestartmin and od_pageendmin. Rather than
- allowing the sysop to be paged at any time of the day or
- night, the default now only permits sysop paging from 8:00am
- to 10:00pm. Setting paging start and end time to the same
- value now correctly permits paging 24 hours a day.
- - OpenDoors now provides a multi-line editor function,
- od_multiline_edit(). This editor allows the user to enter or
- edit any information that spans multiple lines, such as email
- messages or text files. The editor can be configured to
- operate in full screen mode, or in any smaller area of the
- screen that you specify. The editor is designed to be both
- easy to use, and highly customizable.
- - One new feature of OpenDoors 5.00 was somehow omitted from
- the manual. Since version 5.00, it has been possible to set
- the name of the drop file to use by including both a path and
- filename in the od_control.info_path variable.
- - All known inaccuracies and missing information from the
- version 5.00 manual have been corrected.
- - The example program, ex_chat.c, has been expanded to
- demonstrate how OpenDoor's standard chat mode can be replaced
- with the split-screen chat mode within your own programs.
- - The multiple ex_vote?.c example files have been combined and
- simplified into a single example program, as it was prior to
- version 5.00.
- - A memory leak in the od_popup_menu() function has been fixed.
- - od_control.od_open_handle can be used to provide OpenDoors
- with an already open serial port handle on platforms that
- support it. Currently, this only applies to the Win32 version
- of OpenDoors. If this variable is not set to a non-zero value
- prior to calling the first OpenDoors function (other than
- od_parse_cmd_line()), then OpenDoors proceeds normally,
- opening the serial port itself, and closing the serial port
- before exiting.
- - A new switch, od_emu_simulate_modem, has been added to
- od_control. When this is set to its default value of FALSE,
- the OpenDoors terminal emulator displays at full speed, as it
- has always done. However, when this flag is set to TRUE, the
- emulation functions will display text at approximately the
- same speed as it would be displayed when sent over the modem,
- based on the current connect speed. This allows animations to
- be displayed locally at the same speed as they would appear
- on the remote system. This switch affects the following
- functions:
- od_disp_emu()
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 252
- od_send_file()
- od_hotkey_menu()
- - OpenDoors now distinguishes between the serial port BPS rate
- (od_control.baud) and the connection BPS (a new variable,
- od_control.od_connect_speed). In situations where a separate
- value is available for the connect speed (e.g., this caller
- has connected at 14400 bps), OpenDoors will now display that
- value on the status line. Currently, a separate connect speed
- is only obtained from the DOOR.SYS drop file format.
- - The latest versions of the QBBS EXITINFO.BBS drop file is now
- supported.
- - A new od_edit_str() flag, EDIT_FLAG_SHOW_SIZE, has been
- added. By default, the fields shown by od_edit_str() are one
- character larger than the number of characters that may be
- entered. This is for esthetic reasons, so that the cursor
- remains within the highlighted field, even after a full
- string has been entered. However, you may prefer that the
- highlighted area reflect the exact number of characters that
- are permitted. This can be accomplished by setting
- EDIT_FLAG_SHOW_SIZE.
- - Tab characters ('\t') are now expanded on the local display.
- - The new RemoteAccess 2.50 EXITINFO.BBS fields are now
- supported. This has included the addition of the following
- new od_control members: user_rip_ver, user_attrib3 and
- system_last_handle.
- - When operating in "forced automatic local" mode (where no
- door information file used), OpenDoors now displays a window
- in which in prompts for the user's name at startup time. This
- new feature can be disabled by specifying the DIS_NAME_PROMPT
- od_control.od_disable flag.
- - The latest version of the SFDOORS.DAT drop file is now
- supported. SFMAIN.DAT, SFSYSOP.DAT, SFFILE.DAT and
- SFMESS.DAT, which are in the same format as SFDOORS.DAT, are
- also now recognized.
- - A new function, od_get_input(), allows you to easily handle
- extended keys in your program, such as arrow keys, insert and
- function keys.
- - The OpenDoors configuration file system will now display an
- error and exit the program if a particular configuration file
- name has been specified, and that configuration file cannot
- be found.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 253
- CCCC
- CC CC
- CC
- CC
- CC
- CC CC
- CCCC
- -------------------------------------------------------------------------------
- APPENDIX C - FUTURE VERSIONS
- While I cannot make any promises about what features and changes
- will be seen in future versions of OpenDoors, I would like to
- take a moment to tell you a bit about some of the features you
- can expect to see in future versions of OpenDoors
- As you are probably already aware, OpenDoors is a constantly
- evolving package. To help meet the needs of programmers working
- with OpenDoors, nearly every idea and change that is made to the
- package results from the suggestions and comments I receive from
- the people using OpenDoors. For this reason, I will most likely
- continue to produce new versions of OpenDoors for as long as
- there is a demand and ideas for upgrades. There certainly is no
- shortage of either of this right now.
- Some of the features that I am considering for upcoming versions
- of OpenDoors include:
- -Telnet support.
- - HTML support.
- - Direct interfacing with new Windows 95/NT BBS packages.
- - Further features to help writing multi-node door
- programs.
- -Direct interfacing with more BBS systems.
- -Additional RIP graphics support, including possible
- display of RIP images on local screen.
- -Possible support for additional programming languages and
- operating systems.
- - Improvements to existing OpenDoors features, such as more
- configuration file options, multiple log file formats,
- and many smaller changes.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 254
- DDDDD
- DD DD
- DD DD
- DD DD
- DD DD
- DD DD
- DDDDD
- -------------------------------------------------------------------------------
- APPENDIX D - SPECIAL THANKS
- There are many people who I would like to thank, for their
- suggestions, ideas and assistance in making OpenDoors what it is
- today. Among those I would like to thank are:
- - Everyone who has registered OpenDoors.
- - All those who participate in the OpenDoors conference,
- who provide many suggestions, bug reports and words of
- encouragement.
- - Those who on the OpenDoors beta team. Thank-you for
- putting up with the problems along the way. You have
- certainly helped to make OpenDoors a better package. The
- people who have helped to beta test OpenDoors 6.00 are:
- Robert Bouman
- Doug Crone
- Greg Diener
- Patrick Dixon
- Joel Downer
- Mike Fenton
- Les Howie
- Vince Jacobs
- Scott Jibben
- Dean Mills
- Jimmy Rose
- Jim Woodward
- Timothy Ward
- Mark Williams
- - Last but not least, I would like to thank my wife, Pearl,
- for her support during the long hours that it has taken
- to put OpenDoors together.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 255
- GGGG
- GG GG
- GG
- GG GGGG
- GG GG
- GG GG
- GGGG
- -------------------------------------------------------------------------------
- GLOSSARY
- ANSI ANSI is an acronym for "American National Standards Institute".
- One of the standards approved by ANSI is a terminal display
- protocol which allows (in this case), BBS software to perform
- certain display functions such as changing the color of
- displayed text, or moving the location of the cursor on the
- screen. The majority, though not all, BBS users use terminal
- software with ANSI capabilities. Any users that do not have
- graphics display capabilities, will be using ASCII mode,
- instead. The ANSI terminal protocol is sometimes referred to as
- "ANSI graphics". It is graphic in the sense that it provides
- more visual control than an ASCII TTY terminal does, but does
- not imply any support for bit-mapped nor vector graphics.
- Compare ASCII and AVATAR.
- API API is an acronym for "Application Program(er) Interface". An
- API is a set of well documented functions, variables and data
- types that you can use to access certain services from your
- program. When you write any C program that uses standard C
- library functions such as fopen() or strcpy(), you are using a
- sort of API. When you use OpenDoors functions such as
- od_printf() or od_get_key(), you are using functions that are
- part of the OpenDoors API. Operating systems provide their own
- APIs that allow programs to gain access to operating system
- features such as screen display, file I/O and communications.
- The API provided by Microsoft Windows 95 and Windows NT is
- called the Win32 API.
- ASCII ASCII (pronounced "ass-key") is an acronym for "American
- Standard Code for Information Interchange", and is a definition
- of a set of 128 letters, number and symbols, which can be
- displayed by computer systems. Also, when used within the domain
- of BBS software, ASCII mode is often used to refer to the lack
- of any more advanced display capabilities, such as ANSI or
- AVATAR. When ASCII mode is used, characters can only be
- displayed in standard Teletype (TTY) fashion, one after another.
- Also, color and cursor positioning functions are not available
- in ASCII mode. Compare ANSI and AVATAR.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 256
- AVATAR AVATAR is an acronym for "Advanced Video Attribute Terminal
- Assembler and Recreator". AVATAR is a graphics display protocol,
- similar to ANSI. Like ANSI-graphics, AVATAR graphics allow
- functions such as cursor positioning, and color changing.
- However, AVATAR also offers many capabilities not available from
- ANSI, and performs the same functions as ANSI much more quickly.
- AVATAR graphics is less common than both ANSI or ASCII, but is
- becoming more popular as time goes by. Compare ASCII and ANSI.
- BAUD "baud" or "baud rate" are generally used as a synonym for "BPS".
- BPS BPS is an acronym for "Bits Per Second", and refers to the rate
- at which data is being sent over a communications medium. There
- are two important BPS rates which are relevant to OpenDoors. The
- serial port BPS rate (also called the DCE rate) is the speed at
- which the computer is communicating with the local modem. The
- connect speed, on the other hand, is the speed at which the
- local modem is communicating with the remote modem. The serial
- port speed must be at least as fast as the connection speed.
- Often the serial port speed will be locked at a fixed speed that
- is higher than the fastest possible connection speed of the
- modem. For example, the serial port might be locked at a speed
- of 38400 BPS, while the modem could be connected at 28,800,
- 14,400 or slower speeds. OpenDoors usually needs to know the
- serial port BPS rate in order to function correctly (as stored
- in od_control.baud). Under certain situations, OpenDoors will
- also be able to report the connection speed to you (as stored in
- od_control.od_connect_speed), although OpenDoors does never
- requires this information to operate.
- BIT-MAPPED As with Boolean values, described below, bit mapped flags
- FLAGS are used to indicate whether or not various conditions exist.
- (For example, whether or not a certain setting is enabled, or
- whether or not a particular event has occurred.) However, unlike
- Boolean variables, a single bit-mapped flag represents more than
- one of these TRUE/FALSE values. In fact, each bit (BInary
- Digit), which makes of the variable can be used to represent a
- separate TRUE/FALSE state. (ie, each bit maps to a particular
- piece of information, and hence the term "Bit Map").
- For an example of using bit-mapped flags, let us take a case of
- a single "unsigned char" which contains three independent
- TRUE/FALSE values. We will call this variable user_info, and it
- will indicate whether or not a user has ANSI graphics, whether
- or not the user has screen clearing turned on, and whether or
- not the user has end-of-page "more" prompts enabled. Internally,
- the bits of the user_info variable will be as follows:
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 257
- Bit: 7 6 5 4 3 2 1 0
- | | |
- | | +--- ANSI Graphics
- | +----- Screen Clearing
- +------- More prompts
- In this case, we will have three constants which we define in
- order to simplify access to these bit-mapped flags, as follows:
- #define ANSI_GRAPHICS 0x01
- #define SCREEN_CLEARING 0x02
- #define MORE_PROMPTS 0x04
- Note that normally within OpenDoors, these constants will be
- defined for you, and you will have no need to know what their
- values are, nor in which bit which piece of information is
- stored.
- Using bit-mapped flags, you are able to set or clear any of the
- individual flags, and check whether any of the flags are set,
- using these simple methods: (Not that a set flag is the
- equivalent of a Boolean value of "True", and a cleared flag is
- the equivalent of a Boolean value of "False".)
- Set Flag: variable |= FLAG_CONSTANT;
- Clear Flag: variable &=~ FLAG_CONSTANT;
- Test Flag: variable & FLAG_CONSTANT
- Where "variable" is the name of the bit-mapped flag variable,
- and "FLAG_CONSTANT" is the pre-defined constant for the
- individual setting. To return to our example, you could turn on
- the user's ANSI graphics setting by using the line:
- user_info |= ANSI_GRAPHICS;
- and to turn off screen clearing you would:
- user_info &=~ ANSI_GRAPHICS;
- To perform an action (such as waiting for the user to press
- [Return]/[Enter]) only if "More" prompts are enabled, you would:
- if(user_info & MORE_PROMPTS)
- {
- ... /* Whatever you want */
- }
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 258
- BOOLEAN Many of the variables used within OpenDoors contain a
- VALUES "Boolean Value". A Boolean value is a two-state variable, who's
- states are referred to as "True" and "False'. If the variable
- contains a value of "True", it indicates that a certain
- condition is so, and if it contains a value of "False", it
- indicates that the condition is not so. For example, a Boolean
- variable "wait" might be used to indicate whether or not
- OpenDoors should wait for the user to press a key, or continue
- without waiting. In this case, a value of "True" would indicate
- that OpenDoors should wait, and a value of "False" would
- indicate that it should not wait.
- Note that in the C programming language, there is no actual
- Boolean variable type - usually a char or an int are used to
- store Boolean values.
- The constants TRUE and FALSE, as defined in the OPENDOOR.H file,
- are used to represent the two states of a Boolean value. Thus,
- to set a Boolean variable "wait" to the value of "True", you
- would use this line:
- wait=TRUE;
- and to set the variable "wait" to "False", you would:
- wait=FALSE;
- However, you SHOULD NOT test whether a Boolean variable is
- "True" or "False" by using the C compare (==) operator, as the
- value "True" will not always be the same numerical value.
- (Actually, the TRUE constant represents just one of many
- possible numerical values for "True"). Instead, to perform an
- action of the "wait" Boolean variable is "True", you would:
- if(wait)
- {
- ... /* Whatever you want */
- }
- and to perform an action if the "wait" Boolean variable is
- "False', you would:
- if(!wait)
- {
- ... /* Whatever you want */
- }
- For interest sake, Boolean values are named after the 19th
- century English mathematician, who studied formal logic, and
- created Boolean algebra - an algebra which deals with TRUE and
- FALSE values.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 259
- BPS BPS is an acronym for "Bits Per Second". For our purposes here,
- the terms BPS and BAUD refer to the same thing.
- CARRIER The term "Carrier" or "Carrier Detect" refers to a signal which
- DETECT most modems send to the computer, which indicates whether or not
- the modem is currently connected to (communicating with) another
- modem. The door driver module of OpenDoors, as with most other
- BBS software, uses the status of this carrier detect signal in
- order to know whether the user is still connected to the BBS
- computer. Thus, if the user hangs up, or if something goes wrong
- and the connection is lost, OpenDoors is able to detect this
- state, and exit to the BBS. The BBS will then also detect that
- the carrier signal has been "lost", and will reset itself, and
- then again be ready to accept calls.
- CHAT MODE The term "chat mode" refers to a means by which the sysop can
- communicate with a user of the BBS / door. During sysop chat,
- anything typed by the sysop will appear on the user's screen,
- and likewise, anything typed by the user will appear on the
- sysop's screen. Sysop chatting is available on both single and
- multi-line systems. Sysop chatting is initiated by the sysop,
- either at any time a user is online, or specifically in response
- to a sysop page.
- COMPILE "Compiling" refers to the process of converting the source code
- that you write for your program, into an executable file (such
- as a .EXE file) that an end user can use. The process of
- building an executable file is generally divided into two
- stages. In the first stage, called compiling, source files are
- converted to object files, often named .OBJ. In the second
- stage, called linking, one or more object files are combined,
- along with any library files, to produce the final executable
- file.
- DLL DLL is an acronym for "Dynamic Link Library". A dynamic link
- library is similar to a static library, in that it contains one
- or more functions that an application program can use. Unlike a
- static library, the code from a dynamic link library is not
- added to the program's executable file at link time. Instead,
- the dynamic link library exists as a separate file which must be
- loaded when the program is run. The Win32 version of OpenDoors
- resides in a DLL.
- See also "Library".
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 260
- DOOR A "door" is a program that runs as part of a BBS system, but
- which is separate from the central BBS software (RemoteAccess,
- Maximus, QuickBBS, PC-Board, etc.) itself. A door provides
- additional features not built into the BBS software, such as on-
- line games, on-line shopping services, voting booths, match
- making systems, access to special files or messages, and much
- much more. Since the user also communicates with the door
- online, as they do with the BBS, it may not necessarily be
- obvious to the user that the door is even a separate entity from
- the central BBS software itself.
- DOOR Also referred to as a "drop file", "exit file", or "chain
- INFORMATION file". The door information file is a file passed from the
- FILE central BBS software to a door program, providing it with
- information about the user who is online, the BBS the door is
- running under, and the current modem connection. The door
- information file may also be used to pass changed information
- back to the BBS, such as the amount of time that the user has
- used in the door. OpenDoors takes care of all of the work
- involved in reading and writing the door information file for
- you, as described in the "Basics of Door Programming" section,
- in chapter 4. Examples of door information files supported by
- OpenDoors include: DOOR.SYS, EXITINFO.BBS, DORINFO?.DAT,
- SFDOORS.DAT, CALLINFO.BBS and CHAIN.TXT.
- DTR DTR is an acronym for "Data Terminal Ready". This is a signal
- that the computer sends to the modem, indicating that the
- computer is ready to send or receive information. Most modems
- are configured to hangup if the DTR signal is lowered. This is a
- convenient means of hanging up the modem, but cases problems
- under Windows 95, where the DTR signal is always lowered when a
- program closes the serial port.
- ECHO See "Local Echo".
- FOSSIL The FOSSIL driver, or simply FOSSIL, is a TSR program or
- DRIVER device driver which OpenDoors can optionally make use of in
- order to communicate with the modem. The FOSSIL driver is loaded
- prior to starting up the BBS or your door, usually from the
- AUTOEXEC.BAT or CONFIG.SYS files. The two most commonly used
- FOSSIL drivers are X00 and BNU. (FOSSIL is an acronym for
- "Fido/Opus/SEAdog Standard Interface Layer", although it has now
- become the standard for nearly all BBS software.) FOSSIL drivers
- are also available for other specialized serial port hardware,
- such as the popular "DigiBoard" multi-port serial card.
- IMPORT LIBRARY See "Library".
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 261
- LIBRARY A "library" or "library file" is a collection of precompiled
- functions and variables that can be used by other programs. All
- of the features, capabilities and functions of OpenDoors that
- you can make use of are contained within the OpenDoors library
- files. (Likewise, the C runtime library, consisting of the
- familiar functions such as fopen(), printf() and atoi(), is also
- contained within a library file.) For more information on the
- different OpenDoors library files, see the section that begins
- on page 22.
- There are several different kinds of library files. A static
- library file is actually a collection of individual object
- files. When you compile a program that makes use of a static
- library file, only those portions of the library file that your
- program actually uses are linked into your program's executable
- (.EXE) file. Static library files can be identified by a .LIB
- extension. The DOS version of OpenDoors resides in a static
- library.
- A dynamic link library, on the other hand, is not combined with
- the program's executable file. Instead dynamic link libraries
- exist in separate .DLL files that must also be present when the
- program is executed. The Win32 version of OpenDoors resides in a
- dynamic link library.
- An import library is a small file that describes a dynamic link
- library. The most common way for a program to call functions in
- a dynamic link library requires that an import library be used a
- program link time.
- See also "DLL".
- LINK "Linking" generally refers to the process of combining several
- object files into a final executable file, during which
- references to symbol names (such as od_printf()) are resolved to
- the address of the corresponding object. See also "Compiling".
- LOCAL MODE The term "local mode" refers to a mode in which a BBS system or
- door program may operate. In local mode, the BBS/door behave as
- they would if a user were connected via modem to the BBS, except
- that all display and input is done simply on the BBS software,
- but not through the modem. Local mode allows the sysop or
- another person with direct access to the BBS computer to use the
- BBS/door software, either for their own user, or for testing
- that the software is running correctly. When programming door
- software, local mode can be very useful in testing and debugging
- the door, without requiring the door to be connected to a remote
- system. All doors written with OpenDoors automatically support
- local mode operation. Compare "Remote".
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 262
- LOCAL ECHO The term "Local Echo" refers to a door displaying the same
- characters which are sent to the modem on the local screen
- ("Output Window"). This allows the sysop to view the same
- information that is sent to the user's system, in the same
- manner that it will appear on the user's screen.
- LOCKED (eg. "Locked Baud Rate", "Locked BPS Rate", "Locked Commport
- Speed", etc.) Usually, the communication port to which a modem
- is connected is set to transfer data at the same BPS rate as the
- rate at which the modem is communicating. However, many high
- speed modems allow very high speed data transfer by using built-
- in data compression methods. In this case, the actual rate of
- data transfer can easily exceed the true BPS rate of the
- connection. As a result, the BPS rate of the port is kept a
- single speed, faster than any of the true modem connections, in
- order to increase modem speed performance. This is referred to
- as locking the commport BPS rate. OpenDoors has full support for
- the use of locked BPS rates.
- LOG FILE A log file is a normal text file in which BBS software records
- all major activities that have taken place. As such, the log
- file permits the sysop, to review what activities have taken
- place on the BBS during the time which they have been away from
- the computer. A log file can be helpful in identifying system
- errors or crashes that have occurred, in alerting the sysop in
- the case that any users have been causing problems on the BBS,
- or in simply letting the sysop know who has called recently, and
- what when they did when they called.
- MEMORY MODEL C and C++ programs can be compiled under a variety of different
- memory models. Each memory model describes how data and program
- code are addressed in memory. When writing MS-DOS programs, you
- generally have the choice of six different memory models (named
- tiny, small, compact, medium, large and huge), each of which
- provides a different combination of the maximum sizes of data
- and code that your program may have. When writing Win32
- programs, there is a single, flat 32-bit memory model that all
- programs use. This memory model allows a program to address (in
- theory) up to 4 gigabytes of data and code.
- MODEM A device connected to a computer which permits it to communicate
- with other computers, usually over standard telephone lines.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 263
- OBJECT FILE An object file contains the compiled version of a source code
- file of a program. The source code file may be a .C file, .CPP
- file, .ASM file, .PAS file, .BAS file, or any number of other
- extensions associated with other programming languages. When any
- of these language's source code files are compiled, a .OBJ file
- is created containing information such as the executable code,
- and names of symbols (variables and functions) that are to be
- shared with other .OBJ files. In order to produce a .EXE file
- that may be executed, a process known as linking must be
- performed. During the link process, one or more object files
- composing your program are combined, along with the necessary
- code from any library files being used, in order to produce the
- final .EXE file.
- ONLINE In the case of BBS software and BBS door programs, the term
- online refers to the state of a user using the BBS. Usually, the
- user will be connected to the BBS from a remote location, using
- a modem. However, it is also possible that the user will be
- using the actual BBS computer, with the software operating in
- "local mode".
- OUTPUT WINDOW The local screen of the BBS on which BBS software is running is
- usually divided into two sections. At the bottom of the screen,
- there is often a one or two line status line, which displays
- information to the sysop about the BBS and the user who is
- currently online. The rest of the screen is usually an "output
- window", in which the information which is being displayed to
- the user, is also displayed on the local screen. In some cases,
- there will be no status line, in which case the entire screen
- will be the output window. Usually, the upper 23 lines of the
- screen in an OpenDoors door will be the output window, with the
- bottom two lines being the status line. However, it is possible
- to disable the OpenDoors status line, in which case the entire
- screen will be the output window. See also "Status Line"
- PAGE See "SYSOP PAGE"
- PARAMETER In the C programming language, many tasks are accomplished by
- calling functions. When a function is called, one or more pieces
- of information may be passed to a function, in the form of
- parameters. For example, a function used to set the foreground
- and background color of displayed text might accept two
- parameters, one for each of the two color settings. In this
- example, a function such as od_set_color(), would be called as
- follows:
- od_set_color(D_GREEN,D_RED);
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 264
- In this case, D_GREEN, the foreground color, is the first
- parameter, and D_RED, the background color, is the second
- parameter.
- In C, parameters are enclosed in parentheses, ( and ), which are
- located after the name of the function to be called. Each
- parameter is then separated by a comma character. If a function
- does not accept any parameters, the parentheses will have
- nothing between them. (ie. od_clr_scr() ).
- REGISTRATION This is a demonstration version of OpenDoors, which may only be
- used under limited circumstances, for a limited period of time.
- If you wish to continue using OpenDoors after this "evaluation
- period", you must "register" it. For more information on
- registering OpenDoors, please see chapter 2 of this manual.
- REMOTE When used in reference to BBS software or door programs, the
- term remote is used to refer to a user or computer that is
- communicating with the BBS, for a distant location, by use of a
- modem. Compare "Local Mode"
- RIP "RIP", "RIPScrip" or "Remote Imaging Protocol" is a popular
- graphical terminal standard that is used with BBS systems.
- Unlike other terminal emulation standards, such as the ANSI and
- AVATAR modes supported by OpenDoors, RIP operates in bit mapped
- graphics mode, allowing features such as lines, circles and
- icons to be drawn on the remote screen. OpenDoors provides
- support for RIP graphics, although OpenDoors operates in text
- mode itself.
- STATUS LINE Usually, the bottom two lines of the screen, as displayed by an
- OpenDoors door, is devoted to a status line (although this
- status line may be turned off). This status line will display
- information about the user who is online, along with information
- about the current state of the BBS system, and a reference to
- the sysop function keys. See also "Local Window".
- SYSOP The term sysop is a short-form for "SYStem OPerator", and refers
- to the individual who is responsible for running and maintaining
- the BBS system. The sysop is usually the only person who has
- direct access to the local keyboard and computer on which the
- BBS, BBS utilities and BBS doors are running.
- SYSOP CHAT See "CHAT MODE".
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 265
- SOURCE CODE The term "source code" refers to the original file or files that
- where used to produce a library or executable program. The
- source code files contain the language statements or commands
- that are directly written by the programmer. These source code
- files are then compiled to produce an executable file that may
- be "run".
- SYSOP PAGE Sysop paging refers to the process whereby a user of the BBS
- system may call or page for the sysop's attention, when they
- wish to "chat" with the sysop, and can be thought of as being
- similar to the ringing of a telephone. When a user pages the
- sysop, the BBS system will produce some sort of sound, which the
- sysop may elect to respond to if they are within hearing range
- of the computer. The most common reasons for a user to page a
- sysop include the case that they are having difficulty with some
- aspect of the BBS, that they have a question, or if they are
- simply interested in having a friendly conversation with the
- sysop. Obviously, since the sysop may not wish to be disturbed
- by users paging at certain times (such as when they are in bed),
- most BBS software provides controls to allow you to control
- paging. These features might include the ability to set hours
- for each day of the week during which paging will be permitted,
- and the ability to temporarily override the ability of some or
- all callers to page the sysop.
- USER When applied to computers in general, the term user simply
- refers to any person using the computer hardware and software.
- However, when applied particularly to BBSes, the term user
- refers specifically to a person who calls the BBS, to carry out
- activities such as communicating via messages or chatting,
- uploading and downloading files, or using doors. Often, the term
- user is used in contrast with the term sysop. In this case,
- users are all of the people who call and user the BBS, other
- than the sysop themselves.
- WIN32 Win32 is the name of the API that programs written to run under
- Microsoft Windows 95 and Microsoft Windows NT use to access
- operating system services. Win32 programs use a flat, 32-bit
- memory model and have access to advanced operating system
- services such as multithreading. Win32 programs cannot run under
- DOS nor OS/2. While some Win32 programs can run under Windows
- 3.x using the Win32s system, OpenDoors cannot since it requires
- multithreading services that are not provided by Win32s.
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 266
- IIIIII
- II
- II
- II
- II
- II
- IIIIII
- -------------------------------------------------------------------------------
- INDEX
- A D
- About This Manual ..................21 Debugging 21, 241
- Access Level ......................178 Demo Version........................9
- Alias .............................170 Display Functions..............42, 63
- ANSI Graphics Displaying Text....30, 41, 42, 60, 62
- Archive Contents ..................248 Door Driver Functions..............40
- ASCII Chart ........................86 Door Driver Module..............6, 40
- ASCII Mode ........................255 Door Functions.....................45
- AVATAR Graphics ....118, 134, 167, 256 Door Information File30, 33, 150, 158
- Door Settings.....................182
- B DORINFOx.DEF File..................33
- DOS Shell.........................192
- Baud Rate .........................154 Download Limit....................169
- BBS Information ...................158
- BBS Name ..........................164 E
- BBS Systems ........................30
- Before Exit Function ..............191 Error Free Connection.............170
- Box Characters ...............185, 191 Example Program - Changing Only
- BPS Rate ..........................154 Foreground/Background Colour ....132
- Built-In Function Keys ............212 Example Program - Choosing Text
- Colour ..........................129
- C Example Program - Clearing A Line..56
- Example Program - Dialog Box.......66
- Caller Information ................158 Example Program - Door And Utility In
- Carrier Detect .................51, 97 One Program ......................92
- Chat ..........................38, 104 Example Program - Drawing A Window118
- Chat Mode ....................104, 259 Example Program - Exiting A Door...79
- Colour Attribute Codes ............128 Example Program - First Door.......29
- Colour Constants ..................132 Example Program - Hanging Up In CBV
- Colour Customization215, 229, 232, 236 Door .............................51
- Colour Functions ...................42 Example Program - Hotkeyed Menu....91
- Colours .................110, 128, 131 Example Program - Input Key.......115
- Common Problems ...................243 Example Program - Setting Door Info
- Compiler Errors ...................243 File Location ...................150
- Compiling With OpenDoors ...........22 Example Program - Shelling To DOS.141
- Custom Function Keys ..............213 Example Program - Terminal Emu.....62
- Example Program - Testing Available
- Door Information ................158
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 267
- Example Program - Testing Screen M
- Clearing Capabilities 57
- Example Program - Transferring A File Memory Models..................23, 24
- Using DSZ........................142 Memory Swapping...................209
- Example Program - User Statistics Modem Port........................157
- Door.............................113 Modem Settings....................153
- Example Program - Vote .............33
- Example Program - Waiting For CR ...54 N
- Exiting A Door Program .............79
- New Version.......................249
- F Node Number.......................152
- Features ............................6 O
- Feedback Form ......................19
- File Display Functions .............44 Object File.......................263
- FILES.BBS File .....................98 od_autodetect() Function...........48
- Fossil Driver .....................260 od_carrier() Function..............51
- FOSSIL port .......................157 od_chat() Function.................50
- Function Keys .................97, 211 od_clear_keybuffer() Function......53
- Future Versions ...................253 od_clr_line() Function.............55
- od_clr_scr() Function.........57, 243
- G od_colour_config() Function........59
- od_control Structure..........31, 148
- Getting In Touch With Us ..........246 od_disable Variable...............198
- Graphics Mode ...........165, 167, 255 od_disp() Function.................60
- od_disp_emu() Function.............62
- H od_disp_str() Function.............63
- od_draw_box() Function.............65
- History ...........................249 od_edit_str() Function.............68
- Hotkeys ............................90 od_exit() Function...31, 79, 191, 195
- od_get_answer() Function...........81
- I od_get_input() Function............82
- od_get_key() Function......30, 53, 85
- IBM Colour Attribute Codes ........128 od_gettext() Function..............89
- IEMSI Session Information .........161 od_hotkey_menu() Function..........90
- Inactivity Timeout ......199, 200, 202 od_init() Function.............31, 92
- Input Functions ............44, 81, 85 od_input_str() Function........53, 95
- od_kernal() Function...............31
- K od_kernel() Function...............97
- od_list_files() Function...........98
- Keyboard Buffer ...........53, 97, 115 od_log_write() Function...........100
- Keys ...............................97 od_multiline_edit() Function......101
- od_page() Function...........104, 207
- L od_parse_cmd_line() Function......105
- od_popup_menu() Function..........107
- Language Customization ............216 od_printf() Function.....29, 110, 195
- Learning OpenDoors .................29 od_putch() Function...............115
- Library ...........................261 od_puttext() Function.............116
- LIBrary Files ......................24 od_repeat() Function..............118
- Line Number .......................152 od_restore_screen() Function......120
- Linking ............................23 od_save_screen() Function.........121
- Local Mode ...............33, 200, 261 od_scroll() Function..............123
- Locked ............................262 od_send_file() Function...........124
- od_set_attrib() Function..........128
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 268
- od_set_color() Function ...........131 Solutions To Problems.............243
- od_set_cursor() Function ..........134 Source Code................10, 17, 20
- od_set_dtr() Function .............135 Special Thanks....................254
- od_set_personality() Function .....136 Status Line...104, 137, 209, 210, 264
- od_set_statusline() Function ......137 Stop Key..........................203
- od_sleep() Function ...............139 Support...........................244
- od_spawn Function .................208 Support BBS.............244, 245, 246
- od_spawn() Function ...............141 Swapping..........................209
- od_spawnvpe() Function ............143 Sysop Chat...............38, 104, 192
- od_window_create() Function .......145 Sysop Function Keys...............211
- od_window_remove() Function ..147, 148 Sysop Keys.........................97
- OPENDOOR.H File ............22, 29, 34 Sysop Name........................164
- OpenDoors BBS ................244, 245 Sysop Next Setting................184
- OpenDoors Customization ...........187 Sysop Page........................207
- OPENDOORS Echo ....................245 Sysop Paging.................104, 265
- OpenDoors History .................249 System Event......................162
- Our Address .......................246 System Name.......................164
- Output Functions ...................42
- Output Window .................34, 263 T
- P Terminal Emulator........62, 124, 125
- Terminal Emulator Control Codes...126
- Paging Hours .................182, 183 Text Customization................216
- Paging The Sysop ..................104 Thank-yous........................254
- Pause Key .........................203 Time Left.........................179
- Phone Number ......................171 Timeout............................97
- Printing ..30, 41, 60-63, 90, 110, 115 Troubleshooting....................21
- Printing Manual ....................22
- Problems ...........................21 U
- Product Support ...................244
- Project Files ......................23 User Handle (Alias)...............170
- User Information..................158
- R User Keyboard Off Key..............53
- User Keyboard Setting.............184
- Registration ..9, 10, 12, 18, 246, 264 User Name.........................174
- Registration Form ..............15, 18 User Password.....................176
- RIP ...............................264 User Timeout.......................97
- RIPScrip ..........................264
- V
- S
- Version History...................249
- Screen Functions ...................42
- Screen Length .....................177 W
- Screen Width ......................178
- Security Level ....................178 Want-Chat Setting.................180
- Setting Colours .........110, 128, 131
- ===============================================================================
- OpenDoors 6.00 Manual End of Page 269
|