15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2013, Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This file contains Macros for creating proxies for webrtc MediaStream and
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// PeerConnection classes.
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Example usage:
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// class TestInterface : public talk_base::RefCountInterface {
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  public:
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//   std::string FooA() = 0;
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//   std::string FooB(bool arg1) const = 0;
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//   std::string FooC(bool arg1)= 0;
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  };
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Note that return types can not be a const reference.
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// class Test : public TestInterface {
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// ... implementation of the interface.
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// };
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// BEGIN_PROXY_MAP(Test)
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//   PROXY_METHOD0(std::string, FooA)
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//   PROXY_CONSTMETHOD1(std::string, FooB, arg1)
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//   PROXY_METHOD1(std::string, FooC, arg1)
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// END_PROXY()
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// The proxy can be created using TestProxy::Create(Thread*, TestInterface*).
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_APP_WEBRTC_PROXY_H_
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_APP_WEBRTC_PROXY_H_
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/thread.h"
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace webrtc {
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <typename R>
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass ReturnType {
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  template<typename C, typename M>
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Invoke(C* c, M m) { r_ = (c->*m)(); }
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  template<typename C, typename M, typename T1>
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Invoke(C* c, M m, T1 a1) { r_ = (c->*m)(a1); }
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  template<typename C, typename M, typename T1, typename T2>
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Invoke(C* c, M m, T1 a1, T2 a2) { r_ = (c->*m)(a1, a2); }
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  template<typename C, typename M, typename T1, typename T2, typename T3>
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3) { r_ = (c->*m)(a1, a2, a3); }
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  R value() { return r_; }
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  R r_;
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <>
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass ReturnType<void> {
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  template<typename C, typename M>
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Invoke(C* c, M m) { (c->*m)(); }
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  template<typename C, typename M, typename T1>
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Invoke(C* c, M m, T1 a1) { (c->*m)(a1); }
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  template<typename C, typename M, typename T1, typename T2>
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Invoke(C* c, M m, T1 a1, T2 a2) { (c->*m)(a1, a2); }
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  template<typename C, typename M, typename T1, typename T2, typename T3>
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3) { (c->*m)(a1, a2, a3); }
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void value() {}
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <typename C, typename R>
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass MethodCall0 : public talk_base::Message,
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    public talk_base::MessageHandler {
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef R (C::*Method)();
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  MethodCall0(C* c, Method m) : c_(c), m_(m) {}
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  R Marshal(talk_base::Thread* t) {
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    t->Send(this, 0);
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return r_.value();
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnMessage(talk_base::Message*) {  r_.Invoke(c_, m_);}
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  C* c_;
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Method m_;
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ReturnType<R> r_;
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <typename C, typename R>
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass ConstMethodCall0 : public talk_base::Message,
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                         public talk_base::MessageHandler {
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef R (C::*Method)() const;
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConstMethodCall0(C* c, Method m) : c_(c), m_(m) {}
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  R Marshal(talk_base::Thread* t) {
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    t->Send(this, 0);
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return r_.value();
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnMessage(talk_base::Message*) { r_.Invoke(c_, m_); }
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  C* c_;
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Method m_;
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ReturnType<R> r_;
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <typename C, typename R,  typename T1>
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass MethodCall1 : public talk_base::Message,
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    public talk_base::MessageHandler {
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef R (C::*Method)(T1 a1);
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  MethodCall1(C* c, Method m, T1 a1) : c_(c), m_(m), a1_(a1) {}
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  R Marshal(talk_base::Thread* t) {
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    t->Send(this, 0);
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return r_.value();
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnMessage(talk_base::Message*) { r_.Invoke(c_, m_, a1_); }
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  C* c_;
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Method m_;
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ReturnType<R> r_;
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T1 a1_;
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <typename C, typename R,  typename T1>
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass ConstMethodCall1 : public talk_base::Message,
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                         public talk_base::MessageHandler {
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef R (C::*Method)(T1 a1) const;
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConstMethodCall1(C* c, Method m, T1 a1) : c_(c), m_(m), a1_(a1) {}
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  R Marshal(talk_base::Thread* t) {
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    t->Send(this, 0);
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return r_.value();
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnMessage(talk_base::Message*) { r_.Invoke(c_, m_, a1_); }
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  C* c_;
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Method m_;
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ReturnType<R> r_;
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T1 a1_;
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <typename C, typename R, typename T1, typename T2>
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass MethodCall2 : public talk_base::Message,
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    public talk_base::MessageHandler {
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef R (C::*Method)(T1 a1, T2 a2);
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  MethodCall2(C* c, Method m, T1 a1, T2 a2) : c_(c), m_(m), a1_(a1), a2_(a2) {}
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  R Marshal(talk_base::Thread* t) {
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    t->Send(this, 0);
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return r_.value();
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnMessage(talk_base::Message*) { r_.Invoke(c_, m_, a1_, a2_); }
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  C* c_;
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Method m_;
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ReturnType<R> r_;
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T1 a1_;
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T2 a2_;
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <typename C, typename R, typename T1, typename T2, typename T3>
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass MethodCall3 : public talk_base::Message,
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    public talk_base::MessageHandler {
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef R (C::*Method)(T1 a1, T2 a2, T3 a3);
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  MethodCall3(C* c, Method m, T1 a1, T2 a2, T3 a3)
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      : c_(c), m_(m), a1_(a1), a2_(a2), a3_(a3) {}
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  R Marshal(talk_base::Thread* t) {
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    t->Send(this, 0);
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return r_.value();
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnMessage(talk_base::Message*) { r_.Invoke(c_, m_, a1_, a2_, a3_); }
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  C* c_;
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Method m_;
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ReturnType<R> r_;
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T1 a1_;
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T2 a2_;
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T3 a3_;
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define BEGIN_PROXY_MAP(c) \
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  class c##Proxy : public c##Interface {\
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org   protected:\
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    typedef c##Interface C;\
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    c##Proxy(talk_base::Thread* thread, C* c)\
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      : owner_thread_(thread), \
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        c_(c)  {}\
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ~c##Proxy() {\
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      MethodCall0<c##Proxy, void> call(this, &c##Proxy::Release_s);\
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      call.Marshal(owner_thread_);\
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }\
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org   public:\
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    static talk_base::scoped_refptr<C> Create(talk_base::Thread* thread, \
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                              C* c) {\
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return new talk_base::RefCountedObject<c##Proxy>(thread, c);\
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }\
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define PROXY_METHOD0(r, method)\
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    r method() OVERRIDE {\
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      MethodCall0<C, r> call(c_.get(), &C::method);\
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return call.Marshal(owner_thread_);\
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }\
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define PROXY_CONSTMETHOD0(r, method)\
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    r method() const OVERRIDE {\
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ConstMethodCall0<C, r> call(c_.get(), &C::method);\
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return call.Marshal(owner_thread_);\
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org     }\
2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define PROXY_METHOD1(r, method, t1)\
2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    r method(t1 a1) OVERRIDE {\
2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      MethodCall1<C, r, t1> call(c_.get(), &C::method, a1);\
2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return call.Marshal(owner_thread_);\
2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }\
2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define PROXY_CONSTMETHOD1(r, method, t1)\
2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    r method(t1 a1) const OVERRIDE {\
2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ConstMethodCall1<C, r, t1> call(c_.get(), &C::method, a1);\
2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return call.Marshal(owner_thread_);\
2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }\
2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define PROXY_METHOD2(r, method, t1, t2)\
2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    r method(t1 a1, t2 a2) OVERRIDE {\
2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      MethodCall2<C, r, t1, t2> call(c_.get(), &C::method, a1, a2);\
2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return call.Marshal(owner_thread_);\
2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }\
2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define PROXY_METHOD3(r, method, t1, t2, t3)\
2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    r method(t1 a1, t2 a2, t3 a3) OVERRIDE {\
2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      MethodCall3<C, r, t1, t2, t3> call(c_.get(), &C::method, a1, a2, a3);\
2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return call.Marshal(owner_thread_);\
2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }\
2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define END_PROXY() \
2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org   private:\
2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    void Release_s() {\
2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      c_ = NULL;\
2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }\
2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    mutable talk_base::Thread* owner_thread_;\
2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    talk_base::scoped_refptr<C> c_;\
2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  };\
2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace webrtc
2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif  //  TALK_APP_WEBRTC_PROXY_H_
288