/* The example below, Broker.c, receives input from one source, the * controller program. The controller program sends a CxMessage each * time the user clicks its Enable, Disable, or Kill gadgets. Using the * CxMsgID() function, the commodity finds out what the command is and * executes it. * * broker.c - Simple skeletal example of opening a broker * * compiled with SASC 5.10 * LC -b0 -cfist -v broker.c * Blink FROM LIB:c.o,broker.o TO broker LIBRARY LIB:LC.lib,LIB:Amiga.lib */ #include <exec/libraries.h> #include <libraries/commodities.h> #include <dos/dos.h> #include <clib/exec_protos.h> #include <clib/alib_protos.h> #include <clib/alib_stdio_protos.h> #include <clib/commodities_protos.h> #ifdef LATTICE int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */ int chkabort(void) { return(0); } #endif void main(void); void ProcessMsg(void); struct Library *CxBase; CxObj *broker; struct MsgPort *broker_mp; ULONG cxsigflag; struct NewBroker newbroker = { NB_VERSION, /* nb_Version - Version of the NewBroker structure */ "RKM broker", /* nb_Name - Name Commodities uses to identify this commodity */ "Broker", /* nb_Title - Title of commodity that appears in CXExchange */ "A simple example of a broker", /* nb_Descr - Description of the commodity */ 0, /* nb_Unique - Tells CX not to launch another commodity with same name */ 0, /* nb_Flags - Tells CX if this commodity has a window */ 0, /* nb_Pri - This commodity's priority */ 0, /* nb_Port - MsgPort CX talks to */ 0 /* nb_ReservedChannel - reserved for later use */ }; void main(void) { CxMsg *msg; /* Before bothering with anything else, open the library */ if (CxBase = OpenLibrary("commodities.library", 37L)) { /* Commodities talks to a Commodities application through */ /* an Exec Message port, which the application provides */ if (broker_mp = CreateMsgPort()) { newbroker.nb_Port = broker_mp; /* The commodities.library function CxBroker() adds a borker to the * master list. It takes two arguments, a pointer to a NewBroker * structure and a pointer to a LONG. The NewBroker structure contains * information to set up the broker. If the second argument is not * NULL, CxBroker will fill it in with an error code. */ if (broker = CxBroker(&newbroker, NULL)) { cxsigflag = 1L << broker_mp->mp_SigBit; /* After it's set up correctly, the broker has to be activated */ ActivateCxObj(broker, 1L); /* the main processing loop */ ProcessMsg(); /* It's time to clean up. Start by removing the broker from the * Commodities master list. The DeleteCxObjAll() function will * take care of removing a CxObject and all those connected * to it from the Commodities network */ DeleteCxObj(broker); /* Empty the port of CxMsgs */ while(msg = (CxMsg *)GetMsg(broker_mp)) ReplyMsg((struct Message *)msg); } DeletePort(broker_mp); } CloseLibrary(CxBase); } } void ProcessMsg(void) { CxMsg *msg; ULONG sigrcvd, msgid, msgtype; LONG returnvalue = 1L; while (returnvalue) { /* wait for something to happen */ sigrcvd = Wait(SIGBREAKF_CTRL_C | cxsigflag); /* process any messages */ while(msg = (CxMsg *)GetMsg(broker_mp)) { /* Extract necessary information from the CxMessage and return it */ msgid = CxMsgID(msg); msgtype = CxMsgType(msg); ReplyMsg((struct Message *)msg); switch(msgtype) { case CXM_IEVENT: /* Shouldn't get any of these in this example */ break; case CXM_COMMAND: /* Commodities has sent a command */ printf("A command: "); switch(msgid) { case CXCMD_DISABLE: printf("CXCMD_DISABLE\n"); /* The user clicked Commodities Exchange disable * gadget better disable */ ActivateCxObj(broker, 0L); break; case CXCMD_ENABLE: /* user clicked enable gadget */ printf("CXCMD_ENABLE\n"); ActivateCxObj(broker, 1L); break; case CXCMD_KILL: /* user clicked kill gadget, better quit */ printf("CXCMD_KILL\n"); returnvalue = 0L; break; } break; default: printf("Unknown msgtype\n"); break; } } /* Test to see if user tried to break */ if (sigrcvd & SIGBREAKF_CTRL_C) { returnvalue = 0L; printf("CTRL C signal break\n"); } } } /* Notice that Broker.c uses Ctrl-C as a break key. The break key for ** any commodity should be Ctrl-C. */