• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 #ifndef PVMF_EVENT_HANDLING_H_INCLUDED
19 #define PVMF_EVENT_HANDLING_H_INCLUDED
20 
21 
22 #include "oscl_base.h"
23 #include "oscl_mem_auto_ptr.h"
24 #include "oscl_mem_basic_functions.h"
25 #include "pvmf_return_codes.h"
26 #include "pv_interface.h"
27 
28 
29 /**
30    Identifies the specific observer session
31 **/
32 typedef int32 PVMFSessionId;
33 
34 /**
35    Identifies the specific API/command that was invoked
36 **/
37 typedef int32 PVMFCommandType;
38 
39 /**
40    A unique command id identifying an invocation of any command
41 **/
42 typedef int32 PVMFCommandId;
43 
44 typedef enum
45 {
46     PVMFCmdRespEvent,
47     PVMFErrorEvent,
48     PVMFInfoEvent,
49     PVMFEventLast
50 } PVMFEventCategory;
51 
52 /**
53    Identifies the type of event (error & informational)
54 **/
55 typedef int32 PVMFEventType;
56 
57 
58 /**
59    The base class for PVMF callback events
60 **/
61 class PVMFEventBase
62 {
63     public:
PVMFEventBase()64         PVMFEventBase() {}
65 
~PVMFEventBase()66         virtual ~PVMFEventBase() {};
67 
68         /**
69          * @return the event's category.
70          */
71         OSCL_IMPORT_REF virtual PVMFEventCategory IsA() const = 0;
72 };
73 
74 /**
75  * PVMFCmdResp Class
76  *
77  * PVMFCmdResp class is used to pass completion status on previously issued
78  * commands
79  **/
80 class OSCL_IMPORT_REF PVMFCmdResp : public PVMFEventBase
81 {
82     public:
83         /**
84          * Constructor for PVMFCmdResp
85          */
86         PVMFCmdResp(PVMFCommandId aId,
87                     const OsclAny* aContext,
88                     PVMFStatus aStatus,
89                     OsclAny* aEventData = NULL):
iId(aId)90                 iId(aId),
91                 iContext(aContext),
92                 iStatus(aStatus),
93                 iEventExtInterface(NULL),
94                 iEventData(aEventData)
95         {
96             iEventDataLengthAvailable = false;
97             iEventDataLength = 0;
98         }
99 
100         /**
101          * Constructor for PVMFCmdResp
102          */
PVMFCmdResp(PVMFCommandId aId,const OsclAny * aContext,PVMFStatus aStatus,PVInterface * aEventExtInterface)103         PVMFCmdResp(PVMFCommandId aId,
104                     const OsclAny* aContext,
105                     PVMFStatus aStatus,
106                     PVInterface* aEventExtInterface):
107                 iId(aId),
108                 iContext(aContext),
109                 iStatus(aStatus),
110                 iEventExtInterface(aEventExtInterface),
111                 iEventData(NULL)
112         {
113             iEventDataLengthAvailable = false;
114             iEventDataLength = 0;
115         }
116 
117         /**
118          * Constructor for PVMFCmdResp
119          */
PVMFCmdResp(PVMFCommandId aId,const OsclAny * aContext,PVMFStatus aStatus,PVInterface * aEventExtInterface,OsclAny * aEventData)120         PVMFCmdResp(PVMFCommandId aId,
121                     const OsclAny* aContext,
122                     PVMFStatus aStatus,
123                     PVInterface* aEventExtInterface,
124                     OsclAny* aEventData):
125                 iId(aId),
126                 iContext(aContext),
127                 iStatus(aStatus),
128                 iEventExtInterface(aEventExtInterface),
129                 iEventData(aEventData)
130         {
131             iEventDataLengthAvailable = false;
132             iEventDataLength = 0;
133         }
134 
~PVMFCmdResp()135         virtual ~PVMFCmdResp() {}
136 
137         OSCL_IMPORT_REF virtual PVMFEventCategory IsA() const;
138 
139         /**
140          * @return Returns the unique ID associated with a command of this type.
141          */
GetCmdId()142         PVMFCommandId GetCmdId()const
143         {
144             return iId;
145         }
146 
147         /**
148          * @return Returns the opaque data that was passed in with the command.
149          */
GetContext()150         const OsclAny* GetContext()const
151         {
152             return iContext;
153         }
154 
155         /**
156          * @return Returns the completion status of the command
157          */
GetCmdStatus()158         PVMFStatus GetCmdStatus()const
159         {
160             return iStatus;
161         }
162 
163         /**
164          * This method is going to be deprecated soon. We intend to remove
165          * the opaque event data and use PVInterface pointer if needed to
166          * retrieve more information regarding command completion
167          *
168          *
169          * @return Returns additional data asociated with the command/event.  This is to be interpreted
170          based on the type and the return status
171         */
GetEventData()172         OsclAny* GetEventData()const
173         {
174             return iEventData;
175         }
176 
177         /**
178          * This method is going to be deprecated soon. We intend to remove
179          * the opaque event data and use PVInterface pointer if needed to
180          * retrieve more information regarding command completion.Therefore,
181          * with the removal of event data, setting length of event data wont be of any significance either.
182          *
183          * @param1 - (uint32) length of event data in bytes.
184          * @return PVMFSuccess, if length of event data can be set.
185          PVMFFailure, if length of event data can't be set.
186         */
SetEventDataLen(uint32 aEventDataLength)187         PVMFStatus SetEventDataLen(uint32 aEventDataLength)
188         {
189             PVMFStatus status = PVMFFailure;
190             if (iEventData)
191             {
192                 iEventDataLengthAvailable = true;
193                 iEventDataLength = aEventDataLength;
194                 status = PVMFSuccess;
195             }
196             return status;
197         }
198 
199         /**
200          * This method is going to be deprecated soon. We intend to remove
201          * the opaque event data and use PVInterface pointer if needed to
202          * retrieve more information regarding command completion.Therefore,
203          * with the removal of event data, length if event data wont be needed either.
204          *
205          * @param1 - bool& aEventDataLenAvailable
206          *           false - length of event data(in bytes) is not available
207          *           true - length of event data(in bytes) is available
208          * @param2 - uint32& aEventDataLength
209          *           length of eventdata in bytes
210          */
GetEventDataLen(bool & aEventDataLenAvailable,uint32 & aEventDataLength)211         void GetEventDataLen(bool& aEventDataLenAvailable, uint32& aEventDataLength)const
212         {
213             aEventDataLenAvailable = false;
214             aEventDataLength = 0;
215             if (iEventDataLengthAvailable)
216             {
217                 aEventDataLenAvailable = true;
218                 aEventDataLength = iEventDataLength;
219             }
220         }
221 
222         /**
223          * @return Returns the eventinfointerface
224          */
GetEventExtensionInterface()225         PVInterface* GetEventExtensionInterface() const
226         {
227             return iEventExtInterface;
228         }
229 
230     protected:
231         PVMFCommandId   iId;
232         const OsclAny* iContext;
233         PVMFStatus iStatus;
234         PVInterface*  iEventExtInterface;
235         /**
236          * We STRONGLY DISCOURAGE use of this. This field will be deprecated
237          * soon.
238          */
239         OsclAny* iEventData;
240         bool iEventDataLengthAvailable;
241         uint32 iEventDataLength;
242 };
243 
244 
245 /**
246  * PVMFAsyncEvent Class
247  *
248  * PVMFAsyncEvent is the base class used to pass unsolicited error and informational
249  * indications to the user. Additional information can be tagged based on the specific
250  * event
251  **/
252 #define PVMF_ASYNC_EVENT_LOCAL_BUF_SIZE 16
253 class OSCL_IMPORT_REF PVMFAsyncEvent : public PVMFEventBase
254 {
255     public:
PVMFAsyncEvent(PVMFEventCategory aEventCategory,PVMFEventType aEventType,OsclAny * aContext,OsclAny * aEventData)256         PVMFAsyncEvent(PVMFEventCategory aEventCategory,
257                        PVMFEventType aEventType,
258                        OsclAny* aContext,
259                        OsclAny* aEventData) :
260                 iEventCategory(aEventCategory)
261                 , iEventType(aEventType)
262                 , iEventExtInterface(NULL)
263                 , iLocalBufferSize(0)
264                 , iContext(aContext)
265                 , iEventData(aEventData)
266         {
267             oscl_memset(iLocalBuffer, 0, PVMF_ASYNC_EVENT_LOCAL_BUF_SIZE);
268             iEventDataLengthAvailable = false;
269             iEventDataLength = 0;
270         }
271 
PVMFAsyncEvent(PVMFEventCategory aEventCategory,PVMFEventType aEventType,OsclAny * aContext,OsclAny * aEventData,const void * aLocalBuffer,const size_t aLocalBufferSize)272         PVMFAsyncEvent(PVMFEventCategory aEventCategory,
273                        PVMFEventType aEventType,
274                        OsclAny* aContext,
275                        OsclAny* aEventData,
276                        const void* aLocalBuffer,
277                        const size_t aLocalBufferSize) :
278                 iEventCategory(aEventCategory)
279                 , iEventType(aEventType)
280                 , iEventExtInterface(NULL)
281                 , iLocalBufferSize(aLocalBufferSize)
282                 , iContext(aContext)
283                 , iEventData(aEventData)
284         {
285             if (aLocalBuffer)
286             {
287                 OSCL_ASSERT(iLocalBufferSize <= PVMF_ASYNC_EVENT_LOCAL_BUF_SIZE);
288                 if (iLocalBufferSize > PVMF_ASYNC_EVENT_LOCAL_BUF_SIZE)
289                 {
290                     iLocalBufferSize = PVMF_ASYNC_EVENT_LOCAL_BUF_SIZE;
291                 }
292 
293                 oscl_memcpy(iLocalBuffer, aLocalBuffer, iLocalBufferSize);
294             }
295             iEventDataLengthAvailable = false;
296             iEventDataLength = 0;
297         }
298 
PVMFAsyncEvent(PVMFEventCategory aEventCategory,PVMFEventType aEventType,OsclAny * aContext,PVInterface * aEventExtInterface,OsclAny * aEventData)299         PVMFAsyncEvent(PVMFEventCategory aEventCategory,
300                        PVMFEventType aEventType,
301                        OsclAny* aContext,
302                        PVInterface* aEventExtInterface,
303                        OsclAny* aEventData) :
304                 iEventCategory(aEventCategory)
305                 , iEventType(aEventType)
306                 , iEventExtInterface(aEventExtInterface)
307                 , iLocalBufferSize(0)
308                 , iContext(aContext)
309                 , iEventData(aEventData)
310         {
311             oscl_memset(iLocalBuffer, 0, PVMF_ASYNC_EVENT_LOCAL_BUF_SIZE);
312             iEventDataLengthAvailable = false;
313             iEventDataLength = 0;
314         }
315 
PVMFAsyncEvent(PVMFEventCategory aEventCategory,PVMFEventType aEventType,OsclAny * aContext,PVInterface * aEventExtInterface,OsclAny * aEventData,const void * aLocalBuffer,const size_t aLocalBufferSize)316         PVMFAsyncEvent(PVMFEventCategory aEventCategory,
317                        PVMFEventType aEventType,
318                        OsclAny* aContext,
319                        PVInterface* aEventExtInterface,
320                        OsclAny* aEventData,
321                        const void* aLocalBuffer,
322                        const size_t aLocalBufferSize) :
323                 iEventCategory(aEventCategory)
324                 , iEventType(aEventType)
325                 , iEventExtInterface(aEventExtInterface)
326                 , iLocalBufferSize(aLocalBufferSize)
327                 , iContext(aContext)
328                 , iEventData(aEventData)
329         {
330             if (aLocalBuffer)
331             {
332                 OSCL_ASSERT(iLocalBufferSize <= PVMF_ASYNC_EVENT_LOCAL_BUF_SIZE);
333                 if (iLocalBufferSize > PVMF_ASYNC_EVENT_LOCAL_BUF_SIZE)
334                 {
335                     iLocalBufferSize = PVMF_ASYNC_EVENT_LOCAL_BUF_SIZE;
336                 }
337 
338                 oscl_memcpy(iLocalBuffer, aLocalBuffer, iLocalBufferSize);
339             }
340             iEventDataLengthAvailable = false;
341             iEventDataLength = 0;
342         }
343 
~PVMFAsyncEvent()344         virtual ~PVMFAsyncEvent() {}
345 
346         OSCL_IMPORT_REF virtual PVMFEventCategory IsA() const;
347 
348         /**
349          * @return Returns the unique type identifier of the event.
350          */
GetEventType()351         PVMFEventType GetEventType()const
352         {
353             return iEventType;
354         }
355 
356         /**
357          * This method is going to be deprecated soon. We intend to remove
358          * the opaque event data and use PVInterface pointer if needed to
359          * retrieve more information regarding command completion
360          *
361          *
362          * @return Returns additional data asociated with the event.
363          *         This is to be interpreted
364          *         based on the type and the return status
365          */
GetEventData()366         OsclAny* GetEventData() const
367         {
368             return iEventData;
369         }
370 
371         /**
372          * This method is going to be deprecated soon. We intend to remove
373          * the opaque event data and use PVInterface pointer if needed to
374          * retrieve more information regarding command completion.Therefore,
375          * with the removal of event data, setting length of event data wont be of any significance either.
376          *
377          * @param1 - (uint32) length of event data in bytes.
378          * @return PVMFSuccess, if length of event data can be set.
379          PVMFFailure, if length of event data can't be set.
380         */
SetEventDataLen(uint32 aEventDataLength)381         PVMFStatus SetEventDataLen(uint32 aEventDataLength)
382         {
383             PVMFStatus status = PVMFFailure;
384             if (iEventData)
385             {
386                 iEventDataLengthAvailable = true;
387                 iEventDataLength = aEventDataLength;
388                 status = PVMFSuccess;
389             }
390             return status;
391         }
392 
393         /**
394          * This method is going to be deprecated soon. We intend to remove
395          * the opaque event data and use PVInterface pointer if needed to
396          * retrieve more information regarding command completion.Therefore,
397          * with the removal of event data, length if event data wont be needed either.
398          *
399          * @param1 - bool& aEventDataLenAvailable
400          *           false - length of event data(in bytes) is not available
401          *           true - length of event data(in bytes) is available
402          * @param2 - uint32& aEventDataLength
403          *           length of eventdata in bytes
404          */
GetEventDataLen(bool & aEventDataLenAvailable,uint32 & aEventDataLength)405         void GetEventDataLen(bool& aEventDataLenAvailable, uint32& aEventDataLength)const
406         {
407             aEventDataLenAvailable = false;
408             aEventDataLength = 0;
409             if (iEventDataLengthAvailable)
410             {
411                 aEventDataLenAvailable = true;
412                 aEventDataLength = iEventDataLength;
413             }
414         }
415 
416         /**
417          * @return Returns the size of the local data asociated with the event.
418          */
GetLocalBufferSize()419         size_t GetLocalBufferSize() const
420         {
421             return iLocalBufferSize;
422         }
423 
424         /**
425          * @return Returns the local data asociated with the event.
426          * TODO: This is a const method returning a non const ref to some
427          * internal array.
428          */
GetLocalBuffer()429         uint8* GetLocalBuffer() const
430         {
431             return (uint8*)iLocalBuffer;
432         }
433 
434         /**
435          * @return Returns the opaque data associated with the callback type.
436          */
GetContext()437         const OsclAny* GetContext()const
438         {
439             return iContext;
440         }
441 
442         /**
443          * @return Returns the eventinfointerface
444          */
GetEventExtensionInterface()445         PVInterface* GetEventExtensionInterface() const
446         {
447             return iEventExtInterface;
448         }
449 
450     protected:
451         PVMFEventCategory iEventCategory;
452         PVMFEventType iEventType;
453         PVInterface*  iEventExtInterface;
454         uint8 iLocalBuffer[PVMF_ASYNC_EVENT_LOCAL_BUF_SIZE];
455         size_t iLocalBufferSize;
456         OsclAny* iContext;
457         /**
458          * We STRONGLY DISCOURAGE use of this. This field will be deprecated
459          * soon.
460          */
461         OsclAny* iEventData;
462         bool iEventDataLengthAvailable;
463         uint32 iEventDataLength;
464 };
465 
466 #endif // PVMF_EVENT_HANDLING_H_INCLUDED
467