More work towards QWK networking

This commit is contained in:
mysticbbs 2013-08-29 06:04:20 -04:00
parent 37c48d3182
commit 1fe5fbfd2d
58 changed files with 395 additions and 776 deletions

View File

@ -40,10 +40,9 @@ Implementation
Uses Uses
m_Strings, m_Strings,
bbs_Ansi_MenuBox, BBS_Records,
bbs_Core, BBS_Ansi_MenuBox,
bbs_Common, BBS_Core,
bbs_dataBase,
MPL_Execute; MPL_Execute;
Constructor TAnsiMenuHelp.Create; Constructor TAnsiMenuHelp.Create;

View File

@ -6,9 +6,8 @@ Interface
Uses Uses
m_Types, m_Types,
bbs_Ansi_MenuInput, BBS_Records,
bbs_dataBase, BBS_Ansi_MenuInput;
bbs_Common;
Const Const
FormMaxItems = 60; FormMaxItems = 60;
@ -137,8 +136,9 @@ Implementation
Uses Uses
m_FileIO, m_FileIO,
m_Strings, m_Strings,
bbs_Core, BBS_Common,
bbs_Ansi_MenuBox; BBS_Core,
BBS_Ansi_MenuBox;
Constructor TAnsiMenuForm.Create; Constructor TAnsiMenuForm.Create;
Begin Begin

View File

@ -11,11 +11,12 @@ Implementation
Uses Uses
m_FileIO, m_FileIO,
m_Strings, m_Strings,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_DataBase,
bbs_Ansi_MenuBox, BBS_Common,
bbs_Ansi_MenuForm, BBS_Ansi_MenuBox,
bbs_cfg_Common; BBS_Ansi_MenuForm,
BBS_Cfg_Common;
Procedure EditArchive (Var Arc: RecArchive); Procedure EditArchive (Var Arc: RecArchive);
Var Var

View File

@ -6,8 +6,7 @@ Interface
Uses Uses
BBS_Core, BBS_Core,
BBS_Common, BBS_Records;
bbs_dataBase;
Function GetNodeByIndex (Num: LongInt; Var TempNode: RecEchoMailNode) : Boolean; Function GetNodeByIndex (Num: LongInt; Var TempNode: RecEchoMailNode) : Boolean;
Procedure AddExportByBase (Var MBase: RecMessageBase; Idx: LongInt); Procedure AddExportByBase (Var MBase: RecMessageBase; Idx: LongInt);
@ -27,7 +26,9 @@ Uses
bbs_Ansi_MenuBox, bbs_Ansi_MenuBox,
bbs_Ansi_MenuForm, bbs_Ansi_MenuForm,
bbs_cfg_Common, bbs_cfg_Common,
bbs_Cfg_MsgBase; bbs_Cfg_MsgBase,
BBS_Common,
BBS_DataBase;
Function IsExportNode (Var MBase: RecMessageBase; Idx: LongInt) : Boolean; Function IsExportNode (Var MBase: RecMessageBase; Idx: LongInt) : Boolean;
Var Var
@ -239,7 +240,7 @@ Begin
NewIdx := Configuration_MessageBaseEditor(False); NewIdx := Configuration_MessageBaseEditor(False);
If NewIdx <> -1 Then If NewIdx <> -1 Then
If Session.Msgs.GetBaseByIndex(NewIdx, MBase) Then Begin If GetMBaseByIndex(NewIdx, MBase) Then Begin
If MBase.EchoTag = '' Then If MBase.EchoTag = '' Then
ShowMsgBox(0, 'Missing ECHOTAG for ' + strStripPipe(MBase.Name)) ShowMsgBox(0, 'Missing ECHOTAG for ' + strStripPipe(MBase.Name))
Else Else
@ -248,7 +249,7 @@ Begin
End; End;
'D' : If List.ListMax > 0 Then 'D' : If List.ListMax > 0 Then
If ShowMsgBox(1, 'Delete this entry?') Then If ShowMsgBox(1, 'Delete this entry?') Then
If Session.Msgs.GetBaseByIndex (strS2I(strWordGet(1, List.List[List.Picked]^.Name, ' ')), MBase) Then Begin If GetMBaseByIndex (strS2I(strWordGet(1, List.List[List.Picked]^.Name, ' ')), MBase) Then Begin
RemoveExportFromBase(MBase, Node.Index); RemoveExportFromBase(MBase, Node.Index);
End; End;

View File

@ -12,11 +12,12 @@ Uses
m_Strings, m_Strings,
m_DateTime, m_DateTime,
m_FileIO, m_FileIO,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_DataBase,
bbs_ansi_MenuBox, BBS_Common,
bbs_ansi_MenuForm, BBS_Ansi_MenuBox,
bbs_cfg_Common; BBS_Ansi_MenuForm,
BBS_Cfg_Common;
Procedure EditEvent (Var Event: RecEvent); Procedure EditEvent (Var Event: RecEvent);
Var Var

View File

@ -13,11 +13,12 @@ Uses
m_Strings, m_Strings,
m_FileIO, m_FileIO,
m_QuickSort, m_QuickSort,
bbs_Ansi_MenuBox, BBS_Ansi_MenuBox,
bbs_Ansi_MenuForm, BBS_Ansi_MenuForm,
bbs_Common, BBS_Records,
bbs_DataBase, BBS_DataBase,
bbs_cfg_Common; BBS_Common,
BBS_Cfg_Common;
Type Type
RecFileBaseFile = File of RecFileBase; RecFileBaseFile = File of RecFileBase;

View File

@ -9,11 +9,12 @@ Implementation
Uses Uses
m_FileIO, m_FileIO,
m_Strings, m_Strings,
bbs_Ansi_MenuBox, BBS_Ansi_MenuBox,
bbs_Ansi_MenuForm, BBS_Ansi_MenuForm,
bbs_cfg_Common, BBS_Cfg_Common,
bbs_dataBase, BBS_Records,
bbs_Common; BBS_DataBase,
BBS_Common;
Procedure EditGroup (Var Group: RecGroup); Procedure EditGroup (Var Group: RecGroup);
Var Var

View File

@ -19,6 +19,7 @@ Uses
bbs_Ansi_MenuForm, bbs_Ansi_MenuForm,
BBS_Core, BBS_Core,
BBS_Common, BBS_Common,
BBS_Records,
BBS_MenuData, BBS_MenuData,
bbs_dataBase, bbs_dataBase,
bbs_cfg_Theme, bbs_cfg_Theme,

View File

@ -18,8 +18,9 @@ Uses
bbs_Ansi_MenuForm, bbs_Ansi_MenuForm,
bbs_Cfg_Common, bbs_Cfg_Common,
bbs_Cfg_EchoMail, bbs_Cfg_EchoMail,
bbs_Common, BBS_Records,
bbs_dataBase; BBS_DataBase,
BBS_Common;
Type Type
RecMessageBaseFile = File of RecMessageBase; RecMessageBaseFile = File of RecMessageBase;

View File

@ -11,11 +11,12 @@ Implementation
Uses Uses
m_FileIO, m_FileIO,
m_Strings, m_Strings,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_DataBase,
bbs_ansi_MenuBox, BBS_Common,
bbs_ansi_MenuForm, BBS_Ansi_MenuBox,
bbs_cfg_Common; BBS_Ansi_MenuForm,
BBS_Cfg_Common;
Procedure EditProtocol (Var Prot: RecProtocol); Procedure EditProtocol (Var Prot: RecProtocol);
Var Var

View File

@ -11,11 +11,11 @@ Implementation
Uses Uses
m_Strings, m_Strings,
m_FileIO, m_FileIO,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_DataBase,
bbs_Ansi_MenuBox, BBS_Ansi_MenuBox,
bbs_Ansi_MenuForm, BBS_Ansi_MenuForm,
bbs_Cfg_Common; BBS_Cfg_Common;
Procedure EditLevel (Var Sec: RecSecurity); Procedure EditLevel (Var Sec: RecSecurity);
Var Var

View File

@ -26,10 +26,10 @@ Implementation
Uses Uses
m_Strings, m_Strings,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_DataBase,
bbs_ansi_MenuBox, BBS_Ansi_MenuBox,
bbs_ansi_MenuForm; BBS_Ansi_MenuForm;
Procedure Configuration_SysPaths; Procedure Configuration_SysPaths;
Var Var

View File

