A26
This commit is contained in:
parent
4ce4e25802
commit
8c335f488e
|
@ -287,7 +287,7 @@ Begin
|
||||||
Box.Open (5, 5, 76, 21);
|
Box.Open (5, 5, 76, 21);
|
||||||
|
|
||||||
VerticalLine (26, 7, 19);
|
VerticalLine (26, 7, 19);
|
||||||
VerticalLine (58, 7, 14);
|
VerticalLine (58, 7, 15);
|
||||||
|
|
||||||
Form.AddBol ('L', ' List Compression', 8, 7, 28, 7, 18, 3, @Config.FCompress, Topic + '');
|
Form.AddBol ('L', ' List Compression', 8, 7, 28, 7, 18, 3, @Config.FCompress, Topic + '');
|
||||||
Form.AddTog ('I', ' List Columns', 12, 8, 28, 8, 14, 1, 1, 2, '1 2', @Config.FColumns, Topic + '');
|
Form.AddTog ('I', ' List Columns', 12, 8, 28, 8, 14, 1, 1, 2, '1 2', @Config.FColumns, Topic + '');
|
||||||
|
@ -308,9 +308,10 @@ Begin
|
||||||
Form.AddStr ('N', ' DL Unvalidated', 42, 9, 60, 9, 16, 15, mysMaxAcsSize, @Config.AcsDLUnvalid, Topic + 'ACS to download unvalidated files');
|
Form.AddStr ('N', ' DL Unvalidated', 42, 9, 60, 9, 16, 15, mysMaxAcsSize, @Config.AcsDLUnvalid, Topic + 'ACS to download unvalidated files');
|
||||||
Form.AddStr ('F', ' See Failed', 46, 10, 60, 10, 12, 15, mysMaxAcsSize, @Config.AcsSeeFailed, Topic + 'ACS to see failed files');
|
Form.AddStr ('F', ' See Failed', 46, 10, 60, 10, 12, 15, mysMaxAcsSize, @Config.AcsSeeFailed, Topic + 'ACS to see failed files');
|
||||||
Form.AddStr (#0, ' DL Failed', 47, 11, 60, 11, 11, 15, mysMaxAcsSize, @Config.AcsDLFailed, Topic + 'ACS to download failed files');
|
Form.AddStr (#0, ' DL Failed', 47, 11, 60, 11, 11, 15, mysMaxAcsSize, @Config.AcsDLFailed, Topic + 'ACS to download failed files');
|
||||||
Form.AddLong ('C', ' Min Upload Space', 40, 12, 60, 12, 18, 9, 0, 999999999, @Config.FreeUL, Topic + 'Min space to allow uploads (kb)');
|
Form.AddStr (#0, ' See Offline', 45, 12, 60, 12, 13, 15, mysMaxAcsSize, @Config.AcsSeeOffline, Topic + 'ACS to see offline files');
|
||||||
Form.AddLong ('-', ' Min CD-ROM Space', 40, 13, 60, 13, 18, 9, 0, 999999999, @Config.FreeCDROM, Topic + 'Min space for CD-ROM copy (kb)');
|
Form.AddLong ('C', ' Min Upload Space', 40, 13, 60, 13, 18, 9, 0, 999999999, @Config.FreeUL, Topic + 'Min space to allow uploads (kb)');
|
||||||
Form.AddChar (#0, ' Default Protocol', 40, 14, 60, 14, 18, 32, 96, @Config.FProtocol, Topic + 'Default Protocol hotkey');
|
Form.AddLong ('-', ' Min CD-ROM Space', 40, 14, 60, 14, 18, 9, 0, 999999999, @Config.FreeCDROM, Topic + 'Min space for CD-ROM copy (kb)');
|
||||||
|
Form.AddChar (#0, ' Default Protocol', 40, 15, 60, 15, 18, 32, 96, @Config.FProtocol, Topic + 'Default Protocol hotkey');
|
||||||
|
|
||||||
Form.Execute;
|
Form.Execute;
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,839 @@ Unit bbs_Edit_Ansi;
|
||||||
|
|
||||||
{$I M_OPS.PAS}
|
{$I M_OPS.PAS}
|
||||||
|
|
||||||
// online ansi editor WIP
|
|
||||||
|
|
||||||
Interface
|
Interface
|
||||||
|
|
||||||
|
// Future online pipe/ansi editor and new full screen editor.
|
||||||
|
// Will be the most badass editor to ever exist.
|
||||||
|
|
||||||
|
Uses
|
||||||
|
bbs_MsgBase_ANSI;
|
||||||
|
|
||||||
|
Const
|
||||||
|
MaxLines = 1000;
|
||||||
|
|
||||||
|
Type
|
||||||
|
TEditorANSI = Class
|
||||||
|
Owner : Pointer;
|
||||||
|
ANSI : TMsgBaseANSI;
|
||||||
|
WinY1 : Byte;
|
||||||
|
WinY2 : Byte;
|
||||||
|
WinX1 : Byte;
|
||||||
|
WinX2 : Byte;
|
||||||
|
WinSize : Byte;
|
||||||
|
RowSize : Byte;
|
||||||
|
CurX : Byte;
|
||||||
|
CurY : SmallInt;
|
||||||
|
CurAttr : Byte;
|
||||||
|
CurLength : Byte;
|
||||||
|
TopLine : LongInt;
|
||||||
|
CurLine : LongInt;
|
||||||
|
InsertMode : Boolean;
|
||||||
|
DrawMode : Boolean;
|
||||||
|
GlyphMode : Boolean;
|
||||||
|
WrapMode : Boolean;
|
||||||
|
ClearEOL : Boolean;
|
||||||
|
LastLine : LongInt;
|
||||||
|
|
||||||
|
Constructor Create (Var O: Pointer);
|
||||||
|
Destructor Destroy; Override;
|
||||||
|
|
||||||
|
Function IsAnsiLine (Line: LongInt) : Boolean;
|
||||||
|
Function IsBlankLine (Var Line; LineSize: Byte) : Boolean;
|
||||||
|
Function GetLineLength (Var Line; LineSize: Byte) : Byte;
|
||||||
|
Function GetWrapPos (Var Line; LineSize, WrapPos: Byte) : Byte;
|
||||||
|
Procedure TrimLine (Var Line; LineSize: Byte);
|
||||||
|
Procedure DeleteLine (Line: LongInt);
|
||||||
|
Procedure InsertLine (Line: LongInt);
|
||||||
|
Procedure FindLastLine;
|
||||||
|
Procedure Reformat;
|
||||||
|
Procedure LocateCursor;
|
||||||
|
Procedure ReDrawTemplate;
|
||||||
|
Procedure DrawPage (StartY, EndY: Byte; ExitEOF: Boolean);
|
||||||
|
Procedure ScrollUp;
|
||||||
|
Procedure ScrollDown;
|
||||||
|
Function LineUp : Boolean;
|
||||||
|
Function LineDown (Reset: Boolean) : Boolean;
|
||||||
|
Procedure PageUp;
|
||||||
|
Procedure PageDown;
|
||||||
|
Procedure DrawLine (Line: LongInt; XP, YP: Byte);
|
||||||
|
Procedure DoEnter;
|
||||||
|
Procedure DoBackSpace;
|
||||||
|
Procedure DoDelete;
|
||||||
|
Procedure DoChar (Ch: Char);
|
||||||
|
Function Edit : Boolean;
|
||||||
|
Procedure LoadANSI;
|
||||||
|
End;
|
||||||
|
|
||||||
Implementation
|
Implementation
|
||||||
|
|
||||||
|
Uses
|
||||||
|
m_Strings,
|
||||||
|
bbs_Core,
|
||||||
|
bbs_Ansi_MenuBox;
|
||||||
|
|
||||||
|
Constructor TEditorANSI.Create (Var O: Pointer);
|
||||||
|
Begin
|
||||||
|
Inherited Create;
|
||||||
|
|
||||||
|
Owner := O;
|
||||||
|
ANSI := TMsgBaseANSI.Create(NIL, False);
|
||||||
|
WinX1 := 1;
|
||||||
|
WinX2 := 79;
|
||||||
|
WinY1 := 2;
|
||||||
|
WinY2 := 23;
|
||||||
|
WinSize := WinY2 - WinY1 + 1;
|
||||||
|
RowSize := WinX2 - WinX1 + 1;
|
||||||
|
CurX := 1;
|
||||||
|
CurY := 1;
|
||||||
|
CurLine := 1;
|
||||||
|
TopLine := 1;
|
||||||
|
CurAttr := 7;
|
||||||
|
InsertMode := True;
|
||||||
|
DrawMode := False;
|
||||||
|
GlyphMode := False;
|
||||||
|
WrapMode := True;
|
||||||
|
ClearEOL := RowSize >= 79;
|
||||||
|
LastLine := 1;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Destructor TEditorANSI.Destroy;
|
||||||
|
Begin
|
||||||
|
Inherited Destroy;
|
||||||
|
|
||||||
|
ANSI.Free;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.FindLastLine;
|
||||||
|
Var
|
||||||
|
Count : LongInt;
|
||||||
|
Begin
|
||||||
|
LastLine := MaxLines;
|
||||||
|
|
||||||
|
While (LastLine > 1) And IsBlankLine(ANSI.Data[LastLine], 80) Do
|
||||||
|
Dec(LastLine);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function TEditorANSI.IsAnsiLine (Line: LongInt) : Boolean;
|
||||||
|
Var
|
||||||
|
Count : Byte;
|
||||||
|
Begin
|
||||||
|
Result := False;
|
||||||
|
|
||||||
|
If GetLineLength(ANSI.Data[Line], 80) >= Rowsize Then Begin
|
||||||
|
Result := True;
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
For Count := 1 to 80 Do
|
||||||
|
If (Ord(ANSI.Data[Line][Count].Ch) < 32) or (Ord(ANSI.Data[Line][Count].Ch) > 128) Then Begin
|
||||||
|
Result := True;
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function TEditorANSI.IsBlankLine (Var Line; LineSize: Byte) : Boolean;
|
||||||
|
Var
|
||||||
|
EndPos : Byte;
|
||||||
|
Data : Array[1..255] of RecAnsiBufferChar absolute Line;
|
||||||
|
Begin
|
||||||
|
EndPos := LineSize;
|
||||||
|
|
||||||
|
While (EndPos > 0) and (Data[EndPos].Ch = #0) Do
|
||||||
|
Dec (EndPos);
|
||||||
|
|
||||||
|
Result := EndPos = 0;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.TrimLine (Var Line; LineSize: Byte);
|
||||||
|
Var
|
||||||
|
Data : Array[1..255] of RecAnsiBufferChar absolute Line;
|
||||||
|
EndPos : Byte;
|
||||||
|
Begin
|
||||||
|
EndPos := 1;
|
||||||
|
|
||||||
|
While (EndPos <= LineSize) and (Data[1].Ch = ' ') Do Begin
|
||||||
|
Move (Data[2], Data[1], SizeOf(RecAnsiBufferChar) * (LineSize - 1));
|
||||||
|
|
||||||
|
Data[LineSize].Ch := #0;
|
||||||
|
|
||||||
|
Inc (EndPos);
|
||||||
|
End;
|
||||||
|
|
||||||
|
EndPos := LineSize;
|
||||||
|
|
||||||
|
While (EndPos > 0) and ((Data[EndPos].Ch = ' ') or (Data[EndPos].Ch = #0)) Do Begin
|
||||||
|
Data[EndPos].Ch := #0;
|
||||||
|
|
||||||
|
Dec (EndPos);
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.DeleteLine (Line: LongInt);
|
||||||
|
Var
|
||||||
|
Count : LongInt;
|
||||||
|
Begin
|
||||||
|
For Count := Line to MaxLines - 1 Do
|
||||||
|
ANSI.Data[Count] := ANSI.Data[Count + 1];
|
||||||
|
|
||||||
|
FillChar (ANSI.Data[MaxLines], SizeOf(RecAnsiBufferLine), #0);
|
||||||
|
|
||||||
|
If LastLine > 1 Then Dec(LastLine);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.InsertLine (Line: LongInt);
|
||||||
|
Var
|
||||||
|
Count : LongInt;
|
||||||
|
Begin
|
||||||
|
For Count := MaxLines DownTo Line + 1 Do
|
||||||
|
ANSI.Data[Count] := ANSI.Data[Count - 1];
|
||||||
|
|
||||||
|
FillChar(ANSI.Data[Line], SizeOf(RecAnsiBufferLine), #0);
|
||||||
|
|
||||||
|
If LastLine < MaxLines Then Inc(LastLine);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function TEditorANSI.GetWrapPos (Var Line; LineSize: Byte; WrapPos: Byte) : Byte;
|
||||||
|
Var
|
||||||
|
Data : Array[1..255] of RecAnsiBufferChar absolute Line;
|
||||||
|
Begin
|
||||||
|
If GetLineLength(Line, LineSize) < WrapPos Then Begin
|
||||||
|
Result := 0;
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Result := LineSize;
|
||||||
|
|
||||||
|
While (Result > 0) and ((Data[Result].Ch <> ' ') or (Result > WrapPos)) Do
|
||||||
|
Dec (Result);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function TEditorANSI.GetLineLength (Var Line; LineSize: Byte) : Byte;
|
||||||
|
Var
|
||||||
|
Data : Array[1..255] of RecAnsiBufferChar absolute Line;
|
||||||
|
Begin
|
||||||
|
Result := LineSize;
|
||||||
|
|
||||||
|
While (Result > 0) and (Data[Result].Ch = #0) Do
|
||||||
|
Dec (Result);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.Reformat;
|
||||||
|
Var
|
||||||
|
WrapData : Array[1..255] of RecAnsiBufferChar;
|
||||||
|
TempStr : Array[1..255] of RecAnsiBufferChar;
|
||||||
|
NewLine : Array[1..255] of RecAnsiBufferChar;
|
||||||
|
Count : LongInt;
|
||||||
|
LineSize : Byte;
|
||||||
|
StartY : Byte;
|
||||||
|
StartLine : LongInt;
|
||||||
|
EndLine : LongInt;
|
||||||
|
First : Boolean = True;
|
||||||
|
|
||||||
|
Procedure Update;
|
||||||
|
Var
|
||||||
|
NewY : LongInt;
|
||||||
|
Begin
|
||||||
|
NewY := StartY + EndLine - StartLine + 1;
|
||||||
|
|
||||||
|
If NewY > WinSize Then NewY := WinSize;
|
||||||
|
|
||||||
|
If CurY > WinSize Then
|
||||||
|
ScrollDown
|
||||||
|
Else
|
||||||
|
DrawPage (StartY, NewY, True);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Begin
|
||||||
|
FillChar (WrapData, SizeOf(WrapData), #0);
|
||||||
|
|
||||||
|
Count := CurLine;
|
||||||
|
StartY := CurY;
|
||||||
|
StartLine := Count;
|
||||||
|
|
||||||
|
While Count <= MaxLines Do Begin
|
||||||
|
If Count > LastLine Then LastLine := Count;
|
||||||
|
|
||||||
|
FillChar (TempStr, SizeOf(TempStr), #0);
|
||||||
|
Move (Ansi.Data[Count], TempStr, SizeOf(Ansi.Data[Count]));
|
||||||
|
|
||||||
|
If Not IsBlankLine(WrapData, 255) Then Begin
|
||||||
|
If IsBlankLine(TempStr, 255) Then Begin
|
||||||
|
If Count < LastLine Then Begin
|
||||||
|
InsertLine(Count);
|
||||||
|
EndLine := MaxLines;
|
||||||
|
End Else
|
||||||
|
EndLine := Count;
|
||||||
|
|
||||||
|
Move (WrapData, ANSI.Data[Count], SizeOf(Ansi.Data[Count]));
|
||||||
|
|
||||||
|
Update;
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
FillChar (NewLine, SizeOf(NewLine), #0);
|
||||||
|
|
||||||
|
LineSize := GetLineLength(WrapData, 255);
|
||||||
|
|
||||||
|
Move (WrapData, NewLine, LineSize * SizeOf(RecAnsiBufferChar));
|
||||||
|
|
||||||
|
NewLine[LineSize + 1].Ch := ' ';
|
||||||
|
NewLine[LineSize + 1].Attr := WrapData[LineSize].Attr;
|
||||||
|
|
||||||
|
Move (TempStr, NewLine[LineSize + 2], GetLineLength(TempStr, 255) * SizeOf(RecAnsiBufferChar));
|
||||||
|
Move (NewLine, TempStr, SizeOf(NewLine));
|
||||||
|
End;
|
||||||
|
|
||||||
|
FillChar (WrapData, SizeOf(WrapData), #0);
|
||||||
|
|
||||||
|
LineSize := GetWrapPos(TempStr, 255, RowSize);
|
||||||
|
|
||||||
|
If LineSize > 0 Then Begin
|
||||||
|
Move (TempStr[LineSize], WrapData, (GetLineLength(TempStr, 255) - LineSize + 1) * SizeOf(RecAnsiBufferChar));
|
||||||
|
FillChar (TempStr[LineSize], (255 - LineSize) * SizeOf(RecAnsiBufferChar), #0);
|
||||||
|
|
||||||
|
TrimLine (WrapData, 255);
|
||||||
|
|
||||||
|
If First Then Begin
|
||||||
|
If CurX > LineSize Then Begin
|
||||||
|
CurX := CurX - LineSize;
|
||||||
|
|
||||||
|
Inc (CurY);
|
||||||
|
Inc (CurLine);
|
||||||
|
End;
|
||||||
|
|
||||||
|
First := False;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
FillChar (ANSI.Data[Count], SizeOf(ANSI.Data[Count]), #0);
|
||||||
|
Move (TempStr, ANSI.Data[Count], RowSize * SizeOf(RecAnsiBufferChar));
|
||||||
|
|
||||||
|
If LineSize = 0 Then Begin
|
||||||
|
If First Then Begin
|
||||||
|
CurX := 1;
|
||||||
|
|
||||||
|
Inc (CurLine);
|
||||||
|
Inc (CurY);
|
||||||
|
|
||||||
|
If CurLine > LastLine Then LastLine := CurLine;
|
||||||
|
|
||||||
|
EndLine := Count + 1;
|
||||||
|
End Else
|
||||||
|
EndLine := Count;
|
||||||
|
|
||||||
|
Update;
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Inc (Count);
|
||||||
|
End;
|
||||||
|
|
||||||
|
// Update;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.ReDrawTemplate;
|
||||||
|
// temp stuff to be replaced by real template
|
||||||
|
Var
|
||||||
|
B : TAnsiMenuBox;
|
||||||
|
Begin
|
||||||
|
TBBSCore(Owner).io.AllowArrow := True;
|
||||||
|
|
||||||
|
TBBSCore(Owner).io.AnsiColor(7);
|
||||||
|
TBBSCore(Owner).io.AnsiClear;
|
||||||
|
|
||||||
|
(*
|
||||||
|
B := TAnsiMenuBox.Create;
|
||||||
|
|
||||||
|
B.FrameType := 1;
|
||||||
|
|
||||||
|
B.Open (5, 2, 75, 23);
|
||||||
|
B.Free;
|
||||||
|
|
||||||
|
WinX1 := 6;
|
||||||
|
WinX2 := 74;
|
||||||
|
WinY1 := 3;
|
||||||
|
WinY2 := 22;
|
||||||
|
*)
|
||||||
|
|
||||||
|
WinX1 := 1;
|
||||||
|
WinX2 := 79;
|
||||||
|
WinY1 := 2;
|
||||||
|
WinY2 := 23;
|
||||||
|
|
||||||
|
WinSize := WinY2 - WinY1 + 1;
|
||||||
|
RowSize := WinX2 - WinX1 + 1;
|
||||||
|
CurX := 1;
|
||||||
|
CurY := 1;
|
||||||
|
ClearEOL := RowSize >= 79;
|
||||||
|
|
||||||
|
LoadANSI;
|
||||||
|
FindLastLine;
|
||||||
|
|
||||||
|
DrawPage(1, WinSize, False);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.LocateCursor;
|
||||||
|
Begin
|
||||||
|
CurLength := GetLineLength(ANSI.Data[CurLine], RowSize);
|
||||||
|
|
||||||
|
If CurX < 1 Then CurX := 1;
|
||||||
|
If CurX > CurLength Then CurX := CurLength + 1;
|
||||||
|
If CurY < 1 Then CurY := 1;
|
||||||
|
|
||||||
|
While TopLine + CurY - 1 > LastLine Do
|
||||||
|
Dec (CurY);
|
||||||
|
|
||||||
|
If Not DrawMode Then Begin
|
||||||
|
If (CurX > 1) and (CurX = CurLength + 1) Then
|
||||||
|
CurAttr := ANSI.Data[CurLine][CurX - 1].Attr
|
||||||
|
Else
|
||||||
|
CurAttr := ANSI.Data[CurLine][CurX].Attr;
|
||||||
|
|
||||||
|
If CurAttr = 0 Then CurAttr := 7;
|
||||||
|
End;
|
||||||
|
|
||||||
|
With TBBSCore(Owner).io Do Begin
|
||||||
|
|
||||||
|
//AnsiGotoXY (1, 1);
|
||||||
|
//BufAddStr ('X:' + strI2S(CurX) + ' Y:' + strI2S(CurY) + ' CL:' + strI2S(CurLine) + ' TL:' + strI2S(TopLine) + ' Last:' + strI2S(LastLine) + ' Len:' + strI2S(GetLineLength(ANSI.Data[CurLine], 80)) + ' Row:' + strI2S(RowSize) + ' ');
|
||||||
|
|
||||||
|
AnsiGotoXY (WinX1 + CurX - 1, WinY1 + CurY - 1);
|
||||||
|
AnsiColor (CurAttr);
|
||||||
|
|
||||||
|
BufFlush;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.DrawPage (StartY, EndY: Byte; ExitEOF: Boolean);
|
||||||
|
Var
|
||||||
|
CountY : LongInt;
|
||||||
|
CountX : Byte;
|
||||||
|
Begin
|
||||||
|
For CountY := StartY to EndY Do Begin
|
||||||
|
If TopLine + CountY - 1 > LastLine + 1 Then Begin
|
||||||
|
TBBSCore(Owner).io.AnsiGotoXY (WinX1, WinY1 + CountY - 1);
|
||||||
|
TBBSCore(Owner).io.AnsiColor (7);
|
||||||
|
|
||||||
|
If ClearEOL Then
|
||||||
|
TBBSCore(Owner).io.AnsiClrEOL
|
||||||
|
Else
|
||||||
|
TBBSCore(Owner).io.BufAddStr (strRep(' ', RowSize));
|
||||||
|
End Else
|
||||||
|
If TopLine + CountY - 1 = LastLine + 1 Then Begin
|
||||||
|
TBBSCore(Owner).io.AnsiGotoXY (WinX1, WinY1 + CountY - 1);
|
||||||
|
TBBSCore(Owner).io.AnsiColor (12);
|
||||||
|
TBBSCore(Owner).io.BufAddStr (strPadC('-----END-----', RowSize, ' '));
|
||||||
|
|
||||||
|
If ExitEOF Then Break;
|
||||||
|
End Else
|
||||||
|
DrawLine (TopLine + CountY - 1, 1, CountY);
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.ScrollUp;
|
||||||
|
Var
|
||||||
|
NewTop : LongInt;
|
||||||
|
Begin
|
||||||
|
NewTop := TopLine - (WinSize DIV 2) + 1;
|
||||||
|
|
||||||
|
If NewTop < 1 Then NewTop := 1;
|
||||||
|
|
||||||
|
CurY := CurLine - NewTop + 1;
|
||||||
|
TopLine := NewTop;
|
||||||
|
|
||||||
|
DrawPage(1, WinSize, False);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.ScrollDown;
|
||||||
|
Var
|
||||||
|
NewTop : LongInt;
|
||||||
|
Begin
|
||||||
|
NewTop := TopLine + (WinSize DIV 2) + 1;
|
||||||
|
|
||||||
|
While NewTop >= MaxLines Do
|
||||||
|
Dec (NewTop, 2);
|
||||||
|
|
||||||
|
CurY := CurLine - NewTop + 1;
|
||||||
|
TopLine := NewTop;
|
||||||
|
|
||||||
|
DrawPage(1, WinSize, False);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function TEditorANSI.LineUp : Boolean;
|
||||||
|
Begin
|
||||||
|
Result := False;
|
||||||
|
|
||||||
|
If CurLine = 1 Then Exit;
|
||||||
|
|
||||||
|
Dec (CurLine);
|
||||||
|
Dec (CurY);
|
||||||
|
|
||||||
|
If CurX > GetLineLength(ANSI.Data[CurLine], 80) Then CurX := GetLineLength(ANSI.Data[CurLine], 80) + 1;
|
||||||
|
|
||||||
|
If CurY < 1 Then Begin
|
||||||
|
ScrollUp;
|
||||||
|
|
||||||
|
Result := True;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function TEditorANSI.LineDown (Reset: Boolean) : Boolean;
|
||||||
|
Begin
|
||||||
|
Result := False;
|
||||||
|
|
||||||
|
If CurLine >= MaxLines Then Exit;
|
||||||
|
|
||||||
|
Inc (CurLine);
|
||||||
|
Inc (CurY);
|
||||||
|
|
||||||
|
If Reset Then CurX := 1;
|
||||||
|
|
||||||
|
If CurX > GetLineLength(ANSI.Data[CurLine], 80) Then CurX := GetLineLength(ANSI.Data[CurLine], 80) + 1;
|
||||||
|
|
||||||
|
If CurY > WinSize Then Begin
|
||||||
|
Result := True;
|
||||||
|
|
||||||
|
ScrollDown;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
(*
|
||||||
|
Procedure TEditorANSI.DrawLine (Line: LongInt; XP, YP: Byte);
|
||||||
|
Var
|
||||||
|
Count : Byte;
|
||||||
|
Begin
|
||||||
|
TBBSCore(Owner).io.AnsiGotoXY (WinX1 + XP - 1, WinY1 + YP - 1);
|
||||||
|
|
||||||
|
For Count := XP to RowSize Do Begin
|
||||||
|
If ANSI.Data[Line][Count].Ch = #0 Then Begin
|
||||||
|
TBBSCore(Owner).io.AnsiColor (7);
|
||||||
|
TBBSCore(Owner).io.BufAddChar (' ');
|
||||||
|
End Else Begin
|
||||||
|
TBBSCore(Owner).io.AnsiColor (ANSI.Data[Line][Count].Attr);
|
||||||
|
TBBSCore(Owner).io.BufAddChar (ANSI.Data[Line][Count].Ch);
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
*)
|
||||||
|
|
||||||
|
Procedure TEditorANSI.DrawLine (Line: LongInt; XP, YP: Byte);
|
||||||
|
Var
|
||||||
|
Count : Byte;
|
||||||
|
LineLen : Byte;
|
||||||
|
Begin
|
||||||
|
TBBSCore(Owner).io.AnsiGotoXY (WinX1 + XP - 1, WinY1 + YP - 1);
|
||||||
|
|
||||||
|
LineLen := GetLineLength(ANSI.Data[Line], RowSize);
|
||||||
|
|
||||||
|
For Count := XP to LineLen Do Begin
|
||||||
|
If ANSI.Data[Line][Count].Ch = #0 Then Begin
|
||||||
|
TBBSCore(Owner).io.AnsiColor (7);
|
||||||
|
TBBSCore(Owner).io.BufAddChar (' ');
|
||||||
|
End Else Begin
|
||||||
|
TBBSCore(Owner).io.AnsiColor (ANSI.Data[Line][Count].Attr);
|
||||||
|
TBBSCore(Owner).io.BufAddChar (ANSI.Data[Line][Count].Ch);
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
If LineLen < RowSize Then
|
||||||
|
If ClearEOL Then Begin
|
||||||
|
TBBSCore(Owner).io.AnsiColor (7);
|
||||||
|
TBBSCore(Owner).io.AnsiClrEOL;
|
||||||
|
End Else Begin
|
||||||
|
TBBSCore(Owner).io.AnsiColor (7);
|
||||||
|
TBBSCore(Owner).io.BufAddStr (strRep(' ', LineLen - RowSize));
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.DoDelete;
|
||||||
|
Var
|
||||||
|
JoinLen : Byte;
|
||||||
|
JoinPos : Byte;
|
||||||
|
JoinBuf : Array[1..255] of RecAnsiBufferChar;
|
||||||
|
Begin
|
||||||
|
If CurX <= CurLength Then Begin
|
||||||
|
Move (ANSI.Data[CurLine][CurX + 1], ANSI.Data[CurLine][CurX], (CurLength - 1) * SizeOf(RecAnsiBufferChar));
|
||||||
|
|
||||||
|
ANSI.Data[CurLine][CurLength].Ch := #0;
|
||||||
|
|
||||||
|
DrawLine (CurLine, CurX, CurY);
|
||||||
|
End Else
|
||||||
|
If CurLine < LastLine Then
|
||||||
|
If (CurLength = 0) and (LastLine > 1) Then Begin
|
||||||
|
DeleteLine (CurLine);
|
||||||
|
DrawPage (CurY, WinSize, False);
|
||||||
|
End Else Begin
|
||||||
|
JoinLen := GetLineLength(ANSI.Data[CurLine + 1], RowSize);
|
||||||
|
|
||||||
|
If CurLength + JoinLen <= RowSize Then Begin
|
||||||
|
Move (ANSI.Data[CurLine + 1], ANSI.Data[CurLine][CurX], SizeOf(RecAnsiBufferChar) * JoinLen);
|
||||||
|
DeleteLine (CurLine + 1);
|
||||||
|
DrawPage (CurY, WinSize, False); //optimize
|
||||||
|
End Else Begin
|
||||||
|
JoinPos := GetWrapPos(ANSI.Data[CurLine + 1], RowSize, RowSize - CurLength);
|
||||||
|
|
||||||
|
If JoinPos > 0 Then Begin
|
||||||
|
Move (ANSI.Data[CurLine + 1], ANSI.Data[CurLine][CurX], SizeOf(RecAnsiBufferChar) * (JoinPos - 1));
|
||||||
|
|
||||||
|
FillChar (JoinBuf, SizeOf(JoinBuf), #0);
|
||||||
|
Move (ANSI.Data[CurLine + 1][JoinPos + 1], JoinBuf, (JoinLen - JoinPos + 1) * SizeOf(RecAnsiBufferChar));
|
||||||
|
Move (JoinBuf, ANSI.Data[CurLine + 1], RowSize * SizeOf(RecAnsiBufferChar));
|
||||||
|
|
||||||
|
DrawPage (CurY, CurY + 1, True);
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.DoBackSpace;
|
||||||
|
Var
|
||||||
|
JoinPos : Byte;
|
||||||
|
JoinBuf : Array[1..255] of RecAnsiBufferChar;
|
||||||
|
Begin
|
||||||
|
If CurX > 1 Then Begin
|
||||||
|
Dec (CurX);
|
||||||
|
Move (ANSI.Data[CurLine][CurX + 1], ANSI.Data[CurLine][CurX], SizeOf(RecAnsiBufferChar) * (80 - CurX + 1));
|
||||||
|
|
||||||
|
ANSI.Data[CurLine][80].Ch := #0;
|
||||||
|
|
||||||
|
If CurX > GetLineLength(ANSI.Data[CurLine], 80) Then
|
||||||
|
TBBSCore(Owner).io.OutBS(1, True)
|
||||||
|
Else
|
||||||
|
DrawLine (CurLine, CurX, CurY);
|
||||||
|
End Else
|
||||||
|
If CurLine > 1 Then Begin
|
||||||
|
If GetLineLength(ANSI.Data[CurLine - 1], 80) + CurLength <= RowSize Then Begin
|
||||||
|
CurX := GetLineLength(ANSI.Data[CurLine - 1], 80) + 1;
|
||||||
|
|
||||||
|
Move (ANSI.Data[CurLine], ANSI.Data[CurLine - 1][CurX], SizeOf(RecAnsiBufferChar) * CurLength);
|
||||||
|
|
||||||
|
DeleteLine (CurLine);
|
||||||
|
|
||||||
|
If Not LineUp Then DrawPage (CurY, WinSize, False); //optimize
|
||||||
|
End Else Begin
|
||||||
|
JoinPos := GetWrapPos(ANSI.Data[CurLine], RowSize, RowSize - GetLineLength(ANSI.Data[CurLine - 1], RowSize));
|
||||||
|
|
||||||
|
If JoinPos > 0 Then Begin
|
||||||
|
CurX := GetLineLength(ANSI.Data[CurLine - 1], 80) + 1;
|
||||||
|
|
||||||
|
Move (ANSI.Data[CurLine], ANSI.Data[CurLine - 1][CurX], SizeOf(RecAnsiBufferChar) * (JoinPos - 1));
|
||||||
|
FillChar (JoinBuf, SizeOf(JoinBuf), #0);
|
||||||
|
Move (ANSI.Data[CurLine][JoinPos + 1], JoinBuf, (CurLength - JoinPos + 1) * SizeOf(RecAnsiBufferChar));
|
||||||
|
Move (JoinBuf, ANSI.Data[CurLine], RowSize * SizeOf(RecAnsiBufferChar));
|
||||||
|
|
||||||
|
If Not LineUp Then DrawPage (CurY, WinSize, False);
|
||||||
|
End Else Begin
|
||||||
|
LineUp;
|
||||||
|
|
||||||
|
CurX := CurLength + 1;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.DoChar (Ch: Char);
|
||||||
|
Begin
|
||||||
|
If InsertMode Then Begin
|
||||||
|
Move (ANSI.Data[CurLine][CurX], ANSI.Data[CurLine][CurX + 1], SizeOf(RecAnsiBufferChar) * (CurLength - CurX + 1));
|
||||||
|
|
||||||
|
ANSI.Data[CurLine][CurX].Ch := Ch;
|
||||||
|
ANSI.Data[CurLine][CurX].Attr := CurAttr;
|
||||||
|
|
||||||
|
If CurLength < RowSize {-1} Then Begin
|
||||||
|
If CurX <= CurLength Then
|
||||||
|
DrawLine (CurLine, CurX, CurY)
|
||||||
|
Else Begin
|
||||||
|
TBBSCore(Owner).io.AnsiColor (CurAttr);
|
||||||
|
TBBSCore(Owner).io.BufAddChar (Ch);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Inc (CurX);
|
||||||
|
End Else Begin
|
||||||
|
Inc (CurX);
|
||||||
|
|
||||||
|
Reformat;
|
||||||
|
End;
|
||||||
|
End Else
|
||||||
|
If CurX <= RowSize Then Begin
|
||||||
|
ANSI.Data[CurLine][CurX].Ch := Ch;
|
||||||
|
ANSI.Data[CurLine][CurX].Attr := CurAttr;
|
||||||
|
|
||||||
|
TBBSCore(Owner).io.AnsiColor (CurAttr);
|
||||||
|
TBBSCore(Owner).io.BufAddChar (Ch);
|
||||||
|
|
||||||
|
Inc (CurX);
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.PageUp;
|
||||||
|
Var
|
||||||
|
NewTop : LongInt;
|
||||||
|
Begin
|
||||||
|
If CurLine = 1 Then Exit;
|
||||||
|
|
||||||
|
If TopLine = 1 Then Begin
|
||||||
|
CurLine := 1;
|
||||||
|
CurY := 1;
|
||||||
|
CurX := 1;
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Dec (CurLine, WinSize);
|
||||||
|
|
||||||
|
If CurLine < 1 Then Begin
|
||||||
|
CurLine := 1;
|
||||||
|
NewTop := 1;
|
||||||
|
End Else Begin
|
||||||
|
NewTop := TopLine - WinSize;
|
||||||
|
|
||||||
|
If NewTop < 1 Then NewTop := 1;
|
||||||
|
End;
|
||||||
|
|
||||||
|
CurY := CurLine - NewTop + 1;
|
||||||
|
TopLine := NewTop;
|
||||||
|
|
||||||
|
DrawPage(1, WinSize, False);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.PageDown;
|
||||||
|
Var
|
||||||
|
NewTop : LongInt;
|
||||||
|
Begin
|
||||||
|
If CurLine = LastLine Then Exit;
|
||||||
|
|
||||||
|
If (LastLine > TopLine) And (LastLine <= TopLine + WinSize - 1) Then Begin
|
||||||
|
CurLine := LastLine;
|
||||||
|
CurY := CurLine - TopLine + 1;
|
||||||
|
CurX := 1;
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Inc (CurLine, WinSize);
|
||||||
|
|
||||||
|
If CurLine > LastLine Then CurLine := LastLine;
|
||||||
|
|
||||||
|
NewTop := TopLine + WinSize;
|
||||||
|
|
||||||
|
While NewTop >= LastLine - (WinSize DIV 2) Do
|
||||||
|
Dec (NewTop);
|
||||||
|
|
||||||
|
If NewTop < 1 Then NewTop := 1;
|
||||||
|
|
||||||
|
CurY := CurLine - NewTop + 1;
|
||||||
|
TopLine := NewTop;
|
||||||
|
|
||||||
|
DrawPage(1, WinSize, False);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.LoadANSI;
|
||||||
|
Var
|
||||||
|
F : File;
|
||||||
|
B : Array[1..1024] of Char;
|
||||||
|
BR : LongInt;
|
||||||
|
A : LongInt;
|
||||||
|
C : LongINt;
|
||||||
|
Begin
|
||||||
|
Assign (F, '\code\mystic1\text\gj-glue1.ans');
|
||||||
|
Reset (F, 1);
|
||||||
|
|
||||||
|
While Not Eof(F) Do Begin
|
||||||
|
BlockRead (F, B, SizeOf(B), BR);
|
||||||
|
|
||||||
|
If BR = 0 Then Break;
|
||||||
|
|
||||||
|
ANSI.ProcessBuf(B, BR);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Close(F);
|
||||||
|
|
||||||
|
For A := 1 to ANSI.Lines Do
|
||||||
|
For C := RowSize + 1 to 80 Do Begin
|
||||||
|
ANSI.Data[A][C].Ch := #0;
|
||||||
|
ANSI.Data[A][C].Attr := 0;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure TEditorANSI.DoEnter;
|
||||||
|
Var
|
||||||
|
TempLine : RecAnsiBufferLine;
|
||||||
|
Begin
|
||||||
|
If InsertMode and IsBlankLine(ANSI.Data[MaxLines], 80) Then Begin
|
||||||
|
If CurX > CurLength Then Begin
|
||||||
|
InsertLine (CurLine + 1);
|
||||||
|
|
||||||
|
If Not LineDown(True) Then DrawPage(CurY, WinSize, True);
|
||||||
|
End Else Begin
|
||||||
|
TempLine := ANSI.Data[CurLine];
|
||||||
|
|
||||||
|
InsertLine (CurLine + 1);
|
||||||
|
|
||||||
|
FillChar (ANSI.Data[CurLine][CurX], SizeOf(RecAnsiBufferChar) * (80 - CurX + 1), #0);
|
||||||
|
Move (TempLine[CurX], ANSI.Data[CurLine + 1][1], SizeOf(RecAnsiBufferChar) * (80 - CurX + 1));
|
||||||
|
|
||||||
|
If Not LineDown(True) Then
|
||||||
|
DrawPage (CurY - 1, WinSize, True);
|
||||||
|
End;
|
||||||
|
End Else
|
||||||
|
LineDown(True);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function TEditorANSI.Edit : Boolean;
|
||||||
|
Var
|
||||||
|
Ch : Char;
|
||||||
|
Attr : Byte;
|
||||||
|
Begin
|
||||||
|
Result := False;
|
||||||
|
|
||||||
|
ReDrawTemplate;
|
||||||
|
|
||||||
|
While Not TBBSCore(Owner).ShutDown Do Begin
|
||||||
|
LocateCursor;
|
||||||
|
|
||||||
|
Ch := TBBSCore(Owner).io.GetKey;
|
||||||
|
|
||||||
|
If Session.io.IsArrow Then Begin
|
||||||
|
Case Ch of
|
||||||
|
#71 : CurX := 1;
|
||||||
|
#79 : CurX := CurLength + 1;
|
||||||
|
#72 : LineUp;
|
||||||
|
#80 : If CurLine < LastLine Then LineDown(False);
|
||||||
|
#75 : If CurX > 1 Then Dec(CurX);
|
||||||
|
#77 : If CurX <= RowSize Then Inc(CurX);
|
||||||
|
#73 : PageUp;
|
||||||
|
#81 : PageDown;
|
||||||
|
#83 : DoDelete;
|
||||||
|
End;
|
||||||
|
End Else
|
||||||
|
Case Ch of
|
||||||
|
^V : InsertMode := Not InsertMode; //update on screen
|
||||||
|
^Y : Begin
|
||||||
|
DeleteLine (CurLine);
|
||||||
|
|
||||||
|
If CurLine > LastLine Then
|
||||||
|
InsertLine (CurLine);
|
||||||
|
|
||||||
|
DrawPage (CurY, WinSize, False);
|
||||||
|
End;
|
||||||
|
^Z : Break;
|
||||||
|
#08 : DoBackSpace;
|
||||||
|
#13 : DoEnter;
|
||||||
|
#32..
|
||||||
|
#254 : If (CurLength >= RowSize) and (GetWrapPos(ANSI.Data[CurLine], RowSize, RowSize) = 0) Then Begin
|
||||||
|
If CurX = CurLength + 1 Then Begin
|
||||||
|
LineDown(True);
|
||||||
|
End;
|
||||||
|
End Else
|
||||||
|
DoChar(Ch);
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
End.
|
End.
|
|
@ -90,6 +90,7 @@ Type
|
||||||
Function ExportFileList (NewFiles: Boolean; Qwk: Boolean) : Boolean;
|
Function ExportFileList (NewFiles: Boolean; Qwk: Boolean) : Boolean;
|
||||||
Function ArchiveView (FName : String) : Boolean;
|
Function ArchiveView (FName : String) : Boolean;
|
||||||
Procedure FileGroupChange (Ops: String; FirstBase, Intro : Boolean);
|
Procedure FileGroupChange (Ops: String; FirstBase, Intro : Boolean);
|
||||||
|
Procedure XferDisconnect;
|
||||||
Procedure UploadFile;
|
Procedure UploadFile;
|
||||||
Procedure DownloadBatch;
|
Procedure DownloadBatch;
|
||||||
Procedure NewFileScan (Mode: Char);
|
Procedure NewFileScan (Mode: Char);
|
||||||
|
@ -671,7 +672,7 @@ Begin
|
||||||
Temp.NewScan := FBase.DefScan;
|
Temp.NewScan := FBase.DefScan;
|
||||||
Temp.LastNew := CurDateDos;
|
Temp.LastNew := CurDateDos;
|
||||||
|
|
||||||
If Temp.NewScan = 2 Then Dec(Temp.NewScan);
|
If Temp.NewScan = 2 Then Dec (Temp.NewScan);
|
||||||
|
|
||||||
Assign (FScanFile, Config.DataPath + FBase.FileName + '.scn');
|
Assign (FScanFile, Config.DataPath + FBase.FileName + '.scn');
|
||||||
{$I-} Reset (FScanFile); {$I+}
|
{$I-} Reset (FScanFile); {$I+}
|
||||||
|
@ -1160,12 +1161,14 @@ Var
|
||||||
|
|
||||||
If Session.User.Access(FBase.ListACS) Then Begin
|
If Session.User.Access(FBase.ListACS) Then Begin
|
||||||
Inc (Total);
|
Inc (Total);
|
||||||
|
|
||||||
Session.io.PromptInfo[1] := strI2S(Total);
|
Session.io.PromptInfo[1] := strI2S(Total);
|
||||||
Session.io.PromptInfo[2] := FBase.Name;
|
Session.io.PromptInfo[2] := FBase.Name;
|
||||||
|
|
||||||
GetFileScan;
|
GetFileScan;
|
||||||
|
|
||||||
Session.io.PromptInfo[3] := Session.io.OutYN(FScan.NewScan > 0);
|
Session.io.PromptInfo[3] := Session.io.OutYN(FScan.NewScan > 0);
|
||||||
|
|
||||||
Session.io.OutFull (Session.GetPrompt(201));
|
Session.io.OutFull (Session.GetPrompt(201));
|
||||||
|
|
||||||
If (Total MOD Config.FColumns = 0) And (Total > 0) Then Session.io.OutRawLn('');
|
If (Total MOD Config.FColumns = 0) And (Total > 0) Then Session.io.OutRawLn('');
|
||||||
|
@ -1188,25 +1191,33 @@ Var
|
||||||
B : Word;
|
B : Word;
|
||||||
Begin
|
Begin
|
||||||
B := 0;
|
B := 0;
|
||||||
|
|
||||||
Reset (FBaseFile);
|
Reset (FBaseFile);
|
||||||
|
|
||||||
Repeat
|
Repeat
|
||||||
Read (FBaseFile, FBase);
|
Read (FBaseFile, FBase);
|
||||||
|
|
||||||
If Session.User.Access(FBase.ListACS) Then Inc(B);
|
If Session.User.Access(FBase.ListACS) Then Inc(B);
|
||||||
|
|
||||||
If A = B Then Break;
|
If A = B Then Break;
|
||||||
Until False;
|
Until False;
|
||||||
|
|
||||||
GetFileScan;
|
GetFileScan;
|
||||||
|
|
||||||
Session.io.PromptInfo[1] := FBase.Name;
|
Session.io.PromptInfo[1] := FBase.Name;
|
||||||
|
|
||||||
If FBase.DefScan = 2 Then Begin
|
If FBase.DefScan = 2 Then Begin
|
||||||
FScan.NewScan := 1;
|
FScan.NewScan := 1;
|
||||||
|
|
||||||
Session.io.OutFullLn (Session.GetPrompt(289));
|
Session.io.OutFullLn (Session.GetPrompt(289));
|
||||||
End Else
|
End Else
|
||||||
If FScan.NewScan = 0 Then Begin
|
If FScan.NewScan = 0 Then Begin
|
||||||
FScan.NewScan := 1;
|
FScan.NewScan := 1;
|
||||||
|
|
||||||
Session.io.OutFullLn (Session.GetPrompt(204));
|
Session.io.OutFullLn (Session.GetPrompt(204));
|
||||||
End Else Begin
|
End Else Begin
|
||||||
FScan.NewScan := 0;
|
FScan.NewScan := 0;
|
||||||
|
|
||||||
Session.io.OutFullLn (Session.GetPrompt(203));
|
Session.io.OutFullLn (Session.GetPrompt(203));
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
@ -2014,6 +2025,7 @@ Var
|
||||||
OkFile := False;
|
OkFile := False;
|
||||||
|
|
||||||
If (FDir.Flags And FDirDeleted <> 0) Then Exit;
|
If (FDir.Flags And FDirDeleted <> 0) Then Exit;
|
||||||
|
If (FDir.Flags AND FDirOffline <> 0) And (Not Session.User.Access(Config.AcsSeeOffline)) Then Exit;
|
||||||
If (FDir.Flags And FDirInvalid <> 0) And (Not Session.User.Access(Config.AcsSeeUnvalid)) Then Exit;
|
If (FDir.Flags And FDirInvalid <> 0) And (Not Session.User.Access(Config.AcsSeeUnvalid)) Then Exit;
|
||||||
If (FDir.Flags And FDirFailed <> 0) And (Not Session.User.Access(Config.AcsSeeFailed)) Then Exit;
|
If (FDir.Flags And FDirFailed <> 0) And (Not Session.User.Access(Config.AcsSeeFailed)) Then Exit;
|
||||||
|
|
||||||
|
@ -3217,6 +3229,7 @@ Var
|
||||||
Dir : String[40];
|
Dir : String[40];
|
||||||
Min : Integer;
|
Min : Integer;
|
||||||
Sec : Byte;
|
Sec : Byte;
|
||||||
|
HangUp : Boolean;
|
||||||
Begin
|
Begin
|
||||||
If FBase.FileName = '' Then Begin
|
If FBase.FileName = '' Then Begin
|
||||||
Session.io.OutFullLn(Session.GetPrompt(38));
|
Session.io.OutFullLn(Session.GetPrompt(38));
|
||||||
|
@ -3267,6 +3280,8 @@ Begin
|
||||||
Else
|
Else
|
||||||
Dir := FBase.Path;
|
Dir := FBase.Path;
|
||||||
|
|
||||||
|
HangUp := Session.io.GetYN(Session.GetPrompt(66), False);
|
||||||
|
|
||||||
If SendFile(Dir + FName) Then Begin
|
If SendFile(Dir + FName) Then Begin
|
||||||
Session.SystemLog ('Downloaded: ' + FDir.FileName);
|
Session.SystemLog ('Downloaded: ' + FDir.FileName);
|
||||||
|
|
||||||
|
@ -3284,6 +3299,8 @@ Begin
|
||||||
Session.SystemLog ('Download of ' + FDir.FileName + ' FAILED');
|
Session.SystemLog ('Download of ' + FDir.FileName + ' FAILED');
|
||||||
|
|
||||||
FileErase(Session.TempPath + FName);
|
FileErase(Session.TempPath + FName);
|
||||||
|
|
||||||
|
If HangUp Then XferDisconnect;
|
||||||
End;
|
End;
|
||||||
1 : Session.io.OutFullLn (Session.GetPrompt(224));
|
1 : Session.io.OutFullLn (Session.GetPrompt(224));
|
||||||
2 : Session.io.OutFullLn (Session.GetPrompt(58));
|
2 : Session.io.OutFullLn (Session.GetPrompt(58));
|
||||||
|
@ -3300,6 +3317,23 @@ Begin
|
||||||
Session.io.OutFullLn (Session.GetPrompt(51));
|
Session.io.OutFullLn (Session.GetPrompt(51));
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
Procedure TFileBase.XferDisconnect;
|
||||||
|
Var
|
||||||
|
Timer : LongInt;
|
||||||
|
Begin
|
||||||
|
Timer := TimerSet(1000);
|
||||||
|
|
||||||
|
Session.io.OutFull(Session.GetPrompt(67));
|
||||||
|
|
||||||
|
While Not TimerUp(Timer) Do
|
||||||
|
If Session.io.InKey(1000) <> #255 Then Begin
|
||||||
|
Session.io.OutRawLn('');
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Halt(0);
|
||||||
|
End;
|
||||||
|
|
||||||
Procedure TFileBase.DownloadBatch;
|
Procedure TFileBase.DownloadBatch;
|
||||||
Var
|
Var
|
||||||
A : Byte;
|
A : Byte;
|
||||||
|
@ -3308,6 +3342,7 @@ Var
|
||||||
Dir : String[40];
|
Dir : String[40];
|
||||||
Old : RecFileBase;
|
Old : RecFileBase;
|
||||||
FL : Text;
|
FL : Text;
|
||||||
|
Hangup : Boolean;
|
||||||
Begin
|
Begin
|
||||||
K := 0;
|
K := 0;
|
||||||
|
|
||||||
|
@ -3324,6 +3359,8 @@ Begin
|
||||||
|
|
||||||
If SelectProtocol(True, True) = 'Q' Then Exit;
|
If SelectProtocol(True, True) = 'Q' Then Exit;
|
||||||
|
|
||||||
|
HangUp := Session.io.GetYN(Session.GetPrompt(66), False);
|
||||||
|
|
||||||
Assign (FL, Session.TempPath + 'file.lst');
|
Assign (FL, Session.TempPath + 'file.lst');
|
||||||
ReWrite (FL);
|
ReWrite (FL);
|
||||||
|
|
||||||
|
@ -3397,6 +3434,8 @@ Begin
|
||||||
BatchNum := 0;
|
BatchNum := 0;
|
||||||
|
|
||||||
DirClean (Session.TempPath, '');
|
DirClean (Session.TempPath, '');
|
||||||
|
|
||||||
|
If HangUp Then XferDisconnect;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Procedure TFileBase.FileSearch;
|
Procedure TFileBase.FileSearch;
|
||||||
|
|
|
@ -928,6 +928,7 @@ Begin
|
||||||
BufAddStr (#27 + '[K');
|
BufAddStr (#27 + '[K');
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
(*
|
||||||
Function TBBSIO.Pipe2Ansi (Color: Byte) : String;
|
Function TBBSIO.Pipe2Ansi (Color: Byte) : String;
|
||||||
Begin
|
Begin
|
||||||
Result := '';
|
Result := '';
|
||||||
|
@ -967,8 +968,8 @@ Begin
|
||||||
23: Result := Result + #27 + '[47m';
|
23: Result := Result + #27 + '[47m';
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
*)
|
||||||
|
|
||||||
(*
|
|
||||||
Function TBBSIO.Pipe2Ansi (Color: Byte) : String;
|
Function TBBSIO.Pipe2Ansi (Color: Byte) : String;
|
||||||
Var
|
Var
|
||||||
CurFG : Byte;
|
CurFG : Byte;
|
||||||
|
@ -1033,7 +1034,6 @@ Begin
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
*)
|
|
||||||
|
|
||||||
Function TBBSIO.Attr2Ansi (Attr: Byte) : String;
|
Function TBBSIO.Attr2Ansi (Attr: Byte) : String;
|
||||||
Begin
|
Begin
|
||||||
|
@ -1055,6 +1055,8 @@ Procedure TBBSIO.AnsiGotoXY (X: Byte; Y: Byte);
|
||||||
Begin
|
Begin
|
||||||
If Graphics = 0 Then Exit;
|
If Graphics = 0 Then Exit;
|
||||||
|
|
||||||
|
If (X = Screen.CursorX) and (Y = Screen.CursorY) Then Exit;
|
||||||
|
|
||||||
If X = 0 Then X := Screen.CursorX;
|
If X = 0 Then X := Screen.CursorX;
|
||||||
If Y = 0 Then Y := Screen.CursorY;
|
If Y = 0 Then Y := Screen.CursorY;
|
||||||
|
|
||||||
|
@ -1140,6 +1142,7 @@ Var
|
||||||
Begin
|
Begin
|
||||||
Result := False;
|
Result := False;
|
||||||
NoFile := True;
|
NoFile := True;
|
||||||
|
FileMode := 66;
|
||||||
|
|
||||||
If (Pos(PathSep, FName) > 0) Then Begin
|
If (Pos(PathSep, FName) > 0) Then Begin
|
||||||
If Not FileExist(FName) Then
|
If Not FileExist(FName) Then
|
||||||
|
|
|
@ -62,7 +62,7 @@ Type
|
||||||
Procedure GlobalMessageSearch (Mode: Char);
|
Procedure GlobalMessageSearch (Mode: Char);
|
||||||
Procedure SetMessagePointers;
|
Procedure SetMessagePointers;
|
||||||
Procedure ViewSentEmail;
|
Procedure ViewSentEmail;
|
||||||
Function ResolveOrigin (var mArea: RecMessageBase) : String;
|
Function ResolveOrigin (Var mArea: RecMessageBase) : String;
|
||||||
// QWK and QWKE goodies
|
// QWK and QWKE goodies
|
||||||
Procedure DownloadQWK (Extended: Boolean; Data: String);
|
Procedure DownloadQWK (Extended: Boolean; Data: String);
|
||||||
Procedure UploadREP;
|
Procedure UploadREP;
|
||||||
|
@ -366,7 +366,7 @@ Begin
|
||||||
For A := 1 to Lines Do
|
For A := 1 to Lines Do
|
||||||
Msg^.DoStringLn(MsgText[A]);
|
Msg^.DoStringLn(MsgText[A]);
|
||||||
|
|
||||||
If Session.User.ThisUser.SigUse and (Session.User.ThisUser.SigLength > 0) Then Begin
|
If (MBase.Flags AND MBAutoSigs <> 0) and Session.User.ThisUser.SigUse and (Session.User.ThisUser.SigLength > 0) Then Begin
|
||||||
|
|
||||||
Assign (DF, Config.DataPath + 'autosig.dat');
|
Assign (DF, Config.DataPath + 'autosig.dat');
|
||||||
Reset (DF, 1);
|
Reset (DF, 1);
|
||||||
|
@ -1483,6 +1483,18 @@ Var
|
||||||
Session.io.OutRawLn('');
|
Session.io.OutRawLn('');
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
Procedure RemoveNewScan (PromptNumber: SmallInt);
|
||||||
|
Begin
|
||||||
|
GetMessageScan;
|
||||||
|
|
||||||
|
If MScan.NewScan = 1 Then
|
||||||
|
If Session.io.GetYN(Session.GetPrompt(PromptNumber), False) Then Begin
|
||||||
|
MScan.NewScan := 0;
|
||||||
|
|
||||||
|
SetMessageScan;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
(**************************************************************************)
|
(**************************************************************************)
|
||||||
(**************************************************************************)
|
(**************************************************************************)
|
||||||
(**************************************************************************)
|
(**************************************************************************)
|
||||||
|
@ -1560,7 +1572,7 @@ Var
|
||||||
MsgText[Lines] := MsgBase^.GetString(79);
|
MsgText[Lines] := MsgBase^.GetString(79);
|
||||||
|
|
||||||
If MsgText[Lines][1] = #1 Then Begin
|
If MsgText[Lines][1] = #1 Then Begin
|
||||||
If Copy(MsgText[Lines], 1, 6) = #1 + 'MSGID' Then
|
If Copy(MsgText[Lines], 2, 5) = 'MSGID' Then
|
||||||
ReplyID := Copy(MsgText[Lines], 9, Length(MsgText[Lines]));
|
ReplyID := Copy(MsgText[Lines], 9, Length(MsgText[Lines]));
|
||||||
|
|
||||||
Dec (Lines);
|
Dec (Lines);
|
||||||
|
@ -1667,6 +1679,9 @@ Var
|
||||||
'I' : Begin
|
'I' : Begin
|
||||||
LastRead := MsgBase^.GetHighMsgNum;
|
LastRead := MsgBase^.GetHighMsgNum;
|
||||||
Ansi_View_Message := True;
|
Ansi_View_Message := True;
|
||||||
|
|
||||||
|
RemoveNewScan(495);
|
||||||
|
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
'J' : Begin
|
'J' : Begin
|
||||||
|
@ -2077,6 +2092,9 @@ Var
|
||||||
'G' : Break;
|
'G' : Break;
|
||||||
'I' : Begin
|
'I' : Begin
|
||||||
LastRead := MsgBase^.GetHighMsgNum;
|
LastRead := MsgBase^.GetHighMsgNum;
|
||||||
|
|
||||||
|
RemoveNewScan(495);
|
||||||
|
|
||||||
Break;
|
Break;
|
||||||
End;
|
End;
|
||||||
'?' : Begin
|
'?' : Begin
|
||||||
|
@ -2158,7 +2176,7 @@ Var
|
||||||
Str := MsgBase^.GetString(79);
|
Str := MsgBase^.GetString(79);
|
||||||
|
|
||||||
If Str[1] = #1 Then Begin
|
If Str[1] = #1 Then Begin
|
||||||
If Copy(Str, 1, 6) = #1 + 'MSGID' Then
|
If Copy(Str, 2, 5) = 'MSGID' Then
|
||||||
ReplyID := Copy(Str, 9, Length(Str));
|
ReplyID := Copy(Str, 9, Length(Str));
|
||||||
End Else
|
End Else
|
||||||
Send_Msg_Text (Str);
|
Send_Msg_Text (Str);
|
||||||
|
@ -2220,6 +2238,9 @@ Var
|
||||||
'H' : LastRead := MsgBase^.GetMsgNum - 1;
|
'H' : LastRead := MsgBase^.GetMsgNum - 1;
|
||||||
'I' : Begin
|
'I' : Begin
|
||||||
LastRead := MsgBase^.GetHighMsgNum;
|
LastRead := MsgBase^.GetHighMsgNum;
|
||||||
|
|
||||||
|
RemoveNewScan(494);
|
||||||
|
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
'J' : Begin
|
'J' : Begin
|
||||||
|
@ -2494,24 +2515,34 @@ Var
|
||||||
Lines : Integer;
|
Lines : Integer;
|
||||||
Forced : Boolean;
|
Forced : Boolean;
|
||||||
Old : RecMessageBase;
|
Old : RecMessageBase;
|
||||||
|
SaveGroup : Boolean;
|
||||||
Begin
|
Begin
|
||||||
Old := MBase;
|
Old := MBase;
|
||||||
|
SaveGroup := Session.User.IgnoreGroup;
|
||||||
|
|
||||||
If Email Then Begin
|
If Email Then Begin
|
||||||
Reset (MBaseFile);
|
Reset (MBaseFile);
|
||||||
Read (MBaseFile, MBase);
|
Read (MBaseFile, MBase);
|
||||||
Close (MBaseFile);
|
Close (MBaseFile);
|
||||||
|
|
||||||
|
Session.User.IgnoreGroup := True;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If MBase.FileName = '' Then Begin
|
If MBase.FileName = '' Then Begin
|
||||||
Session.io.OutFullLn (Session.GetPrompt(110));
|
Session.io.OutFullLn (Session.GetPrompt(110));
|
||||||
|
|
||||||
MBase := Old;
|
MBase := Old;
|
||||||
|
Session.User.IgnoreGroup := SaveGroup;
|
||||||
|
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If Not Session.User.Access(MBase.PostACS) Then Begin
|
If Not Session.User.Access(MBase.PostACS) Then Begin
|
||||||
Session.io.OutFullLn (Session.GetPrompt(105));
|
Session.io.OutFullLn (Session.GetPrompt(105));
|
||||||
|
|
||||||
MBase := Old;
|
MBase := Old;
|
||||||
|
Session.User.IgnoreGroup := SaveGroup;
|
||||||
|
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
@ -2583,6 +2614,8 @@ Begin
|
||||||
|
|
||||||
If MsgTo = '' Then Begin
|
If MsgTo = '' Then Begin
|
||||||
MBase := Old;
|
MBase := Old;
|
||||||
|
Session.User.IgnoreGroup := SaveGroup;
|
||||||
|
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
@ -2597,6 +2630,8 @@ Begin
|
||||||
Session.io.OutFull (Session.GetPrompt(307))
|
Session.io.OutFull (Session.GetPrompt(307))
|
||||||
Else Begin
|
Else Begin
|
||||||
MBase := Old;
|
MBase := Old;
|
||||||
|
Session.User.IgnoreGroup := SaveGroup;
|
||||||
|
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
Until MsgSubj <> '';
|
Until MsgSubj <> '';
|
||||||
|
@ -2617,6 +2652,8 @@ Begin
|
||||||
|
|
||||||
If Not OpenCreateBase(MsgBase, MBase) Then Begin
|
If Not OpenCreateBase(MsgBase, MBase) Then Begin
|
||||||
MBase := Old;
|
MBase := Old;
|
||||||
|
Session.User.IgnoreGroup := SaveGroup;
|
||||||
|
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
@ -2670,6 +2707,7 @@ Begin
|
||||||
Session.io.OutFullLn (Session.GetPrompt(109));
|
Session.io.OutFullLn (Session.GetPrompt(109));
|
||||||
|
|
||||||
MBase := Old;
|
MBase := Old;
|
||||||
|
Session.User.IgnoreGroup := SaveGroup;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Procedure TMsgBase.CheckEMail;
|
Procedure TMsgBase.CheckEMail;
|
||||||
|
@ -3411,7 +3449,7 @@ Var
|
||||||
Pick : LongInt;
|
Pick : LongInt;
|
||||||
Begin
|
Begin
|
||||||
Result := '';
|
Result := '';
|
||||||
Loc := Pos('@RANDOM=', mArea.Origin);
|
Loc := Pos('@RANDOM=', strUpper(mArea.Origin));
|
||||||
|
|
||||||
If Loc > 0 Then Begin
|
If Loc > 0 Then Begin
|
||||||
FN := strStripB(Copy(mArea.Origin, Loc + 8, 255), ' ');
|
FN := strStripB(Copy(mArea.Origin, Loc + 8, 255), ' ');
|
||||||
|
|
|
@ -9,21 +9,21 @@ Uses
|
||||||
BBS_Common;
|
BBS_Common;
|
||||||
|
|
||||||
Type
|
Type
|
||||||
PtrMessageLine = ^RecMessageLine;
|
RecAnsiBufferChar = Record
|
||||||
RecMessageLine = Array[1..80] of Record
|
|
||||||
Ch : Char;
|
Ch : Char;
|
||||||
Attr : Byte;
|
Attr : Byte;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
RecMessageAnsi = Array[1..mysMaxMsgLines] of RecMessageLine;
|
RecAnsiBufferLine = Array[1..80] of RecAnsiBufferChar;
|
||||||
// make this a pointer?
|
RecAnsiBuffer = Array[1..mysMaxMsgLines] of RecAnsiBufferLine;
|
||||||
|
|
||||||
TMsgBaseAnsi = Class
|
TMsgBaseAnsi = Class
|
||||||
GotAnsi : Boolean;
|
GotAnsi : Boolean;
|
||||||
GotPipe : Boolean;
|
GotPipe : Boolean;
|
||||||
|
GotClear : Boolean;
|
||||||
PipeCode : String[2];
|
PipeCode : String[2];
|
||||||
Owner : Pointer;
|
Owner : Pointer;
|
||||||
Data : RecMessageAnsi;
|
Data : RecAnsiBuffer;
|
||||||
Code : String;
|
Code : String;
|
||||||
Lines : Word;
|
Lines : Word;
|
||||||
CurY : Word;
|
CurY : Word;
|
||||||
|
@ -87,9 +87,10 @@ Begin
|
||||||
Attr := 7;
|
Attr := 7;
|
||||||
GotAnsi := False;
|
GotAnsi := False;
|
||||||
GotPipe := False;
|
GotPipe := False;
|
||||||
|
GotClear := False;
|
||||||
PipeCode := '';
|
PipeCode := '';
|
||||||
|
|
||||||
FillChar (Data, SizeOf(Data), 0);
|
FillChar (Data, SizeOf(Data), #0);
|
||||||
|
|
||||||
ResetControlCode;
|
ResetControlCode;
|
||||||
End;
|
End;
|
||||||
|
@ -353,7 +354,7 @@ Begin
|
||||||
Case Ch of
|
Case Ch of
|
||||||
#27 : Escape := 1;
|
#27 : Escape := 1;
|
||||||
#9 : MoveXY (CurX + 8, CurY);
|
#9 : MoveXY (CurX + 8, CurY);
|
||||||
#12 : {Edit.ClearScreenData};
|
#12 : GotClear := True;
|
||||||
Else
|
Else
|
||||||
If Ch = '|' Then
|
If Ch = '|' Then
|
||||||
GotPipe := True
|
GotPipe := True
|
||||||
|
|
|
@ -151,8 +151,10 @@
|
||||||
064 |01[|10þ|01] |09Search all file groups? |11
|
064 |01[|10þ|01] |09Search all file groups? |11
|
||||||
; Start your file transfer now &1=selected protocol
|
; Start your file transfer now &1=selected protocol
|
||||||
065 |CR|12Start your |15|&1 |12transfer now...
|
065 |CR|12Start your |15|&1 |12transfer now...
|
||||||
066 UNUSED
|
; Disconnect after download?
|
||||||
067 UNUSED
|
066 |CR|12Disconnect after file transfer? |11
|
||||||
|
; Disconneting in 10 seconds, press a key to abort
|
||||||
|
067 |CR|09Disconnecting in 10 seconds: Press a key to abort.
|
||||||
068 |CR|12You do not have access to upload here!
|
068 |CR|12You do not have access to upload here!
|
||||||
069 |CR|12Illegal filename.|DE|DE|DE
|
069 |CR|12Illegal filename.|DE|DE|DE
|
||||||
070 |CR|14Searching for duplicate files ...
|
070 |CR|14Searching for duplicate files ...
|
||||||
|
@ -345,7 +347,7 @@
|
||||||
; One Liner header
|
; One Liner header
|
||||||
188 |CL|09Ú|$D77Ä|01¿|CR|09³|17 ± |15One Liners|$D64 |01|16³|CR|09À|01|$D77ÄÙ|CR
|
188 |CL|09Ú|$D77Ä|01¿|CR|09³|17 ± |15One Liners|$D64 |01|16³|CR|09À|01|$D77ÄÙ|CR
|
||||||
; One liner prompt
|
; One liner prompt
|
||||||
189 |CR |09|$D77Ä|CR |01[|10þ|01] |09Add to the one liners?
|
189 |CR |09|$D77Ä|CR |01[|10þ|01] |09Add to the one liners? |XX
|
||||||
190 |CR|01[|10þ|01] |09Enter your one liner:|CR
|
190 |CR|01[|10þ|01] |09Enter your one liner:|CR
|
||||||
191 |CR|12Unable to view archive.
|
191 |CR|12Unable to view archive.
|
||||||
; Archive view header &1 = Filename
|
; Archive view header &1 = Filename
|
||||||
|
@ -966,3 +968,7 @@
|
||||||
492 |CR|09Forward message to which base (|10?|09/|10List|09): |11
|
492 |CR|09Forward message to which base (|10?|09/|10List|09): |11
|
||||||
; Sysop password prompt
|
; Sysop password prompt
|
||||||
493 |CR|09Sysop Password: |XX
|
493 |CR|09Sysop Password: |XX
|
||||||
|
; Normal msg reader: Remove from newscan? (after I command)
|
||||||
|
494 |CR|12Remove |15|MB |12from message newscan? |XX
|
||||||
|
; Lightbar msg reader: Remove from newscan (after I command)
|
||||||
|
495 |CR|12Remove |15|MB |12from message newscan? |XX
|
|
@ -64,6 +64,7 @@ Const
|
||||||
TrashFile : String = '';
|
TrashFile : String = '';
|
||||||
TempPath : String = '';
|
TempPath : String = '';
|
||||||
AreasFile : String = '';
|
AreasFile : String = '';
|
||||||
|
FCheckKill : Boolean = False;
|
||||||
|
|
||||||
Var
|
Var
|
||||||
ConfigFile : File of RecConfig;
|
ConfigFile : File of RecConfig;
|
||||||
|
@ -119,7 +120,7 @@ Begin
|
||||||
WriteLn ('-BKILL <ID> <Days> Delete BBSes which haven''t been verified in <DAYS>');
|
WriteLn ('-BKILL <ID> <Days> Delete BBSes which haven''t been verified in <DAYS>');
|
||||||
WriteLn ('-BPACK Pack all BBS lists');
|
WriteLn ('-BPACK Pack all BBS lists');
|
||||||
WriteLn ('-BSORT <ID> <Type> Sorts and packs BBS list by <type>');
|
WriteLn ('-BSORT <ID> <Type> Sorts and packs BBS list by <type>');
|
||||||
WriteLn ('-FCHECK Checks file entries for correct size and status');
|
WriteLn ('-FCHECK <KILL> Check filelist for correct size/status');
|
||||||
WriteLn ('-FIXINDEX Fix broken permanent index for msg/file bases');
|
WriteLn ('-FIXINDEX Fix broken permanent index for msg/file bases');
|
||||||
WriteLn ('-FPACK Pack file bases');
|
WriteLn ('-FPACK Pack file bases');
|
||||||
WriteLn ('-FSORT Sort file base entries by filename');
|
WriteLn ('-FSORT Sort file base entries by filename');
|
||||||
|
@ -281,7 +282,7 @@ Var
|
||||||
FDirFile : File of RecFileList;
|
FDirFile : File of RecFileList;
|
||||||
FDir : RecFileList;
|
FDir : RecFileList;
|
||||||
TFDirFile : File of RecFileList;
|
TFDirFile : File of RecFileList;
|
||||||
DF : File of Byte;
|
DF : File;
|
||||||
Begin
|
Begin
|
||||||
Write ('Checking File Bases : ');
|
Write ('Checking File Bases : ');
|
||||||
|
|
||||||
|
@ -305,11 +306,13 @@ Begin
|
||||||
While Not Eof(FDirFile) Do Begin
|
While Not Eof(FDirFile) Do Begin
|
||||||
Read (FDirFile, FDir);
|
Read (FDirFile, FDir);
|
||||||
|
|
||||||
If FDir.Flags And FDirDeleted = 0 Then Begin
|
If FDir.Flags AND FDirDeleted <> 0 Then Continue;
|
||||||
|
|
||||||
Assign (DF, FBase.Path + FDir.FileName);
|
Assign (DF, FBase.Path + FDir.FileName);
|
||||||
{$I-} Reset (DF); {$I+}
|
{$I-} Reset (DF, 1); {$I+}
|
||||||
|
|
||||||
If IoResult <> 0 Then
|
If IoResult <> 0 Then
|
||||||
FDir.Flags := FDir.Flags AND FDirOffline
|
FDir.Flags := FDir.Flags OR FDirOffline
|
||||||
Else Begin
|
Else Begin
|
||||||
FDir.Size := FileSize(DF);
|
FDir.Size := FileSize(DF);
|
||||||
|
|
||||||
|
@ -321,9 +324,10 @@ Begin
|
||||||
Close (DF);
|
Close (DF);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
If (FDir.Flags AND FDirOffline <> 0) and FCheckKill Then Continue;
|
||||||
|
|
||||||
Write (TFDirFile, FDir);
|
Write (TFDirFile, FDir);
|
||||||
End;
|
End;
|
||||||
End;
|
|
||||||
|
|
||||||
Close (FDirFile); {delete backup file}
|
Close (FDirFile); {delete backup file}
|
||||||
Erase (FDirFile);
|
Erase (FDirFile);
|
||||||
|
@ -1130,7 +1134,13 @@ Begin
|
||||||
End Else
|
End Else
|
||||||
BBSSort := True;
|
BBSSort := True;
|
||||||
End;
|
End;
|
||||||
If Temp = '-FCHECK' Then FileCheck := True;
|
If Temp = '-FCHECK' Then Begin
|
||||||
|
FileCheck := True;
|
||||||
|
|
||||||
|
FCheckKill := strUpper(ParamStr(A+1)) = 'KILL';
|
||||||
|
|
||||||
|
If FCheckKill Then Inc(A);
|
||||||
|
End;
|
||||||
If Temp = '-FIXINDEX' Then FixIndex := True;
|
If Temp = '-FIXINDEX' Then FixIndex := True;
|
||||||
If Temp = '-FPACK' Then FilePack := True;
|
If Temp = '-FPACK' Then FilePack := True;
|
||||||
If Temp = '-FSORT' Then FileSort := True;
|
If Temp = '-FSORT' Then FileSort := True;
|
||||||
|
@ -1161,6 +1171,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If Temp = '-UPACK' Then UserPack := True;
|
If Temp = '-UPACK' Then UserPack := True;
|
||||||
|
If Temp = '-NOCHECK' Then NodeCheck := False;
|
||||||
|
|
||||||
Inc (A);
|
Inc (A);
|
||||||
End;
|
End;
|
||||||
|
|
|
@ -569,6 +569,7 @@ Begin
|
||||||
DirFile.Read(Dir);
|
DirFile.Read(Dir);
|
||||||
|
|
||||||
If (Dir.Flags And FDirDeleted <> 0) Then Continue;
|
If (Dir.Flags And FDirDeleted <> 0) Then Continue;
|
||||||
|
If (Dir.Flags and FDirOffline <> 0) And (Not CheckAccess(User, True, bbsConfig.AcsSeeOffline)) Then Continue;
|
||||||
If (Dir.Flags And FDirInvalid <> 0) And (Not CheckAccess(User, True, bbsConfig.AcsSeeUnvalid)) Then Continue;
|
If (Dir.Flags And FDirInvalid <> 0) And (Not CheckAccess(User, True, bbsConfig.AcsSeeUnvalid)) Then Continue;
|
||||||
If (Dir.Flags And FDirFailed <> 0) And (Not CheckAccess(User, True, bbsConfig.AcsSeeFailed)) Then Continue;
|
If (Dir.Flags And FDirFailed <> 0) And (Not CheckAccess(User, True, bbsConfig.AcsSeeFailed)) Then Continue;
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ Var
|
||||||
NI : TNodeInfoRec;
|
NI : TNodeInfoRec;
|
||||||
Begin
|
Begin
|
||||||
For Count := 1 to NodeTotal Do Begin
|
For Count := 1 to NodeTotal Do Begin
|
||||||
GetNodeInfo(Count, NI);
|
GetNodeInfo (Count, NI);
|
||||||
|
|
||||||
Assign (ChatFile, bbsConfig.DataPath + 'chat' + strI2S(NI.Num) + '.dat');
|
Assign (ChatFile, bbsConfig.DataPath + 'chat' + strI2S(NI.Num) + '.dat');
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ Begin
|
||||||
End Else
|
End Else
|
||||||
NI.Busy := False;
|
NI.Busy := False;
|
||||||
|
|
||||||
SetNodeInfo(NI.Num, NI);
|
SetNodeInfo (NI.Num, NI);
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,8 @@ Program Mystic;
|
||||||
|
|
||||||
{$I M_OPS.PAS}
|
{$I M_OPS.PAS}
|
||||||
|
|
||||||
|
{.$DEFINE EDITWORK}
|
||||||
|
|
||||||
Uses
|
Uses
|
||||||
{$IFDEF DEBUG}
|
{$IFDEF DEBUG}
|
||||||
HeapTrc,
|
HeapTrc,
|
||||||
|
@ -44,8 +46,23 @@ Uses
|
||||||
bbs_Common,
|
bbs_Common,
|
||||||
bbs_Core,
|
bbs_Core,
|
||||||
bbs_NodeInfo,
|
bbs_NodeInfo,
|
||||||
|
{$IFDEF EDITWORK}
|
||||||
|
bbs_edit_ansi,
|
||||||
|
{$ENDIF}
|
||||||
bbs_Cfg_Main;
|
bbs_Cfg_Main;
|
||||||
|
|
||||||
|
{$IFDEF EDITWORK}
|
||||||
|
Procedure TestEditor;
|
||||||
|
Var
|
||||||
|
T : TEditorANSI;
|
||||||
|
Begin
|
||||||
|
T := TEditorANSI.Create(Pointer(Session));
|
||||||
|
|
||||||
|
T.Edit;
|
||||||
|
T.Free;
|
||||||
|
End;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
Procedure InitClasses;
|
Procedure InitClasses;
|
||||||
Begin
|
Begin
|
||||||
Assign (ConfigFile, 'mystic.dat');
|
Assign (ConfigFile, 'mystic.dat');
|
||||||
|
@ -359,6 +376,8 @@ Begin
|
||||||
|
|
||||||
DirChange(JustPath(ParamStr(0)));
|
DirChange(JustPath(ParamStr(0)));
|
||||||
|
|
||||||
|
//FileMode := 66;
|
||||||
|
|
||||||
InitClasses;
|
InitClasses;
|
||||||
|
|
||||||
Screen.TextAttr := 7;
|
Screen.TextAttr := 7;
|
||||||
|
@ -467,6 +486,11 @@ Begin
|
||||||
|
|
||||||
Set_Node_Action (Session.GetPrompt(345));
|
Set_Node_Action (Session.GetPrompt(345));
|
||||||
|
|
||||||
|
{$IFDEF EDITWORK}
|
||||||
|
TestEditor;
|
||||||
|
Halt(0);
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
Session.User.UserLogon1 (UserName, Password, Script);
|
Session.User.UserLogon1 (UserName, Password, Script);
|
||||||
|
|
||||||
If Session.TimeOffset > 0 Then
|
If Session.TimeOffset > 0 Then
|
||||||
|
|
|
@ -59,7 +59,7 @@ Const
|
||||||
mysMaxMenuCmds = 25; // Max menu commands per item
|
mysMaxMenuCmds = 25; // Max menu commands per item
|
||||||
mysMaxMenuInput = 12;
|
mysMaxMenuInput = 12;
|
||||||
mysMaxMenuStack = 8;
|
mysMaxMenuStack = 8;
|
||||||
mysMaxThemeText = 493; // Total prompts in theme file
|
mysMaxThemeText = 495; // Total prompts in theme file
|
||||||
|
|
||||||
fn_SemFileEcho = 'echomail.now';
|
fn_SemFileEcho = 'echomail.now';
|
||||||
fn_SemFileNews = 'newsmail.now';
|
fn_SemFileNews = 'newsmail.now';
|
||||||
|
@ -325,14 +325,14 @@ Type
|
||||||
inetTNHidden : Boolean;
|
inetTNHidden : Boolean;
|
||||||
ThemeOnStart : Boolean;
|
ThemeOnStart : Boolean;
|
||||||
StartCodePage : Byte;
|
StartCodePage : Byte;
|
||||||
|
AcsSeeOffline : String[mysMaxAcsSize];
|
||||||
//inetSMTPRelay : String[30];
|
//inetSMTPRelay : String[30];
|
||||||
//inetSMTPLogin : String[30];
|
//inetSMTPLogin : String[30];
|
||||||
//inetSMTPPW : String[30];
|
//inetSMTPPW : String[30];
|
||||||
//EmailValidationLevel
|
//EmailValidationLevel
|
||||||
//AllowEmailPWReset
|
//AllowEmailPWReset
|
||||||
|
|
||||||
Reserved : Array[1..843] of Char;
|
Reserved : Array[1..812] of Char;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Const
|
Const
|
||||||
|
|
|
@ -2536,11 +2536,50 @@
|
||||||
! According to a document I saw, the ANSI-BBS C function to move the cursor
|
! According to a document I saw, the ANSI-BBS C function to move the cursor
|
||||||
should hard stop at 80. Mystic's ANSI parser wraps to the next line which
|
should hard stop at 80. Mystic's ANSI parser wraps to the next line which
|
||||||
I think was added in a while back to increase ANSI compatibility. For
|
I think was added in a while back to increase ANSI compatibility. For
|
||||||
now I changed it back to follow what this standard document is claiming,
|
now I changed it back to follow what this standard document is claiming.
|
||||||
even if it is sort of against my better judgement.
|
|
||||||
|
|
||||||
+ If a message bases's data files actually exist, for but some reason the
|
+ If a message bases's data files actually exist, for but some reason the
|
||||||
highest message number is 0 (ie everything has been deleted), Mystic will
|
highest message number is 0 (ie everything has been deleted), Mystic will
|
||||||
now display the "There are no messages in this base" prompt when reading.
|
now display the "There are no messages in this base" prompt when reading.
|
||||||
|
|
||||||
|
+ When downloading a file or a batch, Mystic will now ask the user if they
|
||||||
|
would like to disconnect after the transfer. Replace two prompts in your
|
||||||
|
language file:
|
||||||
|
|
||||||
|
; Disconnect after download?
|
||||||
|
066 |CR|12Disconnect after file transfer? |11
|
||||||
|
|
||||||
|
; Disconneting in 10 seconds, press a key to abort
|
||||||
|
067 |CR|09Disconnecting in 10 seconds: Press a key to abort.
|
||||||
|
|
||||||
|
! Mystic wasn't properly checking the message base "auto signature" setting
|
||||||
|
before adding in the user's auto signature.
|
||||||
|
|
||||||
|
+ Mystic will now ignore the group membership contraints in the ACS string
|
||||||
|
when using the MW (write email) menu command.
|
||||||
|
|
||||||
|
+ Mystic now has an ACS setting to "see offline" files in the file bases.
|
||||||
|
This setting is found in System Config -> File Base Settings.
|
||||||
|
|
||||||
|
+ If you select the I (Ignore all messages) option while reading message
|
||||||
|
bases, Mystic will now ask you if you want to remove the base from your
|
||||||
|
new message scan. Two new prompts go along with this:
|
||||||
|
|
||||||
|
; Normal msg reader: Remove from newscan? (after I command)
|
||||||
|
494 |CR|12Remove |15|MB |12from message newscan? |XX
|
||||||
|
|
||||||
|
; Lightbar msg reader: Remove from newscan (after I command)
|
||||||
|
495 |CR|12Remove |15|MB |12from message newscan? |XX
|
||||||
|
|
||||||
|
! MBBSUTIL -NOCHECK option was not bypassing the online user check.
|
||||||
|
|
||||||
|
! MBBSUTIL -FCHECK was not properly marking some files OFFLINE when they
|
||||||
|
should have been.
|
||||||
|
|
||||||
|
+ MBBSUTIL -FCHECK now has an optional command after it which will cause
|
||||||
|
missing files to be removed from the file listing, instead of marked
|
||||||
|
offline. Add KILL after fcheck to enable this function:
|
||||||
|
|
||||||
|
mbbsutil -fcheck kill
|
||||||
|
|
||||||
<ALPHA 26 RELEASED>
|
<ALPHA 26 RELEASED>
|
||||||
|
|
Loading…
Reference in New Issue