Communication Ring
Availability LightWave® 8.0
Component Layout, Modeler
Header lwcomring.h
The Communication Ring provides a mechanism that allows plug-ins to
notify other plug-ins of events. The "ring" nature of the
mechanism allows any plug-in to create a "ring" and any other
plug-in to "subscribe" to events on that ring. Any member
of the ring can generate events on the ring, and all members on the ring
will receive the event. Each event will include an event code, and a
pointer that can optionally contain data associated with the event.
As events are generated, each subscriber on the ring (except for the
event owner) is notified to process the event. This notification
takes place in real-time, so processing of each event should take place as
quickly as possible to avoid noticeable delays in the main application.
A ring is destroyed when the last subscriber detaches from it.
Global Call
LWComRing *cmFunc;
cmFunc = global( LWCOMRING_GLOBAL, GFUSE_TRANSIENT );
The global function returns a pointer to an LWComRing
structure.
typedef struct st_LWComRing {
int (*ringAttach)(char *topic,LWInstance pidata,RingEvent eventCallback);
void (*ringDetach)(char *topic,LWInstance pidata);
void (*ringMessage)(char *topic,int eventCode,void *eventData);
} LWComRing;
Event Support
Each subscriber to a ring uses the ringAttach() function
to register their subscription. Each ring has a unique topic, which
is simply a string that distinguishes that particular communication ring
from any others. In addition, you provide a pointer to some unique
data to identify your particular subscription on the ring. Because
you might have multiple instances of a single plug-in subscribed to a
single ring, it would be a good idea to use your plug-in's instance data
pointer as this argument.
When attaching to (or creating) a ring, you must provide a pointer to
a callback function that will be invoked whenever an event occurs on that
ring. The function has the following prototype:
typedef void (*RingEvent)(void *clientData,void *portData,int
code,void *data);
The clientData pointer is the one
provided to the ringAttach() function when the you subscribe
to a ring. The code value is a user-defined code for
the event, and data is a pointer to any data associated with
the event (it may be NULL if the event includes no data). The portData
pointer is only used internally, and currently has no useful purpose for a
ring client.
Exported ComRing Functions
success = ringAttach( topic, id, callback )
- Register a subscription with a Communication Ring. The
topic
should be unique among Communication Rings, and the id
should be unique among instances of your plug-in. The callback
pointer is where your plug-in will be called when events occur on the
ring. A return value of one (1) indicates a successful
subscription, while zero (0) indicates an error of some kind occurred.
ringDetach( topic, id )
- When a plug-in is finished using a Communication Ring, it needs to
detach from it.
topic and id should be
the same values used when you subscribed to the ring.
ringMessage( topic, code, data )
- This function generates an event on the ring specified by
topic .
The event code is an integer value whose value is
completely user-defined. The data pointer should be
set to NULL if the event being generated contains no data, or can be a
pointer to any kind of data that should be provided to other plug-ins
when their Communication Ring event callback is invoked.
-
Example
The ComRing
SDK example project illustrates the usage of the Communication Ring system
by allowing a Master LScript to control the appearance of a CustomObject
plug-in in real-time.
|