/*** 
*uvft.cpp
*
*  Copyright (C) 1992-94, Microsoft Corporation.  All Rights Reserved.
*  Information Contained Herein Is Proprietary and Confidential.
*
*Purpose:
*  This module implements the Universal Proxy class' Universal
*  Delegator.  This is the mondo shared vtable, that delagates
*  all vtable calls to a central marshaling routine.  Also known
*  as the Universal Vtable (uvft).
*
*Revision History:
*
* [00]	22-Jun-94 bradlo: Created.
*
*Implementation Notes:
*
*****************************************************************************/

#include "oledisp.h"
#ifndef WIN32
# include <cobjps.h>
#endif 
#include "dispmrsh.h"
#include "ups.h"
#include "dispps.h"
#include <stdarg.h>

ASSERTDATA

HRESULT STDMETHODCALLTYPE
UnivQueryInterface(CProxUniv *pthis, REFIID riid, void FAR* FAR* ppv)
{
    return pthis->m_punkOuter->QueryInterface(riid, ppv);
}

unsigned long STDMETHODCALLTYPE
UnivAddRef(CProxUniv *pthis)
{
    return pthis->m_punkOuter->AddRef();
}

unsigned long STDMETHODCALLTYPE
UnivRelease(CProxUniv *pthis)
{
    return pthis->m_punkOuter->Release();
}

HRESULT STDMETHODCALLTYPE
UnivGetTypeInfoCount(CProxUniv *pprox, unsigned int FAR* pctinfo)
{
    return ProxyGetTypeInfoCount(pprox->m_plrpc,
				 pprox->m_syskindStub,
				 pctinfo);
}

HRESULT STDMETHODCALLTYPE
UnivGetTypeInfo(CProxUniv *pprox,
		unsigned int itinfo,
		LCID lcid,
		ITypeInfo FAR* FAR* pptinfo)
{
    return ProxyGetTypeInfo(pprox->m_plrpc,
			    pprox->m_syskindStub,
			    itinfo,
			    lcid,
			    pptinfo);
}

HRESULT STDMETHODCALLTYPE
UnivGetIDsOfNames(CProxUniv *pprox,
		  REFIID riid,
		  OLECHAR FAR* FAR* rgszNames,
		  unsigned int cNames,
		  LCID lcid,
		  DISPID FAR* rgdispid)
{
    return ProxyGetIDsOfNames(pprox->m_plrpc,
			      pprox->m_syskindStub,
			      riid,
			      rgszNames,
			      cNames,
			      lcid,
			      rgdispid);
}

HRESULT STDMETHODCALLTYPE
UnivInvoke(CProxUniv *pprox,
	   DISPID dispidMember,
	   REFIID riid,
	   LCID lcid,
	   unsigned short wFlags,
	   DISPPARAMS FAR* pdispparams,
	   VARIANT FAR* pvarResult,
	   EXCEPINFO FAR* pexcepinfo,
	   unsigned int FAR* puArgErr)
{
    return ProxyInvoke(pprox->m_plrpc,
		       pprox->m_syskindStub,
		       dispidMember,
		       riid,
		       lcid,
		       wFlags,
		       pdispparams,
		       pvarResult,
		       pexcepinfo,
		       puArgErr);
}


#define MDEF(X)						\
    HRESULT CDECLMETHODCALLTYPE				\
    UM ## X (CProxUniv FAR* pprox, ...) {		\
	va_list args;					\
	va_start(args, pprox);				\
	return pprox->ProxyMethod(X, args);		\
    }

                        MDEF(3) MDEF(4)
MDEF(5) MDEF(6) MDEF(7) MDEF(8) MDEF(9)