@ -12,13 +12,14 @@ Uses
m_Types, m_Types,
m_FileIO, m_FileIO,
m_Strings, m_Strings,
bbs_Ansi_MenuBox, BBS_Ansi_MenuBox,
bbs_Ansi_MenuForm, BBS_Ansi_MenuForm,
bbs_Ansi_MenuInput, BBS_Ansi_MenuInput,
bbs_Core, BBS_Core,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_DataBase,
bbs_Cfg_Common; BBS_Common,
BBS_Cfg_Common;
(* (*
Procedure CompileTheme (Var Theme: RecTheme); Procedure CompileTheme (Var Theme: RecTheme);

View File

@ -3,8 +3,7 @@ Unit bbs_Cfg_UserEdit;
Interface Interface
Uses Uses
bbs_Common, BBS_Records;
bbs_dataBase;
Procedure Configuration_EditUser (Var U: RecUser); Procedure Configuration_EditUser (Var U: RecUser);
Procedure Configuration_UserEditor; Procedure Configuration_UserEditor;
@ -22,6 +21,8 @@ Uses
bbs_io, bbs_io,
bbs_Core, bbs_Core,
bbs_General, bbs_General,
BBS_Common,
BBS_DataBase,
bbs_Cfg_SecLevel; bbs_Cfg_SecLevel;
Procedure Configuration_EditUser (Var U: RecUser); Procedure Configuration_EditUser (Var U: RecUser);

View File

@ -18,7 +18,7 @@ Uses
m_Input, m_Input,
m_DateTime, m_DateTime,
m_FileIO, m_FileIO,
bbs_dataBase; BBS_Records;
// This unit is very old (like 1994) and its functions need to be phased out // This unit is very old (like 1994) and its functions need to be phased out
// This is the stuff that hasn't been worked into a class somewhere or // This is the stuff that hasn't been worked into a class somewhere or
@ -26,7 +26,6 @@ Uses
Const Const
WinConsoleTitle = mysSoftwareID + ' Node '; WinConsoleTitle = mysSoftwareID + ' Node ';
CopyID = 'Copyright (C) ' + mysCopyYear + ' By James Coyle';
DateTypeStr : Array[1..4] of String[8] = ('MM/DD/YY', 'DD/MM/YY', 'YY/DD/MM', 'Ask '); DateTypeStr : Array[1..4] of String[8] = ('MM/DD/YY', 'DD/MM/YY', 'YY/DD/MM', 'Ask ');
Var Var
@ -36,7 +35,6 @@ Var
ConfigFile : File of RecConfig; ConfigFile : File of RecConfig;
ChatFile : File of ChatRec; ChatFile : File of ChatRec;
RoomFile : File of RoomRec; RoomFile : File of RoomRec;
Chat : ChatRec;
Room : RoomRec; Room : RoomRec;
LastOnFile : File of RecLastOn; LastOnFile : File of RecLastOn;
LastOn : RecLastOn; LastOn : RecLastOn;
@ -60,6 +58,7 @@ Implementation
Uses Uses
DOS, DOS,
bbs_Core, bbs_Core,
BBS_DataBase,
{$IFNDEF UNIX} {$IFNDEF UNIX}
bbs_SysOpChat, bbs_SysOpChat,
{$ENDIF} {$ENDIF}

View File

@ -13,8 +13,7 @@ Uses
m_Strings, m_Strings,
m_Pipe, m_Pipe,
m_DateTime, m_DateTime,
bbs_dataBase, BBS_Records,
// BBS_Common,
BBS_IO, BBS_IO,
BBS_MsgBase, BBS_MsgBase,
BBS_User, BBS_User,
@ -40,6 +39,7 @@ Type
ThemeFile : File of RecTheme; ThemeFile : File of RecTheme;
VoteFile : File of VoteRec; VoteFile : File of VoteRec;
Vote : VoteRec; Vote : VoteRec;
Chat : ChatRec;
CommHandle : LongInt; CommHandle : LongInt;
ShutDown : Boolean; ShutDown : Boolean;
TempPath : String; TempPath : String;
@ -103,6 +103,9 @@ Var
Implementation Implementation
Uses
BBS_DataBase;
Constructor TBBSCore.Create; Constructor TBBSCore.Create;
Begin Begin
Inherited Create; Inherited Create;

View File

@ -1,20 +1,14 @@
Unit bbs_dataBase; Unit BBS_DataBase;
// This unit us a work in progress designed to move lower level functions
// away from session-tied objects and into a unit usable for external
// utilities. Keeping them procedural instead of object-based also has some
// additional smartlinking benefits in the long run.
// The drawback of a non-abstract object is that we cannot easily define
// alternate data sources such as a INI or SQL backend. Because of that,
// this MAY change in the future -- particularly if we can smartlink at the
// method level of classes in future FP releases.
{$I M_OPS.PAS} {$I M_OPS.PAS}
Interface Interface
{$I RECORDS.PAS} Uses
BBS_Records,
BBS_MsgBase_ABS,
BBS_MsgBase_JAM,
BBS_MsgBase_Squish;
Var Var
bbsCfg : RecConfig; bbsCfg : RecConfig;
@ -33,6 +27,7 @@ Function PutBaseConfiguration (Var TempCfg: RecConfig) : Boolean;
// MESSAGE BASE // MESSAGE BASE
Function MBaseOpenCreate (Var Msg: PMsgBaseABS; Var Area: RecMessageBase; TP: String) : Boolean;
Function GetMBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; Function GetMBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Procedure GetMessageScan (UN: Cardinal; TempBase: RecMessageBase; Var TempScan: MScanRec); Procedure GetMessageScan (UN: Cardinal; TempBase: RecMessageBase; Var TempScan: MScanRec);
Procedure PutMessageScan (UN: Cardinal; TempBase: RecMessageBase; TempScan: MScanRec); Procedure PutMessageScan (UN: Cardinal; TempBase: RecMessageBase; TempScan: MScanRec);
@ -41,11 +36,16 @@ Procedure PutMessageScan (UN: Cardinal; TempBase: RecMessageBase; TempSca
Function GetTotalFiles (Var TempBase: RecFileBase) : LongInt; Function GetTotalFiles (Var TempBase: RecFileBase) : LongInt;
// USER
Function IsThisUser (U: RecUser; Str: String) : Boolean;
Implementation Implementation
Uses Uses
DOS, DOS,
m_FileIO; m_FileIO,
m_Strings;
Function GetBaseConfiguration (UseEnv: Boolean; Var TempCfg: RecConfig) : Byte; Function GetBaseConfiguration (UseEnv: Boolean; Var TempCfg: RecConfig) : Byte;
Var Var
@ -168,6 +168,33 @@ Begin
Close (ScanFile); Close (ScanFile);
End; End;
Function MBaseOpenCreate (Var Msg: PMsgBaseABS; Var Area: RecMessageBase; TP: String) : Boolean;
Begin
Result := False;
Case Area.BaseType of
0 : Msg := New(PMsgBaseJAM, Init);
1 : Msg := New(PMsgBaseSquish, Init);
End;
Msg^.SetMsgPath (Area.Path + Area.FileName);
Msg^.SetTempFile (TP + 'msgbuf.');
If Not Msg^.OpenMsgBase Then
If Not Msg^.CreateMsgBase (Area.MaxMsgs, Area.MaxAge) Then Begin
Dispose (Msg, Done);
Exit;
End Else
If Not Msg^.OpenMsgBase Then Begin
Dispose (Msg, Done);
Exit;
End;
Result := True;
End;
Function GetTotalFiles (Var TempBase: RecFileBase) : LongInt; Function GetTotalFiles (Var TempBase: RecFileBase) : LongInt;
Begin Begin
Result := 0; Result := 0;
@ -180,6 +207,12 @@ Begin
Result := Result DIV SizeOf(RecFileList); Result := Result DIV SizeOf(RecFileList);
End; End;
Function IsThisUser (U: RecUser; Str: String) : Boolean;
Begin
Str := strUpper(Str);
Result := (strUpper(U.RealName) = Str) or (strUpper(U.Handle) = Str);
End;
Initialization Initialization
bbsCfgStatus := GetBaseConfiguration(True, bbsCfg); bbsCfgStatus := GetBaseConfiguration(True, bbsCfg);

View File

@ -18,10 +18,11 @@ Uses
m_Strings, m_Strings,
m_DateTime, m_DateTime,
m_FileIO, m_FileIO,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_Common,
bbs_Core, BBS_DataBase,
bbs_User; BBS_Core,
BBS_User;
Const Const
Ending : String[2] = #13#10; Ending : String[2] = #13#10;

View File

@ -6,7 +6,7 @@ Interface
Uses Uses
m_FileIO, m_FileIO,
bbs_MsgBase_ANSI; BBS_MsgBase_Ansi;
Const Const
fseMaxCutText = 60; fseMaxCutText = 60;
@ -89,10 +89,9 @@ Implementation
Uses Uses
m_Strings, m_Strings,
bbs_Core, BBS_Records,
bbs_DataBase, BBS_Core,
bbs_Common, BBS_Ansi_MenuBox;
bbs_Ansi_MenuBox;
Constructor TEditorANSI.Create (Var O: Pointer; TemplateFile: String); Constructor TEditorANSI.Create (Var O: Pointer; TemplateFile: String);
Begin Begin

View File

@ -12,11 +12,12 @@ Implementation
Uses Uses
m_Strings, m_Strings,
m_FileIO, m_FileIO,
bbs_Common, BBS_Common,
bbs_DataBase, BBS_Records,
bbs_Core, BBS_DataBase,
bbs_FileBase, BBS_Core,
bbs_User; BBS_FileBase,
BBS_User;
Var Var
CurLine : Integer; CurLine : Integer;

View File

@ -19,11 +19,12 @@ Uses
m_Strings, m_Strings,
m_FileIO, m_FileIO,
m_DateTime, m_DateTime,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_Common,
bbs_General, BBS_DataBase,
bbs_NodeInfo, BBS_General,
bbs_Ansi_MenuBox, BBS_NodeInfo,
BBS_Ansi_MenuBox,
AView, AView,
{$IFDEF USEALTPROT} {$IFDEF USEALTPROT}
m_Prot_Base, m_Prot_Base,

View File

@ -11,8 +11,8 @@ Uses
Windows, Windows,
bbs_SysopChat, bbs_SysopChat,
{$ENDIF} {$ENDIF}
bbs_Common, BBS_Records,
bbs_database, BBS_Common,
bbs_Edit_ANSI, bbs_Edit_ANSI,
bbs_Edit_Line; bbs_Edit_Line;
@ -51,6 +51,7 @@ Uses
m_FileIO, m_FileIO,
m_QuickSort, m_QuickSort,
bbs_Core, bbs_Core,
BBS_DataBase,
bbs_MsgBase_Ansi, bbs_MsgBase_Ansi,
bbs_NodeInfo; bbs_NodeInfo;

View File

@ -18,8 +18,7 @@ Uses
m_FileIO, m_FileIO,
m_Strings, m_Strings,
m_Term_Ansi, m_Term_Ansi,
bbs_Common, BBS_Records;
bbs_dataBase;
Const Const
TBBSIOBufferSize = 4 * 1024 - 1; TBBSIOBufferSize = 4 * 1024 - 1;
@ -119,7 +118,9 @@ Implementation
Uses Uses
DOS, DOS,
bbs_Core, BBS_Core,
BBS_DataBase,
BBS_Common,
bbs_General, bbs_General,
bbs_NodeInfo; bbs_NodeInfo;
@ -602,7 +603,7 @@ Begin
'G' : LastMCIValue := strI2S(DaysAgo(TBBSCore(Core).User.ThisUser.Birthday, 1) DIV 365); 'G' : LastMCIValue := strI2S(DaysAgo(TBBSCore(Core).User.ThisUser.Birthday, 1) DIV 365);
'O' : AllowAbort := False; 'O' : AllowAbort := False;
'S' : LastMCIValue := OutON(TBBSCore(Core).User.ThisUser.SigUse); 'S' : LastMCIValue := OutON(TBBSCore(Core).User.ThisUser.SigUse);
'V' : LastMCIValue := OutYN(Chat.Available); 'V' : LastMCIValue := OutYN(Session.Chat.Available);
End; End;
'B' : Case Code[2] of 'B' : Case Code[2] of
'D' : If TBBSCore(Core).LocalMode Then 'D' : If TBBSCore(Core).LocalMode Then
@ -656,7 +657,7 @@ Begin
FmtString := True; FmtString := True;
FmtType := 12; FmtType := 12;
End; End;
'L' : LastMCIValue := OutON(Chat.Invisible); 'L' : LastMCIValue := OutON(Session.Chat.Invisible);
'S' : Begin 'S' : Begin
FmtString := True; FmtString := True;
FmtType := 14; FmtType := 14;

View File

@ -6,7 +6,7 @@ Interface
Uses Uses
m_Strings, m_Strings,
bbs_dataBase; BBS_Records;
Type Type
TMenuData = Class TMenuData = Class

View File

@ -5,8 +5,9 @@ Unit BBS_Menus;
Interface Interface
Uses Uses
BBS_Records,
BBS_Common, BBS_Common,
bbs_dataBase, BBS_DataBase,
BBS_MenuData, BBS_MenuData,
MPL_Execute; MPL_Execute;

View File

@ -7,8 +7,8 @@ Interface
Uses Uses
m_FileIO, m_FileIO,
m_DateTime, m_DateTime,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_Common,
bbs_General, bbs_General,
bbs_MsgBase_ABS, bbs_MsgBase_ABS,
bbs_MsgBase_JAM, bbs_MsgBase_JAM,
@ -35,12 +35,12 @@ Type
Destructor Destroy; Override; Destructor Destroy; Override;
Function IsQuotedText (Str: String) : Boolean; Function IsQuotedText (Str: String) : Boolean;
Function OpenCreateBase (Var Msg: PMsgBaseABS; Var Area: RecMessageBase) : Boolean; // Function OpenCreateBase (Var Msg: PMsgBaseABS; Var Area: RecMessageBase) : Boolean;
Procedure AppendMessageText (Var Msg: PMsgBaseABS; Lines: Integer; ReplyID: String); Procedure AppendMessageText (Var Msg: PMsgBaseABS; Lines: Integer; ReplyID: String);
Procedure AssignMessageData (Var Msg: PMsgBaseABS; Var TempBase: RecMessageBase); Procedure AssignMessageData (Var Msg: PMsgBaseABS; Var TempBase: RecMessageBase);
Function GetBaseByNum (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; Function GetBaseByNum (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Function GetBaseCompressed (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; Function GetBaseCompressed (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Function GetBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; // Function GetBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Function GetMessageStats (List, ShowPrompt, ShowYou: Boolean; Var ListPtr: LongInt; Var TempBase: RecMessageBase; NoFrom, NoRead: Boolean; Var Total, New, Yours: LongInt) : Boolean; Function GetMessageStats (List, ShowPrompt, ShowYou: Boolean; Var ListPtr: LongInt; Var TempBase: RecMessageBase; NoFrom, NoRead: Boolean; Var Total, New, Yours: LongInt) : Boolean;
Procedure GetMailStats (Var Total, UnRead: LongInt); Procedure GetMailStats (Var Total, UnRead: LongInt);
Function GetMatchedAddress (Orig, Dest: RecEchoMailAddr) : RecEchoMailAddr; Function GetMatchedAddress (Orig, Dest: RecEchoMailAddr) : RecEchoMailAddr;
@ -80,6 +80,9 @@ Implementation
Uses Uses
m_Strings, m_Strings,
// BBS_Records,
// BBS_Common,
BBS_DataBase,
bbs_Core, bbs_Core,
bbs_User, bbs_User,
bbs_NodeInfo, bbs_NodeInfo,
@ -303,6 +306,7 @@ Begin
Result := (Temp > 0) and (Temp < 5); Result := (Temp > 0) and (Temp < 5);
End; End;
(*
Function TMsgBase.OpenCreateBase (Var Msg: PMsgBaseABS; Var Area: RecMessageBase) : Boolean; Function TMsgBase.OpenCreateBase (Var Msg: PMsgBaseABS; Var Area: RecMessageBase) : Boolean;
Begin Begin
Result := False; Result := False;
@ -327,6 +331,7 @@ Begin
Result := True; Result := True;
End; End;
*)
Function TMsgBase.GetBaseByNum (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; Function TMsgBase.GetBaseByNum (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Var Var
@ -374,6 +379,7 @@ Begin
Result := Count = Num; Result := Count = Num;
End; End;
(*
Function TMsgBase.GetBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; Function TMsgBase.GetBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Var Var
F : File; F : File;
@ -395,6 +401,7 @@ Begin
Close (F); Close (F);
End; End;
*)
Function TMsgBase.GetTotalBases (Compressed: Boolean) : LongInt; Function TMsgBase.GetTotalBases (Compressed: Boolean) : LongInt;
Var Var
@ -429,7 +436,7 @@ Begin
If TempBase.Name = 'None' Then Exit; If TempBase.Name = 'None' Then Exit;
If OpenCreateBase(TempMsg, TempBase) Then Begin If MBaseOpenCreate(TempMsg, TempBase, Session.TempPath) Then Begin
Result := TempMsg^.NumberOfMsgs; Result := TempMsg^.NumberOfMsgs;
TempMsg^.CloseMsgBase; TempMsg^.CloseMsgBase;
@ -449,7 +456,7 @@ Begin
If TempBase.Name = 'None' Then Exit; If TempBase.Name = 'None' Then Exit;
If OpenCreateBase(TempMsg, TempBase) Then Begin If MBaseOpenCreate(TempMsg, TempBase, Session.TempPath) Then Begin
Total := TempMsg^.NumberOfMsgs; Total := TempMsg^.NumberOfMsgs;
TempMsg^.SeekFirst(TempMsg^.GetLastRead(Session.User.UserNum) + 1); TempMsg^.SeekFirst(TempMsg^.GetLastRead(Session.User.UserNum) + 1);
@ -550,7 +557,7 @@ Begin
Read (MBaseFile, TempBase); Read (MBaseFile, TempBase);
Close (MBaseFile); Close (MBaseFile);
If OpenCreateBase (MsgBase, TempBase) Then Begin If MBaseOpenCreate (MsgBase, TempBase, Session.TempPath) Then Begin
MsgBase^.SeekFirst (1); MsgBase^.SeekFirst (1);
While MsgBase^.SeekFound Do Begin While MsgBase^.SeekFound Do Begin
@ -1404,7 +1411,7 @@ Begin
If Editor(Lines, ColumnValue[Session.Theme.ColumnSize] - 2, mysMaxMsgLines, False, fn_tplMsgEdit, Subj) Then Begin If Editor(Lines, ColumnValue[Session.Theme.ColumnSize] - 2, mysMaxMsgLines, False, fn_tplMsgEdit, Subj) Then Begin
Session.io.OutFull (Session.GetPrompt(107)); Session.io.OutFull (Session.GetPrompt(107));
If Not OpenCreateBase(MsgNew, ReplyBase) Then Exit; If Not MBaseOpenCreate(MsgNew, ReplyBase, Session.TempPath) Then Exit;
AssignMessageData(MsgNew, ReplyBase); AssignMessageData(MsgNew, ReplyBase);
@ -1666,7 +1673,7 @@ Var
Session.io.OutFullLn (Session.GetPrompt(318)); Session.io.OutFullLn (Session.GetPrompt(318));
If Not OpenCreateBase(MsgNew, TempBase) Then Break; If Not MBaseOpenCreate(MsgNew, TempBase, Session.TempPath) Then Break;
MsgNew^.StartNewMsg; MsgNew^.StartNewMsg;
@ -3151,7 +3158,7 @@ Begin
{ notifications out to the sysop for various things (configurable) } { notifications out to the sysop for various things (configurable) }
{ also could be used in mass email rewrite and qwk .REP rewrite } { also could be used in mass email rewrite and qwk .REP rewrite }
If Not OpenCreateBase(MsgBase, MBase) Then Begin If Not MBaseOpenCreate(MsgBase, MBase, Session.TempPath) Then Begin
MBase := Old; MBase := Old;
Session.User.IgnoreGroup := SaveGroup; Session.User.IgnoreGroup := SaveGroup;
@ -3238,7 +3245,7 @@ Begin
Exit; Exit;
End; End;
If OpenCreateBase (MsgBase, MBase) Then Begin If MBaseOpenCreate (MsgBase, MBase, Session.TempPath) Then Begin
MsgBase^.SeekFirst (1); MsgBase^.SeekFirst (1);
While MsgBase^.SeekFound Do Begin While MsgBase^.SeekFound Do Begin
@ -3289,6 +3296,7 @@ End;
Procedure TMsgBase.SetMessagePointers (ForceGlobal: Boolean); Procedure TMsgBase.SetMessagePointers (ForceGlobal: Boolean);
Var Var
NewDate : LongInt; NewDate : LongInt;
TempBase : RecMessageBase;
Procedure UpdateBase; Procedure UpdateBase;
Var Var
@ -3296,12 +3304,12 @@ Var
Begin Begin
Found := False; Found := False;
Case MBase.BaseType of Case TempBase.BaseType of
0 : MsgBase := New(PMsgBaseJAM, Init); 0 : MsgBase := New(PMsgBaseJAM, Init);
1 : MsgBase := New(PMsgBaseSquish, Init); 1 : MsgBase := New(PMsgBaseSquish, Init);
End; End;
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName); MsgBase^.SetMsgPath (TempBase.Path + TempBase.FileName);
If MsgBase^.OpenMsgBase Then Begin If MsgBase^.OpenMsgBase Then Begin
MsgBase^.SeekFirst(1); MsgBase^.SeekFirst(1);
@ -3344,14 +3352,18 @@ Begin
If ForceGlobal Then Begin If ForceGlobal Then Begin
ioReset (MBaseFile, SizeOf(RecMessageBase), fmRWDN); ioReset (MBaseFile, SizeOf(RecMessageBase), fmRWDN);
ioRead (MBaseFile, MBase); ioRead (MBaseFile, TempBase);
While Not Eof(MBaseFile) Do Begin While Not Eof(MBaseFile) Do Begin
ioRead (MBaseFile, MBase); ioRead (MBaseFile, TempBase);
UpdateBase; UpdateBase;
End; End;
End Else End Else Begin
TempBase := MBase;
UpdateBase; UpdateBase;
End;
End; End;
Procedure TMsgBase.MessageNewScan (Data: String); Procedure TMsgBase.MessageNewScan (Data: String);
@ -3844,7 +3856,7 @@ Begin
// 3) add autosig? if we cannot use the assignmsgdata things // 3) add autosig? if we cannot use the assignmsgdata things
Result := False; Result := False;
If Not OpenCreateBase(Msg, mArea) Then Exit; If Not MBaseOpenCreate(Msg, mArea, Session.TempPath) Then Exit;
Msg^.StartNewMsg; Msg^.StartNewMsg;
Msg^.SetLocal (True); Msg^.SetLocal (True);
@ -4238,7 +4250,7 @@ Var
Begin Begin
MsgAdded := 0; MsgAdded := 0;
If Not OpenCreateBase(MsgBase, MBase) Then Exit; If Not MBaseOpenCreate(MsgBase, MBase, Session.TempPath) Then Exit;
Session.io.OutFull (Session.GetPrompt(231)); Session.io.OutFull (Session.GetPrompt(231));
@ -4389,7 +4401,7 @@ Begin
FileMode := 66; FileMode := 66;
Old := MBase; Old := MBase;
Temp := strPadR('Produced By ' + mysSoftwareID + ' v' + mysVersion + '. ' + CopyID, 128, ' '); Temp := strPadR('Produced By ' + mysSoftwareID + ' v' + mysVersion + '. ' + mysCopyNotice, 128, ' ');
Assign (DataFile, Session.TempPath + 'messages.dat'); Assign (DataFile, Session.TempPath + 'messages.dat');
ReWrite (DataFile, 1); ReWrite (DataFile, 1);
@ -4484,13 +4496,14 @@ Begin
Dispose(MsgBase, Done); Dispose(MsgBase, Done);
End; End;
Close (QwkLRFile); Close (QwkLRFile);
Close (MBaseFile);
End; End;
End Else End Else
Session.io.OutFullLn (Session.GetPrompt(228)); Session.io.OutFullLn (Session.GetPrompt(228));
Session.User.IgnoreGroup := False; Session.User.IgnoreGroup := False;
Close (MBaseFile); // Close (MBaseFile);
MBase := Old; MBase := Old;
@ -4521,7 +4534,7 @@ Var
Begin Begin
OldBase := MBase; OldBase := MBase;
If GetBaseByIndex(Idx, MBase) Then Begin If GetMBaseByIndex(Idx, MBase) Then Begin
GetMessageScan; GetMessageScan;
MScan.QwkScan := Mode; MScan.QwkScan := Mode;
@ -4580,9 +4593,9 @@ Begin
QwkBlock[0] := #7; QwkBlock[0] := #7;
If GetBaseByIndex(strS2I(QwkBlock), TempBase) Then Begin If GetMBaseByIndex(strS2I(QwkBlock), TempBase) Then Begin
If OpenCreateBase(MsgBase, TempBase) Then Begin If MBaseOpenCreate(MsgBase, TempBase, Session.TempPath) Then Begin
AssignMessageData(MsgBase, TempBase); AssignMessageData(MsgBase, TempBase);

View File

@ -7,7 +7,7 @@ Unit BBS_MsgBase_ABS;
Interface Interface
Uses Uses
bbs_dataBase; BBS_Records;
Type Type
MsgMailType = (mmtNormal, mmtEchoMail, mmtNetMail); MsgMailType = (mmtNormal, mmtEchoMail, mmtNetMail);

View File

@ -6,8 +6,7 @@ Interface
Uses Uses
m_Strings, m_Strings,
BBS_Common, BBS_Records;
bbs_dataBase;
Type Type
RecAnsiBufferChar = Record RecAnsiBufferChar = Record

View File

@ -11,9 +11,9 @@ Interface
Uses Uses
m_Strings, m_Strings,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_Common,
bbs_MsgBase_ABS; BBS_MsgBase_ABS;
Const Const
JamIdxBufSize = 200; JamIdxBufSize = 200;

View File

@ -1,19 +1,13 @@
Unit bbs_MsgBase_QWK; Unit bbs_MsgBase_QWK;
// networking notes:
// no control files
// no file list
// no index files
// extended = selectable by user's setting
// archive = selectable by user's setting
{$I M_OPS.PAS} {$I M_OPS.PAS}
Interface Interface
Uses Uses
m_FileIO, m_FileIO,
bbs_DataBase; BBS_Records,
BBS_DataBase;
Const Const
QWK_EOL = #13#10; QWK_EOL = #13#10;
@ -49,25 +43,28 @@ Type
End; End;
TQWKEngine_HasAccess = Function (AcsStr: String) : Boolean; TQWKEngine_HasAccess = Function (AcsStr: String) : Boolean;
TQWKEngine_Status = Procedure (Sender: Pointer; State: Byte);
TQWKEngine = Class TQWKEngine = Class
StatusUpdate : TQWKEngine_Status;
HasAccess : TQWKEngine_HasAccess;
IsExtended : Boolean; IsExtended : Boolean;
IsNetworked : Boolean; IsNetworked : Boolean;
WorkPath : String; WorkPath : String;
PacketID : String; PacketID : String;
UserRecord : RecUser; UserRecord : RecUser;
UserNumber : Cardinal; UserNumber : Cardinal;
HasAccess : TQWKEngine_HasAccess; TotalMessages : LongInt;
TotalMessages : Cardinal; TotalBases : LongInt;
TotalBases : Cardinal;
RepOK : LongInt; RepOK : LongInt;
RepFailed : LongInt; RepFailed : LongInt;
RepBaseAdd : LongInt; RepBaseAdd : LongInt;
RepBaseDel : LongInt; RepBaseDel : LongInt;
DataFile : TFileBuffer; DataFile : TFileBuffer;
MBase : RecMessageBase;
Constructor Create (QwkPath, QwkID: String; UN: Cardinal; UR: RecUser); Constructor Create (QwkPath, QwkID: String; UN: Cardinal; UR: RecUser);
Procedure LONG2MSB (Index : LongInt; Var MS : BSingle); Procedure LONG2MSB (Index: LongInt; Var MS: BSingle);
Procedure WriteDOORID; Procedure WriteDOORID;
Procedure WriteTOREADEREXT; Procedure WriteTOREADEREXT;
Procedure WriteCONTROLDAT; Procedure WriteCONTROLDAT;
@ -80,7 +77,10 @@ Implementation
Uses Uses
m_Strings, m_Strings,
m_DateTime; m_DateTime,
BBS_MsgBase_ABS,
BBS_MsgBase_JAM,
BBS_MsgBase_Squish;
Constructor TQWKEngine.Create (QwkPath, QwkID: String; UN: Cardinal; UR: RecUser); Constructor TQWKEngine.Create (QwkPath, QwkID: String; UN: Cardinal; UR: RecUser);
Begin Begin
@ -208,7 +208,7 @@ Begin
Write (TempFile, QWK_EOL); Write (TempFile, QWK_EOL);
Write (TempFile, QWK_EOL); Write (TempFile, QWK_EOL);
Write (TempFile, bbsCfg.SysopName + QWK_EOL); Write (TempFile, bbsCfg.SysopName + QWK_EOL);
Write (TempFile, '0,' + bbsCfg.qwkBBSID + QWK_EOL); Write (TempFile, '0,' + PacketID + QWK_EOL);
Write (TempFile, DateDos2Str(CurDateDos, 1), ',', TimeDos2Str(CurDateDos, 0) + QWK_EOL); Write (TempFile, DateDos2Str(CurDateDos, 1), ',', TimeDos2Str(CurDateDos, 0) + QWK_EOL);
Write (TempFile, strUpper(UserRecord.Handle) + QWK_EOL); Write (TempFile, strUpper(UserRecord.Handle) + QWK_EOL);
Write (TempFile, QWK_EOL); Write (TempFile, QWK_EOL);
@ -254,6 +254,7 @@ Var
LastRead : LongInt; LastRead : LongInt;
QwkIndex : LongInt; QwkIndex : LongInt;
TooBig : Boolean; TooBig : Boolean;
MsgBase : PMsgBaseABS;
Procedure DoString (Str: String); Procedure DoString (Str: String);
Var Var
@ -275,7 +276,7 @@ Var
Begin Begin
MsgAdded := 0; MsgAdded := 0;
If Not OpenCreateBase(MsgBase, MBase) Then Exit; If Not MBaseOpenCreate(MsgBase, MBase, WorkPath) Then Exit;
LastRead := MsgBase^.GetLastRead(UserNumber) + 1; LastRead := MsgBase^.GetLastRead(UserNumber) + 1;
@ -285,24 +286,24 @@ Begin
If Not IsNetworked Then If Not IsNetworked Then
If ((bbsCfg.QwkMaxBase > 0) and (MsgAdded = bbsCfg.QwkMaxBase)) or If ((bbsCfg.QwkMaxBase > 0) and (MsgAdded = bbsCfg.QwkMaxBase)) or
((bbsCfg.QwkMaxPacket > 0) and (TotalMsgs = bbsCfg.QwkMaxPacket)) Then Break; ((bbsCfg.QwkMaxPacket > 0) and (TotalMessages = bbsCfg.QwkMaxPacket)) Then Break;
MsgBase^.MsgStartUp; MsgBase^.MsgStartUp;
If MsgBase^.IsPriv And Not Session.User.IsThisUser(MsgBase^.GetTo) Then Begin If MsgBase^.IsPriv And Not IsThisUser(UserRecord, MsgBase^.GetTo) Then Begin
MsgBase^.SeekNext; MsgBase^.SeekNext;
Continue; Continue;
End; End;
Inc (MsgAdded); Inc (MsgAdded);
Inc (TotalMsgs); Inc (TotalMessages);
LastRead := MsgBase^.GetMsgNum; LastRead := MsgBase^.GetMsgNum;
Chunks := 0; Chunks := 0;
BufStr := ''; BufStr := '';
TooBig := False; TooBig := False;
QwkIndex := FileSize(DataFile) DIV 128 + 1; QwkIndex := DataFile.FileSizeRaw DIV 128 + 1;
MsgBase^.MsgTxtStartUp; MsgBase^.MsgTxtStartUp;
@ -335,6 +336,7 @@ Begin
' ' + ' ' +
' '; ' ';
If Not IsNetworked Then Begin
If MsgAdded = 1 Then Begin If MsgAdded = 1 Then Begin
Assign (NdxFile, WorkPath + strPadL(strI2S(MBase.Index), 3, '0') + '.ndx'); Assign (NdxFile, WorkPath + strPadL(strI2S(MBase.Index), 3, '0') + '.ndx');
ReWrite (NdxFile); ReWrite (NdxFile);
@ -342,6 +344,7 @@ Begin
LONG2MSB (QwkIndex, NdxHdr.MsgPos); LONG2MSB (QwkIndex, NdxHdr.MsgPos);
Write (NdxFile, NdxHdr); Write (NdxFile, NdxHdr);
End;
DataFile.WriteBlock (Header[1], 128); DataFile.WriteBlock (Header[1], 128);
@ -386,9 +389,11 @@ Begin
MsgBase^.SeekNext; MsgBase^.SeekNext;
End; End;
If MsgAdded > 0 Then Close (NdxFile); If Not IsNetworked And (MsgAdded > 0) Then
Close (NdxFile);
MsgBase^.CloseMsgBase; MsgBase^.CloseMsgBase;
Dispose (MsgBase, Done); Dispose (MsgBase, Done);
Result := LastRead; Result := LastRead;
@ -400,7 +405,6 @@ Var
QwkLR : QwkLRRec; QwkLR : QwkLRRec;
QwkLRFile : File of QwkLRRec; QwkLRFile : File of QwkLRRec;
MBaseFile : File; MBaseFile : File;
MBase : RecMessageBase;
MScan : MScanRec; MScan : MScanRec;
Begin Begin
DataFile := TFileBuffer.Create(4 * 1024); DataFile := TFileBuffer.Create(4 * 1024);
@ -432,6 +436,8 @@ Begin
GetMessageScan (UserNumber, MBase, MScan); GetMessageScan (UserNumber, MBase, MScan);
If MScan.QwkScan > 0 Then Begin If MScan.QwkScan > 0 Then Begin
Inc (TotalBases);
QwkLR.Base := FilePos(MBaseFile); QwkLR.Base := FilePos(MBaseFile);
QwkLR.Pos := WriteMSGDAT; QwkLR.Pos := WriteMSGDAT;
@ -460,520 +466,3 @@ Begin
End; End;
End. End.
Function TMsgBase.WriteMSGDAT (Extended: Boolean) : LongInt;
Var
DataFile : File;
NdxFile : File of QwkNdxHdr;
NdxHdr : QwkNdxHdr;
Header : String[128];
Chunks : Word;
BufStr : String[128];
MsgAdded : Integer;
LastRead : LongInt;
QwkIndex : LongInt;
TooBig : Boolean;
Procedure DoString (Str: String);
Var
Count : SmallInt;
Begin
For Count := 1 to Length(Str) Do Begin
BufStr := BufStr + Str[Count];
If BufStr[0] = #128 Then Begin
BlockWrite (DataFile, BufStr[1], 128);
BufStr := '';
End;
End;
End;
Var
TempStr : String;
Begin
MsgAdded := 0;
If Not OpenCreateBase(MsgBase, MBase) Then Exit;
Session.io.OutFull (Session.GetPrompt(231));
Assign (DataFile, Session.TempPath + 'messages.dat');
Reset (DataFile, 1);
Seek (DataFile, FileSize(DataFile));
LastRead := MsgBase^.GetLastRead(Session.User.UserNum) + 1;
MsgBase^.SeekFirst (LastRead);
While MsgBase^.SeekFound Do Begin
If ((bbsCfg.QwkMaxBase > 0) and (MsgAdded = bbsCfg.QwkMaxBase)) or
((bbsCfg.QwkMaxPacket > 0) and (TotalMsgs = bbsCfg.QwkMaxPacket)) Then Break;
MsgBase^.MsgStartUp;
If MsgBase^.IsPriv And Not Session.User.IsThisUser(MsgBase^.GetTo) Then Begin
MsgBase^.SeekNext;
Continue;
End;
Inc (MsgAdded);
Inc (TotalMsgs);
LastRead := MsgBase^.GetMsgNum;
Chunks := 0;
BufStr := '';
TooBig := False;
QwkIndex := FileSize(DataFile) DIV 128 + 1;
MsgBase^.MsgTxtStartUp;
While Not MsgBase^.EOM Do Begin
TempStr := MsgBase^.GetString(79);
If TempStr[1] = #1 Then Continue;
Inc (Chunks, Length(TempStr));
End;
If Chunks MOD 128 = 0 Then
Chunks := Chunks DIV 128 + 1
Else
Chunks := Chunks DIV 128 + 2;
Header :=
' ' +
strPadR(strI2S(MsgBase^.GetMsgNum), 7, ' ') +
MsgBase^.GetDate +
MsgBase^.GetTime +
strPadR(strUpper(MsgBase^.GetTo), 25, ' ') +
strPadR(strUpper(MsgBase^.GetFrom), 25, ' ') +
strPadR(strUpper(MsgBase^.GetSubj), 25, ' ') +
strPadR('', 12, ' ') +
strPadR(strI2S(MsgBase^.GetRefer), 8, ' ') +
strPadR(strI2S(Chunks), 6, ' ') +
#255 +
' ' +
' ' +
' ';
If MsgAdded = 1 Then Begin
Assign (NdxFile, Session.TempPath + strPadL(strI2S(MBase.Index), 3, '0') + '.ndx');
ReWrite (NdxFile);
End;
LONG2MSB (QwkIndex, NdxHdr.MsgPos);
Write (NdxFile, NdxHdr);
BlockWrite (DataFile, Header[1], 128);
If Extended Then Begin
If Length(MsgBase^.GetFrom) > 25 Then Begin
DoString('From: ' + MsgBase^.GetFrom + #227);
TooBig := True;
End;
If Length(MsgBase^.GetTo) > 25 Then Begin
DoString('To: ' + MsgBase^.GetTo + #227);
TooBig := True;
End;
If Length(MsgBase^.GetSubj) > 25 Then Begin
DoString('Subject: ' + MsgBase^.GetSubj + #227);
TooBig := True;
End;
If TooBig Then DoString(#227);
End;
MsgBase^.MsgTxtStartUp;
While Not MsgBase^.EOM Do Begin
TempStr := MsgBase^.GetString(79) + #227;
If TempStr[1] = #1 Then Continue;
DoString (TempStr);
End;
If BufStr <> '' Then Begin
BufStr := strPadR (BufStr, 128, ' ');
BlockWrite (DataFile, BufStr[1], 128);
End;
MsgBase^.SeekNext;
End;
Close (DataFile);
If MsgAdded > 0 Then Close (NdxFile);
Session.io.PromptInfo[1] := strI2S(MBase.Index);
Session.io.PromptInfo[2] := MBase.Name;
Session.io.PromptInfo[3] := MBase.QwkName;
Session.io.PromptInfo[4] := strI2S(MsgBase^.NumberOfMsgs);
Session.io.PromptInfo[5] := strI2S(MsgAdded);
MsgBase^.CloseMsgBase;
Dispose (MsgBase, Done);
Session.io.OutBS (Screen.CursorX, True);
Session.io.OutFullLn (Session.GetPrompt(232));
Result := LastRead;
End;
Procedure TMsgBase.DownloadQWK (Extended: Boolean; Data: String);
Type
QwkLRRec = Record
Base : Word;
Pos : LongInt;
End;
Var
Old : RecMessageBase;
DataFile : File;
Temp : String;
QwkLR : QwkLRRec;
QwkLRFile : File of QwkLRRec;
Begin
If Session.User.ThisUser.QwkFiles Then
Session.FileBase.ExportFileList(True, True);
FileMode := 66;
Old := MBase;
Temp := strPadR('Produced By ' + mysSoftwareID + ' v' + mysVersion + '. ' + CopyID, 128, ' ');
Assign (DataFile, Session.TempPath + 'messages.dat');
ReWrite (DataFile, 1);
BlockWrite (DataFile, Temp[1], 128);
Close (DataFile);
Assign (QwkLRFile, Session.TempPath + 'qlr.dat');
ReWrite (QwkLRFile);
Reset (MBaseFile);
Session.io.OutFullLn (Session.GetPrompt(230));
TotalMsgs := 0;
TotalConf := 0;
Session.User.IgnoreGroup := Pos('/ALLGROUP', strUpper(Data)) > 0;
While Not Eof(MBaseFile) Do Begin
Read (MBaseFile, MBase);
If Session.User.Access(MBase.ReadACS) Then Begin
Inc (TotalConf);
GetMessageScan;
If MScan.QwkScan > 0 Then Begin
QwkLR.Base := FilePos(MBaseFile);
QwkLR.Pos := WriteMsgDAT(Extended);
Write (QwkLRFile, QwkLR);
End;
End;
End;
Close (QwkLRFile);
WriteControlDAT (Extended);
WriteDOORID (Extended);
If Extended Then WriteTOREADEREXT;
If TotalMsgs > 0 Then Begin
Session.io.PromptInfo[1] := strI2S(TotalMsgs);
Session.io.PromptInfo[2] := strI2S(TotalConf);
Session.io.OutFullLn (Session.GetPrompt(233));
Temp := bbsCfg.qwkBBSID + '.qwk';
Session.io.OutFullLn (Session.GetPrompt(234));
Session.io.PromptInfo[1] := Temp;
If FileExist(bbsCfg.QwkWelcome) Then FileCopy(bbsCfg.qwkWelcome, Session.TempPath + JustFile(bbsCfg.qwkWelcome));
If FileExist(bbsCfg.QwkNews) Then FileCopy(bbsCfg.qwkNews, Session.TempPath + JustFile(bbsCfg.qwkNews));
If FileExist(bbsCfg.QwkGoodbye) Then FileCopy(bbsCfg.qwkGoodbye, Session.TempPath + JustFile(bbsCfg.qwkGoodbye));
// Session.SystemLog('DEBUG: Archiving QWK packet');
If Session.LocalMode Then Begin
FileErase (bbsCfg.QWKPath + Temp);
Session.FileBase.ExecuteArchive (bbsCfg.QWKPath + Temp, Session.User.ThisUser.Archive, Session.TempPath + '*', 1);
Session.io.OutFullLn (Session.GetPrompt(235));
End Else Begin
Session.FileBase.ExecuteArchive (Session.TempPath + Temp, Session.User.ThisUser.Archive, Session.TempPath + '*', 1);
Session.FileBase.SendFile (Session.TempPath + Temp);
End;
If Session.io.GetYN (Session.GetPrompt(236), True) Then Begin
Reset (MBaseFile);
Reset (QwkLRFile);
While Not Eof(QwkLRFile) Do Begin
Read (QwkLRFile, QwkLR);
Seek (MBaseFile, QwkLR.Base - 1);
Read (MBaseFile, MBase);
Case MBase.BaseType of
0 : MsgBase := New(PMsgBaseJAM, Init);
1 : MsgBase := New(PMsgBaseSquish, Init);
End;
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
If MsgBase^.OpenMsgBase Then Begin
MsgBase^.SetLastRead (Session.User.UserNum, QwkLR.Pos);
MsgBase^.CloseMsgBase;
End;
Dispose(MsgBase, Done);
End;
Close (QwkLRFile);
End;
End Else
Session.io.OutFullLn (Session.GetPrompt(228));
Session.User.IgnoreGroup := False;
Close (MBaseFile);
MBase := Old;
DirClean (Session.TempPath, '');
End;
Procedure TMsgBase.UploadREP;
Var
DataFile : File;
TempBase : RecMessageBase;
OldBase : RecMessageBase;
QwkHeader : QwkDATHdr;
QwkBlock : String[128];
Line : String;
A : SmallInt;
B : SmallInt;
Chunks : SmallInt;
LineCount : SmallInt;
IsControl : Boolean;
GotControl : Boolean;
ExtFile : Text;
StatOK : LongInt = 0;
StatFailed : LongInt = 0;
StatBaseAdd : LongInt = 0;
StatBaseDel : LongInt = 0;
Procedure QwkControl (Idx: LongInt; Mode: Byte);
Begin
OldBase := MBase;
If GetBaseByIndex(Idx, MBase) Then Begin
GetMessageScan;
MScan.QwkScan := Mode;
If Mode = 0 Then Inc (StatBaseDel);
If Mode = 1 Then Inc (StatBaseAdd);
SetMessageScan;
End;
MBase := OldBase;
End;
Begin
If Session.LocalMode Then
Session.FileBase.ExecuteArchive (bbsCfg.QWKPath + bbsCfg.qwkBBSID + '.rep', Session.User.ThisUser.Archive, '*', 2)
Else Begin
If Session.FileBase.SelectProtocol(True, False) = 'Q' Then Exit;
Session.FileBase.ExecuteProtocol(1, Session.TempPath + bbsCfg.qwkBBSID + '.rep');
If Not Session.FileBase.DszSearch(bbsCfg.qwkBBSID + '.rep') Then Begin
Session.io.PromptInfo[1] := bbsCfg.qwkBBSID + '.rep';
Session.io.OutFullLn (Session.GetPrompt(84));
Exit;
End;
Session.FileBase.ExecuteArchive (Session.TempPath + bbsCfg.qwkBBSID + '.rep', Session.User.ThisUser.Archive, '*', 2)
End;
Assign (DataFile, FileFind(Session.TempPath + bbsCfg.qwkBBSID + '.msg'));
If Not ioReset(DataFile, 1, fmRWDN) Then Begin
Session.io.OutFull (Session.GetPrompt(238));
DirClean (Session.TempPath, '');
Exit;
End;
BlockRead (DataFile, QwkBlock[1], 128);
QwkBlock[0] := #128;
If Pos(strUpper(bbsCfg.qwkBBSID), strUpper(QwkBlock)) = 0 Then Begin
Session.io.OutFullLn (Session.GetPrompt(239));
Close (DataFile);
DirClean(Session.TempPath, '');
Exit;
End;
Session.io.OutFull (Session.GetPrompt(240));
While Not Eof(DataFile) Do Begin
BlockRead (DataFile, QwkHeader, SizeOf(QwkHeader));
Move (QwkHeader.MsgNum, QwkBlock[1], 7);
QwkBlock[0] := #7;
If GetBaseByIndex(strS2I(QwkBlock), TempBase) Then Begin
If OpenCreateBase(MsgBase, TempBase) Then Begin
AssignMessageData(MsgBase, TempBase);
QwkBlock[0] := #25;
Move (QwkHeader.UpTo, QwkBlock[1], 25);
MsgBase^.SetTo(strStripR(QwkBlock, ' '));
Move (QwkHeader.Subject, QwkBlock[1], 25);
MsgBase^.SetSubj(strStripR(QwkBlock, ' '));
Move (QwkHeader.ReferNum, QwkBlock[1], 6);
QwkBlock[0] := #6;
MsgBase^.SetRefer(strS2I(strStripR(QwkBlock, ' ')));
Move(QwkHeader.NumChunk, QwkBlock[1], 6);
Chunks := strS2I(QwkBlock) - 1;
Line := '';
LineCount := 0;
IsControl := MsgBase^.GetTo = qwkControlName;
GotControl := False;
If IsControl And ((MsgBase^.GetSubj = 'ADD') or (MsgBase^.GetSubj = 'DROP')) Then
QwkControl (TempBase.Index, Ord(MsgBase^.GetSubj = 'ADD'));
For A := 1 to Chunks Do Begin
BlockRead (DataFile, QwkBlock[1], 128);
QwkBlock[0] := #128;
QwkBlock := strStripR(QwkBlock, ' ');
For B := 1 to Length(QwkBlock) Do Begin
If QwkBlock[B] = #227 Then Begin
Inc (LineCount);
If (LineCount < 4) and (Copy(Line, 1, 5) = 'From:') Then
GotControl := True
// Mystic uses the username of the person who uploaded the
// reply package, based on the alias/realname setting of the
// base itself. This prevents people from spoofing "From"
// fields.
// If QWK networking will need to allow this of course
Else
If (LineCount < 4) and (Copy(Line, 1, 3) = 'To:') Then Begin
MsgBase^.SetTo(strStripB(Copy(Line, 4, Length(Line)), ' '));
GotControl := True;
End Else
If (LineCount < 4) and (Copy(Line, 1, 8) = 'Subject:') Then Begin
MsgBase^.SetSubj(strStripB(Copy(Line, 9, Length(Line)), ' '));
GotControl := True;
End Else
If GotControl And (Line = '') Then
GotControl := False
Else
MsgBase^.DoStringLn(Line);
Line := '';
End Else
Line := Line + QwkBlock[B];
End;
End;
If Line <> '' Then MsgBase^.DoStringLn(Line);
If TempBase.NetType > 0 Then Begin
MsgBase^.DoStringLn (#13 + '--- ' + mysSoftwareID + '/QWK v' + mysVersion + ' (' + OSID + ')');
MsgBase^.DoStringLn (' * Origin: ' + ResolveOrigin(TempBase) + ' (' + strAddr2Str(MsgBase^.GetOrigAddr) + ')');
End;
If Not IsControl Then Begin
MsgBase^.WriteMsg;
Inc (StatOK);
Inc (Session.User.ThisUser.Posts);
Inc (Session.HistoryPosts);
End;
MsgBase^.CloseMsgBase;
Dispose (MsgBase, Done);
End Else
Inc (StatFailed);
End Else
Inc (StatFailed);
End;
Close (DataFile);
Assign (ExtFile, FileFind(Session.TempPath + 'todoor.ext'));
{$I-} Reset (ExtFile); {$I+}
If IoResult = 0 Then Begin
While Not Eof(ExtFile) Do Begin
ReadLn (ExtFile, Line);
If strWordGet(1, Line, ' ') = 'AREA' Then Begin
QwkBlock := strWordGet(3, Line, ' ');
If Pos('a', QwkBlock) > 0 Then QwkControl(strS2I(strWordGet(2, Line, ' ')), 1);
If Pos('D', QwkBlock) > 0 Then QwkControl(strS2I(strWordGet(2, Line, ' ')), 0);
End;
End;
Close (ExtFile);
End;
DirClean (Session.TempPath, '');
Session.io.PromptInfo[1] := strI2S(StatOK);
Session.io.PromptInfo[2] := strI2S(StatFailed);
Session.io.PromptInfo[3] := strI2S(StatBaseAdd);
Session.io.PromptInfo[4] := strI2S(StatBaseDel);
Session.io.OutFullLn(Session.GetPrompt(503));
End;
End.
// need one of these for the file list compiler now too which MAYBE can be
// used in MUTIL also. lets template and build that out first.. then...
// create and upload QWK/REP packets without relying on BBS specific stuff
Type
TMsgBaseQWK = Class
User : RecUser;
Extended : Boolean;
Constructor Create (UD: RecUser; Ext: Boolean);
Function CreatePacket : Boolean;
Function ProcessReply (bbsid, temppath, usernum, var user, forcefrom ): Boolean;
Destructor Destroy; Override;
End;

View File

@ -5,9 +5,8 @@ Unit BBS_MsgBase_Squish;
Interface Interface
Uses Uses
BBS_MsgBase_Abs, BBS_Records,
BBS_Common, BBS_MsgBase_ABS,
bbs_dataBase,
DOS; DOS;
Const Const

View File

@ -12,11 +12,12 @@ Uses
m_Strings, m_Strings,
m_DateTime, m_DateTime,
m_FileIO, m_FileIO,
bbs_NodeInfo, BBS_Records,
bbs_Common, BBS_DataBase,
bbs_dataBase, BBS_Common,
bbs_User, BBS_NodeInfo,
bbs_Core; BBS_User,
BBS_Core;
Var Var
ChatSize : Integer; ChatSize : Integer;
@ -59,12 +60,12 @@ Begin
Read (RoomFile, Room); Read (RoomFile, Room);
Close (RoomFile); Close (RoomFile);
Chat.Room := R; Session.Chat.Room := R;
CurRoom := R; CurRoom := R;
Assign (CF, bbsCfg.DataPath + 'chat' + strI2S(Session.NodeNum) + '.dat'); Assign (CF, bbsCfg.DataPath + 'chat' + strI2S(Session.NodeNum) + '.dat');
Reset (CF); Reset (CF);
Write (CF, Chat); Write (CF, Session.Chat);
Close (CF); Close (CF);
Send_Node_Message (5, strI2S(Session.NodeNum) + ';' + 'Now chatting in channel ' + strI2S(CurRoom), 0); //++lang Send_Node_Message (5, strI2S(Session.NodeNum) + ';' + 'Now chatting in channel ' + strI2S(CurRoom), 0); //++lang
@ -367,13 +368,13 @@ Begin
Set_Node_Action (Session.GetPrompt(347)); Set_Node_Action (Session.GetPrompt(347));
Avail := Chat.Available; Avail := Session.Chat.Available;
Chat.InChat := True; Session.Chat.InChat := True;
Chat.Available := False; Session.Chat.Available := False;
Assign (ChatFile, bbsCfg.DataPath + 'chat' + strI2S(Session.NodeNum) + '.dat'); Assign (ChatFile, bbsCfg.DataPath + 'chat' + strI2S(Session.NodeNum) + '.dat');
Reset (ChatFile); Reset (ChatFile);
Write (ChatFile, Chat); Write (ChatFile, Session.Chat);
Close (ChatFile); Close (ChatFile);
FileErase(Session.TempPath + 'chat.tmp'); FileErase(Session.TempPath + 'chat.tmp');
@ -478,14 +479,14 @@ Begin
Session.io.GetKeyCallBack := NIL; Session.io.GetKeyCallBack := NIL;
Chat.InChat := False; Session.Chat.InChat := False;
Chat.Available := Avail; Session.Chat.Available := Avail;
Session.AllowMessages := True; Session.AllowMessages := True;
Assign (ChatFile, bbsCfg.DataPath + 'chat' + strI2S(Session.NodeNum) + '.dat'); Assign (ChatFile, bbsCfg.DataPath + 'chat' + strI2S(Session.NodeNum) + '.dat');
Reset (ChatFile); Reset (ChatFile);
Write (ChatFile, Chat); Write (ChatFile, Session.Chat);
Close (ChatFile); Close (ChatFile);
FileErase(Session.TempPath + 'chat.tmp'); FileErase(Session.TempPath + 'chat.tmp');

View File

@ -5,8 +5,7 @@ Unit bbs_NodeInfo;
Interface Interface
Uses Uses
bbs_Common, BBS_Records;
bbs_dataBase;
Function GetChatRecord (Node: Byte; Var Chat: ChatRec) : Boolean; Function GetChatRecord (Node: Byte; Var Chat: ChatRec) : Boolean;
Function IsUserOnline (UserName: String) : Word; Function IsUserOnline (UserName: String) : Word;
@ -22,9 +21,11 @@ Uses
m_DateTime, m_DateTime,
m_Strings, m_Strings,
m_FileIO, m_FileIO,
bbs_Core, BBS_DataBase,
bbs_User, BBS_Common,
bbs_UserChat; BBS_Core,
BBS_User,
BBS_UserChat;
Function GetChatRecord (Node: Byte; Var Chat: ChatRec) : Boolean; Function GetChatRecord (Node: Byte; Var Chat: ChatRec) : Boolean;
Begin Begin
@ -62,25 +63,26 @@ Begin
ReWrite (ChatFile); ReWrite (ChatFile);
If Action <> '' Then Begin If Action <> '' Then Begin
Chat.Active := True; Session.Chat.Active := True;
Chat.Name := Session.User.ThisUser.Handle; Session.Chat.Name := Session.User.ThisUser.Handle;
Chat.Location := Session.User.ThisUser.City; Session.Chat.Location := Session.User.ThisUser.City;
Chat.Action := Action; Session.Chat.Action := Action;
Chat.Gender := Session.User.ThisUser.Gender; Session.Chat.Gender := Session.User.ThisUser.Gender;
Chat.Age := DaysAgo(Session.User.ThisUser.Birthday, 1) DIV 365; Session.Chat.Age := DaysAgo(Session.User.ThisUser.Birthday, 1) DIV 365;
If Session.LocalMode Then If Session.LocalMode Then
Chat.Baud := 'LOCAL' {++lang} Session.Chat.Baud := 'LOCAL' {++lang}
Else Else
Chat.Baud := 'TELNET'; {++lang} Session.Chat.Baud := 'TELNET'; {++lang}
End Else Begin End Else Begin
Chat.Active := False; Session.Chat.Active := False;
Chat.Invisible := False; Session.Chat.Invisible := False;
Chat.Available := False; Session.Chat.Available := False;
Chat.Age := 0; Session.Chat.Age := 0;
Chat.Gender := '?'; Session.Chat.Gender := '?';
End; End;
Write (ChatFile, Chat); Write (ChatFile, Session.Chat);
Close (ChatFile); Close (ChatFile);
{$IFDEF WINDOWS} {$IFDEF WINDOWS}

View File

@ -6,7 +6,8 @@ Interface
Uses Uses
BBS_Common, BBS_Common,
bbs_DataBase; BBS_Records,
BBS_DataBase;
Type Type
RecNodeSearch = Record RecNodeSearch = Record

View File

@ -8,14 +8,15 @@ Uses
m_FileIO, m_FileIO,
m_Strings, m_Strings,
m_DateTime, m_DateTime,
bbs_Common, BBS_Records,
bbs_dataBase, BBS_DataBase,
bbs_General, BBS_Common,
bbs_MsgBase, BBS_General,
bbs_FileBase, BBS_MsgBase,
bbs_Menus, BBS_FileBase,
bbs_NodeInfo, BBS_Menus,
mpl_Execute; BBS_NodeInfo,
MPL_Execute;
Type Type
TBBSUser = Class TBBSUser = Class
@ -74,7 +75,7 @@ Type
Implementation Implementation
Uses Uses
bbs_Core; BBS_Core;
Constructor TBBSUser.Create (Var Owner: Pointer); Constructor TBBSUser.Create (Var Owner: Pointer);
Begin Begin
@ -166,8 +167,8 @@ Var
'M' : Res := strS2I(Data) < strS2I(Copy(TimeDos2Str(CurDateDos, 0), 4, 2)); 'M' : Res := strS2I(Data) < strS2I(Copy(TimeDos2Str(CurDateDos, 0), 4, 2));
'N' : Res := strS2I(Data) = Session.NodeNum; 'N' : Res := strS2I(Data) = Session.NodeNum;
'O' : Case Data[1] of 'O' : Case Data[1] of
'A' : Res := Chat.Available; 'A' : Res := Session.Chat.Available;
'I' : Res := Chat.Invisible; 'I' : Res := Session.Chat.Invisible;
'K' : Res := AcsOkFlag; 'K' : Res := AcsOkFlag;
'M' : Begin 'M' : Begin
Res := Access(Session.Msgs.MBase.SysopACS); Res := Access(Session.Msgs.MBase.SysopACS);
@ -1026,9 +1027,11 @@ Begin
Write (UserFile, ThisUser); Write (UserFile, ThisUser);
Close (UserFile); Close (UserFile);
Reset (ConfigFile); PutBaseConfiguration(bbsCfg);
Write (ConfigFile, bbsCfg);
Close (ConfigFile); // Reset (ConfigFile);
// Write (ConfigFile, bbsCfg);
// Close (ConfigFile);
Session.SystemLog ('Created Account: ' + ThisUser.Handle); Session.SystemLog ('Created Account: ' + ThisUser.Handle);
@ -1056,14 +1059,14 @@ Begin
{$IFDEF LOGGING} Session.SystemLog('Logon3'); {$ENDIF} {$IFDEF LOGGING} Session.SystemLog('Logon3'); {$ENDIF}
Chat.Available := True; Session.Chat.Available := True;
If Access(bbsCfg.AcsInvisLogin) Then If Access(bbsCfg.AcsInvisLogin) Then
Chat.Invisible := Session.io.GetYN(Session.GetPrompt(308), False); Session.Chat.Invisible := Session.io.GetYN(Session.GetPrompt(308), False);
{ update last caller information } { update last caller information }
If Not Session.LocalMode And Not Chat.Invisible And (ThisUser.Flags AND UserNoLastCall = 0) Then Begin If Not Session.LocalMode And Not Session.Chat.Invisible And (ThisUser.Flags AND UserNoLastCall = 0) Then Begin
Reset (LastOnFile); Reset (LastOnFile);
If FileSize(LastOnFile) >= 10 Then If FileSize(LastOnFile) >= 10 Then
@ -1262,7 +1265,7 @@ Begin
End; End;
Session.io.OutFullLn ('|CL' + mysSoftwareID + ' v' + mysVersion + ' for ' + OSID + ' Node |ND'); Session.io.OutFullLn ('|CL' + mysSoftwareID + ' v' + mysVersion + ' for ' + OSID + ' Node |ND');
Session.io.OutFullLn (CopyID); Session.io.OutFullLn (mysCopyNotice);
If bbsCfg.DefTermMode = 0 Then If bbsCfg.DefTermMode = 0 Then
GetGraphics GetGraphics
@ -1426,11 +1429,11 @@ Begin
Session.LoadThemeData(Data); Session.LoadThemeData(Data);
15 : GetEditor(True); 15 : GetEditor(True);
16 : If Access(bbsCfg.AcsInvisLogin) Then Begin 16 : If Access(bbsCfg.AcsInvisLogin) Then Begin
Chat.Invisible := Not Chat.Invisible; Session.Chat.Invisible := Not Session.Chat.Invisible;
Set_Node_Action (Chat.Action); Set_Node_Action (Session.Chat.Action);
End; End;
17 : GetFileList(True); 17 : GetFileList(True);
18 : Chat.Available := Not Chat.Available; 18 : Session.Chat.Available := Not Session.Chat.Available;
19 : GetHotKeys(True); 19 : GetHotKeys(True);
20 : GetMsgList(True); 20 : GetMsgList(True);
21 : ThisUser.UseLBIndex := Not ThisUser.UseLBIndex; 21 : ThisUser.UseLBIndex := Not ThisUser.UseLBIndex;

View File

@ -13,10 +13,10 @@ Uses
m_Strings, m_Strings,
m_FileIO, m_FileIO,
m_DateTime, m_DateTime,
bbs_Core, BBS_Records,
bbs_Common, BBS_DataBase,
bbs_dataBase, BBS_Core,
bbs_NodeInfo; BBS_NodeInfo;
Procedure PageUserForChat; Procedure PageUserForChat;
Var Var

View File

@ -542,6 +542,8 @@ Begin
Console.SetWindowTitle(WinTitle); Console.SetWindowTitle(WinTitle);
// process command lines here and exit
If Not ServerStartup Then Begin If Not ServerStartup Then Begin
Console.ClearScreen; Console.ClearScreen;
Console.WriteLine('ERROR: No servers are configured as active.'); Console.WriteLine('ERROR: No servers are configured as active.');

View File

@ -691,6 +691,9 @@ Var
Res : LongInt; Res : LongInt;
Begin Begin
If LoggedIn Then Begin If LoggedIn Then Begin
// if name = bbsid.qwk or if user is network and name is userid.qwk then
// send file here
// else do the normal stuff
TempPos := FindDirectory(TempBase); TempPos := FindDirectory(TempBase);
If TempPos = -1 Then Begin If TempPos = -1 Then Begin

View File

@ -7,7 +7,8 @@ Interface
Uses Uses
DOS, DOS,
m_FileIO, m_FileIO,
bbs_dataBase, BBS_Records,
BBS_DataBase,
BBS_Common; BBS_Common;
{$I MPL_TYPES.PAS} {$I MPL_TYPES.PAS}

View File

@ -33,6 +33,7 @@ Uses
m_Strings, m_Strings,
m_FileIO, m_FileIO,
m_IniReader, m_IniReader,
BBS_Records,
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status,
mUtil_ImportNA, mUtil_ImportNA,

View File

@ -14,7 +14,7 @@ Uses
m_FileIO, m_FileIO,
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status,
bbs_DataBase; BBS_Records;
Const Const
TotalFiles : Cardinal = 0; TotalFiles : Cardinal = 0;

View File

@ -8,7 +8,7 @@ Uses
m_Output, m_Output,
m_IniReader, m_IniReader,
mutil_Status, mutil_Status,
bbs_DataBase, bbs_Records,
bbs_MsgBase_Abs, bbs_MsgBase_Abs,
bbs_MsgBase_Squish, bbs_MsgBase_Squish,
bbs_MsgBase_JAM; bbs_MsgBase_JAM;

View File

@ -9,7 +9,7 @@ Uses
m_FileIO, m_FileIO,
m_Strings, m_Strings,
m_DateTime, m_DateTime,
bbs_DataBase, BBS_Records,
mUtil_Common; mUtil_Common;
Const Const

View File

@ -17,10 +17,10 @@ Uses
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status,
mUtil_EchoCore, mUtil_EchoCore,
bbs_DataBase, BBS_Records,
bbs_MsgBase_ABS, BBS_MsgBase_ABS,
bbs_MsgBase_JAM, BBS_MsgBase_JAM,
bbs_MsgBase_Squish; BBS_MsgBase_Squish;
Procedure AddToFLOQueue (FloName, PacketFN: String); Procedure AddToFLOQueue (FloName, PacketFN: String);
Var Var

View File

@ -13,7 +13,7 @@ Implementation
Uses Uses
m_Strings, m_Strings,
bbs_DataBase; BBS_Records;
Function ProcessedByAreaFix (Var PKT: TPKTReader) : Boolean; Function ProcessedByAreaFix (Var PKT: TPKTReader) : Boolean;
Var Var

View File

@ -13,7 +13,7 @@ Uses
m_FileIO, m_FileIO,
m_Strings, m_Strings,
AView, AView,
bbs_DataBase, BBS_Records,
BBS_MsgBase_ABS, BBS_MsgBase_ABS,
BBS_MsgBase_JAM, BBS_MsgBase_JAM,
BBS_MsgBase_Squish, BBS_MsgBase_Squish,

View File

@ -14,7 +14,7 @@ Uses
m_FileIO, m_FileIO,
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status,
bbs_DataBase; BBS_Records;
Procedure uImportFileBone; Procedure uImportFileBone;
Var Var

View File

@ -14,7 +14,7 @@ Uses
m_DateTime, m_DateTime,
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status,
bbs_DataBase; BBS_Records;
Procedure uImportFilesBBS; Procedure uImportFilesBBS;
Var Var

View File

@ -14,7 +14,7 @@ Uses
m_Strings, m_Strings,
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status,
bbs_DataBase; BBS_Records;
Procedure uImportMessageBases; Procedure uImportMessageBases;
Var Var

View File

@ -12,7 +12,7 @@ Uses
m_Strings, m_Strings,
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status,
bbs_DataBase; BBS_Records;
Procedure uImportNA; Procedure uImportNA;
Var Var

View File

@ -11,10 +11,10 @@ Implementation
Uses Uses
m_FileIO, m_FileIO,
m_Strings, m_Strings,
BBS_Records,
BBS_Common,
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status;
bbs_Common,
bbs_DataBase;
Procedure uPostMessages; Procedure uPostMessages;
Const Const

View File

@ -13,7 +13,7 @@ Uses
m_DateTime, m_DateTime,
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status,
bbs_DataBase, bbs_Records,
bbs_MsgBase_ABS, bbs_MsgBase_ABS,
bbs_MsgBase_JAM, bbs_MsgBase_JAM,
bbs_MsgBase_Squish; bbs_MsgBase_Squish;

View File

@ -14,7 +14,7 @@ Uses
m_FileIO, m_FileIO,
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status,
bbs_DataBase; BBS_Records;
Type Type
TopListType = (TopCall, TopPost, TopDL, TopUL, TopPCR); TopListType = (TopCall, TopPost, TopDL, TopUL, TopPCR);

View File

@ -13,7 +13,7 @@ Uses
m_DateTime, m_DateTime,
mUtil_Common, mUtil_Common,
mUtil_Status, mUtil_Status,
bbs_DataBase; BBS_Records;
Procedure uMassUpload; Procedure uMassUpload;
Var Var

View File

@ -41,6 +41,7 @@ Uses
m_Output, m_Output,
m_Input, m_Input,
m_Pipe, m_Pipe,
BBS_Records,
bbs_Common, bbs_Common,
bbs_DataBase, bbs_DataBase,
bbs_Core, bbs_Core,

View File

@ -22,9 +22,10 @@
Const Const
mysSoftwareID = 'Mystic BBS'; mysSoftwareID = 'Mystic BBS';
mysCopyYear = '1997-2013'; // its been a long time! mysCopyYear = '1997-2013';
mysVersion = '1.10 A37'; // current version mysVersion = '1.10 A37';
mysDataChanged = '1.10 A11'; // version of last records change mysDataChanged = '1.10 A11';
mysCopyNotice = 'Copyright (C) ' + mysCopyYear + ' By James Coyle';
{$IFDEF WIN32} {$IFDEF WIN32}
PathChar = '\'; PathChar = '\';

View File

@ -37,6 +37,11 @@ BUGS AND POSSIBLE ISSUES
FUTURE / IDEAS / WORK IN PROGRESS / NOTES FUTURE / IDEAS / WORK IN PROGRESS / NOTES
========================================= =========================================
- externalize qwk and file list compiler class. qwk for mystic/mis filelist
for mystic/mutil. add compiler templates, file include, and new vs all
generation for all.
- abstract ansi browser to be used for ansi archive viewer and sysop file
manager (as well as the ANSI gallery).
- when mutil is tossing a packet and auto creates an area figure out if there - when mutil is tossing a packet and auto creates an area figure out if there
can be a way to automatically create the uplink back to the originating can be a way to automatically create the uplink back to the originating
node. node.
@ -49,7 +54,6 @@ FUTURE / IDEAS / WORK IN PROGRESS / NOTES
way which i think is the best approach actually. way which i think is the best approach actually.
- ESC moves back in ANSI gallery only exits if dir = root? - ESC moves back in ANSI gallery only exits if dir = root?
- Color, boxtype, and input configuration for configuration - Color, boxtype, and input configuration for configuration
- Toggle base scan settings Select [A]ll, [D]eselect All
- global file editor like msg base - global file editor like msg base
- redo voting booth externalize user storage and allow unlimited questions - redo voting booth externalize user storage and allow unlimited questions
plus maybe categories. or at least up it to like 50 questions or plus maybe categories. or at least up it to like 50 questions or
@ -64,7 +68,6 @@ FUTURE / IDEAS / WORK IN PROGRESS / NOTES
- Echomail export saves last scanned pointers - Echomail export saves last scanned pointers
- Echomail export support for netmail routing - Echomail export support for netmail routing
- FileFix / TIC - FileFix / TIC
- Add "Add Export To" to global msgbase editor. Also Del Export?
! Use NetReply in RecMB also Reply to another base? ! Use NetReply in RecMB also Reply to another base?
- QWK put/get per individual users via FTP - QWK put/get per individual users via FTP
- EXCLUDE from all files list. important. - EXCLUDE from all files list. important.
@ -78,10 +81,6 @@ FUTURE / IDEAS / WORK IN PROGRESS / NOTES
- MUTILs new DIR import of msg bases could have optional config to reference - MUTILs new DIR import of msg bases could have optional config to reference
a series of .NA files to get the name/description of bases. a series of .NA files to get the name/description of bases.
- QWK via email - QWK via email
- Either add Public/Private fusion type message base or allow reply via
email or netmail option.
- mUTIL scans MSGS directory and auto-creates anything that has data files
not related to a BBS message base.. uses a template
- Blind upload for single file upload (also message upload) - Blind upload for single file upload (also message upload)
- Email validation - Email validation
- Recode FCHECK into MUTIL, but also add the option to phsyically delete the - Recode FCHECK into MUTIL, but also add the option to phsyically delete the
@ -91,8 +90,8 @@ FUTURE / IDEAS / WORK IN PROGRESS / NOTES
- Outbound telnet feature - Outbound telnet feature
- Add "PREVIEW" option to message editors - Add "PREVIEW" option to message editors
- Finish Threaded message reader - Finish Threaded message reader
- Gallows Pole MPL
- Add "high roller/smack talk" into BlackJack - Add "high roller/smack talk" into BlackJack
- Add better MIS logging per server (connect, refuse, blocked, etc)
- BBS email autoforwarded to Internet email - BBS email autoforwarded to Internet email
- Ability to send internet email to people from within the BBS. - Ability to send internet email to people from within the BBS.
- ANSI post-processor for message uploads via FSE - ANSI post-processor for message uploads via FSE
@ -131,7 +130,6 @@ FUTURE / IDEAS / WORK IN PROGRESS / NOTES
- ANSI message upload post processor option: Auto/Disabled/Ask - ANSI message upload post processor option: Auto/Disabled/Ask
- Finish optional user prompts - Finish optional user prompts
- MCI code for FS ansi viewer? - MCI code for FS ansi viewer?
- MCI code for # of files in current file area
- Redo random ANSI system to use A-Z instead of 1-9 can have upgrade util - Redo random ANSI system to use A-Z instead of 1-9 can have upgrade util
rename them automatically. rename them automatically.
- LastOn revamp make sure its not global and new stuff is populated - LastOn revamp make sure its not global and new stuff is populated
@ -279,8 +277,6 @@ ReplaceLine
- Needs additional research - Needs additional research
! POSSIBLE removal of local console in Windows and STDIO usage in Linux ! POSSIBLE removal of local console in Windows and STDIO usage in Linux
^ Massive performance increase possible here as well as: ^ Massive performance increase possible here as well as:
! POSSIBLE FTN tosser.
! POSSIBLE FTN mailer (transx, FTP, binkP)
! MIS event system (possible 1.10) ! MIS event system (possible 1.10)
! Password reset via email (possible 1.10) ! Password reset via email (possible 1.10)
! Email verification system (for access upgrades) (possible 1.10) ! Email verification system (for access upgrades) (possible 1.10)
@ -290,4 +286,59 @@ ReplaceLine
- Rewrite of MBBSWEB or integrated HTML server? still need a good designer - Rewrite of MBBSWEB or integrated HTML server? still need a good designer
that actually will put a lot of time into it that actually will put a lot of time into it
- Rewrite of ANSI template system (.ini files or mystic2 format?) - Rewrite of ANSI template system (.ini files or mystic2 format?)
! Revamp logging system and add additional logging to MIS
=================================================
CODE RESTRUCTURE naming (possibly remove mystic_ prefix):
mystic
mystic_records
mystic_common (called db now)
mystic_server_binkp
mystic_server_telnet
mystic_server_ftp
mystic_server_pop3
mystic_server
mystic_client
mystic_client_smtp
mystic_server_events
mystic_cmd_server
mystic_cmd_fidopoll
mystic_cmd_terminal
mystic_class_binkp
mystic_class_qwk
mystic_class_menudata
mystic_class_msgbase
mystic_class_msgbase_jam
mystic_class_msgbase_squish
mystic_class_arcview
mystic_class_arcview_zip
mystic_class_arcview_rar
mystic_class_nodelist
mystic_class_logging (on-the-fly log rolling, trimming, etc)
mystic_config_filearea
mystic_ansi_intro
mystic_ansi_monitor
mystic_ansi_terminal
mystic_bbs_core
mystic_bbs_msgbase
mystic_bbs_filebase
mystic_bbs_general
mystic_bbs_doors
mystic_bbs_user
mystic_bbs_nodechat
mystic_bbs_userchat
mystic_bbs_sysopchat
mystic_bbs_ansibox
mystic_bbs_ansimenu
mystic_bbs_ansihelp
mystic_bbs_ansiinput
mystic_bbs_ansidir
mystic_bbs_lineedit
mystic_bbs_fulledit
mystic_bbs_menus
mystic_bbs_io
mystic_bbs_mplexecute
mystic_bbs_mpltypes
mystic_bbs_mplcommon
mystic_bbs_mplcompile

View File

@ -3588,4 +3588,7 @@
wants to update their current base, and will instead force the update for wants to update their current base, and will instead force the update for
all message bases. all message bases.
! Mystic was changing the user's message base to the last base processed
when globally resetting the new message scan date.
<ALPHA 37 RELEASED> <ALPHA 37 RELEASED>