From 12138e1af663ebdddeb15d7e7c8d1baf27861572 Mon Sep 17 00:00:00 2001 From: "Alexander S. Aganichev" Date: Tue, 19 Dec 2000 09:02:51 +0000 Subject: [PATCH] Added old fastecho back, fixed dot problem in win32, added new keywords --- File_id.diz | 2 +- docs/notework.txt | 20 ++ docs/rusfaq.txt | 10 +- docs/tips.txt | 5 +- golded3/gccfgg.cpp | 1 + golded3/gccfgg.h | 1 + golded3/gccfgg0.cpp | 1 + golded3/gccfgg6.cpp | 13 + golded3/gckeys.cpp | 2 + golded3/gckeys.h | 2 + golded3/gcprot.h | 1 + golded3/gearea.cpp | 4 + golded3/gecfgg.h | 1 + golded3/gectrl.cpp | 4 +- golded3/geglob.cpp | 2 +- golded3/gekeys.h | 2 + golded3/gemnus.cpp | 53 ++-- golded3/geprot.h | 2 + golded3/gerand.cpp | 4 + golded3/geread.cpp | 8 + golded3/gescan.cpp | 4 + golded3/getpls.cpp | 18 ++ golded3/gmarea.h | 3 +- golded3/mygolded.__h | 4 +- goldlib/gall/gkbdbase.cpp | 5 +- goldlib/gall/gutlgrp.h | 1 + goldlib/gcfg/gcfg.all | 2 + goldlib/gcfg/gedacfg.h | 2 + goldlib/gcfg/gs_fech4.h | 476 ++++++++++++++++++++++++++++++++++++ goldlib/gcfg/gs_fech5.h | 502 ++++++++++++++++++++++++++++++++++++++ goldlib/gcfg/gxfecho4.cpp | 159 ++++++++++++ goldlib/gcfg/gxfecho5.cpp | 159 ++++++++++++ goldlib/gcfg/gxfecho6.cpp | 6 +- 33 files changed, 1441 insertions(+), 38 deletions(-) create mode 100644 goldlib/gcfg/gs_fech4.h create mode 100644 goldlib/gcfg/gs_fech5.h create mode 100644 goldlib/gcfg/gxfecho4.cpp create mode 100644 goldlib/gcfg/gxfecho5.cpp diff --git a/File_id.diz b/File_id.diz index 505110a..d300866 100644 --- a/File_id.diz +++ b/File_id.diz @@ -1,4 +1,4 @@ -GoldED+ 1.1.4.7 [source code] +GoldED+ 1.1.5 [source code] ----------------------------- GoldED+ is a successor of the wellknown GoldED mail editor. diff --git a/docs/notework.txt b/docs/notework.txt index ea255d1..d6268a6 100644 --- a/docs/notework.txt +++ b/docs/notework.txt @@ -12,6 +12,26 @@ ______________________________________________________________________ Notes for GoldED+ 1.1.5, December xx 2000 ______________________________________________________________________ +- Support for old Fastechoes reverted back. + +- Area Catch-up and Scan now disabled if there's active area. This + should improve stability. + +! Returned NETNAME keyword in another incarnation: + + * Origin: bla-bla-bla (2:5020/604.19@fidonet) + + This style doesn't break any of FTS or FSC. Domain from Address or + AKA keyword overrides Netname keyword if specific address used. + This keyword could be used in random system groups. + ++ Added READDirQuoteMsg and READMoveDirQuoteMsg entries for + goldkeys.cfg: quote message ignoring Reply-To kludge (in current and + another area correspondingly). Both added to READMainmenu menu. + There's no default keyboard assignment. (Not tested) + +- Fixed EDITMainmenu operation. + - Fixed incorrect filenames displaying in /w32 version. - Fixed crash of Win32 version when output/input redirected to/from diff --git a/docs/rusfaq.txt b/docs/rusfaq.txt index 2c3533a..542b757 100644 --- a/docs/rusfaq.txt +++ b/docs/rusfaq.txt @@ -21,7 +21,8 @@ assistance! 10. Что за левизна в адресах кросспостов, начиная с 1.1.3? 11. А почему GoldED+ так криво поддерживает hpt-шные конфиги (не под UNIXами)? 12. Почему не вводится русская "Э" под Win95? -13. Типа эта... А писать куда автору? ;-) +13. Backspace в Linux'e +14. Типа эта... А писать куда автору? ;-) >============================================================================== @@ -100,8 +101,7 @@ assistance! *A:* А вы уверены, что вы читали доку на свой hpt? В доке явно написано, что "\" инициирует escape-последовательность. GoldED+ честно её обрабатывает, в отличии от тех, кто обещал... В принципе, в 1.1.4.1 появился ключик - -lame, отключающий парсилку обратных слэшей, попробуйте. Вот комментарии - с конца строки я точно парсить не буду!!! :-) + -lame, отключающий парсилку обратных слэшей, попробуйте. *Q:* Почему не вводится русская "Э" под Win95? *A:* Поставьте тип клавиатуры 101 клавишный США, скорее всего поможет. Если не @@ -109,6 +109,10 @@ assistance! кривой вставки текста из клипборда в DOS-версии при несовпадении языка текста и содержимого клипборда. +*Q:* Не работает backspace, приходится пользоватся стандартным Ctrl-? +*A:* Alexey Froloff: ``keycode 14 = delete delete delete delete'' в keymap'е + прописать надо. + *Q:* Типа эта... А писать куда автору? ;-) *A:* Писать лучше всего в Ru.GoldED. Даже лучше сначала его почитать, потом писать. Если уж сильно приспичит, то можно писать на 2:5020/201.58, diff --git a/docs/tips.txt b/docs/tips.txt index 766e049..7f2a4b0 100644 --- a/docs/tips.txt +++ b/docs/tips.txt @@ -32,4 +32,7 @@ Tips and tricks 8. If you have a problem with incorrect recoding in message lister try add "MsgListFast No" to your config. -9. If you want add something to this file - feel free to contact me. +9. In order to make usable backspace in Linux version add following to your + keymap if not yet: ``keycode 14 = delete delete delete delete'' + +10. If you want add something to this file - feel free to contact me. diff --git a/golded3/gccfgg.cpp b/golded3/gccfgg.cpp index 19baa59..30308c1 100644 --- a/golded3/gccfgg.cpp +++ b/golded3/gccfgg.cpp @@ -636,6 +636,7 @@ CfgGed::CfgGed() { *internetdomain = 0; *keybstack = 0; *nickname = 0; + *netname = 0; *organization = 0; #ifdef __UNIX__ strcpy(printdevice, "/usr/bin/lpr > /dev/null 2>&1"); diff --git a/golded3/gccfgg.h b/golded3/gccfgg.h index 741fca4..0cdb39d 100644 --- a/golded3/gccfgg.h +++ b/golded3/gccfgg.h @@ -256,6 +256,7 @@ const word CRC_MSGLISTVIEWSUBJ = 0xED92; const word CRC_MSGLISTWIDESUBJ = 0xF385; const word CRC_NAMESFILE = 0x1743; const word CRC_NICKNAME = 0x70D8; +const word CRC_NETNAME = 0xB574; const word CRC_NODELIST = 0x0E0A; const word CRC_NODELISTWARN = 0xF818; const word CRC_NODEPATH = 0xCE00; diff --git a/golded3/gccfgg0.cpp b/golded3/gccfgg0.cpp index bd65eac..2573e5b 100644 --- a/golded3/gccfgg0.cpp +++ b/golded3/gccfgg0.cpp @@ -427,6 +427,7 @@ SwitchN: switch(crc) { case CRC_NAMESFILE : CfgNamesfile (); break; case CRC_NICKNAME : CfgNickname (); break; + case CRC_NETNAME : CfgNetname (); break; case CRC_NODELIST : CfgNodelist (); break; case CRC_NODEPATH : CfgNodepath (); break; case CRC_NODEPATHFD : CfgNodepathfd (); break; diff --git a/golded3/gccfgg6.cpp b/golded3/gccfgg6.cpp index c384416..cf8b18f 100644 --- a/golded3/gccfgg6.cpp +++ b/golded3/gccfgg6.cpp @@ -88,6 +88,19 @@ void CfgNickname() { // ------------------------------------------------------------------ +void CfgNetname() { + + Name buf; + + strxcpy(buf, val, sizeof(buf)); + if(cfgingroup) + CFG->grp.AddItm(GRP_NETNAME, buf, strlen(buf)+1); + else + strcpy(CFG->netname, buf); +} + +// ------------------------------------------------------------------ + void CfgNodelist() { // Only used by GoldNODE diff --git a/golded3/gckeys.cpp b/golded3/gckeys.cpp index 5e016f3..b555e58 100644 --- a/golded3/gckeys.cpp +++ b/golded3/gckeys.cpp @@ -653,6 +653,7 @@ tglobalkey globalkeys[] = { #endif { CRC_READTOGGLEQUOTE , KK_ReadToggleQuote , KT_R }, // 0xB293 { CRC_EDITUNDO , KK_EditUndo , KT_E }, // 0xB295 + { CRC_READDIRQUOTEMSG , KK_ReadDirQuoteMsg , KT_R }, // 0xB351 { CRC_FILETOGGLEMARK , KK_FileToggleMark , KT_F }, // 0xB431 { CRC_FILEGOTOPREV , KK_FileGotoPrev , KT_F }, // 0xB644 { CRC_EDITLOOKUPCURSOR , KK_EditLookupCursor , KT_E }, // 0xB7CC @@ -700,6 +701,7 @@ tglobalkey globalkeys[] = { { CRC_LISTASKEXIT , KK_ListAskExit , KT_M }, // 0xD922 { CRC_AREACATCHUP , KK_AreaCatchUp , KT_A }, // 0xDA5C { CRC_READGOTOREPLYPREV , KK_ReadGotoReplyPrev , KT_R }, // 0xDBE7 + { CRC_READMOVEDIRQUOTEMSG , KK_ReadMoveDirQuoteMsg , KT_R }, // 0xDBC0 { CRC_EDITANCHOR , KK_EditAnchor , KT_E }, // 0xDC07 { CRC_FILEQUITNOW , KK_FileQuitNow , KT_F }, // 0xDD19 { CRC_AREAINFO , KK_AreaInfo , KT_A }, // 0xDE54 diff --git a/golded3/gckeys.h b/golded3/gckeys.h index 9f9a06b..ac68669 100644 --- a/golded3/gckeys.h +++ b/golded3/gckeys.h @@ -252,6 +252,7 @@ const word CRC_READMENU = 0x3D0A; const word CRC_READMESSAGELIST = 0xD5D8; const word CRC_READMOVECOMMENTMSG = 0xE4E7; const word CRC_READMOVEQUOTEMSG = 0x1B41; +const word CRC_READMOVEDIRQUOTEMSG = 0xDBC0; const word CRC_READMSGCONTINUE = 0x4511; const word CRC_READMSGEND = 0xC5AD; const word CRC_READMSGHOME = 0x4BD1; @@ -264,6 +265,7 @@ const word CRC_READNEWMSG = 0x30CA; const word CRC_READQUITNOW = 0xAC15; const word CRC_READQUOTEBUF = 0x49EE; const word CRC_READQUOTEMSG = 0xBE00; +const word CRC_READDIRQUOTEMSG = 0xB351; const word CRC_READREPLYMSG = 0x172F; const word CRC_READSEARCH = 0x48EF; const word CRC_READSOUNDKILL = 0xAE29; diff --git a/golded3/gcprot.h b/golded3/gcprot.h index dd450c1..a440792 100644 --- a/golded3/gcprot.h +++ b/golded3/gcprot.h @@ -248,6 +248,7 @@ void CfgMsglistwidesubj (); void CfgNamesfile (); void CfgNewsgroups (); void CfgNickname (); +void CfgNetname (); void CfgNodelist (); void CfgNodelistwarn (); void CfgNodepath (); diff --git a/golded3/gearea.cpp b/golded3/gearea.cpp index f22f88b..b099e46 100644 --- a/golded3/gearea.cpp +++ b/golded3/gearea.cpp @@ -447,6 +447,10 @@ void GPickArealist::print_line(uint idx, uint pos, bool isbar) { void GPickArealist::AreaCatchUp(uint n) { + // Do not do catch up if there's active area + if(AA->isopen()) + return false; + GMenuAreaCatchup MenuAreaCatchup; GMsg* msg = (GMsg*)throw_calloc(1, sizeof(GMsg)); diff --git a/golded3/gecfgg.h b/golded3/gecfgg.h index 159be42..059deeb 100644 --- a/golded3/gecfgg.h +++ b/golded3/gecfgg.h @@ -262,6 +262,7 @@ public: bool msglistwidesubj; Path namesfile; Name nickname; + Name netname; Path nodepath; Path nodepathfd; Path nodepathv7; diff --git a/golded3/gectrl.cpp b/golded3/gectrl.cpp index d8893e9..c906ee7 100644 --- a/golded3/gectrl.cpp +++ b/golded3/gectrl.cpp @@ -45,9 +45,9 @@ char* MakeOrigin(GMsg* msg, const char* orig) { strxcpy(origin, orig, sizeof(origin)); if(msg->orig.net) - msg->orig.make_string(buf); + msg->orig.make_string(buf, *AA->Netname() ? (*msg->odom ? msg->odom : AA->Netname()) : NULL); else - AA->Aka().addr.make_string(buf); + AA->Aka().addr.make_string(buf, *AA->Netname() ? (*AA->Aka().domain ? AA->Aka().domain : AA->Netname()) : NULL); if(*origin == '@') GetRandomLine(origin, sizeof(origin), origin+1); diff --git a/golded3/geglob.cpp b/golded3/geglob.cpp index ad88703..f51d5ce 100644 --- a/golded3/geglob.cpp +++ b/golded3/geglob.cpp @@ -65,7 +65,7 @@ int inforow = 18; char goldmark = ' '; int startecho = -1; -Echo stecho; +Echo stecho = ""; int fieldupd = 2; // State of field mode in winpdef() diff --git a/golded3/gekeys.h b/golded3/gekeys.h index 100e50a..3fd1d0b 100644 --- a/golded3/gekeys.h +++ b/golded3/gekeys.h @@ -307,6 +307,8 @@ const gkey KK_ReadTouchSemaphore = 0xFF9E; const gkey KK_ReadUserbase = 0xFF9F; const gkey KK_ReadUUDecode = 0xFFA0; const gkey KK_ReadWriteMsg = 0xFFA1; +const gkey KK_ReadDirQuoteMsg = 0xFFA2; +const gkey KK_ReadMoveDirQuoteMsg = 0xFFA3; const gkey KK_AreaUndefine = 0xFFB0; const gkey KK_EditUndefine = 0xFFB1; diff --git a/golded3/gemnus.cpp b/golded3/gemnus.cpp index cea92df..f28fa15 100644 --- a/golded3/gemnus.cpp +++ b/golded3/gemnus.cpp @@ -977,28 +977,29 @@ int GMenuNavigate::Run() { enum { TAG_MAIN = 100, - TAG_MAIN_SHELL = (int)KK_ReadDosShell, - TAG_MAIN_QUIT = (int)KK_ReadQuitNow, + TAG_MAIN_SHELL = (int)KK_ReadDosShell, + TAG_MAIN_QUIT = (int)KK_ReadQuitNow, TAG_EDIT = 101, - TAG_EDIT_ENTER = (int)KK_ReadNewMsg, - TAG_EDIT_QUOTE = (int)KK_ReadQuoteMsg, - TAG_EDIT_COMMENT = (int)KK_ReadCommentMsg, + TAG_EDIT_ENTER = (int)KK_ReadNewMsg, + TAG_EDIT_QUOTE = (int)KK_ReadQuoteMsg, + TAG_EDIT_DIRQUOTE = (int)KK_ReadDirQuoteMsg, + TAG_EDIT_COMMENT = (int)KK_ReadCommentMsg, TAG_EDIT_OTHER = 1010, - TAG_EDIT_OTHER_QUOTE = (int)KK_ReadMoveQuoteMsg, - TAG_EDIT_OTHER_COMMENT = (int)KK_ReadMoveCommentMsg, + TAG_EDIT_OTHER_QUOTE = (int)KK_ReadMoveQuoteMsg, + TAG_EDIT_OTHER_DIRQUOTE = (int)KK_ReadMoveQuoteMsg, + TAG_EDIT_OTHER_COMMENT = (int)KK_ReadMoveCommentMsg, TAG_SEL = 102, - TAG_SEL_ORIGIN = (int)KK_ReadChangeOrigin, - TAG_SEL_USERNAME = (int)KK_ReadChangeUsername, - TAG_SEL_AKA = (int)KK_ReadChangeAka, - TAG_SEL_ATTRS = (int)KK_ReadChangeAttrs, - TAG_SEL_TEMPLATE = (int)KK_ReadChangeTemplate, + TAG_SEL_ORIGIN = (int)KK_ReadChangeOrigin, + TAG_SEL_USERNAME = (int)KK_ReadChangeUsername, + TAG_SEL_AKA = (int)KK_ReadChangeAka, + TAG_SEL_ATTRS = (int)KK_ReadChangeAttrs, + TAG_SEL_TEMPLATE = (int)KK_ReadChangeTemplate, TAG_UTIL = 103, - TAG_UTIL_CMF = (int)KK_ReadCopyMoveForward, - TAG_UTIL_LIST = (int)KK_ReadMessageList, - TAG_UTIL_WRITE = (int)KK_ReadWriteMsg, - TAG_UTIL_FREQ = (int)KK_ReadFileRequest, - TAG_SEPARATOR, - TAG_END + TAG_UTIL_CMF = (int)KK_ReadCopyMoveForward, + TAG_UTIL_LIST = (int)KK_ReadMessageList, + TAG_UTIL_WRITE = (int)KK_ReadWriteMsg, + TAG_UTIL_FREQ = (int)KK_ReadFileRequest, + TAG_END = 104 }; Init(); @@ -1019,14 +1020,16 @@ int GMenuNavigate::Run() { End(); Item(TAG_EDIT, "E Edit "); BeginPullDown(); - Item(TAG_EDIT_ENTER, "E Enter new msg "); - Item(TAG_EDIT_QUOTE, "Q Quote-reply "); - Item(TAG_EDIT_COMMENT, "C Comment-reply "); - Item(TAG_EDIT_OTHER, "O Other area reply >"); + Item(TAG_EDIT_ENTER, "E Enter new msg "); + Item(TAG_EDIT_QUOTE, "Q Quote-reply "); + Item(TAG_EDIT_DIRQUOTE, "D Direct quote-reply (ignore Reply-To) "); + Item(TAG_EDIT_COMMENT, "C Comment-reply "); + Item(TAG_EDIT_OTHER, "O Other area reply > "); SetTitle(" Other Area "); Begin(); - Item(TAG_EDIT_OTHER_QUOTE, "Q Quote-reply "); - Item(TAG_EDIT_OTHER_COMMENT, "C Comment-reply "); + Item(TAG_EDIT_OTHER_QUOTE, "Q Quote-reply "); + Item(TAG_EDIT_OTHER_DIRQUOTE, "D Direct quote-reply (ignore Reply-To) "); + Item(TAG_EDIT_OTHER_COMMENT, "C Comment-reply "); End(); End(); Item(TAG_SEL, "C Change "); @@ -1046,7 +1049,7 @@ int GMenuNavigate::Run() { End(); End(); Start(); - if((finaltag >= TAG_MAIN) and (finaltag < (TAG_END*10))) + if((finaltag >= TAG_MAIN) and (finaltag <= TAG_END)) finaltag = -1; return finaltag; } diff --git a/golded3/geprot.h b/golded3/geprot.h index 17fb001..e16d349 100644 --- a/golded3/geprot.h +++ b/golded3/geprot.h @@ -316,9 +316,11 @@ void MessageBrowse(); void NewArea(bool jumpnext = false); void NewMsg(); void OtherAreaQuoteMsg(); +void OtherAreaDirQuoteMsg(); void OtherAreaCommentMsg(); void QuitNow(); void QuoteBuf(GMsg* msg); +void DirQuoteMsg(); void QuoteMsg(); void RenumberArea(); void ReplyMsg(); diff --git a/golded3/gerand.cpp b/golded3/gerand.cpp index cd23528..b6c8ce2 100644 --- a/golded3/gerand.cpp +++ b/golded3/gerand.cpp @@ -171,6 +171,7 @@ void Area::InitData() { adat->viewkludge = CFG->viewkludge; adat->viewquote = CFG->viewquote; strcpy(adat->nickname, CFG->nickname); + strcpy(adat->netname, CFG->netname); strcpy(adat->whoto, CFG->whoto); strcpy(adat->xlatexport, CFG->xlatexport); strcpy(adat->xlatimport, CFG->xlatimport); @@ -362,6 +363,9 @@ void Area::RandomizeData(int mode) { if(CFG->grp.GetItm(GRP_NICKNAME, buf, sizeof(buf))) strxcpy(adat->nickname, buf, sizeof(adat->nickname)); + if(CFG->grp.GetItm(GRP_NETNAME, buf, sizeof(buf))) + strxcpy(adat->netname, buf, sizeof(adat->netname)); + if(CFG->grp.GetItm(GRP_WHOTO, buf, sizeof(buf))) { if(*buf == '@') GetRandomLine(buf, sizeof(buf), buf+1); diff --git a/golded3/geread.cpp b/golded3/geread.cpp index 7746987..2ec69be 100644 --- a/golded3/geread.cpp +++ b/golded3/geread.cpp @@ -605,6 +605,10 @@ void Reader() { OtherAreaQuoteMsg(); break; + case KK_ReadMoveDirQuoteMsg: + OtherAreaDirQuoteMsg(); + break; + case KK_ReadMoveCommentMsg: OtherAreaCommentMsg(); break; @@ -617,6 +621,10 @@ void Reader() { QuoteMsg(); break; + case KK_ReadDirQuoteMsg: + DirQuoteMsg(); + break; + case KK_ReadCommentMsg: CommentMsg(); break; diff --git a/golded3/gescan.cpp b/golded3/gescan.cpp index d630c54..43bd46a 100644 --- a/golded3/gescan.cpp +++ b/golded3/gescan.cpp @@ -107,6 +107,10 @@ int AreaList::SetActiveAreaNo(int __areano) { int AreaList::AreaScan(int mode, uint currno, int pmscan, int& pmails, int& pmareas, const char* file) { + // Never scan if there's active area + if(AA->isopen()) + return false; + gstrarray bag; int groupid = -1; diff --git a/golded3/getpls.cpp b/golded3/getpls.cpp index ef15fc6..9f5a139 100644 --- a/golded3/getpls.cpp +++ b/golded3/getpls.cpp @@ -942,6 +942,15 @@ void ReplyMsg() { } +// ------------------------------------------------------------------ + +void DirQuoteMsg() { + + if(reader_msg->ireplyto) *reader_msg->ireplyto = NUL; + QuoteMsg(); +} + + // ------------------------------------------------------------------ void QuoteMsg() { @@ -1006,6 +1015,15 @@ void CommentMsg() { } +// ------------------------------------------------------------------ + +void OtherAreaDirQuoteMsg() { + + if(reader_msg->ireplyto) *reader_msg->ireplyto = NUL; + OtherAreaQuoteMsg(); +} + + // ------------------------------------------------------------------ void OtherAreaQuoteMsg() { diff --git a/golded3/gmarea.h b/golded3/gmarea.h index 1b2c1b0..f66c078 100644 --- a/golded3/gmarea.h +++ b/golded3/gmarea.h @@ -291,6 +291,7 @@ struct AreaData { bool msglistheader; bool msglistwidesubj; Name nickname; + Name netname; INam organization; char origin[160]; Path quotebuffile; @@ -542,6 +543,7 @@ public: bool Msglistheader() const { return adat->msglistheader; } bool Msglistwidesubj() const { return adat->msglistwidesubj; } const char* Nickname() const { return adat->nickname; } + const char* Netname() const { return adat->netname; } const char* Organization() const { return adat->organization; } const char* Origin() const { return adat->origin; } const char* Outputfile() const { return adat->outputfile; } @@ -706,7 +708,6 @@ public: int Run(const char* _title, int wpos, int& idx); GPickArealist(); - }; diff --git a/golded3/mygolded.__h b/golded3/mygolded.__h index d8a00c0..7738b25 100644 --- a/golded3/mygolded.__h +++ b/golded3/mygolded.__h @@ -47,7 +47,7 @@ #undef __GVER_PREVERSION__ #define __GVER_PREVERSION__ "" #undef __GVER_POSTVERSION__ -#define __GVER_POSTVERSION__ ".7" -__GVER__(1,1,4) +#define __GVER_POSTVERSION__ "" +__GVER__(1,1,5) // ------------------------------------------------------------------ diff --git a/goldlib/gall/gkbdbase.cpp b/goldlib/gall/gkbdbase.cpp index 24f041a..1980ed8 100644 --- a/goldlib/gall/gkbdbase.cpp +++ b/goldlib/gall/gkbdbase.cpp @@ -1244,7 +1244,10 @@ gkey kbxget_raw(int mode) { } // fall through default: - { + if(ascii == '\x2e') { + return (gkey)ascii; + } + else { int kc = gkbd_nt2bios(inp); if(kc != -1) return (gkey)kc; diff --git a/goldlib/gall/gutlgrp.h b/goldlib/gall/gutlgrp.h index 229a808..75deede 100644 --- a/goldlib/gall/gutlgrp.h +++ b/goldlib/gall/gutlgrp.h @@ -74,6 +74,7 @@ enum { GRP_MSGLISTHEADER, GRP_MSGLISTWIDESUBJ, GRP_NICKNAME, + GRP_NETNAME, GRP_ORGANIZATION, GRP_ORIGIN, GRP_OUTPUTFILE, diff --git a/goldlib/gcfg/gcfg.all b/goldlib/gcfg/gcfg.all index ca851c8..9621f8e 100644 --- a/goldlib/gcfg/gcfg.all +++ b/goldlib/gcfg/gcfg.all @@ -33,6 +33,8 @@ gxdutch cpp all ovl bcd bco bcx wcn wco wcx lnx emx djg rsx cyg gxezy102 cpp all ovl bcd bco bcx wcn wco wcx lnx emx djg rsx cyg gxezy110 cpp all ovl bcd bco bcx wcn wco wcx lnx emx djg rsx cyg gxfd cpp all ovl bcd bco bcx wcn wco wcx lnx emx djg rsx cyg +gxfecho4 cpp all ovl bcd bco bcx wcn wco wcx lnx emx djg rsx cyg +gxfecho5 cpp all ovl bcd bco bcx wcn wco wcx lnx emx djg rsx cyg gxfecho6 cpp all ovl bcd bco bcx wcn wco wcx lnx emx djg rsx cyg gxfidpcb cpp all ovl bcd bco bcx wcn wco wcx lnx emx djg rsx cyg gxfm092 cpp all ovl bcd bco bcx wcn wco wcx lnx emx djg rsx cyg diff --git a/goldlib/gcfg/gedacfg.h b/goldlib/gcfg/gedacfg.h index 395cbdb..9e0fed4 100644 --- a/goldlib/gcfg/gedacfg.h +++ b/goldlib/gcfg/gedacfg.h @@ -255,6 +255,8 @@ protected: void ReadEzycom110(FILE* fp, char* path, char* file, char* options); #endif #ifndef GCFG_NOFE + void ReadFastecho11x(int fh); + void ReadFastecho141(int fh); void ReadFastecho142(int fh); #endif #ifndef GCFG_NOFMAIL diff --git a/goldlib/gcfg/gs_fech4.h b/goldlib/gcfg/gs_fech4.h new file mode 100644 index 0000000..71960f6 --- /dev/null +++ b/goldlib/gcfg/gs_fech4.h @@ -0,0 +1,476 @@ + +// ------------------------------------------------------------------ +// The Goldware Library. Copyright (C) Odinn Sorensen. +// ------------------------------------------------------------------ +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free +// Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// ------------------------------------------------------------------ +// $Id$ +// ------------------------------------------------------------------ + + +#if defined(GOLD_CANPACK) +#pragma pack(1) +#endif + + +/********************************************************/ +/* 'C' Structures of FastEcho 1.30, File: FASTECHO.CFG */ +/* (c)1993 by Tobias Burchhardt, Updated: 13 Sep 1993 */ +/********************************************************/ + +/********************************************************/ +/* FASTECHO.CFG = */ +/* + */ +/* + */ +/* + */ +/********************************************************/ + +#define REVISION 4 /* current revision */ + +#define MAX_AREAS 960 /* max # of areas */ +#define MAX_NODES 200 /* max # of nodes */ +#define MAX_GROUPS 26 /* max # of groups */ +#define MAX_AKAS 16 /* max # of akas */ + +/********************************************************/ +/* CONFIG.flags */ +/********************************************************/ +#define RETEAR 0x00000001l +#define AUTOCREATE 0x00000002l +#define KILLEMPTY 0x00000004l +#define KILLDUPES 0x00000008l +#define FRONTDOOR 0x00000010l +#define DBRIDGE 0x00000020l +#define BINKLEY 0x00000040l +#define INTERMAIL 0x00000080l +//#define SWAP_XMS 0x00000100l +//#define SWAP_EMS 0x00000200l +//#define SWAP_DISK 0x00000400l +#define PURGE_PROCESSDATE 0x00008000l +#define MAILER_RESCAN 0x00010000l +#define EXCLUDE_USERS 0x00020000l +#define EXCLUDE_SYSOPS 0x00040000l +#define CHECK_DESTINATION 0x00080000l +#define UPDATE_BBS_CONFIG 0x00100000l +#define KILL_GRUNGED_DATE 0x00200000l +#define NOT_BUFFER_EMS 0x00400000l +#define KEEP_NETMAILS 0x00800000l +#define NOT_UPDATE_MAILER 0x01000000l +#define NOT_CHECK_SEMAPHORES 0x02000000l +#define CREATE_SEMAPHORES 0x04000000l +#define CHECK_COMPLETE 0x08000000l + +/********************************************************/ +/* CONFIG.BBSSoftware */ +/********************************************************/ +enum BBSSoft { NoBBSSoft = 0, RemoteAccess111, QuickBBS, + SuperBBS, ProBoard122, TagBBS, RemoteAccess200, + ProBoard130}; + +/********************************************************/ +/* CONFIG.CC.what */ +/********************************************************/ +#define FROM 1 +#define TO 2 +#define SUBJECT 3 + +/********************************************************/ +/* CONFIG.QuietLevel */ +/********************************************************/ +#define QUIET_PACK 0x0001 +#define QUIET_UNPACK 0x0002 +#define QUIET_EXTERN 0x0004 + +/********************************************************/ +/* CONFIG.Buffers */ +/********************************************************/ +#define BUF_LARGE 0x0000 +#define BUF_MEDIUM 0x0001 +#define BUF_SMALL 0x0002 + +/********************************************************/ +/* CONFIG.arcext.inb/outb */ +/********************************************************/ +enum ARCmailExt { ARCDigits = 0, ARCHex, ARCAlpha }; + +/********************************************************/ +/* CONFIG.AreaFixFlags */ +/********************************************************/ +#define ALLOWRESCAN 0x0001 +#define KEEPREQUEST 0x0002 +#define KEEPRECEIPT 0x0004 +#define ALLOWREMOTE 0x0008 +#define DETAILEDLIST 0x0010 +#define ALLOWPASSWORD 0x0020 +#define ALLOWPKTPWD 0x0040 + +/********************************************************/ +/* Area.board (1-200 = QBBS) */ +/********************************************************/ +#define NO_BOARD 0x4000u /* everything but QBBS */ +#define AREA_DELETED 0x8000u /* never written */ + +/********************************************************/ +/* Area.flags.type */ +/********************************************************/ +#define QBBS 0 +#define FIDO 1 +#define SQUISH 2 +#define JAM 3 +#define PT_BOARD 7 + +/********************************************************/ +/* Area.type */ +/********************************************************/ +#define AREA_ECHOMAIL 0 +#define AREA_NETMAIL 1 +#define AREA_LOCAL 2 +#define AREA_BADMAILBOARD 3 +#define AREA_DUPEBOARD 4 + +/********************************************************/ +/* Node.flags */ +/********************************************************/ +#define DDDD 0x0001 +#define TOSSCAN 0x0002 +#define DIRECT 0x0004 +#define CRASH 0x0008 +#define UMLAUT_NET 0x0010 +#define ALLOW_AF_REMOTE 0x0020 +#define RESCANDISABLED 0x0040 +#define HOLD 0x0080 +#define ARCMAIL060 0x0200 +#define PASSIVE 0x0400 +#define ALLOWAREACREATE 0x0800 +#define PACKER 0xF000 + +#define PACKS(x) (int)(((x)&PACKER)>>12) /* Index of used Packer */ + /* 0xf = .PKT, don't pack */ + +/********************************************************/ +/* Node.advflags */ +/********************************************************/ +#define EXPORTBYNAME 0x0001 +#define NOT_NOTIFY 0x0002 +#define NOT_HELP 0x0004 +#define NOATTACH 0x0008 +#define NET_HOLD 0x0010 +#define NET_CRASH 0x0020 +#define NET_DIRECT 0x0040 + +/********************************************************/ +/* Types */ +/********************************************************/ +#if 1 +typedef unsigned char bit; +typedef unsigned char byte; +typedef unsigned short word; /* normal int = 16 bit */ +typedef unsigned long dword; +#endif + +enum ARCers { ARC_Unknown = -1, ARC_SeaArc, ARC_PkArc, ARC_Pak, + ARC_ArcPlus, ARC_Zoo, ARC_PkZip, ARC_Lha, ARC_Arj, + ARC_Sqz }; /* CONFIG.Unpackers[] */ + +/********************************************************/ +/* Structures */ +/********************************************************/ + +typedef struct +{ + word zone,net,node,point; +} Address; + +#define _MAXPATH 56 + +typedef struct CONFIGURATION4 +{ + word revision; + dword flags; + word NodeCnt,AreaCnt,unused1; + char NetMPath[_MAXPATH], + MsgBase[_MAXPATH], + InBound[_MAXPATH], + OutBound[_MAXPATH], + Unpacker[_MAXPATH], + LogFile[_MAXPATH], + OriginLine[8][_MAXPATH], + StatFile[_MAXPATH], + SwapPath[_MAXPATH], + SemaphorePath[_MAXPATH], + BBSConfigPath[_MAXPATH], + DBQueuePath[_MAXPATH], + unused2[32], + RetearTo[40], + SecurePath[_MAXPATH], + ExtAfter[_MAXPATH-4], + ExtBefore[_MAXPATH-4]; + struct + { + char tag[4]; + char name[_MAXPATH-2]; + char list[2]; /* List prefix character */ + } Packer[8]; + struct + { + byte what; + char object[31]; + word conference; + } CC[10]; + byte security,loglevel; + short def_days,def_messages; + struct /* now obsolete */ + { + Address main; + char domain[28]; + word pointnet; + dword flags; + } oldakas[11]; /* but still maintained */ + word autorenum; + short def_recvdays; + word openQQQs; + word oldduperecords; /* now obsolete */ + word msglen; + word unused3; + char TempPath[_MAXPATH]; + byte graphics,BBSSoftware; + char AreaFixHelp[_MAXPATH]; + char Unpackers[9][_MAXPATH]; + word AreaFixFlags; + byte QuietLevel,Buffers; + byte FWACnt,GDCnt; /* # of ForwardAreaFix records, + # of Group Default records */ + struct + { + word flags; + word days[2]; + word msgs[2]; + } rescan_def; + dword duperecords; + struct + { + byte inb; + byte outb; + } arcext; + word AFixRcptLen; + word AkaCnt; + word maxPKT; + byte sharing,sorting; + struct + { + char name[36]; + dword resv; + } sysops[11]; + char AreaFixLog[_MAXPATH]; + char TempInBound[_MAXPATH]; + char resv2[832]; + dword offset; /* This is the offset from the current + file-pointer to the 1st Node */ +} CONFIG4; + +/* To directly access the 'Nodes' and/or 'Areas' while bypassing the */ +/* Extensions, perform an absolute (from beginning of file) seek to */ +/* sizeof(CONFIG) + CONFIG.offset */ + +typedef struct +{ + Address addr; + byte aka; /* 0 ... MAX_AKAS-1 */ + byte autopassive; /* # of days */ + word flags; + word sec_level; + char password[9]; /* .PKT password */ + char newgroup; /* Default group for new areas */ + Address routes[15]; /* netmail routing */ + byte areas[124]; /* Bit-field with 992 bits, Byte 0/Bit 7 */ + /* is conference 0, etc. */ + dword groups; /* Bit-field, Byte 0/Bit 7 = 'A' etc. */ + /* false means group is active */ + char areafixpw[9]; + byte advflags; +} FeNode4; + +typedef struct +{ + char name[41]; + byte type; + word board; + short messages; + struct + { + bit origin : 3; + bit group : 5; /* 0 ... MAX_GROUPS-1 */ + bit type : 3; + bit umlaut : 1; + bit aka : 4; /* 0 ... MAX_AKAS-1 */ + } flags; + short days; + word conference; /* 0 ... 991 */ + word read_sec,write_sec; + struct + { + bit autoadded : 1; + bit tinyseen : 1; + bit cpd : 1; + bit passive : 1; + bit keepseen : 1; + bit mandatory : 1; + bit keepsysop : 1; + bit killread : 1; + bit disablepsv : 1; + bit resv : 7; + } advflags; + char path[_MAXPATH]; + char desc[42]; + word seenbys; /* LSB = Aka0, MSB = Aka15 */ + short recvdays; +} FeArea4; + + +/********************************************************/ +/* Optional Extensions */ +/********************************************************/ +/* These are the variable length extensions between */ +/* CONFIG and the first Node record. Each extension has */ +/* a header which contains the info about the type and */ +/* the length of the extension. You can read the fields */ +/* using the following algorithm: */ +/* */ +/* offset := 0; */ +/* while (offset */ + +enum AreaFixSendTo { AreaFix = 0, AreaMgr, AreaLink, EchoMgr }; +enum AreaFixAreaListFormat { Areas_BBS = 0, Area_List }; + +typedef struct +{ + word nodenr; + struct + { + bit sendto : 3; + bit newgroup: 5; + bit valid : 1; + bit uncond : 1; + bit addplus : 1; + bit addtear : 1; + bit format : 3; + bit active : 1; + } flags; + char file[_MAXPATH]; + dword groups; + word sec_level; + char resv[6]; +} ForwardAreaFix; + +#define EH_GROUPS 0x0002 /* 1 record of */ + +typedef struct +{ + char name[26][35]; +} GroupNames; + +#define EH_SYSOPNAMES 0x0003 /* CONFIG.NodeCnt * */ + +typedef struct +{ + char name[36]; +} SysopNames; + +#define EH_GRPDEFAULTS 0x0006 /* CONFIG.GDCnt * */ + +typedef struct +{ + byte group; + FeArea4 area; + byte nodes[32]; /* 256 bits */ +} GroupDefaults; + +#define EH_AKAS 0x0007 /* CONFIG.AkaCnt * */ + +typedef struct +{ + Address main; + char domain[28]; + word pointnet; + dword flags; /* unused */ +} SysAddress; + +#define EH_RA111_MSG 0x0100 /* Original records of BBS systems */ +#define EH_QBBS_MSG 0x0101 +#define EH_SBBS_MSG 0x0102 +#define EH_PB122_MSG 0x0103 +#define EH_TAG_MSG 0x0104 +#define EH_RA200_MSG 0x0105 /* See BBS package's documentation */ +#define EH_PB130_MSG 0x0106 /* for details */ + +/********************************************************/ +/* Routines to access Node.areas, Node.groups */ +/********************************************************/ + +#if 0 + +word AddBam(byte *bam,word nr) +{ +byte c=(1<<(7-(nr&7))),d; + + d=bam[nr/8]&c; + bam[nr/8]|=c; + return(d); +} + +void FreeBam(byte *bam,word nr) +{ + bam[nr/8]&=~(1<<(7-(nr&7))); +} + +word GetBam(byte *bam,word nr) +{ + if(bam[nr/8]&(1<<(7-(nr&7)))) return(true); + return(false); +} + +#define IsActive(nr,area) GetBam(Node[nr].areas,area) +#define SetActive(nr,area) AddBam(Node[nr].areas,area) +#define SetDeActive(nr,area) FreeBam(Node[nr].areas,area) + +#endif + + +#if defined(GOLD_CANPACK) +#pragma pack() +#endif + diff --git a/goldlib/gcfg/gs_fech5.h b/goldlib/gcfg/gs_fech5.h new file mode 100644 index 0000000..9d07460 --- /dev/null +++ b/goldlib/gcfg/gs_fech5.h @@ -0,0 +1,502 @@ + +// ------------------------------------------------------------------ +// The Goldware Library. Copyright (C) Odinn Sorensen. +// ------------------------------------------------------------------ +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free +// Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// ------------------------------------------------------------------ +// $Id$ +// ------------------------------------------------------------------ + + +/********************************************************/ +/* 'C' Structures of FastEcho 1.41, File: FASTECHO.CFG */ +/* (c)1994 by Tobias Burchhardt, Updated: 11 Apr 1994 */ +/********************************************************/ + +/********************************************************/ +/* FASTECHO.CFG = */ +/* + */ +/* + */ +/* + */ +/********************************************************/ + + +#if defined(GOLD_CANPACK) +#pragma pack(1) +#endif + + +#define REVISION 5 /* current revision */ + +#define MAX_AREAS 2048 /* max # of areas */ +#define MAX_NODES 1024 /* max # of nodes */ +#define MAX_GROUPS 26 /* max # of groups */ +#define MAX_AKAS 16 /* max # of akas */ +#define MAX_ROUTE 15 /* max # of 'vias' */ + +/* + Note: The MAX_AREAS and MAX_NODES are only the absolute maximums + as the handling is flexible. To get the maximums which are + used for the config file you read, you have to examine the + CONFIG.MaxAreas and CONFIG.MaxNodes variables ! +*/ + +/********************************************************/ +/* CONFIG.flags */ +/********************************************************/ +#define RETEAR 0x00000001l +#define AUTOCREATE 0x00000002l +#define KILLEMPTY 0x00000004l +#define KILLDUPES 0x00000008l +#define FRONTDOOR 0x00000010l +#define DBRIDGE 0x00000020l +#define BINKLEY 0x00000040l +#define INTERMAIL 0x00000080l +//#define SWAP_XMS 0x00000100l +//#define SWAP_EMS 0x00000200l +//#define SWAP_DISK 0x00000400l +#define PURGE_PROCESSDATE 0x00008000l +#define MAILER_RESCAN 0x00010000l +#define EXCLUDE_USERS 0x00020000l +#define EXCLUDE_SYSOPS 0x00040000l +#define CHECK_DESTINATION 0x00080000l +#define UPDATE_BBS_CONFIG 0x00100000l +#define KILL_GRUNGED_DATE 0x00200000l +#define NOT_BUFFER_EMS 0x00400000l +#define KEEP_NETMAILS 0x00800000l +#define NOT_UPDATE_MAILER 0x01000000l +#define NOT_CHECK_SEMAPHORES 0x02000000l +#define CREATE_SEMAPHORES 0x04000000l +#define CHECK_COMPLETE 0x08000000l + +/********************************************************/ +/* CONFIG.BBSSoftware */ +/********************************************************/ +enum BBSSoft { NoBBSSoft = 0, RemoteAccess111, QuickBBS, + SuperBBS, ProBoard122, TagBBS, RemoteAccess200, + ProBoard130}; + +/********************************************************/ +/* CONFIG.CC.what */ +/********************************************************/ +#define FROM 1 +#define TO 2 +#define SUBJECT 3 + +/********************************************************/ +/* CONFIG.QuietLevel */ +/********************************************************/ +#define QUIET_PACK 0x0001 +#define QUIET_UNPACK 0x0002 +#define QUIET_EXTERN 0x0004 + +/********************************************************/ +/* CONFIG.Buffers */ +/********************************************************/ +#define BUF_LARGE 0x0000 +#define BUF_MEDIUM 0x0001 +#define BUF_SMALL 0x0002 + +/********************************************************/ +/* CONFIG.arcext.inb/outb */ +/********************************************************/ +enum ARCmailExt { ARCDigits = 0, ARCHex, ARCAlpha }; + +/********************************************************/ +/* CONFIG.AreaFixFlags */ +/********************************************************/ +#define ALLOWRESCAN 0x0001 +#define KEEPREQUEST 0x0002 +#define KEEPRECEIPT 0x0004 +#define ALLOWREMOTE 0x0008 +#define DETAILEDLIST 0x0010 +#define ALLOWPASSWORD 0x0020 +#define ALLOWPKTPWD 0x0040 + +/********************************************************/ +/* Area.board (1-200 = QBBS) */ +/********************************************************/ +#define NO_BOARD 0x4000u /* everything but QBBS */ +#define AREA_DELETED 0x8000u /* never written */ + +/********************************************************/ +/* Area.flags.type */ +/********************************************************/ +#define QBBS 0 +#define FIDO 1 +#define SQUISH 2 +#define JAM 3 +#define PT_BOARD 7 + +/********************************************************/ +/* Area.type */ +/********************************************************/ +#define AREA_ECHOMAIL 0 +#define AREA_NETMAIL 1 +#define AREA_LOCAL 2 +#define AREA_BADMAILBOARD 3 +#define AREA_DUPEBOARD 4 + +/********************************************************/ +/* Node.flags */ +/********************************************************/ +#define DDDD 0x0001 +#define TOSSCAN 0x0002 +#define DIRECT 0x0004 +#define CRASH 0x0008 +#define UMLAUT_NET 0x0010 +#define ALLOW_AF_REMOTE 0x0020 +#define RESCANDISABLED 0x0040 +#define HOLD 0x0080 +#define ARCMAIL060 0x0200 +#define PASSIVE 0x0400 +#define ALLOWAREACREATE 0x0800 +#define PACKER 0xF000 + +#define PACKS(x) (int)(((x)&PACKER)>>12) /* Index of used Packer */ + /* 0xf = .PKT, don't pack */ + +/********************************************************/ +/* Node.advflags */ +/********************************************************/ +#define EXPORTBYNAME 0x0001 +#define NOT_NOTIFY 0x0002 +#define NOT_HELP 0x0004 +#define NOATTACH 0x0008 +#define NET_HOLD 0x0010 +#define NET_CRASH 0x0020 +#define NET_DIRECT 0x0040 + +/********************************************************/ +/* Types */ +/********************************************************/ +#if 1 +typedef unsigned char byte; +typedef unsigned short word; /* normal int = 16 bit */ +typedef unsigned long dword; +#endif + +enum ARCers { ARC_Unknown = -1, ARC_SeaArc, ARC_PkArc, ARC_Pak, + ARC_ArcPlus, ARC_Zoo, ARC_PkZip, ARC_Lha, ARC_Arj, + ARC_Sqz }; /* CONFIG.Unpackers[] */ + +/********************************************************/ +/* Structures */ +/********************************************************/ + +typedef struct +{ + word zone,net,node,point; +} Address; + +#define _MAXPATH 56 + +typedef struct CONFIGURATION5 +{ + word revision; + dword flags; + word NodeCnt,AreaCnt,unused1; + char NetMPath[_MAXPATH], + MsgBase[_MAXPATH], + InBound[_MAXPATH], + OutBound[_MAXPATH], + Unpacker[_MAXPATH], + LogFile[_MAXPATH], + OriginLine[8][_MAXPATH], + StatFile[_MAXPATH], + SwapPath[_MAXPATH], + SemaphorePath[_MAXPATH], + BBSConfigPath[_MAXPATH], + DBQueuePath[_MAXPATH], + unused2[32], + RetearTo[40], + SecurePath[_MAXPATH], + ExtAfter[_MAXPATH-4], + ExtBefore[_MAXPATH-4]; + struct + { + char tag[4]; + char name[_MAXPATH-2]; + char list[2]; /* List prefix character */ + } Packer[8]; + struct + { + byte what; + char object[31]; + word conference; + } CC[10]; + byte security,loglevel; + short def_days,def_messages; + struct /* now obsolete */ + { + Address main; + char domain[28]; + word pointnet; + dword flags; + } oldakas[11]; /* but still maintained */ + word autorenum; + short def_recvdays; + word openQQQs; + word compressafter; + word msglen; + word compressfree; + char TempPath[_MAXPATH]; + byte graphics,BBSSoftware; + char AreaFixHelp[_MAXPATH]; + char Unpackers[9][_MAXPATH]; + word AreaFixFlags; + byte QuietLevel,Buffers; + byte FWACnt,GDCnt; /* # of ForwardAreaFix records, + # of Group Default records */ + struct + { + word flags; + word days[2]; + word msgs[2]; + } rescan_def; + dword duperecords; + struct + { + byte inb; + byte outb; + } arcext; + word AFixRcptLen; + word AkaCnt; + word maxPKT; + byte sharing,sorting; + struct + { + char name[36]; + dword resv; + } sysops[11]; + char AreaFixLog[_MAXPATH]; + char TempInBound[_MAXPATH]; + word maxPKTmsgs; + word RouteCnt; /* # of PackRoute records */ + char resv2[822]; + word MaxAreas,MaxNodes; /* Current max values for this config */ + word NodeRecSize; /* For internal use only, the 'Node' + record will always be written + completely while only the currently + used size will be held in memory + while FE & FESetup is running */ + dword offset; /* This is the offset from the current + file-pointer to the 1st Node */ +} CONFIG5; + +/* To directly access the 'Nodes' and/or 'Areas' while bypassing the */ +/* Extensions, perform an absolute (from beginning of file) seek to */ +/* sizeof(CONFIG) + CONFIG.offset */ + +typedef struct +{ + Address addr; + Address arcdest; /* destination for ARCmail file attaches */ + byte aka; /* 0 ... MAX_AKAS-1 */ + byte autopassive; /* # of days */ + byte newgroup; /* Default group for new areas */ + byte advflags; + word flags; + word sec_level; + char password[9]; /* .PKT password */ + char areafixpw[9]; /* AreaFix password */ + dword groups; /* Bit-field, Byte 0/Bit 7 = 'A' etc. */ + /* false means group is active */ + dword resv; + byte areas[MAX_AREAS/8]; /* Bit-field with MAX_AREAS bits, Byte 0/Bit 7 */ + /* is conference 0, etc. */ +} FeNode5; + +typedef struct +{ + char name[41]; + byte type; + word board; + short messages; + struct + { + word origin : 3; + word group : 5; /* 0 ... MAX_GROUPS-1 */ + word type : 3; + word umlaut : 1; + word aka : 4; /* 0 ... MAX_AKAS-1 */ + } flags; + short days; + word conference; /* 0 ... MAX_AREAS-1 */ + word read_sec,write_sec; + struct + { + word autoadded : 1; + word tinyseen : 1; + word cpd : 1; + word passive : 1; + word keepseen : 1; + word mandatory : 1; + word keepsysop : 1; + word killread : 1; + word disablepsv : 1; + word resv : 7; + } advflags; + word seenbys; /* LSB = Aka0, MSB = Aka15 */ + short recvdays; + dword resv1; + char path[_MAXPATH]; + char desc[42]; +} FeArea5; + + +/********************************************************/ +/* Optional Extensions */ +/********************************************************/ +/* These are the variable length extensions between */ +/* CONFIG and the first Node record. Each extension has */ +/* a header which contains the info about the type and */ +/* the length of the extension. You can read the fields */ +/* using the following algorithm: */ +/* */ +/* offset := 0; */ +/* while (offset */ + +enum AreaFixSendTo { AreaFix = 0, AreaMgr, AreaLink, EchoMgr }; +enum AreaFixAreaListFormat { Areas_BBS = 0, Area_List }; + +typedef struct +{ + word nodenr; + struct + { + word sendto : 3; + word newgroup: 5; + word valid : 1; + word uncond : 1; + word addplus : 1; + word addtear : 1; + word format : 3; + word active : 1; + } flags; + char file[_MAXPATH]; + dword groups; + word sec_level; + char resv[6]; +} ForwardAreaFix; + +#define EH_GROUPS 0x0002 /* 1 record of */ + +typedef struct +{ + char name[MAX_GROUPS][35]; +} GroupNames; + +#define EH_SYSOPNAMES 0x0003 /* CONFIG.NodeCnt * */ + +typedef struct +{ + char name[36]; +} SysopNames; + +#define EH_GRPDEFAULTS 0x0006 /* CONFIG.GDCnt * */ + +typedef struct +{ + byte group; + FeArea5 area; + byte nodes[MAX_NODES/8]; /* MAX_NODES bits */ +} GroupDefaults; + +#define EH_AKAS 0x0007 /* CONFIG.AkaCnt * */ + +typedef struct +{ + Address main; + char domain[28]; + word pointnet; + dword flags; /* unused */ +} SysAddress; + +#define EH_PACKROUTE 0x0009 + +typedef struct +{ + Address dest; + Address routes[MAX_ROUTE]; +} PackRoute; + +#define EH_RA111_MSG 0x0100 /* Original records of BBS systems */ +#define EH_QBBS_MSG 0x0101 +#define EH_SBBS_MSG 0x0102 +#define EH_PB122_MSG 0x0103 /* obsolete */ +#define EH_TAG_MSG 0x0104 +#define EH_RA200_MSG 0x0105 /* See BBS package's documentation */ +#define EH_PB200_MSG 0x0106 /* for details */ + +/********************************************************/ +/* Routines to access Node.areas, Node.groups */ +/********************************************************/ + +#if 0 + +word AddBam(byte *bam,word nr) +{ +byte c=(1<<(7-(nr&7))),d; + + d=bam[nr/8]&c; + bam[nr/8]|=c; + return(d); +} + +void FreeBam(byte *bam,word nr) +{ + bam[nr/8]&=~(1<<(7-(nr&7))); +} + +word GetBam(byte *bam,word nr) +{ + if(bam[nr/8]&(1<<(7-(nr&7)))) return(true); + return(false); +} + +#define IsActive(nr,area) GetBam(Node[nr].areas,area) +#define SetActive(nr,area) AddBam(Node[nr].areas,area) +#define SetDeActive(nr,area) FreeBam(Node[nr].areas,area) + +#endif + + +#if defined(GOLD_CANPACK) +#pragma pack() +#endif + diff --git a/goldlib/gcfg/gxfecho4.cpp b/goldlib/gcfg/gxfecho4.cpp new file mode 100644 index 0000000..f493f17 --- /dev/null +++ b/goldlib/gcfg/gxfecho4.cpp @@ -0,0 +1,159 @@ + +// ------------------------------------------------------------------ +// The Goldware Library. Copyright (C) Odinn Sorensen. +// ------------------------------------------------------------------ +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free +// Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// ------------------------------------------------------------------ +// $Id$ +// ------------------------------------------------------------------ +// Read areas from FastEcho >= 1.10 (config revision level 4) +// ------------------------------------------------------------------ + +#include +#include +#include +#include +#undef GCFG_NOFE +#include +#include + + +// ------------------------------------------------------------------ +// Read FASTECHO.CFG + +void gareafile::ReadFastecho11x(int fh) { + + AreaCfg aa; + + CONFIG4* cfg = (CONFIG4*)throw_calloc(1, sizeof(CONFIG4)); + FeArea4* area = (FeArea4*)throw_calloc(1, sizeof(FeArea4)); + + // Read main config record + read(fh, cfg, sizeof(CONFIG4)); + + // Get usernames + //for(int u=0; u<11; u++) + //CfgUsername(cfg->sysops[u].name); + + // Get Hudson msgbase path + if(*hudsonpath == NUL) + PathCopy(hudsonpath, MapPath(cfg->MsgBase)); + + // Setup aka list + SysAddress* aka = (SysAddress*)throw_calloc(cfg->AkaCnt, sizeof(SysAddress)); + for(int c=0; c<11; c++) + aka[c].main = cfg->oldakas[c].main; + + // Process extended headers + ulong offset = 0; + while(offset < cfg->offset) { + ExtensionHeader ehdr; + read(fh, &ehdr, sizeof(ExtensionHeader)); + offset += sizeof(ExtensionHeader); + switch(ehdr.type) { + case EH_AKAS: + read(fh, aka, cfg->AkaCnt*sizeof(SysAddress)); + break; + default: + lseek(fh, ehdr.offset, SEEK_CUR); + } + offset += ehdr.offset; + } + + // Skip node records + lseek(fh, (long)(cfg->NodeCnt)*(long)sizeof(FeNode4), SEEK_CUR); + + // The *.MSG netmail area + aa.reset(); + aa.aka = CAST(ftn_addr, aka[0].main); + aa.type = GMB_NET; + aa.attr = attribsnet; + aa.msgbase = fidomsgtype; + aa.setpath(cfg->NetMPath); + aa.setdesc("FastEcho Netmail"); + aa.setautoid("NETMAIL"); + AddNewArea(aa); + + // All the echomail areas + for(int n=0; nAreaCnt; n++) { + read(fh, area, sizeof(FeArea4)); + if(area->board != AREA_DELETED) { + aa.reset(); + aa.aka = CAST(ftn_addr, aka[area->flags.aka].main); + switch(area->flags.type) { + case QBBS: + aa.msgbase = GMB_HUDSON; + aa.board = area->board; + break; + case FIDO: + aa.msgbase = fidomsgtype; + aa.setpath(area->path); + break; + case SQUISH: + aa.msgbase = GMB_SQUISH; + aa.setpath(area->path); + break; + case JAM: + aa.msgbase = GMB_JAM; + aa.setpath(area->path); + break; + case PT_BOARD: + default: + // Passthrough or unknown + continue; + } + + switch(area->type) { + case AREA_ECHOMAIL: + aa.type = GMB_ECHO; + aa.attr = attribsecho; + break; + case AREA_NETMAIL: + aa.type = GMB_NET; + aa.attr = attribsnet; + break; + case AREA_LOCAL: + aa.type = GMB_LOCAL; + aa.attr = attribslocal; + break; + case AREA_BADMAILBOARD: + aa.type = GMB_ECHO; + aa.attr = attribsecho; + break; + case AREA_DUPEBOARD: + aa.type = GMB_ECHO; + aa.attr = attribsecho; + break; + default: + // Unknown type + continue; + + } + aa.setdesc(area->desc); + aa.setechoid(area->name); + aa.setorigin(cfg->OriginLine[area->flags.origin]); + aa.groupid = (char)('A' + area->flags.group); + AddNewArea(aa); + } + } + + throw_free(aka); + throw_free(area); + throw_free(cfg); +} + + +// ------------------------------------------------------------------ + diff --git a/goldlib/gcfg/gxfecho5.cpp b/goldlib/gcfg/gxfecho5.cpp new file mode 100644 index 0000000..79aa255 --- /dev/null +++ b/goldlib/gcfg/gxfecho5.cpp @@ -0,0 +1,159 @@ + +// ------------------------------------------------------------------ +// The Goldware Library. Copyright (C) Odinn Sorensen. +// ------------------------------------------------------------------ +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free +// Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// ------------------------------------------------------------------ +// $Id$ +// ------------------------------------------------------------------ +// Read areas from FastEcho 1.41 (config revision level 5) +// ------------------------------------------------------------------ + +#include +#include +#include +#include +#undef GCFG_NOFE +#include +#include + + +// ------------------------------------------------------------------ +// Read FASTECHO.CFG + +void gareafile::ReadFastecho141(int fh) { + + AreaCfg aa; + + CONFIG5* cfg = (CONFIG5*)throw_calloc(1, sizeof(CONFIG5)); + FeArea5* area = (FeArea5*)throw_calloc(1, sizeof(FeArea5)); + + // Read main config record + read(fh, cfg, sizeof(CONFIG5)); + + // Get usernames + //for(int u=0; u<11; u++) + //CfgUsername(cfg->sysops[u].name); + + // Get Hudson msgbase path + if(*hudsonpath == NUL) + PathCopy(hudsonpath, MapPath(cfg->MsgBase)); + + // Setup aka list + SysAddress* aka = (SysAddress*)throw_calloc(cfg->AkaCnt, sizeof(SysAddress)); + for(int c=0; c<11; c++) + aka[c].main = cfg->oldakas[c].main; + + // Process extended headers + ulong offset = 0; + while(offset < cfg->offset) { + ExtensionHeader ehdr; + read(fh, &ehdr, sizeof(ExtensionHeader)); + offset += sizeof(ExtensionHeader); + switch(ehdr.type) { + case EH_AKAS: + read(fh, aka, cfg->AkaCnt*sizeof(SysAddress)); + break; + default: + lseek(fh, ehdr.offset, SEEK_CUR); + } + offset += ehdr.offset; + } + + // Skip node records + lseek(fh, (long)(cfg->NodeCnt)*(long)sizeof(FeNode5), SEEK_CUR); + + // The *.MSG netmail area + aa.reset(); + aa.aka = CAST(ftn_addr, aka[0].main); + aa.type = GMB_NET; + aa.attr = attribsnet; + aa.msgbase = fidomsgtype; + aa.setpath(cfg->NetMPath); + aa.setdesc("FastEcho Netmail"); + aa.setautoid("NETMAIL"); + AddNewArea(aa); + + // All the echomail areas + for(int n=0; nAreaCnt; n++) { + read(fh, area, sizeof(FeArea5)); + if(area->board != AREA_DELETED) { + aa.reset(); + aa.aka = CAST(ftn_addr, aka[area->flags.aka].main); + switch(area->flags.type) { + case QBBS: + aa.msgbase = GMB_HUDSON; + aa.board = area->board; + break; + case FIDO: + aa.msgbase = fidomsgtype; + aa.setpath(area->path); + break; + case SQUISH: + aa.msgbase = GMB_SQUISH; + aa.setpath(area->path); + break; + case JAM: + aa.msgbase = GMB_JAM; + aa.setpath(area->path); + break; + case PT_BOARD: + default: + // Passthrough or unknown + continue; + } + + switch(area->type) { + case AREA_ECHOMAIL: + aa.type = GMB_ECHO; + aa.attr = attribsecho; + break; + case AREA_NETMAIL: + aa.type = GMB_NET; + aa.attr = attribsnet; + break; + case AREA_LOCAL: + aa.type = GMB_LOCAL; + aa.attr = attribslocal; + break; + case AREA_BADMAILBOARD: + aa.type = GMB_ECHO; + aa.attr = attribsecho; + break; + case AREA_DUPEBOARD: + aa.type = GMB_ECHO; + aa.attr = attribsecho; + break; + default: + // Unknown type + continue; + + } + aa.setdesc(area->desc); + aa.setechoid(area->name); + aa.setorigin(cfg->OriginLine[area->flags.origin]); + aa.groupid = (char)('A' + area->flags.group); + AddNewArea(aa); + } + } + + throw_free(aka); + throw_free(area); + throw_free(cfg); +} + + +// ------------------------------------------------------------------ + diff --git a/goldlib/gcfg/gxfecho6.cpp b/goldlib/gcfg/gxfecho6.cpp index 6e8acd4..df5a446 100644 --- a/goldlib/gcfg/gxfecho6.cpp +++ b/goldlib/gcfg/gxfecho6.cpp @@ -200,7 +200,11 @@ void gareafile::ReadFastecho(char* tag) { read(fh, &revision, sizeof(revision)); lseek(fh, 0L, SEEK_SET); // rewind - if(revision == 6) + if(revision == 4) + ReadFastecho11x(fh); + else if(revision == 5) + ReadFastecho141(fh); + else if(revision == 6) ReadFastecho142(fh); else cout << "* Error: FastEcho system file revision level " << revision << " is not supported - Skipping." << endl;