program CXTest;
uses exec;
{$incl "commodities.lib"}

(* Wir bauen uns ein Commodity

   man nehme: die "commodities.library"
              und EXCHANGE
*)

var nb : NewBroker;               (* damit legen wir alle neuen Broker an *)
    brok,F_diskin,S_diskin,
    F_diskrem,S_diskrem:p_CxObj;  (* unsere CX-Objekte *)
    my_MSG:p_Message;             (* für die Messages von der commoditiers.library *)
    MPort:p_MsgPort;              (* und noch ein Port dafür *)
    c1,c2:string[20];             (* 2 Strings für die Ereignisse *)
    err:long;                     (* um Rückmeldungen irgendwohin zu tun *)

procedure HandleMsgs;
(* HandleMsgs macht nichts anderes, als auf eine Message der commoditiers.library
   zu warten. Die wird dann ausgewertet und entsprechend gehandelt. *)

var id,typ:long;
    ende:boolean;

begin
 repeat
  ende:=false;
  my_MSG:=Wait_Port(MPort);
  my_MSG:=Get_Msg(MPort);
  id:=CxMsgID(ptr(my_MSG));
  typ:=CxMsgType(ptr(my_MSG));
  Reply_MSG(my_MSG);
  case typ of
  CXM_IEVENT: begin
               (* das ist ein Ereignis, das wir eingestellt haben *)
               case id of
               1: writeln("1: ",c1)
               2: writeln("2: ",c2);
               else
               end;
              end
  CXM_COMMAND: begin
                (* dashier kommt von EXCHANGE *)
                case id of
                CXCMD_DISABLE: writeln("Disabled!")
                CXCMD_ENABLE: writeln("Enabled!")
                CXCMD_KILL: begin
                             writeln("KILL!");
                             ende:=true;
                            end
                CXCMD_UNIQUE: writeln("UNIQUE!")
                CXCMD_APPEAR: writeln("Appear!")
                CXCMD_DISAPPEAR: writeln("Disappear!");
                else
                end;
               end
  else
  end;
 until ende;
end;
begin
 OpenLib(CxBase,"commodities.library",37);
 c1:="rawkey b";     (* die Ereignisse für uns: die Taste "b" oder *)
 c2:="diskinserted"; (* das Einlegen einer Diskette - reine Testzwecke... *)
 MPort:=CreateMsgPort; (* ein MessagePort für die Messages halt *)
 if MPort<>NIL then
 begin
  nb:=NewBroker(NB_Version,"CX-Test-Broker","CX-Test","Ein Test!",NBU_Unique or NBU_Notify,COF_SHOW_HIDE,0,MPort,0);
   (* so, das ist unser Programm - diese Daten sind u.a. bei EXCHANGE zu sehen *)
  brok:=CxBroker(^nb,nil);
  if brok<>NIL then
  begin
   F_diskin:=CreateCxObj(CX_Filter,long(^c1),0);
    (* ein Filter, der die rawkey b herausfiltert *)
   if F_diskin<>NIL then
   begin
    AttachCxObj(brok,F_diskin);
    S_diskin:=CreateCxObj(CX_Send,long(MPort),1);
     (* und ein Sender, der uns dann das auch mitteilt
        als letztes wird hier der ID 1 angegeben, damit wir die Ereignisse
        unterscheiden können *)
    if S_diskin<>NIL then
    begin
     AttachCxObj(F_diskin,S_diskin);
     F_diskrem:=CreateCxObj(CX_Filter,long(^c2),0);
      (* der 2. Filter *)
     if F_diskrem<>NIL then
     begin
      AttachCxObj(brok,F_diskrem);
      S_diskrem:=CreateCxObj(CX_Send,long(MPort),2);
       (* und sein Sender *)
      if S_diskrem<>NIL then
      begin
       AttachCxObj(F_diskrem,S_diskrem);
       err:=long(ActivateCxObj(brok,1));
        (* so, das ganze jetzt ankurbeln und es (sollte) laufen... *)
       HandleMsgs;
      end;
     end;
    end;
   end;
   DeleteCxObjAll(brok); (* das entfernt einfach alle CxObjekte *)
  end;
  DeleteMsgPort(MPort);
 end
end.