MDEF(10) MDEF(11) MDEF(12) MDEF(13) MDEF(14)
MDEF(15) MDEF(16) MDEF(17) MDEF(18) MDEF(19)
MDEF(20) MDEF(21) MDEF(22) MDEF(23) MDEF(24)
MDEF(25) MDEF(26) MDEF(27) MDEF(28) MDEF(29)
MDEF(30) MDEF(31) MDEF(32) MDEF(33) MDEF(34)
MDEF(35) MDEF(36) MDEF(37) MDEF(38) MDEF(39)
MDEF(40) MDEF(41) MDEF(42) MDEF(43) MDEF(44)
MDEF(45) MDEF(46) MDEF(47) MDEF(48) MDEF(49)
MDEF(50) MDEF(51) MDEF(52) MDEF(53) MDEF(54)
MDEF(55) MDEF(56) MDEF(57) MDEF(58) MDEF(59)
MDEF(60) MDEF(61) MDEF(62) MDEF(63) MDEF(64)
MDEF(65) MDEF(66) MDEF(67) MDEF(68) MDEF(69)
MDEF(70) MDEF(71) MDEF(72) MDEF(73) MDEF(74)
MDEF(75) MDEF(76) MDEF(77) MDEF(78) MDEF(79)
MDEF(80) MDEF(81) MDEF(82) MDEF(83) MDEF(84)
MDEF(85) MDEF(86) MDEF(87) MDEF(88) MDEF(89)
MDEF(90) MDEF(91) MDEF(92) MDEF(93) MDEF(94)
MDEF(95) MDEF(96) MDEF(97) MDEF(98) MDEF(99)

MDEF(100) MDEF(101) MDEF(102) MDEF(103) MDEF(104)
MDEF(105) MDEF(106) MDEF(107) MDEF(108) MDEF(109)
MDEF(110) MDEF(111) MDEF(112) MDEF(113) MDEF(114)
MDEF(115) MDEF(116) MDEF(117) MDEF(118) MDEF(119)
MDEF(120) MDEF(121) MDEF(122) MDEF(123) MDEF(124)
MDEF(125) MDEF(126) MDEF(127) MDEF(128) MDEF(129)
MDEF(130) MDEF(131) MDEF(132) MDEF(133) MDEF(134)
MDEF(135) MDEF(136) MDEF(137) MDEF(138) MDEF(139)
MDEF(140) MDEF(141) MDEF(142) MDEF(143) MDEF(144)
MDEF(145) MDEF(146) MDEF(147) MDEF(148) MDEF(149)
MDEF(150) MDEF(151) MDEF(152) MDEF(153) MDEF(154)
MDEF(155) MDEF(156) MDEF(157) MDEF(158) MDEF(159)
MDEF(160) MDEF(161) MDEF(162) MDEF(163) MDEF(164)
MDEF(165) MDEF(166) MDEF(167) MDEF(168) MDEF(169)
MDEF(170) MDEF(171) MDEF(172) MDEF(173) MDEF(174)
MDEF(175) MDEF(176) MDEF(177) MDEF(178) MDEF(179)
MDEF(180) MDEF(181) MDEF(182) MDEF(183) MDEF(184)
MDEF(185) MDEF(186) MDEF(187) MDEF(188) MDEF(189)
MDEF(190) MDEF(191) MDEF(192) MDEF(193) MDEF(194)
MDEF(195) MDEF(196) MDEF(197) MDEF(198) MDEF(199)

MDEF(200) MDEF(201) MDEF(202) MDEF(203) MDEF(204)
MDEF(205) MDEF(206) MDEF(207) MDEF(208) MDEF(209)
MDEF(210) MDEF(211) MDEF(212) MDEF(213) MDEF(214)
MDEF(215) MDEF(216) MDEF(217) MDEF(218) MDEF(219)
MDEF(220) MDEF(221) MDEF(222) MDEF(223) MDEF(224)
MDEF(225) MDEF(226) MDEF(227) MDEF(228) MDEF(229)
MDEF(230) MDEF(231) MDEF(232) MDEF(233) MDEF(234)
MDEF(235) MDEF(236) MDEF(237) MDEF(238) MDEF(239)
MDEF(240) MDEF(241) MDEF(242) MDEF(243) MDEF(244)
MDEF(245) MDEF(246) MDEF(247) MDEF(248) MDEF(249)
MDEF(250) MDEF(251) MDEF(252) MDEF(253) MDEF(254)
MDEF(255) MDEF(256) MDEF(257) MDEF(258) MDEF(259)
MDEF(260) MDEF(261) MDEF(262) MDEF(263) MDEF(264)
MDEF(265) MDEF(266) MDEF(267) MDEF(268) MDEF(269)
MDEF(270) MDEF(271) MDEF(272) MDEF(273) MDEF(274)
MDEF(275) MDEF(276) MDEF(277) MDEF(278) MDEF(279)
MDEF(280) MDEF(281) MDEF(282) MDEF(283) MDEF(284)
MDEF(285) MDEF(286) MDEF(287) MDEF(288) MDEF(289)
MDEF(290) MDEF(291) MDEF(292) MDEF(293) MDEF(294)
MDEF(295) MDEF(296) MDEF(297) MDEF(298) MDEF(299)

