blob: f834790f642f8c3d4ea5ea3bf10bccd1da719770 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2013 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
11// This file contains Macros for creating proxies for webrtc MediaStream and
12// PeerConnection classes.
13
14//
15// Example usage:
16//
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000017// class TestInterface : public rtc::RefCountInterface {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000018// public:
19// std::string FooA() = 0;
20// std::string FooB(bool arg1) const = 0;
nisse72c8d2b2016-04-15 03:49:07 -070021// std::string FooC(bool arg1) = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000022// };
23//
24// Note that return types can not be a const reference.
25//
26// class Test : public TestInterface {
27// ... implementation of the interface.
28// };
29//
30// BEGIN_PROXY_MAP(Test)
deadbeefd99a2002017-01-18 08:55:23 -080031// PROXY_SIGNALING_THREAD_DESTRUCTOR()
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032// PROXY_METHOD0(std::string, FooA)
33// PROXY_CONSTMETHOD1(std::string, FooB, arg1)
nisse72c8d2b2016-04-15 03:49:07 -070034// PROXY_WORKER_METHOD1(std::string, FooC, arg1)
deadbeefd99a2002017-01-18 08:55:23 -080035// END_PROXY_MAP()
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036//
deadbeefd99a2002017-01-18 08:55:23 -080037// Where the destructor and first two methods are invoked on the signaling
38// thread, and the third is invoked on the worker thread.
nisse72c8d2b2016-04-15 03:49:07 -070039//
40// The proxy can be created using
41//
42// TestProxy::Create(Thread* signaling_thread, Thread* worker_thread,
43// TestInterface*).
44//
45// The variant defined with BEGIN_SIGNALING_PROXY_MAP is unaware of
46// the worker thread, and invokes all methods on the signaling thread.
deadbeefd99a2002017-01-18 08:55:23 -080047//
48// The variant defined with BEGIN_OWNED_PROXY_MAP does not use
49// refcounting, and instead just takes ownership of the object being proxied.
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
Henrik Kjellander15583c12016-02-10 10:53:12 +010051#ifndef WEBRTC_API_PROXY_H_
52#define WEBRTC_API_PROXY_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053
kwibergd1fe2812016-04-27 06:47:29 -070054#include <memory>
oprypin803dc292017-02-01 01:55:59 -080055#include <utility>
kwibergd1fe2812016-04-27 06:47:29 -070056
tommi@webrtc.org18de6f92014-11-04 12:08:48 +000057#include "webrtc/base/event.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000058#include "webrtc/base/thread.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059
60namespace webrtc {
61
62template <typename R>
63class ReturnType {
64 public:
65 template<typename C, typename M>
66 void Invoke(C* c, M m) { r_ = (c->*m)(); }
deadbeefd99a2002017-01-18 08:55:23 -080067 template <typename C, typename M, typename T1>
68 void Invoke(C* c, M m, T1 a1) {
69 r_ = (c->*m)(std::move(a1));
70 }
71 template <typename C, typename M, typename T1, typename T2>
72 void Invoke(C* c, M m, T1 a1, T2 a2) {
73 r_ = (c->*m)(std::move(a1), std::move(a2));
74 }
75 template <typename C, typename M, typename T1, typename T2, typename T3>
76 void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3) {
77 r_ = (c->*m)(std::move(a1), std::move(a2), std::move(a3));
78 }
perkj@webrtc.org81134d02015-01-12 08:30:16 +000079 template<typename C, typename M, typename T1, typename T2, typename T3,
80 typename T4>
81 void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3, T4 a4) {
deadbeefd99a2002017-01-18 08:55:23 -080082 r_ = (c->*m)(std::move(a1), std::move(a2), std::move(a3), std::move(a4));
perkj@webrtc.org81134d02015-01-12 08:30:16 +000083 }
84 template<typename C, typename M, typename T1, typename T2, typename T3,
85 typename T4, typename T5>
86 void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) {
deadbeefd99a2002017-01-18 08:55:23 -080087 r_ = (c->*m)(std::move(a1), std::move(a2), std::move(a3), std::move(a4),
88 std::move(a5));
perkj@webrtc.org81134d02015-01-12 08:30:16 +000089 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090
deadbeefd99a2002017-01-18 08:55:23 -080091 R moved_result() { return std::move(r_); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092
93 private:
94 R r_;
95};
96
97template <>
98class ReturnType<void> {
99 public:
100 template<typename C, typename M>
101 void Invoke(C* c, M m) { (c->*m)(); }
deadbeefd99a2002017-01-18 08:55:23 -0800102 template <typename C, typename M, typename T1>
103 void Invoke(C* c, M m, T1 a1) {
104 (c->*m)(std::move(a1));
105 }
106 template <typename C, typename M, typename T1, typename T2>
107 void Invoke(C* c, M m, T1 a1, T2 a2) {
108 (c->*m)(std::move(a1), std::move(a2));
109 }
110 template <typename C, typename M, typename T1, typename T2, typename T3>
111 void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3) {
112 (c->*m)(std::move(a1), std::move(a2), std::move(a3));
113 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000114
deadbeefd99a2002017-01-18 08:55:23 -0800115 void moved_result() {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116};
117
tommi@webrtc.org18de6f92014-11-04 12:08:48 +0000118namespace internal {
119
120class SynchronousMethodCall
121 : public rtc::MessageData,
122 public rtc::MessageHandler {
123 public:
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000124 explicit SynchronousMethodCall(rtc::MessageHandler* proxy)
tommi@webrtc.org18de6f92014-11-04 12:08:48 +0000125 : e_(), proxy_(proxy) {}
126 ~SynchronousMethodCall() {}
127
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700128 void Invoke(const rtc::Location& posted_from, rtc::Thread* t) {
tommi@webrtc.org18de6f92014-11-04 12:08:48 +0000129 if (t->IsCurrent()) {
130 proxy_->OnMessage(NULL);
131 } else {
132 e_.reset(new rtc::Event(false, false));
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700133 t->Post(posted_from, this, 0);
andresp@webrtc.org53d90122015-02-09 14:19:09 +0000134 e_->Wait(rtc::Event::kForever);
tommi@webrtc.org18de6f92014-11-04 12:08:48 +0000135 }
136 }
137
138 private:
139 void OnMessage(rtc::Message*) { proxy_->OnMessage(NULL); e_->Set(); }
kwibergd1fe2812016-04-27 06:47:29 -0700140 std::unique_ptr<rtc::Event> e_;
tommi@webrtc.org18de6f92014-11-04 12:08:48 +0000141 rtc::MessageHandler* proxy_;
142};
143
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000144} // namespace internal
tommi@webrtc.org18de6f92014-11-04 12:08:48 +0000145
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000146template <typename C, typename R>
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000147class MethodCall0 : public rtc::Message,
148 public rtc::MessageHandler {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000149 public:
150 typedef R (C::*Method)();
151 MethodCall0(C* c, Method m) : c_(c), m_(m) {}
152
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700153 R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
154 internal::SynchronousMethodCall(this).Invoke(posted_from, t);
deadbeefd99a2002017-01-18 08:55:23 -0800155 return r_.moved_result();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 }
157
158 private:
tommi@webrtc.org18de6f92014-11-04 12:08:48 +0000159 void OnMessage(rtc::Message*) { r_.Invoke(c_, m_); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000160
161 C* c_;
162 Method m_;
163 ReturnType<R> r_;
164};
165
166template <typename C, typename R>
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000167class ConstMethodCall0 : public rtc::Message,
168 public rtc::MessageHandler {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000169 public:
170 typedef R (C::*Method)() const;
171 ConstMethodCall0(C* c, Method m) : c_(c), m_(m) {}
172
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700173 R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
174 internal::SynchronousMethodCall(this).Invoke(posted_from, t);
deadbeefd99a2002017-01-18 08:55:23 -0800175 return r_.moved_result();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176 }
177
178 private:
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000179 void OnMessage(rtc::Message*) { r_.Invoke(c_, m_); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000180
181 C* c_;
182 Method m_;
183 ReturnType<R> r_;
184};
185
186template <typename C, typename R, typename T1>
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000187class MethodCall1 : public rtc::Message,
188 public rtc::MessageHandler {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189 public:
190 typedef R (C::*Method)(T1 a1);
deadbeefd99a2002017-01-18 08:55:23 -0800191 MethodCall1(C* c, Method m, T1 a1) : c_(c), m_(m), a1_(std::move(a1)) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000192
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700193 R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
194 internal::SynchronousMethodCall(this).Invoke(posted_from, t);
deadbeefd99a2002017-01-18 08:55:23 -0800195 return r_.moved_result();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000196 }
197
198 private:
deadbeefd99a2002017-01-18 08:55:23 -0800199 void OnMessage(rtc::Message*) { r_.Invoke(c_, m_, std::move(a1_)); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200
201 C* c_;
202 Method m_;
203 ReturnType<R> r_;
204 T1 a1_;
205};
206
207template <typename C, typename R, typename T1>
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000208class ConstMethodCall1 : public rtc::Message,
209 public rtc::MessageHandler {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000210 public:
211 typedef R (C::*Method)(T1 a1) const;
deadbeefd99a2002017-01-18 08:55:23 -0800212 ConstMethodCall1(C* c, Method m, T1 a1) : c_(c), m_(m), a1_(std::move(a1)) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700214 R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
215 internal::SynchronousMethodCall(this).Invoke(posted_from, t);
deadbeefd99a2002017-01-18 08:55:23 -0800216 return r_.moved_result();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000217 }
218
219 private:
deadbeefd99a2002017-01-18 08:55:23 -0800220 void OnMessage(rtc::Message*) { r_.Invoke(c_, m_, std::move(a1_)); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000221
222 C* c_;
223 Method m_;
224 ReturnType<R> r_;
225 T1 a1_;
226};
227
228template <typename C, typename R, typename T1, typename T2>
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000229class MethodCall2 : public rtc::Message,
230 public rtc::MessageHandler {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 public:
232 typedef R (C::*Method)(T1 a1, T2 a2);
deadbeefd99a2002017-01-18 08:55:23 -0800233 MethodCall2(C* c, Method m, T1 a1, T2 a2)
234 : c_(c), m_(m), a1_(std::move(a1)), a2_(std::move(a2)) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000235
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700236 R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
237 internal::SynchronousMethodCall(this).Invoke(posted_from, t);
deadbeefd99a2002017-01-18 08:55:23 -0800238 return r_.moved_result();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000239 }
240
241 private:
deadbeefd99a2002017-01-18 08:55:23 -0800242 void OnMessage(rtc::Message*) {
243 r_.Invoke(c_, m_, std::move(a1_), std::move(a2_));
244 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000245
246 C* c_;
247 Method m_;
248 ReturnType<R> r_;
249 T1 a1_;
250 T2 a2_;
251};
252
253template <typename C, typename R, typename T1, typename T2, typename T3>
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000254class MethodCall3 : public rtc::Message,
255 public rtc::MessageHandler {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000256 public:
257 typedef R (C::*Method)(T1 a1, T2 a2, T3 a3);
258 MethodCall3(C* c, Method m, T1 a1, T2 a2, T3 a3)
deadbeefd99a2002017-01-18 08:55:23 -0800259 : c_(c),
260 m_(m),
261 a1_(std::move(a1)),
262 a2_(std::move(a2)),
263 a3_(std::move(a3)) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000264
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700265 R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
266 internal::SynchronousMethodCall(this).Invoke(posted_from, t);
deadbeefd99a2002017-01-18 08:55:23 -0800267 return r_.moved_result();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000268 }
269
270 private:
deadbeefd99a2002017-01-18 08:55:23 -0800271 void OnMessage(rtc::Message*) {
272 r_.Invoke(c_, m_, std::move(a1_), std::move(a2_), std::move(a3_));
273 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000274
275 C* c_;
276 Method m_;
277 ReturnType<R> r_;
278 T1 a1_;
279 T2 a2_;
280 T3 a3_;
281};
282
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000283template <typename C, typename R, typename T1, typename T2, typename T3,
284 typename T4>
285class MethodCall4 : public rtc::Message,
286 public rtc::MessageHandler {
287 public:
288 typedef R (C::*Method)(T1 a1, T2 a2, T3 a3, T4 a4);
289 MethodCall4(C* c, Method m, T1 a1, T2 a2, T3 a3, T4 a4)
deadbeefd99a2002017-01-18 08:55:23 -0800290 : c_(c),
291 m_(m),
292 a1_(std::move(a1)),
293 a2_(std::move(a2)),
294 a3_(std::move(a3)),
295 a4_(std::move(a4)) {}
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000296
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700297 R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
298 internal::SynchronousMethodCall(this).Invoke(posted_from, t);
deadbeefd99a2002017-01-18 08:55:23 -0800299 return r_.moved_result();
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000300 }
301
302 private:
deadbeefd99a2002017-01-18 08:55:23 -0800303 void OnMessage(rtc::Message*) {
304 r_.Invoke(c_, m_, std::move(a1_), std::move(a2_), std::move(a3_),
305 std::move(a4_));
306 }
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000307
308 C* c_;
309 Method m_;
310 ReturnType<R> r_;
311 T1 a1_;
312 T2 a2_;
313 T3 a3_;
314 T4 a4_;
315};
316
317template <typename C, typename R, typename T1, typename T2, typename T3,
318 typename T4, typename T5>
319class MethodCall5 : public rtc::Message,
320 public rtc::MessageHandler {
321 public:
322 typedef R (C::*Method)(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
323 MethodCall5(C* c, Method m, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
deadbeefd99a2002017-01-18 08:55:23 -0800324 : c_(c),
325 m_(m),
326 a1_(std::move(a1)),
327 a2_(std::move(a2)),
328 a3_(std::move(a3)),
329 a4_(std::move(a4)),
330 a5_(std::move(a5)) {}
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000331
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700332 R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
333 internal::SynchronousMethodCall(this).Invoke(posted_from, t);
deadbeefd99a2002017-01-18 08:55:23 -0800334 return r_.moved_result();
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000335 }
336
337 private:
deadbeefd99a2002017-01-18 08:55:23 -0800338 void OnMessage(rtc::Message*) {
339 r_.Invoke(c_, m_, std::move(a1_), std::move(a2_), std::move(a3_),
340 std::move(a4_), std::move(a5_));
341 }
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000342
343 C* c_;
344 Method m_;
345 ReturnType<R> r_;
346 T1 a1_;
347 T2 a2_;
348 T3 a3_;
349 T4 a4_;
350 T5 a5_;
351};
352
oprypin803dc292017-02-01 01:55:59 -0800353
deadbeefd99a2002017-01-18 08:55:23 -0800354// Helper macros to reduce code duplication.
355#define PROXY_MAP_BOILERPLATE(c) \
deadbeefa601f5c2016-06-06 14:27:39 -0700356 template <class INTERNAL_CLASS> \
357 class c##ProxyWithInternal; \
358 typedef c##ProxyWithInternal<c##Interface> c##Proxy; \
359 template <class INTERNAL_CLASS> \
360 class c##ProxyWithInternal : public c##Interface { \
361 protected: \
362 typedef c##Interface C; \
deadbeefa601f5c2016-06-06 14:27:39 -0700363 \
364 public: \
deadbeefa601f5c2016-06-06 14:27:39 -0700365 const INTERNAL_CLASS* internal() const { return c_.get(); } \
366 INTERNAL_CLASS* internal() { return c_.get(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367
oprypin803dc292017-02-01 01:55:59 -0800368#define END_PROXY_MAP() \
369 };
370
deadbeefd99a2002017-01-18 08:55:23 -0800371#define SIGNALING_PROXY_MAP_BOILERPLATE(c) \
372 protected: \
373 c##ProxyWithInternal(rtc::Thread* signaling_thread, INTERNAL_CLASS* c) \
374 : signaling_thread_(signaling_thread), c_(c) {} \
375 \
376 private: \
377 mutable rtc::Thread* signaling_thread_;
378
379#define WORKER_PROXY_MAP_BOILERPLATE(c) \
380 protected: \
381 c##ProxyWithInternal(rtc::Thread* signaling_thread, \
382 rtc::Thread* worker_thread, INTERNAL_CLASS* c) \
383 : signaling_thread_(signaling_thread), \
384 worker_thread_(worker_thread), \
385 c_(c) {} \
386 \
387 private: \
388 mutable rtc::Thread* signaling_thread_; \
389 mutable rtc::Thread* worker_thread_;
390
391// Note that the destructor is protected so that the proxy can only be
392// destroyed via RefCountInterface.
393#define REFCOUNTED_PROXY_MAP_BOILERPLATE(c) \
394 protected: \
395 ~c##ProxyWithInternal() { \
396 MethodCall0<c##ProxyWithInternal, void> call( \
397 this, &c##ProxyWithInternal::DestroyInternal); \
398 call.Marshal(RTC_FROM_HERE, destructor_thread()); \
399 } \
400 \
401 private: \
402 void DestroyInternal() { c_ = nullptr; } \
403 rtc::scoped_refptr<INTERNAL_CLASS> c_;
404
405#define OWNED_PROXY_MAP_BOILERPLATE(c) \
406 public: \
407 ~c##ProxyWithInternal() { \
408 MethodCall0<c##ProxyWithInternal, void> call( \
409 this, &c##ProxyWithInternal::DestroyInternal); \
410 call.Marshal(RTC_FROM_HERE, destructor_thread()); \
411 } \
412 \
413 private: \
414 void DestroyInternal() { c_.reset(nullptr); } \
415 std::unique_ptr<INTERNAL_CLASS> c_;
416
417#define BEGIN_SIGNALING_PROXY_MAP(c) \
418 PROXY_MAP_BOILERPLATE(c) \
419 SIGNALING_PROXY_MAP_BOILERPLATE(c) \
420 REFCOUNTED_PROXY_MAP_BOILERPLATE(c) \
421 public: \
422 static rtc::scoped_refptr<c##ProxyWithInternal> Create( \
423 rtc::Thread* signaling_thread, INTERNAL_CLASS* c) { \
424 return new rtc::RefCountedObject<c##ProxyWithInternal>(signaling_thread, \
425 c); \
426 }
427
428#define BEGIN_PROXY_MAP(c) \
429 PROXY_MAP_BOILERPLATE(c) \
430 WORKER_PROXY_MAP_BOILERPLATE(c) \
431 REFCOUNTED_PROXY_MAP_BOILERPLATE(c) \
432 public: \
433 static rtc::scoped_refptr<c##ProxyWithInternal> Create( \
434 rtc::Thread* signaling_thread, rtc::Thread* worker_thread, \
435 INTERNAL_CLASS* c) { \
436 return new rtc::RefCountedObject<c##ProxyWithInternal>(signaling_thread, \
437 worker_thread, c); \
438 }
439
440#define BEGIN_OWNED_PROXY_MAP(c) \
441 PROXY_MAP_BOILERPLATE(c) \
442 WORKER_PROXY_MAP_BOILERPLATE(c) \
443 OWNED_PROXY_MAP_BOILERPLATE(c) \
444 public: \
445 static std::unique_ptr<c##ProxyWithInternal> Create( \
446 rtc::Thread* signaling_thread, rtc::Thread* worker_thread, \
447 INTERNAL_CLASS* c) { \
448 return std::unique_ptr<c##ProxyWithInternal>( \
449 new c##ProxyWithInternal(signaling_thread, worker_thread, c)); \
450 }
451
452#define PROXY_SIGNALING_THREAD_DESTRUCTOR() \
453 private: \
454 rtc::Thread* destructor_thread() const { return signaling_thread_; } \
455 \
oprypin803dc292017-02-01 01:55:59 -0800456 public: // NOLINTNEXTLINE
deadbeefd99a2002017-01-18 08:55:23 -0800457
458#define PROXY_WORKER_THREAD_DESTRUCTOR() \
459 private: \
460 rtc::Thread* destructor_thread() const { return worker_thread_; } \
461 \
oprypin803dc292017-02-01 01:55:59 -0800462 public: // NOLINTNEXTLINE
deadbeefd99a2002017-01-18 08:55:23 -0800463
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700464#define PROXY_METHOD0(r, method) \
465 r method() override { \
466 MethodCall0<C, r> call(c_.get(), &C::method); \
467 return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000468 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700470#define PROXY_CONSTMETHOD0(r, method) \
471 r method() const override { \
472 ConstMethodCall0<C, r> call(c_.get(), &C::method); \
473 return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000474 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475
deadbeefd99a2002017-01-18 08:55:23 -0800476#define PROXY_METHOD1(r, method, t1) \
477 r method(t1 a1) override { \
478 MethodCall1<C, r, t1> call(c_.get(), &C::method, std::move(a1)); \
479 return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000480 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481
deadbeefd99a2002017-01-18 08:55:23 -0800482#define PROXY_CONSTMETHOD1(r, method, t1) \
483 r method(t1 a1) const override { \
484 ConstMethodCall1<C, r, t1> call(c_.get(), &C::method, std::move(a1)); \
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700485 return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000486 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000487
deadbeefd99a2002017-01-18 08:55:23 -0800488#define PROXY_METHOD2(r, method, t1, t2) \
489 r method(t1 a1, t2 a2) override { \
490 MethodCall2<C, r, t1, t2> call(c_.get(), &C::method, std::move(a1), \
491 std::move(a2)); \
492 return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000493 }
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000494
deadbeefd99a2002017-01-18 08:55:23 -0800495#define PROXY_METHOD3(r, method, t1, t2, t3) \
496 r method(t1 a1, t2 a2, t3 a3) override { \
497 MethodCall3<C, r, t1, t2, t3> call(c_.get(), &C::method, std::move(a1), \
498 std::move(a2), std::move(a3)); \
499 return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
500 }
501
502#define PROXY_METHOD4(r, method, t1, t2, t3, t4) \
503 r method(t1 a1, t2 a2, t3 a3, t4 a4) override { \
504 MethodCall4<C, r, t1, t2, t3, t4> call(c_.get(), &C::method, \
505 std::move(a1), std::move(a2), \
506 std::move(a3), std::move(a4)); \
507 return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
508 }
509
510#define PROXY_METHOD5(r, method, t1, t2, t3, t4, t5) \
511 r method(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) override { \
512 MethodCall5<C, r, t1, t2, t3, t4, t5> call( \
513 c_.get(), &C::method, std::move(a1), std::move(a2), std::move(a3), \
514 std::move(a4), std::move(a5)); \
515 return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
nisse5b68ab52016-04-07 07:45:54 -0700516 }
517
518// Define methods which should be invoked on the worker thread.
deadbeefd99a2002017-01-18 08:55:23 -0800519#define PROXY_WORKER_METHOD0(r, method) \
520 r method() override { \
521 MethodCall0<C, r> call(c_.get(), &C::method); \
522 return call.Marshal(RTC_FROM_HERE, worker_thread_); \
nisse5b68ab52016-04-07 07:45:54 -0700523 }
524
deadbeefd99a2002017-01-18 08:55:23 -0800525#define PROXY_WORKER_CONSTMETHOD0(r, method) \
526 r method() const override { \
527 ConstMethodCall0<C, r> call(c_.get(), &C::method); \
528 return call.Marshal(RTC_FROM_HERE, worker_thread_); \
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000529 }
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000530
deadbeefd99a2002017-01-18 08:55:23 -0800531#define PROXY_WORKER_METHOD1(r, method, t1) \
532 r method(t1 a1) override { \
533 MethodCall1<C, r, t1> call(c_.get(), &C::method, std::move(a1)); \
534 return call.Marshal(RTC_FROM_HERE, worker_thread_); \
535 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000536
deadbeefd99a2002017-01-18 08:55:23 -0800537#define PROXY_WORKER_CONSTMETHOD1(r, method, t1) \
538 r method(t1 a1) const override { \
539 ConstMethodCall1<C, r, t1> call(c_.get(), &C::method, std::move(a1)); \
540 return call.Marshal(RTC_FROM_HERE, worker_thread_); \
541 }
542
543#define PROXY_WORKER_METHOD2(r, method, t1, t2) \
544 r method(t1 a1, t2 a2) override { \
545 MethodCall2<C, r, t1, t2> call(c_.get(), &C::method, std::move(a1), \
546 std::move(a2)); \
547 return call.Marshal(RTC_FROM_HERE, worker_thread_); \
548 }
549
550#define PROXY_WORKER_CONSTMETHOD2(r, method, t1, t2) \
551 r method(t1 a1, t2 a2) const override { \
552 ConstMethodCall2<C, r, t1, t2> call(c_.get(), &C::method, std::move(a1), \
553 std::move(a2)); \
554 return call.Marshal(RTC_FROM_HERE, worker_thread_); \
555 }
556
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000557} // namespace webrtc
558
Henrik Kjellander15583c12016-02-10 10:53:12 +0100559#endif // WEBRTC_API_PROXY_H_