summaryrefslogtreecommitdiff
path: root/grpc/src/core/ext/transport/binder/transport/binder_stream.h
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/src/core/ext/transport/binder/transport/binder_stream.h')
-rw-r--r--grpc/src/core/ext/transport/binder/transport/binder_stream.h119
1 files changed, 119 insertions, 0 deletions
diff --git a/grpc/src/core/ext/transport/binder/transport/binder_stream.h b/grpc/src/core/ext/transport/binder/transport/binder_stream.h
new file mode 100644
index 00000000..b04076b1
--- /dev/null
+++ b/grpc/src/core/ext/transport/binder/transport/binder_stream.h
@@ -0,0 +1,119 @@
+// Copyright 2021 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_CORE_EXT_TRANSPORT_BINDER_TRANSPORT_BINDER_STREAM_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_TRANSPORT_BINDER_STREAM_H
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/ext/transport/binder/transport/binder_transport.h"
+
+struct RecvInitialMetadataArgs {
+ grpc_binder_stream* gbs;
+ grpc_binder_transport* gbt;
+ int tx_code;
+ absl::StatusOr<grpc_binder::Metadata> initial_metadata;
+};
+
+struct RecvMessageArgs {
+ grpc_binder_stream* gbs;
+ grpc_binder_transport* gbt;
+ int tx_code;
+ absl::StatusOr<std::string> message;
+};
+
+struct RecvTrailingMetadataArgs {
+ grpc_binder_stream* gbs;
+ grpc_binder_transport* gbt;
+ int tx_code;
+ absl::StatusOr<grpc_binder::Metadata> trailing_metadata;
+ int status;
+};
+
+struct RegisterStreamArgs {
+ grpc_binder_stream* gbs;
+ grpc_binder_transport* gbt;
+};
+
+// TODO(mingcl): Figure out if we want to use class instead of struct here
+struct grpc_binder_stream {
+ // server_data will be null for client, and for server it will be whatever
+ // passed in to the accept_stream_fn callback by client.
+ grpc_binder_stream(grpc_binder_transport* t, grpc_stream_refcount* refcount,
+ const void* /*server_data*/, grpc_core::Arena* arena,
+ int tx_code, bool is_client)
+ : t(t),
+ refcount(refcount),
+ arena(arena),
+ tx_code(tx_code),
+ is_client(is_client),
+ is_closed(false) {
+ recv_initial_metadata_args.gbs = this;
+ recv_initial_metadata_args.gbt = t;
+ recv_message_args.gbs = this;
+ recv_message_args.gbt = t;
+ recv_trailing_metadata_args.gbs = this;
+ recv_trailing_metadata_args.gbt = t;
+ }
+
+ ~grpc_binder_stream() {
+ GRPC_ERROR_UNREF(cancel_self_error);
+ if (destroy_stream_then_closure != nullptr) {
+ grpc_core::ExecCtx::Run(DEBUG_LOCATION, destroy_stream_then_closure,
+ GRPC_ERROR_NONE);
+ }
+ }
+
+ int GetTxCode() const { return tx_code; }
+
+ grpc_binder_transport* t;
+ grpc_stream_refcount* refcount;
+ grpc_core::Arena* arena;
+ grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream> sbs;
+ int tx_code;
+ const bool is_client;
+ bool is_closed;
+
+ grpc_closure* destroy_stream_then_closure = nullptr;
+ grpc_closure destroy_stream;
+
+ // The reason why this stream is cancelled and closed.
+ grpc_error_handle cancel_self_error = GRPC_ERROR_NONE;
+
+ grpc_closure recv_initial_metadata_closure;
+ RecvInitialMetadataArgs recv_initial_metadata_args;
+ grpc_closure recv_message_closure;
+ RecvMessageArgs recv_message_args;
+ grpc_closure recv_trailing_metadata_closure;
+ RecvTrailingMetadataArgs recv_trailing_metadata_args;
+
+ grpc_closure register_stream_closure;
+ RegisterStreamArgs register_stream_args;
+
+ // We store these fields passed from op batch, in order to access them through
+ // grpc_binder_stream
+ grpc_metadata_batch* recv_initial_metadata;
+ grpc_closure* recv_initial_metadata_ready = nullptr;
+ bool* trailing_metadata_available = nullptr;
+ grpc_core::OrphanablePtr<grpc_core::ByteStream>* recv_message;
+ grpc_closure* recv_message_ready = nullptr;
+ bool* call_failed_before_recv_message = nullptr;
+ grpc_metadata_batch* recv_trailing_metadata;
+ grpc_closure* recv_trailing_metadata_finished = nullptr;
+
+ bool trailing_metadata_sent = false;
+ bool need_to_call_trailing_metadata_callback = false;
+};
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_TRANSPORT_BINDER_STREAM_H