10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2013, Google Inc.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer.
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     and/or other materials provided with the distribution.
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     derived from this software without specific prior written permission.
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This file contains Macros for creating proxies for webrtc MediaStream and
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// PeerConnection classes.
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Example usage:
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org// class TestInterface : public rtc::RefCountInterface {
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//  public:
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//   std::string FooA() = 0;
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//   std::string FooB(bool arg1) const = 0;
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//   std::string FooC(bool arg1)= 0;
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//  };
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Note that return types can not be a const reference.
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// class Test : public TestInterface {
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// ... implementation of the interface.
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// };
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// BEGIN_PROXY_MAP(Test)
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//   PROXY_METHOD0(std::string, FooA)
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//   PROXY_CONSTMETHOD1(std::string, FooB, arg1)
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//   PROXY_METHOD1(std::string, FooC, arg1)
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// END_PROXY()
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// The proxy can be created using TestProxy::Create(Thread*, TestInterface*).
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_APP_WEBRTC_PROXY_H_
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_APP_WEBRTC_PROXY_H_
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/thread.h"
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace webrtc {
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate <typename R>
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass ReturnType {
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  template<typename C, typename M>
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Invoke(C* c, M m) { r_ = (c->*m)(); }
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  template<typename C, typename M, typename T1>
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Invoke(C* c, M m, T1 a1) { r_ = (c->*m)(a1); }
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  template<typename C, typename M, typename T1, typename T2>
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Invoke(C* c, M m, T1 a1, T2 a2) { r_ = (c->*m)(a1, a2); }
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  template<typename C, typename M, typename T1, typename T2, typename T3>
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3) { r_ = (c->*m)(a1, a2, a3); }
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  R value() { return r_; }
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  R r_;
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate <>
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass ReturnType<void> {
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  template<typename C, typename M>
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Invoke(C* c, M m) { (c->*m)(); }
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  template<typename C, typename M, typename T1>
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Invoke(C* c, M m, T1 a1) { (c->*m)(a1); }
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  template<typename C, typename M, typename T1, typename T2>
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Invoke(C* c, M m, T1 a1, T2 a2) { (c->*m)(a1, a2); }
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  template<typename C, typename M, typename T1, typename T2, typename T3>
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3) { (c->*m)(a1, a2, a3); }
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void value() {}
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate <typename C, typename R>
962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgclass MethodCall0 : public rtc::Message,
972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                    public rtc::MessageHandler {
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef R (C::*Method)();
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MethodCall0(C* c, Method m) : c_(c), m_(m) {}
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1022a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  R Marshal(rtc::Thread* t) {
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    t->Send(this, 0);
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return r_.value();
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1082a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnMessage(rtc::Message*) {  r_.Invoke(c_, m_);}
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  C* c_;
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Method m_;
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ReturnType<R> r_;
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate <typename C, typename R>
1162a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgclass ConstMethodCall0 : public rtc::Message,
1172a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                         public rtc::MessageHandler {
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef R (C::*Method)() const;
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConstMethodCall0(C* c, Method m) : c_(c), m_(m) {}
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1222a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  R Marshal(rtc::Thread* t) {
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    t->Send(this, 0);
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return r_.value();
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1282a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnMessage(rtc::Message*) { r_.Invoke(c_, m_); }
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  C* c_;
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Method m_;
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ReturnType<R> r_;
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate <typename C, typename R,  typename T1>
1362a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgclass MethodCall1 : public rtc::Message,
1372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                    public rtc::MessageHandler {
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef R (C::*Method)(T1 a1);
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MethodCall1(C* c, Method m, T1 a1) : c_(c), m_(m), a1_(a1) {}
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  R Marshal(rtc::Thread* t) {
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    t->Send(this, 0);
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return r_.value();
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1482a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnMessage(rtc::Message*) { r_.Invoke(c_, m_, a1_); }
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  C* c_;
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Method m_;
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ReturnType<R> r_;
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  T1 a1_;
1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate <typename C, typename R,  typename T1>
1572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgclass ConstMethodCall1 : public rtc::Message,
1582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                         public rtc::MessageHandler {
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef R (C::*Method)(T1 a1) const;
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConstMethodCall1(C* c, Method m, T1 a1) : c_(c), m_(m), a1_(a1) {}
1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1632a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  R Marshal(rtc::Thread* t) {
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    t->Send(this, 0);
1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return r_.value();
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnMessage(rtc::Message*) { r_.Invoke(c_, m_, a1_); }
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  C* c_;
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Method m_;
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ReturnType<R> r_;
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  T1 a1_;
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate <typename C, typename R, typename T1, typename T2>
1782a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgclass MethodCall2 : public rtc::Message,
1792a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                    public rtc::MessageHandler {
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef R (C::*Method)(T1 a1, T2 a2);
1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MethodCall2(C* c, Method m, T1 a1, T2 a2) : c_(c), m_(m), a1_(a1), a2_(a2) {}
1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1842a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  R Marshal(rtc::Thread* t) {
1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    t->Send(this, 0);
1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return r_.value();
1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnMessage(rtc::Message*) { r_.Invoke(c_, m_, a1_, a2_); }
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  C* c_;
1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Method m_;
1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ReturnType<R> r_;
1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  T1 a1_;
1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  T2 a2_;
1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate <typename C, typename R, typename T1, typename T2, typename T3>
2002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgclass MethodCall3 : public rtc::Message,
2012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                    public rtc::MessageHandler {
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef R (C::*Method)(T1 a1, T2 a2, T3 a3);
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MethodCall3(C* c, Method m, T1 a1, T2 a2, T3 a3)
2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : c_(c), m_(m), a1_(a1), a2_(a2), a3_(a3) {}
2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  R Marshal(rtc::Thread* t) {
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    t->Send(this, 0);
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return r_.value();
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
2132a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnMessage(rtc::Message*) { r_.Invoke(c_, m_, a1_, a2_, a3_); }
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  C* c_;
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Method m_;
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ReturnType<R> r_;
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  T1 a1_;
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  T2 a2_;
2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  T3 a3_;
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define BEGIN_PROXY_MAP(c) \
2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  class c##Proxy : public c##Interface {\
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org   protected:\
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typedef c##Interface C;\
2272a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    c##Proxy(rtc::Thread* thread, C* c)\
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : owner_thread_(thread), \
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        c_(c)  {}\
2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ~c##Proxy() {\
2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      MethodCall0<c##Proxy, void> call(this, &c##Proxy::Release_s);\
2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      call.Marshal(owner_thread_);\
2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }\
2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org   public:\
2352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    static rtc::scoped_refptr<C> Create(rtc::Thread* thread, \
2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                              C* c) {\
2372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      return new rtc::RefCountedObject<c##Proxy>(thread, c);\
2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }\
2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define PROXY_METHOD0(r, method)\
2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    r method() OVERRIDE {\
2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      MethodCall0<C, r> call(c_.get(), &C::method);\
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return call.Marshal(owner_thread_);\
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }\
2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define PROXY_CONSTMETHOD0(r, method)\
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    r method() const OVERRIDE {\
2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ConstMethodCall0<C, r> call(c_.get(), &C::method);\
2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return call.Marshal(owner_thread_);\
2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     }\
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define PROXY_METHOD1(r, method, t1)\
2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    r method(t1 a1) OVERRIDE {\
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      MethodCall1<C, r, t1> call(c_.get(), &C::method, a1);\
2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return call.Marshal(owner_thread_);\
2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }\
2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define PROXY_CONSTMETHOD1(r, method, t1)\
2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    r method(t1 a1) const OVERRIDE {\
2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ConstMethodCall1<C, r, t1> call(c_.get(), &C::method, a1);\
2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return call.Marshal(owner_thread_);\
2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }\
2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define PROXY_METHOD2(r, method, t1, t2)\
2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    r method(t1 a1, t2 a2) OVERRIDE {\
2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      MethodCall2<C, r, t1, t2> call(c_.get(), &C::method, a1, a2);\
2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return call.Marshal(owner_thread_);\
2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }\
2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define PROXY_METHOD3(r, method, t1, t2, t3)\
2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    r method(t1 a1, t2 a2, t3 a3) OVERRIDE {\
2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      MethodCall3<C, r, t1, t2, t3> call(c_.get(), &C::method, a1, a2, a3);\
2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return call.Marshal(owner_thread_);\
2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }\
2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define END_PROXY() \
2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org   private:\
2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    void Release_s() {\
2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      c_ = NULL;\
2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }\
2812a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    mutable rtc::Thread* owner_thread_;\
2822a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::scoped_refptr<C> c_;\
2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };\
2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace webrtc
2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif  //  TALK_APP_WEBRTC_PROXY_H_
288