2 * Copyright 2017 Facebook, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <folly/io/async/AsyncTransport.h>
23 * Convenience class so that AsyncTransportWrapper can be decorated without
24 * having to redefine every single method.
27 class DecoratedAsyncTransportWrapper : public folly::AsyncTransportWrapper {
29 explicit DecoratedAsyncTransportWrapper(typename T::UniquePtr transport):
30 transport_(std::move(transport)) {}
32 const AsyncTransportWrapper* getWrappedTransport() const override {
33 return transport_.get();
36 // folly::AsyncTransportWrapper
37 virtual ReadCallback* getReadCallback() const override {
38 return transport_->getReadCallback();
41 virtual void setReadCB(
42 folly::AsyncTransportWrapper::ReadCallback* callback) override {
43 transport_->setReadCB(callback);
47 folly::AsyncTransportWrapper::WriteCallback* callback,
50 folly::WriteFlags flags = folly::WriteFlags::NONE) override {
51 transport_->write(callback, buf, bytes, flags);
54 virtual void writeChain(
55 folly::AsyncTransportWrapper::WriteCallback* callback,
56 std::unique_ptr<folly::IOBuf>&& buf,
57 folly::WriteFlags flags = folly::WriteFlags::NONE) override {
58 transport_->writeChain(callback, std::move(buf), flags);
62 folly::AsyncTransportWrapper::WriteCallback* callback,
65 folly::WriteFlags flags = folly::WriteFlags::NONE) override {
66 transport_->writev(callback, vec, bytes, flags);
69 // folly::AsyncSocketBase
70 virtual folly::EventBase* getEventBase() const override {
71 return transport_->getEventBase();
74 // folly::AsyncTransport
75 virtual void attachEventBase(folly::EventBase* eventBase) override {
76 transport_->attachEventBase(eventBase);
79 virtual void close() override {
83 virtual void closeNow() override {
84 transport_->closeNow();
87 virtual void closeWithReset() override {
88 transport_->closeWithReset();
90 // This will likely result in 2 closeNow() calls on the decorated transport,
91 // but otherwise it is very easy to miss the derived class's closeNow().
95 virtual bool connecting() const override {
96 return transport_->connecting();
99 virtual void detachEventBase() override {
100 transport_->detachEventBase();
103 virtual bool error() const override {
104 return transport_->error();
107 virtual size_t getAppBytesReceived() const override {
108 return transport_->getAppBytesReceived();
111 virtual size_t getAppBytesWritten() const override {
112 return transport_->getAppBytesWritten();
115 virtual void getLocalAddress(folly::SocketAddress* address) const override {
116 return transport_->getLocalAddress(address);
119 virtual void getPeerAddress(folly::SocketAddress* address) const override {
120 return transport_->getPeerAddress(address);
123 virtual folly::ssl::X509UniquePtr getPeerCert() const override {
124 return transport_->getPeerCert();
127 virtual size_t getRawBytesReceived() const override {
128 return transport_->getRawBytesReceived();
131 virtual size_t getRawBytesWritten() const override {
132 return transport_->getRawBytesWritten();
135 virtual uint32_t getSendTimeout() const override {
136 return transport_->getSendTimeout();
139 virtual bool good() const override {
140 return transport_->good();
143 virtual bool isDetachable() const override {
144 return transport_->isDetachable();
147 virtual bool isEorTrackingEnabled() const override {
148 return transport_->isEorTrackingEnabled();
151 virtual bool readable() const override {
152 return transport_->readable();
155 virtual void setEorTracking(bool track) override {
156 return transport_->setEorTracking(track);
159 virtual void setSendTimeout(uint32_t timeoutInMs) override {
160 transport_->setSendTimeout(timeoutInMs);
163 virtual void shutdownWrite() override {
164 transport_->shutdownWrite();
167 virtual void shutdownWriteNow() override {
168 transport_->shutdownWriteNow();
171 virtual std::string getApplicationProtocol() noexcept override {
172 return transport_->getApplicationProtocol();
175 virtual std::string getSecurityProtocol() const override {
176 return transport_->getSecurityProtocol();
179 virtual bool isReplaySafe() const override {
180 return transport_->isReplaySafe();
183 virtual void setReplaySafetyCallback(
184 folly::AsyncTransport::ReplaySafetyCallback* callback) override {
185 transport_->setReplaySafetyCallback(callback);
189 virtual ~DecoratedAsyncTransportWrapper() {}
191 typename T::UniquePtr transport_;