| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | /* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */#ifndef GRPC_TEST_CPP_PROTO_SERVER_REFLECTION_DATABSE_H#define GRPC_TEST_CPP_PROTO_SERVER_REFLECTION_DATABSE_H#include <mutex>#include <unordered_map>#include <unordered_set>#include <vector>#include <grpcpp/grpcpp.h>#include <grpcpp/impl/codegen/config_protobuf.h>#include "src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h"namespace grpc {// ProtoReflectionDescriptorDatabase takes a stub of ServerReflection and// provides the methods defined by DescriptorDatabase interfaces. It can be used// to feed a DescriptorPool instance.class ProtoReflectionDescriptorDatabase : public protobuf::DescriptorDatabase { public:  explicit ProtoReflectionDescriptorDatabase(      std::unique_ptr<reflection::v1alpha::ServerReflection::Stub> stub);  explicit ProtoReflectionDescriptorDatabase(      const std::shared_ptr<grpc::Channel>& channel);  virtual ~ProtoReflectionDescriptorDatabase();  // The following four methods implement DescriptorDatabase interfaces.  //  // Find a file by file name.  Fills in in *output and returns true if found.  // Otherwise, returns false, leaving the contents of *output undefined.  bool FindFileByName(const string& filename,                      protobuf::FileDescriptorProto* output) override;  // Find the file that declares the given fully-qualified symbol name.  // If found, fills in *output and returns true, otherwise returns false  // and leaves *output undefined.  bool FindFileContainingSymbol(const string& symbol_name,                                protobuf::FileDescriptorProto* output) override;  // Find the file which defines an extension extending the given message type  // with the given field number.  If found, fills in *output and returns true,  // otherwise returns false and leaves *output undefined.  containing_type  // must be a fully-qualified type name.  bool FindFileContainingExtension(      const string& containing_type, int field_number,      protobuf::FileDescriptorProto* output) override;  // Finds the tag numbers used by all known extensions of  // extendee_type, and appends them to output in an undefined  // order. This method is best-effort: it's not guaranteed that the  // database will find all extensions, and it's not guaranteed that  // FindFileContainingExtension will return true on all of the found  // numbers. Returns true if the search was successful, otherwise  // returns false and leaves output unchanged.  bool FindAllExtensionNumbers(const string& extendee_type,                               std::vector<int>* output) override;  // Provide a list of full names of registered services  bool GetServices(std::vector<grpc::string>* output); private:  typedef ClientReaderWriter<      grpc::reflection::v1alpha::ServerReflectionRequest,      grpc::reflection::v1alpha::ServerReflectionResponse>      ClientStream;  const protobuf::FileDescriptorProto ParseFileDescriptorProtoResponse(      const grpc::string& byte_fd_proto);  void AddFileFromResponse(      const grpc::reflection::v1alpha::FileDescriptorResponse& response);  const std::shared_ptr<ClientStream> GetStream();  bool DoOneRequest(      const grpc::reflection::v1alpha::ServerReflectionRequest& request,      grpc::reflection::v1alpha::ServerReflectionResponse& response);  std::shared_ptr<ClientStream> stream_;  grpc::ClientContext ctx_;  std::unique_ptr<grpc::reflection::v1alpha::ServerReflection::Stub> stub_;  std::unordered_set<string> known_files_;  std::unordered_set<string> missing_symbols_;  std::unordered_map<string, std::unordered_set<int>> missing_extensions_;  std::unordered_map<string, std::vector<int>> cached_extension_numbers_;  std::mutex stream_mutex_;  protobuf::SimpleDescriptorDatabase cached_db_;};}  // namespace grpc#endif  // GRPC_TEST_CPP_METRICS_SERVER_H
 |