MDEF(300) MDEF(301) MDEF(302) MDEF(303) MDEF(304)
MDEF(305) MDEF(306) MDEF(307) MDEF(308) MDEF(309)
MDEF(310) MDEF(311) MDEF(312) MDEF(313) MDEF(314)
MDEF(315) MDEF(316) MDEF(317) MDEF(318) MDEF(319)
MDEF(320) MDEF(321) MDEF(322) MDEF(323) MDEF(324)
MDEF(325) MDEF(326) MDEF(327) MDEF(328) MDEF(329)
MDEF(330) MDEF(331) MDEF(332) MDEF(333) MDEF(334)
MDEF(335) MDEF(336) MDEF(337) MDEF(338) MDEF(339)
MDEF(340) MDEF(341) MDEF(342) MDEF(343) MDEF(344)
MDEF(345) MDEF(346) MDEF(347) MDEF(348) MDEF(349)
MDEF(350) MDEF(351) MDEF(352) MDEF(353) MDEF(354)
MDEF(355) MDEF(356) MDEF(357) MDEF(358) MDEF(359)
MDEF(360) MDEF(361) MDEF(362) MDEF(363) MDEF(364)
MDEF(365) MDEF(366) MDEF(367) MDEF(368) MDEF(369)
MDEF(370) MDEF(371) MDEF(372) MDEF(373) MDEF(374)
MDEF(375) MDEF(376) MDEF(377) MDEF(378) MDEF(379)
MDEF(380) MDEF(381) MDEF(382) MDEF(383) MDEF(384)
MDEF(385) MDEF(386) MDEF(387) MDEF(388) MDEF(389)
MDEF(390) MDEF(391) MDEF(392) MDEF(393) MDEF(394)
MDEF(395) MDEF(396) MDEF(397) MDEF(398) MDEF(399)

MDEF(400) MDEF(401) MDEF(402) MDEF(403) MDEF(404)
MDEF(405) MDEF(406) MDEF(407) MDEF(408) MDEF(409)
MDEF(410) MDEF(411) MDEF(412) MDEF(413) MDEF(414)
MDEF(415) MDEF(416) MDEF(417) MDEF(418) MDEF(419)
MDEF(420) MDEF(421) MDEF(422) MDEF(423) MDEF(424)
MDEF(425) MDEF(426) MDEF(427) MDEF(428) MDEF(429)
MDEF(430) MDEF(431) MDEF(432) MDEF(433) MDEF(434)
MDEF(435) MDEF(436) MDEF(437) MDEF(438) MDEF(439)
MDEF(440) MDEF(441) MDEF(442) MDEF(443) MDEF(444)
MDEF(445) MDEF(446) MDEF(447) MDEF(448) MDEF(449)
MDEF(450) MDEF(451) MDEF(452) MDEF(453) MDEF(454)
MDEF(455) MDEF(456) MDEF(457) MDEF(458) MDEF(459)
MDEF(460) MDEF(461) MDEF(462) MDEF(463) MDEF(464)
MDEF(465) MDEF(466) MDEF(467) MDEF(468) MDEF(469)
MDEF(470) MDEF(471) MDEF(472) MDEF(473) MDEF(474)
MDEF(475) MDEF(476) MDEF(477) MDEF(478) MDEF(479)
MDEF(480) MDEF(481) MDEF(482) MDEF(483) MDEF(484)
MDEF(485) MDEF(486) MDEF(487) MDEF(488) MDEF(489)
MDEF(490) MDEF(491) MDEF(492) MDEF(493) MDEF(494)
MDEF(495) MDEF(496) MDEF(497) MDEF(498) MDEF(499)

