8ca67e482f70ea0ab53d51bb2f001d3af406768d
[bertos.git] / mware / observer.h
1 /**
2  * \file
3  * <!--
4  * Copyright 2006 Develer S.r.l. (http://www.develer.com/)
5  * This file is part of DevLib - See README.devlib for information.
6  * -->
7  *
8  * \brief Simple notifier for the subject/observer pattern (interface)
9  *
10  * \version $Id$
11  * \author Bernardo Innocenti <bernie@develer.com>
12  */
13 #ifndef MWARE_OBSERVER_H
14 #define MWARE_OBSERVER_H
15
16 #include <mware/list.h>
17
18 /**
19  *
20  * Here's a simple example:
21  *
22  * \code
23  * Subject kbd_driver;
24  *
25  * Observer kbd_observer;
26  *
27  * void key_pressed(int event, void *_param)
28  * {
29  *     char *param = (char *)_param;
30  *
31  *     if (event == EVENT_KBD_PRESSED)
32  *         printf("You pressed %c\n", *param);
33  * }
34  *
35  * void register_kbd_listener(void)
36  * {
37  *     observer_SetEvent(&kbd_observer, key_pressed);
38  *     observer_Subscribe(&kbd_driver, &kbd_observer);
39  * }
40  * \endcode
41  */
42 typedef struct Observer
43 {
44         Node link;
45         void (*event)(int event_id, void *param);
46 } Observer;
47
48 typedef struct Subject
49 {
50         /// Subscribed observers.
51         List observers;
52
53 } Subject;
54
55 void observer_SetEvent(Observer *observer, void (*event)(int event_id, void *param));
56
57 #define OBSERVER_INITIALIZER(callback) { { NULL, NULL }, callback }
58
59 void observer_InitSubject(Subject *subject);
60
61 /// Aggiunge un Observer all'insieme
62 void observer_Subscribe(Subject *subject, Observer *observer);
63
64 /// Rimuove un Observer dall'insieme
65 void observer_Unsubscribe(Subject *subject, Observer *observer);
66
67 /// per tutti gli elementi nel set notifica l'evento, chiamando la relativa
68 /// funzione event
69 void observer_notify(Subject *subject, int event_id, void *param);
70
71 #endif /* MWARE_OBSERVER_H */