Re: [PATCH] Introduce dvbpsi_new2() which calls logging callback with extra context parameter
Jean-Paul Saman <[email protected]>
| Newsgroups | gmane.comp.video.videolan.libdvbpsi.devel |
|---|---|
| Message-ID | <CAK9US3Cvw1Pxo8TqPm7iLmJp2T=+D7p=rubQ6yYpSn_Aa+dBfw@mail.gmail.com> |
Hi Andrey, Thanks for the patch, but I hate to spoil it for you ;) On Sun, May 26, 2013 at 8:09 PM, Andrey Utkin < [email protected]> wrote: > This does not break original dvbpsi_new() mechanism. > Rationale: when dvbpsi contexts are created in many objects, you may > need to figure out, which object is the owner. > --- > src/dvbpsi.c | 19 +++++++++++++++++++ > src/dvbpsi.h | 8 ++++++++ > 2 files changed, 27 insertions(+) > The functionality you require is already present in libdvbpsi in the form of a private pointer inside the dvbpsi_t structure, from dvbpsi.h header file: /***************************************************************************** * dvbpsi_t *****************************************************************************/ /*! * \struct dvbpsi_s * \brief DVBPSI handle structure * * This structure provides a handle to libdvbpsi API and should be used instead * of dvbpsi_decoder_t. */ /*! * \typedef struct dvbpsi_s dvbpsi_t * \brief dvbpsi_t type definition. */ struct dvbpsi_s { dvbpsi_decoder_t *p_decoder; /*!< private pointer to specific decoder */ /* Messages callback */ dvbpsi_message_cb pf_message; /*!< Log message callback */ enum dvbpsi_msg_level i_msg_level; /*!< Log level */ /* private data pointer for use by caller, not by libdvbpsi itself ! */ void *p_sys; /*!< pointer to private data from caller. Do not use from inside libdvbpsi. It will crash any application. */ }; The p_sys pointer can be used to attach your context. I think the documentation for this could be improved, since you missed this use case. In addtion each PSI table attache function "dvbpsi_XXX_attach()" also allows for passing private data to the callback function. The example program dvbinfo makes use of this mechanism to pass on a 'context'. The function libdvbpsi_init() shows you how to use this, eg: lines 1747 (dvbpsi_pat_attach function), 648 (PAT callback function) Kind regards, Jean-Paul Saman. > diff --git a/src/dvbpsi.c b/src/dvbpsi.c > index 4d27720..e9a9ad9 100644 > --- a/src/dvbpsi.c > +++ b/src/dvbpsi.c > @@ -60,6 +60,19 @@ dvbpsi_t *dvbpsi_new(dvbpsi_message_cb callback, enum > dvbpsi_msg_level level) > return p_dvbpsi; > } > > +dvbpsi_t *dvbpsi_new2(void *context, dvbpsi_message_cb2 callback, enum > dvbpsi_msg_level level) > +{ > + dvbpsi_t *p_dvbpsi = calloc(1, sizeof(dvbpsi_t)); > + if (p_dvbpsi == NULL) > + return NULL; > + > + p_dvbpsi->p_decoder = NULL; > + p_dvbpsi->context = context; > + p_dvbpsi->pf_message2 = callback; > + p_dvbpsi->i_msg_level = level; > + return p_dvbpsi; > +} > + > > /***************************************************************************** > * dvbpsi_delete > > *****************************************************************************/ > @@ -537,6 +550,8 @@ void dvbpsi_message(dvbpsi_t *dvbpsi, const > dvbpsi_msg_level_t level, const char > if (err > DVBPSI_MSG_NONE) { > if (dvbpsi->pf_message) > dvbpsi->pf_message(dvbpsi, level, msg); > + else if (dvbpsi->pf_message2) > + dvbpsi->pf_message2(dvbpsi->context, dvbpsi, level, msg); > } > free(msg); > } > @@ -563,6 +578,8 @@ void dvbpsi_message(dvbpsi_t *dvbpsi, const > dvbpsi_msg_level_t level, const char > if (err > 0) { \ > if (dvbpsi->pf_message) \ > dvbpsi->pf_message(dvbpsi, level, msg); \ > + else if (dvbpsi->pf_message2) \ > + dvbpsi->pf_message2(dvbpsi->context, dvbpsi, level, msg);\ > } \ > free(msg); \ > } while(0); > @@ -581,6 +598,8 @@ void dvbpsi_message(dvbpsi_t *dvbpsi, const > dvbpsi_msg_level_t level, const char > if (err > 0) { \ > if (dvbpsi->pf_message) \ > dvbpsi->pf_message(dvbpsi, level, msg); \ > + else if (dvbpsi->pf_message2) \ > + dvbpsi->pf_message2(dvbpsi->context, dvbpsi, level, msg);\ > } \ > free(msg); \ > } while(0); > diff --git a/src/dvbpsi.h b/src/dvbpsi.h > index 062a9db..cb28b96 100644 > --- a/src/dvbpsi.h > +++ b/src/dvbpsi.h > @@ -95,6 +95,11 @@ typedef void (* dvbpsi_message_cb)(dvbpsi_t *handle, > const dvbpsi_msg_level_t level, > const char* msg); > > +typedef void (* dvbpsi_message_cb2)(void *context, > + dvbpsi_t *handle, > + const dvbpsi_msg_level_t level, > + const char* msg); > + > > /***************************************************************************** > * dvbpsi_decoder_t > > *****************************************************************************/ > @@ -145,6 +150,8 @@ struct dvbpsi_s > specific > decoder */ > /* Messages callback */ > dvbpsi_message_cb pf_message; /*!< Log message > callback */ > + void *context; > + dvbpsi_message_cb2 pf_message2; /*!< Log message > callback */ > enum dvbpsi_msg_level i_msg_level; /*!< Log level */ > > /* private data pointer for use by caller, not by libdvbpsi itself ! > */ > @@ -169,6 +176,7 @@ struct dvbpsi_s > * handle must be freed with dvbpsi_delete(). > */ > dvbpsi_t *dvbpsi_new(dvbpsi_message_cb callback, enum dvbpsi_msg_level > level); > +dvbpsi_t *dvbpsi_new2(void *context, dvbpsi_message_cb2 callback, enum > dvbpsi_msg_level level); > > > /***************************************************************************** > * dvbpsi_delete > -- > 1.8.1.5 > > _______________________________________________ > libdvbpsi-devel mailing list > [email protected] > http://mailman.videolan.org/listinfo/libdvbpsi-devel > _______________________________________________ libdvbpsi-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libdvbpsi-devel