/*************************************************************************//** * * Copyright © 2017 AT&T Intellectual Property. All rights reserved. * * Unless otherwise specified, all software contained herein is * 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. * ****************************************************************************/ /**************************************************************************//** * @file * Source module implementing EVEL Batch API. * * This file implements the EVEL Batch API which is intended to provide a * simple wrapper around packaging multiple EVEL messages into single HTTP(S) package * This is implemented per VES 5.3 standards. Currently max size of package is 160K * ****************************************************************************/ #include #include #include #include "evel.h" #include "evel_internal.h" /**************************************************************************//** * Create a new empty Batch event. * * @note The mandatory fields on the Batch must be supplied to this factory * function and are immutable once set. Optional fields have explicit * setter functions, but again values may only be set once so that the * Batch has immutable properties. * @params Event name and Event id are dummy strings. Not encoded into JSON * @returns pointer to the newly manufactured ::EVENT_HEADER. If the event is * not used (i.e. posted) it must be released using ::evel_free_batch. * @retval NULL Failed to create the event. *****************************************************************************/ EVENT_HEADER * evel_new_batch(const char* ev_name, const char *ev_id) { EVENT_HEADER * other = NULL; EVEL_ENTER(); /***************************************************************************/ /* Check preconditions. */ /***************************************************************************/ /***************************************************************************/ /* Allocate the Batch. */ /***************************************************************************/ other = malloc(sizeof(EVENT_HEADER)); if (other == NULL) { log_error_state("Out of memory"); goto exit_label; } memset(other, 0, sizeof(EVENT_HEADER)); EVEL_DEBUG("New Batch is at %lp", other); /***************************************************************************/ /* Initialize the header & the Batch fields. Optional string values are */ /* uninitialized (NULL). */ /***************************************************************************/ evel_init_header_nameid(other,ev_name,ev_id); other->event_domain = EVEL_DOMAIN_BATCH; other->major_version = EVEL_BATCH_MAJOR_VERSION; other->minor_version = EVEL_BATCH_MINOR_VERSION; dlist_initialize(&other->batch_events); exit_label: EVEL_EXIT(); return other; } /**************************************************************************//** * Add an additional VES Message into Batch Event * * The function may be called as many times without reaching 160K max json size * limit. * The max limit is only checked at encoding time and error generated * * @param batchev Pointer to already created new Batch Event. * @param child Pointer to additional VES Event *****************************************************************************/ void evel_batch_add_event(EVENT_HEADER * batchev, EVENT_HEADER *child) { EVEL_ENTER(); /***************************************************************************/ /* Check preconditions. */ /***************************************************************************/ assert(batchev != NULL); assert(batchev->event_domain == EVEL_DOMAIN_BATCH); assert(child != NULL); EVEL_DEBUG("Adding Batch event"); dlist_push_last(&batchev->batch_events, child); EVEL_EXIT(); } /**************************************************************************//** * Free a Batch Event. * * Free off the Batch supplied. Will free all the contained VES message memory. * * @note It does not free the Batch itself, since that may be part of a * larger structure. *****************************************************************************/ void evel_free_batch(EVENT_HEADER * event) { EVENT_HEADER * batch_field = NULL; EVEL_ENTER(); /***************************************************************************/ /* Check preconditions. As an internal API we don't allow freeing NULL */ /* events as we do on the public API. */ /***************************************************************************/ assert(event != NULL); assert(event->event_domain == EVEL_DOMAIN_BATCH); /***************************************************************************/ /* Free all internal strings then the header itself. */ /***************************************************************************/ batch_field = dlist_pop_last(&event->batch_events); while (batch_field != NULL) { EVEL_DEBUG("Freeing Batch Event (%s, %s)", batch_field->event_name, batch_field->event_id); evel_free_event(batch_field); batch_field = dlist_pop_last(&event->batch_events); } evel_free_header(event); EVEL_EXIT(); }