CTKPluginFramework_EventAdmin.dox 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /**
  2. \page PluginFramework_EventAdmin_Page Event Admin
  3. The Event Admin Service Specification, part of the OSGi Compendium specification,
  4. defines a general inter-plug-in communication mechanism. The communication conforms
  5. to the popular publish/subscribe paradigm and can be performed in a synchronous
  6. or asysnchronous manner.
  7. The main components in a publish/subscribe communication are:
  8. - <b>Event Publisher</b> - sends events or messages related to a specific topic
  9. - <b>Event Handler</b> (or Subscriber) - expresses interest in one or more topics and
  10. receives all the messages belonging to such topics.
  11. Events are composed of two attributes:
  12. - A \b topic defining the nature of the event. Topic names are usually arranged in a hierarchical namespace, where slashes are used to separate the levels (i.e. "org/commontk/PluginFrameworkEvent/STARTED") and
  13. - A set of \b properties describing the event.
  14. \section EventAdmin_CreatePublisher Creating an Event Publisher
  15. An event publisher can either be a simple C++ class that creates events and sends
  16. them using the <code>ctkEventAdmin</code> service interface or a Qt signal which
  17. is registered as a "publisher" using the <code>ctkEventAdmin</code> service
  18. interface.
  19. \subsection EventAdmin_CreatePublisher_Class Using a simple C++ class
  20. The publisher is a function which creates a <code>ctkEvent</code> object and
  21. sends it by using the <code>ctkEventAdmin</code> service interface.
  22. \snippet EventAdmin-Intro/ctkSnippetReportManager.h Publish event
  23. The <code>ctkEventAdmin::sendEvent()</code> method sends the <code>ctkEvent</code>
  24. object synchronously. To send it asynchronously, use the <code>ctkEventAdmin::postEvent()</code>
  25. method, such as:
  26. \snippet EventAdmin-Intro/ctkSnippetReportManager.h Publish event async
  27. \subsection EventAdmin_CreatePublisher_Signal Using a Qt signal
  28. Using a Qt signal to publish an event requires declaring a signal and registering (publishing)
  29. it with the Event Admin:
  30. \snippet EventAdmin-Intro/ctkSnippetReportManager.h Declare signal
  31. Register the signal using a specific topic (emitting the signal will always send
  32. <code>ctkEvent</code> objects with this topic as <code>EVENT_TOPIC</code> property):
  33. \snippet EventAdmin-Intro/ctkSnippetReportManager.h Register signal
  34. Emitting the signal will automatically create a <code>ctkEvent</code> object, sending
  35. it synchronuously or asynchronuously, depending on the Qt::ConnectionType used when
  36. publishing the signal.
  37. \snippet EventAdmin-Intro/ctkSnippetReportManager.h Emit signal
  38. \subsection EventAdmin_CreatePublisher_Compare Comparison
  39. The act of sending an event is simplified by using a Qt signal, after it was registered
  40. with the Event Admin. However, the Qt signal approach is less performant since the
  41. signal emission needs to go through the Qt meta object system. Further, the signal is
  42. tied to a specific event topic.
  43. \section EventAdmin_CreateHandler Creating and registering an Event Handler
  44. An event handler can either be a class implementing the <code>ctkEventHandler</code>
  45. interface which is registered as a service object or a Qt slot which is registered with the Event Admin (subscribed to certain
  46. topics).
  47. \subsection EventAdmin_CreateHandler_Service Event Handler as a Service
  48. Create an event handler by implementing the <code>ctkEventHandler</code> interface:
  49. \snippet EventAdmin-Intro/ctkSnippetReportManager.h Event Handler service
  50. To receive event notifications, the event handler must be registered as a service under the
  51. <code>ctkEventHandler</code> interface. When registering the service, a <code>QString</code>
  52. or <code>QStringList</code> property named <code>EVENT_TOPIC</code> must be specified. This
  53. property describes the list of topics in which the event handler is interested. For example:
  54. \snippet EventAdmin-Intro/main.cpp Event Handler service registration
  55. It is possible to use '*' as a wildcard in the final character of the <code>EVENT_TOPIC</code>:
  56. \snippet EventAdmin-Intro/main.cpp Event Handler service registration wildcard
  57. Finally, it is possible to specify an additional <code>EVENT_FILTER</code> property to filter
  58. event notifications. The filter expression follows the normal LDAP syntax:
  59. \snippet EventAdmin-Intro/main.cpp Event Handler service registration filter
  60. \subsection EventAdmin_CreateHandler_Slot Event Handler as a Qt slot
  61. Every Qt slot taking a <code>ctkEvent</code> object as an argument can be subscribed to
  62. receive event notifications. For example, a slot like
  63. \snippet EventAdmin-Intro/ctkSnippetReportManager.h Event Handler slot
  64. can be subscribed to receive events like
  65. \snippet EventAdmin-Intro/main.cpp Event Handler service registration slot
  66. You can use the same expressions for <code>EVENT_TOPIC</code> and
  67. <code>EVENT_FILTER</code> as in the examples above for registering the event
  68. handler as a service object implementing <code>ctkEventHandler</code>.
  69. \subsection EventAdmin_CreateHandler_Compare Comparison
  70. Registering an event handler using either the <code>ctkEventHandler</code> interface or
  71. a Qt slot involves approximately the same amount of code. However, using slots
  72. will be less performant (which might be neglectable, depending on your use case). Further,
  73. subscribing slots means that you require a registered Event Admin service implementation.
  74. The <code>ctkEventHandler</code> approach does not need to know anything about the Event
  75. Admin, since you register your handler as a service object in the framework.
  76. */