Renegade-1.19/SOURCE/OFFLINE.PAS

1226 lines
33 KiB
Plaintext
Raw Normal View History

2013-02-07 10:23:11 -08:00
{$IFDEF WIN32}
{$I DEFINES.INC}
{$ENDIF}
2013-02-04 15:56:58 -08:00
{$A+,B-,D+,E-,F+,I-,L+,N-,O+,R-,S-,V-}
UNIT OffLine;
INTERFACE
PROCEDURE SetMessageAreaNewScanDate;
PROCEDURE DownloadPacket;
PROCEDURE uploadpacket(Already: Boolean);
IMPLEMENTATION
USES
Crt,
Dos,
Common,
Archive1,
ExecBat,
File0,
File1,
File2,
File8,
File11,
Mail0,
Mail1,
Mail2,
Mail4,
NodeList,
TimeFunc;
TYPE
BSingle = ARRAY [0..3] OF Byte;
NDXRec = RECORD
Pointer: BSingle;
Conf: Byte;
END;
QWKHeadeRec = RECORD
Flag: Char;
Num: ARRAY [1..7] OF Char;
MsgDate: ARRAY [1..8] OF Char;
MsgTime: ARRAY [1..5] OF Char;
MsgTo: ARRAY [1..25] OF Char;
MsgFrom: ARRAY [1..25] OF Char;
MsgSubj: ARRAY [1..25] OF Char;
MsgPWord: STRING[11];
RNum: STRING[7];
NumBlocks: ARRAY [1..6] OF Char;
Status: Byte;
2013-02-07 11:28:00 -08:00
MBase: SmallWord;
2013-02-04 15:56:58 -08:00
Crap: STRING[3];
END;
(*
PROCEDURE SetFileAreaNewScanDate;
VAR
TempDate: Str10;
Key: CHAR;
BEGIN
{
NL;
Prt(FString.FileNewScan);
}
lRGLngStr(54,FALSE);
MPL(10);
Prompt(PD2Date(NewDate));
Key := Char(GetKey);
IF (Key = #13) THEN
BEGIN
NL;
TempDate := PD2Date(NewDate);
END
ELSE
BEGIN
Buf := Key;
DOBackSpace(1,10);
InputFormatted('',TempDate,'##/##/####',TRUE);
IF (TempDate = '') THEN
TempDate := PD2Date(NewDate);
END;
IF (DayNum(TempDate) = 0) OR (DayNum(TempDate) > DayNum(DateStr)) THEN
BEGIN
NL;
Print('Invalid date entered.');
END
ELSE
BEGIN
NL;
Print('New file scan date set to: ^5'+TempDate+'^1');
NewDate := Date2PD(TempDate);
SL1('Reset file new scan date to: ^5'+TempDate+'.');
END;
END;
*)
PROCEDURE SetMessageAreaNewScanDate;
VAR
S: AStr;
DT: DateTime;
MArea,
SaveMsgArea: Integer;
l: LongInt;
BEGIN
NL;
Prt('Enter oldest date for new messages (mm/dd/yyyy): ');
InputFormatted('',S,'##/##/####',TRUE);
IF (DayNum(S) = 0) THEN
BEGIN
NL;
Print('^7Invalid date entered!^1')
END
ELSE IF (S <> '') THEN
BEGIN
NL;
Print('Current newscan date is now: ^5'+S);
SaveMsgArea := MsgArea;
FillChar(DT,SizeOf(DT),0);
WITH DT DO
BEGIN
Month := StrToInt(Copy(S,1,2));
Day := StrToInt(Copy(S,4,2));
Year := StrToInt(Copy(S,7,4));
END;
l := DateToPack(DT);
FOR MArea := 1 TO NumMsgAreas DO
BEGIN
InitMsgArea(MArea);
LastReadRecord.LastRead := L;
SaveLastReadRecord(LastReadRecord);
END;
MsgArea := SaveMsgArea;
LoadMsgArea(MsgArea);
SL1('Reset message last read pointers.');
END;
END;
PROCEDURE DownloadPacket;
VAR
IndexR:
NDXRec;
NDXFile,
PNDXFile: FILE OF NDXRec;
MsgFile: FILE;
ControlTxt: Text;
MHeader: MHeaderRec;
QWKHeader: QWKHeadeRec;
DT: DateTime;
TransferFlags: TransferFlagSet;
S,
Texts: STRING;
C: Char;
FArrayRecNum: Byte;
MArea,
UseMsgArea,
AvailableMsgAreas,
SaveMsgArea,
SaveFileArea: Integer;
TotalNewMsgsInArea,
TotalYourMsgsInArea,
MsgNum,
TempTextSize: Word;
X,
LastK,
Marker,
TotalMsgsAllAreas,
TotalNewMsgsAllAreas,
TotalYourMsgsAllAreas,
LastUpdate: LongInt;
SaveConfSystem,
Ok: Boolean;
PROCEDURE Real_To_Msb(PReal: Real; VAR B: BSingle);
VAR
R: ARRAY [0 .. 5] OF Byte ABSOLUTE PReal;
BEGIN
B[3] := R[0];
Move(R[3],B[0],3);
END;
PROCEDURE KillEmail;
VAR
MsgNum1: Word;
BEGIN
InitMsgArea(-1);
Reset(MsgHdrF);
IF (IOResult = 0) THEN
BEGIN
FOR MsgNum1 := 1 TO FileSize(MsgHdrF) DO
BEGIN
Seek(MsgHdrF,(MsgNum1 - 1));
Read(MsgHdrF,MHeader);
IF ToYou(MHeader) THEN
BEGIN
Include(MHeader.Status,MDeleted);
Seek(MsgHdrF,(MsgNum1 - 1));
Write(MsgHdrF,MHeader);
END
END;
Close(MsgHdrF);
END;
ThisUser.Waiting := 0;
END;
PROCEDURE Upload_Display;
BEGIN
LastUpdate := Timer;
IF (NOT Abort) THEN
Prompt(' <13>'+PadRightInt(TotalNewMsgsInArea,7)+
'<13>'+PadRightInt(TotalYourMsgsInArea,6)+
'<13>'+PadRightStr(IntToStr((FileSize(MsgFile) - LastK) DIV 1024)+'k',8));
END;
PROCEDURE UpdatePointers;
VAR
MArea1: Integer;
MsgNum1: Word;
BEGIN
TotalNewMsgsAllAreas := 0;
FOR MArea1 := 1 TO NumMsgAreas DO
IF (CompMsgArea(MArea1,0) <> 0) THEN
BEGIN
InitMsgArea(MArea1);
IF AACS(MemMsgArea.ACS) AND ((LastReadRecord.NewScan) OR (MAForceRead IN MemMsgArea.MAFlags)) THEN
BEGIN
LastError := IOResult;
Reset(MsgHdrF);
IF (IOResult = 2) THEN
ReWrite(MsgHdrF);
MsgNum1 := FirstNew;
IF (MsgNum1 > 0) THEN
TotalNewMsgsInArea := FileSize(MsgHdrF) - MsgNum1 + 1
ELSE
TotalNewMsgsInArea := 0;
MsgNum1 := FileSize(MsgHdrF);
IF (TotalNewMsgsAllAreas + TotalNewMsgsInArea > General.MaxQWKTotal) THEN
MsgNum1 := (FileSize(MsgHdrF) - TotalNewMsgsInArea) + (General.MaxQWKtotal - TotalNewMsgsAllAreas);
IF (TotalNewMsgsInArea > general.maxqwkbase) AND
(((FileSize(MsgHdrF) - TotalNewMsgsInArea) + General.MaxQWKBase) < MsgNum1) THEN
MsgNum1 := (FileSize(MsgHdrF) - TotalNewMsgsInArea) + General.MaxQWKBase;
Seek(MsgHdrF,MsgNum1- 1);
Read(MsgHdrF,MHeader);
LoadLastReadRecord(LastReadRecord);
LastReadRecord.LastRead := MHeader.Date;
SaveLastReadRecord(LastReadRecord);
Inc(TotalNewMsgsAllAreas, MsgNum1 - (FileSize(MsgHdrF) - TotalNewMsgsInArea));
Close(MsgHdrF);
END;
END;
END;
BEGIN
NL;
IF (ThisUser.DefArcType < 1) OR (ThisUser.DefArcType > MaxArcs) OR
(NOT General.FileArcInfo[ThisUser.DefArcType].Active) THEN
BEGIN
Print('Please select an archive type first.');
Exit;
END;
IF (MakeQWKFor > 0) OR (Exist(TempDir+'QWK\'+General.PacketName+'QWK') AND
PYNQ('Create a new QWK packet for download? ',0,FALSE)) THEN
PurgeDir(TempDir+'QWK\',FALSE)
ELSE
PurgeDir(TempDir+'QWK\',FALSE);
SaveMsgArea := MsgArea;
SaveConfSystem := ConfSystem;
ConfSystem := FALSE;
IF (SaveConfSystem) THEN
NewCompTables;
OffLineMail := TRUE;
IF (NOT Exist(TempDir+'QWK\'+General.PacketName+'QWK')) THEN
BEGIN
Assign(ControlTxt,TempDir+'QWK\CONTROL.DAT');
ReWrite(ControlTxt);
WriteLn(ControlTxt,StripColor(General.BBSName));
WriteLn(ControlTxt);
WriteLn(ControlTxt,General.BBSPhone);
WriteLn(ControlTxt,General.SysOpName,', Sysop');
WriteLn(ControlTxt,'0,'+General.PacketName);
WriteLn(ControlTxt,Copy(DateStr,1,2)+'-'+Copy(DateStr,4,2)+'-'+Copy(DateStr,7,4)+','+TimeStr);
WriteLn(ControlTxt,ThisUser.Name);
WriteLn(ControlTxt);
WriteLn(ControlTxt,'0');
WriteLn(ControlTxt,'0');
AvailableMsgAreas := 1;
FOR MArea := 1 TO NumMsgAreas DO
IF MsgAreaAC(MArea) THEN
Inc(AvailableMsgAreas);
WriteLn(ControlTxt,(AvailableMsgAreas - 1));
FOR MArea := -1 TO NumMsgAreas DO
IF (MArea > 0) AND MsgAreaAC(MArea) THEN
BEGIN
WriteLn(ControlTxt,MemMsgArea.QWKIndex);
WriteLn(ControlTxt,Caps(StripColor(MemMsgArea.FileName)));
END
ELSE IF (MArea = -1) THEN
BEGIN
WriteLn(ControlTxt,0);
WriteLn(ControlTxt,'Private Mail');
END;
WriteLn(ControlTxt,'WELCOME');
WriteLn(ControlTxt,'NEWS');
WriteLn(ControlTxt,'GOODBYE');
Close(ControlTxt);
IF (ThisUser.ScanFilesQWK) THEN
BEGIN
Assign(NewFilesF,TempDir+'QWK\NEWFILES.DAT');
ReWrite(NewFilesF);
InitFArray(FArray);
FArrayRecNum := 0;
GlobalNewFileScan(FArrayRecNum);
Close(NewFilesF);
LastError := IOResult;
END;
IF (General.QWKWelcome <> '') THEN
BEGIN
S := General.QWKWelcome;
IF (OkANSI) AND Exist(S+'.ANS') THEN
S := S +'.ANS'
ELSE
S := S +'.ASC';
CopyMoveFile(TRUE,'',S,TempDir+'QWK\WELCOME',FALSE);
END;
IF (General.QWKNews <> '') THEN
BEGIN
S := General.QWKNews;
IF (OkANSI) AND Exist(S+'.ANS') THEN
S := S +'.ANS'
ELSE
S := S +'.ASC';
CopyMoveFile(TRUE,'',S,TempDir+'QWK\NEWS',FALSE);
END;
IF (General.QWKGoodBye <> '') THEN
BEGIN
S := General.QWKGoodBye;
IF (OkANSI) AND Exist(S+'.ANS') THEN
S := S +'.ANS'
ELSE
S := S +'.ASC';
CopyMoveFile(TRUE,'',S,TempDir+'QWK\GOODBYE',FALSE);
END;
Assign(MsgFile,TempDir+'QWK\MESSAGES.DAT');
S := 'The Renegade Developement Team, Copyright (c) 1992-2009 (All rights reserved)';
WHILE (Length(S) < 128) DO
S := S + ' ';
ReWrite(MsgFile,1);
BlockWrite(MsgFile,S[1],128);
FillChar(QWKHeader.Crap,SizeOf(QWKHeader.Crap),0);
Assign(PNDXFile,TempDir+'QWK\PERSONAL.NDX');
ReWrite(PNDXFile);
LastK := 0;
(*
TotalNewMsgsInArea := 0;
*)
TotalMsgsAllAreas := 0;
TotalNewMsgsAllAreas := 0;
TotalYourMsgsAllAreas := 0;
TempPause := FALSE;
Abort := FALSE;
Next := FALSE;
CLS;
Print(Centre('|The QWK<57>System is now gathering mail.'));
NL;
PrintACR('s<><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ');
PrintACR('s<>t Num s<>u Message area name s<>v Short s<>w Echo s<>x Total '+
's<>y New s<>z Your s<>{ Size s<>');
PrintACR('s<><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>');
FillChar(QWKHeader.MsgPWord,SizeOf(QWKHeader.MsgPWord),' ');
FillChar(QWKHeader.RNum,SizeOf(QWKHeader.RNum),' ');
QWKHeader.Status := 225;
FOR MArea := -1 TO NumMsgAreas DO
BEGIN
IF (IOResult <> 0) THEN
BEGIN
WriteLn('error processing QWK packet.');
Exit;
END;
IF (MArea = 0) OR ((MArea = -1) AND (NOT ThisUser.PrivateQWK)) OR
((CompMsgArea(MArea,0) = 0) AND (MArea >= 0)) THEN
Continue;
InitMsgArea(MArea);
IF (MArea > 0) THEN
UseMsgArea := MemMsgArea.QWKIndex
ELSE
UseMsgArea := 0;
IF AACS(MemMsgArea.ACS) AND ((LastReadRecord.NewScan) OR
(MAForceRead IN MemMsgArea.MAFlags)) AND (NOT Abort) AND (NOT HangUp) THEN
BEGIN
LastError := IOResult;
Reset(MsgHdrF);
IF (IOResult = 2) THEN
ReWrite(MsgHdrF);
Reset(MsgTxtF,1);
IF (IOResult = 2) THEN
ReWrite(MsgTxtF,1);
QWKHeader.MBase := UseMsgArea;
IndexR.Conf := UseMsgArea;
TotalNewMsgsInArea := 0;
TotalYourMsgsInArea := 0;
PrintMain('}'+PadRightInt(MArea,4)+
' ~'+PadLeftStr(MemMsgArea.Name,22)+
' '+PadLeftStr(MemMsgArea.FileName,11)+
'<13>'+PadLeftStr(ShowYesNo(MemMsgArea.MAType <> 0),3)+
'<13>'+PadRightInt(FileSize(MsgHdrF),8));
Upload_Display;
IF (UseMsgArea > 0) THEN
MsgNum := FirstNew
ELSE
MsgNum := 1;
IF (MsgNum > 0) THEN
BEGIN
S := IntToStr(UseMsgArea);
WHILE (Length(S) < 3) DO
S := '0' + S;
Assign(NDXFile,TempDir+'QWK\'+S+'.NDX');
ReWrite(NDXFile);
WKey;
WHILE (MsgNum <= FileSize(MsgHdrF)) AND
(TotalNewMsgsInArea < General.MaxQWKBase) AND
((TotalNewMsgsAllAreas + TotalNewMsgsInArea) < General.MaxQWKTotal) AND
(NOT Abort) AND (NOT HangUp) DO
BEGIN
IF (MArea >= 0) THEN
Inc(TotalNewMsgsInArea);
WKey;
IF ((Timer - LastUpdate) > 3) OR ((Timer - LastUpdate) < 0) THEN
BEGIN
BackErase(22);
Upload_Display;
END;
Seek(MsgHdrF,(MsgNum - 1));
Read(MsgHdrF,MHeader);
IF (NOT (MDeleted IN MHeader.Status)) AND
NOT (Unvalidated IN MHeader.Status) AND
NOT (FromYou(MHeader) AND NOT ThisUser.GetOwnQWK) AND
NOT ((Prvt IN MHeader.Status) AND NOT (FromYou(MHeader) OR ToYou(MHeader))) AND
NOT ((MArea = -1) AND NOT (ToYou(MHeader))) THEN
BEGIN
IF (MArea = -1) THEN
Inc(TotalNewMsgsInArea);
IF (Prvt IN MHeader.Status) THEN
QWKHeader.Flag := '*'
ELSE
QWKHeader.Flag := ' ';
S := IntToStr(MsgNum);
FillChar(QWKHeader.Num[1],SizeOf(QWKHeader.Num),' ');
Move(S[1],QWKHeader.Num[1],Length(S));
PackToDate(DT,MHeader.Date);
IF (MHeader.From.Anon = 0) THEN
S := ZeroPad(IntToStr(DT.Month))+
'-'+ZeroPad(IntToStr(DT.Day))+
'-'+Copy(IntToStr(DT.Year),3,2)
ELSE
S := '';
FillChar(QWKHeader.MsgDate[1],SizeOf(QWKHeader.MsgDate),' ');
Move(S[1],QWKHeader.MsgDate[1],Length(S));
IF (MHeader.From.Anon = 0) THEN
S := ZeroPad(IntToStr(DT.Hour))+
':'+ZeroPad(IntToStr(DT.Min))
ELSE
S := '';
FillChar(QWKHeader.MsgTime,SizeOf(QWKHeader.MsgTime),' ');
Move(S[1],QWKHeader.MsgTime[1],Length(S));
S := MHeader.MTo.A1S;
IF (MARealName IN MemMsgArea.MAFlags) THEN
S := AllCaps(MHeader.MTo.Real);
S := Caps(Usename(MHeader.MTo.Anon,S));
FillChar(QWKHeader.MsgTo,SizeOf(QWKHeader.MsgTo),' ');
Move(S[1],QWKHeader.MsgTo[1],Length(S));
S := MHeader.From.A1S;
IF (MARealName IN MemMsgArea.MAFlags) THEN
S := AllCaps(MHeader.From.Real);
S := Caps(Usename(MHeader.From.Anon,S));
FillChar(QWKHeader.MsgFrom[1],SizeOf(QWKHeader.MsgFrom),' ');
Move(S[1],QWKHeader.MsgFrom[1],Length(S));
FillChar(QWKHeader.MsgSubj[1],SizeOf(QWKHeader.MsgSubj),' ');
IF (MHeader.FileAttached > 0) THEN
MHeader.Subject := StripName(MHeader.Subject);
Move(MHeader.Subject[1],QWKHeader.MsgSubj[1],Length(MHeader.Subject));
Marker := FilePos(MsgFile);
BlockWrite(MsgFile,QWKHeader,128);
Real_To_Msb(FileSize(MsgFile) DIV 128,IndexR.Pointer);
Write(NDXFile,IndexR);
IF ToYou(MHeader) THEN
BEGIN
Write(PNDXFile,IndexR);
Inc(TotalYourMsgsInArea);
END;
X := 1;
TempTextSize := 0;
Texts := '';
IF ((MHeader.Pointer - 1) < FileSize(MsgTxtF)) AND
(((MHeader.Pointer - 1) + MHeader.TextSize) <= FileSize(MsgTxtF)) THEN
BEGIN
Seek(MsgTxtF,(MHeader.Pointer - 1));
REPEAT
BlockRead(MsgTxtF,S[0],1);
BlockRead(MsgTxtF,S[1],Byte(S[0]));
Inc(TempTextSize,(Length(S) + 1));
S := S + '<27>';
Texts := Texts + S;
IF (Length(Texts) > 128) THEN
BEGIN
BlockWrite(MsgFile,Texts[1],128);
Inc(X);
Move(Texts[129],Texts[1],(Length(Texts) - 128));
Dec(Texts[0],128);
END;
UNTIL (TempTextSize >= MHeader.TextSize);
IF (Texts <> '') THEN
BEGIN
IF (Length(Texts) < 128) THEN
BEGIN
FillChar(Texts[Length(Texts) + 1],(128 - Length(Texts)),32);
Texts[0] := #128;
END;
BlockWrite(MsgFile,Texts[1],128);
Inc(X);
END;
END
ELSE
BEGIN
Include(MHeader.Status,MDeleted);
MHeader.TextSize := 0;
MHeader.Pointer := -1;
Seek(MsgHdrF,(MsgNum - 1));
Write(MsgHdrF,MHeader);
END;
S := IntToStr(X);
FillChar(QWKHeader.NumBlocks[1],SizeOf(QWKHeader.NumBlocks),' ');
Move(S[1],QWKHeader.NumBlocks[1],Length(S));
Seek(MsgFile,Marker);
BlockWrite(MsgFile,QWKHeader,128);
Seek(MsgFile,FileSize(MsgFile));
END;
Inc(MsgNum);
END;
Close(NDXFile);
END;
BackErase(22);
Upload_Display;
NL;
IF (TotalNewMsgsInArea >= General.MaxQWKBase) THEN
Print('Maximum number of messages per area reached.');
IF ((TotalNewMsgsAllAreas + TotalNewMsgsInArea) >= General.MaxQWKTotal) THEN
Print('Maximum number of messages per QWK packet reached.');
LastK := FileSize(MsgFile);
Inc(TotalNewMsgsAllAreas,TotalNewMsgsInArea);
Inc(TotalYourMsgsAllAreas,TotalYourMsgsInArea);
Inc(TotalMsgsAllAreas,FileSize(MsgHdrF));
Close(MsgHdrF);
Close(MsgTxtF);
END;
IF ((TotalNewMsgsAllAreas + TotalNewMsgsInArea) >= General.MaxQWKTotal) OR Abort THEN
Break;
END;
IF (FileSize(PNDXFile) = 0) THEN
BEGIN
Close(PNDXFile);
Erase(PNDXFile);
END
ELSE
Close(PNDXFile);
NL;
IF (NOT Abort) THEN
Print('^0 Totals:'+PadRightInt(TotalMsgsAllAreas,43)+PadRightInt(TotalNewMsgsAllAreas,7)+
PadRightInt(TotalYourMsgsAllAreas,6)+
PadRightStr(IntToStr(FileSize(MsgFile) DIV 1024)+'k',8));
Close(MsgFile);
NL;
lil := 0;
IF (TotalNewMsgsAllAreas < 1) OR (Abort) THEN
BEGIN
IF (TotalNewMsgsAllAreas < 1) THEN
Print('No new messages!');
OffLineMail := FALSE;
ConfSystem := SaveConfSystem;
IF (SaveConfSystem) THEN
NewCompTables;
MsgArea := SaveMsgArea;
LoadMsgArea(MsgArea);
Exit;
END;
IF (MakeQWKFor = 0) THEN
BEGIN
NL;
IF NOT PYNQ('Proceed to packet compression: ',0,TRUE) THEN
BEGIN
OffLineMail := FALSE;
ConfSystem := SaveConfSystem;
IF (SaveConfSystem) THEN
NewCompTables;
MsgArea := SaveMsgArea;
LoadMsgArea(MsgArea);
Exit;
END;
END;
NL;
Star('Compressing '+General.PacketName+'.QWK');
ArcComp(Ok,ThisUser.DefArcType,TempDir+'QWK\'+General.PacketName+'.QWK',TempDir+'QWK\*.*');
IF (NOT Ok) OR (NOT Exist(TempDir+'QWK\'+General.PacketName+'.QWK')) THEN
BEGIN
NL;
Print('Error archiving QWK packet!');
OffLineMail := FALSE;
ConfSystem := SaveConfSystem;
IF (SaveConfSystem) THEN
NewCompTables;
MsgArea := SaveMsgArea;
LoadMsgArea(MsgArea);
Exit;
END;
SysOpLog('QWK packet created.');
END;
FindFirst(TempDir+'QWK\'+General.PacketName+'.QWK',AnyFile,DirInfo);
IF (InCom) AND (NSL < (DirInfo.Size DIV Rate)) AND (NOT General.qwktimeignore) THEN
BEGIN
NL;
Print('Sorry, not enough time left online to transfer.');
OffLineMail := FALSE;
ConfSystem := SaveConfSystem;
IF (SaveConfSystem) THEN
NewCompTables;
MsgArea := SaveMsgArea;
LoadMsgArea(MsgArea);
Exit;
END;
Star('Compressed packet size is '+ConvertBytes(DirInfo.Size,FALSE)+'.');
IF (InCom) AND (NOT HangUp) THEN
BEGIN
SaveFileArea := FileArea;
FileArea := -1;
WITH MemFileArea DO
BEGIN
AreaName := 'Offline Mail';
DLPath := TempDir+'QWK\';
ULPath := TempDir+'QWK\';
FAFlags := [FANoRatio];
END;
WITH FileInfo DO
BEGIN
FileName := Align(General.PacketName+'.QWK');
Description := 'QWK Download';
FilePoints := 0;
Downloaded := 0;
FileSize := GetFileSize(TempDir+'QWK\'+General.PacketName+'.QWK');
OwnerNum := UserNum;
OwnerName := Caps(ThisUser.Name);
FileDate := Date2PD(DateStr);
VPointer := -1;
VTextSize := 0;
FIFlags := [];
END;
TransferFlags := [IsQWK];
DLX(FileInfo,-1,TransferFlags);
FileArea := SaveFileArea;
LoadFileArea(FileArea);
IF (IsTransferOk IN TransferFlags) AND (NOT (IsKeyboardAbort IN TransferFlags)) THEN
BEGIN
Star('Updating message pointers');
Inc(PublicReadThisCall,TotalNewMsgsAllAreas);
UpdatePointers;
Star('Message pointers updated');
IF (ThisUser.PrivateQWK) THEN
BEGIN
KillEmail;
Star('Private messages killed.');
END;
END;
END
ELSE
BEGIN
S := General.QWKLocalPath+General.PacketName;
IF Exist(S+'.QWK') AND ((MakeQWKFor > 0) OR NOT (PYNQ(^M^J'Replace existing .QWK? ',0,FALSE))) THEN
FOR C := 'A' TO 'Z' DO
IF NOT (Exist(S+'.QW'+C)) THEN
BEGIN
S := S + '.QW' + C;
Break;
END;
IF (Pos('.', S) = 0) THEN
S := S + '.QWK';
CopyMoveFile(TRUE,'',TempDir+'QWK\'+General.PacketName+'.QWK',S,FALSE);
NL;
UpdatePointers;
IF (ThisUser.PrivateQWK) THEN
KillEmail;
END;
IF Exist(TempDir+'QWK\'+General.PacketName+'.REP') THEN
BEGIN
NL;
Star('Bidirectional upload of '+General.PacketName+'.REP detected');
UploadPacket(TRUE);
END;
OffLineMail := FALSE;
ConfSystem := SaveConfSystem;
IF (SaveConfSystem) THEN
NewCompTables;
MsgArea := SaveMsgArea;
LoadMsgArea(MsgArea);
LastError := IOResult;
END;
PROCEDURE uploadpacket(Already:Boolean);
VAR
F: FILE;
User: UserRecordType;
MHeader: MHeaderRec;
QWKHeader: QWKHeadeRec;
S,
Os: STRING;
Counter,
Counter1: Byte;
RCode,
MArea,
SaveMsgArea: Integer;
X,
Blocks: Word;
TransferTime,
TempDate: LongInt;
Ok,
UploadOk,
KeyboardAbort,
AddBatch,
SaveConfSystem: Boolean;
FUNCTION FindBase(IndexNumber: Word): Word;
VAR
j,
k: Integer;
BEGIN
Reset(MsgAreaFile);
j := 0;
k := 0;
WHILE (j = 0) AND NOT (EOF(MsgAreaFile)) DO
BEGIN
Inc(k);
Read(MsgAreaFile,MemMsgArea);
IF (MemMsgArea.QWKIndex = IndexNumber) THEN
j := k;
END;
Close(MsgAreaFile);
FindBase := k;
END;
BEGIN
IF (RPost IN ThisUser.Flags) THEN
BEGIN
NL;
Print('You are restricted from posting messages.');
Exit;
END;
SaveMsgArea := MsgArea; (* Was ReadMsgArea *)
SaveConfSystem := ConfSystem;
ConfSystem := FALSE;
IF (SaveConfSystem) THEN
NewCompTables;
PurgeDir(TempDir+'UP\',FALSE);
TimeLock := TRUE;
UploadOk := TRUE;
KeyboardAbort := FALSE;
IF (ComPortSpeed = 0) OR (UpQWKFor > 0) THEN
CopyMoveFile(TRUE,'',General.QWKLocalPath+General.PacketName+'.REP',TempDir + 'QWK\' + General.PacketName+'.REP',FALSE)
ELSE
BEGIN
IF (NOT Already) THEN
Receive(General.PacketName+'.REP',TempDir+'\QWK',FALSE,UploadOk,KeyboardAbort,AddBatch,TransferTime)
ELSE
CopyMoveFile(FALSE,'',TempDir+'UP\'+General.PacketName+'.REP',
TempDir+'QWK\'+General.PacketName+'.REP',FALSE);
END;
TimeLock := FALSE;
IF (UploadOk) AND (NOT KeyboardAbort) THEN
BEGIN
SysOpLog('Uploaded REP packet');
IF (NOT Already) THEN
Print('Transfer successful');
ExecBatch(Ok,TempDir+'QWK\',General.ArcsPath+
FunctionalMCI(General.FileArcInfo[ThisUser.DefArcType].UnArcLine,
TempDir+'QWK\'+General.PacketName+'.REP',
General.PacketName+'.MSG'),
General.FileArcInfo[ThisUser.DefArcType].SuccLevel,RCode,FALSE);
IF (Ok) AND Exist(TempDir+'QWK\'+General.PacketName+'.MSG') THEN
BEGIN
Assign(F,TempDir+'QWK\'+General.PacketName+'.MSG');
Reset(F,1);
GetFTime(F,TempDate);
IF (TempDate = ThisUser.LastQWK) THEN
BEGIN
NL;
Print('This packet has already been uploaded here.');
Close(F);
Exit;
END;
ThisUser.LastQWK := TempDate;
MHeader.FileAttached := 0;
MHeader.MTo.UserNum := 0;
MHeader.MTo.Anon := 0;
MHeader.ReplyTo := 0;
MHeader.Replies := 0;
TempDate := GetPackDateTime;
BlockRead(F,S,128);
WHILE NOT EOF(F) DO
BEGIN
IF (IOResult <> 0) THEN
BEGIN
WriteLn('error processing REP packet.');
Break;
END;
BlockRead(F,QWKHeader,128);
S[0] := #6;
Move(QWKHeader.NumBlocks[1],S[1],6);
Blocks := (StrToInt(S) - 1);
IF (QWKHeader.MBase = 0) THEN
MArea := -1
ELSE
MArea := FindBase(QWKHeader.MBase);
InitMsgArea(MArea);
IF AACS(MemMsgArea.ACS) AND AACS(MemMsgArea.PostACS) AND NOT
((PublicPostsToday >= General.MaxPubPost) AND (NOT MsgSysOp)) THEN
BEGIN
LastError := IOResult;
Reset(MsgHdrF);
IF (IOResult = 2) THEN
ReWrite(MsgHdrF);
Reset(MsgTxtF,1);
IF (IOResult = 2) THEN
ReWrite(MsgTxtF,1);
IF AACS(General.QWKNetworkACS) THEN
BEGIN
S[0] := #25;
Move(QWKHeader.MsgFrom[1],S[1],SizeOf(QWKHeader.MsgFrom));
WHILE (S[Length(S)] = ' ') DO
Dec(S[0]);
MHeader.From.UserNum := 0;
END
ELSE
BEGIN
IF (MARealName IN MemMsgArea.MAFlags) THEN
S := ThisUser.RealName
ELSE
S := ThisUser.Name;
MHeader.From.UserNum := UserNum;
END;
MHeader.From.A1S := S;
MHeader.From.Real := S;
MHeader.From.Name := S;
MHeader.From.Anon := 0;
S[0] := #25;
Move(QWKHeader.MsgTo[1],S[1],SizeOf(QWKHeader.MsgTo));
WHILE (S[Length(S)] = ' ') DO
Dec(S[0]);
MHeader.MTo.A1S := S;
MHeader.MTo.Real := S;
MHeader.MTo.Name := S;
MHeader.MTo.UserNum := SearchUser(MHeader.MTo.Name,FALSE);
MHeader.Pointer := (FileSize(MsgTxtF) + 1);
MHeader.Date := TempDate;
Inc(TempDate);
GetDayOfWeek(MHeader.DayOfWeek);
MHeader.Status := [];
IF (QWKHeader.Flag IN ['*','+']) AND (MAPrivate IN MemMsgArea.MAFlags) THEN
Include(MHeader.Status,Prvt);
IF (RValidate IN ThisUser.Flags) THEN
Include(MHeader.Status,Unvalidated);
IF (AACS(MemMsgArea.MCIACS)) THEN
Include(MHeader.Status,AllowMCI);
Move(QWKHeader.MsgSubj[1],S[1],SizeOf(QWKHeader.MsgSubj));
S[0] := Chr(SizeOf(QWKHeader.MsgSubj));
WHILE (S[Length(S)] = ' ') DO
Dec(S[0]);
MHeader.Subject := S;
SysOpLog(MHeader.From.Name+' posted on '+MemMsgArea.Name);
SysOpLog('To: '+MHeader.MTo.Name);
MHeader.OriginDate[0] := #14;
Move(QWKHeader.MsgDate[1],MHeader.OriginDate[1],8);
MHeader.OriginDate[9] := #32;
Move(QWKHeader.MsgTime[1],MHeader.OriginDate[10],5);
MHeader.TextSize := 0;
IF (AllCaps(MHeader.MTo.A1S) <> 'QMAIL') THEN
BEGIN
Seek(MsgTxtF,FileSize(MsgTxtF));
Os := '';
X := 1;
WHILE (X <= Blocks) AND (IOResult = 0) DO
BEGIN
BlockRead(F,S[1],128);
S[0] := #128;
S := Os + S;
WHILE (Pos('<27>',S) > 0) DO
BEGIN
Os := Copy(S,1,Pos('<27>',S)-1);
S := Copy(S,Pos('<27>',S)+1,Length(S));
IF (MemMsgArea.MAType <> 0) AND (Copy(Os,1,4) = '--- ') THEN
Os := ''
ELSE
BEGIN
IF (LennMCI(Os) > 78) THEN
Os := Copy(Os,1,78 + Length(Os) - LennMCI(Os));
Inc(MHeader.TextSize,Length(Os)+1);
BlockWrite(MsgTxtF,Os,Length(Os)+1);
END;
END;
Os := S;
Inc(X);
END;
WHILE (S[Length(S)] = ' ') DO
Dec(S[0]);
IF (Length(S) > 0) THEN
BEGIN
Inc(MHeader.TextSize,(Length(S) + 1));
BlockWrite(MsgTxtF,S,(Length(S) + 1));
END;
IF (MemMsgArea.MAType <> 0) THEN
BEGIN
NewEchoMail := TRUE;
IF NOT (MAScanOut IN MemMsgArea.MAFlags) THEN
UpdateBoard;
END;
IF (MemMsgArea.MAType <> 0) AND (MAAddTear IN MemMsgArea.MAFlags) THEN
WITH MemMsgArea DO
BEGIN
S := '--- Renegade v'+General.Version;
Inc(MHeader.TextSize,(Length(S) + 1));
BlockWrite(MsgTxtF,S,(Length(S) + 1));
IF (MemMsgArea.Origin <> '') THEN
S := MemMsgArea.Origin
ELSE
S := General.Origin;
S := ' * Origin: '+S+' (';
IF (AKA > 19) THEN
AKA := 0;
S := S + IntToStr(General.AKA[AKA].Zone)+':'+
IntToStr(General.AKA[AKA].Net)+'/'+
IntToStr(General.AKA[AKA].Node);
IF (General.AKA[AKA].Point > 0) THEN
S := S +'.'+IntToStr(General.AKA[AKA].Point);
S := S + ')';
Inc(MHeader.TextSize,(Length(S) + 1));
BlockWrite(MsgTxtF,S,(Length(S) + 1));
END;
CLS;
Ok := FALSE;
UploadOk := FALSE;
Seek(MsgHdrF,FileSize(MsgHdrF));
Write(MsgHdrF,MHeader);
IF (UpQWKFor <= 0) THEN
Anonymous(TRUE,MHeader);
IF (MArea = -1) THEN
BEGIN
IF (MHeader.MTo.UserNum = 0) THEN
BEGIN
IF (AACS(General.NetMailACS)) AND
(PYNQ(^M^J'Is this to be a netmail message? ',0,FALSE)) THEN
BEGIN
IF (General.AllowAlias) AND PYNQ('Send this with your real name? ',0,FALSE) THEN
MHeader.From.A1S := ThisUser.RealName;
WITH MHeader.MTo DO
GetNetAddress(Name,Zone,Net,Node,Point,X,FALSE);
IF (MHeader.MTo.Name = '') THEN
Include(MHeader.Status,MDeleted)
ELSE
BEGIN
Inc(ThisUser.Debit,X);
Include(MHeader.Status,NetMail);
MHeader.NetAttribute := General.NetAttribute *
[Intransit,Private,Crash,KillSent,Hold,Local];
ChangeFlags(MHeader);
Counter1 := 0;
Counter := 0;
WHILE (Counter <= 19) AND (Counter1 = 0) DO
BEGIN
IF (General.AKA[Counter].Zone = MHeader.MTo.Zone) AND
(General.AKA[Counter].Zone <> 0) THEN
Counter1 := Counter;
Inc(Counter);
END;
MHeader.From.Zone := General.AKA[Counter1].Zone;
MHeader.From.Net := General.AKA[Counter1].Net;
MHeader.From.Node := General.AKA[Counter1].Node;
MHeader.From.Point := General.AKA[Counter1].Point;
END;
END
ELSE
Include(MHeader.Status,MDeleted);
END
ELSE
BEGIN
IF (MHeader.MTo.UserNum > 1) THEN
BEGIN
Inc(ThisUser.EmailSent);
IF (PrivatePostsToday < 255) THEN
Inc(PrivatePostsToday);
END
ELSE
BEGIN
Inc(ThisUser.Feedback);
IF (FeedbackPostsToday < 255) THEN
Inc(FeedbackPostsToday);
END;
LoadURec(User,MHeader.MTo.UserNum);
Inc(User.Waiting);
SaveURec(User,MHeader.MTo.UserNum);
END;
END
ELSE
BEGIN
Inc(ThisUser.MsgPost);
IF (PublicPostsToday < 255) THEN
Inc(PublicPostsToday);
AdjustBalance(General.CreditPost);
END;
Seek(MsgHdrF,(FileSize(MsgHdrF) - 1));
Write(MsgHdrF,MHeader);
END
ELSE
BEGIN
IF (MHeader.Subject = 'DROP') THEN
BEGIN
LoadLastReadRecord(LastReadRecord);
LastReadRecord.NewScan := FALSE;
SaveLastReadRecord(LastReadRecord)
END
ELSE IF (MHeader.Subject = 'ADD') THEN
BEGIN
LoadLastReadRecord(LastReadRecord);
LastReadRecord.NewScan := TRUE;
SaveLastReadRecord(LastReadRecord);
END;
Seek(F,FilePos(F) + (Blocks * 128));
END;
Close(MsgHdrF);
Close(MsgTxtF);
END
ELSE
Seek(F,FilePos(F) + (Blocks * 128));
END;
Close(F);
END
ELSE
Print('Unable to decompress REP packet.');
END
ELSE
Print('Transfer unsuccessful');
IF Exist(General.QWKLocalPath+General.PacketName+'.REP') AND (ComPortSpeed = 0)
AND (UpQWKFor = 0) AND PYNQ(^M^J'Delete REP packet? ',0,FALSE) THEN
Kill(General.QWKLocalPath+General.PacketName+'.REP');
PurgeDir(TempDir+'QWK\',FALSE);
Update_Screen;
IF (SaveConfSystem) THEN
BEGIN
ConfSystem := SaveConfSystem;
NewCompTables;
END;
MsgArea := SaveMsgArea;
InitMsgArea(MsgArea);
LastError := IOResult;
END;
END.