                               HISTORY

of the changes and modifications made by the German Portal Team
depending on the v0.639 source code.

To use this new version of the source code when compiling by yourself you
also have to create a new resource file PORTAL.RES.

For changes in the online help please read HISTHELP.TXT.

-----------------------------------------------------------------------------

Carsten Brandt           Fidonet: 2:2410/201.16

Michael Kleefeld         Fidonet: 2:2468/9963
                          E-Mail: astronik@gmx.net (no attaches)

Marcus Roeckrath         Fidonet: 2:2449/523
                          E-Mail: marcus.roeckrath@gmx.de

-----------------------------------------------------------------------------

Version: 0.639-GPT07
Date   : 25 April 2000
By     : Marcus Roeckrath

Modification:

  Added/Changed Fido product names and codes according to the actual
  version of the FTSCPROD.006.


  Program/Unit      : MAILUTIL.PAS
  Function/Procedure: ProductNames

-----------------------------------------------------------------------------

Version: 0.639-GPT07
Date   : 25 April 2000
By     : Marcus Roeckrath

Modification:

  Changed Copyright messages.


  Program/Unit      : INIT.PAS
  Function/Procedure: SetupScreen

  Changed:

    Start:=(ScreenHeight DIV 2)-4;
    MyWin(Copyright,18,Start,62,Start+6,2,'Initializing',True);
    WITH CopyRight^ DO
    BEGIN
      wFastCenter('Portal of Power v'+Ver,2,Cfg.Color[2].TextColor);
      wFastText('(C)  Copyright 1989-97 by The Portal Team',3,2);
      wFastText('1998,99 Changed by The German Portal Team',4,2);
    END;

  to:

    Start:=(ScreenHeight DIV 2)-4;
    MyWin(Copyright,14,Start,66,Start+6,2,'Initializing',True);
    WITH CopyRight^ DO
    BEGIN
      wFastCenter('Portal of Power v'+Ver,2,Cfg.Color[2].TextColor);
      wFastText('    (C) Copyright 1989-97 by The Portal Team     ',3,2);
      wFastText('(C) Copyright 1998-2000 by The German Portal Team',4,2);
    END;


  Program/Unit      : DISPLAY.PAS
  Function/Procedure: ShowAbout

  Changed:

    wFastCenter('1998,99 Changed by',8,Cfg.Color[2].TextColor);
    wFastCenter('The German Portal Team',9,Cfg.Color[2].TextColor);

  to:

    wFastCenter('(C) Copyright 1998-2000 by',8,Cfg.Color[2].TextColor);
    wFastCenter('The German Portal Team',9,Cfg.Color[2].TextColor);


  Program/Unit      : LIST.PAS
  Function/Procedure: POPfooter

  Changed:

    f^.WriteLn('                 (C) Copyright 1989-97 by The Portal Team                   ');
    f^.WriteLn('                 1998,99 Changed by The German Portal Team                  ');

  to:

    f^.WriteLn('                 (C) Copyright 1989-97 by The Portal Team                   ');
    f^.WriteLn('             (C) Copyright 1998-2000 by The German Portal Team              ');

-----------------------------------------------------------------------------

Version: 0.639-GPT07
Date   : 03 April 2000
By     : Marcus Roeckrath

