Add support in protoc-gen-cppstream for optional fields in proto3

This support is optional. experimental_allow_proto3_optional must be
included in the --cppstream_opt field to enable this.

Test: m -j frameworks/base/tools/streaming_proto
Fixes: 291329285
Change-Id: I7b985b84edf0cda46d06a9ebc39df574695ef418
diff --git a/tools/streaming_proto/OWNERS b/tools/streaming_proto/OWNERS
new file mode 100644
index 0000000..5f6e59f
--- /dev/null
+++ b/tools/streaming_proto/OWNERS
@@ -0,0 +1 @@
+mwachens@google.com
diff --git a/tools/streaming_proto/cpp/main.cpp b/tools/streaming_proto/cpp/main.cpp
index fe9a438..905ed35 100644
--- a/tools/streaming_proto/cpp/main.cpp
+++ b/tools/streaming_proto/cpp/main.cpp
@@ -119,9 +119,8 @@
     text << endl;
 }
 
-static void
-write_header_file(CodeGeneratorResponse* response, const FileDescriptorProto& file_descriptor)
-{
+static void write_header_file(const string& request_parameter, CodeGeneratorResponse* response,
+                              const FileDescriptorProto& file_descriptor) {
     stringstream text;
 
     text << "// Generated by protoc-gen-cppstream. DO NOT MODIFY." << endl;
@@ -159,6 +158,9 @@
     text << endl;
     text << "#endif // " << header << endl;
 
+    if (request_parameter.find("experimental_allow_proto3_optional") != string::npos) {
+        response->set_supported_features(CodeGeneratorResponse::FEATURE_PROTO3_OPTIONAL);
+    }
     CodeGeneratorResponse::File* file_response = response->add_file();
     file_response->set_name(make_filename(file_descriptor));
     file_response->set_content(text.str());
@@ -182,7 +184,7 @@
     for (int i=0; i<N; i++) {
         const FileDescriptorProto& file_descriptor = request.proto_file(i);
         if (should_generate_for_file(request, file_descriptor.name())) {
-            write_header_file(&response, file_descriptor);
+            write_header_file(request.parameter(), &response, file_descriptor);
         }
     }