[PATCH] Introduce dvbpsi_new2() which calls logging callback with extra context parameter

Andrey Utkin <[email protected]>
Newsgroups gmane.comp.video.videolan.libdvbpsi.devel
Message-ID <[email protected]>
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(+)

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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.