Modification:

  Changed log message if a path from okfile is not found.


  Program/Unit      : PARSEREQ.PAS
  Function/Procedure: FindFirstFileToSend

  Changed:

    IF DOSError=3 THEN AddLog('!', 'OKFile error: "'+okpath+'" does not exist');

  to:

    IF DOSError=3 THEN AddLog('!', 'OKFile error: "'+okpath+'\'+Rt^.OKName+'" does not exist');

-----------------------------------------------------------------------------

Version: 0.639-GPT07
Date   : 21 March 2000
By     : Marcus Roeckrath

Modification:

  Corrects the analyzing of the IDENT fields in EMSI handshake. Mainly I
  returned to the original version of the function with a little bug fix.
  (See also: Correction of NextWord2 in YOOHOO2U.PAS from 17. April 1999)

  Changed decoding of IDENT field to reflect both methods of coding '}' and
  ']' character.


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: NextWord0 (new function mainly the old NextWord)

    FUNCTION NextWord0(BufNum:Integer; VAR BufAdr; VAR i:Integer):STRING;
    VAR
      Buf : ARRAY[1..10240] OF Char Absolute BufAdr;
      ss  : STRING;
    BEGIN
      ss:='';
      INC(i);
      REPEAT
        INC(i);
        ss:=ss+Buf[i];
        IF (Buf[i]='}') THEN
          IF (i<BufNum) AND (Buf[i+1]='}') THEN
          BEGIN
            Inc(i);
            Continue;
          END;
      UNTIL (i>=BufNum) OR (Buf[i]='}');
      Dec(ss[0]);
      NextWord0:=Trim(ss);
    END;


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: NextWord2

  Changed:

    FUNCTION NextWord0(BufNum:Integer; VAR BufAdr; VAR i:Integer):STRING;
    VAR
      Buf : ARRAY[1..10240] OF Char Absolute BufAdr;
      ss  : STRING;
    BEGIN
      ss:='';
      INC(i);
      REPEAT
        INC(i);
        ss:=ss+Buf[i];
        IF (Buf[i]='}') THEN
          IF (i<BufNum) AND (Buf[i+1]='}') THEN
          BEGIN
            Inc(i);
            Continue;
          END;
      UNTIL (i>=BufNum) OR (Buf[i]='}');
      Dec(ss[0]);
      NextWord0:=Trim(UnCook(ss));
    END;

  to:

    FUNCTION NextWord(BufNum:Integer; VAR BufAdr; VAR i:Integer):STRING;
    BEGIN
      NextWord:=Trim(UnCook(NextWord0(BufNum, BufAdr, i)));
    END;


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: NextWord2

  Changed:

    FUNCTION NextWord2(VAR s: STRING): STRING;
    VAR
      ss:STRING;
      Finished:BOOLEAN;
      i : Integer;
      WithinBrackets : WORD;
    BEGIN
      IF Length(s) = 0 then begin
        NextWord2:='Not presented';
        Exit;
      END;
      ss:='';
      i:=0;
      Finished:=FALSE;
      WithinBrackets := 0;
      REPEAT
        INC(i);
        ss:=ss+s[i];
        IF (i>1) AND (s[i] = '[') then Inc(WithinBrackets);
        IF (s[i]=']') AND (WithinBrackets = 0) THEN
          IF (s[i+1]<>']') THEN Finished:=True;
        IF (i>1) AND (WithinBrackets > 0) and (s[i]=']') then Dec(WithinBrackets);
      UNTIL (i=Length(s)) OR Finished;
      Delete(s,1,i);
      Dec(ss[0]);
      Delete(ss,1,1);
      NextWord2:=ss;
    END;

  to:

    FUNCTION NextWord2(VAR s: STRING): STRING;
    VAR
      ss:STRING;
      Finished:BOOLEAN;
      i : Integer;
    BEGIN
      IF Length(s) = 0 then begin
        NextWord2:='Not presented';
        Exit;
      END;
      ss:='';
      i:=0;
      Finished:=FALSE;
      REPEAT
        INC(i);
        ss:=ss+s[i];
        IF (s[i]=']') THEN
          IF (s[i+1]<>']') THEN Finished:=True ELSE Inc(i);
      UNTIL (i>=Length(s)) OR Finished;
      Delete(s,1,i);
      Dec(ss[0]);
      Delete(ss,1,1);
      NextWord2:=Trim(UnCook(ss));
    END;


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: ReceiveEMSIData

  Changed:

    IF ss='IDENT' THEN
    BEGIN
      { System name }
      ss:=NextWord(BufNum,Buf^,i);
    [...]
      IF ss='TRX#' THEN
      BEGIN
        ss:=NextWord(BufNum,Buf^,i);
        EMSIData.Tranx:=NextWord2(ss);
      END;
    END;

  to:

    IF ss='IDENT' THEN
    BEGIN
      { System name }
      ss:=NextWord0(BufNum,Buf^,i);
    [...]
      IF ss='TRX#' THEN
      BEGIN
        ss:=NextWord0(BufNum,Buf^,i);
        EMSIData.Tranx:=NextWord2(ss);
      END;
    END;

-----------------------------------------------------------------------------

Version: 0.639-GPT07
Date   : 16 March 2000
By     : Marcus Roeckrath

Modification:

  The modem unit does reside in overlay again.


  Program/Unit      : PORTAL.PAS
  Function/Procedure:

  Changed:

    {$O Nodelist} (*{$O Modem}*)    {$O Macro}    {$O Display}

  to:

    {$O Nodelist} {$O Modem}    {$O Macro}    {$O Display}

-----------------------------------------------------------------------------

Version: 0.639-GPT07
Date   : 16 March 2000
By     : Marcus Roeckrath

Modification:

  Added "Ext Outb.-Manager" in "Configuration|Directories & Files".
  Ctrl-O will call external outbound manager if defined.


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    TConfig = RECORD
      Version        : Byte;             { .CFG file version                   }
      TaskNumber     : Byte;             { Which task number are we            }
      SwapDir        : DosPathStr;          { Where to swap to                    }
      Filler1        : DosPathStr;

  to:

    TConfig = RECORD
      Version        : Byte;             { .CFG file version                   }
      TaskNumber     : Byte;             { Which task number are we            }
      SwapDir        : DosPathStr;          { Where to swap to                    }
      ExtOutboundMan : DosPathStr;       { External Outbound Manager }



  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: dirandfiles

  Changed:

    procedure dirandfiles;
    begin
      WITH Esr^ DO
      BEGIN
        Esr^.init(2,3,79,ScreenHeight-3,2,'Directories & files');
        addstringfield('Unknown inbound  :',2,2,charstr('!',67),2,21,50,160,cfg.inbound[nsUnknown]);
        addstringfield('Known inbound    :',3,2,charstr('!',67),3,21,50,160,cfg.inbound[nsKnown]);
        addstringfield('Password inbound :',4,2,charstr('!',67),4,21,50,160,cfg.inbound[nsPassword]);
        addstringfield('Outbound         :',5,2,charstr('!',67),5,21,50,161,cfg.outbound);
        addstringfield('Nodelist         :',6,2,charstr('!',67),6,21,50,162,cfg.NodeList);
        addstringfield('User filename    :',7,2,charstr('!',67),7,21,50,163,cfg.BBS.UserFile);
        addstringfield('Log filename     :',9,2,charstr('!',67),9,21,50,164,cfg.logfilename);
        addbytefield(  'Log level        :',10,2,'#',10,21,165,0,5,cfg.loglevel);
        AddYesNoField( 'Use year in log  :',11,2,'',11,21,166,cfg.UseYearInLog);
        addstringfield('Default macros   :',13,2,charstr('!',67),13,21,50,167,cfg.Defaultmacro);
        addstringfield('Editor           :',14,2,charstr('X',67),14,21,50,168,cfg.editor);
        addstringfield('BBS path         :',15,2,charstr('!',67),15,21,50,169,cfg.BBS.Path);
        addstringfield('Swap path        :',16,2,charstr('!',67),16,21,50,170,cfg.SwapDir);
        addchoicefield('BBS type         :',17,2,'XXXXXXXXXXXXXXX',17,21,171,1,IncBBSType,cfg.BBS.BBSType);
        addstringfield('Banner           :',18,2,charstr('!',67),18,21,50,172,cfg.banner);
        addchoicefield('Nodelist type    :',19,2,'XXXXXXXXXXX',19,21,173,1,IncNodelist,Cfg.NodelistTyp);
        SetUserRecord(cfg, SizeOf(cfg));
      END;
    END ;

  to:

    procedure dirandfiles;
    begin
      WITH Esr^ DO
      BEGIN
        Esr^.init(2,3,79,ScreenHeight-2,2,'Directories & files');
        addstringfield('Unknown inbound  :',2,2,charstr('!',67),2,21,50,160,cfg.inbound[nsUnknown]);
        addstringfield('Known inbound    :',3,2,charstr('!',67),3,21,50,160,cfg.inbound[nsKnown]);
        addstringfield('Password inbound :',4,2,charstr('!',67),4,21,50,160,cfg.inbound[nsPassword]);
        addstringfield('Outbound         :',5,2,charstr('!',67),5,21,50,161,cfg.outbound);
        addstringfield('Ext Outb.-Manager:',6,2,charstr('X',67),6,21,50,174,cfg.ExtOutboundMan);
        addstringfield('Nodelist         :',7,2,charstr('!',67),7,21,50,162,cfg.NodeList);
        addstringfield('User filename    :',8,2,charstr('!',67),8,21,50,163,cfg.BBS.UserFile);
        addstringfield('Log filename     :',10,2,charstr('!',67),10,21,50,164,cfg.logfilename);
        addbytefield(  'Log level        :',11,2,'#',11,21,165,0,5,cfg.loglevel);
        AddYesNoField( 'Use year in log  :',12,2,'',12,21,166,cfg.UseYearInLog);
        addstringfield('Default macros   :',14,2,charstr('!',67),14,21,50,167,cfg.Defaultmacro);
        addstringfield('Editor           :',15,2,charstr('X',67),15,21,50,168,cfg.editor);
        addstringfield('BBS path         :',16,2,charstr('!',67),16,21,50,169,cfg.BBS.Path);
        addstringfield('Swap path        :',17,2,charstr('!',67),17,21,50,170,cfg.SwapDir);
        addchoicefield('BBS type         :',18,2,'XXXXXXXXXXXXXXX',18,21,171,1,IncBBSType,cfg.BBS.BBSType);
        addstringfield('Banner           :',19,2,charstr('!',67),19,21,50,172,cfg.banner);
        addchoicefield('Nodelist type    :',20,2,'XXXXXXXXXXX',20,21,173,1,IncNodelist,Cfg.NodelistTyp);
        SetUserRecord(cfg, SizeOf(cfg));
      END;
    END ;


  Program/Unit      : CONFIG.PAS
  Function/Procedure: DirectoryPostEdit

  Changed:

     4 : IF TestDirectoryPath(Esr^,Cfg.NodeList,True) THEN ConfigChanged:=True;
    11 : IF TestDirectoryPath(Esr^,Cfg.BBS.Path,True) THEN ConfigChanged:=True;
    12 : IF TestDirectoryPath(Esr^,Cfg.SwapDir,True) THEN ConfigChanged:=True;

  to:

     5 : IF TestDirectoryPath(Esr^,Cfg.NodeList,True) THEN ConfigChanged:=True;
    12 : IF TestDirectoryPath(Esr^,Cfg.BBS.Path,True) THEN ConfigChanged:=True;
    13 : IF TestDirectoryPath(Esr^,Cfg.SwapDir,True) THEN ConfigChanged:=True;


  Program/Unit      : CONFIG.PAS
  Function/Procedure: directories

  Changed:

    ccUser2 : CASE Esr.GetCurrentId OF
                5 : IF SelectFile(Cfg.BBS.UserFile) THEN ConfigChanged:=True;
                6 : IF SelectFile(Cfg.LogFileName) THEN ConfigChanged:=True;
                9 : IF SelectFile(Cfg.DefaultMacro) THEN ConfigChanged:=True;
                10: IF SelectFile(Cfg.Editor) THEN ConfigChanged:=True;
                14: IF SelectFile(Cfg.Banner) THEN ConfigChanged:=True;
              END;
    ccUser3 : If (Esr.GetCurrentID = 14) and (Cfg.Banner<>'') Then RunTextEditor(Cfg.Banner);

  to:

    ccUser2 : CASE Esr.GetCurrentId OF
                4 : IF SelectFile(Cfg.ExtOutboundMan) THEN ConfigChanged:=True;
                6 : IF SelectFile(Cfg.BBS.UserFile) THEN ConfigChanged:=True;
                7 : IF SelectFile(Cfg.LogFileName) THEN ConfigChanged:=True;
                10: IF SelectFile(Cfg.DefaultMacro) THEN ConfigChanged:=True;
                11: IF SelectFile(Cfg.Editor) THEN ConfigChanged:=True;
                15: IF SelectFile(Cfg.Banner) THEN ConfigChanged:=True;
              END;
    ccUser3 : If (Esr.GetCurrentID = 15) and (Cfg.Banner<>'') Then RunTextEditor(Cfg.Banner);


  Program/Unit      : KEYWORDS.TXT
  Function/Procedure:

  Changed:

    ; System
    #KEYWORDS 10
    [...]
    ZModemDummyPacket    43

  to:

    ; System
    #KEYWORDS 10
    [...]
    ZModemDummyPacket    43
    ExtOutboundManager   44


  Program/Unit      : NEWEXP.PAS
  Function/Procedure: ExportSystemSection

  Changed:

    ExpItem(43,ResStr(MainStrDict^, 111-Byte(Cfg.ZModemDummyPkt),3));
    WriteLn(ResStr(MainStrDict^, 3, 0)+ResStr(MainStrDict^, 10, 0)+ResStr(MainStrDict^, 2, 0));

  to:

    ExpItem(43,ResStr(MainStrDict^, 111-Byte(Cfg.ZModemDummyPkt),3));
    ExpItem(44,Cfg.ExtOutboundMan);
    WriteLn(ResStr(MainStrDict^, 3, 0)+ResStr(MainStrDict^, 10, 0)+ResStr(MainStrDict^, 2, 0));


  Program/Unit      : NEWIMP.PAS
  Function/Procedure: ImportSystem

  Changed:

      43 : Cfg.ZModemDummyPkt:=BooleanRest;
    END;

  to:

      43 : Cfg.ZModemDummyPkt:=BooleanRest;
      44 : cfg.ExtOutboundMan:=trimrest;
    END;


  Program/Unit      : SESSION.PAS
  Function/Procedure: PortalMain

  Changed:

    {$IFNDEF Gamma}
                       CtrlO: BEGIN
                                MakeModemBusy;
                                IF OutList^.Size>0 THEN
                                  Call:=CLOutListPtr^.Address
                                ELSE
                                  FillChar(Call, SizeOf(Call), 0);
                                NewOutboundManager(Call);
                                NewTimerSecs(OutboundReRead, 1) ;
                              END;
    {$ENDIF}

  to:

                       CtrlO: IF (Cfg.ExtOutboundMan<>'') THEN
                              BEGIN
                                IF SetInterCom(ICOutman,Call,True) THEN
                                BEGIN
                                  MakeModemBusy;
                                  AddLog('!','Invoking external outbound manager');
                                  ii:=ShellToDos(GetEnv('COMSPEC'),'/C '+cfg.ExtOutboundMan,true);
                                  IF ii=0 THEN
                                  BEGIN
                                    AddLog(':','Returning from external outbound manager');
                                    NewTimerSecs(OutboundReRead, 1) ;
                                  END ELSE
                                    AddLog('!', 'Error '+Long2Str(ii)+' when invoking external outbound manager');
                                END;
    {$IFNDEF Gamma}
                              END ELSE
                              BEGIN
                                MakeModemBusy;
                                IF OutList^.Size>0 THEN
                                  Call:=CLOutListPtr^.Address
                                ELSE
                                  FillChar(Call, SizeOf(Call), 0);
                                NewOutboundManager(Call);
                                NewTimerSecs(OutboundReRead, 1) ;
    {$ENDIF}
                              END;

-----------------------------------------------------------------------------

Version: 0.639-GPT07
Date   : 10 March 2000
By     : Marcus Roeckrath

Modification:

  Overwrite or Append to log file. View log file via Text Editor.


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: Implementation part

  Changed:

    USES Dos, OpCrt, OpWindow, OpDos, OpString, OpEdit, OpMenu, OpEntry, OpCmd,
         OpFrame, OpField, OpDate, OpKey, OpSelect, OpPick, OpRoot, ApTimer,
    {$IFDEF OS2}
         VpUtils,
    {$ENDIF}
         Globals, PoPTypes, NodeList, Com, Modem, Musica, PingAnsi, TpAvatar,
         OproUtil, Protocol, ZSend, ZReceive, StrUtil, FileUtil, Input, TransVid,
         Keyboard, Display, InterCom, Resource, NetFile, Util, MailUtil, MTask,
         Usage, LCR, TextEdit;

  to:

    USES Dos, OpCrt, OpWindow, OpDos, OpString, OpEdit, OpMenu, OpEntry, OpCmd,
         OpFrame, OpField, OpDate, OpKey, OpSelect, OpPick, OpRoot, ApTimer,
    {$IFDEF OS2}
         VpUtils,
    {$ENDIF}
         Globals, PoPTypes, NodeList, Com, Modem, Musica, PingAnsi, TpAvatar,
         OproUtil, Protocol, ZSend, ZReceive, StrUtil, FileUtil, Input, TransVid,
         Keyboard, Display, InterCom, Resource, NetFile, Util, MailUtil, MTask,
         Usage, LCR;


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: TerminalMode

  Changed:

    LogFile     : TBufTextFile;
    LocalEcho,
    LogMode     : Boolean;

  to:

    LogFile     : TBufTextFile;
    LogFileName : S67;
    LocalEcho,
    LogMode     : Boolean;


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: ToggleLogging

  Changed:

    PROCEDURE ToggleLogging;
    VAR
      FileName : S67;
    BEGIN
      IF LogMode THEN
      BEGIN
        LogFile.Done;
        LogMode:=False;
      END ELSE
      BEGIN
        FileName:=MakeTaskFileName(PoPDumbTermLogFileName);
        LogFileName := FileName;
        IF InputString(20,8,67,20,2,'Session logging','FileName: ',FileName) THEN
        BEGIN
          LogMode:=LogFile.InitCreate(FileName, SOpenWrite, Max64k(MaxAvail-10240));
        END;
      END;
      DisplayStatusLine;
    END;

  to:

    PROCEDURE ToggleLogging;
    BEGIN
      IF LogMode THEN
      BEGIN
        LogFile.Done;
        LogMode:=False;
      END ELSE
      BEGIN
        LogFileName:=MakeTaskFileName(PoPDumbTermLogFileName);
        IF InputString(20,8,67,20,2,'Session logging','FileName: ',LogFileName) THEN
        BEGIN
          IF ExistFile(LogFileName) THEN
            IF Confirm(LogFileName + ' exists! Overwrite?','N',8) THEN
              DeleteFile(LogFileName);
          LogMode:=LogFile.InitCreate(LogFileName, SOpenWrite, Max64k(MaxAvail-10240));
        END;
      END;
      DisplayStatusLine;
    END;


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: TerminalMain

  Changed:

          AltS : SendFiles;
          AltT : TerminalEmulation;

  to:

          AltS : SendFiles;
    AltV, AltW : BEGIN
                   IF LogMode THEN BEGIN
                     LogFile.Done;
                     LogMode := FALSE;
                     DisplayStatusLine;
                     IF InKey = AltV THEN RunTextEditor(LogFileName)
                     ELSE RunTextEditor('');
                     LogMode:=LogFile.InitCreate(LogFileName, SOpenWrite, Max64k(MaxAvail-10240));
                     DisplayStatusLine;
                   END ELSE RunTextEditor('');
                   Topic:=60;
                 END;
          AltT : TerminalEmulation;

-----------------------------------------------------------------------------

Version: 0.639-GPT07
Date   : 09 March 2000
By     : Marcus Roeckrath

Modification:

  Added in Modem-Standard options: Use No Connect Analyzer?
  Added No Connect Analyzer; read PORTAL.NOC for more informations.


  Program/Unit      : RNGANALY.PAS
  Function/Procedure: Call2String (new function)
  Function/Procedure: NoConnectAnalyzer (new function)
  Function/Procedure: OutDirectory (new procedure)
  Function/Procedure: CalculateTimePeriod (new function)
  Function/Procedure: CalculateErrorlevel (new procedure)


  Program/Unit      : RNGANALY.PAS
  Function/Procedure: RingAnalyzerAnswerCall

  Changed: Extract some code as function/procedure for use
           in NoConnectAnalyzer also.


  Program/Unit      : RNGANALY.PAS
  Function/Procedure: Implementation Part

  Changed:

    SearchString1    : S25;
    SearchString2,
    SearchString3    : S10;

  to:

    SearchString1    : S30;
    SearchString2    : S25;
    SearchString3    : S206;


  Program/Unit      : OUTMAN.PAS
  Function/Procedure: Dial

  Changed:

    OutboundPtr^.path:='NoConnect: '+LongIntForm('##',NoConnect)+' BadWaZOO: '+LongIntForm('###',BadWaZOO);

  to:

    OutboundPtr^.path:='NoConnect: '+LongIntForm('###',NoConnect)+' BadWaZOO: '+LongIntForm('###',BadWaZOO);


  Program/Unit      : SESSION.PAS
  Function/Procedure: Dial

  Changed:

        ShowCallCost;
      END;
      NewTimer(OutBoundReRead, 0);
    END ELSE
    BEGIN
      IF ModemRes<>'BUSY' THEN ShowCallCost;
      IF TimerExpired(Seconds) THEN AddLog('#', 'Other end did not answer');
      UpdateUnDialable(Call, 1, 0);
    END;
    AddLog(':', 'Poll completed');

  to:
        ShowCallCost;
      END;
    END ELSE
    BEGIN
      IF ModemRes<>'BUSY' THEN ShowCallCost;
      IF TimerExpired(Seconds) THEN AddLog('#', 'Other end did not answer');
      IF cfg.Modem.UseNConAnaly THEN NoConnectAnalyzer(ModemRes)
      ELSE UpdateUnDialable(Call, 1, 0);
    END;
    NewTimer(OutBoundReRead, 0);
    AddLog(':', 'Poll completed');


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Added:

    PoPNConAnalyzerFileName = 'PORTAL.NOC';


  Changed:

    UseRingAnaly: BOOLEAN;           { Use Ring Analyzer? }
    Filler      : ARRAY[1..4] OF Byte;

  to:

    UseRingAnaly: BOOLEAN;           { Use Ring Analyzer? }
    UseNConAnaly: BOOLEAN;           { Use No Connect Analyzer? }
    Filler      : ARRAY[1..3] OF Byte;


  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: ModemOptions

  Added:

    AddYesNoField( 'NoCon Analyzer :',18,2,'',18,19,136,Modem.UseNConAnaly);


  Program/Unit      : KEYWORDS.TXT
  Function/Procedure:

  Changed:

    ; Modeminfo
    #KEYWORDS 12
    Port            1
    Baudrate        2
    PreInit         3
    Init            4
    Noanswer        5
    Dial            6
    Busy            7
    HangUp          8
    Answer          9
    ReInit          10
    LockedBaud      11
    ExitStr         12
    ModemType       13
    WaitTime        14
    InternalFax     15
    LinkStatCmd     16
    LinesToLog      17
    ConnectTime     18
    UseLCR          19
    UseRingAnalyzer 20
    ConnStatProtocol 21

  to:

    ; Modeminfo
    #KEYWORDS 12
    Port            1
    Baudrate        2
    PreInit         3
    Init            4
    Noanswer        5
    Dial            6
    Busy            7
    HangUp          8
    Answer          9
    ReInit          10
    LockedBaud      11
    ExitStr         12
    ModemType       13
    WaitTime        14
    InternalFax     15
    LinkStatCmd     16
    LinesToLog      17
    ConnectTime     18
    UseLCR          19
    UseRingAnalyzer 20
    UseNConAnalyzer 21
    ConnStatProtocol 22


  Program/Unit      : NEWEXP.PAS
  Function/Procedure: ExportModem

  Changed:

    ExpItem(20,ResStr(MainStrDict^, 111-Byte(UseRingAnaly),3));
    for i:=1 to 5 do
      ExpItem(21,Long2Str(i)+' '+Cfg.Statistics.MdmProtocol[i]);

  to:

    ExpItem(20,ResStr(MainStrDict^, 111-Byte(UseRingAnaly),3));
    ExpItem(21,ResStr(MainStrDict^, 111-Byte(UseNConAnaly),3));
    for i:=1 to 5 do
      ExpItem(22,Long2Str(i)+' '+Cfg.Statistics.MdmProtocol[i]);


  Program/Unit      : NEWIMP.PAS
  Function/Procedure: ImportModem

  Changed:

    20 : Cfg.Modem.UseRingAnaly:=BooleanRest;
    21 : BEGIN

  to:

    20 : Cfg.Modem.UseRingAnaly:=BooleanRest;
    21 : Cfg.Modem.UseNConAnaly:=BooleanRest;
    22 : BEGIN

-----------------------------------------------------------------------------

Version: 0.639-GPT07
Date   : 18 February 2000
By     : Marcus Roeckrath

Modification:

  New keyword for templates $sysopfirstname


  Program/Unit      : PTPL.PAS
  Function/Procedure: AddTpl

  Changed:

    1  : Replace(s, '$sysopname', RemHello.sysop, 0);
    8  : Replace(s,'$sysopname',FwdSysOpName,0);

  to:

    1  : BEGIN
           ss := RemHello.sysop;
           Replace(s, '$sysopfirstname', NextWord(' ', ss), 0);
           Replace(s, '$sysopname', RemHello.sysop, 0);
         END;
    8  : BEGIN
           ss := FwdSysOpName;
           Replace(s, '$sysopfirstname', NextWord(' ', ss), 0);
           Replace(s, '$sysopname', FwdSysOpName, 0);
         END;

-----------------------------------------------------------------------------

Version: 0.639-GPT07
Date   : 17 February 2000
By     : Marcus Roeckrath

Modification:

  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    {$IFDEF GermanPortalTeam}
      +'-GPT06'
    {$ENDIF}

  to:

    {$IFDEF GermanPortalTeam}
      +'-GPT07'
    {$ENDIF}

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 29 November 1999
By     : Marcus Roeckrath

Modification:

  Little "bug fix"; Freepoll definitions in PORTAL.RAC can have an empty
  Errorlevel field (if the same task should eventually answer the call)
  according to the examples in that file but this was not correct handled.


  Program/Unit      : RNGANALY.PAS
  Function/Procedure: RingAnalyzerAnswerCall

  Changed:

    TempLine := TrimSpaces(Copy(Line, 61, 5));
    IF Length(TempLine) > 0 THEN BEGIN
      MinusPos := Pos('-', TempLine);

  to:

    TempLine := TrimSpaces(Copy(Line, 61, 5));
    IF (Length(TempLine) > 0) OR (Length(Line) > 70) THEN BEGIN
      MinusPos := Pos('-', TempLine);

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 29 November 1999
By     : Marcus Roeckrath

Modification:

  New tries to fix the multitasking problems of Portal. New startup
  parameters /W???. Please read INSTALL.DOC for more informations.


  Program/Unit      : GLOBALS.PAS
  Function/Procedure: Interface part (const declaration)

  Changed:

      ComPort        : PAbsCom = NIL;

    TYPE

  to:

      ComPort        : PAbsCom = NIL;

      ActivitySemaforeTime : SMALLWORD = 0;

    TYPE


  Program/Unit      : GLOBALS.PAS
  Function/Procedure: Interface part (var declaration)

  Changed:

    ModemReInit, OutboundReRead, ScreenBlank: EventTimer;
    GlobNodeStat                            : TNodeStat;

  to:

    ModemReInit, OutboundReRead, ScreenBlank: EventTimer;
    ActivitySemafore                        : EventTimer;
    GlobNodeStat                            : TNodeStat;


  Program/Unit      : POPTYPES.PAS
  Function/Procedure: Interface part (const declaration)

  Changed:

    PoPCfgFileName    : S12 = 'PORTAL.CFG';

  to:

    PoPCfgFileName    : S12 = 'PORTAL.CFG';
    PoPActivityFileName:S12 = 'PORTAL.ACT';


  Program/Unit      : LOGFILE.PAS
  Function/Procedure: Interface part

  New:

    PROCEDURE LogWin(Prefix : Char; CONST Message : String);
    PROCEDURE WriteActivitySemafore;


  Program/Unit      : LOGFILE.PAS
  Function/Procedure: Implementation part

  Changed:

    ScrBlank, FileUtil, PoPTypes, Globals, StrUtil;

  to:

    ScrBlank, FileUtil, PoPTypes, Globals, StrUtil, ApTimer;


  Program/Unit      : LOGFILE.PAS
  Function/Procedure: LogWin (new procedure)

      PROCEDURE LogWin(Prefix: Char; CONST Message: String);
      VAR
        s : string ;
        LogDate,
        LogTime  : String[10];
      BEGIN
        IF Not LogFileOpen THEN Exit;
        IF Cfg.UseYearInLog THEN LogDate:=TodayString('dd nnn yy') ELSE
                                 LogDate:=TodayString('dd nnn');
        LogTime:=CurrentTimeString('hh:mm:ss');
        TurnScreen(On);
        IF cfg.logfilename<>'' THEN
        BEGIN
          IF pos(Prefix, '!*+:# ')<=cfg.loglevel+1 THEN
          BEGIN
    {$IFNDEF JS}
            s:=Prefix+' '+LogDate+' '+LogTime+' PORTAL '+Copy(Message,1,225);
    {$ELSE}
            s:=Prefix+' '+LogDate+' '+LogTime+' POP  '+Copy(Message,1,225);
    {$ENDIF}
            IF EndLogView[1]<>CurrentLogView[1] THEN
            BEGIN
              CurrentLogView:=EndLogView;
              ReWriteLogWindow;
            END;
          END;
        END;
        UpdateActivityWindow(' '+Prefix+' '+LogTime+' '+Message);
      END;


  Program/Unit      : LOGFILE.PAS
  Function/Procedure: WriteActivitySemafore (new procedure)

    PROCEDURE WriteActivitySemafore;
    VAR F : File OF CHAR;
        C : CHAR;
    BEGIN
      Assign(F, StartPath + MakeTaskFileName(PoPActivityFileName));
      Rewrite(F);
      IF IOResult = 0 THEN BEGIN
        C := 'P';
        Write(F, C);
        Close(F);
      END ELSE AddLog('!', 'Could not write to Portal activity semafore');
      NewTimerSecs(ActivitySemafore, ActivitySemaforeTime);
    END;


  Program/Unit      : SESSION.PAS
  Function/Procedure: PortalMain

  Changed:

    NewTimerSecs(ModemReInit, Cfg.Modem.Reinit);
    NewTimerSecs(SemaforeTimer, 15);
    [...]
        IF TimerExpired(SemaforeTimer) THEN CheckSemaforeFiles;
      END;

  to:

    NewTimerSecs(ModemReInit, Cfg.Modem.Reinit);
    NewTimerSecs(ActivitySemafore, ActivitySemaforeTime);
    NewTimerSecs(SemaforeTimer, 15);
    [...]
        IF TimerExpired(SemaforeTimer) THEN CheckSemaforeFiles;
        IF (ActivitySemaforeTime > 0) AND TimerExpired(ActivitySemafore) THEN
          WriteActivitySemafore;
      END;


  Program/Unit      : INIT.PAS
  Function/Procedure: ShowRTFM

  Changed:

    WriteLn('  /V        Compile nodelist');
    WriteLn('  /Z        No Self Test');

  to:

    WriteLn('  /V        Compile nodelist');
    Writeln('  /WT<TxBufSize>[#<Timeslices>]');
    Writeln('  /WR<RxBufSize>');
    Writeln('  /WG<Timeslices> or /WD<milliseconds>');
    Writeln('  /WA<Activity timer>');
    Writeln('  /WK       Read INSTALL.DOC for all /W? options');
    WriteLn('  /Z        No Self Test');


  Program/Unit      : INIT.PAS
  Function/Procedure: ParseCmdLine

  Changed:

    'T' : BEGIN
            Val(Copy(Param,2,255), i, Ok);
            IF Ok=0 THEN PoPCfgFileName:='PORTAL'+LongIntForm('@@', i)+'.CFG';
          END;
    'V' : CmdLineFlags:=CmdLineFlags OR clCompileNL OR clNoModem;

  to:

    'T' : BEGIN
            Val(Copy(Param,2,255), i, Ok);
            IF Ok=0 THEN PoPCfgFileName:='PORTAL'+LongIntForm('@@', i)+'.CFG';
          END;
    'W' : BEGIN
            CASE Param[2] OF
              'T' : BEGIN
                      Val(Copy(Param, 3, Length(Param)-2), x, Ok);
                      IF (Ok = 0) AND (x < 4097) THEN Com.TxBufSize := x;
                    END;
              'G' : BEGIN
                      Val(Copy(Param, 3, Length(Param)-2), x, Ok);
                      IF Ok = 0 THEN Com.TxGiveUpTime := x;
                      Com.TxGiveUpTimeDelay := FALSE;
                    END;
              'D' : BEGIN
                      Val(Copy(Param, 3, Length(Param)-2), x, Ok);
                      IF Ok = 0 THEN Com.TxGiveUpTime := x;
                      Com.TxGiveUpTimeDelay := TRUE;
                    END;
              'R' : BEGIN
                      Val(Copy(Param, 3, Length(Param)-2), x, Ok);
                      IF (Ok = 0) AND (x < 4097) THEN Com.RxBufSize := x;
                    END;
              'A' : BEGIN
                      Val(Copy(Param, 3, Length(Param)-2), x, Ok);
                      IF (Ok = 0) AND (x < 65536) THEN ActivitySemaforeTime := x;
                    END;
              'K' : Com.RxKeyPressedDelay := TRUE;
            END;
          END;
    'V' : CmdLineFlags:=CmdLineFlags OR clCompileNL OR clNoModem;


  Program/Unit      : INIT.PAS
  Function/Procedure: InitPortal

  Changed:

    AddLog('+','Begin, Portal of Power v'+Ver);
    SkipOutboundScan:=PoPKeyPressed;

  to:

    AddLog('+','Begin, Portal of Power v'+Ver);
    IF (Com.TxBufSize <> 4096) OR (Com.RxBufSize <> 2048) THEN
      AddLog('+','Transmit/Receive buffer size           : '+Long2Str(Com.TxBufSize)+' / '+Long2Str(Com.RxBufSize)+' bytes');
    IF Com.TxGiveUpTime > 0 THEN BEGIN
      IF Com.TxGiveUpTimeDelay THEN
        AddLog('+','Delay on transmitting buffer           : ' + Long2Str(Com.TxGiveUpTime) + ' msec')
      ELSE  AddLog('+','GiveUpTime on transmitting buffer      : ' + Long2Str(Com.TxGiveUpTime) + ' times');
    END;
    IF Com.RxKeyPressedDelay THEN AddLog('+','Delay on waiting com character enabled');
    IF ActivitySemaforeTime > 0 THEN AddLog('+','Time before rewriting activity semafore: ' + Long2Str(ActivitySemaforeTime));
    SkipOutboundScan:=PoPKeyPressed;


  Program/Unit      : COM.PAS
  Function/Procedure: Interface (const decleration)

  Changed:

    CONST
      TxBufSize      = 4096;
      RxBufSize      = 2048;

  to:

    CONST
      TxBufSize         : SMALLWORD = 4096;
      RxBufSize         : SMALLWORD = 2048;
      TxGiveUpTime      : SMALLWORD = 0;
      TxGiveUpTimeDelay : BOOLEAN = FALSE;
      RxKeyPressedDelay : BOOLEAN = FALSE;


  Program/Unit      : COM.PAS
  Function/Procedure: Implementation (uses decleration)

  Changed:

    USES {$IFDEF OS2}OS2Base, OpString, Strings, LogFile, {$ENDIF}
         Util, MTask, FileUtil, Globals;

  to:

    USES {$IFDEF OS2}OS2Base, OpString, Strings, LogFile, {$ENDIF}
         Util, MTask, FileUtil, Globals, ApTimer;


  Program/Unit      : COM.PAS
  Function/Procedure: TFossilCom.WriteBlock

  Changed:

    PROCEDURE TFossilCom.WriteBlock(VAR ABuffer; ABufSize: Word);
    BEGIN
      Regs.CX:=ABufSize;

  to:

    PROCEDURE TFossilCom.WriteBlock(VAR ABuffer; ABufSize: Word);
    VAR I : BYTE;
    BEGIN
      IF TxGiveUpTime > 0 THEN BEGIN
        IF TxGiveUpTimeDelay THEN BEGIN
          Delay(TxGiveUpTime);
        END
        ELSE BEGIN
          FOR I := 1 TO TxGiveUpTime DO GiveUpTime;
        END;
      END;
      Regs.CX:=ABufSize;


  Program/Unit      : MODEM.PAS
  Function/Procedure: ModemReadStr

  Changed:

        IF ComPort^.KeyPressed THEN
        BEGIN
          Ch:=Char(ComPort^.ReadByte);
      [...]
      IF NOT Escaped THEN ModemReadStr:=InStr ELSE ModemReadStr:='';
    END;

  to:

        IF ComPort^.KeyPressed THEN
        BEGIN
          IF Com.RxKeyPressedDelay THEN LogWin('M', 'Testausgabe');
          Ch:=Char(ComPort^.ReadByte);
    [...]
      IF NOT Escaped THEN ModemReadStr:=InStr ELSE ModemReadStr:='';
      IF Com.RxKeyPressedDelay THEN ReWriteLogWindow;
    END;


-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 09 November 1999
By     : Marcus Roeckrath

Modification:

  Changed Copyright notice in Filelist.


  Program/Unit      : LIST.PAS
  Function/Procedure: POPfooter

  Changed:

    f^.WriteLn('                 (C) Copyright 1989-97 by The Portal Team                   ');
    f^.WriteLn('                             All Rights Reserved.                           ');

  to:

    f^.WriteLn('                 (C) Copyright 1989-97 by The Portal Team                   ');
    f^.WriteLn('                 1998,99 Changed by The German Portal Team                  ');

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 02 November 1999
By     : Marcus Roeckrath

Modification:

  Changed In/Out nodes in Ticker to In nodes only.


  Program/Unit      : TICK.PAS
  Function/Procedure: FindNodesToSendTo

  Changed:

    BEGIN
      FillChar(TickToTab, SizeOf(TickToTab), 0);
      ReadSendTo(TickAreaRec^.GetFrom, TickToTab, GFNum);
      i:=CheckGetFrom(TickFileRec^.From);
      IF i>0 THEN
      BEGIN
        FOR j:=i TO GFNum-1 DO
          TickToTab[j]:=TickToTab[j+1];
        Dec(GFNum);
      END;
      ReadSendTo(TickAreaRec^.SendTo, TmpTab, STNum);

  to:

      BEGIN
         FillChar(TickToTab, SizeOf(TickToTab), 0);
    {    ReadSendTo(TickAreaRec^.GetFrom, TickToTab, GFNum); }
    {    i:=CheckGetFrom(TickFileRec^.From);                 }
    {    IF i>0 THEN                                         }
    {    BEGIN                                               }
    {      FOR j:=i TO GFNum-1 DO                            }
    {        TickToTab[j]:=TickToTab[j+1];                   }
    {      Dec(GFNum);                                       }
    {    END;                                                }
        GFNum := 0;
        ReadSendTo(TickAreaRec^.SendTo, TmpTab, STNum);


  Program/Unit      : TICK.PAS
  Function/Procedure: InitTickSetup

  Changed:

    AddStringField('In/Out nodes :',14, 2,CharStr('X', 50), 14, 17, 50,509, GetFrom[1]);

  to:

    AddStringField('In nodes     :',14, 2,CharStr('X', 50), 14, 17, 50,509, GetFrom[1]);

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 03 November 1999
By     : Marcus Roeckrath

Modification:

  Use the /I start parameter to enable a "Initializing modem" line in
  log file.


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    clShutDown     =2048;  { Shut down when screenblanker is activated }

  to:

    clShutDown     =2048;  { Shut down when screenblanker is activated }
    clReportMInit  =4096;  { Report Modem initialization in log file }


  Program/Unit      : MODEM.PAS
  Function/Procedure: InitModem

  Changed:

    BEGIN
      ComPort^.SetXOn(Off);

  to:

    BEGIN
      IF (CmdLineFlags AND clReportMInit) = clReportMInit THEN AddLog(':','Initializing modem');
      ComPort^.SetXOn(Off);


  Program/Unit      : INIT.PAS
  Function/Procedure: ShowRTFM

  Changed:

    WriteLn('  /H<Path>  Portal homedir');
    WriteLn('  /J        Jump to current event');

  to:

    WriteLn('  /H<Path>  Portal homedir');
    WriteLn('  /I        Report modem initializing to log file');
    WriteLn('  /J        Jump to current event');


  Program/Unit      : INIT.PAS
  Function/Procedure: ParseCmdLine

  Changed:

    'H' : ChangeDir(Copy(Param, 2, 255));
    'J' : CmdLineFlags:=CmdLineFlags OR clJump2Event;

  to:

    'H' : ChangeDir(Copy(Param, 2, 255));
    'I' : CmdLineFlags:=CmdLineFlags OR clReportMInit;
    'J' : CmdLineFlags:=CmdLineFlags OR clJump2Event;

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 13 October 1999
By     : Marcus Roeckrath

Modification:

  OK is displayed in Dumbterm after initializing of modem.


  Program/Unit      : DUMBTER.PAS
  Function/Procedure: InitTerminal

  Changed:

    ClrScr;
    HelpKey:=AltZ;

  to:

    ClrScr;
    Writeln('OK');
    HelpKey:=AltZ;

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 13 October 1999
By     : Marcus Roeckrath

Modification:

  Define an errorlevel in Dumbterm setup to call an external terminal
  program instead of the internal dumbterm. Errorlevel 0 means start the
  internal dumbterm.


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    TimeOutCarrier   : SMALLWORD;            { TimeOut, if Carrier }
    Filler           : ARRAY[1..124] OF Byte;

  to:

    TimeOutCarrier   : SMALLWORD;            { TimeOut, if Carrier }
    ExtTermErrorlevel: BYTE;                 { Errorlevel for external terminal }
    Filler           : ARRAY[1..123] OF Byte;


  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: DumbTerminalSetup

  Changed:

    AddWordField(  'TimeOut on Carrier    :',10,2,'####',10,26,604,0,7200,TimeOutCarrier);
    SetUserRecord(cfg, SizeOf(cfg));

  to:

    AddWordField(  'TimeOut on Carrier    :',10,2,'####',10,26,604,0,7200,TimeOutCarrier);
    AddByteField(  'Ext. Term. Errorlevel :',12,2,'###',12,26,605,0,248,ExtTermErrorlevel);
    SetUserRecord(cfg, SizeOf(cfg));


  Program/Unit      : KEYWORDS.TXT
  Function/Procedure:

  Changed:

    ; Dumb terminal
    #KEYWORDS 21
    [...]
    TimeOutOnCarrier 5

  to:

    ; Dumb terminal
    #KEYWORDS 21
    [...]
    TimeOutOnCarrier 5
    ExternalTerminalErrorlevel 6


  Program/Unit      : NEWEXP.PAS
  Function/Procedure: ExportDumbTerm

  Changed:

      ExpItem(5,Long2Str(TimeOutCarrier));
    end;

  to:

      ExpItem(5,Long2Str(TimeOutCarrier));
      ExpItem(6,Long2Str(ExtTermErrorlevel));
    end;


  Program/Unit      : NEWIMP.PAS
  Function/Procedure: ImportDumbTerm

  Changed:

      5 : BEGIN
            Val(TrimRest, Cfg.DumbTerm.TimeOutCarrier, Test);
            IF (Test <> 0) OR (Cfg.DumbTerm.TimeOutCarrier > 7200)
              THEN Cfg.DumbTerm.TimeOutCarrier := 300;
          END;
    END;

  to:

      5 : BEGIN
            Val(TrimRest, Cfg.DumbTerm.TimeOutCarrier, Test);
            IF (Test <> 0) OR (Cfg.DumbTerm.TimeOutCarrier > 7200)
              THEN Cfg.DumbTerm.TimeOutCarrier := 300;
          END;
      6 : BEGIN
            Val(TrimRest, Cfg.DumbTerm.ExtTermErrorlevel, Test);
            IF (Test <> 0) OR (Cfg.DumbTerm.ExtTermErrorlevel > 248)
              THEN Cfg.DumbTerm.ExtTermErrorlevel := 0;
          END;
    END;


  Program/Unit      : SESSION.PAS
  Function/Procedure:

  Changed:

    AltD : TerminalMode;

  to:

    AltD : IF Cfg.DumbTerm.ExtTermErrorlevel = 0 THEN TerminalMode
           ELSE SpawnWithErrorlevel(Cfg.DumbTerm.ExtTermErrorlevel, 'Exit to external terminal', False, TRUE);

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 26 September 1999
By     : Marcus Roeckrath

Modification:

  Fixed the ZModem "Can't get attention" problem appearing if there is
  no mail/file to sent. A dummy pkt is sended in that case, which you can
  enable/disable in "Connection setup".


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    HexTask        : Boolean;              { No = MakeTaskFileName makes decimal numbers  SA:940610}
    Filler         : ARRAY[1..22] of Byte;

  to:

    HexTask        : Boolean;              { No = MakeTaskFileName makes decimal numbers  SA:940610}
    ZModemDummyPkt : Boolean;          { Send dummy pkt on ZModemSend if there is no outgoing mail }
    Filler         : ARRAY[1..21] of Byte;


  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: ConnectionSetup

  Changed:

      Esr^.init(2,3,79,ScreenHeight-3,2,'Connection SetUp');
      [...]
      AddYesNoField(   'Use EMSI handshake  :', 7,2,'', 7,24,205,Cfg.UseEMSI);
      AddYesNoField(   'Call faster systems :', 8,2,'', 8,24,206,Cfg.FastCalls);
      AddYesNoField(   'Curmudgeon          :', 9,2,'', 9,24,217,Cfg.Curmudgeon);
      AddWordField(    'Minimum BBS Baud    :',10,2,'#####',10,24,207,0,38400,Cfg.BBS.MinBaud);
      AddStringField(  'Slow caller infofile:',11,2,CharStr('!',79),11,24,54,208,Cfg.BBS.MinBaudFile);
      AddByteField(    'User errorlevel     :',12,2,'###',12,24,209,0,255,Cfg.BBS.usererrorlevel);
      Addtimefield(    'Call frequency      :',13,2,'hh:mm:ss',13,24,210,0,0,cfg.calltime);
      Addtimefield(    'Max call delay      :',14,2,'hh:mm:ss',14,24,211,0,0,cfg.callwidth);
      Addtimefield(    'Zone Mail Hour      :',15,2,'hh:mm',15,24,212,0,0,cfg.ZMHStart);
      Addtimefield(    '-',15,30,'hh:mm',15,32,212,0,0,cfg.ZMHEnd);
      AddByteField(    'Max RINGING         :',16,2,'##',16,24,213,0,10,Cfg.MaxRinging);
      AddStringField(  'Press ESC prompt    :',17,2,CharStr('X',79),17,24,54,214,Cfg.PressESCText);
      AddStringField(  'Doing mail text     :',18,2,CharStr('X',79),18,24,54,215,Cfg.DoingMailText);
      AddStringField(  'Enter BBS text      :',19,2,CharStr('X',79),19,24,54,216,Cfg.EnterBBSText);
      SetUserRecord(cfg, SizeOf(cfg));
    END;

  to:

      Esr^.init(2,3,79,ScreenHeight-2,2,'Connection SetUp');
      [...]
      AddYesNoField(   'Use EMSI handshake  :', 7,2,'', 7,24,205,Cfg.UseEMSI);
      AddYesNoField(   'SendDummyPkt ZModem :', 8,2,'', 8,24,218,Cfg.ZModemDummyPkt);
      AddYesNoField(   'Call faster systems :', 9,2,'', 9,24,206,Cfg.FastCalls);
      AddYesNoField(   'Curmudgeon          :',10,2,'',10,24,217,Cfg.Curmudgeon);
      AddWordField(    'Minimum BBS Baud    :',11,2,'#####',11,24,207,0,38400,Cfg.BBS.MinBaud);
      AddStringField(  'Slow caller infofile:',12,2,CharStr('!',79),12,24,54,208,Cfg.BBS.MinBaudFile);
      AddByteField(    'User errorlevel     :',13,2,'###',13,24,209,0,255,Cfg.BBS.usererrorlevel);
      Addtimefield(    'Call frequency      :',14,2,'hh:mm:ss',14,24,210,0,0,cfg.calltime);
      Addtimefield(    'Max call delay      :',15,2,'hh:mm:ss',15,24,211,0,0,cfg.callwidth);
      Addtimefield(    'Zone Mail Hour      :',16,2,'hh:mm',16,24,212,0,0,cfg.ZMHStart);
      Addtimefield(    '-',16,30,'hh:mm',16,32,212,0,0,cfg.ZMHEnd);
      AddByteField(    'Max RINGING         :',17,2,'##',17,24,213,0,10,Cfg.MaxRinging);
      AddStringField(  'Press ESC prompt    :',18,2,CharStr('X',79),18,24,54,214,Cfg.PressESCText);
      AddStringField(  'Doing mail text     :',19,2,CharStr('X',79),19,24,54,215,Cfg.DoingMailText);
      AddStringField(  'Enter BBS text      :',20,2,CharStr('X',79),20,24,54,216,Cfg.EnterBBSText);
      SetUserRecord(cfg, SizeOf(cfg));
    END;


  Program/Unit      : KEYWORDS.TXT
  Function/Procedure:

  Changed:

    ; System
    #KEYWORDS 10
    [...]
    Functionkey          42

  to:

    ; System
    #KEYWORDS 10
    [...]
    Functionkey          42
    ZModemDummyPacket    43


  Program/Unit      : NEWEXP.PAS
  Function/Procedure: ExportSystemSection

  Changed:

    end;
    WriteLn(ResStr(MainStrDict^, 3, 0)+ResStr(MainStrDict^, 10, 0)+ResStr(MainStrDict^, 2, 0));

  to:

    end;
    ExpItem(43,ResStr(MainStrDict^, 111-Byte(Cfg.ZModemDummyPkt),3));
    WriteLn(ResStr(MainStrDict^, 3, 0)+ResStr(MainStrDict^, 10, 0)+ResStr(MainStrDict^, 2, 0));


  Program/Unit      : NEWIMP.PAS
  Function/Procedure: ImportSystem

  Changed:

            cfg.fkey[z,test2].Description:=rest;
          END;
   END;

  to:

            cfg.fkey[z,test2].Description:=rest;
          END;
     43 : Cfg.ZModemDummyPkt:=BooleanRest;
   END;


  Program/Unit      : WZSend
  Function/Procedure: Interface Part

  Changed:

    FUNCTION SendReqFiles(SendMode: Byte; Net, Node: Integer): Boolean;
    FUNCTION SendWaZOO(SendMode: Byte): Boolean;

  to:

    FUNCTION SendReqFiles(SendMode: Byte; Net, Node: Integer): Boolean;
    FUNCTION SendWaZOO(SendMode: Byte): Boolean;
    FUNCTION SendOutFile(SendMode: Byte): Boolean;
    FUNCTION ZModemSendEnd : BOOLEAN;


  Program/Unit      : WZSend
  Function/Procedure: SendWaZOO

  Changed:

    FUNCTION SendWaZOO(SendMode: Byte): Boolean;
    VAR
      SentReqName:S12;
      c,AkaNum       : Byte;
      FName, HoldName : PathStr;
      NoMoreAkas,OutFileSent:Boolean;
      LocFSent : Word;
      GemAdr : TFidoAddress;
      BusyFile : File;

      FUNCTION SendOutFile: Boolean;
      VAR
        i:WORD;
        ph : TPktHeader;
        f : File;
        s,ss : String;
      BEGIN
        FillOutPktHeader(cfg.Addresses[Cfg.MainAdrNum],Call,ph);
  {      FILLCHAR(ph.PassWord,SizeOf(Ph.PassWord),0);
         Str2AsciiZ(NodesRec.SessionPwd,ph.PassWord,8); }
        s:=HoldFileName(Call,True)+'OUT';
        Assign(f,s);
        ReWrite(f,1);
        BlockWrite(f,ph,SizeOf(ph));
        i:=0;
        BlockWrite(f,i,2);
        CLOSE(f);
        ss:=InventPktName;
        i := SendFile(s, ss, TeLink);
        DeleteFile(s);
        SendOutFile:=(i<2);
      END;

    BEGIN
      SendWaZOO:=False;
    [...]
            IF (SendMode=2) AND NOT OutFileSent AND NOT SendOutFile THEN
    [...]
      IF SendMode<>0 THEN
      BEGIN
        IF fsent=0 THEN
        BEGIN
          IF AkaNum=1 THEN AddLog('!', 'Nothing to send to: '+Address2Str(Call));
          CASE SendMode OF
            1: IF ZModemSend('', '', -2, 8192) <> ZTRUE THEN
               BEGIN
                 NetProblems:=1;
                 Exit;
               END;
            2: IF SendMDM7('') THEN

  to:

    FUNCTION SendOutFile(SendMode: Byte): Boolean;
    VAR
      i:WORD;
      ph : TPktHeader;
      f : File;
      s,ss : String;
    BEGIN
      FillOutPktHeader(cfg.Addresses[Cfg.MainAdrNum],Call,ph);
{      FILLCHAR(ph.PassWord,SizeOf(Ph.PassWord),0);
       Str2AsciiZ(NodesRec.SessionPwd,ph.PassWord,8); }
      s:=HoldFileName(Call,True)+'OUT';
      Assign(f,s);
      ReWrite(f,1);
      BlockWrite(f,ph,SizeOf(ph));
      i:=0;
      BlockWrite(f,i,2);
      CLOSE(f);
      ss:=InventPktName;
      CASE SendMode OF
      1 : BEGIN
           i := ZModemSend(s, ss, fsent, 8192);
           SendOutFile := (i = ZTRUE);
          END;
      2 : BEGIN
            i := SendFile(s, ss, TeLink);
            SendOutFile:=(i<2);
          END;
      END;
      DeleteFile(s);
    END;

    FUNCTION ZModemSendEnd : BOOLEAN;
    VAR BusyFile : File;
    BEGIN
      ZModemSendEnd := TRUE;
      IF CFG.ZModemDummyPkt THEN BEGIN
        IF MarkNodeBusy(BusyFile, Call) THEN BEGIN
          IF NOT SendOutFile(1) THEN BEGIN
            UnMarkNodeBusy(BusyFile);
            NetProblems:=1;
            Addlog('!', 'Error sending dummy pkt file');
            ZModemSendEnd := FALSE;
            Exit;
          END;
          Addlog('+', 'Dummy pkt file sended');
          UnMarkNodeBusy(BusyFile);
          Inc(FSent);
        END;
      END;
      IF FSent = 0 THEN BEGIN
        IF ZModemSend('', '', -2, 8192) <> ZTRUE THEN BEGIN
          NetProblems:=1;
          ZModemSendEnd := FALSE;
          Exit;
        END;
      END
      ELSE ZModemSend('', '', -1, 8192);
    END;

    FUNCTION SendWaZOO(SendMode: Byte): Boolean;
    VAR
      SentReqName:S12;
      c,AkaNum       : Byte;
      FName, HoldName : PathStr;
      NoMoreAkas,OutFileSent:Boolean;
      LocFSent : Word;
      GemAdr : TFidoAddress;
      BusyFile : File;
    BEGIN
      SendWaZOO:=False;
    [...]
            IF (SendMode=2) AND NOT OutFileSent AND NOT SendOutFile(2) THEN
    [...]
      IF SendMode<>0 THEN
      BEGIN
        IF fsent=0 THEN
        BEGIN
          IF AkaNum=1 THEN AddLog('!', 'Nothing to send to: '+Address2Str(Call));
          CASE SendMode OF
            1: IF NOT ZModemSendEnd THEN Exit;
            2: IF SendMDM7('') THEN


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: TransferNetFiles

  Changed:

    IF IsCaller THEN
    BEGIN
      IF (CurrentEvent.typ AND etNosend)=etNoSend THEN
      BEGIN
        CASE Mode OF
          1 : ZModemSend('', '', - 2, 8192);
      [...]
      BEGIN
        RequestSent:=False;
        CASE Mode OF
          1 : ZModemSend('', '', - 2, 8192);

  to:

    IF IsCaller THEN
    BEGIN
      IF (CurrentEvent.typ AND etNosend)=etNoSend THEN
      BEGIN
        CASE Mode OF
          1 : IF NOT ZModemSendEnd THEN GOTO EndWaZoo;
      [...]
      BEGIN
        RequestSent:=False;
        CASE Mode OF
          1 : IF NOT ZModemSendEnd THEN GOTO EndWaZoo;

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 19 August 1999
By     : Marcus Roeckrath

Modification:

  Changed date format from dd-mm-yy to dd.mm.yy in europian date format.


  Program/Unit      : LIST.PAS
  Function/Procedure: ListMain

  Changed:

    IF Cfg.ListFiles.DkDate THEN DatePicture:='dd-mm-yy' ELSE DatePicture:='mm-dd-yy';

  to:

    IF Cfg.ListFiles.DkDate THEN DatePicture:='dd.mm.yy' ELSE DatePicture:='mm-dd-yy';

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 17 August 1999
By     : Marcus Roeckrath

Modification:

  Changed file extension of unpacked out packets from FUT to OUT.


  Program/Unit      : RNGANALY.PAS
  Function/Procedure: RingAnalyzerAnswerCall

  Changed:

    CONST FileExtensions : ARRAY[1..10] OF S3 = ('FLO', 'CLO', 'HLO', 'ILO', 'DLO', 'FUT', 'CUT', 'HUT', 'IUT', 'DUT');

  to:

    CONST FileExtensions : ARRAY[1..10] OF S3 = ('FLO', 'CLO', 'HLO', 'ILO', 'DLO', 'OUT', 'CUT', 'HUT', 'IUT', 'DUT');

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 17 August 1999
By     : Marcus Roeckrath

Modification:

  Added missing characters in first column of log file.


  Program/Unit      : FILEUTIL.PAS
  Function/Procedure: RunCmd

  Changed:

    AddLog(' ','Running: '+Cmd);

  to:

    AddLog(':','Running: '+Cmd);


  Program/Unit      : PARSEREQ.PAS
  Function/Procedure: InitReqFile

  Changed:

    AddLog(' ','NodeStat: '+Long2Str(Ord(GlobNodeStat))+' = Files: '+Long2Str(MaxReqFiles)+
               '  Bytes: '+Long2Str(MaxReqBytes)+
               '  Time: '+TimeToTimeString('hh:mm:ss',MaxReqTime));

  to:

    AddLog(':','NodeStat: '+Long2Str(Ord(GlobNodeStat))+' = Files: '+Long2Str(MaxReqFiles)+
               '  Bytes: '+Long2Str(MaxReqBytes)+
               '  Time: '+TimeToTimeString('hh:mm:ss',MaxReqTime));


  Program/Unit      : PTPL.PAS
  Function/Procedure: FileToPkt

  Changed:

    Addlog(' ','Converting '+FNam+' to PKT-file');

  to:

    Addlog('+','Converting '+FNam+' to PKT-file');


  Program/Unit      : OUTINFO.PAS
  Function/Procedure: SearchDir

  Changed:

    AddLog(' ', 'Invalid entry in: '+ZoneOut+Sr.Name+' ('+s+')');

  to:

    AddLog('!', 'Invalid entry in: '+ZoneOut+Sr.Name+' ('+s+')');


  Program/Unit      : MODEM.PAS
  Function/Procedure: MNPFilter

  Changed:

    AddLog(' ','MNP Filter');

  to:

    AddLog('#','MNP Filter');


  Program/Unit      : FALLBACK.PAS
  Function/Procedure: FTSC_RecvMail

  Changed:

    AddLog(' ','Inbound mail packets');
    [...]
    AddLog(' ','Inbound file attaches');
    [...]
    AddLog(' ','End of inbound file attaches');

  to:

    AddLog('*','Inbound mail packets');
    [...]
    AddLog('*','Inbound file attaches');
    [...]
    AddLog('*','End of inbound file attaches');


  Program/Unit      : TICK.PAS
  Function/Procedure: Tick2Buffer

  Changed:

    AddLog(' ','Reading '+TickName);

  to:

    AddLog(':','Reading '+TickName);


  Program/Unit      : TICK.PAS
  Function/Procedure: UnPackTicks

  Changed:

    IF DosError=0 THEN AddLog(' ','Unpacking packed tick files');

  to:

    IF DosError=0 THEN AddLog(':','Unpacking packed tick files');


  Program/Unit      : MACRO.PAS
  Function/Procedure: EditMacro

  Changed:

    AddLog(' ', 'Macro deleted');

  to:

    AddLog(':', 'Macro deleted');


  Program/Unit      : MACRO.PAS
  Function/Procedure: LoadMacros

  Changed:

    0  : AddLog(' ','Macro file '''+FileName+''' loaded');
    2  : AddLog(' ',FileName+' does not exist');
    $fe: AddLog(' ','Load macro: Out of heap space');
    $ff: Addlog(' ',FileName+' is not a valid macro file');
    ELSE AddLog(' ','Load macro: I/O Error '+Long2Str(Err));

  to:

    0  : AddLog(':','Macro file '''+FileName+''' loaded');
    2  : AddLog('!',FileName+' does not exist');
    $fe: AddLog('!','Load macro: Out of heap space');
    $ff: Addlog('!',FileName+' is not a valid macro file');
    ELSE AddLog('!','Load macro: I/O Error '+Long2Str(Err));


  Program/Unit      : MACRO.PAS
  Function/Procedure: SaveMacros

  Changed:

    0 :  AddLog(' ','Macro file '''+FileName+''' saved');
    ELSE AddLog(' ','Save macro: I/O Error '+Long2Str(Err));

  to:

    0 :  AddLog(':','Macro file '''+FileName+''' saved');
    ELSE AddLog('!','Save macro: I/O Error '+Long2Str(Err));


  Program/Unit      : MACRO.PAS
  Function/Procedure: MacroMenu

  Changed:

    AddLog(' ','Empty macro - not added');
    [...]
        1  : AddLog(' ','Macro table full');
        2  : AddLog(' ','Out of memory');
        ELSE AddLog(' ','Macro added');

  to:

    AddLog('!','Empty macro - not added');
    [...]
        1  : AddLog('!','Macro table full');
        2  : AddLog('!','Out of memory');
        ELSE AddLog(':','Macro added');


  Program/Unit      : KEYBOARD.PAS
  Function/Procedure: PopReadKeyWord

  Changed:

    AddLog(' ', 'Keyboard unlocked');

  to:

    AddLog(':', 'Keyboard unlocked');


  Program/Unit      : INIT.PAS
  Function/Procedure: InitPortal

  Changed:

    AddLog(' ','Keyboard locked');

  to:

    AddLog(':','Keyboard locked');


  Program/Unit      : NETFILE.PAS
  Function/Procedure: TNetFile.Lock

  Changed:

    IF NOT NL THEN AddLog(' ','Lock timeout on: '+FName+' ('+HexW(LockErr)+')');

  to:

    IF NOT NL THEN AddLog('!','Lock timeout on: '+FName+' ('+HexW(LockErr)+')');


  Program/Unit      : SESSION.PAS
  Function/Procedure: CheckModemResponse

  Changed:

    AddLog(' ','DTE Speed: '+Long2Str(Cfg.Modem.BaudRate)+', Line speed: '+Long2Str(Realbaudrate));

  to:

    AddLog('#','DTE Speed: '+Long2Str(Cfg.Modem.BaudRate)+', Line speed: '+Long2Str(Realbaudrate));


  Program/Unit      : SESSION.PAS
  Function/Procedure: Dial

  Changed:

    AddLog(' ','DTE Speed: '+Long2Str(Cfg.Modem.BaudRate)+', Line speed: '+Long2Str(Realbaudrate));

  to:

    AddLog('#','DTE Speed: '+Long2Str(Cfg.Modem.BaudRate)+', Line speed: '+Long2Str(Realbaudrate));


  Program/Unit      : SESSION.PAS
  Function/Procedure: PortalMain

  Changed:

                      AddLog(' ','Keyboard locked');
    [...]
    AddLog(' ','Mail seems to have been sent without my knowledge - forcing rescan!');

  to:

                      AddLog(':','Keyboard locked');
    [...]
    AddLog('!','Mail seems to have been sent without my knowledge - forcing rescan!');

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 17 July 1999
By     : Marcus Roeckrath

Modification:

  Sort of phone numbers has to be confirmed before sort starts. During
  sorting a moving beam is shown.


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: SortDialDir

  Changed:

      Flag:BOOLEAN;
    BEGIN
      o:=f.FILEPOS-1;
      REPEAT
        Flag:=FALSE;
        FOR i:=0 TO f.FileSize-2 DO
        BEGIN
          f.GetRec(a,i,NoKeep,Wait); f.Read(b,NoKeep,Wait);
    [...]
      UNTIL NOT Flag;

  to:

      Flag:BOOLEAN;
      Sort : WindowPtr;
      Working : S40;
    BEGIN
      IF Not Confirm('Sure you want to sort phone list?','N',12) THEN Exit;
      Working := '';
      mywin(Sort,18,12,61,14,2,'Sorting',True);
      o:=f.FILEPOS-1;
      REPEAT
        Flag:=FALSE;
        FOR i:=0 TO f.FileSize-2 DO
        BEGIN
          Sort^.wFastWrite(Working, 1, 2, cfg.color[2].HighLightColor);
          Working := Working[40] + Copy(Working, 1, 39);
          f.GetRec(a,i,NoKeep,Wait); f.Read(b,NoKeep,Wait);
    [...]
      UNTIL NOT Flag;
      KillWindow(Sort);

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 14 July 1999
By     : Marcus Roeckrath

Modification:

  On Alt-P (Poll from main window) you will be shown the system entered by
  node number to make a confirmation in the same way you have to to in
  outbound manager.


  Program/Unit      : SESSION.PAS
  Function/Procedure: PollNode

  Changed:

    IF GetAddress(11,2,Poll,1500) THEN

  to:

    IF GetConfirmAddress(11,2,Poll,1500) THEN

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 14 July 1999
By     : Marcus Roeckrath

Modification:

  F4 (Send file) will ask for address first and then flavour like other
  options.


  Program/Unit      : OUTMAN.PAS
  Function/Procedure: SendFile

  Changed:

    BEGIN
      Ch:=Attach[SelectMailType(escaped,1550)];
      IF escaped THEN Exit;
      OutAddress.Zone:=cfg.Addresses[Cfg.MainAdrNum].Zone;
      OutAddress.Net:=cfg.Addresses[Cfg.MainAdrNum].Net;
      OutAddress.Node:=0;
      OutAddress.Point:=0;
      IF Not GetConfirmAddress(4,3,OutAddress,1503) THEN Exit;
      FillChar(FilesToSend, SizeOf(FilesToSend), 0);

  to:

    BEGIN
      OutAddress.Zone:=cfg.Addresses[Cfg.MainAdrNum].Zone;
      OutAddress.Net:=cfg.Addresses[Cfg.MainAdrNum].Net;
      OutAddress.Node:=0;
      OutAddress.Point:=0;
      IF Not GetConfirmAddress(4,3,OutAddress,1503) THEN Exit;
      Ch:=Attach[SelectMailType(escaped,1550)];
      IF escaped THEN Exit;
      FillChar(FilesToSend, SizeOf(FilesToSend), 0);

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 06 July 1999
By     : Marcus Roeckrath

Modification:

  Damaged outgoing EMSI handshake corrected
  ("Password error/No common session").


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: SendEMSIData

  Changed:

        s:='{EMSI}{';
        s:=s+Address2Str(Cfg.Addresses[AkaNum]);
        FOR i:=1 TO MaxAddresses DO
        BEGIN
          IF (Cfg.Addresses[i].Zone<>0) AND (i<>AkaNum) THEN
            s:=s+' '+Address2Str(Cfg.Addresses[i]);
        END;
    [...]
        Move(s[1],Buf^[15],Length(s));
        BufNum:=Length(s)+15;

  to:

        BufNum := 15;
        s:='{EMSI}{';
        s:=s+Address2Str(Cfg.Addresses[AkaNum]);
        FOR i:=1 TO MaxAddresses DO
        BEGIN
          IF (Cfg.Addresses[i].Zone<>0) AND (i<>AkaNum) THEN BEGIN
            s:=s+' '+Address2Str(Cfg.Addresses[i]);
            IF Length(s) > 180 THEN BEGIN
              Move(s[1], Buf^[BufNum], Length(s));
              Inc(BufNum, Integer(Length(s)));
              s := '';
            END;
          END;
        END;
    [...]
        Move(s[1],Buf^[BufNum],Length(s));
        Inc(BufNum, Integer(Length(s)));

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 06 July 1999
By     : Marcus Roeckrath

Modification:

  When locking keyboard you have to enter password twice.


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    UserTime       : LongInt;                    { Timestamp of LASTUSER file}
    KbdPassword    : S20;                        { Keyboard lock password    }
    Filler4        : ARRAY[1..46] OF Byte;

  to:

    UserTime       : LongInt;                    { Timestamp of LASTUSER file}
    KbdPassword    : S20;                        { Keyboard lock password    }
    KbdPasswordR   : S20;                        { Retyped Keyboard lock password }
    Filler4        : ARRAY[1..25] OF Byte;


  Program/Unit      : SESSION.PAS
  Function/Procedure:

  Changed:

        AltL : BEGIN
                 mywin(TmpWin,19,11,60,13,2,'Lock Keyboard',True);
                 Write(' Enter password,ESC=Abort,CR=Finished');
                 Data.KbdPassword:='';
                 REPEAT
                   TmpCh:=Char(Lo(PopReadKeyWord));
                   IF Not (TmpCh IN [#27,#13]) THEN Data.KbdPassword:=Data.KbdPassword+TmpCh;
                 UNTIL TmpCh IN [#27,#13];
                 KillWindow(TmpWin);
                 IF (TmpCh<>#27) And (Data.KbdPassword<>'') THEN
                 BEGIN
                   TmpPassword:=''; KeyboardLock:=True;
                   AddLog(' ','Keyboard locked');
                 END ELSE
                   Data.KbdPassword:='';
    {$IFNDEF OS2}
                 WriteMacroStatus;
    {$ENDIF}
               END;

  to:

        AltL : BEGIN
                 mywin(TmpWin,19,11,61,13,2,'Lock Keyboard',True);
                 TmpWin^.wFastText(' Enter password, ESC=Abort, CR=Finished ', 1, 1);
                 Data.KbdPassword := '';
                 REPEAT
                   TmpCh := Char(Lo(PopReadKeyWord));
                   IF Not (TmpCh IN [#27,#13]) THEN Data.KbdPassword := Data.KbdPassword + TmpCh;
                 UNTIL TmpCh IN [#27,#13];
                 IF (TmpCh <> #27) And (Data.KbdPassword <> '') THEN BEGIN
                   TmpWin^.wFastText(' Retype password, ESC=Abort, CR=Finished', 1, 1);
                   Data.KbdPasswordR := '';
                   REPEAT
                     TmpCh := Char(Lo(PopReadKeyWord));
                     IF Not (TmpCh IN [#27,#13]) THEN Data.KbdPasswordR := Data.KbdPasswordR + TmpCh;
                   UNTIL TmpCh IN [#27,#13];
                   IF (TmpCh <> #27) AND (Data.KbdPassword = Data.KbdPasswordR) THEN BEGIN
                     TmpPassword := ''; KeyboardLock := True;
                     AddLog(' ','Keyboard locked');
                   END ELSE
                     Data.KbdPassword := '';
                   Data.KbdPasswordR := '';
                 END ELSE
                   Data.KbdPassword := '';
                 KillWindow(TmpWin);
    {$IFNDEF OS2}
                 WriteMacroStatus;
    {$ENDIF}
               END;

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 06 July 1999
By     : Marcus Roeckrath

Modification:

  In Terminal setup|Misc. options you can define TimeOuts for Carrier and
  No Carrier conditions: You can enter 1 to 7200 seconds or 0 for no TimeOut.


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    CfgVersion       =   5;                 { Current version of the .CFG file }

  to:

    CfgVersion       =   6;                 { Current version of the .CFG file }


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    DumbTerm : RECORD
      CRSendsLF,                               { Make a CR after receiving a }
                                               { line feed character         }
      DestructiveBS : Boolean;                 { BS deletes characters       }
      ModemInit     : S40;                     { Cmd. to initialize modem    }
      Filler        : ARRAY[1..128] OF Byte;
    END;

  to:

    DumbTerm : RECORD
      CRSendsLF,                               { Make a CR after receiving a }
                                               { line feed character         }
      DestructiveBS    : Boolean;              { BS deletes characters       }
      ModemInit        : S40;                  { Cmd. to initialize modem    }
      TimeOutNoCarrier : SMALLWORD;            { TimeOut, if No Carrier }
      TimeOutCarrier   : SMALLWORD;            { TimeOut, if Carrier }
      Filler           : ARRAY[1..124] OF Byte;
    END;


  Program/Unit      : INIT.PAS
  Function/Procedure: ReadControlFile

  Changed:

    WITH AreaMan DO

  to:

    WITH DumbTerm DO BEGIN
      TimeOutNoCarrier := 300;
      TimeOutCarrier := 300;
    END;
    WITH AreaMan DO


  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: DumbTerminalSetup

  Changed:

    WITH Esr^,Cfg.DumbTerm DO
    BEGIN
      Esr^.init(2,3,79,ScreenHeight-3,2,'Dumb terminal misc. options');
      addstringfield('Modem init     :',2,2,'',2,19,40,600,modemInit);
      AddYesNoField( 'CR sends LF    :',4,2,'',4,19,601,CRSendsLF);
      AddYesNoField( 'Destructive BS :',6,2,'',6,19,602,DestructiveBS);
      SetUserRecord(cfg, SizeOf(cfg));
    END;

  to:

    WITH Esr^,Cfg.DumbTerm DO
    BEGIN
      Esr^.init(2,3,79,ScreenHeight-3,2,'Dumb terminal misc. options');
      addstringfield('Modem init            :',2,2,'',2,26,40,600,modemInit);
      AddYesNoField( 'CR sends LF           :',4,2,'',4,26,601,CRSendsLF);
      AddYesNoField( 'Destructive BS        :',6,2,'',6,26,602,DestructiveBS);
      AddWordField(  'TimeOut on No Carrier :',8,2,'####',8,26,603,0,7200,TimeOutNoCarrier);
      AddWordField(  'TimeOut on Carrier    :',10,2,'####',10,26,604,0,7200,TimeOutCarrier);
      SetUserRecord(cfg, SizeOf(cfg));
    END;


  Program/Unit      : KEYWORDS.TXT
  Function/Procedure:

  Changed:

    ; Dumb terminal
    #KEYWORDS 21
    CRSendsLF       1
    DestructiveBS   2
    ModemInit       3

  to:

    ; Dumb terminal
    #KEYWORDS 21
    CRSendsLF       1
    DestructiveBS   2
    ModemInit       3
    TimeOutOnNoCarrier 4
    TimeOutOnCarrier 5


  Program/Unit      : NEWEXP.PAS
  Function/Procedure: ExportDumbTerm

  Changed:

    ExpItem(3,ModemInit);

  to:

    ExpItem(3,ModemInit);
    ExpItem(4,Long2Str(TimeOutNoCarrier));
    ExpItem(5,Long2Str(TimeOutCarrier));


  Program/Unit      : NEWIMP.PAS
  Function/Procedure: ImportDumbTerm

  Changed:

    PROCEDURE ImportDumbTerm;
    BEGIN
      CASE TokenNr of
        1 : Cfg.DumbTerm.CrSendsLF:=BooleanRest;
        2 : Cfg.DumbTerm.DestructiveBS:=BooleanRest;
        3 : Cfg.DumbTerm.ModemInit:=TrimRest;
      END;

  to:

    PROCEDURE ImportDumbTerm;
    VAR Test : INTEGER;
    BEGIN
      CASE TokenNr of
        1 : Cfg.DumbTerm.CrSendsLF:=BooleanRest;
        2 : Cfg.DumbTerm.DestructiveBS:=BooleanRest;
        3 : Cfg.DumbTerm.ModemInit:=TrimRest;
        4 : BEGIN
              Val(TrimRest, Cfg.DumbTerm.TimeOutNoCarrier, Test);
              IF (Test <> 0) OR (Cfg.DumbTerm.TimeOutNoCarrier > 7200)
               THEN Cfg.DumbTerm.TimeOutNoCarrier := 300;
            END;
        5 : BEGIN
              Val(TrimRest, Cfg.DumbTerm.TimeOutCarrier, Test);
              IF (Test <> 0) OR (Cfg.DumbTerm.TimeOutCarrier > 7200)
                THEN Cfg.DumbTerm.TimeOutCarrier := 300;
            END;
    END;


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: TerminalMain

  Changed:

    UNTIL (InKey=AltX) OR TimerExpired(InActivity);

  to:

    UNTIL (InKey=AltX) OR
          ((ComPort^.Carrier = TRUE) AND (Cfg.DumbTerm.TimeOutCarrier > 0) AND
           (ElapsedTimeInSecs(InActivity) > Cfg.DumbTerm.TimeOutCarrier)) OR
          ((ComPort^.Carrier = FALSE) AND (Cfg.DumbTerm.TimeOutNoCarrier > 0) AND
           (ElapsedTimeInSecs(InActivity) > Cfg.DumbTerm.TimeOutNoCarrier));

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 04 July 1999
By     : Marcus Roeckrath

Modification:

  Now '?' is displayed as provider and zone if no phone entry matches
  in PORTAL.LCR.


  Program/Unit      : LCR.PAS
  Function/Procedure: SearchBlockBegin

  Changed:

    Line := '';
    Zone := '';
    WHILE NOT EoF(F) AND (Copy(Line, 1, 12) <> '[BLOCKBEGIN]') DO Readln(F, Line);
    Zone := TrimSpaces(Copy(Line, 13, Length(Line)-12));

  to:

    Line := '';
    WHILE NOT EoF(F) AND (Copy(Line, 1, 12) <> '[BLOCKBEGIN]') DO Readln(F, Line);
    IF Copy(Line, 1, 12) = '[BLOCKBEGIN]' THEN
      Zone := TrimSpaces(Copy(Line, 13, Length(Line)-12))
    ELSE Zone := '?';


  Program/Unit      : LCR.PAS
  Function/Procedure: LeastCostRouting

  Changed:

    TempPhone := '';
    Zone := '';
    Provider := '';

  to:

    TempPhone := '';
    Zone := '?';
    Provider := '?';

-----------------------------------------------------------------------------

Version: 0.639-GPT06
Date   : 04 July 1999
By     : Marcus Roeckrath

Modification:

  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    {$IFDEF GermanPortalTeam}
      +'-GPT05'
    {$ENDIF}

  to:

    {$IFDEF GermanPortalTeam}
      +'-GPT06'
    {$ENDIF}

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 09 June 1999
By     : Marcus Roeckrath

Modification:

  Added more informations to the Dialing windows of outgoing calls like
  Calling Number, Provider, Zone and Costs.


  Program/Unit      : LCR.PAS
  Function/Procedure:

  Changed:

    INTERFACE

    USES Use32, PopTypes;

    VAR Costs : LONGINT;
        Zone : STRING;
        Provider : STRING;

    FUNCTION LeastCostRouting(Phone: S40; VAR Costs: LONGINT): S60;

  to:

    INTERFACE

    USES Use32, PopTypes;

    VAR Costs : LONGINT;
        Zone : S40;
        Provider : S40;

    FUNCTION LeastCostRouting(Phone: S40): S60;


  Program/Unit      : LCR.PAS
  Function/Procedure: SearchBlockBegin

  Changed:

    Line := '';
    WHILE NOT EoF(F) AND (Copy(Line, 1, 12) <> '[BLOCKBEGIN]') DO Readln(F, Line);

  to:

    Line := '';
    Zone := '';
    WHILE NOT EoF(F) AND (Copy(Line, 1, 12) <> '[BLOCKBEGIN]') DO Readln(F, Line);
    Zone := TrimSpaces(Copy(Line, 13, Length(Line)-12));


  Program/Unit      : LCR.PAS
  Function/Procedure: LeastCostRouting

  Changed:

    FUNCTION LeastCostRouting(Phone: S40; VAR Costs: LONGINT): S60;
    [...]
      TempPhone := '';
    [...]
                      TempPhone := TrimSpaces(LCRAdd);
                    END;
    [...]
      LeastCostRouting := TempPhone + Phone;


  to:

    FUNCTION LeastCostRouting(Phone: S40): S60;
    [...]
      TempPhone := '';
      Zone := '';
      Provider := '';
    [...]
                      TempPhone := TrimSpaces(LCRAdd);
                      Provider := TrimSpaces(Copy(Line, 42, Length(Line)-41));
                      IF Pos(' ', Provider) > 0 THEN
                        Provider := TrimSpaces(Copy(Provider, Pos(' ', Provider) + 1, Length(Provider) - Pos(' ', Provider)))
                      ELSE Provider := '?';
                    END;
    [...]
      IF Zone = '' THEN Zone := '?';
      LeastCostRouting := TempPhone + Phone;


  Program/Unit      : SESSION.PAS
  Function/Procedure: Dial

  Changed:

    t            : EventTimer;
    TempCosts    : LONGINT;
    TempPhone    : S60;
    [...]
    mywin(Temp,15,9,65,18,2,'Dialing',True);
    [...]
    END;
    Inc(StatRec^.DayStat[0].CallsOut);
    IF FoundInNodes And (NodesRec.SpecialDials[CurrentEvent.SpecDial]<>'') THEN
      s:=NodesRec.SpecialDials[CurrentEvent.SpecDial] ELSE s:=FindSpecialModemDial;

    IF IsOurAddress(Call) THEN Nodelistentry.PhoneNumber:=PhoneTranslation(Nodelistentry.PhoneNumber);
    IF Cfg.Modem.UseLCR THEN TempPhone := LeastCostRouting(Nodelistentry.PhoneNumber, TempCosts)
    ELSE BEGIN
      TempCosts := MaxLongint;
      TempPhone := Nodelistentry.PhoneNumber;
    END;
    WITH NodelistEntry, Temp^,Cfg.Color[2] DO
    BEGIN
      IF TempCosts < MaxLongint THEN RealCost := TempCosts;
      wFastText('Cost/Min   :',7,2);
      wfastwrite(Long2Str(RealCost),7,15,HighLightColor);
    END;

  to:

    t            : EventTimer;
    TempPhone    : S60;
    [...]
    mywin(Temp,15,8,65,20,2,'Dialing',True);
    [...]
      wFastText('Calling    :',7,2);
      wFastText('Provider   :',8,2);
      wFastText('Zone       :',9,2);
      wFastText('Cost/Min   :',10,2);
    END;
    Inc(StatRec^.DayStat[0].CallsOut);
    IF FoundInNodes And (NodesRec.SpecialDials[CurrentEvent.SpecDial]<>'') THEN
      s:=NodesRec.SpecialDials[CurrentEvent.SpecDial] ELSE s:=FindSpecialModemDial;

    IF IsOurAddress(Call) THEN Nodelistentry.PhoneNumber:=PhoneTranslation(Nodelistentry.PhoneNumber);
    IF Cfg.Modem.UseLCR THEN TempPhone := LeastCostRouting(Nodelistentry.PhoneNumber)
    ELSE BEGIN
      LCR.Costs := MaxLongint;
      LCR.Provider := '?';
      LCR.Zone := '?';
      TempPhone := Nodelistentry.PhoneNumber;
    END;
    WITH NodelistEntry, Temp^,Cfg.Color[2] DO
    BEGIN
      IF LCR.Costs < MaxLongint THEN RealCost := LCR.Costs;
      wfastwrite(TempPhone,7,15,HighLightColor);
      wfastwrite(LCR.Provider,8,15,HighLightColor);
      wfastwrite(LCR.Zone,9,15,HighLightColor);
      wfastwrite(Long2Str(RealCost),10,15,HighLightColor);
    END;

  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: DialNumber

  Changed:
    f            : TNetFile;
    TempCosts    : LONGINT;
    TempPhone    : S60;
    [...]
        mywin(dial,20,9,60,13,2,'Dialing',True);
        WITH cfg.color[2],dial^ DO
        BEGIN
          wfasttext(' Name    : ',1,1);
          wfasttext(' Calling : ',2,1);
          wfasttext(' TimeOut : ',3,1);
          wfastwrite(Name,1,13,HighLightColor);
        END;
        IF Cfg.Modem.UseLCR THEN TempPhone := LeastCostRouting(Number, TempCosts)
        ELSE TempPhone := Number;
        WITH cfg.color[2],dial^ DO wfastwrite(TempPhone,2,12,HighLightColor);
        TranslateModemString(cfg.modem.dial+TempPhone+'|');
        Sec:=cfg.modem.waittime;
        s:='';
        REPEAT
          NewTimerSecs(t, 1);
          dial^.wfastwrite(Long2Str(Sec)+' ',3,12,cfg.color[2].HighLightColor);


  to:

    f            : TNetFile;
    TempPhone    : S60;
    [...]
        mywin(dial,20,8,60,17,2,'Dialing',True);
        WITH cfg.color[2],dial^ DO
        BEGIN
          wfasttext(' Name     : ',2,1);
          wfasttext(' Calling  : ',3,1);
          wfasttext(' Provider : ',4,1);
          wfasttext(' Zone     : ',5,1);
          wfasttext(' Cost/Min : ',6,1);
          wfasttext(' TimeOut  : ',7,1);
          wfastwrite(Name,2,12,HighLightColor);
        END;
        IF Cfg.Modem.UseLCR THEN TempPhone := LeastCostRouting(Number)
        ELSE BEGIN
          LCR.Costs := MaxLongint;
          LCR.Provider := '?';
          LCR.Zone := '?';
          TempPhone := Number;
        END;
        WITH cfg.color[2],dial^ DO BEGIN
          wfastwrite(TempPhone,3,13,HighLightColor);
          wfastwrite(LCR.Provider,4,13,HighLightColor);
          wfastwrite(LCR.Zone,5,13,HighLightColor);
          IF LCR.Costs < MaxLongint THEN wfastwrite(Long2Str(LCR.Costs),6,13,HighLightColor)
          ELSE wfastwrite('0',6,13,HighLightColor);
        END;
        TranslateModemString(cfg.modem.dial+TempPhone+'|');
        Sec:=cfg.modem.waittime;
        s:='';
        REPEAT
          NewTimerSecs(t, 1);
          dial^.wfastwrite(Long2Str(Sec)+' ',7,13,cfg.color[2].HighLightColor);

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 04 June 1999
By     : Marcus Roeckrath

Modification:

  Added self test to Portal do avoid virus infection or manipulation. If
  self test fails Portal terminates with errorlevel 255. Please change
  your POP.BAT file. Self test can be disabled with /Z command line
  switch.


  Program/Unit      : SELFCHK.PAS (new unit)
  Function/Procedure:


  Program/Unit      : SELFCHK1.PAS (new unit)
  Function/Procedure:


  Program/Unit      : PORTAL.PAS
  Function/Procedure:

  Changed:

    USES
      Use32,

  to:

    USES
      Use32, SelfChk1,


  Program/Unit      : INIT.PAS
  Function/Procedure: ShowRTFM

  Changed:

    WriteLn('  /V        Compile nodelist');
    WriteLn('  /?        Show this help');

  to:

    WriteLn('  /V        Compile nodelist');
    WriteLn('  /Z        No Self Test');
    WriteLn('  /?        Show this help');


  Program/Unit      : INIT.PAS
  Function/Procedure: ParseCmdLine

  Changed:

    'V' : CmdLineFlags:=CmdLineFlags OR clCompileNL OR clNoModem;
    '?' : ShowRTFM('', True);

  to:

    'V' : CmdLineFlags:=CmdLineFlags OR clCompileNL OR clNoModem;
    'Z' : ;
    '?' : ShowRTFM('', True);

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 2 June 1999
By     : Marcus Roeckrath

Modification:

  Corrects handling of F10 key.


  Program/Unit      : SESSION.PAS
  Function/Procedure: Dial

  Commented out:

    {    IF ((CurrentEvent.Typ AND etNoAnswer)=0) AND
            (Copy(ModemRes, 1, 7)='NO DIAL') AND (Cfg.Modem.Answer<>'') THEN
         BEGIN
           SetInterCom(ICIdle,Call,False);
           CheckModemResponse(True);
           NewTimerSecs(Data.NextTime, CalculateNextTime);
           Exit;
         END; }

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 30 May 1999
By     : Marcus Roeckrath

Modification:

  Why does Portal force modem answer on "No Dialtone" from modem?


  Program/Unit      : SESSION.PAS
  Function/Procedure: PortalMain

  Changed:

    F10  : IF SetInterCom(ICConfig,Call,False) THEN
           BEGIN
             Configuration(False, LastChoice);

  to:

    F10  : IF SetInterCom(ICConfig,Call,False) THEN
           BEGIN
             LastChoice := 0;
             Configuration(False, LastChoice);

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 31 May 1999
By     : Marcus Roeckrath

Modification:

  In FTS-0001 the packet password is defined with a maximum of 8 characters
  length delimited by ascii 0 (Ascii-Zero string); therefore there is a
  maximum of 7 significant characters. But it seams that Portal does use
  a maximum of 6 characters. It seams also that Portal does not use the
  packet password on outgoing mail packets. Packet password of 8 significant
  characters was defined in FSC-0039 but Portal will be compatible to
  FTS-0001 in future.


  Program/Unit      : MAILUTIL.PAS
  Function/Procedure: FillOutPktHeader

  Changed:

    IF FindNodeInfo(NodesRec,Dest) THEN Str2AsciiZ(NodesRec.PktPassWord,PassWord,7);

  to:

    IF FindNodeInfo(NodesRec,Dest) THEN Str2AsciiZ(NodesRec.PktPassWord,PassWord,8);


  Program/Unit      : WZSEND.PAS
  Function/Procedure: SendOutFile

  Changed:

    FillOutPktHeader(cfg.Addresses[Cfg.MainAdrNum],Call,ph);
    FILLCHAR(ph.PassWord,SizeOf(Ph.PassWord),0);
    Str2AsciiZ(NodesRec.SessionPwd,ph.PassWord,7);

  to:

          FillOutPktHeader(cfg.Addresses[Cfg.MainAdrNum],Call,ph);
    {      FILLCHAR(ph.PassWord,SizeOf(Ph.PassWord),0);
           Str2AsciiZ(NodesRec.SessionPwd,ph.PassWord,8); }


  Program/Unit      : MAILSCAN.PAS
  Function/Procedure: ProcessPktFiles

  Changed:

    IF Trim(StUpCase(AsciiZ2Str(TPktHeader(Buffer^).PassWord,7)))=Ni.PktPassWord THEN
    BEGIN
      Message('Tossing mail packet from '+Address2Str(PktOrig),2);

  to:

    IF (Trim(StUpCase(AsciiZ2Str(TPktHeader(Buffer^).PassWord,7)))=Ni.PktPassWord)
       OR (Ni.PktPassword = '') THEN
      BEGIN
        IF (Trim(StUpCase(AsciiZ2Str(TPktHeader(Buffer^).PassWord,7)))<>'')
           AND (Ni.PktPassword = '') THEN
          AddLog('!','Packet '+sr.name+' has password "'+
                 StUpCase(AsciiZ2Str(TPktHeader(Buffer^).PassWord,7))+
                 '". Packet password ignored');
        Message('Tossing mail packet from '+Address2Str(PktOrig),2);

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 26 May 1999
By     : Marcus Roeckrath

Modification:

  Added internal errorlevel 249 (wrong cpu) to POP.BAT file. Please
  compare your old batch file against the new version.

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 25 May 1999
By     : Marcus Roeckrath

Modification:

  Portal does not save configuration file after importing configuration.


  Program/Unit      : NEWIMP.PAS
  Function/Procedure: ImportConfig;

  Changed:

    Addlog('+','Configuration imported');

  to:

    IF Confirm('Save new configuration','Y',11) THEN BEGIN
      SaveConfiguration;
      Addlog('+','Configuration imported');
    END ELSE LoadConfiguration;


  Program/Unit      : CONFIG.PAS
  Function/Procedure:

  Added (in interface part of unit):

    PROCEDURE LoadConfiguration;

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 25 May 1999
By     : Marcus Roeckrath

Modification:

  Changed own addresses from 16 to 126. Also Portal does not save confi-
  guration file after importing configuration.


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    MaxAddresses     =  16;
    CfgVersion       =   4;                 { Current version of the .CFG file }

  to:

    MaxAddresses     = 126;
    CfgVersion       =   5;                 { Current version of the .CFG file }


  Program/Unit      : NEWIMP.PAS
  Function/Procedure:

  Changed:

    USES Oproot, Opstring, Dos, PopTypes, Resource, StrUtil, Netfile, LogFile,
         MailUtil, Globals, Input, OpDate, OpWindow, Oproutil;

  to:

    USES Oproot, Opstring, Dos, PopTypes, Resource, StrUtil, Netfile, LogFile,
         MailUtil, Globals, Input, OpDate, OpWindow, Oproutil, Config;


  Program/Unit      : NEWIMP.PAS
  Function/Procedure: ImportSystem;

  Changed:

    1 : Val(rest, Cfg.Version, test);

  to:

    1 : Cfg.Version := CfgVersion; {Val(rest, Cfg.Version, test);}


  Program/Unit      : NEWEXP.PAS
  Function/Procedure: ExportSystemSection

  Changed:

    FOR i:=1 TO 16 DO
      IF Cfg.Addresses[i].Zone<>0 THEN
        ExpItem(14,Address2Str(Cfg.Addresses[i]));

  to:

    FOR i:=1 TO MaxAddresses DO
      IF Cfg.Addresses[i].Zone<>0 THEN
        ExpItem(14,Address2Str(Cfg.Addresses[i]));


  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: Matrix_Info

  Changed:

    PROCEDURE matrix_info;
    VAR
      i:BYTE;
    BEGIN
      WITH Esr^, cfg DO
      BEGIN
        Esr^.init(2,3,79,ScreenHeight-1,2,'Matrix information');
        EsFieldOptionsOn(efRightJustify);
        FOR i:=1 TO 16 DO
        BEGIN
          WITH Cfg.Addresses[i] DO
          BEGIN
            AddIntField('Address '+LongIntForm('##',i)+'   :',i,2,'#####',i,17,100,0,32767,Zone);
            AddIntField(':',i,22,'#####',i,23,100,0,32767,Net);
            AddIntField('/',i,28,'#####',i,29,100,0,32767,Node);
            AddIntField('.',i,34,'#####',i,35,100,0,32767,Point);
          END;
        END;
        EsFieldOptionsOff(efRightJustify);
        AddByteField(  'Main address :',17,2,'##',17,17,101,1,16,cfg.MainAdrNum);
        AddStringField('SysOp name   :',18,2,'',18,17,20,102,cfg.sysop);
        AddStringField('System name  :',19,2,'',19,17,60,103,cfg.system);
        AddIntField(   'Point Net    :',20,2,'#####',20,17,104,0,0,cfg.pointnet);
        AddYesNoField( 'Use fake     :',21,2,'',21,17,105,Cfg.UseFakeAddress);
        SetUserRecord(cfg, SizeOf(cfg));
      END;
    END;

  to:

    PROCEDURE matrix_info;
    VAR
      i:BYTE;
    BEGIN
      WITH Esr^, cfg DO
      BEGIN
        Esr^.init(2,3,79,ScreenHeight-1,2,'Matrix information');
        EsFieldOptionsOff(efRightJustify);
        AddStringField('SysOp name   :',1,2,'',1,17,20,102,cfg.sysop);
        AddStringField('System name  :',2,2,'',2,17,60,103,cfg.system);
        AddIntField(   'Point Net    :',3,2,'#####',3,17,104,0,0,cfg.pointnet);
        AddYesNoField( 'Use fake     :',4,2,'',4,17,105,Cfg.UseFakeAddress);
        AddByteField(  'Main address :',5,2,'###',5,17,101,1,MaxAddresses,cfg.MainAdrNum);
        EsFieldOptionsOn(efRightJustify);
        FOR i:=1 TO MaxAddresses DO
        BEGIN
          WITH Cfg.Addresses[i] DO
          BEGIN
            AddIntField('Address '+LongIntForm('###',i)+'   :',i+5,2,'#####',i+5,17,100,0,32767,Zone);
            AddIntField(':',i+5,22,'#####',i+5,23,100,0,32767,Net);
            AddIntField('/',i+5,28,'#####',i+5,29,100,0,32767,Node);
            AddIntField('.',i+5,34,'#####',i+5,35,100,0,32767,Point);
          END;
        END;
        SetUserRecord(cfg, SizeOf(cfg));
      END;
    END;


  Program/Unit      : INIT.PAS
  Function/Procedure: ReadControlFile

  Changed:

    VAR
      f         : FILE OF TConfig;
    [...]
    BEGIN
      Assign(f, PoPCfgFileName); FileMode:=ShareRead+ShareDenyW;
      Reset(f);
    [...]
          BEGIN
            Read(f,cfg);
            IF IOResult<>0 THEN ;
            Close(f);
    {***** Fjernes engang.... *****}
            IF Cfg.Version=2 THEN
            BEGIN
              Cfg.Version:=CfgVersion;
              FOR x:=nsUnknown TO nsPassword DO
                Cfg.Inbound[x]:=Cfg.Filler1;
              Cfg.InboundToDo[nsKnown]:=itd_Tick+itd_File+itd_Mail;
              FillChar(Cfg.Filler1, SizeOf(Cfg.Filler1), 0);
              Cfg.Modem.WaitTime:=60;
              Move(Cfg.Modem.Init[41], Cfg.Modem.NoAnswer, 645);
              SaveConfiguration;
            END;
            IF Cfg.Version=3 THEN
            BEGIN
              Cfg.Version:=CfgVersion;
              Move(Cfg.Modem.Init[41], Cfg.Modem.NoAnswer, 645);
              SaveConfiguration;
            END;
            IF Cfg.Modem.WaitTime=0 THEN Cfg.Modem.WaitTime:=60;
    {******************************}
            IF Cfg.Version<>CfgVersion THEN
            BEGIN
              WriteLn('Portal of Power v'+Ver+#10#13'Wrong .CFG-file version - please run CONVCFG.EXE');
              Halt(1);
            END;
          END;

  to:

    VAR
      f         : FILE OF TConfig;
      g         : FILE OF BYTE;
    [...]
    BEGIN
      Assign(g, PoPCfgFileName); FileMode:=ShareRead+ShareDenyW;
      Reset(g);
    [...]
            Read(g, cfg.Version);
            IF IOResult<>0 THEN ;
            Close(g);
            IF Cfg.Version = CfgVersion THEN BEGIN
              Assign(f, PoPCfgFileName); FileMode:=ShareRead+ShareDenyW;
              Reset(f);
              IF IOResult<>0 THEN ;
              Read(f,cfg);
              IF IOResult<>0 THEN ;
              Close(f);
              IF Cfg.Modem.WaitTime=0 THEN Cfg.Modem.WaitTime:=60;
            END
            ELSE BEGIN
              WriteLn('Portal of Power v'+Ver+#10#13'Wrong .CFG-file version - please run CONVPCFG');
              Halt;
            END;
          END;

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 23 May 1999
By     : Marcus Roeckrath

Modification:

  Disabled Alt-Q key if "Generate filelist" (Action menu) is not available.


  Program/Unit      : PORTAL.PAS
  Function/Procedure: PortalMain

  Changed:

    AltQ : THEN BEGIN
             MakeModemBusy;
             ListMain;
           END;

  to:

    AltQ : IF Cfg.BBS.BBSType <> btNone THEN BEGIN
             MakeModemBusy;
             ListMain;
           END;

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 11 May 1999
By     : Marcus Roeckrath

Modification:

  Added closing communication port to SpawnWithErrorlevel as boolean value.
  Closing fossil if there is no need to hold fossil open.


  Program/Unit      : UTIL.PAS
  Function/Procedure: SpawnWithErrorlevel (also in INTERFACE part of unit)

  Changed:

    PROCEDURE SpawnWithErrorlevel(l: Integer; CONST s: String; MakeBusy: Boolean);

  to:

    PROCEDURE SpawnWithErrorlevel(l: Integer; CONST s: String; MakeBusy: Boolean; ClosePort: Boolean);


  Changed:

    AddLog('+', 'End, Portal of Power v' + Ver);
    FinishPortal;

  to:

    AddLog('+', 'End, Portal of Power v' + Ver);
    IF ClosePort THEN BEGIN
      ComPort^.SetDtr(Low);
      Dispose(ComPort, Done);
    END;
    FinishPortal;


  Program/Unit      : RNGANALY.PAS
  Function/Procedure: RingAnalyzerAnswerCall

  Changed:

    IF ErrorLevel > 0 THEN SpawnWithErrorlevel(Errorlevel, 'Exit on FreePoll override', FALSE)
    [...]
    SpawnWithErrorlevel(Errorlevel, 'Exit on outbound file found at FreePoll', FALSE)
    [...]

  to:

    IF ErrorLevel > 0 THEN SpawnWithErrorlevel(Errorlevel, 'Exit on FreePoll override', FALSE, FALSE)
    [...]
    SpawnWithErrorlevel(Errorlevel, 'Exit on outbound file found at FreePoll', FALSE, FALSE)
    [...]
    IF ErrorLevel > 0 THEN BEGIN
      Close(F);
      IF Reject THEN
        SpawnWithErrorlevel(ErrorLevel, 'Exit on special ring/caller', FALSE, TRUE)
      ELSE SpawnWithErrorlevel(ErrorLevel, 'Exit on special ring/caller', FALSE, FALSE);
    END;


  Program/Unit      : EVENT.PAS
  Function/Procedure: ChangeEvent

  Changed:

    SpawnWithErrorlevel(CurrentEvent.InitExit, 'Exit at start of event', True);

  to:

    SpawnWithErrorlevel(CurrentEvent.InitExit, 'Exit at start of event', True, TRUE);


  Program/Unit      : FUNCSRVR.PAS
  Function/Procedure: FunctionServer

  Changed:

    fsExit            : SpawnWithErrorLevel(Hi(Action),'Exit', True);

  to:

    fsExit            : SpawnWithErrorLevel(Hi(Action),'Exit', True, TRUE);


  Program/Unit      : SESSION.PAS
  Function/Procedure: CheckModemResponse

  Changed:

    SpawnWithErrorLevel(ErrLvl, 'Exit on CONNECT string', False);
    [...]
    SpawnWithErrorlevel(CurrentEvent.MailExit, 'Exit after mail', True);
    [...]
    SpawnWithErrorlevel(CurrentEvent.FilesExit, 'Exit after files', True);
    [...]
    SpawnWithErrorlevel(CurrentEvent.PollExit, 'Exit after poll', True);
    [...]
    SpawnWithErrorlevel(w, 'Spawning to BBS', False);

  to:

    SpawnWithErrorLevel(ErrLvl, 'Exit on CONNECT string', False, FALSE);
    [...]
    SpawnWithErrorlevel(CurrentEvent.MailExit, 'Exit after mail', True, TRUE);
    [...]
    SpawnWithErrorlevel(CurrentEvent.FilesExit, 'Exit after files', True, TRUE);
    [...]
    SpawnWithErrorlevel(CurrentEvent.PollExit, 'Exit after poll', True, TRUE);
    [...]
    SpawnWithErrorlevel(w, 'Spawning to BBS', False, FALSE);


  Program/Unit      : SESSION.PAS
  Function/Procedure: Dial

  Changed:

    SpawnWithErrorlevel(CurrentEvent.MailExit, 'Exit after mail', True);
    [...]
    SpawnWithErrorlevel(CurrentEvent.FilesExit,'Exit after files', True);

  to:

    SpawnWithErrorlevel(CurrentEvent.MailExit, 'Exit after mail', True, TRUE);
    [...]
    SpawnWithErrorlevel(CurrentEvent.FilesExit,'Exit after files', True, TRUE);


  Program/Unit      : SESSION.PAS
  Function/Procedure: CheckSemaforeFiles

  Changed:

    SpawnWithErrorlevel(ELevel,'Semafore exit', True, TRUE);

  to:

    SpawnWithErrorlevel(ELevel,'Semafore exit', True, TRUE);


  Program/Unit      : SESSION.PAS
  Function/Procedure: PortalMain

  Changed:

    SpawnWithErrorlevel(ErrorLevel, 'Function key exit "'+description+'"', True);
    [...]
    SpawnWithErrorlevel(ErrorLevel,'Function key exit "'+description+'"', True);
    [...]
    IF (CmdLineFlags AND clShutDown) = clShutDown THEN
      SpawnWithErrorlevel(0, 'Exit on activated screen blanker', FALSE);

  to:

    SpawnWithErrorlevel(ErrorLevel, 'Function key exit "'+description+'"', True, TRUE);
    [...]
    SpawnWithErrorlevel(ErrorLevel,'Function key exit "'+description+'"', True, TRUE);
    [...]
    IF (CmdLineFlags AND clShutDown) = clShutDown THEN BEGIN
      SetInterCom(ICUnused, Call, FALSE);
      SpawnWithErrorlevel(0, 'Exit on activated screen blanker', FALSE, TRUE);
    END;


  Program/Unit      : MODEM.PAS
  Function/Procedure: InitModem

  Changed:

    SpawnWithErrorlevel(253, 'Exiting', False);

  to:

    SpawnWithErrorlevel(253, 'Exiting', False, TRUE);

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 06 May 1999
By     : Marcus Roeckrath

Modification:

  The modem unit does not reside in overlay anymore.


  Program/Unit      : PORTAL.PAS
  Function/Procedure:

  Changed:

    {$O Nodelist} {$O Modem}    {$O Macro}    {$O Display}

  to:

    {$O Nodelist} (*{$O Modem}*)    {$O Macro}    {$O Display}

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 06 May 1999
By     : Marcus Roeckrath

Modification:

  Portal crashes when importing a previous exported configuration.


  Program/Unit      : NETFILE.PAS
  Function/Procedure: TNetFile.OpenWithMode

  Changed:

    IF NetIo<>0 THEN Fail;

  to:

    IF NetIo<>0 THEN BEGIN
      FName := '';
      Fail;
    END;


  Program/Unit      : NETFILE.PAS
  Function/Procedure: TNetFile.Close

  Changed:

    CheckNetIo('Close');
    System.Close(f);

  to:

    CheckNetIo('Close');
    System.Close(f);
    FName := '';


  Program/Unit      : NEWIMP.PAS
  Function/Procedure: ImportFile

  Changed:

    Assign(f, FName); Reset(f);
    IF IOResult=0 THEN
    BEGIN
      New(LocalStrDict,init);

  to:

    Assign(f, FName); Reset(f);
    IF IOResult=0 THEN
    BEGIN
      TmpFile.FName := '';
      New(LocalStrDict,init);


  Changed:

    TmpFile.Seek(TmpFile.FileSize);

  to:

    IF TmpFile.FName <> '' THEN TmpFile.Seek(TmpFile.FileSize);


  Changed:

    TmpFile.Close;
    LocalStrDict^.Done;

  to:

    IF TmpFile.FName <> '' THEN TmpFile.Close;
    LocalStrDict^.Done;


  Changed:

    TmpFile.Close;
    Addlog('+','Configuration imported');

  to:

    IF TmpFile.FName <> '' THEN TmpFile.Close;
    Addlog('+','Configuration imported');

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 04 May 1999
By     : Marcus Roeckrath

Modification:

  A ';' was written to screen instead of stored to the export file. It's
  only a cosmetical bug!


  Program/Unit      : NEWEXP.PAS
  Function/Procedure: ExportEvent

  Changed:

    END;
    WriteLn(';');
    DataFile.Close;

  to:

    END;
    OutFile.WriteLn(';');
    DataFile.Close;

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 25 April 1999
By     : Marcus Roeckrath

Modification:

  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    {$IFDEF GermanPortalTeam}
      +'-GPT04'
    {$ENDIF}

  to:

    {$IFDEF GermanPortalTeam}
      +'-GPT05'
    {$ENDIF}

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 12 April 1999
By     : Marcus Roeckrath

Modification:

  If EndTime is lower than StartTime (f. e. time intervall 23:00-02:00)
  the function TimeIsBetween returns false if the current time is one
  of the end points of the time interval. In a Time interval like
  11:00-20:00 the function will return true on the end points of the
  interval. Changed this so that the behaviour of the function is the
  same in both cases.


  Program/Unit      : UTIL.PAS
  Function/Procedure: TimeIsBetween

  Changed:

    TimeIsBetween:=Not ((CurrentTime>=Time2) And (CurrentTime<=Time1));

  to:

    TimeIsBetween:=Not ((CurrentTime>Time2) And (CurrentTime<Time1));

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 17 April 1999
By     : Marcus Roeckrath

Modification:

  Corrects the analyzing of the IDENT fields in EMSI handshake. If a caller
  presents a baudrate which is one "character" larger than the flags field
  (f. e. [300][XA]) the EMSI flags field is not showed correctly ('XA][XA'
  in the example from before). Also it handles additional brackets '[]' in
  this EMSI fields much better, so that f. e. a system name presented
  by the caller like 'system name [line #3]' or something like that will now
  be displayed correctly.


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: NextWord2

  Changed:

    FUNCTION NextWord2(VAR s: STRING): STRING;
    VAR
      ss:STRING;
      Finished:BOOLEAN;
      i : Integer;
    BEGIN
      ss:='';
      i:=0;
      Finished:=FALSE;
      REPEAT
        INC(i);
        ss:=ss+s[i];
        IF (s[i]=']') THEN
          IF (s[i+1]<>']') THEN Finished:=True ELSE Inc(i);
      UNTIL (i=Length(s)) OR Finished;
      Delete(s,1,i);
      Dec(ss[0]);
      Delete(ss,1,1);
      NextWord2:=Trim(ss);
    END;

  to:

  FUNCTION NextWord2(VAR s: STRING): STRING;
  VAR
    ss:STRING;
    Finished:BOOLEAN;
    i : Integer;
    WithinBrackets : WORD;
  BEGIN
    IF Length(s) = 0 then begin
      NextWord2:='Not presented';
      Exit;
    END;
    ss:='';
    i:=0;
    Finished:=FALSE;
    WithinBrackets := 0;
    REPEAT
      INC(i);
      ss:=ss+s[i];
      IF (i>1) AND (s[i] = '[') then Inc(WithinBrackets);
      IF (s[i]=']') AND (WithinBrackets = 0) THEN
        IF (s[i+1]<>']') THEN Finished:=True;
      IF (i>1) AND (WithinBrackets > 0) and (s[i]=']') then Dec(WithinBrackets);
    UNTIL (i=Length(s)) OR Finished;
    Delete(s,1,i);
    Dec(ss[0]);
    Delete(ss,1,1);
    NextWord2:=ss;
  END;

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 06 April 1999
By     : Marcus Roeckrath

Modification:

  The Least Cost Routing enabling/disabling option in Modem standard
  setup did not have an effect in DumbTerminal.


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: Dial

  Changed:

    TempPhone := LeastCostRouting(Number, TempCosts);

  to:

    IF Cfg.Modem.UseLCR THEN TempPhone := LeastCostRouting(Number, TempCosts)
    ELSE TempPhone := Number;

-----------------------------------------------------------------------------

Version: 0.639-GPT05
Date   : 06 April 1999
By     : Marcus Roeckrath

Modification:

  If there is no match for an calling number in the Least Cost Routing
  configuration file the dial number was doubled.


  Program/Unit      : LCR.PAS
  Function/Procedure: LeastCostRouting

  Changed:

    END;
    Close(F);

  to:

    END
    ELSE TempPhone := '';
    Close(F);

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 12 March 1999
By     : Marcus Roeckrath

Modification:

  Enabled call out statistical file PORTAL.SCO in all version and not in
  ALPHA only.


  Program/Unit      : SESSION.PAS
  Function/Procedure: Dial

  Changed:

    {$IFDEF Alpha}
          UpdateCallsOutStat(dt1,dt2,call,FReceived,FSent,RealBaudRate);
    {$ENDIF}

  to:

          UpdateCallsOutStat(dt1,dt2,call,FReceived,FSent,RealBaudRate);

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 25 February 1999
By     : Marcus Roeckrath

Modification:

  Added in Modem-Standard options:

  - "Time to Connect" - How many seconds before "CONNECT".
  - Use Least Cost Routing?
  - Use Ring Analyzer?


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    LogLines    : Byte;
    Filler      : ARRAY[1..7] OF Byte;

  to:

    LogLines    : Byte;
    ConnectTime : BYTE;              { How many seconds before CONNECT }
    UseLCR      : BOOLEAN;           { Use Least Cost Routing? }
    UseRingAnaly: BOOLEAN;           { Use Ring Analyzer? }
    Filler      : ARRAY[1..4] OF Byte;


  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: ModemOptions

  Added:

    AddByteField(  'Time to Connect:',15,2,'##',15,19,133,0,99,Modem.ConnectTime);
    AddYesNoField( 'LeastCostRouter:',16,2,'',16,19,134,Modem.UseLCR);
    AddYesNoField( 'Ring Analyzer  :',17,2,'',17,19,135,Modem.UseRingAnaly);


  Program/Unit      : SESSION.PAS
  Function/Procedure: ShowCallCost

  Changed:

    IF Seconds<10 THEN Seconds:=10;
    NodeCost:=(((days*86400)+seconds+59) DIV 60)*NodelistEntry.RealCost;
    StatRec^.DayStat[0].Cost:=StatRec^.DayStat[0].Cost+NodeCost;
    AddLog(':', 'Connected to: '+Address2Str(Call)+' for: '+TimeToTimeString('hh:mm:ss', (days*86400)+Seconds))+
                ' cost: '+Long2Str(NodeCost));

  to:

      { IF Seconds<10 THEN Seconds:=10; }
      NodeCost:=(((days*86400)+seconds+LONGINT(Cfg.Modem.ConnectTime)+59) DIV 60)*NodelistEntry.RealCost;
      StatRec^.DayStat[0].Cost:=StatRec^.DayStat[0].Cost+NodeCost;
      AddLog(':', 'Connected to: '+Address2Str(Call)+' for: '+
                  TimeToTimeString('hh:mm:ss', (days*86400)+Seconds+LONGINT(Cfg.Modem.ConnectTime))+
                  ' cost: '+Long2Str(NodeCost));


  Program/Unit      : SESSION.PAS
  Function/Procedure: UpdateCallsOutStat

  Changed:

    IF Seconds<10 THEN Seconds:=10;
    NodeCost:=(((Days*86400)+Seconds+59) DIV 60)*NodelistEntry.RealCost;

  to:

    { IF Seconds<10 THEN Seconds:=10; }
    NodeCost:=(((Days*86400)+Seconds+LONGINT(Cfg.Modem.ConnectTime)+59) DIV 60)*NodelistEntry.RealCost;

  Changed:

    Cost         := (((Days*86400)+Seconds+59) DIV 60)*NodelistEntry.RealCost;

  to:

    Cost         := (((Days*86400)+Seconds+LONGINT(Cfg.Modem.ConnectTime)+59) DIV 60)*NodelistEntry.RealCost;


  Program/Unit      : SESSION.PAS
  Function/Procedure: Dial

  Changed:

    TempPhone := LeastCostRouting(Nodelistentry.PhoneNumber, TempCosts);

  to:

    IF Cfg.Modem.UseLCR THEN TempPhone := LeastCostRouting(Nodelistentry.PhoneNumber, TempCosts)
    ELSE BEGIN
      TempCosts := MaxLongint;
      TempPhone := Nodelistentry.PhoneNumber;
    END;


  Program/Unit      : LCR.PAS
  Function/Procedure:

  Changed:

    USES Dos, Globals, Util, OPDate, OPString;

  to:

    USES Dos, Globals, Util, OPDate, OPString, LogFile;


  Program/Unit      : LCR.PAS
  Function/Procedure: LeastCostRouting

  Changed:

        Close(F);
      END;
      LeastCostRouting := TempPhone + Phone;
    END;

  to:

        Close(F);
      END
      ELSE AddLog('!', 'Least Cost Router configuration file ' + PopLeastCostRoutingFileName + ' not found');
      LeastCostRouting := TempPhone + Phone;
    END;


  Program/Unit      : KEYWORDS.TXT
  Function/Procedure:

  Changed:

    ; Modeminfo
    #KEYWORDS 12
    Port            1
    Baudrate        2
    PreInit         3
    Init            4
    Noanswer        5
    Dial            6
    Busy            7
    HangUp          8
    Answer          9
    ReInit          10
    LockedBaud      11
    ExitStr         12
    ModemType       13
    WaitTime        14
    InternalFax     15
    LinkStatCmd     16
    LinesToLog      17
    ConnStatProtocol 18

  to:

    ; Modeminfo
    #KEYWORDS 12
    Port            1
    Baudrate        2
    PreInit         3
    Init            4
    Noanswer        5
    Dial            6
    Busy            7
    HangUp          8
    Answer          9
    ReInit          10
    LockedBaud      11
    ExitStr         12
    ModemType       13
    WaitTime        14
    InternalFax     15
    LinkStatCmd     16
    LinesToLog      17
    ConnectTime     18
    UseLCR          19
    UseRingAnalyzer 20
    ConnStatProtocol 21


  Program/Unit      : NEWEXP.PAS
  Function/Procedure: ExportModem

  Changed:

    ExpItem(17,Long2Str(LogLines));
    for i:=1 to 5 do
      ExpItem(18,Long2Str(i)+' '+Cfg.Statistics.MdmProtocol[i]);

  to:

    ExpItem(17,Long2Str(LogLines));
    ExpItem(18,Long2Str(ConnectTime));
    ExpItem(19,ResStr(MainStrDict^, 111-Byte(UseLCR),3));
    ExpItem(20,ResStr(MainStrDict^, 111-Byte(UseRingAnaly),3));
    for i:=1 to 5 do
      ExpItem(21,Long2Str(i)+' '+Cfg.Statistics.MdmProtocol[i]);


  Program/Unit      : NEWIMP.PAS
  Function/Procedure: ImportModem

  Changed:

    17 : Val(TrimRest, Cfg.Modem.LogLines, Test);
    18 : BEGIN

  to:

    17 : Val(TrimRest, Cfg.Modem.LogLines, Test);
    18 : Val(TrimRest, Cfg.Modem.ConnectTime, Test);
    19 : Cfg.Modem.UseLCR:=BooleanRest;
    20 : Cfg.Modem.UseRingAnaly:=BooleanRest;
    21 : BEGIN

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 25 February 1999
By     : Marcus Roeckrath

Modification:

  In screen and colors|misc. options you can define if the year should be
  displayed with two or four digits in status window.


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    ExplodingWin   : Boolean;        { Use fancy display of menus and      }
                                     { windows                             }
    Filler         : ARRAY[1..2] OF Byte;

  to:

    ExplodingWin   : Boolean;        { Use fancy display of menus and      }
                                     { windows                             }
    FourDigitsYear : BOOLEAN;        { Four digit year in status window }
    Filler         : ARRAY[1..1] OF Byte;


  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: MiscScreen

  Added:

    AddYesNoField('Four digits year     :',14,2,'',14,25,746,FourDigitsYear);


  Program/Unit      : KEYBOARD.PAS
  Function/Procedure: PopKeyPressed

  Changed:

    wFastWrite(TodayString('dd/mm-yy'),1,11,HighLightColor);

  to:

    IF Cfg.Screen.FourDigitsYear THEN
      wFastWrite(TodayString('dd/mm-yyyy'),1,10,HighLightColor)
    ELSE
      wFastWrite(TodayString('dd/mm-yy'),1,11,HighLightColor);


  Program/Unit      : KEYWORDS.TXT
  Function/Procedure:

  Changed:

    ; Screeninfo
    #KEYWORDS 13
    BlankTime       1
    CheckForSnow    2
    KeepOffScrMode  3
    Screenmode      4
    HardwareBlank   5
    ExplodingWin    6

  to:

    ; Screeninfo
    #KEYWORDS 13
    BlankTime       1
    CheckForSnow    2
    KeepOffScrMode  3
    Screenmode      4
    HardwareBlank   5
    ExplodingWin    6
    FourDigitsYear  7


  Program/Unit      : NEWEXP.PAS
  Function/Procedure: ExportScreen

  Changed:

      ExpItem(6,ResStr(MainStrDict^, 111-Byte(ExplodingWin),3));
    end;

  to:

      ExpItem(6,ResStr(MainStrDict^, 111-Byte(ExplodingWin),3));
      ExpItem(7,ResStr(MainStrDict^, 111-Byte(FourDigitsYear),3));
    end;


  Program/Unit      : NEWIMP.PAS
  Function/Procedure: ImportScreen

  Changed:

      6 : Cfg.Screen.ExplodingWin:=BooleanRest;
    END;

  to:

      6 : Cfg.Screen.ExplodingWin:=BooleanRest;
      7 : Cfg.Screen.FourDigitsYear:=BooleanRest;
    END;

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 25 February 1999
By     : Marcus Roeckrath

Modification:

  Corrected typo.


  Program/Unit      : LIST.PAS
  Function/Procedure: CheckDupeFile

  Changed:

    Addlog('#','Loking for dupes');

  to:

    Addlog('#','Looking for dupes');

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 14 February 1999
By     : Marcus Roeckrath

Modification:

  Changed Copyright-Messages at Startup and About window.


  Program/Unit      : POPTYPES.PAS
  Function/Procedure: ShowAbout

  Changed:

    wFastCenter('1998 Changes made by',8,Cfg.Color[2].TextColor);
    wFastCenter('The German Portal Team',9,Cfg.Color[2].TextColor);

  to:

    wFastCenter('1998,99 Changed by',8,Cfg.Color[2].TextColor);
    wFastCenter('The German Portal Team',9,Cfg.Color[2].TextColor);


  Program/Unit      : INIT.PAS
  Function/Procedure: SetupScreen

  Changed:

    wFastText('(C)  Copyright 1989-97 by The Portal Team',3,2);
    wFastText('     1998 Changed by German Portal Team',4,2);

  to:

    wFastText('(C)  Copyright 1989-97 by The Portal Team',3,2);
    wFastText('1998,99 Changed by The German Portal Team',4,2);

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 14 February 1999
By     : Marcus Roeckrath

Modification:

  Added commandline switch /S to shutdown Portal when screen blanker will
  be activated. Read PORTAL.RAC for an example to use this feature.


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Added:

    clShutDown     =2048;  { Shut down when screenblanker will be activated }


  Program/Unit      : INIT.PAS
  Function/Procedure: ShowRTFM

  Added:

    WriteLn('  /S        Shut down when screen blanker will be activated');


  Program/Unit      : INIT.PAS
  Function/Procedure: ParseCmdLine

  Added:

    'S' : CmdLineFlags:=CmdLineFlags OR clShutDown;


  Program/Unit      : SESSION.PAS
  Function/Procedure: PortalMain

  Changed:

    IF TimerExpired(ScreenBlank) And (Cfg.Screen.BlankTime>0) THEN TurnScreen(Off);

  to:

    IF TimerExpired(ScreenBlank) And (Cfg.Screen.BlankTime>0) THEN BEGIN
      IF (CmdLineFlags AND clShutDown) = clShutDown THEN
        SpawnWithErrorlevel(0, 'Exit on activated screen blanker', FALSE);
      TurnScreen(Off);
    END;


-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 12 February 1999
By     : Marcus Roeckrath

Modification:

  Added Ring Analyzer (analyzing and reacting on additional informations
  at the modem RING message).


  Program/Unit      : RingAnalyzerAnswerCall (new)
  Function/Procedure:


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Added:

    PoPRingAnalyzerFileName = 'PORTAL.RAC';


  Program/Unit      : SESSION.PAS
  Function/Procedure:

    Added RNGANALY unit in uses statement of implementation part.


  Program/Unit      : POPTYPES.PAS
  Function/Procedure: CheckModemResponse

  Changed:

    IF Forced THEN AddLog(':', 'Forced modem answer') ELSE AddLog('#', ModemRes);
    IF ((CurrentEvent.Typ AND etNoAnswer)=0) OR (Forced) THEN
    BEGIN
      IF Cfg.Modem.Answer<>'' THEN TranslateModemString(Cfg.Modem.Answer);
    END ELSE
      Goto NoBody;

  to:

    IF Forced THEN AddLog(':', 'Forced modem answer') ELSE AddLog('#', ModemRes);
    IF ((CurrentEvent.Typ AND etNoAnswer)=0) OR (Forced) THEN
    BEGIN
      IF Cfg.Modem.UseRingAnaly THEN
        IF (NOT Forced) AND (NOT RingAnalyzerAnswerCall(ModemRes)) THEN Goto NoBody;
      IF Cfg.Modem.Answer<>'' THEN TranslateModemString(Cfg.Modem.Answer);
    END ELSE
      Goto NoBody;

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 11 Februaray 1999
By     : Marcus Roeckrath

Modification:

  Changed Outbound Manager window to give the address field more space. The
  status field will now display the abbreviations (C, H, ...).


  Program/Unit      : OUTMAN.PAS
  Function/Procedure: OutboundManager

  Changed:

    Temp^.wFastText('   Address    Type    Stat       Size  Filename                               ', 1, 1);

  to:

    Temp^.wFastText('      Address       Type    S    Size  Filename                               ', 1, 1);


  Program/Unit      : OUTMAN.PAS
  Function/Procedure: OutboundManager

  Changed:

    NodeStr         : S13;

  to:

    NodeStr         : S19;


  Program/Unit      : OUTMAN.PAS
  Function/Procedure: WriteLine

  Changed:

      Temp^.wFastWrite(' '+CPad(NodeStr,13), Linie, 1, Attr);
    END ELSE
       Temp^.wFastWrite('      -       ', Linie, 1, Attr);
    CASE OPtr^.typ OF
      'O' : Temp^.wFastWrite('OLDREQ  ', Linie, 15, Attr);
      'U' : Temp^.wFastWrite('UPDREQ  ', Linie, 15, Attr);
      'R' : Temp^.wFastWrite('F. REQ  ', Linie, 15, Attr);
      'B' : Temp^.wFastWrite('BUNDLE  ', Linie, 15, Attr);
      'M' : Temp^.wFastWrite('MAIL    ', Linie, 15, Attr);
      'F' : Temp^.wFastWrite('ATTACH  ', Linie, 15, Attr);
      'Z' : Temp^.wFastWrite('UNDIAL  ', Linie, 15, Attr);
      'P' : Temp^.wFastWrite('POLL    ', Linie, 15, Attr);
      'W' : Temp^.wFastWrite('B.WAZO  ', Linie, 15, Attr);
    END;
    CASE OPtr^.stat OF
      'O',
      'F' : Temp^.wFastWrite('NORMAL  ', Linie, 23, Attr);
      'C' : Temp^.wFastWrite('CRASH   ', Linie, 23, Attr);
      'H' : Temp^.wFastWrite('HOLD    ', Linie, 23, Attr);
      'D' : Temp^.wFastWrite('DIRECT  ', Linie, 23, Attr);
      'I' : Temp^.wFastWrite('IMPORT. ', Linie, 23, Attr);
      ELSE  Temp^.wFastWrite('        ', Linie, 23, Attr);
    END;

  to:

      Temp^.wFastWrite(' '+CPad(NodeStr,19), Linie, 1, Attr);
    END ELSE
      Temp^.wFastWrite('         -          ', Linie, 1, Attr);
    CASE OPtr^.typ OF
      'O' : Temp^.wFastWrite('OLDREQ  ', Linie, 21, Attr);
      'U' : Temp^.wFastWrite('UPDREQ  ', Linie, 21, Attr);
      'R' : Temp^.wFastWrite('F. REQ  ', Linie, 21, Attr);
      'B' : Temp^.wFastWrite('BUNDLE  ', Linie, 21, Attr);
      'M' : Temp^.wFastWrite('MAIL    ', Linie, 21, Attr);
      'F' : Temp^.wFastWrite('ATTACH  ', Linie, 21, Attr);
      'Z' : Temp^.wFastWrite('UNDIAL  ', Linie, 21, Attr);
      'P' : Temp^.wFastWrite('POLL    ', Linie, 21, Attr);
      'W' : Temp^.wFastWrite('B.WAZO  ', Linie, 21, Attr);
    END;
    CASE OPtr^.stat OF
      'O',
      'F' : Temp^.wFastWrite('N ', Linie, 29, Attr);
      'C' : Temp^.wFastWrite('C ', Linie, 29, Attr);
      'H' : Temp^.wFastWrite('H ', Linie, 29, Attr);
      'D' : Temp^.wFastWrite('D ', Linie, 29, Attr);
      'I' : Temp^.wFastWrite('I ', Linie, 29, Attr);
      ELSE  Temp^.wFastWrite('    ', Linie, 29, Attr);
    END;

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 10 February 1999
By     : Marcus Roeckrath

Modification:

  Added LCR and RNGANALY units to main program.

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 05 February 1999
By     : Marcus Roeckrath

Modification:

  The Add field is now 20 characters long (please change your old
  PORTAL.LCR file).


  Program/Unit      : SESSION.PAS
  Function/Procedure: Dial

  Changed:

    TempPhone    : S50;

  to:

    TempPhone    : S60;


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: DialNumber

  Changed:

    TempPhone : S50;

  to:

    TempPhone : S60;


  Program/Unit      : LCR.PAS
  Function/Procedure:

  Changed (2 times):

    FUNCTION LeastCostRouting(Phone: S40; VAR Costs: LONGINT): S50;

  to:

    FUNCTION LeastCostRouting(Phone: S40; VAR Costs: LONGINT): S60;

  Changed:

    LCRADD : STRING[10];

  To:

    LCRADD : STRING[20];


  Program/Unit      : LCR.PAS
  Function/Procedure: LeastCostRouting

  Changed:

      IF (Length(Line) >= 32) AND (Line[1] <> ';') THEN BEGIN
        LCRDays := Copy(Line, 1, 7);
        Val(Copy(Line, 9, 2), Hour, I);
        Val(Copy(Line, 12, 2), Min, I1);
        IF (I = 0) AND (I1 = 0) AND ValidTime(Hour, Min, 0) THEN BEGIN
          LCRTimeStart := HMSToTime(Hour, Min, 0);
          Val(Copy(Line, 15, 2), Hour, I);
          Val(Copy(Line, 18, 2), Min, I1);
          IF (I = 0) AND (I1 = 0) AND ValidTime(Hour, Min, 59) THEN BEGIN
            LCRTimeEnd := HMSToTime(Hour, Min, 59);
            TempCosts := TrimSpaces(Copy(Line, 32, Length(Line)-31));
            IF Pos(' ', TempCosts) > 0 THEN TempCosts[0] := Chr(Pos(' ', TempCosts) - 1);
            Val(TempCosts, LCRCosts, I);
            IF I = 0 THEN BEGIN
              LCRAdd := Copy(Line, 21, 10);

  to:

      IF (Length(Line) >= 42) AND (Line[1] <> ';') THEN BEGIN
        LCRDays := Copy(Line, 1, 7);
        Val(Copy(Line, 9, 2), Hour, I);
        Val(Copy(Line, 12, 2), Min, I1);
        IF (I = 0) AND (I1 = 0) AND ValidTime(Hour, Min, 0) THEN BEGIN
          LCRTimeStart := HMSToTime(Hour, Min, 0);
          Val(Copy(Line, 15, 2), Hour, I);
          Val(Copy(Line, 18, 2), Min, I1);
          IF (I = 0) AND (I1 = 0) AND ValidTime(Hour, Min, 59) THEN BEGIN
            LCRTimeEnd := HMSToTime(Hour, Min, 59);
            TempCosts := TrimSpaces(Copy(Line, 42, Length(Line)-41));
            IF Pos(' ', TempCosts) > 0 THEN TempCosts[0] := Chr(Pos(' ', TempCosts) - 1);
            Val(TempCosts, LCRCosts, I);
            IF I = 0 THEN BEGIN
              LCRAdd := Copy(Line, 21, 20);

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 04 February 1999
By     : Marcus Roeckrath

Modification:

  The value cost/min fields must not be filled out left aligned now.


  Program/Unit      : LCR.PAS
  Function/Procedure: LeastCostRouting

  Changed:

    TempCosts := Copy(Line, 32, Length(Line)-31);

  to:

    TempCosts := TrimSpaces(Copy(Line, 32, Length(Line)-31));

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 04 February 1999
By     : Marcus Roeckrath

Modification:

  If more then one entry matches each company prefix was added to the
  phonenumber.


  Program/Unit      : LCR.PAS
  Function/Procedure: LeastCostRouting

  Changed:

    Reset(F);
    IF IOResult = 0 THEN BEGIN
      TempPhone := '';
      FOR I := 1 TO Length(Phone) DO
        IF (Phone[I] >= '0') AND (Phone[i] <= '9') THEN TempPhone := TempPhone + Phone[i];
      GetDate(TodayYear, TodayMonth, TodayDay, TodayWeekDay);
      Inc(TodayWeekDay);
      TodayDayNumber := DayNumber(TodayYear, TodayMonth, TodayDay);
      CalcHolidays;
      IF SearchPhoneNumber(TempPhone) THEN BEGIN
        WHILE Not Eof(F) AND (Copy(Line, 1, 10) <> '[BLOCKEND]') DO BEGIN

  to:

    Reset(F);
    TempPhone := '';
    IF IOResult = 0 THEN BEGIN
      FOR I := 1 TO Length(Phone) DO
        IF (Phone[I] >= '0') AND (Phone[i] <= '9') THEN TempPhone := TempPhone + Phone[i];
      GetDate(TodayYear, TodayMonth, TodayDay, TodayWeekDay);
      Inc(TodayWeekDay);
      TodayDayNumber := DayNumber(TodayYear, TodayMonth, TodayDay);
      CalcHolidays;
      IF SearchPhoneNumber(TempPhone) THEN BEGIN
        TempPhone := '';
        WHILE Not Eof(F) AND (Copy(Line, 1, 10) <> '[BLOCKEND]') DO BEGIN


  Changed:

    Phone := TrimSpaces(LCRAdd) + Phone;

  to:

    TempPhone := TrimSpaces(LCRAdd);


  Changed:

    LeastCostRouting := Phone;

  to:

    LeastCostRouting := TempPhone + Phone;

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 03 February 1999
By     : Marcus Roeckrath

Modification:

  Added Fido product names and codes.


  Program/Unit      : MAILUTIL.PAS
  Function/Procedure: ProductNames

  Added:

      21 : ProductNames:='CantaLoup';
    1279 : ProductNames:='Beemail';

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 02 February 1999
By     : Marcus Roeckrath

Modification:

  Changed file mode opening LCR configuration file.


  Program/Unit      : LCR.PAS
  Function/Procedure: LeastCostRouting

  Added:

    FileMode:=ShareRead+ShareDenyW;

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 28 January 1999
By     : Marcus Roeckrath

Modification:

  Added/changed the NRQ/HRQ EMSI flags on incoming and outgoing calls
  according to FSC-0056. If no request is allowed on outgoing calls the
  NRQ flag is added to the emsi compatibility codes. On incoming session
  the HRQ flag is added to the EMSI options.


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: SendEMSIData

  Changed:

    IF IsCaller THEN
    BEGIN
      s:=s+'}{8N1,PUA}{';
{$IFNDEF OS2}
      IF CanDoBimail In Hello.Capabilities THEN s:=s+'BIM,';
{$ENDIF}
      IF DoesJanus In Hello.Capabilities THEN s:=s+'JAN,';
      s:=s+'ZAP,ZMO,ARC,XMA';
    END ELSE
    BEGIN
      s:=s+'}{8N1}{';
{$IFNDEF OS2}
      IF (Cfg.BiMail.BimodemPath<>'') AND (CanDoBiMail IN RemHello.Capabilities) AND
         (CanDoBiMail IN Hello.Capabilities) THEN s:=s+'BIM' ELSE
{$ENDIF}
        IF (DoesJanus IN RemHello.Capabilities) And (DoesJanus IN Hello.Capabilities) THEN s:=s+'JAN' ELSE
          IF ZedZapper IN RemHello.Capabilities THEN s:=s+'ZAP' ELSE
            IF ZedZipper IN RemHello.Capabilities THEN s:=s+'ZMO' ELSE s:=s+'NCP';
      IF NOT (WZFreq IN Hello.Capabilities) THEN s:=s+',HRQ';
    END;

  to:

    IF IsCaller THEN
    BEGIN
      s:=s+'}{8N1,PUA}{';
{$IFNDEF OS2}
      IF CanDoBimail In Hello.Capabilities THEN s:=s+'BIM,';
{$ENDIF}
      IF DoesJanus In Hello.Capabilities THEN s:=s+'JAN,';
      s:=s+'ZAP,ZMO,ARC,XMA';
      IF NOT (WZFreq IN Hello.Capabilities) THEN s:=s+',NRQ';
    END ELSE
    BEGIN
      IF NOT (WZFreq IN Hello.Capabilities) THEN
        s:=s+'}{8N1,HRQ}{'
      ELSE
        s:=s+'}{8N1}{';
{$IFNDEF OS2}
      IF (Cfg.BiMail.BimodemPath<>'') AND (CanDoBiMail IN RemHello.Capabilities) AND
         (CanDoBiMail IN Hello.Capabilities) THEN s:=s+'BIM' ELSE
{$ENDIF}
        IF (DoesJanus IN RemHello.Capabilities) And (DoesJanus IN Hello.Capabilities) THEN s:=s+'JAN' ELSE
          IF ZedZapper IN RemHello.Capabilities THEN s:=s+'ZAP' ELSE
            IF ZedZipper IN RemHello.Capabilities THEN s:=s+'ZMO' ELSE s:=s+'NCP';
      IF NOT (WZFreq IN Hello.Capabilities) THEN s:=s+',NRQ';
    END;

-----------------------------------------------------------------------------

Version: 0.639-GPT04
Date   : 28 January 1999
By     : Marcus Roeckrath

Modification:


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Changed:

    {$IFDEF GermanPortalTeam}
      +'-GPT03'
    {$ENDIF}

  to:

    {$IFDEF GermanPortalTeam}
      +'-GPT04'
    {$ENDIF}

-----------------------------------------------------------------------------

Version: 0.639-GPT03
Date   : September 1998
By     : Marcus Roeckrath

Modification:

  Update of OPCRT used when compiling Portal to solve the Error 200
  problem on fast pentium II pc's.

-----------------------------------------------------------------------------

Version: 0.639-GPT03
Date   : 11 October 1998
By     : Marcus Roeckrath

Modification:

  Now Portal accepts 120 (+ first) instead of 16 (+ first) remote AKAs.

  ATTENTION:

  This value has to be a factor of 5 EVERYTIME, means: MaxRemAkas MOD 5 = 0.


  The global variable MaxAddresses which defines the number of own AND remote
  akas will now define the number of your own akas only. The new global
  variable MaxRemAkas (declared in GLOBAL.PAS) will define the number of
  remote akas now.

  Program/Unit      : GLOBALS.PAS
  Function/Procedure:

  Added:

    MaxRemAkas     = 120;

  Changed:

    RemAka : Array[1..MaxAddresses] Of TFidoAddress;

  To:

    RemAka : Array[1..MaxRemAkas] Of TFidoAddress;


  Program/Unit      : BIMAIL.PAS
  Function/Procedure: KillFLOfile

  Changed:

    IF (AkaNum<=MaxAddresses) And (RemAka[AkaNum].Zone<>0) THEN

  To:

    IF (AkaNum<=MaxRemAkas) And (RemAka[AkaNum].Zone<>0) THEN


  Program/Unit      : JANUS.PAS
  Function/Procedure: GetFName

  Changed:

    IF (AkaNum<=MaxAddresses) And (RemAka[AkaNum].Zone<>0) THEN

  To:

    IF (AkaNum<=MaxRemAkas) And (RemAka[AkaNum].Zone<>0) THEN


  Program/Unit      : JANUS.PAS
  Function/Procedure: GetFileReq

  Changed:

    WHILE NOT GotOne AND (ReqAkaNum<=MaxAddresses) AND ((ReqAkaNum=0) OR (RemAka[ReqAkaNum].Zone<>0)) DO
    [...]
    ReqAkaNum:=MaxAddresses+1;
    [...]
    ReqAkaNum:=MaxAddresses+1;
    [...]
    IF (ReqAkaNum<=MaxAddresses) AND (RemAka[ReqAkaNum].Zone<>0) THEN

  To:

    WHILE NOT GotOne AND (ReqAkaNum<=MaxRemAkas) AND ((ReqAkaNum=0) OR (RemAka[ReqAkaNum].Zone<>0)) DO
    [...]
    ReqAkaNum:=MaxRemAkas+1;
    [...]
    ReqAkaNum:=MaxRemAkas+1;
    [...]
    IF (ReqAkaNum<=MaxRemAkas) AND (RemAka[ReqAkaNum].Zone<>0) THEN


  Program/Unit      : WZSEND.PAS
  Function/Procedure: SendWaZOO

  Changed:

    IF (AkaNum<=MaxAddresses) And (RemAka[AkaNum].Zone<>0) THEN

  To:

    IF (AkaNum<=MaxRemAkas) And (RemAka[AkaNum].Zone<>0) THEN


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: ShowHisData

  Changed:

    WHILE (i<=MaxAddresses) AND (RemAka[i].Zone<>0) DO
      Inc(i);
    IF i<=MaxAddresses THEN RemAka[i]:=RemHello.Address;
    [...]
    IF RemAka[1].Zone<>0 THEN
    BEGIN
      s:='Remote AKA''s:';
      i:=1;
      WHILE (i<=MaxAddresses) AND (RemAka[i].Zone<>0) DO
      BEGIN
        s:=s+' '+Address2Str(RemAka[i]);
        Inc(i);
      END;
      AddLog(':',s)
    END;

  To:

    WHILE (i<=MaxRemAkas) AND (RemAka[i].Zone<>0) DO
      Inc(i);
    IF i<=MaxRemAkas THEN RemAka[i]:=RemHello.Address;
    [...]
    IF RemAka[1].Zone<>0 THEN
    BEGIN
      i:=1;
      WHILE (i<=MaxRemAkas) AND (RemAka[i].Zone<>0) DO
      BEGIN
        s:='Remote AKA''s:';
        s:=s+' '+Pad(Address2Str(RemAka[i]),16);
        Inc(i);
        IF RemAka[i].Zone <> 0 THEN BEGIN
          s:=s+' '+Pad(Address2Str(RemAka[i]),16);
          Inc(i);
          IF RemAka[i].Zone <> 0 THEN BEGIN
            s:=s+' '+Pad(Address2Str(RemAka[i]),16);
            Inc(i);
            IF RemAka[i].Zone <> 0 THEN BEGIN
              s:=s+' '+Pad(Address2Str(RemAka[i]),16);
              Inc(i);
              IF RemAka[i].Zone <> 0 THEN BEGIN
                s:=s+' '+Pad(Address2Str(RemAka[i]),16);
                Inc(i);
              END;
            END;
          END;
        END;
        AddLog(':',s)
      END;
    END;


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: WaZoo

  Changed:

    WHILE (i<=MaxAddresses) AND (RemAkA[i].Zone<>0) DO

  To:

    WHILE (i<=MaxRemAkas) AND (RemAkA[i].Zone<>0) DO


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: NextAKA (new)


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: ReceiveEMSIData

  Added:

    AKAEnd, AKAPos : Integer;

  Changed:

    AkAStr:=NextWord(BufNum,Buf^,i)+' ';
    { Password }
    ss:=NextWord(BufNum,Buf^,i);
    IF Length(ss)>8 THEN ss[0]:=#8;
    IF ss<>'' THEN Move(ss[1],RemHello.Password,Length(ss));
    { Decode Addresses - must be here so we have the password.... }
    x:=0;
    REPEAT
      Inc(x);
      ns:=Copy(AkAStr,1,POS(' ',AkAStr)-1);
      Delete(AkAStr, 1, Length(ns)+1);
      GetAdressFromStr(ns, TestAddress);
      IF x=1 THEN
      BEGIN
        RemHello.Address:=TestAddress;
      END ELSE
      BEGIN
        IF FindNodeInfo(N, TestAddress) And (N.SessionPwd<>'') And
           (StUpCase(ss)<>StUpCase(N.SessionPwd)) THEN
        BEGIN
          AddLog('!', 'Password error on AKA ('+Address2Str(TestAddress)+'): (local/remote) '+
                      '"'+StUpCase(N.SessionPwd)+'"/"'+StUpCase(ss)+'"');
          Dec(x);
        END ELSE
          RemAka[x-1]:=TestAddress;
      END;
    UNTIL (AkAStr='') OR (x>MaxAddresses);

  To:

    AKAPos:=i+1;
    AkAStr:=NextWord(BufNum,Buf^,i)+' ';
    AKAEnd:=i-1;
    { Password }
    ss:=NextWord(BufNum,Buf^,i);
    IF Length(ss)>8 THEN ss[0]:=#8;
    IF ss<>'' THEN Move(ss[1],RemHello.Password,Length(ss));
    { Decode Addresses - must be here so we have the password.... }
    x:=0;
    REPEAT
      Inc(x);
      ns:=NextAKA(AKAEnd,Buf^,AKAPos);
      IF ns<>'' THEN BEGIN
        GetAdressFromStr(ns, TestAddress);
        IF x=1 THEN
        BEGIN
          RemHello.Address:=TestAddress;
        END ELSE
        BEGIN
          IF FindNodeInfo(N, TestAddress) And (N.SessionPwd<>'') And
             (StUpCase(ss)<>StUpCase(N.SessionPwd)) THEN
          BEGIN
            AddLog('!', 'Password error on AKA ('+Address2Str(TestAddress)+'): (local/remote) '+
                        '"'+StUpCase(N.SessionPwd)+'"/"'+StUpCase(ss)+'"');
            Dec(x);
          END ELSE
            RemAka[x-1]:=TestAddress;
        END;
      END;
    UNTIL (ns='') OR (x>MaxRemAkas);

-----------------------------------------------------------------------------

Version: 0.639-GPT03
Date   : 16 September 1998
By     : Carsten Brandt
         Marcus Roeckrath

Modification:

  Now Portal supports Maximus 3.0 instead of 2.0.


  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: UserMaxScreen

  Changed:

    Esr^.Init(2,3,79,ScreenHeight-3,3,'Maximus 2.0 user');

  To:

    Esr^.Init(2,3,79,ScreenHeight-3,3,'Maximus 3.0 user');

  Added:

    AddChoiceField( 'Rip      : ',15,50,'XXX',15,61,0,1,UserEdit.ChangeMaxRipStatus,Ur.Bits);


  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: InitLib

  Added:

    Lib^.RegisterPointer(1031, @UserEdit.ChangeMaxRipStatus);


  Program/Unit      : ENTRYRES.PAS
  Function/Procedure: InitLib

  Added:

    ResLib.RegisterPointer(1031, @UserEdit.ChangeMaxRipStatus);


  Program/Unit      : CONFIG.PAS
  Function/Procedure: IncBBSType

  Changed:

    7 : s:='Maximus 2.0';

  To:

    7 : s:='Maximus 3.0';


  Program/Unit      : USEREDIT.PAS
  Function/Procedure:

  Changed MaximusUserType record to:

    MaximusUserType = record
      name          : String[35];    {}
      city          : String[35];    {}
      alias         : String[20];    {}
      phone         : String[14];    {}
      lastread_ptr  : SmallWord;
      timeremaining : SmallWord;
      pwd           : String[15];    {}
      times         : SmallWord;     {}
      Help          : byte;          {}
      Group         : SmallWord;
      video         : Byte;          {}
      nulls         : Byte;
      Bits          : Byte;
      dob_year      : SmallWord;     {}
      Bits2         : SmallWord;
      Max2Priv      : SmallWord;
    { DataPhone     : array[1..19] of Byte;}
      DataPhone     : String[18];
      StructLen     : Byte;
      Time          : SmallWord;     {}
      DelFlag       : SmallWord;
      Msgs_Posted   : LongInt;
      Msgs_Read     : LongInt;
      Width         : Byte;
      Len           : Byte;
      Credit        : SmallWord;
      Debit         : SmallWord;
      xp_priv       : SmallWord;
      Union1        : LongInt;
      XP_Mins       : LongInt;
      XP_Flags      : Byte;
      Sex           : Byte;
      Ludate        : LongInt;
      xKeys         : KeyType;
      Lang          : byte;
      DefProto      : Shortint;      {-}
      Up            : LongInt;       {}
      Down          : LongInt;       {}
      DownToDay     : LongInt;       {}
      Rsvd45        : String[17];
      Call          : SmallWord;
      Compress      : Byte;
      DF_Save       : Byte;
      Extra         : LongInt;
      Date_1STCall  : LongInt;
      Date_PWD_CHG  : LongInt;
      Nup           : LongInt;
      NDown         : LongInt;
      NDownToday    : LongInt;
      Time_Added    : SmallWord;
      MSG           : String[63];
      FILES         : String[63];
      Dob_Day       : Byte;
      Dob_Month     : Byte;
      Point_Credit  : LongInt;
      Point_Debit   : LongInt;
      Date_NewFile  : LongInt;
      Priv          : SmallWord;
      Rsvd6         : String[53];
      Diverse       : DiverseType;
    END;


  Program/Unit      : USEREDIT.PAS
  Function/Procedure: MaxRip (NEW)


  Program/Unit      : USEREDIT.PAS
  Function/Procedure: ChangeMaxRipStatus (NEW)


  Program/Unit      : USEREDIT.PAS
  Function/Procedure: IncMaxVideoLevel

  Changed:

    BrowseRecords(f,up^,ExitCode,'USER BROWSER ( Maximus 2.0 )',

  To:

    BrowseRecords(f,up^,ExitCode,'USER BROWSER ( Maximus 3.0 )',


  Program/Unit      : USEREDIT.PAS
  Function/Procedure: MaximusPriv

  Changed to:

    FUNCTION MaximusPriv(i:SMALLWORD):S15;
    BEGIN
      CASE i OF
         0 : MaximusPriv:='Transient';
        10 : MaximusPriv:='Demoted';
        20 : MaximusPriv:='Limited';
        30 : MaximusPriv:='Normal';
        40 : MaximusPriv:='Worthy';
        50 : MaximusPriv:='Privil';
        60 : MaximusPriv:='Favored';
        70 : MaximusPriv:='Extra';
        80 : MaximusPriv:='Clerk';
        90 : MaximusPriv:='Asst SysOp';
       100 : MaximusPriv:='SysOp';
     65535 : MaximusPriv:='Hidden';
        ELSE MaximusPriv:=' - ';
      END;
    END;


  Program/Unit      : USEREDIT.PAS
  Function/Procedure: IncMaximusUserLevel

  Changed to:

    PROCEDURE IncMaximusUserLevel(VAR Value; ID:WORD; Factor:Integer; VAR s:STRING);
    BEGIN
      CASE Factor OF
        +1 : BEGIN
               IF SMALLWORD(Value)=65535 THEN SMALLWORD(Value):=0
               ELSE
                 IF SMALLWORD(Value)=100 THEN SMALLWORD(Value):=65535
                 ELSE Inc(SMALLWORD(Value),10);
             END;
        -1 : BEGIN
               IF SMALLWORD(Value)=65535 THEN SMALLWORD(Value):=100
               ELSE
                 IF SMALLWORD(Value)=0 THEN SMALLWORD(Value):=65535
                 ELSE Dec(SMALLWORD(Value),10);
             END;
      END;
      s:=MaximusPriv(SMALLWORD(Value));
    END;


  Program/Unit      : USEREDIT.PAS
  Function/Procedure: UserGetStr

  Changed:

    s:=Cpad(asciiz2str(Name,36),36)+Cpad(MaximusPriv(Priv+2),16)+copy(AsciiZ2Str(city,36),1,24); }

  To:

    s:=Cpad(asciiz2str(Name,36),36)+Cpad(MaximusPriv(Priv),16)+copy(AsciiZ2Str(city,36),1,24); }

-----------------------------------------------------------------------------

Version: 0.639-GPT03
Date   : 07 September 1998
By     : Marcus Roeckrath

Modification:

  Added Least-Cost-Routing.


  Program/Unit      : LCR.PAS (new)
  Function/Procedure:


  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Added in file name section:

    PoPLeastCostRoutingFileName = 'PORTAL.LCR';


  Program/Unit      : SESSION.PAS
  Function/Procedure:

    Added LCR unit in uses statement of implementation part.


  Program/Unit      : SESSION.PAS
  Function/Procedure: Dial

    Added variables: TempCosts : LONGINT
                     TempPhone : S50


  Program/Unit      : SESSION.PAS
  Function/Procedure: Dial

  Changed:

      wfastwrite(Long2Str(Baud)+' ('+Long2Str(BaudRate)+s+')',6,15,HighLightColor);
      wFastText('Cost/Min   :',7,2);
      wfastwrite(Long2Str(RealCost),7,15,HighLightColor);
    END;
    Inc(StatRec^.DayStat[0].CallsOut);
    IF FoundInNodes And (NodesRec.SpecialDials[CurrentEvent.SpecDial]<>'') THEN
      s:=NodesRec.SpecialDials[CurrentEvent.SpecDial] ELSE s:=FindSpecialModemDial;

    IF IsOurAddress(Call) THEN Nodelistentry.PhoneNumber:=PhoneTranslation(Nodelistentry.PhoneNumber);
    TranslateModemString(s+nodelistentry.PhoneNumber+'|');
    AddLog(':','Dialing: '+s+nodelistentry.PhoneNumber);

  To:

      wfastwrite(Long2Str(Baud)+' ('+Long2Str(BaudRate)+s+')',6,15,HighLightColor);
    END;
    Inc(StatRec^.DayStat[0].CallsOut);
    IF FoundInNodes And (NodesRec.SpecialDials[CurrentEvent.SpecDial]<>'') THEN
      s:=NodesRec.SpecialDials[CurrentEvent.SpecDial] ELSE s:=FindSpecialModemDial;

    IF IsOurAddress(Call) THEN Nodelistentry.PhoneNumber:=PhoneTranslation(Nodelistentry.PhoneNumber);
    TempPhone := LeastCostRouting(Nodelistentry.PhoneNumber, TempCosts);
    WITH NodelistEntry, Temp^,Cfg.Color[2] DO
    BEGIN
      IF TempCosts < MaxLongint THEN RealCost := TempCosts;
      wFastText('Cost/Min   :',7,2);
      wfastwrite(Long2Str(RealCost),7,15,HighLightColor);
    END;
    TranslateModemString(s+TempPhone+'|');
    AddLog(':','Dialing: '+s+TempPhone);


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure:

    Added LCR unit in uses statement of implementation part.


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: DialNumber

    Added variables: TempCosts : LONGINT;
                     TempPhone : S50;


  Program/Unit      : DUMBTERM.PAS
  Function/Procedure: DialNumber

  Changed:
     WITH cfg.color[2],dial^ DO
     BEGIN
       wfasttext(' Name    : ',1,1);
       wfasttext(' Calling : ',2,1);
       wfasttext(' TimeOut : ',3,1);
       wfastwrite(Name,1,12,HighLightColor);
       wfastwrite(Number,2,12,HighLightColor);
     END;
     TranslateModemString(cfg.modem.dial+Number+'|');
     Sec:=cfg.modem.waittime;

  To:

    WITH cfg.color[2],dial^ DO
    BEGIN
      wfasttext(' Name    : ',1,1);
      wfasttext(' Calling : ',2,1);
      wfasttext(' TimeOut : ',3,1);
      wfastwrite(Name,1,12,HighLightColor);
    END;
    TempPhone := LeastCostRouting(Number, TempCosts);
    WITH cfg.color[2],dial^ DO wfastwrite(TempPhone,2,12,HighLightColor);
    TranslateModemString(cfg.modem.dial+TempPhone+'|');
    Sec:=cfg.modem.waittime;

-----------------------------------------------------------------------------

Version: 0.639-GPT03
Date   : 04 September 1998
By     : Marcus Roeckrath

Modification:

  Added access to Filemanager in Pick up list. Alt-T (Texteditor) now
  starts in PickUpList. Press Esc to leave PickUpList and you can enter
  a new file name.


  Program/Unit      : TEXTEDIT.PAS
  Function/Procedure: AddFMtoPickList (new)

    PROCEDURE AddFMtoPickList;
    BEGIN
      IF PickArray^[0].FileName <> 'FILEMANAGER' THEN BEGIN
        Move(PickArray^[0], PickArray^[1], SizeOf(TPickList)*15);
        PickArray^[0].FileName := 'FILEMANAGER';
      END;
    END;


  Program/Unit      : TEXTEDIT.PAS
  Function/Procedure: AddToPickList

  Changed:

    PROCEDURE AddToPickList(CONST FName: PathStr);
    VAR
      i : Byte;
    BEGIN
      i:=0;
      WHILE (i<16) And (PickArray^[i].FileName<>'') And
            (PickArray^[i].FileName<>FullPathName(FName)) DO
        Inc(i);
      IF (i=16) Or (PickArray^[i].FileName='') THEN
      BEGIN
        Move(PickArray^[0], PickArray^[1], SizeOf(TPickList)*15);
      END ELSE
      BEGIN
        IF i>0 THEN Move(PickArray^[0], PickArray^[1], SizeOf(TPickList)*i);
      END;
      PickArray^[0].FileName:=FullPathName(FName);
    END;

  To:

    PROCEDURE AddToPickList(CONST FName: PathStr);
    VAR
      i : Byte;
    BEGIN
      i:=1;
      WHILE (i<16) And (PickArray^[i].FileName<>'') And
            (PickArray^[i].FileName<>FullPathName(FName)) DO
        Inc(i);
      IF (i=16) Or (PickArray^[i].FileName='') THEN
      BEGIN
        Move(PickArray^[1], PickArray^[2], SizeOf(TPickList)*14);
      END ELSE
      BEGIN
        IF i>0 THEN Move(PickArray^[1], PickArray^[2], SizeOf(TPickList)*(i-1));
      END;
      PickArray^[1].FileName:=FullPathName(FName);
    END;


  Program/Unit      : TEXTEDIT.PAS
  Function/Procedure: InitEditor

  Changed:

          IF (PickArray^[0].FileName<>'') AND (ExistFile(PickArray^[0].FileName)) THEN
               FName:=PickArray^[0].FileName
          ELSE
          BEGIN
    GetName:
            IF Not MyGetFileFunc(0,'File name: ',True,True,False,False,64,'',FName) THEN

  To:

          IF (PickArray^[1].FileName='') OR (NOT PickFromList(FName)) THEN
          BEGIN
    GetName:
            FName := '';
            IF Not MyGetFileFunc(0,'File name: ',True,True,False,False,64,'',FName) THEN


  Program/Unit      : TEXTEDIT.PAS
  Function/Procedure: PickFromList

  Moved this function on top of InitEditor.


  Program/Unit      : TEXTEDIT.PAS
  Function/Procedure: PickFromList

  Changed:

    IF GetLastCommand=ccSelect THEN
    BEGIN
      FName:=GetLastChoiceString;
      PickFromList:=ExistFile(FName);
    END ELSE
      PickFromList:=False;

   To:

   IF GetLastCommand=ccSelect THEN
   BEGIN
     FName:=GetLastChoiceString;
     IF FName = 'FILEMANAGER' THEN BEGIN
       FName := '*.*';
       PickFromList := SelectFile(FName);
     END
     ELSE
       PickFromList:=ExistFile(FName);
    END ELSE
      PickFromList:=False;


  Program/Unit      : TEXTEDIT.PAS
  Function/Procedure: PickFromList

  Commented out:

    IF NumPick>1 THEN SetInitialChoice(2);


  Program/Unit      : TEXTEDIT.PAS
  Function/Procedure: RunTextEditor

  Added function call ADDFMtoPickList behind ReadPickFile.


  Program/Unit      : TEXTEDIT.PAS
  Function/Procedure: RunTextEditor

  Changed:

    ccUser1 : IF PickArray^[1].FileName<>'' THEN

  To:

    ccUser1 : IF PickArray^[2].FileName<>'' THEN

  Changed:

    FName:=PickArray^[1].FileName ;

  To:

    FName:=PickArray^[2].FileName ;

-----------------------------------------------------------------------------

Version: 0.639-GPT03
Date   : 04 September 1998
By     : Marcus Roeckrath

Modification:

  Program/Unit      : POPTYPES.PAS
  Function/Procedure:


  Changed:

    {$IFDEF GermanPortalTeam}
      +'-GPT02'
    {$ENDIF}

  to:

    {$IFDEF GermanPortalTeam}
      +'-GPT03'
    {$ENDIF}

-----------------------------------------------------------------------------

Version: 0.639-GPT02
Date   : 22 August 1998
By     : Marcus Roeckrath

Modification:

  Program/Unit      : POPTYPES.PAS
  Function/Procedure:


  Changed:

    {$IFDEF GermanPortalTeam}
      +'-GPT01'
    {$ENDIF}

  to:

    {$IFDEF GermanPortalTeam}
      +'-GPT02'
    {$ENDIF}

-----------------------------------------------------------------------------

Version: 0.639-GPT02
Date   : 22 August 1998
By     : Marcus Roeckrath

Modification:

  Portal does not detect a RING if there are additional ring informations
  like RING <caller-id> or something like that (mostly at ISDN networks)
  in the modem ring message.


  Program/Unit      : SESSION.PAS
  Function/Procedure: CheckModemResponse

  Replaced:

    IF (ModemRes='RING') OR (Forced) THEN

  with:

    IF (ModemRes='RING') OR (Copy(ModemRes,1,5)='RING ') OR (Forced) THEN


  Program/Unit      : SESSION.PAS
  Function/Procedure: DIAL

  Replaced:

    IF ComPort^.KeyPressed AND (ModemReadStr='RING') THEN
    BEGIN
      IF (CurrentEvent.Typ AND etNoAnswer)=0 THEN
      BEGIN
        AddLog(':','Incoming call detected - Answering modem');
        NewTimerSecs(t, 5);
        WHILE Not ComPort^.KeyPressed AND Not TimerExpired(t) DO  { Wait for another ring }
          GiveUpTime;
        CheckModemResponse(False);
      END ELSE
        AddLog(':','Incoming call detected - dial aborted');
      Exit;
    END;

  with:

    IF ComPort^.KeyPressed THEN
    BEGIN
      ModemRes:=ModemReadStr;
      IF (ModemRes='RING') OR (Copy(ModemRes,1,5)='RING ') THEN
      BEGIN
        IF (CurrentEvent.Typ AND etNoAnswer)=0 THEN
        BEGIN
          AddLog(':','Incoming call detected - Answering modem');
          NewTimerSecs(t, 5);
          WHILE Not ComPort^.KeyPressed AND Not TimerExpired(t) DO  { Wait for another ring }
            GiveUpTime;
          CheckModemResponse(False);
        END ELSE
        BEGIN
          AddLog(':','Incoming call detected - dial aborted');
          AddLog('#', ModemRes);
        END;
        Exit;
      END;
      ModemRes:='';
    END;

-----------------------------------------------------------------------------

Version: 0.639-GPT01
Date   : 30 July 1998
By     : Marcus Roeckrath

Modification:

  Added Fido product names and codes.


  Program/Unit      : MAILUTIL.PAS
  Function/Procedure: ProductNames

  Added Fido Product Codes:

      233 : ProductNames:='CrossPoint';
      254 : ProductNames:='Xenia/2';
      261 : ProductNames:='Terminate';
    65280 : ProductNames:='McMail';

-----------------------------------------------------------------------------

Version: 0.639-GPT01
Date   : 12 August 1998
By     : Marcus Roeckrath

Modification:

  If a point is not listed in nodes setup and not found in a node/point
  list Portal does test if his boss is setup in nodes setup or listed
  in a node list. If the boss is found in nodes setup Portal assumes
  that the point has to present the boss password.

  I changed it so that a point not found in nodes setup and not listed
  in a node/point list will get listed status if the boss is listed but
  it will will not be tested if his boss is setup in nodes setup.


  Program/Unit      : MAILUTIL.PAS
  Function/Procedure: RemapAddress

  The original source code:

        OrigPoint:=Adr.Point;
    Again:
        IF FindNode(Adr,NodelistEntry) THEN
        BEGIN
          FoundInNl:=True;
        END ELSE
        BEGIN
          IF (Adr.Point=0) And (FindPointNet(NodesRec,Adr.Net)) THEN
         BEGIN
            Adr.Point:=Adr.Node;
            Adr.Net:=NodesRec.Address.Net;
            Adr.Node:=NodesRec.Address.Node;
            IF FindNode(Adr,NodelistEntry) THEN FoundInNl:=True;
          END;
        END;
        IF FindNodeInfo(NodesRec,Adr) THEN
          FoundInNodes:=True
        ELSE
          IF NOT FoundInNL AND (Adr.Point<>0) THEN
          BEGIN
            Adr.Point:=0;
            GOTO Again;
          END;
        ComputeMaxRequest;
        Adr.Point:=OrigPoint;
      END;

  is replaced by:

        OrigPoint:=0;
    Again:
        IF FindNode(Adr,NodelistEntry) THEN
        BEGIN
          FoundInNl:=True;
        END ELSE
        BEGIN
          IF (Adr.Point=0) And (FindPointNet(NodesRec,Adr.Net)) THEN
         BEGIN
            Adr.Point:=Adr.Node;
            Adr.Net:=NodesRec.Address.Net;
            Adr.Node:=NodesRec.Address.Node;
            IF FindNode(Adr,NodelistEntry) THEN FoundInNl:=True;
          END;
        END;
        IF OrigPoint=0 THEN
        BEGIN
          IF FindNodeInfo(NodesRec,Adr) THEN
            FoundInNodes:=True
          ELSE
            IF NOT FoundInNL AND (Adr.Point<>0) THEN
            BEGIN
              OrigPoint:=Adr.Point;
              Adr.Point:=0;
              GOTO Again;
            END;
        END
        ELSE Adr.Point:=OrigPoint;
        ComputeMaxRequest;
      END;
-----------------------------------------------------------------------------

Version: 0.639-GPT01
Date   : 16 August 1998
By     : Marcus Roeckrath

Modification:

  Hotkey Ctrl-R for "Rescan Outbound".


  Program/Unit      : SESSION.PAS
  Function/Procedure: PortalMain

    Added in "CASE InKey OF" structure:

      CtrlR: NewTimer(OutboundReRead, 0);

    Commented out in "CASE LastChoice OF" structures (two times):

      200 : NewTimer(OutboundReRead, 0);


  Program/Unit      : MENURES.PAS
  Function/Procedure: ConfigMenu

    Changed:

      AddItem('Rescan outbound', 6, 1, 200);

    To:

      AddItem('Rescan outbound    Ctrl+R', 6, 1, CtrlR);

-----------------------------------------------------------------------------

Version: 0.639-GPT01
Date   : 19 August 1998
By     : Marcus Roeckrath

Modification:

  Program/Unit      : POPTYPES.PAS
  Function/Procedure:

  Added in version calculation:

    {$IFDEF GermanPortalTeam}
      +'-GPT01'
    {$ENDIF}

-----------------------------------------------------------------------------

Version: 0.639-GPT01
Date   : 19 August 1998
By     : Marcus Roeckrath

Modification:

  Program/Unit      : POPDEFS.INC
  Function/Procedure:

  Changed {$DEFINE Alpha} to {$DEFINE Beta}

  Added {$DEFINE GermanPortalTeam}

-----------------------------------------------------------------------------

Version: 0.639-GPT01
Date   : 30 July 1998
By     : Marcus Roeckrath

Modification:

  Disabled auto "adding" and "updating" password on callers which sends
  a password but are not yet defined or does not have a password in nodes
  setup.


  Program/Unit      : YOOHOO2U.PAS
  Function/Procedure: CheckPassword

  The following code was disabled:

    {       IF FindNodeInfo(Node, RemHello.Address) THEN
              AddLog(':','Updating password for '+Address2Str(RemHello.Address))
            ELSE
              AddLog(':','Added '+Address2Str(RemHello.Address)+' to nodes');
            Node.SessionPwd:=StUpCase(AsciiZ2Str(RemHello.Password,8));
            Node.Address:=RemHello.Address;
            PutNodeInfo(Node);
    }

-----------------------------------------------------------------------------

Version: 0.639-GPT01
Date   : 12 August 1998
By     : Carsten Brandt

Modification:

  Changed Copyright-Messages at Startup.


  Program/Unit      : INIT.PAS
  Function/Procedure: SetupScreen

      BEGIN
        wFastCenter('Portal of Power v'+Ver,2,Cfg.Color[2].TextColor);
        wFastText('(C)  Copyright 1989-97 by The Portal Team',3,2);
        wFastText('     1998 Changed by German Portal Team',4,2);
      END;

-----------------------------------------------------------------------------
Version: 0.639-GPT01
Date   : 16 August 1998
By     : Marcus Roeckrath

Modification:

  Changed Copyright-Messages at About window.


  Program/Unit      : DISPLAY.PAS
  Function/Procedure: ShowAbout

  Replaced:

      Start:=(ScreenHeight DIV 2)-4;
      MyWin(About, 24, Start, 56, Start+8, 2, 'About', True);
      WITH About^ DO
      BEGIN
        wFastCenter('Portal of Power',2,Cfg.Color[2].HighLightColor);
        wFastCenter('Version '+Ver,3,Cfg.Color[2].TextColor);
        wFastCenter('(C) Copyright 1989-97 by',5,Cfg.Color[2].TextColor);
        wFastCenter('The Portal Team',6,Cfg.Color[2].TextColor);
      END;

  by:

      Start:=(ScreenHeight DIV 2)-5;
      MyWin(About, 24, Start, 56, Start+11, 2, 'About', True);
      WITH About^ DO
      BEGIN
        wFastCenter('Portal of Power',2,Cfg.Color[2].HighLightColor);
        wFastCenter('Version '+Ver,3,Cfg.Color[2].TextColor);
        wFastCenter('(C) Copyright 1989-97 by',5,Cfg.Color[2].TextColor);
        wFastCenter('The Portal Team',6,Cfg.Color[2].TextColor);
        wFastCenter('1998 Changes made by',8,Cfg.Color[2].TextColor);
        wFastCenter('The German Portal Team',9,Cfg.Color[2].TextColor);
      END;

-----------------------------------------------------------------------------
