AJ_Status AJNS_Consumer_DismissNotification(AJ_BusAttachment* busAttachment, uint16_t version, int32_t notificationId, const char* appId, const char* senderName, AJSVC_MethodCallCompleted completedCallback)
{
    AJ_InfoPrintf(("Inside DismissNotification()\n"));
    AJ_Status status = AJ_OK;

    if ((version < 2) || (senderName == NULL) || (senderName[0] == '\0')) { // Producer does not support dismissal but other consumers might so send Dismiss signal
        status = AJNS_SendDismissSignal(busAttachment, notificationId, appId);
        return status;
    }

    if (!lastSessionRequestSerialNum) {
        onDismissCompleted = completedCallback;
        status = AJNS_Consumer_CreateSessionWithProducer(busAttachment, senderName, &lastSessionRequestSerialNum);
        if (status == AJ_OK) {
            notificationInProcess.version = version;
            notificationInProcess.notificationId = notificationId;
            strncpy(notificationInProcess.appId, appId, sizeof(notificationInProcess.appId));
            strncpy(notificationInProcess.originalSenderName, senderName, sizeof(notificationInProcess.originalSenderName));
        } else {
            if (onDismissCompleted) {
                status = AJNS_SendDismissSignal(busAttachment, notificationId, appId);
                AJ_InfoPrintf(("DismissNotification(): SendDismissSignal returned status %s\n", AJ_StatusText(status)));
                (*onDismissCompleted)(status, NULL);
                onDismissCompleted = NULL;
            }
            memset(&notificationInProcess, 0, sizeof(AJNS_Consumer_NotificationReference));
        }
    }

    return status;
}
AJ_Status AJNS_Producer_DismissRequestHandler(AJ_BusAttachment* busAttachment, AJ_Message* msg)
{
    AJ_Status status;
    int32_t notificationId;
    const char* appId;
    AJ_Message reply;

   // AJ_InfoPrintf(("In DismissMsg\n"));
    status = AJ_UnmarshalArgs(msg, "i", &notificationId);
    if (status != AJ_OK) 
	{
        AJ_ErrPrintf(("Could not unmarshal message\n"));
        return status;
    }

    status = AJ_MarshalReplyMsg(msg, &reply);
    if (status != AJ_OK) 
	{
        return status;
    }

    status = AJ_DeliverMsg(&reply);
    if (status != AJ_OK)
	 {
        return status;
    }

    appId = AJSVC_PropertyStore_GetValue(AJSVC_PROPERTY_STORE_APP_ID);
    status = AJNS_SendDismissSignal(busAttachment, notificationId, appId);
    if (status != AJ_OK) 
	{
        return status;
    }

    status = AJNS_Producer_CancelNotificationById(busAttachment, notificationId);
    if (status != AJ_OK) 
	{
        return status;
    }

 //   AJ_InfoPrintf(("***************** Message with Notification id %d dismissed successfully *****************\n", notificationId));

    return status;
}
AJSVC_ServiceStatus AJNS_Consumer_SessionRejectedHandler(AJ_BusAttachment* busAttachment, uint32_t replySerialNum, uint32_t replyCode)
{
    AJSVC_ServiceStatus serviceStatus = AJSVC_SERVICE_STATUS_NOT_HANDLED;
    AJ_Status status;

    if (lastSessionRequestSerialNum != 0 && lastSessionRequestSerialNum == replySerialNum) { // Check if this is a reply to our request
        AJ_InfoPrintf(("HandleSessionRejected(): Got reply serial number %u that matches last request serial number %u\n", replySerialNum, lastSessionRequestSerialNum));
        if (producerSessionId == 0) {
            if (onDismissCompleted) {
                status = AJNS_SendDismissSignal(busAttachment, notificationInProcess.notificationId, notificationInProcess.appId);
                AJ_InfoPrintf(("HandleSessionJoinFailed(): SendDismissSignal returned status %s\n", AJ_StatusText(status)));
                (*onDismissCompleted)(status, NULL);
                onDismissCompleted = NULL;
            }
            memset(&notificationInProcess, 0, sizeof(AJNS_Consumer_NotificationReference));
            lastSessionRequestSerialNum = 0;
            serviceStatus = AJSVC_SERVICE_STATUS_HANDLED;
        }
    }

    return serviceStatus;
}