MDEF(500) MDEF(501) MDEF(502) MDEF(503) MDEF(504)
MDEF(505) MDEF(506) MDEF(507) MDEF(508) MDEF(509)
MDEF(510) MDEF(511) MDEF(512)


#define MSET10(X) \
    UM ## X ## 0, \
    UM ## X ## 1, \
    UM ## X ## 2, \
    UM ## X ## 3, \
    UM ## X ## 4, \
    UM ## X ## 5, \
    UM ## X ## 6, \
    UM ## X ## 7, \
    UM ## X ## 8, \
    UM ## X ## 9,

// A universal delegator for a custom interface that derives from
// IUnknown (and *not* IDispatch).
//
void FAR* g_rgpfnUnk[] = 
{
    UnivQueryInterface,
    UnivAddRef,
    UnivRelease,
    UM3,
    UM4,
    UM5,
    UM6,
    UM7,
    UM8,
    UM9,
    MSET10(1)
    MSET10(2)
    MSET10(3)
    MSET10(4)
    MSET10(5)
    MSET10(6)
    MSET10(7)
    MSET10(8)
    MSET10(9)
    MSET10(10)
    MSET10(11)
    MSET10(12)
    MSET10(13)
    MSET10(14)
    MSET10(15)
    MSET10(16)
    MSET10(17)
    MSET10(18)
    MSET10(19)
    MSET10(20)
    MSET10(21)
    MSET10(22)
    MSET10(23)
    MSET10(24)
    MSET10(25)
    MSET10(26)
    MSET10(27)
    MSET10(28)
    MSET10(29)
    MSET10(30)
    MSET10(31)
    MSET10(32)
    MSET10(33)
    MSET10(34)
    MSET10(35)
    MSET10(36)
    MSET10(37)
    MSET10(38)
    MSET10(39)
    MSET10(40)
    MSET10(41)
    MSET10(42)
    MSET10(43)
    MSET10(44)
    MSET10(45)
    MSET10(46)
    MSET10(47)
    MSET10(48)
    MSET10(49)
    MSET10(50)
    UM510,
    UM511,
    UM512
};

// A universal delegator for a custom interface that derives from
// IDispatch.
//
void FAR* g_rgpfnDisp[] = 
{
    UnivQueryInterface,
    UnivAddRef,
    UnivRelease,
    UnivGetTypeInfoCount,
    UnivGetTypeInfo,
    UnivGetIDsOfNames,
    UnivInvoke,
    UM7,
    UM8,
    UM9,
    MSET10(1)
    MSET10(2)
    MSET10(3)
    MSET10(4)
    MSET10(5)
    MSET10(6)
    MSET10(7)
    MSET10(8)
    MSET10(9)
    MSET10(10)
    MSET10(11)
    MSET10(12)
    MSET10(13)
    MSET10(14)
    MSET10(15)
    MSET10(16)
    MSET10(17)
    MSET10(18)
    MSET10(19)
    MSET10(20)
    MSET10(21)
    MSET10(22)
    MSET10(23)
    MSET10(24)
    MSET10(25)
    MSET10(26)
    MSET10(27)
    MSET10(28)
    MSET10(29)
    MSET10(30)
    MSET10(31)
    MSET10(32)
    MSET10(33)
    MSET10(34)
    MSET10(35)
    MSET10(36)
    MSET10(37)
    MSET10(38)
    MSET10(39)
    MSET10(40)
    MSET10(41)
    MSET10(42)
    MSET10(43)
    MSET10(44)
    MSET10(45)
    MSET10(46)
    MSET10(47)
    MSET10(48)
    MSET10(49)
    MSET10(50)
    UM510,
    UM511,
    UM512
};


long g_cfnUnk = DIM(g_rgpfnUnk);
long g_cfnDisp = DIM(g_rgpfnDisp);

