From 41887e90168fec96c109225aa011359a0218fea8 Mon Sep 17 00:00:00 2001 From: Sam Hatchett Date: Wed, 27 Jul 2022 16:37:49 -0400 Subject: [PATCH] adds client callback API function --- include/epanet2_2.h | 12 ++++++++++++ src/epanet.c | 13 +++++++++++++ src/project.c | 2 ++ src/report.c | 6 ++++++ src/types.h | 5 ++++- 5 files changed, 37 insertions(+), 1 deletion(-) diff --git a/include/epanet2_2.h b/include/epanet2_2.h index 18ef127..ddd1db7 100644 --- a/include/epanet2_2.h +++ b/include/epanet2_2.h @@ -517,6 +517,18 @@ typedef struct Project *EN_Project; ********************************************************************/ + /** + @brief Set a user-supplied callback function for reporting + @param ph an EPANET project handle. + @param callback a function pointer with declared signature, which gets called by EPANET for reporting. + @return an error code. + @details The report callback function must have the signature specified - void(void* userData, EN_Project, char*) - + use the userData parameter to pass any client context necessary (a context pointer or wrapper object perhaps). + Leave un-set or set the report callback to NULL to revert to EPANET's default behavior. + **/ + int DLLEXPORT EN_setReportCallback(EN_Project ph, void (*callback)(void *userData, void *EN_projectHandle, char*)); + int DLLEXPORT EN_setReportCallbackUserData(EN_Project ph, void *userData); + /** @brief Writes a line of text to a project's report file. @param ph an EPANET project handle. diff --git a/src/epanet.c b/src/epanet.c index 9a3c194..6c2ba3d 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -841,6 +841,19 @@ int DLLEXPORT EN_closeQ(EN_Project p) ********************************************************************/ + + int DLLEXPORT EN_setReportCallback(EN_Project p, void (*callback)(void*,void*,char*)) + { + p->report.reportCallback = callback; + return 0; + } + + int DLLEXPORT EN_setReportCallbackUserData(EN_Project p, void *userData) + { + p->report.reportCallbackUserData = userData; + return 0; + } + int DLLEXPORT EN_writeline(EN_Project p, char *line) /*---------------------------------------------------------------- ** Input: line = line of text diff --git a/src/project.c b/src/project.c index b470ec3..40f5639 100644 --- a/src/project.c +++ b/src/project.c @@ -281,6 +281,8 @@ void initpointers(Project *pr) pr->hydraul.smatrix.NZSUB = NULL; pr->hydraul.smatrix.LNZ = NULL; + pr->report.reportCallback = NULL; + initrules(pr); } diff --git a/src/report.c b/src/report.c index 8fc6d16..2922332 100644 --- a/src/report.c +++ b/src/report.c @@ -885,6 +885,12 @@ void writeline(Project *pr, char *s) **-------------------------------------------------------------- */ { + if (pr->report.reportCallback != NULL) + { + pr->report.reportCallback(pr->report.reportCallbackUserData, pr, s); + return; + } + Report *rpt = &pr->report; if (rpt->RptFile == NULL) return; diff --git a/src/types.h b/src/types.h index b0e91b5..27d2fd7 100755 --- a/src/types.h +++ b/src/types.h @@ -629,7 +629,10 @@ typedef struct { Rpt2Fname[MAXFNAME+1], // Secondary report file name DateStamp[26]; // Current date & time - SField Field[MAXVAR]; // Output reporting fields + SField Field[MAXVAR]; // Output reporting fields + + void (*reportCallback)(void*,void*,char*); // user-supplied reporting callback + void *reportCallbackUserData; // user-supplied reporting context } Report;