summaryrefslogtreecommitdiffstats
path: root/nsframework/framework_unified/client/NS_FrameworkCore/src/frameworkunified_dispatcher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'nsframework/framework_unified/client/NS_FrameworkCore/src/frameworkunified_dispatcher.cpp')
-rw-r--r--nsframework/framework_unified/client/NS_FrameworkCore/src/frameworkunified_dispatcher.cpp2382
1 files changed, 2382 insertions, 0 deletions
diff --git a/nsframework/framework_unified/client/NS_FrameworkCore/src/frameworkunified_dispatcher.cpp b/nsframework/framework_unified/client/NS_FrameworkCore/src/frameworkunified_dispatcher.cpp
new file mode 100644
index 00000000..250edce2
--- /dev/null
+++ b/nsframework/framework_unified/client/NS_FrameworkCore/src/frameworkunified_dispatcher.cpp
@@ -0,0 +1,2382 @@
+/*
+ * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+///////////////////////////////////////////////////////////////////////////////
+/// \ingroup tag_NSFramework
+/// \brief
+///
+///
+///
+///////////////////////////////////////////////////////////////////////////////
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/epoll.h>
+#include <sys/eventfd.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <fcntl.h>
+#include <pthread.h>
+
+#include <native_service/ns_logger_if.h>
+#include <native_service/ns_version_if.h>
+#include <native_service/ns_message_center_if.h>
+#include <native_service/frameworkunified_framework_sync.h>
+#include <native_service/frameworkunified_sm_hsmframework.h>
+#include <native_service/frameworkunified_sm_framework_dispatch.h>
+#include <native_service/frameworkunified_thread_priority.h>
+#include <native_service/ns_plogger_if.h>
+#include <native_service/ns_resource_controler.h>
+#include <native_service/frameworkunified_service_protocol.h>
+#include <native_service/frameworkunified_dispatcher.h>
+#include <native_service/frameworkunified_framework_if.h>
+#include <other_service/strlcpy.h>
+
+#include <string>
+#include <utility>
+#include <map>
+
+#include "frameworkunified_framework_core.h"
+#include "frameworkunified_framework_internal.h"
+#include "ns_message_center_internal.h"
+#include "ns_mc_internal.h"
+#include "frameworkunified_framework_error_internal.hpp"
+#include "frameworkunified_framework_utility.h"
+#include "frameworkunified_sm_framework_core.h"
+
+#ifdef DISPATCHER_PROFILER
+#include "frameworkunified_msgprofiler.h"
+#include <boost/bind.hpp>
+#endif
+
+/*
+ * static variable
+ */
+static FrameworkunifiedDefaultCallbackHandler g_defaultCallbackHandler;
+
+//////////////////////////
+// prototype declaration
+//////////////////////////
+static EFrameworkunifiedStatus GetDispatcherMqFD(HANDLE hApp, int *fd);
+static EFrameworkunifiedStatus CreateMultiWaitingFD(HANDLE hApp);
+static EFrameworkunifiedStatus ProcessMq(HANDLE hApp);
+static EFrameworkunifiedStatus ProcessFd(HANDLE hApp , int fd);
+
+//////////////////////////////////////////
+// Function : ostream &operator<<
+//////////////////////////////////////////
+template <typename K, typename V, class C, class A>
+std::ostream &operator<< (std::ostream &os, const std::map<K, V, C, A> &m) {
+ os << "{ ";
+ typename std::map<K, V, C, A>::const_iterator p;
+ for (p = m.begin(); p != m.end(); ++p) {
+ os << p->first << ":" << p->second << ", ";
+ }
+ return os << "}";
+}
+
+EFrameworkunifiedStatus CreateDispatcher(PCSTR cAppName, HANDLE &hApp, BOOL bIsChildThread) { // NOLINT (readability/nolint)
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ CFrameworkunifiedFrameworkApp *pApp = new CFrameworkunifiedFrameworkApp; // LCOV_EXCL_BR_LINE 11:except branch
+ if (pApp != NULL) { // LCOV_EXCL_BR_LINE 5:fail safe for new
+ pApp->checkCode = APP_CHECK_CODE;
+ pApp->self = pthread_self();
+ // app name size should not exceed the max length
+ memset(pApp->cAppName, 0, MAX_NAME_SIZE_APP);
+ memset(pApp->sServiceAvailabilityNotification, 0, MAX_SYS_INFO_SIZE);
+ pApp->bIsAvailable = FALSE;
+ /*
+ * todo
+ * Setting NULL for arguments causes an Exception
+ */
+ if (strlen(cAppName) < MAX_NAME_SIZE_APP) {
+ memcpy(pApp->cAppName, cAppName, strlen(cAppName));
+ } else {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, " Error : Aborting ... Exceeds Max App name size MAX_NAME_SIZE_APP : %d ",
+ MAX_NAME_SIZE_APP);
+ /*
+ * Error is set here, but the error is overwritten by the following process
+ */
+ eStatus = eFrameworkunifiedStatusFail;
+ }
+
+ FRAMEWORKUNIFIEDLOG0(ZONE_NS_DIS, __FUNCTION__, " Application Created ");
+
+ // opening handle to receive message for the application
+ pApp->hAppRcvMsgQ = NULL;
+ if (NULL == (pApp->hAppRcvMsgQ = McOpenReceiver(pApp->cAppName))) {
+ FRAMEWORKUNIFIEDLOG0(ZONE_NS_ERR, __FUNCTION__, " Error : Failed to McOpenReceiver ");
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ } else {
+ if (strcmp(cAppName, "NS_NPPService") != 0) {
+ McFlushReceiver(pApp->hAppRcvMsgQ);
+ }
+ }
+
+ // opening socket for abnormal monitoring
+ pApp->siMonitorSock = -1;
+ if ((eFrameworkunifiedStatusOK == eStatus) && (-1 == (pApp->siMonitorSock = mcOpenMonitor(pApp->cAppName)))) {
+ FRAMEWORKUNIFIEDLOG0(ZONE_NS_ERR, __FUNCTION__, " Error : Failed to mcOpenMonitor ");
+ eStatus = eFrameworkunifiedStatusFail;
+ pApp->siMonitorSock = -1;
+ }
+
+ // opening handle to send messages to itself
+ pApp->hAppSndMsgQ = NULL;
+ if ((eFrameworkunifiedStatusOK == eStatus) && (NULL == (pApp->hAppSndMsgQ = McOpenSender(pApp->cAppName)))) {
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG0(ZONE_NS_ERR, __FUNCTION__, " Error : Failed to McOpenSender ");
+ // LCOV_EXCL_BR_STOP
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ }
+
+ // opening handles for Notification Persistence Service and Service Directory
+ pApp->hNPSndMsgQ = NULL;
+ if ((eFrameworkunifiedStatusOK == eStatus) &&
+ (NULL == (pApp->hNPSndMsgQ = FrameworkunifiedMcOpenSender(reinterpret_cast<HANDLE>(pApp), FRAMEWORKUNIFIED_NS_NPSERVICE)))) {
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, " Error : Failed to FrameworkunifiedMcOpenSender < NS_NPPService >");
+ // LCOV_EXCL_BR_STOP
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ }
+
+ // stores the message queue handle of the parent thread.
+ // It will set after the dispatcher of child thread is created. And will be NULL for main thread.
+ pApp->hParentSndMsgQ = NULL;
+
+ if ((eFrameworkunifiedStatusOK == eStatus) && (!bIsChildThread)) {
+ // Define any system callback's with the dispatcher.
+ if (eFrameworkunifiedStatusOK != (eStatus = FrameworkunifiedAttachSystemCallbacksDispatcher(reinterpret_cast<HANDLE>(pApp)))) {
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, " Error :: (%d) Failed to FrameworkunifiedAttachSystemCallbacksDispatcher ", eStatus);
+ // LCOV_EXCL_BR_STOP
+ }
+
+ if (eFrameworkunifiedStatusOK == eStatus) {
+ // Define the logger callback's for setting up gets and sets with the dispatcher.
+ if (eFrameworkunifiedStatusOK != (eStatus = FrameworkunifiedAttachLoggerCallbacksDispatcher(reinterpret_cast<HANDLE>(pApp)))) {
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, " Error :: (%d) Failed to FrameworkunifiedAttachLoggerCallbacksDispatcher ", eStatus);
+ // LCOV_EXCL_BR_STOP
+ }
+ }
+ }
+
+ // initialize
+ pApp->m_pFrameworkunifiedStateMachine = NULL;
+ pApp->uiProtocolCmd = 0;
+
+ // Clear the Defer'ed message pop flag.
+ pApp->fPopDeferedMsg = FALSE;
+
+ // Clear the Defer'ed sync response flag.
+ pApp->fDeferredSyncResponse = FALSE;
+
+ // buffer initialize
+ memset(pApp->uiMsgRcvBuffer, 0, MAX_MSGQ_BUFFER);
+ memset(pApp->cMsgSrcName, '\0', MAX_NAME_SIZE_APP);
+ memset(pApp->cSystemInfo, '\0', MAX_SYS_INFO_SIZE);
+
+ pApp->defer_evfd = -1;
+ pApp->efd = -1;
+ if (eFrameworkunifiedStatusOK == eStatus) {
+ eStatus = CreateMultiWaitingFD((HANDLE)pApp);
+ if (eFrameworkunifiedStatusOK != eStatus) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : CreateMultiWaitingFD Failed, status=%d", eStatus);
+ }
+ }
+
+#ifdef DISPATCHER_PROFILER
+ // Assign default value
+ pApp->m_pFrameworkunifiedMsgProfiler = NULL;
+#endif
+
+ if (eFrameworkunifiedStatusOK != eStatus) {
+ if (NULL != pApp->hAppRcvMsgQ) {
+ McClose(pApp->hAppRcvMsgQ);
+ pApp->hAppRcvMsgQ = NULL;
+ }
+
+ if (0 < pApp->siMonitorSock) {
+ mcCloseMonitor(pApp->cAppName);
+ pApp->siMonitorSock = -1;
+ }
+
+ if (NULL != pApp->hAppSndMsgQ) {
+ McClose(pApp->hAppSndMsgQ);
+ pApp->hAppSndMsgQ = NULL;
+ }
+
+ if (NULL != pApp->hNPSndMsgQ) {
+ FrameworkunifiedMcClose(pApp->hNPSndMsgQ);
+ pApp->hNPSndMsgQ = NULL;
+ }
+
+ // LCOV_EXCL_BR_START 6:According to line 158, pApp->hParentSndMsgQ is NULL.
+ if (NULL != pApp->hParentSndMsgQ) {
+ // LCOV_EXCL_BR_STOP
+ // LCOV_EXCL_START 6:According to line 158, pApp->hParentSndMsgQ is NULL.
+ AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
+ McClose(pApp->hParentSndMsgQ);
+ pApp->hParentSndMsgQ = NULL;
+ // LCOV_EXCL_STOP
+ }
+
+ if (0 < pApp->defer_evfd) {
+ close(pApp->defer_evfd);
+ pApp->defer_evfd = -1;
+ }
+
+ if (0 < pApp->efd) {
+ close(pApp->efd);
+ pApp->efd = -1;
+ }
+
+ delete pApp; // LCOV_EXCL_BR_LINE 11:except branch
+ pApp = NULL;
+ }
+ }
+
+ hApp = pApp;
+
+ return eStatus;
+}
+
+
+//////////////////////////////////////////
+// Function : FrameworkunifiedCreateDispatcher
+//////////////////////////////////////////
+EFrameworkunifiedStatus FrameworkunifiedCreateDispatcher(PCSTR cAppName, HANDLE &hApp, BOOL bIsChildThread) { // NOLINT (readability/nolint)
+ return CreateDispatcher(cAppName, hApp, bIsChildThread);
+}
+
+
+//////////////////////////////////////////
+// Function : FrameworkunifiedDispatchBlock
+//////////////////////////////////////////
+EFrameworkunifiedStatus FrameworkunifiedDispatchBlock(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+// FRAMEWORKUNIFIEDLOG0(ZONE_NS_DIS, __FUNCTION__, "+");
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ if (eFrameworkunifiedStatusOK != (eStatus = McReceiveWithSession(pApp->hAppRcvMsgQ, pApp->cMsgSrcName,
+ &pApp->uiProtocolCmd, &pApp->uiSessionId, MAX_MSGQ_BUFFER,
+ (PVOID)(pApp->uiMsgRcvBuffer)))) {
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error :: (%d) Failed on McReceive", eStatus);
+ // LCOV_EXCL_BR_STOP
+ } else {
+// FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "Message received on dispatcher:: Source: %s, Cmd: 0x%X, SessionId: %d ",
+// pApp->cMsgSrcName, pApp->uiProtocolCmd, pApp->uiSessionId);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+// FRAMEWORKUNIFIEDLOG0(ZONE_NS_DIS, __FUNCTION__, "-");
+ return eStatus;
+}
+
+
+EFrameworkunifiedStatus FrameworkunifiedProcessServiceProtocolCallback(HANDLE hApp, PCSTR pRequester) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ Services::iterator s_iterator;
+
+ s_iterator = pApp->services.find(pRequester);
+ if (s_iterator != pApp->services.end()) {
+ SessionTable::iterator session_iterator;
+ session_iterator = (s_iterator->second).find(pApp->uiSessionId);
+ if (session_iterator != (s_iterator->second).end()) {
+ // FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, " %s found :: (%s) ", pApp->cMsgSrcName, s_iterator->second);
+
+ // find the protocol req/ack handler
+ ServiceProtocolTable::iterator spt_iterator;
+ spt_iterator = (session_iterator->second).find(pApp->uiProtocolCmd);
+ if (spt_iterator != (session_iterator->second).end()) {
+ // calling the protocol req/ack handler
+ eStatus = (*spt_iterator).second(hApp);
+ } else if ((session_iterator->second).end() != (spt_iterator =
+ (session_iterator->second).find(FRAMEWORKUNIFIED_ANY_COMMAND))) {
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__,
+ "Processing callback function for (FRAMEWORKUNIFIED_ANY_COMMAND). "
+ "Dispatcher protocol command: (0x%x)", pApp->uiProtocolCmd);
+ // LCOV_EXCL_BR_STOP
+ eStatus = (*spt_iterator).second(hApp);
+ } else {
+ eStatus = eFrameworkunifiedStatusMsgNotProcessed;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusMsgNotProcessed;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusMsgNotProcessed;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedProcessServiceProtocol(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ // Check if the callback is associated with the Protocol for message source
+ eStatus = FrameworkunifiedProcessServiceProtocolCallback(hApp, const_cast<PCSTR>(pApp->cMsgSrcName));
+
+ if (eFrameworkunifiedStatusMsgNotProcessed == eStatus) {
+ // Check if the callback is associated with the Protocol for FRAMEWORKUNIFIED_ANY_SOURCE
+ eStatus = FrameworkunifiedProcessServiceProtocolCallback(hApp, FRAMEWORKUNIFIED_ANY_SOURCE);
+ if (eFrameworkunifiedStatusMsgNotProcessed == eStatus) {
+ if (pApp->m_pFrameworkunifiedStateMachine) {
+ // Check if the HSM event is associated with the Protocol for message source
+ eStatus = FrameworkunifiedProcessServiceProtocolHSMEvent(hApp, const_cast<PCSTR>(pApp->cMsgSrcName));
+
+ if (eFrameworkunifiedStatusMsgNotProcessed == eStatus) {
+ // Check if the HSM event is associated with the Protocol for FRAMEWORKUNIFIED_ANY_SOURCE
+ eStatus = FrameworkunifiedProcessServiceProtocolHSMEvent(hApp, FRAMEWORKUNIFIED_ANY_SOURCE);
+ }
+ }
+ }
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ return eStatus;
+}
+
+
+EFrameworkunifiedStatus FrameworkunifiedSetDeferredSyncResponse(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusInvldBuf;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ pApp->fDeferredSyncResponse = TRUE;
+ eStatus = eFrameworkunifiedStatusOK;
+ }
+
+ return eStatus;
+}
+
+
+static void frameworkunifiedProcessSyncResponse(HANDLE hApp, EFrameworkunifiedStatus retValue) {
+ EFrameworkunifiedStatus eStatus;
+ CHAR systemInfo[MAX_SYS_INFO_SIZE];
+ UI_32 seq_id;
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ if (frameworkunifiedGetIsTypeOfSync(hApp) == TRUE) {
+ if (pApp->fDeferredSyncResponse == TRUE) {
+ if (pApp->responsedata.size() != 0) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_WAR, __FUNCTION__, "Response data is ignored for "
+ ":: source: %s, Protocol Command: 0x%x, Session Id: %u.",
+ pApp->cMsgSrcName != 0 ? pApp->cMsgSrcName : NULL,
+ pApp->uiProtocolCmd, pApp->uiSessionId);
+ pApp->responsedata.clear();
+ }
+ } else {
+ FrameworkunifiedGetSystemInfo(hApp, systemInfo);
+ seq_id = (UI_32)strtoul(systemInfo, NULL, 16);
+
+ eStatus = frameworkunifiedSendSyncResponse(hApp, PROTOCOL_FRAMEWORKUNIFIED_ANY_COMMAND, seq_id, retValue, pApp->responsedata.size(),
+ pApp->responsedata.data());
+ if (eStatus != eFrameworkunifiedStatusOK) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "retValu:%d errno:%d", eStatus, errno);
+ }
+ pApp->responsedata.clear();
+ }
+ } else {
+ if (pApp->responsedata.size() != 0) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_WAR, __FUNCTION__, "Response data is ignored for :: "
+ "source: %s, Protocol Command: 0x%x, Session Id: %u.",
+ pApp->cMsgSrcName != 0 ? pApp->cMsgSrcName : NULL,
+ pApp->uiProtocolCmd, pApp->uiSessionId);
+ pApp->responsedata.clear();
+ }
+ }
+ pApp->fDeferredSyncResponse = FALSE;
+}
+
+
+inline static time_t frameworkunifiedTimeval2usec(const struct timeval &time) {
+ return static_cast<time_t>(time.tv_sec * 1000000 + time.tv_usec);
+}
+
+
+static void frameworkunifiedPrintRusage(HANDLE hApp, const struct rusage &start, const struct rusage &end) {
+ UI_32 occupy_time;
+ UI_32 average;
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ occupy_time = static_cast<UI_32>(frameworkunifiedTimeval2usec(end.ru_utime) - frameworkunifiedTimeval2usec(start.ru_utime));
+ occupy_time += static_cast<UI_32>(frameworkunifiedTimeval2usec(end.ru_stime) - frameworkunifiedTimeval2usec(start.ru_stime));
+
+ pApp->total_occupy_time += occupy_time;
+ pApp->total_run_count++;
+ average = static_cast<UI_32>(pApp->total_occupy_time / pApp->total_run_count);
+
+ if (occupy_time > pApp->max_occupy_time) {
+ pApp->max_occupy_time = occupy_time;
+ }
+
+// FRAMEWORKUNIFIEDLOG(ZONE_NS_DEBUG_DUMP, __FUNCTION__, "cur:%d.%06d avg:%d.%06d max:%d.%06d",
+// occupy_time / 1000000, occupy_time % 1000000,
+// average / 1000000, average % 1000000,
+// pApp->max_occupy_time / 1000000, pApp->max_occupy_time % 1000000);
+}
+
+
+static inline void frameworkunifiedGetRusage(struct rusage *r) {
+ if (r == NULL) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __func__, "r is NULL");
+ return;
+ }
+ memset(r, 0, sizeof(struct rusage));
+ if (getrusage(RUSAGE_THREAD, r) == -1) {
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "getrusage errno:%d", errno);
+ // LCOV_EXCL_BR_STOP
+ }
+}
+
+static int frameworkunifiedPushLostSessionInfo(HANDLE hApp, PCSTR serviceName) {
+ int cntFound = 0;
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ ServiceSessionTable::iterator s_iterator = pApp->sessiontable.find(serviceName);
+ if (s_iterator != pApp->sessiontable.end()) {
+ // LCOV_EXCL_BR_START 11:except branch
+ SessionHandleTable::iterator sh_iterator = pApp->sessiontable[serviceName].begin();
+ // LCOV_EXCL_BR_STOP
+ while (sh_iterator != pApp->sessiontable[serviceName].end()) {
+ LostSessionInfo l_info;
+ l_info.sServiceName = serviceName;
+ l_info.iSessionId = sh_iterator->first;
+ pApp->lostSessionQueue.push(l_info);
+ cntFound++;
+ sh_iterator++;
+ }
+ }
+ return cntFound;
+}
+
+///
+/// Abnormal monitor(server): Client socket close handle
+///
+EFrameworkunifiedStatus frameworkunifiedProcessClientAbnormalState(HANDLE hApp, int sockfd) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ AcceptMonitorTable::iterator it;
+
+ if ((it = pApp->acceptMonitorTable.find(sockfd)) == pApp->acceptMonitorTable.end()) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : %d, Invalid fd", sockfd);
+ } else {
+ char clientName[16];
+ if (mcGetClientNameFromConnectKey((it->second).c_str(), clientName, sizeof(clientName)) < 0) {
+ eStatus = eFrameworkunifiedStatusFail;
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : Invlid connectKey:%s", (it->second).c_str());
+ // LCOV_EXCL_BR_STOP
+ } else {
+ if (pApp->lostSessionHandler != NULL) {
+ int cntFound = frameworkunifiedPushLostSessionInfo(hApp, clientName);
+ if (cntFound) {
+ // calling lost session handler
+ try {
+ eStatus = pApp->lostSessionHandler(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Recovering from: %s", e.what());
+ eStatus = eFrameworkunifiedStatusErrOther;
+ }
+ }
+ }
+ }
+ pApp->acceptMonitorTable.erase(sockfd);
+ }
+
+ return eStatus; // LCOV_EXCL_BR_LINE 11:except branch
+}
+
+///
+/// Abnormal monitor(server): Add
+///
+EFrameworkunifiedStatus frameworkunifiedAddAcceptMonitor(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ int acceptSock;
+
+ if ((acceptSock = mcGetAcceptMonitor(pApp->cAppName, pApp->cMsgSrcName)) < 0) {
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : mcGetAcceptMonitor srv:%s clnt:%s",
+ pApp->cAppName != 0 ? pApp->cAppName : NULL, pApp->cMsgSrcName != 0 ? pApp->cMsgSrcName : NULL);
+ // LCOV_EXCL_BR_STOP
+ eStatus = eFrameworkunifiedStatusFail;
+ } else {
+ char connectKey[32];
+ mcSetConnectKey(connectKey, sizeof(connectKey), pApp->cAppName, pApp->cMsgSrcName);
+ pApp->acceptMonitorTable.insert(std::make_pair(acceptSock, connectKey));
+ }
+
+ return eStatus;
+}
+
+///
+/// Abnormal monitor(server): Del
+///
+EFrameworkunifiedStatus frameworkunifiedDelAcceptMonitor(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ long acceptSock; // NOLINT (readability/nolint)
+
+ char connectKey[32];
+ mcSetConnectKey(connectKey, sizeof(connectKey), pApp->cAppName, pApp->cMsgSrcName);
+ if (frameworkunifiedGetResource(FRAMEWORKUNIFIED_RES_ABNMLMON, connectKey, &acceptSock) < 0) {
+ eStatus = eFrameworkunifiedStatusFail;
+ } else {
+ if (pApp->acceptMonitorTable.find(static_cast<Socket>(acceptSock)) != pApp->acceptMonitorTable.end()) {
+ pApp->acceptMonitorTable.erase(static_cast<Socket>(acceptSock));
+ }
+ }
+
+ return eStatus;
+}
+
+///
+/// Abnormal monitor(client): Server socket close handle
+///
+EFrameworkunifiedStatus frameworkunifiedProcessServerAbnormalState(HANDLE hApp, int sockfd) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ ConnectMonitorTable::iterator it;
+
+ if ((it = pApp->connectMonitorTable.find(sockfd)) == pApp->connectMonitorTable.end()) {
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : %d, Invalid fd", sockfd);
+ // LCOV_EXCL_BR_STOP
+ } else {
+ char serverName[16];
+ if (mcGetServerNameFromConnectKey((it->second).c_str(), serverName, sizeof(serverName)) < 0) {
+ eStatus = eFrameworkunifiedStatusFail;
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : Invlid connectKey:%s", (it->second).c_str());
+ // LCOV_EXCL_BR_STOP
+ } else {
+ if (pApp->lostSessionHandler != NULL) {
+ int cntFound = frameworkunifiedPushLostSessionInfo(hApp, serverName); // LCOV_EXCL_BR_LINE 11:except branch
+ if (cntFound) {
+ // calling lost session handler
+ try {
+ eStatus = pApp->lostSessionHandler(hApp);
+ } catch (const std::exception &e) {
+ // LCOV_EXCL_BR_START 15:marco defined in "native_service/ns_logger_if.h"
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Recovering from: %s", e.what());
+ // LCOV_EXCL_BR_STOP
+ eStatus = eFrameworkunifiedStatusErrOther;
+ }
+ }
+ }
+ }
+ pApp->connectMonitorTable.erase(sockfd);
+ }
+
+ return eStatus; // LCOV_EXCL_BR_LINE 11:except branch
+}
+
+///
+/// Abnormal monitor(client): Add
+///
+EFrameworkunifiedStatus frameworkunifiedAddConnectMonitor(HANDLE hApp, PCSTR serverName, PCSTR clientName) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ int connectSock = mcConnectMonitor(serverName, clientName);
+ if (connectSock < 0) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error::%s:%s mcConnectMonitor",
+ serverName != 0 ? serverName : NULL, pApp->cAppName != 0 ? pApp->cAppName : NULL);
+ eStatus = eFrameworkunifiedStatusFail;
+ } else {
+ if (pApp->connectMonitorTable.find(connectSock) == pApp->connectMonitorTable.end()) {
+ char connectKey[32];
+ mcSetConnectKey(connectKey, sizeof(connectKey), serverName, clientName);
+
+ struct epoll_event event;
+ event.events = EPOLLRDHUP;
+ event.data.fd = connectSock;
+
+ if (epoll_ctl(pApp->efd, EPOLL_CTL_ADD, connectSock, &event) < 0) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : epoll_ctl:%s", strerror(errno));
+ eStatus = eFrameworkunifiedStatusFail;
+ }
+
+ if (eStatus == eFrameworkunifiedStatusOK) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ pApp->connectMonitorTable.insert(std::make_pair(connectSock, connectKey));
+ }
+ }
+ }
+
+ return eStatus;
+}
+
+///
+/// Abnormal monitor(client): Del
+///
+EFrameworkunifiedStatus frameworkunifiedDelConnectMonitor(HANDLE hApp, PCSTR serverName, PCSTR clientName) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ char connectKey[32];
+ mcSetConnectKey(connectKey, sizeof(connectKey), serverName, clientName);
+
+ long connectSock; // NOLINT (readability/nolint)
+ if (frameworkunifiedGetResource(FRAMEWORKUNIFIED_RES_ABNMLMON, connectKey, &connectSock) < 0) {
+ eStatus = eFrameworkunifiedStatusFail;
+ } else {
+ if (pApp->connectMonitorTable.find(static_cast<Socket>(connectSock)) != pApp->connectMonitorTable.end()) {
+ pApp->connectMonitorTable.erase(static_cast<Socket>(connectSock));
+ }
+
+ if (epoll_ctl(pApp->efd, EPOLL_CTL_DEL, static_cast<int>(connectSock), NULL) < 0) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : epoll_ctl:%s", strerror(errno));
+ eStatus = eFrameworkunifiedStatusFail;
+ }
+ }
+
+ return eStatus;
+}
+
+///
+/// Abnormal monitor(common): Attach callback
+///
+EFrameworkunifiedStatus FrameworkunifiedAttachLostSessionCallbackToDispatcher(HANDLE hApp, CbFuncPtr fpLostSession) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp) == FALSE || fpLostSession == NULL) {
+ eStatus = eFrameworkunifiedStatusInvldParam;
+ } else {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ pApp->lostSessionHandler = fpLostSession;
+ }
+
+ return eStatus;
+}
+
+///
+/// Abnormal monitor(common): Get lost session data
+///
+EFrameworkunifiedStatus FrameworkunifiedGetLostSessionData(HANDLE hApp, PSTR pServiceName, PUI_32 puiSessionId) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp) == FALSE || pServiceName == NULL || puiSessionId == NULL) {
+ eStatus = eFrameworkunifiedStatusInvldParam;
+ } else {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ if (pApp->lostSessionQueue.empty()) {
+ eStatus = eFrameworkunifiedStatusAccessError;
+ } else {
+ LostSessionInfo info = pApp->lostSessionQueue.front();
+ pApp->lostSessionQueue.pop();
+ strcpy(pServiceName, info.sServiceName.c_str()); // NOLINT (readability/nolint)
+ *puiSessionId = info.iSessionId;
+ }
+ }
+
+ return eStatus;
+}
+
+
+//////////////////////////////////////////
+// Function : FrameworkunifiedDispatchProcess
+//////////////////////////////////////////
+EFrameworkunifiedStatus FrameworkunifiedDispatchProcess(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ // FRAMEWORKUNIFIEDLOG0(ZONE_NS_DIS, __FUNCTION__, "+");
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ struct rusage start, end;
+ BOOL enable_rusage = NsLogIsZoneSet(ZONE_NS_DEBUG_DUMP);
+
+ if (enable_rusage == TRUE) {
+ frameworkunifiedGetRusage(&start);
+ }
+
+ if (0 != strcmp(FRAMEWORKUNIFIED_NS_NPSERVICE, pApp->cMsgSrcName)) { // < if not from NPP service
+ switch (pApp->uiProtocolCmd) {
+ case PROTOCOL_REGISTER_EVENTS: {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_IMP_INFO, __FUNCTION__, "%s subscribing to session event on sessionid %d",
+ pApp->cMsgSrcName != 0 ? pApp->cMsgSrcName : NULL, pApp->uiSessionId);
+
+ eStatus = ProcessProtocolEvents(hApp);
+ }
+ break;
+
+ case PROTOCOL_UNREGISTER_EVENTS: {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_IMP_INFO, __FUNCTION__, "%s unsubscribing private event on sessionid %d",
+ pApp->cMsgSrcName != 0 ? pApp->cMsgSrcName : NULL, pApp->uiSessionId);
+
+ eStatus = UnregisterPrivateEvents(hApp);
+ }
+ break;
+
+ case PROTOCOL_CLOSE_SESSION_REQ:
+ case PROTOCOL_CLOSE_SESSION_REQ_SYNC: {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_IMP_INFO, __FUNCTION__, "Close session request received from %s",
+ pApp->cMsgSrcName != 0 ? pApp->cMsgSrcName : NULL);
+
+ // Handle the session events on the close session request
+ (VOID)HandleSessionEventOnCloseSession(hApp);
+
+ frameworkunifiedDelAcceptMonitor(hApp);
+
+ eStatus = FrameworkunifiedProcessServiceProtocol(hApp);
+ }
+ break;
+
+ case PROTOCOL_OPEN_SESSION_REQ:
+ case PROTOCOL_OPEN_SESSION_REQ_SYNC: {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_IMP_INFO, __FUNCTION__, "Open session request received from %s",
+ pApp->cMsgSrcName != 0 ? pApp->cMsgSrcName : NULL);
+
+ eStatus = FrameworkunifiedProcessServiceProtocol(hApp);
+ if (eStatus == eFrameworkunifiedStatusOK) {
+ frameworkunifiedAddAcceptMonitor(hApp);
+ }
+ }
+ break;
+
+ default: {
+ eStatus = FrameworkunifiedProcessServiceProtocol(hApp);
+ }
+ break;
+ }
+ } else {
+ NotificationTable::iterator n_iterator;
+ FrameworkunifiedGetSystemInfo(pApp, pApp->cSystemInfo);
+ n_iterator = pApp->notifications.find(static_cast<PSTR>(pApp->cSystemInfo));
+ if (n_iterator != pApp->notifications.end()) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, " Notification found in NS_NP :: (%s)."
+ " Processing callback function.", n_iterator->first.c_str());
+ eStatus = (*n_iterator).second(hApp);
+ } else {
+ NotificationEventTable::iterator n_iterator;
+ FrameworkunifiedGetSystemInfo(pApp, pApp->cSystemInfo);
+ n_iterator = pApp->notificationevents.find(static_cast<PSTR>(pApp->cSystemInfo));
+ if (n_iterator != pApp->notificationevents.end()) {
+ CFrameworkunifiedHSMFramework *l_pStateMachine = FrameworkunifiedGetStateMachine(hApp);
+ if (l_pStateMachine) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, " Notification found in NS_NP :: (%s)."
+ " Processing HSM event.", n_iterator->first.c_str());
+ eStatus = l_pStateMachine->FrameworkunifiedPostEvent(n_iterator->second);
+ }
+ } else {
+ /// Paul A. Dennis (FOUND BUG)
+ /// For Persistent Data NS_NP sends the data back as a normal command not via the
+ /// notification logic... The Ack's for NPReadPersistedData,NPRegisterFilePath and
+ /// NPLoadFileFromPersistentStorage were never getting back
+ /// to the requester because its's not looking in the correct location.
+ /// So, Check the Services to see if the user has defined the Ack commands via the
+ /// services map
+ eStatus = FrameworkunifiedProcessServiceProtocol(hApp);
+ }
+ }
+ }
+
+ frameworkunifiedProcessSyncResponse(hApp, eStatus);
+
+ if ((eStatus != eFrameworkunifiedStatusOK) && (eStatus != eFrameworkunifiedStatusExit) && (eStatus != eFrameworkunifiedStatusMsgNotProcessed)) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, " Error :: %d, (%s) Event Info :: (%s), (%d), (%s)",
+ eStatus,
+ pApp->cAppName != 0 ? static_cast<PSTR>(pApp->cAppName) : NULL,
+ pApp->cMsgSrcName != 0 ? static_cast<PSTR>(pApp->cMsgSrcName) : NULL,
+ pApp->uiProtocolCmd,
+ pApp->cSystemInfo != 0 ? static_cast<PSTR>(pApp->cSystemInfo) : NULL);
+ }
+
+ if (eStatus == eFrameworkunifiedStatusMsgNotProcessed) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_WAR, __FUNCTION__, "WARNING:: No handler found for :: "
+ "Source: %s, Protocol Command: 0x%x, Session Id: %u.",
+ pApp->cMsgSrcName != 0 ? pApp->cMsgSrcName : NULL,
+ pApp->uiProtocolCmd, pApp->uiSessionId);
+ FrameworkunifiedClearMsgData(hApp);
+ eStatus = eFrameworkunifiedStatusOK;
+ } else {
+// FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "Message processed. Status (0x%X) ::"
+// " Source: %s Command: 0x%x SessionId: %d.",
+// eStatus, pApp->cMsgSrcName != 0 ? pApp->cMsgSrcName : NULL,
+// pApp->uiProtocolCmd, pApp->uiSessionId);
+ }
+
+ if (enable_rusage == TRUE) {
+ frameworkunifiedGetRusage(&end);
+ frameworkunifiedPrintRusage(hApp, start, end);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ // FRAMEWORKUNIFIEDLOG0(ZONE_NS_DIS, __FUNCTION__, "-");
+ return eStatus;
+}
+
+
+
+
+//////////////////////////////////////////
+// Function : FrameworkunifiedCloseDispatcher
+//////////////////////////////////////////
+EFrameworkunifiedStatus FrameworkunifiedCloseDispatcher(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ pApp->checkCode = 0;
+
+ if (NULL != pApp->hAppRcvMsgQ) {
+ McClose(pApp->hAppRcvMsgQ);
+ pApp->hAppRcvMsgQ = NULL;
+ }
+
+ if (pApp->siMonitorSock) {
+ mcCloseMonitor(pApp->cAppName);
+ pApp->siMonitorSock = 0;
+ }
+
+ if (NULL != pApp->hAppSndMsgQ) {
+ McClose(pApp->hAppSndMsgQ);
+ pApp->hAppSndMsgQ = NULL;
+ }
+
+ if (NULL != pApp->hNPSndMsgQ) {
+ FrameworkunifiedMcClose(pApp->hNPSndMsgQ);
+ pApp->hNPSndMsgQ = NULL;
+ }
+
+ if (NULL != pApp->hParentSndMsgQ) {
+ McClose(pApp->hParentSndMsgQ);
+ pApp->hParentSndMsgQ = NULL;
+ }
+
+ if (0 < pApp->defer_evfd) {
+ close(pApp->defer_evfd);
+ pApp->defer_evfd = 0;
+ }
+
+ if (0 < pApp->efd) {
+ close(pApp->efd);
+ pApp->efd = 0;
+ }
+
+ delete(pApp);
+ pApp = NULL; // mb20110110 Added per comment 216
+ // NOTE: However, client still needs to set his own pointer to NULL
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ return eStatus;
+}
+
+//////////////////////////////////////////
+// Function : FrameworkunifiedPopedDeferedMessage
+//////////////////////////////////////////
+BOOL FrameworkunifiedPopedDeferedMessage(HANDLE hApp) {
+ BOOL rtnFlag = FALSE;
+
+ // LCOV_EXCL_BR_START 6:FrameworkunifiedPopedDeferedMessage is internal function, hApp is checked in extenal API
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ // LCOV_EXCL_BR_STOP
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ // check if the pop flag is send and there is something to pop!
+ if (pApp->fPopDeferedMsg && !pApp->deferedMsgQueue.empty()) {
+ // get the message at the top\front of the queue
+ DeferedMsgInfo defered(pApp->deferedMsgQueue.front());
+
+ // remove this item from the queue using pop
+ pApp->deferedMsgQueue.pop();
+
+ // copy the data into the pApp
+ pApp->uiProtocolCmd = defered.uiProtocolCmd;
+ strlcpy(pApp->cMsgSrcName, defered.cMsgSrcName, sizeof(pApp->cMsgSrcName));
+ std::memcpy(pApp->uiMsgRcvBuffer, defered.uiMsgRcvBuffer, MAX_MSGQ_BUFFER);
+
+ // clear the pop flag!
+ pApp->fPopDeferedMsg = FALSE;
+
+ // set the return flag TRUE, we have pop'ed
+ rtnFlag = TRUE;
+ }
+ }
+
+ return rtnFlag;
+}
+
+
+
+//////////////////////////////////////////
+// Function : FrameworkunifiedDispatcher
+//////////////////////////////////////////
+EFrameworkunifiedStatus FrameworkunifiedDispatcher(PCSTR cAppName, const FrameworkunifiedDefaultCallbackHandler *CbHandler) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "In");
+ return FrameworkunifiedDispatcherWithArguments(cAppName, 0, NULL, CbHandler);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+// FrameworkunifiedDispatcherWithArguments
+// Creates, initializes and runs the dispatcher
+///////////////////////////////////////////////////////////////////////////////////////////
+EFrameworkunifiedStatus FrameworkunifiedDispatcherWithArguments(PCSTR cAppName, int argc, char *argv[],
+ const FrameworkunifiedDefaultCallbackHandler *CbHandler,
+ CustomCommandLineOptions *cmdLineOptions) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (cAppName == NULL) {
+ return eFrameworkunifiedStatusNullPointer;
+ }
+
+ NsLogSetProcessName(cAppName);
+ PLOG_TEXT("FrameworkunifiedDispatcher Start");
+ // set main thread name as provided in dispatcher
+ pthread_setname_np(pthread_self(), cAppName);
+
+ FRAMEWORKUNIFIEDLOG0(ZONE_NS_DIS, __FUNCTION__, "In");
+
+ if ((eStatus = RegistDefaultCbHandler(CbHandler)) != eFrameworkunifiedStatusOK) {
+ return eStatus;
+ }
+
+ try {
+ HANDLE hFrameworkApp = NULL;
+
+ if (eFrameworkunifiedStatusOK == (eStatus = FrameworkunifiedCreateDispatcher(cAppName, hFrameworkApp, FALSE))) {
+ // LCOV_EXCL_BR_START 6:if FrameworkunifiedCreateDispatcher return eFrameworkunifiedStatusOK, hFrameworkApp is not NULL
+ if (NULL != hFrameworkApp) {
+ // LCOV_EXCL_BR_STOP
+ THApp hApp(hFrameworkApp);
+
+ /// Parse the Arguments via the FrameworkunifiedArgumentParser
+ /// passing an handle to the app and argument list
+ eStatus = FrameworkunifiedArgumentParser(hApp, argc, argv, cmdLineOptions);
+
+ if (eFrameworkunifiedStatusOK == eStatus) {
+ eStatus = FrameworkunifiedDispatcherMain(hApp);
+ }
+ } else {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "hFrameworkApp is NULL");
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ }
+ } else {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "FrameworkunifiedCreateDispatcher error, status=%d", eStatus);
+ }
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: Failed to FrameworkunifiedCreateDispatcher: %s", e.what());
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ }
+
+
+ return eStatus;
+}
+
+// required for parsing subargument of -r
+char *g_cPlogSubOpts[] = {
+#define PLOG_OUTPUT 0
+ const_cast<PSTR>("output"),
+ NULL
+};
+
+EFrameworkunifiedStatus FrameworkunifiedArgumentParser(HANDLE hApp, int argc, char *argv[], CustomCommandLineOptions *cmdLineOptions) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ TFrameworkunifiedZoneMask mask = {};
+ PCHAR l_cMask = NULL;
+ UI_32 l_iMaskCount = 0;
+ CHAR l_logoutput[MAX_QUEUE_NAME_SIZE];
+ CHAR l_tFilePath[MAX_PATH_LENGTH];
+
+ BOOL l_bHasConfigFilepath = FALSE;
+
+ SI_32 l_iOpt = 0;
+ SI_32 l_iPriority = 10;
+ PSTR l_cOptions;
+ PSTR l_cValue;
+
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "In");
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+#ifdef DISPATCHER_PROFILER
+ CFrameworkunifiedFrameworkApp *pApp = reinterpret_cast< CFrameworkunifiedFrameworkApp * >(hApp);
+#endif
+
+ if (argc > 0 && argv != NULL) {
+ // l:m:t:c: options are reserved for NS Framework and should not be used by other FRAMEWORKUNIFIED Applications.
+ CHAR l_cNSOptions[MAX_STRING_SIZE_TAG] = {};
+
+ strncpy(l_cNSOptions, "l:m:c:p:qr:s", (MAX_STRING_SIZE_TAG - 1));
+ optind = 1;
+
+ if (NULL != cmdLineOptions) {
+ // append custom options
+ strncat(l_cNSOptions, cmdLineOptions->cShortOptions, (MAX_STRING_SIZE_TAG - strlen(l_cNSOptions) - 1));
+ }
+ while ((eFrameworkunifiedStatusOK == eStatus) && ((l_iOpt = getopt(argc, argv, l_cNSOptions)) != -1)) {
+ switch (l_iOpt) {
+ case 'm': // mask value..
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "-m (mask value): %s", optarg);
+ /*
+ * @todo
+ * If the second of the command-line arguments is-m and the third is not, an exception occurs.
+ */
+ char *saveptr;
+ l_cMask = strtok_r(optarg, ",", &saveptr);
+
+ while (NULL != l_cMask) {
+ mask[l_iMaskCount++] = static_cast<TFrameworkunifiedZone>(strtoul(l_cMask, NULL, 16));
+ l_cMask = strtok_r(NULL, ",", &saveptr);
+ }
+ NsLogSetControlMask(mask);
+ break;
+ case 'l': // log output
+ strncpy(l_logoutput, optarg, (MAX_QUEUE_NAME_SIZE - 1));
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "-l (log output option): %s", l_logoutput);
+ NsLogSetLogMethod(NsLogDetermineLogMethod(l_logoutput));
+ break;
+ case 'c': // config file option
+ strncpy(l_tFilePath, optarg, (MAX_PATH_LENGTH - 1));
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "-c (set config file): %s", l_tFilePath);
+ eStatus = SetConfigHandle(hApp, l_tFilePath);
+ l_bHasConfigFilepath = TRUE;
+ break;
+ case 'p': // priority
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "-p (set priority): %s", optarg);
+ if (eFrameworkunifiedStatusOK != frameworkunified::framework::CFrameworkunifiedThreadPriorities::ParseThreadArguments(optarg)) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_WAR, __FUNCTION__, "WARNING!! Failed to parse sub arguments of -p");
+ }
+ l_iPriority = frameworkunified::framework::CFrameworkunifiedThreadPriorities::GetPriority(FrameworkunifiedGetAppName(hApp));
+ // set only if valid prio, otherwise use the default one
+ if (FRAMEWORKUNIFIED_PRIORITY_NOT_FOUND != l_iPriority) {
+ pthread_setschedprio(pthread_self(),
+ frameworkunified::framework::CFrameworkunifiedThreadPriorities::GetPriority(FrameworkunifiedGetAppName(hApp)));
+ }
+ break;
+ case 'q':
+#ifdef DISPATCHER_PROFILER
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "-q (set msg dispatcher profiler)");
+ FrameworkunifiedMsgProfiler::m_bMsgProfilerEnabled = TRUE;
+ pApp->m_pFrameworkunifiedMsgProfiler = new(nothrow) FrameworkunifiedMsgProfiler(FrameworkunifiedGetAppName(hApp));
+#endif
+ break;
+ case 'r':
+ NSLogEnablePLog(TRUE);
+ l_cOptions = optarg;
+ while (*l_cOptions != '\0') {
+ switch (getsubopt(&l_cOptions, g_cPlogSubOpts, &l_cValue)) {
+ case PLOG_OUTPUT: {
+ if (l_cValue != NULL) {
+ NSLogSetPlogOutputOptions(static_cast<UI_8>(strtoul(l_cValue, NULL, 16)));
+ }
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ }
+ break;
+ case 's':
+ NSLogEnableSysEventLog(TRUE);
+ break;
+ default:
+ if (NULL != cmdLineOptions) {
+ // option other than l:m:t:c: is a custom option, therefore let application handle that option.
+ if (eFrameworkunifiedStatusOK != cmdLineOptions->callback(l_iOpt, optarg)) {
+ // Do not terminate an application even if invalid arguments received
+ // eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_WAR, __FUNCTION__, "WARNING!! Invalid cmd line argument received.");
+ }
+ } else {
+ // Do not terminate an application even if invalid arguments received
+ // eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_WAR, __FUNCTION__, "WARNING!! Invalid cmd line argument received.");
+ }
+ break;
+ }
+ }
+ }
+
+ // if no config option is selected then use the default config path
+ if ((FALSE == l_bHasConfigFilepath) && (eFrameworkunifiedStatusOK == eStatus)) {
+ eStatus = SetDefaultConfigFile(hApp);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ return eStatus;
+}
+
+//////////////////////////////////////////
+// Function : FrameworkunifiedSimpleDispatcher
+//////////////////////////////////////////
+EFrameworkunifiedStatus FrameworkunifiedSimpleDispatcher(PCSTR cAppName, const FrameworkunifiedDefaultCallbackHandler *CbHandler, CbFuncPtr CbShutdown,
+ BOOL isChildThread) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ // if main thread then set log process name
+ if (!isChildThread) {
+ NsLogSetProcessName(cAppName);
+ }
+
+ if ((eStatus = RegistDefaultCbHandler(CbHandler)) != eFrameworkunifiedStatusOK) {
+ return eStatus;
+ }
+
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "+");
+
+ if (NULL != CbShutdown) {
+ try {
+ HANDLE hFrameworkApp = NULL;
+
+ if (eFrameworkunifiedStatusOK == (eStatus = FrameworkunifiedCreateDispatcher(cAppName, hFrameworkApp, isChildThread))) {
+ // LCOV_EXCL_BR_START 6:if FrameworkunifiedCreateDispatcher return eFrameworkunifiedStatusOK, hFrameworkApp is not NULL
+ if (NULL != hFrameworkApp) {
+ // LCOV_EXCL_BR_STOP
+ THApp hApp(hFrameworkApp);
+
+ // Call application defined start function
+ eStatus = FrameworkunifiedOnInitializationInternal(hApp);
+
+ if (eFrameworkunifiedStatusOK != eStatus) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "FrameworkunifiedOnInitialization failed ");
+ throw happ_error();
+ } else {
+ while (eFrameworkunifiedStatusExit != eStatus) {
+ try {
+ // dispatch block: waits on receive message
+ if (eFrameworkunifiedStatusOK != (eStatus = FrameworkunifiedDispatchBlock(hApp))) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: FrameworkunifiedDispatchBlock : 0x%x ", eStatus);
+ continue;
+ }
+ // dispatch process: calls respective call back functions
+ if (eFrameworkunifiedStatusOK != (eStatus = FrameworkunifiedDispatchProcess(hApp))) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: FrameworkunifiedDispatchProcess : 0x%x ", eStatus);
+ }
+ } catch (const frameworkunified::framework::error::CSystemError &err) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR :: %s", err.what());
+ eStatus = eFrameworkunifiedStatusErrOther;
+ FrameworkunifiedSendSystemErrMessage(hApp, err.m_eSystemError);
+ } catch (const std::exception &err) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Recovering from: %s", err.what());
+ eStatus = eFrameworkunifiedStatusErrOther;
+ }
+ }
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Exiting dispatcher ");
+ }
+ // Call application defined stop function
+ eStatus = CbShutdown(hApp);
+ } else {
+ FRAMEWORKUNIFIEDLOG0(ZONE_NS_ERR, __FUNCTION__, "hFrameworkApp is NULL");
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ }
+ } else {
+ FRAMEWORKUNIFIEDLOG0(ZONE_NS_ERR, __FUNCTION__, "FrameworkunifiedCreateDispatcher error, status=%d", eStatus);
+ }
+ } catch (const THApp::Exception &) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: Failed to FrameworkunifiedCreateDispatcher ");
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusFail;
+ }
+
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "-");
+ return eStatus;
+}
+
+EFrameworkunifiedStatus RunDispatcher(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ int efd;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+#ifdef DISPATCHER_PROFILER
+ // Get the application handle
+ CFrameworkunifiedFrameworkApp *pApp = reinterpret_cast< CFrameworkunifiedFrameworkApp * >(hApp);
+ if (NULL != pApp->m_pFrameworkunifiedMsgProfiler) {
+ FrameworkunifiedAttachMsgProfilerCallbacksDispatcher(hApp);
+ }
+#endif
+ FrameworkunifiedGetDispatcherFD(hApp, &efd);
+
+ while (1) {
+ frameworkunifiedFdHandler(hApp, efd);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ return eStatus;
+}
+
+
+EFrameworkunifiedStatus FrameworkunifiedDispatcherMain(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ try {
+ FRAMEWORKUNIFIEDLOG0(ZONE_NS_DIS, __FUNCTION__, "Success: FrameworkunifiedCreateDispatcher ");
+
+ // Initialize the global structures
+ // register service with service dir
+ // register notifications
+ FRAMEWORKUNIFIEDLOG_PERFORMANCE_DEBUG("FrameworkunifiedOnInitialization +");
+ eStatus = FrameworkunifiedOnInitializationInternal(hApp);
+ FRAMEWORKUNIFIEDLOG_PERFORMANCE_DEBUG("FrameworkunifiedOnInitialization -");
+
+ if (eFrameworkunifiedStatusOK != eStatus) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "FrameworkunifiedOnInitialization failed ");
+ throw happ_error();
+ } else {
+ eStatus = RunDispatcher(hApp);
+ CFrameworkunifiedSyncData::FrameworkunifiedReleaseSyncDataInstance();
+ }
+ } catch (const frameworkunified::framework::error::CSystemError &err) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR :: %s", err.what());
+ eStatus = eFrameworkunifiedStatusErrOther;
+ FrameworkunifiedSendSystemErrMessage(hApp, err.m_eSystemError);
+ } catch (const THApp::Exception &) {
+ FRAMEWORKUNIFIEDLOG0(ZONE_NS_ERR, __FUNCTION__, "Error: Failed to FrameworkunifiedCreateDispatcher ");
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedCreateDispatcherWithoutLoop(PCSTR cAppName, HANDLE &hApp, int argc, char *argv[], // NOLINT (readability/nolint)
+ const FrameworkunifiedDefaultCallbackHandler *CbHandler,
+ BOOL bIsConnectSM, CustomCommandLineOptions *cmdLineOptions) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ THApp *l_hApp = NULL;
+
+ if (cAppName == NULL) {
+ return eFrameworkunifiedStatusNullPointer;
+ }
+
+ NsLogSetProcessName(cAppName);
+
+ PLOG_TEXT("FrameworkunifiedDispatcher Start");
+ // set main thread name as provided in dispatcher
+ pthread_setname_np(pthread_self(), cAppName);
+
+ if ((eStatus = RegistDefaultCbHandler(CbHandler)) != eFrameworkunifiedStatusOK) {
+ return eStatus;
+ }
+
+ FRAMEWORKUNIFIEDLOG0(ZONE_NS_DIS, __FUNCTION__, "In");
+
+ try {
+ HANDLE hFrameworkApp = NULL;
+
+ if (eFrameworkunifiedStatusOK == (eStatus = FrameworkunifiedCreateDispatcher(cAppName, hFrameworkApp,
+ bIsConnectSM == TRUE ? FALSE : TRUE))) {
+ // LCOV_EXCL_BR_START 6:if FrameworkunifiedCreateDispatcher return eFrameworkunifiedStatusOK, hFrameworkApp is not NULL
+ if (NULL != hFrameworkApp) {
+ // LCOV_EXCL_BR_STOP
+ l_hApp = new THApp(hFrameworkApp);
+ hApp = *l_hApp;
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ pApp->pRsrcMgr = reinterpret_cast<void *>(l_hApp);
+
+ eStatus = FrameworkunifiedArgumentParser(hApp, argc, argv, cmdLineOptions);
+
+ if (eFrameworkunifiedStatusOK == eStatus) {
+ FRAMEWORKUNIFIEDLOG_PERFORMANCE_DEBUG("FrameworkunifiedOnInitialization +");
+ eStatus = FrameworkunifiedOnInitializationInternal(hApp);
+ FRAMEWORKUNIFIEDLOG_PERFORMANCE_DEBUG("FrameworkunifiedOnInitialization -");
+
+ if (eFrameworkunifiedStatusOK != eStatus) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "FrameworkunifiedOnInitialization failed ");
+ }
+ }
+ }
+ } else {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "FrameworkunifiedCreateDispatcher error, status=%d", eStatus);
+ }
+ } catch (const THApp::Exception &) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: Failed to FrameworkunifiedCreateDispatcher ");
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ }
+
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedDispatchProcessWithoutLoop(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ int efd; // FD for multi waiting
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ FrameworkunifiedGetDispatcherFD(hApp, &efd);
+ eStatus = frameworkunifiedFdHandler(hApp, efd);
+ if (eFrameworkunifiedStatusOK != eStatus) {
+ eStatus = eFrameworkunifiedStatusFail;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedDestroyDispatcherWithoutLoop(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ try {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ THApp *RsrcMgr = reinterpret_cast<THApp *>(pApp->pRsrcMgr);
+ delete RsrcMgr;
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ return eStatus;
+}
+
+static EFrameworkunifiedStatus GetDispatcherMqFD(HANDLE hApp, int *fd) {
+ if (fd == NULL) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __func__, "fd is NULL");
+ return eFrameworkunifiedStatusNullPointer;
+ }
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ *fd = McGetQueueFD(pApp->hAppRcvMsgQ);
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ return eStatus;
+}
+
+static EFrameworkunifiedStatus CreateMultiWaitingFD(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ int efd; // FD for multi waiting
+ int q_fd; // FD for Dispatcher's message queue
+ int defer_evfd; // FD for receiving Defer events to Dispatcher
+ struct epoll_event ev; // Info struct to associate with multiwaiting FD
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ // Create efd
+ efd = epoll_create1(EPOLL_CLOEXEC);
+ if (-1 != efd) {
+ pApp->efd = efd;
+
+ // get fd to Dispatcher's message queue
+ eStatus = GetDispatcherMqFD(hApp, &q_fd);
+ if (eFrameworkunifiedStatusOK == eStatus) {
+ // efd to monitor the q_fd.
+ ev.events = EPOLLIN;
+ ev.data.fd = q_fd;
+ if (-1 == epoll_ctl(efd, EPOLL_CTL_ADD, q_fd, &ev)) {
+ eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : epoll_ctl(q_fd, ADD) Failed, "
+ "status=%d, errno=%d", eStatus, errno);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : GetDispatcherMqFD Failed, status=%d", eStatus);
+ }
+
+ // create FD for receiving Defer events to Dispatcher
+ defer_evfd = eventfd(0, EFD_CLOEXEC);
+ if (-1 != defer_evfd) {
+ pApp->defer_evfd = defer_evfd;
+
+ // efd to monitor the defer_evfd.
+ ev.events = EPOLLIN;
+ ev.data.fd = defer_evfd;
+ if (-1 == epoll_ctl(efd, EPOLL_CTL_ADD, defer_evfd, &ev)) {
+ eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : epoll_ctl(defer_evfd, ADD) Failed,"
+ " status=%d, errno=%d", eStatus, errno);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : eventfd Failed, status=%d, errno=%d", eStatus, errno);
+ }
+
+ // add abnormal monitor socket polling
+ if (-1 != pApp->siMonitorSock) {
+ ev.events = EPOLLIN;
+ ev.data.fd = pApp->siMonitorSock;
+ if (-1 == epoll_ctl(efd, EPOLL_CTL_ADD, pApp->siMonitorSock, &ev)) {
+ eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : epoll_ctl:%s", strerror(errno));
+ }
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : epoll_create1 Failed, status=%d, errno=%d", eStatus, errno);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : %d, Invalid hApp ", eStatus);
+ }
+
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedGetDispatcherFD(HANDLE hApp, int *efd) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ if (NULL != efd) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ *efd = pApp->efd;
+ } else {
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : %d, Invalid hApp ", eStatus);
+ }
+
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedOnInitializationInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.onInitilization != NULL) {
+ try {
+ eStatus = g_defaultCallbackHandler.onInitilization(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ }
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedOnDestroyInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.onDestroy != NULL) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ if (pApp->hParentSndMsgQ == NULL) {
+ // main thread
+ try {
+ eStatus = g_defaultCallbackHandler.onDestroy(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusOK;
+ }
+ }
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedOnStartInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.onStart != NULL) {
+ try {
+ eStatus = g_defaultCallbackHandler.onStart(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ }
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedOnStopInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.onStop != NULL) {
+ try {
+ eStatus = g_defaultCallbackHandler.onStop(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ }
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedOnPreStartInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.onPreStart != NULL) {
+ try {
+ eStatus = g_defaultCallbackHandler.onPreStart(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ }
+ return eStatus; // LCOV_EXCL_BR_LINE 11:Excluded due to gcov constraints (others)
+}
+
+EFrameworkunifiedStatus FrameworkunifiedOnPreStopInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.onPreStop != NULL) {
+ try {
+ eStatus = g_defaultCallbackHandler.onPreStop(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ }
+ return eStatus; // LCOV_EXCL_BR_LINE 11:Excluded due to gcov constraints (others)
+}
+
+EFrameworkunifiedStatus FrameworkunifiedOnBackgroundStartInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.onBackgroundStart != NULL) {
+ try {
+ eStatus = g_defaultCallbackHandler.onBackgroundStart(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ }
+ return eStatus; // LCOV_EXCL_BR_LINE 11:Excluded due to gcov constraints (others)
+}
+
+EFrameworkunifiedStatus FrameworkunifiedOnBackgroundStopInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.onBackgroundStop != NULL) {
+ try {
+ eStatus = g_defaultCallbackHandler.onBackgroundStop(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ }
+ return eStatus; // LCOV_EXCL_BR_LINE 11:Excluded due to gcov constraints (others)
+}
+
+EFrameworkunifiedStatus FrameworkunifiedOnDebugDumpInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.onDebugDump != NULL) {
+ try {
+ eStatus = g_defaultCallbackHandler.onDebugDump(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ }
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedCreateStateMachineInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.createStateMachine != NULL) {
+ try {
+ eStatus = g_defaultCallbackHandler.createStateMachine(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ }
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedSSFrameworkInterfaceInternal(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail;
+
+ if (g_defaultCallbackHandler.ssFrameworkInterface != NULL) {
+ try {
+ eStatus = g_defaultCallbackHandler.ssFrameworkInterface(hApp);
+ } catch (const std::exception &e) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error: %s", e.what());
+ }
+ }
+ return eStatus;
+}
+
+EFrameworkunifiedStatus RegistDefaultCbHandler(const FrameworkunifiedDefaultCallbackHandler *CbHandler) {
+ if (CbHandler == NULL) {
+ return eFrameworkunifiedStatusNullPointer;
+ } else if (CbHandler->onInitilization == NULL || CbHandler->onDestroy == NULL || CbHandler->onStart == NULL ||
+ CbHandler->onStop == NULL
+ || CbHandler->onPreStart == NULL || CbHandler->onPreStop == NULL
+ || CbHandler->onBackgroundStart == NULL || CbHandler->onBackgroundStop == NULL
+ || CbHandler->onDebugDump == NULL || CbHandler->createStateMachine == NULL
+ || CbHandler->ssFrameworkInterface == NULL) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, " [ ABORT ] DefaultCallbackHandler is NULL");
+ return eFrameworkunifiedStatusInvldParam;
+ }
+
+ g_defaultCallbackHandler = *CbHandler;
+ return eFrameworkunifiedStatusOK;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedGetDefaultCbHandler(FrameworkunifiedDefaultCallbackHandler *CbHandler) {
+ if (CbHandler == NULL) {
+ return eFrameworkunifiedStatusNullPointer;
+ }
+
+ *CbHandler = g_defaultCallbackHandler;
+ return eFrameworkunifiedStatusOK;
+}
+
+EFrameworkunifiedStatus frameworkunifiedFdHandler(HANDLE hApp , int efd) {
+ struct epoll_event events[MAX_FD_MULTIWAITING];
+ int nfds; // The number of events received
+ int q_fd; // The FD of events received
+ int n; // Loop counter
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ const char *key;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ eStatus = GetDispatcherMqFD(hApp, &q_fd);
+ // LCOV_EXCL_BR_START 6:Because of hApp is valid, GetDispatcherMqFD return eFrameworkunifiedStatusOK.
+ if (eFrameworkunifiedStatusOK == eStatus) {
+ // LCOV_EXCL_BR_STOP
+ nfds = epoll_wait(efd, events, MAX_FD_MULTIWAITING, -1);
+ if (-1 != nfds) {
+ for (n = 0; n < nfds; ++n) {
+ if (pApp->siMonitorSock == events[n].data.fd) {
+ // abnormal monitor connect request
+ int socket;
+
+ if ((socket = mcAcceptMonitor(pApp->cAppName, pApp->siMonitorSock)) >= 0) {
+ struct epoll_event event;
+
+ event.events = EPOLLRDHUP;
+ event.data.fd = socket;
+
+ if (epoll_ctl(pApp->efd, EPOLL_CTL_ADD, socket, &event) < 0) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : epoll_ctl:%s", strerror(errno));
+ }
+ }
+ }
+ }
+
+ for (n = 0; n < nfds; ++n) {
+ // The branch processing by FD on which the message was received
+ if (q_fd == events[n].data.fd) {
+ // process the message to the Dispatcher's message queue
+ eStatus = ProcessMq(hApp);
+ } else if (pApp->defer_evfd == events[n].data.fd) {
+ // process the Defer event to the Dispatcher
+ uint64_t data;
+ ssize_t len;
+
+ len = read(pApp->defer_evfd, &data, sizeof(uint64_t));
+ if (len < 0) {
+ // read error
+ eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : read Failed, status=%d, errno=%d, defer_evfd=%d",
+ eStatus, errno, pApp->defer_evfd);
+ } else {
+ while (TRUE == (FrameworkunifiedPopedDeferedMessage(hApp))) {
+ try {
+ // dispatch process: calls respective call back functions
+ if (eFrameworkunifiedStatusOK != (eStatus = FrameworkunifiedDispatchProcess(hApp))) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : FrameworkunifiedDispatchProcess Status : 0x%x", eStatus);
+ }
+ } catch (const frameworkunified::framework::error::CSystemError &err) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : %s", err.what());
+ eStatus = eFrameworkunifiedStatusErrOther;
+ FrameworkunifiedSendSystemErrMessage(hApp, err.m_eSystemError);
+ } catch (const std::exception &err) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Recovering from : %s", err.what());
+ eStatus = eFrameworkunifiedStatusErrOther;
+ }
+ }
+ }
+ } else if (pApp->siMonitorSock == events[n].data.fd) {
+ // do nothing
+ } else if (frameworkunifiedSearchResourseKey(FRAMEWORKUNIFIED_RES_ABNMLMON, events[n].data.fd, &key) == 0) {
+ if (pApp->acceptMonitorTable.find(events[n].data.fd) != pApp->acceptMonitorTable.end()) {
+ // server: accept socket close
+ eStatus = frameworkunifiedProcessClientAbnormalState(hApp, events[n].data.fd);
+ } else if (pApp->connectMonitorTable.find(events[n].data.fd) != pApp->connectMonitorTable.end()) {
+ // client: connect socket close
+ eStatus = frameworkunifiedProcessServerAbnormalState(hApp, events[n].data.fd);
+ }
+
+ if (epoll_ctl(pApp->efd, EPOLL_CTL_DEL, events[n].data.fd, NULL) < 0) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : epoll_ctl:%s", strerror(errno));
+ }
+ close(events[n].data.fd);
+ frameworkunifiedUnregistResouce(FRAMEWORKUNIFIED_RES_ABNMLMON, key);
+ } else {
+ // process the message to the FD set by the user
+ eStatus = ProcessFd(hApp, events[n].data.fd);
+ }
+ }
+ } else {
+ if (errno == EINTR) {
+ // signal interrupt
+ } else {
+ eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : epoll_wait Failed, status=%d, errno=%d", eStatus, errno);
+ }
+ }
+ } else {
+ // LCOV_EXCL_START 6:Because of hApp is valid, GetDispatcherMqFD return eFrameworkunifiedStatusOK.
+ AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
+ eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : GetDispatcherMqFD Failed, status=%d", eStatus);
+ // LCOV_EXCL_STOP
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : %d, Invalid hApp ", eStatus);
+ }
+
+ return eStatus;
+}
+
+static EFrameworkunifiedStatus ProcessMq(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+#ifdef DISPATCHER_PROFILER
+ CFrameworkunifiedFrameworkApp *pApp = reinterpret_cast< CFrameworkunifiedFrameworkApp * >(hApp);
+#endif
+
+ // handle defer'ed message
+ if (FALSE == FrameworkunifiedPopedDeferedMessage(hApp)) {
+ // dispatch block: waits on receive message
+ if ((eStatus = FrameworkunifiedDispatchBlock(hApp)) != eFrameworkunifiedStatusOK) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : FrameworkunifiedDispatchBlock Status : 0x%x", eStatus);
+ }
+ #ifdef DISPATCHER_PROFILER
+ else if (NULL != pApp->m_pFrameworkunifiedMsgProfiler) { // NOLINT (readability/nolint)
+ pApp->m_pFrameworkunifiedMsgProfiler->MsgReceived();
+ }
+ #endif
+ }
+ try {
+ // dispatch process: calls respective call back functions
+ eStatus = FrameworkunifiedDispatchProcess(hApp);
+ } catch (const frameworkunified::framework::error::CSystemError &err) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : %s", err.what());
+ eStatus = eFrameworkunifiedStatusErrOther;
+ FrameworkunifiedSendSystemErrMessage(hApp, err.m_eSystemError);
+ } catch (const std::exception &err) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Recovering from : %s", err.what());
+ eStatus = eFrameworkunifiedStatusErrOther;
+ }
+#ifdef DISPATCHER_PROFILER
+ if (NULL != pApp->m_pFrameworkunifiedMsgProfiler) {
+ pApp->m_pFrameworkunifiedMsgProfiler->MsgProcessed();
+ }
+#endif
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : %d, Invalid hApp ", eStatus);
+ }
+
+ return eStatus;
+}
+
+static EFrameworkunifiedStatus ProcessFd(HANDLE hApp , int fd) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ FdTable::iterator f_iterator;
+ struct rusage start, end;
+ BOOL enable_rusage = NsLogIsZoneSet(ZONE_NS_DEBUG_DUMP);
+
+ if (enable_rusage == TRUE) {
+ frameworkunifiedGetRusage(&start);
+ }
+
+ // finding callback func associated with FD
+ f_iterator = pApp->fds.find(fd);
+ if (f_iterator != pApp->fds.end()) {
+ try {
+ // calling func associated with FD
+ eStatus = (*f_iterator).second(hApp);
+ } catch (const frameworkunified::framework::error::CSystemError &err) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR :: %s", err.what());
+ eStatus = eFrameworkunifiedStatusErrOther;
+ FrameworkunifiedSendSystemErrMessage(hApp, err.m_eSystemError);
+ } catch (const std::exception &err) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Recovering from: %s", err.what());
+ eStatus = eFrameworkunifiedStatusErrOther;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusFail;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : %d, Callback associated with FD is not found. ", eStatus);
+ }
+
+ if (enable_rusage == TRUE) {
+ frameworkunifiedGetRusage(&end);
+ frameworkunifiedPrintRusage(hApp, start, end);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "ERROR : %d, Invalid hApp ", eStatus);
+ }
+
+ return eStatus;
+}
+
+/////////////////////////////////////////////////////////
+/// EFrameworkunifiedStatus SetConfigHandle(HANDLE hApp, PCHAR sFilePath )
+/// This Function opens the file from give path and sets the file handle in hApp
+////////////////////////////////////////////////////////
+EFrameworkunifiedStatus SetConfigHandle(HANDLE hApp, PCHAR sFilePath) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_WAR, __PRETTY_FUNCTION__, "This function is not implemented");
+
+ return eStatus;
+}
+
+/////////////////////////////////////////////////////////
+/// EFrameworkunifiedStatus SetDefaultFilePath(HANDLE hApp)
+/// This Function fetches the file path from Environment variable from PASA_APPCONFIG_FILES and
+/// pass it to the SetConfigHandle function
+////////////////////////////////////////////////////////
+EFrameworkunifiedStatus SetDefaultConfigFile(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ // Get the file path from environment variable
+ PCHAR l_strEnvValue = getenv(PASA_APPCONFIG_FILES);
+
+ if (l_strEnvValue) {
+ // FRAMEWORKUNIFIEDLOG( ZONE_NS_DIS, __FUNCTION__, "Configuration file path %s ",l_strEnvValue);
+
+ std::string l_strFilePath(l_strEnvValue);
+
+ if (!l_strFilePath.empty()) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "Configuration file path %s ", l_strFilePath.c_str());
+ // Open the configuration file
+ SetConfigHandle(hApp, (PCHAR)l_strFilePath.c_str());
+ } else {
+ eStatus = eFrameworkunifiedStatusFail;
+ }
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldParam;
+ }
+
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedProcessServiceProtocolHSMEvent(HANDLE hApp, PCSTR pRequester) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ EventServices::iterator s_iterator;
+
+ // finding the service
+ s_iterator = pApp->eventservices.find(pRequester);
+ if (s_iterator != pApp->eventservices.end()) {
+ EventSessionTable::iterator session_iterator;
+ session_iterator = (s_iterator->second).find(pApp->uiSessionId);
+ if (session_iterator != (s_iterator->second).end()) {
+ ServiceEventProtocolTable::iterator spt_iterator;
+
+ // FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, " %s found :: (%s) ", pApp->cMsgSrcName, s_iterator->second);
+
+ // find the protocol req/ack handler
+ spt_iterator = (session_iterator->second).find(pApp->uiProtocolCmd);
+ if (spt_iterator != (session_iterator->second).end()) {
+ // FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, " Protocol Command :: (0x%x) ", pApp->uiProtocolCmd);
+ // Post corresponding event
+ CFrameworkunifiedHSMFramework *l_pStateMachine = FrameworkunifiedGetStateMachine(hApp);
+ if (l_pStateMachine) {
+ eStatus = l_pStateMachine->FrameworkunifiedPostEvent(spt_iterator->second);
+ }
+ } else if ((session_iterator->second).end() != (spt_iterator =
+ (session_iterator->second).find(FRAMEWORKUNIFIED_ANY_COMMAND))) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "Processing HSM event for (FRAMEWORKUNIFIED_ANY_COMMAND). "
+ "Dispatcher protocol command: (0x%x)",
+ pApp->uiProtocolCmd);
+ // Post corresponding event
+ CFrameworkunifiedHSMFramework *l_pStateMachine = FrameworkunifiedGetStateMachine(hApp);
+ if (l_pStateMachine) {
+ eStatus = l_pStateMachine->FrameworkunifiedPostEvent(spt_iterator->second);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusMsgNotProcessed;
+ }
+
+ // if FrameworkunifiedPostEvent returns NULL
+ if (eFrameworkunifiedStatusNullPointer == eStatus) {
+ eStatus = eFrameworkunifiedStatusExit;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusMsgNotProcessed;
+ }
+
+ } else {
+ eStatus = eFrameworkunifiedStatusMsgNotProcessed;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ }
+
+ return eStatus;
+}
+
+//////////////////////////////////////////
+// Function : ProcessProtocolEvents
+//////////////////////////////////////////
+EFrameworkunifiedStatus ProcessProtocolEvents(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ // common event table iterator
+ EventTable::iterator e_iterator;
+ ServiceSessionIdListTable::iterator ssidl_iterator;
+
+ // public state event table iterator
+ PublicStateEventTable::iterator se_iterator;
+
+ // private state event table iterator
+ PrivateStateEventTable::iterator pse_iterator;
+ ServiceSessionEventData::iterator ssed_iterator;
+ SessionEventData::iterator sed_iterator;
+
+ HANDLE l_pClientHandle = NULL;
+
+ // get the name of the service from which message is received
+ PCSTR l_cServiceName = pApp->cMsgSrcName;
+ const UI_32 l_uiSessionId = pApp->uiSessionId;
+
+ // number of events to register
+ UI_32 l_uiListSize = static_cast<UI_32>(FrameworkunifiedGetMsgLength(hApp) / sizeof(UI_32));
+
+ // check if the received service name and data is valid
+ if (NULL != l_cServiceName && 0 < l_uiListSize) {
+ PUI_32 l_pData = new UI_32[l_uiListSize];
+ UI_32 l_uiEventId = 0;
+
+ // get the list of events
+ eStatus = FrameworkunifiedGetMsgDataOfSize(hApp, l_pData, static_cast<UI_32>(l_uiListSize * sizeof(UI_32)));
+
+ if (NULL != l_pData && eFrameworkunifiedStatusOK == eStatus) {
+ for (UI_32 uiCount = 0; uiCount < l_uiListSize; uiCount++) {
+ // received event id
+ l_uiEventId = l_pData[uiCount];
+
+ // find the event in map of EventTable
+ e_iterator = pApp->eventtable.find(l_uiEventId);
+
+ // if event is registered by any of the clients
+ if (pApp->eventtable.end() != e_iterator) {
+ // table of services with list of their session id's registering this event
+ ServiceSessionIdListTable &l_mServiceSessionIdListTable = e_iterator->second;
+
+ // find the service name in map of ServiceSessionIdListTable
+ ssidl_iterator = l_mServiceSessionIdListTable.find(l_cServiceName);
+
+ // if service have already registered this event with any of its session
+ if (l_mServiceSessionIdListTable.end() != ssidl_iterator) {
+ // list of sessions id's registering with this event
+ SessionIdList &l_vSessionIdList = ssidl_iterator->second;
+
+ // event is registered with this session
+ if (IsEventAlreadyRegistered(l_vSessionIdList, l_uiSessionId)) {
+ // get the message queue handle from map servicesessionhandletable
+ l_pClientHandle = GetMsgQueueHandle(hApp, l_cServiceName, l_uiSessionId);
+ } else { // event is not registered with this session
+ // create new message queue handle and insert it in map servicesessionhandletable
+ l_pClientHandle = GetNewHandleAndUpdateEventInfoTable(hApp,
+ l_cServiceName, l_uiSessionId, l_uiEventId);
+
+ // insert the current session id
+ l_vSessionIdList.push_back(l_uiSessionId);
+ }
+ } else { // if service have not registered this event with any of its session
+ // create a list for storing session id's registering this event for this service
+ SessionIdList l_vSessionIdList;
+
+ // insert the current session id
+ l_vSessionIdList.push_back(l_uiSessionId);
+
+ // create new message queue handle and insert it in map servicesessionhandletable
+ l_pClientHandle = GetNewHandleAndUpdateEventInfoTable(hApp, l_cServiceName, l_uiSessionId, l_uiEventId);
+
+ // make a entry for service name and session id's list in map of ServiceSessionIdListTable
+ l_mServiceSessionIdListTable.insert(make_pair(l_cServiceName, l_vSessionIdList));
+ }
+ } else { // if event is not registered by any of the clients
+ // create a list for storing session id's registering this event for this service
+ SessionIdList l_vSessionIdList;
+
+ // insert the current session id
+ l_vSessionIdList.push_back(l_uiSessionId);
+
+ // create new message queue handle and insert it in map servicesessionhandletable
+ l_pClientHandle = GetNewHandleAndUpdateEventInfoTable(hApp, l_cServiceName, l_uiSessionId, l_uiEventId);
+
+ // create a table for storing services and its session id list, registering this event
+ ServiceSessionIdListTable l_mServiceSessionIdListTable;
+
+ // make a entry for service name and session id's list in map of ServiceSessionIdListTable
+ l_mServiceSessionIdListTable.insert(make_pair(l_cServiceName, l_vSessionIdList));
+
+ // insert the table with event id in EventTable
+ pApp->eventtable.insert(make_pair(l_uiEventId, l_mServiceSessionIdListTable));
+ }
+
+ // check whether event is defined as public state event
+ se_iterator = pApp->publicstateeventtable.find(l_uiEventId);
+
+ // if event is a state event, publish the event
+ if (pApp->publicstateeventtable.end() != se_iterator) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_INFO, __FUNCTION__, "%d is a public state event", l_uiEventId);
+
+ if (NULL != (se_iterator->second)) {
+ // send the event data for state event
+ eStatus = FrameworkunifiedSendMsg(l_pClientHandle,
+ l_uiEventId,
+ (se_iterator->second)->uiLength,
+ (se_iterator->second)->pData);
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_INFO, __FUNCTION__, "Sending event:%d to service:%s, session:%d, status:%d",
+ l_uiEventId,
+ l_cServiceName,
+ l_uiSessionId,
+ eStatus);
+ } else {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_INFO, __FUNCTION__, "Event %d yet not published ", l_uiEventId);
+ }
+ } else { // check whether the event is defined as private state event
+ pse_iterator = pApp->privatestateeventtable.find(l_uiEventId);
+
+ // if event found, publish the event
+ if (pApp->privatestateeventtable.end() != pse_iterator) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_INFO, __FUNCTION__, "%d is a private state event", l_uiEventId);
+
+ ssed_iterator = (pse_iterator->second).find(l_cServiceName);
+
+ // check whether the event had been published for this service before subscription
+ if ((pse_iterator->second).end() != ssed_iterator) {
+ sed_iterator = (ssed_iterator->second).find(l_uiSessionId);
+
+ // check whether the event had been published for this service for the same session
+ if ((ssed_iterator->second).end() != sed_iterator) {
+ if (NULL != (sed_iterator->second)) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, __FUNCTION__, "%d had been published for the "
+ "service:%s on sessionId:%d ", l_uiEventId,
+ l_cServiceName, l_uiSessionId);
+
+ // send the event data for state event
+ eStatus = FrameworkunifiedSendMsg(l_pClientHandle,
+ l_uiEventId,
+ (sed_iterator->second)->uiLength,
+ (sed_iterator->second)->pData);
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_INFO, __FUNCTION__, "Sending event:%d to service:%s, session:%d, status:%d",
+ l_uiEventId,
+ l_cServiceName,
+ l_uiSessionId,
+ eStatus);
+ } else {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_INFO, __FUNCTION__, "Event %d yet not published ", l_uiEventId);
+ }
+ }
+ }
+ }
+ }
+ } // end of for loop of events list
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldBuf;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error :: %d, PROTOCOL_REGISTER_EVENTS Invalid data ", eStatus);
+ }
+
+ if (NULL != l_pData) {
+ delete[] l_pData;
+ l_pData = NULL;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldParam;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error :: %d, PROTOCOL_REGISTER_EVENTS Service Name invalid ", eStatus);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldHandle;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error :: %d, Invalid hApp ", eStatus);
+ }
+
+ return eStatus;
+}
+
+//////////////////////////////////////////
+// Function : IsEventAlreadyRegistered
+//////////////////////////////////////////
+BOOL IsEventAlreadyRegistered(const SessionIdList &vSessionIdList, const UI_32 uiSessionId) {
+ for (UI_32 uiCount = 0; uiCount < vSessionIdList.size(); uiCount++) {
+ if (uiSessionId == vSessionIdList[uiCount]) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+//////////////////////////////////////////
+// Function : GetMsgQueueHandle
+//////////////////////////////////////////
+HANDLE GetMsgQueueHandle(HANDLE hApp, PCSTR serviceName, const UI_32 uiSessionId) {
+ HANDLE l_pClientHandle = NULL;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ ServiceSessionHandleTable::iterator ssh_iterator;;
+ SessionToEventInfo::iterator sh_iterator;
+
+ // find the service name
+ ssh_iterator = pApp->servicesessionhandletable.find(serviceName);
+
+ if (pApp->servicesessionhandletable.end() != ssh_iterator) {
+ // search for session id
+ sh_iterator = ssh_iterator->second.find(uiSessionId);
+
+ if (ssh_iterator->second.end() != sh_iterator) {
+ SessionEventInfo *l_ptSessionEventInfo = sh_iterator->second;
+ if (NULL != l_ptSessionEventInfo) {
+ l_pClientHandle = l_ptSessionEventInfo->m_hSession;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_INFO, __FUNCTION__, "Handle found for service: %s, session: %d, handle:%p.",
+ serviceName, uiSessionId, l_pClientHandle);
+ }
+ }
+ }
+ }
+
+ if (NULL == l_pClientHandle) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_WAR, __FUNCTION__, "Handle NULL for service: %s, session: %d.",
+ serviceName != 0 ? serviceName : NULL, uiSessionId);
+ }
+
+ return l_pClientHandle;
+}
+
+//////////////////////////////////////////
+// Function : GetNewHandleAndUpdateEventInfoTable
+//////////////////////////////////////////
+HANDLE GetNewHandleAndUpdateEventInfoTable(HANDLE hApp, PCSTR serviceName, const UI_32 uiSessionId,
+ const UI_32 uiEventId) {
+ HANDLE l_pClientHandle = NULL;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ ServiceSessionHandleTable::iterator ssh_iterator;;
+ SessionToEventInfo::iterator sh_iterator;
+
+ ssh_iterator = pApp->servicesessionhandletable.find(serviceName);
+
+ if (pApp->servicesessionhandletable.end() == ssh_iterator) {
+ SessionToEventInfo l_mSessionToEventInfoTable;
+ pApp->servicesessionhandletable.insert(make_pair(serviceName, l_mSessionToEventInfoTable));
+ }
+
+ sh_iterator = pApp->servicesessionhandletable[serviceName].find(uiSessionId);
+
+ if (pApp->servicesessionhandletable[serviceName].end() == sh_iterator) {
+ l_pClientHandle = FrameworkunifiedMcOpenSender(hApp, serviceName);
+ if (NULL != l_pClientHandle) {
+ (reinterpret_cast<MsgQInfo *>(l_pClientHandle))->sessionId = uiSessionId;
+ }
+ SessionEventInfo *l_ptSessionEventInfo = new(std::nothrow) SessionEventInfo;
+ if (NULL != l_ptSessionEventInfo) { // LCOV_EXCL_BR_LINE 5: new's error case.
+ l_ptSessionEventInfo->m_hSession = l_pClientHandle;
+ l_ptSessionEventInfo->m_vEvents.push_back(uiEventId);
+ pApp->servicesessionhandletable[serviceName].insert(std::make_pair(uiSessionId, l_ptSessionEventInfo));
+ } else {
+ // LCOV_EXCL_START 5: malloc's error case.
+ AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error(NULL) createing new session event info for "
+ "service:%s, session:%d, event:%d.",
+ serviceName, uiSessionId, uiEventId);
+ // LCOV_EXCL_STOP
+ }
+ } else {
+ SessionEventInfo *l_ptSessionEventInfo = sh_iterator->second;
+ if (NULL != l_ptSessionEventInfo) {
+ if (NULL == l_ptSessionEventInfo->m_hSession) {
+ l_ptSessionEventInfo->m_hSession = FrameworkunifiedMcOpenSender(hApp, serviceName);
+ if (NULL != l_ptSessionEventInfo->m_hSession) {
+ (reinterpret_cast<MsgQInfo *>(l_ptSessionEventInfo->m_hSession))->sessionId = uiSessionId;
+ }
+ }
+ l_pClientHandle = l_ptSessionEventInfo->m_hSession;
+ l_ptSessionEventInfo->m_vEvents.push_back(uiEventId);
+ }
+ }
+ }
+ return l_pClientHandle;
+}
+
+//////////////////////////////////////////
+// Function : UnregisterPrivateEvents
+//////////////////////////////////////////
+EFrameworkunifiedStatus UnregisterPrivateEvents(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+
+ // get the name of the service from which message is received
+ PCSTR l_cServiceName = pApp->cMsgSrcName;
+ const UI_32 l_uiSessionId = pApp->uiSessionId;
+
+ // number of events to unregister
+ UI_32 l_uiListSize = static_cast<UI_32>(FrameworkunifiedGetMsgLength(hApp) / sizeof(UI_32));
+
+ // check if the received service name and data is valid
+ if (NULL != l_cServiceName && 0 < l_uiListSize) {
+ PUI_32 l_pData = new(std::nothrow) UI_32[l_uiListSize];
+ UI_32 l_uiEventId = 0;
+
+ if (NULL != l_pData) { // LCOV_EXCL_BR_LINE 5: new's error case.
+ // get the list of events
+ eStatus = FrameworkunifiedGetMsgDataOfSize(hApp, l_pData, static_cast<UI_32>(l_uiListSize * sizeof(UI_32)));
+
+ if (eFrameworkunifiedStatusOK == eStatus) {
+ for (UI_32 uiCount = 0; uiCount < l_uiListSize; uiCount++) {
+ // received event id
+ l_uiEventId = l_pData[uiCount];
+
+ // remove the entry from map of Events and Session id's of services
+ eStatus = RemoveEventEntryFromEventTable(hApp, l_uiEventId, l_cServiceName, l_uiSessionId);
+ (VOID)RemoveEntryFromSessionEventInfoTable(hApp, l_cServiceName, l_uiSessionId, l_uiEventId);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldBuf;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error :: %d, PROTOCOL_REGISTER_EVENTS Invalid data ", eStatus);
+ }
+ delete[] l_pData;
+ l_pData = NULL;
+ } else {
+ // LCOV_EXCL_START 5: new's error case.
+ AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
+ eStatus = eFrameworkunifiedStatusNullPointer;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error :: PROTOCOL_UNREGISTER_EVENTS: "
+ "Unable to allocate memory for l_pData");
+ // LCOV_EXCL_STOP
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldParam;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error :: %d, PROTOCOL_UNREGISTER_EVENTS Service Name invalid ", eStatus);
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldParam;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error :: %d, Invalid hApp ", eStatus);
+ }
+
+ return eStatus;
+}
+
+//////////////////////////////////////////
+// Function : HandleSessionEventOnCloseSession
+//////////////////////////////////////////
+EFrameworkunifiedStatus HandleSessionEventOnCloseSession(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ // close session request structure
+ CloseSessionReq tClose = {};
+ if (FrameworkunifiedGetMsgLength(hApp) == sizeof(tClose)) {
+ if (eFrameworkunifiedStatusOK != (eStatus = FrameworkunifiedGetMsgDataOfSize(hApp, &tClose, sizeof(tClose)))) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error :: %d, FrameworkunifiedGetMsgDataOfSize Failed ", eStatus);
+ } else {
+ CleanAllEventsOfSession(hApp, pApp->cMsgSrcName, tClose.sessionId);
+ }
+ } else {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Invalid data length received:: Expected: %ld, Received: %d",
+ static_cast<long int>(sizeof(tClose)), FrameworkunifiedGetMsgLength(hApp)); // NOLINT (readability/nolint)
+ eStatus = eFrameworkunifiedStatusFail;
+ }
+ } else {
+ eStatus = eFrameworkunifiedStatusInvldParam;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Invalid application handle status.");
+ }
+
+ return eStatus;
+}
+
+//////////////////////////////////////////
+// Function : FrameworkunifiedOnDummy
+//////////////////////////////////////////
+EFrameworkunifiedStatus FrameworkunifiedOnDummy(HANDLE hApp) {
+ return eFrameworkunifiedStatusOK;
+}
+
+#ifdef DISPATCHER_PROFILER
+EFrameworkunifiedStatus FrameworkunifiedAttachMsgProfilerCallbacksDispatcher(HANDLE hApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+
+ if (frameworkunifiedCheckValidAppHandle(hApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hApp);
+ if (NULL != pApp->m_pFrameworkunifiedMsgProfiler) {
+ eStatus = FrameworkunifiedAttachCallbackToDispatcher(hApp,
+ "NSProfileUtil",
+ PROTOCOL_DIS_MSGPROFILER,
+ boost::bind(&FrameworkunifiedMsgProfiler::PrintProfileInfo,
+ pApp->m_pFrameworkunifiedMsgProfiler, hApp));
+ if (eFrameworkunifiedStatusOK == eStatus) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, "", "FrameworkunifiedAttachCallbackToDispatcher success for PROTOCOL_DIS_MSGPROFILER.");
+ }
+ }
+ }
+ return eStatus;
+}
+
+EFrameworkunifiedStatus FrameworkunifiedAttachChildMsgProfilerCallbacksDispatcher(HANDLE hChildApp) {
+ EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK;
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, "", "+");
+ if (frameworkunifiedCheckValidAppHandle(hChildApp)) {
+ CFrameworkunifiedFrameworkApp *pApp = static_cast<CFrameworkunifiedFrameworkApp *>(hChildApp);
+ if (NULL != pApp->m_pFrameworkunifiedMsgProfiler) {
+ eStatus = FrameworkunifiedAttachCallbackToDispatcher(hChildApp,
+ pApp->cParentAppName,
+ PROTOCOL_DIS_MSGPROFILER,
+ boost::bind(&FrameworkunifiedMsgProfiler::PrintProfileInfo,
+ pApp->m_pFrameworkunifiedMsgProfiler, hChildApp));
+ if (eFrameworkunifiedStatusOK == eStatus) {
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, "", "FrameworkunifiedAttachCallbackToDispatcher success for PROTOCOL_DIS_MSGPROFILER.");
+ }
+ }
+ }
+ FRAMEWORKUNIFIEDLOG(ZONE_NS_DIS, "", "-");
+ return eStatus;
+}
+#endif
+// EOF