Contributor: MARCO MILTENBURG

{
> Is there somebody who can give me an example of
> how to write an JAM Base message (RemoteAccess) ?

> I already have JAMAPI and MKMSG I'll need just an simple unit how to
> write fast and simple an message to the JAM base..

Try this... It should work with the standard JAMAPI (I think, at least I
can't remember changing anything in it). It's a little piece of testcode
I wrote to play around with JAM :
}
Program JAMTest;

Uses
  JAM, JAMmb, JAMcrc32;

Var
  JAMMsg     : JAMAPIPTR;
  ToUsername : String[100];
  Position   : LongInt;
  S          : String;
  MsgNo      : LongInt;
  Error      : Boolean;

Function FileLength (Handle:INTEGER) : LongInt;
Var
  Position : LongInt;
Begin
  Position   := JAMMsg^.SeekFile (Handle, 1, 0);
  FileLength := JAMMsg^.SeekFile (Handle, 2, 0);
  JAMMsg^.SeekFile (Handle, 0, Position);
End; { FileLength }


Begin
  New (JAMMsg, Init);
  New (JAMMsg^.WorkBuf);
  With JAMMsg^ Do
  Begin
    If (WorkBuf <> NIL) Then
    Begin
      WorkLen  := SizeOf(JAMBUF);
      BaseName := 'ANOTHER';

      Error := Not OpenMB;
      If Error Then Error := Not CreateMB;
      If Not Error Then
      Begin
        If LockMB(True) Then
        Begin

          MsgNo := (FileLength(IdxHandle) Div SizeOf(JAMIDXREC)) +
                   HdrInfo.BaseMsgNum;
          Hdr.MsgNum := MsgNo;

          (* Add an index record *)
          ToUsername := 'Marco Miltenburg';
          With Idx Do
          Begin
            S := ToUsername;
            LowCaseBuf (S[1], Length(S));
            UserCRC   := crc32(S[1], Length(S), -1);
            HdrOffset := FileLength (JAMMsg^.HdrHandle);
          End;
          StoreMsgIdx(MsgNo);

          Position := 1;
          FillChar (Workbuf^, SizeOf(WorkLen), #0);
          S := 'This is a test in JAM.'#13#10;
          AddField (0, FALSE, Length(S), Position, S[1]);
          S := '--- WhatEver/386 v0.0'#13#10;
          AddField (0, FALSE, Length(S), Position, S[1]);
          Hdr.TxtLen := Position - 1;
          Hdr.TxtOffset := FileLength(TxtHandle);
          StoreMsgTxt;

          FillChar (Workbuf^, SizeOf(WorkLen), #0);
          S := 'WhatEven/386 v0.0'; Position := 1;
          AddField (2, TRUE, Length(S), Position, S[1]);
          S := ToUserName;
          AddField (3, TRUE, Length(S), Position, S[1]);
          S := 'Just a message';
          AddField (6, TRUE, Length(S), Position, S[1]);
          S := 'WhatEver/386 v0.0';
          AddField (7, TRUE, Length(S), Position, S[1]);

          With Hdr Do
          Begin
            ReservedWord := 0;
            SubfieldLen    := Position;
            TimesRead    := 0;
            MsgIdCRC     := -1;
            ReplyCRC     := -1;
            ReplyTo      := 0;
            Reply1st     := 0;
            ReplyNext    := 0;
            DateWritten    := 0;
            DateReceived := 0;
            DateProcessed:= 0;
            Attribute    := MSG_LOCAL Or MSG_PRIVATE Or MSG_TYPEECHO;
            Attribute2   := 0;
            PasswordCRC  := -1;
            Cost         := 0;
          End; { With }

          StoreMsgHdr(MsgNo);
          WriteFile(HdrHandle, WorkBuf^, Position);

          Inc(HdrInfo.ActiveMsgs);
          UpdHdrInfo(True);

        End { If }
        Else
          WriteLn ('Unable to lock JAM base ''', BaseName,'''');

      End { If }
      Else
        WriteLn ('Unable to open JAM base ''', BaseName,'''');

      Dispose (WorkBuf);
      Dispose (JAMMsg);
    End { If }
    Else
      WriteLn ('Unable to allocate Work Buffer memory');
  End; { With }
End.