#include #include "google/protobuf/descriptor.h" #include "google/protobuf/util/json_util.h" #include "google/protobuf/util/type_resolver.h" #include "google/protobuf/util/type_resolver_util.h" #include "google/protobuf/message.h" #include "google/protobuf/descriptor.h" #include "google/protobuf/descriptor.pb.h" #include "google/protobuf/dynamic_message.h" #include "google/protobuf/compiler/importer.h" #include "3rdparty/yyjson/yyjson.h" #include "3rdparty/bus_client/cbhomeclient.h" #include "3rdparty/bus_client/message.h" #include "proto/x86_64/sysset.pb.h" using namespace protomsg; using namespace std; using google::protobuf::util::JsonStringToMessage; const char *CONTENT_TYPE_JSON = "application/json"; bool json_to_proto(const std::string &json, google::protobuf::Message& message) { google::protobuf::util::JsonParseOptions options; options.ignore_unknown_fields = true; return JsonStringToMessage(json, &message,options).ok(); } bool proto_to_json(const google::protobuf::Message& message, std::string& json) { google::protobuf::util::JsonPrintOptions options; options.add_whitespace = true; options.always_print_primitive_fields = true; options.preserve_proto_field_names = true; return MessageToJsonString(message, &json, options).ok(); } char *make_get_request(const char *topic) { auto doc = yyjson_mut_doc_new(NULL); auto root = yyjson_mut_obj(doc); yyjson_mut_obj_add_strn(doc, root, "path", topic, strlen(topic)); yyjson_mut_obj_add_strn(doc, root, "method", "GET", 3); yyjson_mut_obj_add_strn(doc, root, "contentType", CONTENT_TYPE_JSON, strlen(CONTENT_TYPE_JSON)); size_t jsonl = 0; char *json = yyjson_mut_val_write(root, 0, &jsonl); yyjson_mut_doc_free(doc); return json; } bool bus_dbapi_get(void *handle, const char* topic, google::protobuf::Message& message) { const auto topicl = strlen(topic); auto reqData = make_get_request(topic); auto reqmsg = make_req_msg(topic, topicl, reqData, strlen(reqData)); crepmsg *repmsg = NULL; if (bus_client_request(handle, reqmsg, &repmsg)) { printf("======>> bus_client_reqest [%s] get [%s]\n", topic, repmsg->data); } else { return false; } char* msgdata = repmsg->data + 32; msgdata[strlen(msgdata) -1] = '\0'; printf("======>> protomsg: %s\n", msgdata); std::string jsonString = msgdata; if (json_to_proto(jsonString, message)) { printf("======>> json_to_proto done\n"); } else { printf("======>> json_to_proto fail\n"); return false; } free_reqmsg(reqmsg); free(reqData); return true; }