/** * pka_manifest_compare: * @a: A #PkaManifest. * @b: A #PkaManifest. * * Standard qsort() style compare function. * * Returns: Less than zero if @a precedes @b. Greater than zero if @b * precedes @a. Otherwise, zero. * Side effects: None. */ gint pka_manifest_compare (gconstpointer a, /* IN */ gconstpointer b) /* IN */ { gint aid; gint bid; aid = pka_manifest_get_source_id((PkaManifest *)a); bid = pka_manifest_get_source_id((PkaManifest *)b); return aid - bid; }
static gboolean pka_encoder_real_encode_manifest (PkaManifest *manifest, /* IN */ guint8 **data, /* IN */ gsize *data_len) /* IN */ { EggBuffer *buf, *mbuf, *ebuf; struct timespec ts; guint64 t; const guint8 *tbuf; gsize tlen; gint rows; gint i; g_return_val_if_fail(manifest != NULL, FALSE); g_return_val_if_fail(data != NULL, FALSE); g_return_val_if_fail(data_len != NULL, FALSE); ENTRY; buf = egg_buffer_new(); /* * Field 1: Timestamp. Currently encoded in microseconds. We should * determine what we want to do long-term. */ pka_manifest_get_timespec(manifest, &ts); timespec_to_usec(&ts, &t); egg_buffer_write_tag(buf, 1, EGG_BUFFER_UINT64); egg_buffer_write_uint64(buf, t); /* * Desired sample resolution. This allows us to save considerable * width in the relative-timestamp per sample. */ egg_buffer_write_tag(buf, 2, EGG_BUFFER_ENUM); egg_buffer_write_uint(buf, pka_manifest_get_resolution(manifest)); /* * Source index offset within the channel. */ egg_buffer_write_tag(buf, 3, EGG_BUFFER_UINT); egg_buffer_write_uint(buf, pka_manifest_get_source_id(manifest)); /* * Create a new buffer for the repeated data series. */ ebuf = egg_buffer_new(); /* * Write the manifest data description. This is a set of embedded * messages within the message. */ rows = pka_manifest_get_n_rows(manifest); for (i = 1; i <= rows; i++) { mbuf = egg_buffer_new(); /* * Write the row identifier. */ egg_buffer_write_tag(mbuf, 1, EGG_BUFFER_UINT); egg_buffer_write_uint(mbuf, i); /* * Write the row type. */ egg_buffer_write_tag(mbuf, 2, EGG_BUFFER_ENUM); egg_buffer_write_uint(mbuf, pka_manifest_get_row_type(manifest, i)); /* * Write the row name. */ egg_buffer_write_tag(mbuf, 3, EGG_BUFFER_STRING); egg_buffer_write_string(mbuf, pka_manifest_get_row_name(manifest, i)); /* * Embed the message as a data blob. */ egg_buffer_get_buffer(mbuf, &tbuf, &tlen); egg_buffer_write_data(ebuf, tbuf, tlen); egg_buffer_unref(mbuf); } /* * Add the repeated message length and data. */ egg_buffer_get_buffer(ebuf, &tbuf, &tlen); egg_buffer_write_tag(buf, 4, EGG_BUFFER_REPEATED); egg_buffer_write_data(buf, tbuf, tlen); egg_buffer_unref(ebuf); /* * Copy the buffer to the destination. */ egg_buffer_get_buffer(buf, &tbuf, &tlen); *data = g_malloc(tlen); *data_len = tlen; memcpy(*data, tbuf, tlen); egg_buffer_unref(buf); RETURN(TRUE); }