summaryrefslogtreecommitdiffstats
path: root/Vlv2TbltDevicePkg/Include/Protocol/Observable.h
blob: bc5571e6d58bfa7f6c324a1aba96b1eb05103992 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/*++

  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
                                                                                   

  SPDX-License-Identifier: BSD-2-Clause-Patent

                                                                                   



Module Name:

  Observable.h

Abstract:

  Interface and GUID definitions for Observable protocol.

**/

#ifndef _OBSERVABLE_PROTOCOL_H_
#define _OBSERVABLE_PROTOCOL_H_

//
// GUID Definitions
//
#define OBSERVABLE_PROTOCOL_GUID \
  { \
    0xe227c522, 0xd5fe, 0x4a53, 0x87, 0xb1, 0x0f, 0xbe, 0x57, 0x0f, 0x98, 0xe9 \
  }

extern EFI_GUID gObservableProtocolGuid;

typedef struct _OBS_OBSERVABLE_PROTOCOL OBS_OBSERVABLE_PROTOCOL;

//
// Interface Definitions
//

/**
  Remove all observables.

  Remove all observable guids and all interfaces subscribed to them.

  @param   VOID          No Parameters.

  @return  EFI_SUCCESS   Successfully removed all observables and subscribed interfaces.

**/
typedef
EFI_STATUS
(EFIAPI *OBS_REMOVE_ALL_OBSERVABLES) (
  VOID
  );

/**
  Interface for notification functions.

  Functions that are to be used as callbacks must inherit this interface in order to be used properly.

  @param   VOID*   Data  Parameter context to be passed to the notification function.

  @return  EFI_STATUS    Varies depending on implementation.

**/
typedef
EFI_STATUS
(EFIAPI *OBS_CALLBACK) (
  IN  OUT VOID*   Data
  );

/**
  Subscribe an interface with an observable guid.

  Use this to register a callback function with a guid. The function provided by CallbackInterface will be executed
  whenever the appropriate observable instance specified by ReferenceGuid calls Publish.

  @param   EFI_GUID                ReferenceGuid       The observable guid that the callback interface will subscribe to.
           OBS_NOTIFY_INTERFACE    CallbackInterface   A pointer to the function that is subscribing to the observable.

  @return  EFI_SUCCESS           Successfully subscribed the interface to the observable guid.
           EFI_NOT_FOUND         No match could be found between the provided guid and existing observables.
           EFI_OUT_OF_RESOURCES  Could not subscribe to this observer due to resource limitations.
           EFI_INVALID_PARAMETER Interface is already subscribed to this observer.
**/
typedef
EFI_STATUS
(EFIAPI *OBS_SUBSCRIBE) (
  IN      EFI_GUID        ReferenceGuid,
  IN      OBS_CALLBACK    CallbackInterface
  );

/**
  Unsubscribe an interface with an observable guid.

  Use this to remove an interface from the callback list associated with an observable guid.

  @param   EFI_GUID                ReferenceGuid   The observable guid to unsubscribe the interface from.
           OBS_NOTIFY_INTERFACE    NotifyCallback  A pointer to the interface that is being unsubscribed.

  @return  EFI_SUCCESS           Successfully unsubscribed the interface from the observable guid.

**/
typedef
EFI_STATUS
(EFIAPI *OBS_UNSUBSCRIBE) (
  IN      EFI_GUID        ReferenceGuid,
  IN      OBS_CALLBACK    CallbackInterface
  );

/**
  Notify observing functions.

  Use this to notify all functions who are subscribed to the guid specified by ReferenceGuid.

  @param   EFI_GUID          ReferenceGuid   The observable guid that contains the the list of interfaces to be notified.
           VOID*             Data            Parameter context to be passed to the notification function.

  @return  EFI_SUCCESS       Successfully notified all observers listening to this guid.
           EFI_NOT_FOUND     No match could be found between the provided guid and existing observables.

**/
typedef
EFI_STATUS
(EFIAPI *OBS_PUBLISH) (
  IN      EFI_GUID        ReferenceGuid,
  IN  OUT VOID*           Data
  );

/**
  Creates a new observable.

  Create a new observable that can be observed with the use of Subscribe function.

  @param   EFI_GUID              ReferenceGuid   The observable guid to add.

  @return  EFI_SUCCESS           Successfully added observable.
           EFI_INVALID_PARAMETER Observable already exists.

**/
typedef
EFI_STATUS
(EFIAPI *OBS_ADD_OBSERVABLE) (
  IN      EFI_GUID        ReferenceGuid
  );

/**
  Remove an observable.

  Remove an observable so that it can no longer be subscribed to. In addition, unsubscribe any functions
  that are subscribed to this guid.

  @param   EFI_GUID              ReferenceGuid   The observable guid to remove.

  @return  EFI_SUCCESS           Successfully removed observable.

**/
typedef
EFI_STATUS
(EFIAPI *OBS_REMOVE_OBSERVABLE) (
  IN      EFI_GUID        ReferenceGuid
  );

//
// Protocol Definitions
//
typedef struct _OBS_LEAF {
  OBS_CALLBACK      Observer;
  struct _OBS_LEAF* Next;
} OBS_LEAF;

typedef struct _OBS_TREE {
  EFI_GUID              ObservableGuid;
  OBS_LEAF*             Leaf;
  struct _OBS_TREE*     Next;
} OBS_TREE;

struct _OBS_OBSERVABLE_PROTOCOL {
  OBS_ADD_OBSERVABLE          AddObservable;
  OBS_REMOVE_OBSERVABLE       RemoveObservable;
  OBS_SUBSCRIBE               Subscribe;
  OBS_UNSUBSCRIBE             Unsubscribe;
  OBS_PUBLISH                 Publish;
  OBS_REMOVE_ALL_OBSERVABLES  RemoveAllObservables;
} ;

#endif