+ return shared_ptr<Session>{new Session{shared_from_this()},
+ default_delete<Session>{}};
+}
+
+shared_ptr<UserDevice> Context::create_user_device(
+ string vendor, string model, string version)
+{
+ return shared_ptr<UserDevice>{
+ new UserDevice{move(vendor), move(model), move(version)},
+ default_delete<UserDevice>{}};
+}
+
+shared_ptr<Packet> Context::create_header_packet(Glib::TimeVal start_time)
+{
+ auto header = g_new(struct sr_datafeed_header, 1);
+ header->feed_version = 1;
+ header->starttime.tv_sec = start_time.tv_sec;
+ header->starttime.tv_usec = start_time.tv_usec;
+ auto packet = g_new(struct sr_datafeed_packet, 1);
+ packet->type = SR_DF_HEADER;
+ packet->payload = header;
+ return shared_ptr<Packet>{new Packet{nullptr, packet},
+ default_delete<Packet>{}};
+}
+
+shared_ptr<Packet> Context::create_meta_packet(
+ map<const ConfigKey *, Glib::VariantBase> config)
+{
+ auto meta = g_new0(struct sr_datafeed_meta, 1);
+ for (const auto &input : config) {
+ const auto &key = input.first;
+ const auto &value = input.second;
+ auto *const output = g_new(struct sr_config, 1);
+ output->key = key->id();
+ output->data = value.gobj_copy();
+ meta->config = g_slist_append(meta->config, output);
+ }
+ auto packet = g_new(struct sr_datafeed_packet, 1);
+ packet->type = SR_DF_META;
+ packet->payload = meta;
+ return shared_ptr<Packet>{new Packet{nullptr, packet},
+ default_delete<Packet>{}};
+}
+
+shared_ptr<Packet> Context::create_logic_packet(
+ void *data_pointer, size_t data_length, unsigned int unit_size)
+{
+ auto logic = g_new(struct sr_datafeed_logic, 1);
+ logic->length = data_length;
+ logic->unitsize = unit_size;
+ logic->data = data_pointer;
+ auto packet = g_new(struct sr_datafeed_packet, 1);
+ packet->type = SR_DF_LOGIC;
+ packet->payload = logic;
+ return shared_ptr<Packet>{new Packet{nullptr, packet}, default_delete<Packet>{}};
+}
+
+shared_ptr<Packet> Context::create_analog_packet(
+ vector<shared_ptr<Channel> > channels,
+ const float *data_pointer, unsigned int num_samples, const Quantity *mq,
+ const Unit *unit, vector<const QuantityFlag *> mqflags)
+{
+ auto analog = g_new0(struct sr_datafeed_analog, 1);
+ auto meaning = g_new0(struct sr_analog_meaning, 1);
+ auto encoding = g_new0(struct sr_analog_encoding, 1);
+ auto spec = g_new0(struct sr_analog_spec, 1);
+
+ analog->meaning = meaning;
+
+ for (const auto &channel : channels)
+ meaning->channels = g_slist_append(meaning->channels, channel->_structure);
+ meaning->mq = static_cast<sr_mq>(mq->id());
+ meaning->unit = static_cast<sr_unit>(unit->id());
+ meaning->mqflags = static_cast<sr_mqflag>(QuantityFlag::mask_from_flags(move(mqflags)));
+
+ analog->encoding = encoding;
+
+ encoding->unitsize = sizeof(float);
+ encoding->is_signed = TRUE;
+ encoding->is_float = TRUE;
+#ifdef WORDS_BIGENDIAN
+ encoding->is_bigendian = TRUE;
+#else
+ encoding->is_bigendian = FALSE;
+#endif
+ encoding->digits = 0;
+ encoding->is_digits_decimal = FALSE;
+ encoding->scale.p = 1;
+ encoding->scale.q = 1;
+ encoding->offset.p = 0;
+ encoding->offset.q = 1;
+
+ analog->spec = spec;
+
+ spec->spec_digits = 0;
+
+ analog->num_samples = num_samples;
+ analog->data = (float*)data_pointer;
+ auto packet = g_new(struct sr_datafeed_packet, 1);
+ packet->type = SR_DF_ANALOG;
+ packet->payload = analog;
+ return shared_ptr<Packet>{new Packet{nullptr, packet}, default_delete<Packet>{}};
+}
+
+shared_ptr<Packet> Context::create_end_packet()
+{
+ auto packet = g_new(struct sr_datafeed_packet, 1);
+ packet->type = SR_DF_END;
+ return shared_ptr<Packet>{new Packet{nullptr, packet},
+ default_delete<Packet>{}};