//
//   COMPONENT_NAME: somm
//
//   ORIGINS: 27
//
//
//    25H7912  (C)  COPYRIGHT International Business Machines Corp. 1992,1996,1996
//   All Rights Reserved
//   Licensed Materials - Property of IBM
//   US Government Users Restricted Rights - Use, duplication or
//   disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
//
//   @(#)15 1.17 3/29/96 15:41:39 [12/22/96] (c)IBM Corp. 1995


#ifndef somproxy_idl
#define somproxy_idl

#include <somcls.idl>


interface SOMMProxyFor
                        : SOMClass
{
        SOMClass sommMakeProxyClass( in SOMClass targetClass,
                                     in string className );
        // sommMakeProxyClass returns a class that is the join
        // (in the sense of multiple inheritance) of somSelf and
        // the targetClass (for which abstract inheritance is used,
        // i.e., the interface is inherited but not the implementation).
        // The returned class has the name className (which must be
        // unique among the registered classes).  If the parameter
        // className is NULL or empty, sommMakeProxyClass constructs
        // a unique name that starts with
        //      ProxyFor<name of targetClass>

        implementation {
                releaseorder: sommMakeProxyClass;
                callstyle = oidl;
                        // oidl callstyle is used here because none of the
                        // introduced methods are ever forwarded.
                dllname = "somu.dll";
        };
};



interface SOMMProxyForObject: SOMObject
{
        attribute SOMObject sommProxyTarget;
        // An object used by sommProxyDispatch to determine the target
        // object to which a method invocation should be forwarded.


        struct sommProxyDispatchInfo {
            somMethodData  md;
            somMethodPtr   dispatchFcn;
        };

        boolean sommProxyDispatch( out somToken returnBufferPointer,
                                   in  sommProxyDispatchInfo dispatchInfo,
                                   in  va_list ap );
        // sommProxyDispatch is used to forward method invocations to
        // the target object from methods supported by the proxy class.
        // The default implementation assumes that _sommTarget is a pointer
        // to the target object (in the same address space), and that the
        // method data within the dispatchInfo was acquired from the target
        // class.
        // sommProxyDispatch should not be invoked from outside of the
        // proxy class because such an invocation bypasses any override
        // of the method or any behavior added by a metaclass.

        implementation {
                releaseorder:   _get_sommProxyTarget,
                                _set_sommProxyTarget,
                                sommProxyDispatch;
                callstyle = oidl;
                        // oidl callstyle is used here because none of the
                        // introduced methods are ever forwarded.
                metaclass = SOMMProxyFor;
                dllname = "somu.dll";
        };
};

#endif
