Files
fpc-msgbase/examples/example_write.pas
Ken Johnson a541085a4b 0.7.0: extract TFTNAddress into leaf mb.address unit
Ask 1 from fpc-binkp consumer thread: non-storage libraries
(fpc-ftn-transport, fpc-binkp, future fpc-comet-proto / fpc-emsi,
SQL-backed messaging like Fastway) only need TFTNAddress, not the
full 1041-line mb.types.  Extract to src/mb.address.pas (~90 lines,
only SysUtils) so they can cp a single file into their project.

mb.types continues to uses mb.address so existing callers see the
type transitively -- BUT FPC does not propagate record-field access
through re-export, so consumers that touch TFTNAddress.Zone/Net/
Node/Point directly must add mb.address to their own uses clause.
All 7 in-tree .uni adapters, 2 examples, 5 test harnesses updated.

No behavioural change.  Full suite passes, multi-target build
green (x86_64-linux, i386-{linux,freebsd,win32,os2,go32v2}).
2026-04-21 13:22:53 -07:00

105 lines
2.7 KiB
ObjectPascal

{
example_write.pas - post one test message to any supported base
via the unified API.
usage: example_write <format> <path> <from> <to> <subject> <body>
Example:
example_write jam /tmp/testarea Sysop All Hello 'Hello, world'
For Hudson/GoldBase/MSG the path is a directory; for JAM/Squish
it is <dir>/<areaname> (no extension); for PKT it is the full
*.pkt filename; for EzyCom it is the base directory and board 1
is used by default.
}
program example_write;
{$mode objfpc}{$H+}
uses
SysUtils,
mb.address, mb.types, mb.events, mb.api,
mb.fmt.hudson, mb.fmt.hudson.uni,
mb.fmt.jam, mb.fmt.jam.uni,
mb.fmt.squish, mb.fmt.squish.uni,
mb.fmt.msg, mb.fmt.msg.uni,
mb.fmt.pcboard, mb.fmt.pcboard.uni,
mb.fmt.ezycom, mb.fmt.ezycom.uni,
mb.fmt.goldbase, mb.fmt.goldbase.uni;
function ParseFormat(const S: string; out AFormat: TMsgBaseFormat): boolean;
begin
Result := True;
case LowerCase(S) of
'hudson': AFormat := mbfHudson;
'jam': AFormat := mbfJam;
'squish': AFormat := mbfSquish;
'msg': AFormat := mbfMsg;
'pcboard': AFormat := mbfPCBoard;
'ezycom': AFormat := mbfEzyCom;
'goldbase': AFormat := mbfGoldBase;
else
Result := False;
end;
end;
procedure Usage;
begin
WriteLn('Usage: example_write <format> <path> <from> <to> <subject> <body>');
WriteLn(' formats: hudson jam squish msg pcboard ezycom goldbase');
Halt(2);
end;
var
fmtName, path, whoFrom, whoTo, subject, body: string;
fmt: TMsgBaseFormat;
base: TMessageBase;
msg: TUniMessage;
begin
if ParamCount < 6 then Usage;
fmtName := ParamStr(1);
path := ParamStr(2);
whoFrom := ParamStr(3);
whoTo := ParamStr(4);
subject := ParamStr(5);
body := ParamStr(6);
if not ParseFormat(fmtName, fmt) then Usage;
try
base := MessageBaseOpen(fmt, path, momReadWrite);
except
on E: Exception do begin
WriteLn('error: ', E.Message);
Halt(1);
end;
end;
if not base.Open then begin
WriteLn('error: Open returned False (missing files? lock busy?)');
base.Free;
Halt(1);
end;
msg.Attributes.Clear;
msg.Attributes.SetValue('from', whoFrom);
msg.Attributes.SetValue('to', whoTo);
msg.Attributes.SetValue('subject', subject);
msg.Attributes.SetDate('date.written', Now);
msg.Attributes.SetBool('attr.local', true);
msg.Attributes.SetAddr('addr.orig', MakeFTNAddress(1, 1, 1, 0));
msg.Attributes.SetAddr('addr.dest', MakeFTNAddress(1, 1, 2, 0));
msg.Body := body + #13;
try
if base.WriteMessage(msg) then
WriteLn('wrote message #', msg.Attributes.GetInt('msg.num'))
else
WriteLn('error: WriteMessage returned False');
finally
base.Close;
base.Free;
end;
end.