X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fsession.c;h=0940617c12582076376a1999cd1ccc50e2464d03;hb=965261008009e41e9f89efe416ed1ae5d23aadaf;hp=0620b222b2cafa37b596d9011be2964d1320887b;hpb=f129014ca4cc1e38749934c5089b8bcb2ab3ea35;p=libsigrok.git diff --git a/src/session.c b/src/session.c index 0620b222..0940617c 100644 --- a/src/session.c +++ b/src/session.c @@ -1071,6 +1071,42 @@ static void datafeed_dump(const struct sr_datafeed_packet *packet) } } +/** + * Helper to send a meta datafeed package (SR_DF_META) to the session bus. + * + * @param sdi The device instance to send the package from. Must not be NULL. + * @param key The config key to send to the session bus. + * @param var The value to send to the session bus. + * + * @retval SR_OK Success. + * @retval SR_ERR_ARG Invalid argument. + * + * @private + */ +SR_PRIV int sr_session_send_meta(const struct sr_dev_inst *sdi, + uint32_t key, GVariant *var) +{ + struct sr_config *cfg; + struct sr_datafeed_packet packet; + struct sr_datafeed_meta meta; + int ret; + + cfg = sr_config_new(key, var); + + memset(&meta, 0, sizeof(meta)); + + packet.type = SR_DF_META; + packet.payload = &meta; + + meta.config = g_slist_append(NULL, cfg); + + ret = sr_session_send(sdi, &packet); + g_slist_free(meta.config); + sr_config_free(cfg); + + return ret; +} + /** * Send a packet to whatever is listening on the datafeed bus. * @@ -1294,7 +1330,7 @@ SR_PRIV int sr_session_source_add_channel(struct sr_session *session, /* We should be using g_io_create_watch(), but can't without * changing the driver API, as the callback signature is different. */ -#ifdef G_OS_WIN32 +#ifdef _WIN32 g_io_channel_win32_make_pollfd(channel, events, &pollfd); #else pollfd.fd = g_io_channel_unix_get_fd(channel); @@ -1450,8 +1486,7 @@ static void copy_src(struct sr_config *src, struct sr_datafeed_meta *meta_copy) g_memdup(src, sizeof(struct sr_config))); } -/** @private */ -SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet, +SR_API int sr_packet_copy(const struct sr_datafeed_packet *packet, struct sr_datafeed_packet **copy) { const struct sr_datafeed_meta *meta; @@ -1489,8 +1524,10 @@ SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet, logic_copy->length = logic->length; logic_copy->unitsize = logic->unitsize; logic_copy->data = g_malloc(logic->length * logic->unitsize); - if (!logic_copy->data) + if (!logic_copy->data) { + g_free(logic_copy); return SR_ERR; + } memcpy(logic_copy->data, logic->data, logic->length * logic->unitsize); (*copy)->payload = logic_copy; break; @@ -1520,7 +1557,7 @@ SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet, return SR_OK; } -void sr_packet_free(struct sr_datafeed_packet *packet) +SR_API void sr_packet_free(struct sr_datafeed_packet *packet) { const struct sr_datafeed_meta *meta; const struct sr_datafeed_logic *logic; @@ -1565,7 +1602,6 @@ void sr_packet_free(struct sr_datafeed_packet *packet) sr_err("Unknown packet type %d", packet->type); } g_free(packet); - } /** @} */