Contributor: MARK LEWIS               

{ MARK LEWIS }

Uses
  Dos;

Type
  ti = Record
    Var1 : Word;
    Var2 : Word;
  end;

  MsgInfo = Record
    From_Name : Array[1..36] of Char;
    To_Name   : Array[1..36] of Char;
    Subject   : Array[1..72] of Char;
    DateTime  : Array[1..20] of Char;
    timesread : Word;
    destnode  : Word;
    orignode  : Word;
    cost      : Word;
    orignet   : Word;
    destnet   : Word;
    field1    : ti;    { these two have at least two seperate }
    field2    : ti;    { Uses. time sent/rcvd or zone/point info }
    replyto   : Word;
    attribute : Word;
    nextmsg   : Word;
  end;

{
ahhh... what the heck... the following will read the MSG header and display
it... i'll leave the processing of the messagebody as an exercise For the
reader(s)... it's a lot of fun... make sure you get/have the FTSC documents
handy... there is one that talks about hints to follow when processing messages
(in .PKT's and in .MSG's) like filtering out all CR's, LF's and softcarriage
returns -=B-)
}

Var
  MInfo    : MsgInfo;
  MSGName  : PathStr;
  MSGFile  : File;
  i        : Byte;
  t1,t2    : datetime;
  notdate  : Boolean;
  numread  : Word;

{-------------------------------------------------------------------------}
begin  { Main Body }
  assign(output, '');
  reWrite(output);
  Filemode := 64;
  MSGName  := ParamStr(1); { Get message Filename from command line }
  if (MSGName = '') Then
  begin
    WriteLn('Name of *.MSG must be specified on command line.');
    Halt;
  end;
  FillChar(Minfo,SizeOf(Minfo),#0);
  Assign(MSGFile,MSGName);
  {$I-} Reset(MSGFile,1); {$I+}
  if IOResult <> 0 Then
  begin
    Writeln('Unable to open the *.MSG!');
    halt;
  end;
  { Read in header... }
  BlockRead(MSGFile,Minfo,SizeOf(Minfo),NumRead);
  { decode time/date fields For FrontDoor/OPUS }
  { i think this is a UNIX time/date format but not sure }
  t1.min   := (minfo.field1.Var2 and $07e0) shr 5;
  t1.hour  := (minfo.field1.Var2 and 63488) shr 11;
  t1.sec   := 0;
  t1.year  := 1980 + (minfo.field1.Var1 and $fe00) shr 9;
  t1.month := (minfo.field1.Var1 and $01e0) shr 5;
  t1.day   := (minfo.field1.Var1 and $001f);
  t2.min   := (minfo.field2.Var2 and $07e0) shr 5;
  t2.hour  := (minfo.field2.Var2 and 63488) shr 11;
  t2.sec   := 0;
  t2.year  := 1980 + (minfo.field2.Var1 and $fe00) shr 9;
  t2.month := (minfo.field2.Var1 and $01e0) shr 5;
  t2.day   := (minfo.field2.Var1 and $001f);
  if (t1.year < 1990) and (t2.year < 1990) then
    notdate := True
  else
    notdate := False;
    { if the years are over three years ago, then we are probably }
    { processing a message that is using these fields For their }
    { other documented use. }
  Write('From: ');
  For i := 1 to 36 do
    Write(minfo.from_name[i]);
  Writeln;
  Write('To  : ');
  For i := 1 to 36 do
    Write(minfo.to_name[i]);
  Writeln;
  Write('Subj: ');
  For i := 1 to 72 do
    Write(minfo.subject[i]);
  Writeln;
  Write('Date: ');
  For i := 1 to 20 do
    Write(minfo.datetime[i]);
  Writeln;
  Writeln('timesread : ',minfo.timesread);
  Writeln(' destnode : ',minfo.destnode );
  Writeln(' orignode : ',minfo.orignode );
  Writeln('     cost : ',minfo.cost     );
  Writeln('  orignet : ',minfo.orignet  );
  Writeln('  destnet : ',minfo.destnet  );
  if notdate then
  begin
    Writeln(' destzone : ',minfo.field1.Var1);
    Writeln(' origzone : ',minfo.field1.Var2);
    Writeln('destpoint : ',minfo.field2.Var1);
    Writeln('origpoint : ',minfo.field2.Var2);
  end
  else
  begin
    Writeln('    time1 : ',t1.month,'/',t1.day,'/',t1.year,'   ',
                           t1.hour,':',t1.min,':',t1.sec);
    Writeln('    time2 : ',t2.month,'/',t2.day,'/',t2.year,'   ',
                           t2.hour,':',t2.min,':',t2.sec);
  end;
  Writeln('  replyto : ',minfo.replyto  );
  Writeln('attribute : ',minfo.attribute);
  Writeln('  nextmsg : ',minfo.nextmsg  );
  Close(MSGFile);
end.