+}; /* class DispatchValuesCall */
+
+class ListValuesCall : public Call
+{
+public:
+ ListValuesCall(collectd::Collectd::AsyncService *service, grpc::ServerCompletionQueue *cq)
+ : Call(service, cq), responder_(&ctx_)
+ {
+ Handle();
+ } /* ListValuesCall() */
+
+ virtual ~ListValuesCall()
+ { }
+
+private:
+ void Create()
+ {
+ service_->RequestListValues(&ctx_, &request_, &responder_, cq_, cq_, this);
+ } /* Create() */
+
+ void Process()
+ {
+ new ListValuesCall(service_, cq_);
+
+ char **names = NULL;
+ cdtime_t *times = NULL;
+ size_t i, n = 0;
+
+ auto status = grpc::Status::OK;
+ if (uc_get_names(&names, ×, &n)) {
+ status = grpc::Status(grpc::StatusCode::INTERNAL,
+ grpc::string("failed to retrieve values"));
+ }
+
+ for (i = 0; i < n; i++) {
+ auto v = reply_.add_value();
+ auto t = TimeUtil::NanosecondsToTimestamp(CDTIME_T_TO_NS(times[i]));
+ v->set_name(names[i]);
+ v->set_allocated_time(new google::protobuf::Timestamp(t));
+ sfree(names[i]);
+ }
+ sfree(names);
+ sfree(times);
+
+ responder_.Finish(reply_, status, this);
+ } /* Process() */
+
+ void Finish()
+ {
+ delete this;
+ } /* Finish() */
+
+ collectd::ListValuesRequest request_;
+ collectd::ListValuesReply reply_;
+
+ grpc::ServerAsyncResponseWriter<collectd::ListValuesReply> responder_;
+}; /* class ListValuesCall */