Example #1
0
/**
 * 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;
}
Example #2
0
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);
}