Move DecoratedAsyncTransportWrapper and WriteChainAsyncTransportWrapper to folly.
[folly.git] / folly / io / async / DecoratedAsyncTransportWrapper.h
1 /*
2  * Copyright 2016 Facebook, Inc.
3  *
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
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 #pragma once
17
18 #include <folly/io/async/AsyncTransport.h>
19
20 namespace folly {
21
22 /**
23  * Convenience class so that AsyncTransportWrapper can be decorated without
24  * having to redefine every single method.
25  */
26 template<class T>
27 class DecoratedAsyncTransportWrapper : public folly::AsyncTransportWrapper {
28  public:
29   explicit DecoratedAsyncTransportWrapper(typename T::UniquePtr transport):
30     transport_(std::move(transport)) {}
31
32   const AsyncTransportWrapper* getWrappedTransport() const override {
33     return transport_.get();
34   }
35
36   // folly::AsyncTransportWrapper
37   virtual ReadCallback* getReadCallback() const override {
38     return transport_->getReadCallback();
39   }
40
41   virtual void setReadCB(
42       folly::AsyncTransportWrapper::ReadCallback* callback) override {
43     transport_->setReadCB(callback);
44   }
45
46   virtual void write(
47       folly::AsyncTransportWrapper::WriteCallback* callback,
48       const void* buf,
49       size_t bytes,
50       folly::WriteFlags flags = folly::WriteFlags::NONE) override {
51     transport_->write(callback, buf, bytes, flags);
52   }
53
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);
59   }
60
61   virtual void writev(
62       folly::AsyncTransportWrapper::WriteCallback* callback,
63       const iovec* vec,
64       size_t bytes,
65       folly::WriteFlags flags = folly::WriteFlags::NONE) override {
66     transport_->writev(callback, vec, bytes, flags);
67   }
68
69   // folly::AsyncSocketBase
70   virtual folly::EventBase* getEventBase() const override {
71     return transport_->getEventBase();
72   }
73
74   // folly::AsyncTransport
75   virtual void attachEventBase(folly::EventBase* eventBase) override {
76     transport_->attachEventBase(eventBase);
77   }
78
79   virtual void close() override {
80     transport_->close();
81   }
82
83   virtual void closeNow() override {
84     transport_->closeNow();
85   }
86
87   virtual void closeWithReset() override {
88     transport_->closeWithReset();
89
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().
92     closeNow();
93   }
94
95   virtual bool connecting() const override {
96     return transport_->connecting();
97   }
98
99   virtual void detachEventBase() override {
100     transport_->detachEventBase();
101   }
102
103   virtual bool error() const override {
104     return transport_->error();
105   }
106
107   virtual size_t getAppBytesReceived() const override {
108     return transport_->getAppBytesReceived();
109   }
110
111   virtual size_t getAppBytesWritten() const override {
112     return transport_->getAppBytesWritten();
113   }
114
115   virtual void getLocalAddress(folly::SocketAddress* address) const override {
116     return transport_->getLocalAddress(address);
117   }
118
119   virtual void getPeerAddress(folly::SocketAddress* address) const override {
120     return transport_->getPeerAddress(address);
121   }
122
123   virtual folly::ssl::X509UniquePtr getPeerCert() const override {
124     return transport_->getPeerCert();
125   }
126
127   virtual size_t getRawBytesReceived() const override {
128     return transport_->getRawBytesReceived();
129   }
130
131   virtual size_t getRawBytesWritten() const override {
132     return transport_->getRawBytesWritten();
133   }
134
135   virtual uint32_t getSendTimeout() const override {
136     return transport_->getSendTimeout();
137   }
138
139   virtual bool good() const override {
140     return transport_->good();
141   }
142
143   virtual bool isDetachable() const override {
144     return transport_->isDetachable();
145   }
146
147   virtual bool isEorTrackingEnabled() const override {
148     return transport_->isEorTrackingEnabled();
149   }
150
151   virtual bool readable() const override {
152     return transport_->readable();
153   }
154
155   virtual void setEorTracking(bool track) override {
156     return transport_->setEorTracking(track);
157   }
158
159   virtual void setSendTimeout(uint32_t timeoutInMs) override {
160     transport_->setSendTimeout(timeoutInMs);
161   }
162
163   virtual void shutdownWrite() override {
164     transport_->shutdownWrite();
165   }
166
167   virtual void shutdownWriteNow() override {
168     transport_->shutdownWriteNow();
169   }
170
171   virtual std::string getApplicationProtocol() noexcept override {
172     return transport_->getApplicationProtocol();
173   }
174
175   virtual std::string getSecurityProtocol() const override {
176     return transport_->getSecurityProtocol();
177   }
178
179   virtual bool isReplaySafe() const override {
180     return transport_->isReplaySafe();
181   }
182
183   virtual void setReplaySafetyCallback(
184       folly::AsyncTransport::ReplaySafetyCallback* callback) override {
185     transport_->setReplaySafetyCallback(callback);
186   }
187
188  protected:
189   virtual ~DecoratedAsyncTransportWrapper() {}
190
191   typename T::UniquePtr transport_;
192 };
193
194 }