X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=service%2Fnative%2Fframework_unified%2Fclient%2FNS_NPServiceIf%2Fsrc%2Fns_np_service_api.c;fp=service%2Fnative%2Fframework_unified%2Fclient%2FNS_NPServiceIf%2Fsrc%2Fns_np_service_api.c;h=d41514d19c8402236d8ea6793f279be5c8245dfa;hb=17cf21bcf8a2e29d2cbcf0a313474d2a4ee44f5d;hp=0000000000000000000000000000000000000000;hpb=9e86046cdb356913ae026f616e5bf17f6f238aa5;p=staging%2Fbasesystem.git diff --git a/service/native/framework_unified/client/NS_NPServiceIf/src/ns_np_service_api.c b/service/native/framework_unified/client/NS_NPServiceIf/src/ns_np_service_api.c new file mode 100755 index 0000000..d41514d --- /dev/null +++ b/service/native/framework_unified/client/NS_NPServiceIf/src/ns_np_service_api.c @@ -0,0 +1,1001 @@ +/* + * @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_NPService +/// \brief APIs to be used by clients while invoking Notification Service. +/// +/// Implementation of APIs for Publishers and Subscribers of notifications. +/// +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// Include Files +/////////////////////////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// define user name as blank for global persistence file +#define GLOBAL_PERSISTENCE "" + +// this is the maximum number of notifications that can be registered/ unregistered at once +const UI_32 maxNotification = UINT_MAX / sizeof(NC_register_notif_msg); + + + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPRegisterNotifications +/// API to send message to Notification Service to register a set of notifications +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of Publisher message queue +/// \param [in] numNotifications +/// PCSTR - Name of Notification +/// \param [in] pNotificationArray +/// NotificationInfo - Array of notifications +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPRegisterNotifications(HANDLE hNPMsgQ, PCSTR pPublisherName, UI_32 numNotifications, + NotificationInfo *pNotificationArray) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (maxNotification < numNotifications) { + return eFrameworkunifiedStatusFail; + } + + size_t sizeOfMsg = (sizeof(NC_register_notif_msg) * numNotifications) + sizeof(UI_32); + if (NULL == pNotificationArray) { + return eFrameworkunifiedStatusInvldParam; + } + + PCHAR *pMsgBuffer = (PCHAR *)malloc(sizeOfMsg); + + if (NULL == pMsgBuffer) { + return eFrameworkunifiedStatusFail; + } + + NC_register_multiple_notif_msg *pNotifMsg = (NC_register_multiple_notif_msg *)pMsgBuffer; + + pNotifMsg->numNotifications = numNotifications; + memcpy(&pNotifMsg->notifierList[0], pNotificationArray, sizeof(NC_register_notif_msg) * numNotifications); + + for(UI_32 i = 0; i < numNotifications; i++) { + // Insert \0 at the end of character (up to 64bytes) by copying with strlcpy. + strlcpy(pNotifMsg->notifierList[i].notificationName, + pNotificationArray[i].notificationName, + sizeof(pNotificationArray[i].notificationName)); + } + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_REGISTER_EV_REQ, (UI_32)sizeOfMsg, (PVOID)pNotifMsg) ; + + free(pMsgBuffer); + pMsgBuffer = NULL; + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// \ingroup NPUnRegisterNotifications +/// API to send message to Notification Service to remove a set of notifications +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of Publisher message queue +/// \param [in] numNotifications +/// PCSTR - Name of Notification +/// \param [in] pNotificationArray +/// NotificationInfo - Array of notifications +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPUnRegisterNotifications(HANDLE hNPMsgQ, PCSTR pPublisherName, UI_32 numNotifications, + NotificationInfo *pNotificationArray) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (maxNotification < numNotifications) { + return eFrameworkunifiedStatusFail; + } + + size_t sizeOfMsg = (sizeof(NC_unregister_notif_msg) * numNotifications) + sizeof(UI_32); + UI_32 i = 0; + if (NULL == pNotificationArray) { + return eFrameworkunifiedStatusInvldParam; + } + + PCHAR *pMsgBuffer = (PCHAR *)malloc(sizeOfMsg); + + if (NULL == pMsgBuffer) { + return eFrameworkunifiedStatusFail; + } + + NC_unregister_multiple_notif_msg *pNotifMsg = (NC_unregister_multiple_notif_msg *)pMsgBuffer; + + pNotifMsg->numNotifications = numNotifications; + + for (i = 0; i < numNotifications; ++i) { + strlcpy(pNotifMsg->notificationList[i].notificationName, pNotificationArray[i].notificationName, + sizeof(pNotifMsg->notificationList[i].notificationName)); + } + + // mb20110110 Fixed issue 135 + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_UNREGISTER_EV_REQ, (UI_32)sizeOfMsg, (VOID *)pMsgBuffer) ; + + free(pMsgBuffer); + pMsgBuffer = NULL; // mb20110110 issue 134 + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPRegisterNotification +/// API to send message to Notification Service to register a notification +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of Publisher message queue +/// \param [in] notif_name +/// PCSTR - Name of Notification +/// \param [in] max_length +/// const UI_32 - Max size of the notification message +/// \param [in] bIsPersistent +/// const UI_8 - Flag to indicate if it has to be persistent +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPRegisterNotification(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR notificationName, + const UI_32 maxLength, const EFrameworkunifiedNotificationType perstype) + +{ + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && NULL != notificationName) { + if (strlen(pPublisherName) && strlen(notificationName)) { + NotificationInfo data = {}; + strlcpy(data.notificationName, notificationName, sizeof(data.notificationName)); + data.persType = perstype; + data.maxLength = maxLength; + + eFrameworkunifiedStatus = NPRegisterNotifications(hNPMsgQ, pPublisherName, 1, &data); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPUnRegisterNotification +/// API to send message to Notification Service to remove a notification +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of Publisher message queue +/// \param [in] pNotification +/// PCSTR - Name of Notification +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPUnRegisterNotification(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR pNotification) { + + NotificationInfo data = {}; + strlcpy(data.notificationName, pNotification, sizeof(data.notificationName)); + return (NPUnRegisterNotifications(hNPMsgQ, pPublisherName, 1, &data)); +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPPublishNotification +/// API to send message to Notification Service to notify subscribers +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of Publisher message queue +/// \param [in] pNotification +/// PCSTR - Name of Notification +/// \param [in] pData +/// VOID * - Data buffer +/// \param [in] iLength +/// const UI_32 - Size of data buffer +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPPublishNotification(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR pNotification, + PCVOID pData, const UI_32 iLength) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && NULL != pNotification) { + if (strlen(pPublisherName) && strlen(pNotification)) { + if (strlen(pNotification) < MAX_STRING_SIZE_NOTIFICATION) { + // Insert \0 at the end of characters (up to 64bytes) by copying pNotification to local variables with strlcpy. + char tmp_notification[MAX_STRING_SIZE_NOTIFICATION] = {0}; + strlcpy(tmp_notification, pNotification, MAX_STRING_SIZE_NOTIFICATION); + eFrameworkunifiedStatus = McSendWithSysInfo(hNPMsgQ, pPublisherName, NPS_PUBLISH_EV_REQ, + tmp_notification, iLength, pData, 0); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPSubscribeToNotification +/// API to send message to Notification Service to add to subscription list for +/// that notification +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pSubscriberName +/// PCSTR - Name of subscriber message queue +/// \param [in] pNotification +/// PCSTR - Name of Notification +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPSubscribeToNotification(HANDLE hNPMsgQ, PCSTR pSubscriberName, PCSTR pNotification) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + if (NULL != hNPMsgQ && NULL != pSubscriberName && NULL != pNotification) { + if (strlen(pSubscriberName) && strlen(pNotification)) { + NC_subscribe_msg data; + snprintf(data.notificationName, sizeof(data.notificationName), "%s", pNotification); + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pSubscriberName, NPS_SUBSCRIBE_TO_EV_REQ, sizeof(NC_subscribe_msg), (PVOID)&data); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +// NPSubscribeToNotifications +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPSubscribeToNotifications(HANDLE hNPMsgQ, PCSTR pSubscriberName, UI_32 numNotifications, + SubscribeInfo *pSubscribeInfoArray) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (maxNotification < numNotifications) { + return eFrameworkunifiedStatusFail; + } + + size_t sizeOfMsg = (sizeof(NC_subscribe_msg) * numNotifications) + sizeof(UI_32); + if (NULL == pSubscribeInfoArray) { + return eFrameworkunifiedStatusInvldParam; + } + + PCHAR *pMsgBuffer = (PCHAR *)malloc(sizeOfMsg); + + if (NULL == pMsgBuffer) { + return eFrameworkunifiedStatusFail; + } + + NC_subscribe_multiple_notif_msg *pSubscribeMsg = (NC_subscribe_multiple_notif_msg *)pMsgBuffer; + + pSubscribeMsg->numNotifications = numNotifications; + memcpy(&pSubscribeMsg->notificationList[0], pSubscribeInfoArray, sizeof(NC_subscribe_msg) * numNotifications); + + for(UI_32 i = 0; i < numNotifications; i++) { + // Insert \0 at the end of character (up to 64bytes) by copying with strlcpy. + strlcpy(pSubscribeMsg->notificationList[i].notificationName, + pSubscribeInfoArray[i].notificationName, + sizeof(pSubscribeInfoArray[i].notificationName)); + } + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pSubscriberName, NPS_BATCH_SUBSCRIBE_TO_EV_REQ, (UI_32)sizeOfMsg, (PVOID)pSubscribeMsg) ; + + free(pMsgBuffer); + pMsgBuffer = NULL; + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPUnsubscribeFromNotification +/// API to send message to Notification Service to remove from subscription list for +/// that notification +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pSubscriberName +/// PCSTR - Name of subscriber message queue +/// \param [in] pNotification +/// PCSTR - Name of Notification +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPUnsubscribeFromNotification(HANDLE hNPMsgQ, PCSTR pSubscriberName, PCSTR pNotification) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pSubscriberName && NULL != pNotification) { + if (strlen(pSubscriberName) && strlen(pNotification)) { + NC_unsubscribe_frm_notif_msg data; + snprintf(data.notificationName, sizeof(data.notificationName), "%s", pNotification); + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pSubscriberName, NPS_UNSUBSCRIBE_FROM_EV_REQ, sizeof(NC_unsubscribe_frm_notif_msg), + (PVOID)&data); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +// NPUnsubscribeToNotifications +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPUnsubscribeFromNotifications(HANDLE hNPMsgQ, PCSTR pUnSubscriberName, UI_32 numNotifications, + SubscribeInfo *pUnSubscribeInfoArray) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pUnSubscriberName) { + if (strlen(pUnSubscriberName)) { + if (maxNotification < numNotifications) { + return eFrameworkunifiedStatusFail; + } + + size_t sizeOfMsg = (sizeof(NC_subscribe_msg) * numNotifications) + sizeof(UI_32); + if (NULL == pUnSubscribeInfoArray) { + return eFrameworkunifiedStatusInvldParam; + } + + PCHAR *pMsgBuffer = (PCHAR *)malloc(sizeOfMsg); + + if (NULL == pMsgBuffer) { + return eFrameworkunifiedStatusFail; + } + + NC_unsubscribe_multiple_notif_msg *pUnSubscribeMsg = (NC_unsubscribe_multiple_notif_msg *)pMsgBuffer; + + pUnSubscribeMsg->numNotifications = numNotifications; + memcpy(&pUnSubscribeMsg->notificationList[0], pUnSubscribeInfoArray, sizeof(NC_subscribe_msg) * numNotifications); + + for(UI_32 i = 0; i < numNotifications; i++) { + // Insert \0 at the end of character (up to 64bytes) by copying with strlcpy. + strlcpy(pUnSubscribeMsg->notificationList[i].notificationName, + pUnSubscribeInfoArray[i].notificationName, + sizeof(pUnSubscribeInfoArray[i].notificationName)); + } + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pUnSubscriberName, NPS_BATCH_UNSUBSCRIBE_FROM_EV_REQ, (UI_32)sizeOfMsg, (PVOID)pUnSubscribeMsg) ; + + free(pMsgBuffer); + pMsgBuffer = NULL; + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPReadPersistedData +/// API to requested the persistent data corresponding to specified notification if available +/// The caller recieves an acknowledgement once NPS completes data retrieval and sends it. +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of publisher message queue +/// \param [in] notification +/// PCSTR - Name of Notification +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPReadPersistedData(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR notification) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && NULL != notification) { + if (strlen(pPublisherName) && strlen(notification)) { + NC_get_pers_data_msg msg; + + snprintf(msg.notificationName, sizeof(msg.notificationName), "%s", notification); + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_GET_PERS_DATA_REQ, sizeof(msg), (PVOID)&msg) ; + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// \ingroup NPSavePersistentData +/// API to send message to Notification Service to save all persisted data that in Ram +/// to the filesystem via a file write. +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of publisher message queue +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPSavePersistentData(HANDLE hNPMsgQ, PCSTR pPublisherName) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_SAVE_PERS_DATA_REQ, 0, NULL) ; + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPRegisterPersistentFile +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPRegisterPersistentFile(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR pTag, + BOOL bIsUserFile) { // EFrameworkunifiedRegisterType eRegisterType) + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && NULL != pTag) { + if (strlen(pPublisherName) && strlen(pTag)) { + NC_RegisterPersistentFileMsg tMsg; + + snprintf(tMsg.cFileTag, sizeof(tMsg.cFileTag), "%s", pTag); + tMsg.bIsUserFile = bIsUserFile; + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_SET_PERSIST_FILE_PATH_REQ, sizeof(tMsg), + (PVOID)&tMsg); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPLoadPersistentFile +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPLoadPersistentFile(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR pDstFilePath, + PCSTR pTag, HANDLE hUser) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && + NULL != pDstFilePath && NULL != pTag) { + if (strlen(pPublisherName) && strlen(pDstFilePath) && strlen(pTag)) { + NC_LoadPersistedFileMsg tMsg = {}; + + snprintf(tMsg.cFilePath, sizeof(tMsg.cFilePath), "%s", pDstFilePath); + snprintf(tMsg.cFileTag, sizeof(tMsg.cFileTag), "%s", pTag); + + if (hUser) { + NC_User *pUser = (NC_User *) hUser; + snprintf(tMsg.cUsername, sizeof(tMsg.cUsername), "%s", pUser->cUsername != 0 ? pUser->cUsername : NULL); + } else { + strlcpy(tMsg.cUsername, GLOBAL_PERSISTENCE, sizeof(tMsg.cUsername)); + } + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_GET_PERS_FILE_REQ, sizeof(tMsg), (PVOID)&tMsg) ; + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPReleasePersistentFile +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPReleasePersistentFile(HANDLE hNPMsgQ, PCSTR pPublisherName, EFrameworkunifiedReleaseType eFrameworkunifiedReleaseType, PCSTR pTag, + PCSTR pFullFilePath, HANDLE hUser) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && + NULL != pTag && NULL != pFullFilePath) { + if (strlen(pPublisherName) && strlen(pTag) && strlen(pFullFilePath)) { + NC_ReleasePersistentFileMsg tMsg = {eFrameworkunifiedReleaseType, {0}, {0}}; + + snprintf(tMsg.cFilePath, sizeof(tMsg.cFilePath), "%s", pFullFilePath); + snprintf(tMsg.cFileTag, sizeof(tMsg.cFileTag), "%s", pTag); + + if (hUser) { + NC_User *pUser = (NC_User *) hUser; + snprintf(tMsg.cUsername, sizeof(tMsg.cUsername), "%s", pUser->cUsername != 0 ? pUser->cUsername : NULL); + } else { + strlcpy(tMsg.cUsername, GLOBAL_PERSISTENCE, sizeof(tMsg.cUsername)); + } + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_RELEASE_PERS_FILE_REQ, sizeof(tMsg), (PVOID)&tMsg) ; + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPPersistentSync +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPPersistentSync(PCSTR SrcName, HANDLE hNPMsgQ, UI_32 sessionid, PCSTR pPublisherName) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + CHAR data[4]; + UI_32 length; + HANDLE hResponse; + char mc_invoker_name[MAX_QUEUE_NAME_SIZE]; + + McCreateInvokerName(SrcName, sessionid, mc_invoker_name, sizeof(mc_invoker_name)); + hResponse = McOpenSyncReceiver(&mc_invoker_name[0]); + if (hResponse != NULL) { + eFrameworkunifiedStatus = McInvokeSync(hNPMsgQ, pPublisherName, NPS_NPP_SYNC_REQ , sizeof(data), data, sessionid, + hResponse, 0, NULL, &length); + McClose(hResponse); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusFail; + } + return eFrameworkunifiedStatus; +} +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPSetPersonality +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPSetPersonality(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR pUserName) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && NULL != pUserName) { + if (strlen(pPublisherName) && strlen(pUserName)) { + // NC_SetPersonalityMsg tMsg; + NC_User tMsg; + + snprintf(tMsg.cUsername, sizeof(tMsg.cUsername), "%s", pUserName); + + // eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_SET_PERSONALITY_REQ, sizeof(tMsg), (PVOID)&tMsg ) ; + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_CHANGE_PERSONALITY_REQ, sizeof(tMsg), (PVOID)&tMsg) ; + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPRegisterPersistentFolder +/// API to register persistence tag to folder that need to persist +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of publisher message queue +/// \param [in] pTag +/// PCSTR - Tag associated to folder that need to persist +/// \param [in] bIsUserFolder +/// BOOL - TRUE - user specific folder +/// FALSE - global file +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPRegisterPersistentFolder(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR pTag, BOOL bIsUserFolder) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && NULL != pTag) { + if (strlen(pPublisherName) && strlen(pTag)) { + NC_RegisterPersistentFolderMsg tMsg; + + snprintf(tMsg.cFolderTag, sizeof(tMsg.cFolderTag), "%s", pTag); + tMsg.bIsUserFolder = bIsUserFolder; + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_SET_PERSIST_FOLDER_PATH_REQ, sizeof(tMsg), + (PVOID)&tMsg); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPLoadPersistentFolder +/// API to load folder to given path and associated with given tag from persistent memory +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of publisher message queue +/// \param [in] pDstFolderPath +/// PCSTR - Destination where folder needs to be loaded +/// \param [in] pTag +/// PCSTR - Tag associated to folder that need to loaded from persistent memory +/// \param [in] hUser +/// HANDLE - Handle of the user +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPLoadPersistentFolder(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR pDstFolderPath, + PCSTR pTag, HANDLE hUser) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && + NULL != pDstFolderPath && NULL != pTag) { + if (strlen(pPublisherName) && strlen(pDstFolderPath) && strlen(pTag)) { + NC_LoadPersistedFolderMsg tMsg; + + snprintf(tMsg.cFolderPath, sizeof(tMsg.cFolderPath), "%s", pDstFolderPath); + snprintf(tMsg.cFolderTag, sizeof(tMsg.cFolderTag), "%s", pTag); + + if (hUser) { + NC_User *pUser = (NC_User *) hUser; + snprintf(tMsg.cUsername, sizeof(tMsg.cUsername), "%s", pUser->cUsername != 0 ? pUser->cUsername : NULL); + } else { + strlcpy(tMsg.cUsername, GLOBAL_PERSISTENCE, sizeof(tMsg.cUsername)); + } + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_GET_PERS_FOLDER_REQ, sizeof(tMsg), (PVOID)&tMsg) ; + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPReleasePersistentFolder +/// API to release folder for saving with tag name to persistent memory +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of publisher message queue +/// \param [in] eFrameworkunifiedReleaseType +/// EFrameworkunifiedReleaseType - eFrameworkunifiedNotOnRelease :not on release +/// eFrameworkunifiedPersistOnShutdown:persist on shutdown +/// eFrameworkunifiedPersistInstantly :persist instantly +/// \param [in] pTag +/// PCSTR - Tag associated to folder that need to persist +/// \param [in] pFullFolderPath +/// PCSTR - full folder path of folder that need to be stored in persistent memory +/// \param [in] hUser +/// HANDLE - Handle of the user +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPReleasePersistentFolder(HANDLE hNPMsgQ, PCSTR pPublisherName, EFrameworkunifiedReleaseType eFrameworkunifiedReleaseType, + PCSTR pTag, PCSTR pFullFolderPath, HANDLE hUser) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && + NULL != pTag && NULL != pFullFolderPath) { + if (strlen(pPublisherName) && strlen(pFullFolderPath) && strlen(pTag)) { + NC_ReleasePersistentFolderMsg tMsg = {eFrameworkunifiedReleaseType, {0}, {0}}; + + snprintf(tMsg.cFolderPath, sizeof(tMsg.cFolderPath), "%s", pFullFolderPath); + snprintf(tMsg.cFolderTag, sizeof(tMsg.cFolderTag), "%s", pTag); + + if (hUser) { + NC_User *pUser = (NC_User *) hUser; + snprintf(tMsg.cUsername, sizeof(tMsg.cUsername), "%s", pUser->cUsername != 0 ? pUser->cUsername : NULL); + } else { + strlcpy(tMsg.cUsername, GLOBAL_PERSISTENCE, sizeof(tMsg.cUsername)); + } + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_RELEASE_PERS_FOLDER_REQ, sizeof(tMsg), (PVOID)&tMsg) ; + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPChangePersonality +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPChangePersonality(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR pUserName) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != pUserName && 0 != strlen(pUserName)) { + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_CHANGE_PERSONALITY_REQ, sizeof(pUserName), (PVOID)&pUserName) ; + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// SendStopToNSNPP +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus SendStopToNSNPP(HANDLE hNPMsgQ, PCSTR pPublisherName, EFrameworkunifiedShutdownType eShutdownType, UI_32 uiStopMsgData) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != pPublisherName && 0 != strlen(pPublisherName)) { + NC_StopMsgData tMsg; + tMsg.eShutdownType = eShutdownType; + tMsg.uiStopMsgData = uiStopMsgData; + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_NPP_STOP_REQ, sizeof(tMsg), (PVOID)&tMsg); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPGetReadyStatusOfNPP +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPGetReadyStatusOfNPP(HANDLE hNPMsgQ, PCSTR pRequesterName) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != pRequesterName && 0 != strlen(pRequesterName)) { + eFrameworkunifiedStatus = McSend(hNPMsgQ, pRequesterName, NPS_GET_READYSTATUS_REQ, 0, NULL); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPRegisterImmediateNotifications +/// API to send message to Notification Service to register a set of notifications +/// +/// \param [in] hNPMsgQ +/// HANDLE - Handle to message queue of Notification service. +/// \param [in] pPublisherName +/// PCSTR - Name of Publisher message queue +/// \param [in] numNotifications +/// PCSTR - Name of Notification +/// \param [in] pNotificationArray +/// ImmediateNotificationInfo - Array of notifications +/// +/// \return status +/// EFrameworkunifiedStatus - success or error +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPRegisterImmediateNotifications(HANDLE hNPMsgQ, PCSTR pPublisherName, UI_32 numNotifications, + ImmediateNotificationInfo *pNotificationArray) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (maxNotification < numNotifications) { + return eFrameworkunifiedStatusFail; + } + + size_t sizeOfMsg = (sizeof(NC_register_immediate_notif_msg) * numNotifications) + sizeof(UI_32); + if (NULL == pNotificationArray) { + return eFrameworkunifiedStatusInvldParam; + } + + PCHAR *pMsgBuffer = (PCHAR *)malloc(sizeOfMsg); + + if (NULL == pMsgBuffer) { + return eFrameworkunifiedStatusFail; + } + + NC_register_multiple_immediate_notif_msg *pNotifMsg = (NC_register_multiple_immediate_notif_msg *)pMsgBuffer; + + if (NULL != pNotifMsg) { + pNotifMsg->numNotifications = numNotifications; + } + + memcpy(&pNotifMsg->notifierList[0], pNotificationArray, sizeof(NC_register_immediate_notif_msg) * numNotifications); + + for(UI_32 i = 0; i < numNotifications; i++ ) { + // Insert \0 at the end of character (up to 64bytes) by copying with strlcpy. + strlcpy(pNotifMsg->notifierList[i].notificationName, + pNotificationArray[i].notificationName, + sizeof(pNotificationArray[i].notificationName)); + } + + eFrameworkunifiedStatus = McSend(hNPMsgQ, pPublisherName, NPS_REGISTER_NOR_EV_REQ, (UI_32)sizeOfMsg, (PVOID)pNotifMsg) ; + + if (NULL != pMsgBuffer) { + free(pMsgBuffer); + pMsgBuffer = NULL; + } + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPClearPersistedData +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPClearPersistedData(HANDLE hNPMsgQ, PCSTR pRequesterName, EFrameworkunifiedClearPersistence eFrameworkunifiedClearPersistenceScope) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if ((NULL != hNPMsgQ) && (NULL != pRequesterName) && (0 != strlen(pRequesterName))) { + NC_ClearPersistedDataReq tMsg = {}; + tMsg.ePersistenceData = eFrameworkunifiedClearPersistenceScope; + + eFrameworkunifiedStatus = McSend(hNPMsgQ, + pRequesterName, + NPS_DELETE_PERSISTED_DATA_REQ, + sizeof(tMsg), + &tMsg); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPSetPersistNotfnDefaultValue +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPSetPersistNotfnDefaultValue(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR pNotification, PCVOID pData, + const UI_32 iLength) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && NULL != pNotification) { + if ((0 != strlen(pPublisherName)) && (0 != strlen(pNotification))) { + + // Insert \0 at the end of characters (up to 64bytes) by copying pNotification to local variables with strlcpy. + char tmp_notification[MAX_STRING_SIZE_NOTIFICATION] = {0}; + strlcpy(tmp_notification, pNotification, MAX_STRING_SIZE_NOTIFICATION); + + eFrameworkunifiedStatus = McSendWithSysInfo(hNPMsgQ, + pPublisherName, + NPS_SET_DEFAULT_PERS_DATA, + (PCHAR)tmp_notification, + iLength, + pData, + 0); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPSetPersistentNotfnType +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPSetPersistentNotfnType(HANDLE hNPMsgQ, PCSTR pPublisherName, PCSTR pNotification, + EFrameworkunifiedPersistCategory ePersistCategory) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && NULL != pNotification) { + if ((0 != strlen(pPublisherName)) && (0 != strlen(pNotification))) { + + // Insert \0 at the end of characters (up to 64bytes) by copying pNotification to local variables with strlcpy. + char tmp_notification[MAX_STRING_SIZE_NOTIFICATION] = {0}; + strlcpy(tmp_notification, pNotification, MAX_STRING_SIZE_NOTIFICATION); + + eFrameworkunifiedStatus = McSendWithSysInfo(hNPMsgQ, + pPublisherName, + NPS_SET_NOTFN_PERSISTENT_TYPE, + (PCHAR)tmp_notification, + sizeof(ePersistCategory), + &ePersistCategory, + 0); + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPSetFilePersistentType +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPSetFilePersistentType(HANDLE hNPMsgQ, PCSTR pPublisherName, + PCSTR pTag, EFrameworkunifiedPersistCategory ePersistCategory) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && NULL != pTag) { + if ((0 != strlen(pPublisherName)) && (0 != strlen(pTag))) { + NC_SetFilePersistType tMsg = {}; + + tMsg.ePersistType = ePersistCategory; + + snprintf(tMsg.cTag, sizeof(tMsg.cTag), "%s", pTag); + + eFrameworkunifiedStatus = McSend(hNPMsgQ, + pPublisherName, + NPS_SET_FILE_PERSISTENT_TYPE, + sizeof(tMsg), + (PVOID)&tMsg) ; + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +/// NPSetFolderPersistentType +//////////////////////////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus NPSetFolderPersistentType(HANDLE hNPMsgQ, PCSTR pPublisherName, + PCSTR pTag, EFrameworkunifiedPersistCategory ePersistCategory) { + EFrameworkunifiedStatus eFrameworkunifiedStatus = eFrameworkunifiedStatusOK; + + if (NULL != hNPMsgQ && NULL != pPublisherName && NULL != pTag) { + if ((0 != strlen(pPublisherName)) && (0 != strlen(pTag))) { + NC_SetFolderPersistType tMsg = {}; + + tMsg.ePersistType = ePersistCategory; + snprintf(tMsg.cTag, sizeof(tMsg.cTag), "%s", pTag); + + eFrameworkunifiedStatus = McSend(hNPMsgQ, + pPublisherName, + NPS_SET_FOLDER_PERSISTENT_TYPE, + sizeof(tMsg), + (PVOID)&tMsg) ; + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + } else { + eFrameworkunifiedStatus = eFrameworkunifiedStatusInvldParam; + } + + return eFrameworkunifiedStatus; +} + +// EOF