//+-------------------------------------------------------------------
//
//  File:       cmarshal.hxx
//
//  Contents:   This file contins the DLL entry points
//                      LibMain
//                      DllGetClassObject (Bindings key func)
//                      DllCanUnloadNow
//                      CCMarshalCF (class factory)
//  History:	30-Mar-92      SarahJ      Created
//
//---------------------------------------------------------------------

#ifndef __CMARSHAL_H__
#define __CMARSHAL_H__


//+-------------------------------------------------------------------
//
//  Class:    CCMarshalCF
//
//  Synopsis: Class Factory for CCMarshal
//
//  Methods:  IUnknown      - QueryInterface, AddRef, Release
//            IClassFactory - CreateInstance
//
//  History:  21-Mar-92  SarahJ  Created
//
//--------------------------------------------------------------------


class FAR CCMarshalCF: public IClassFactory
{
public:

    // Constructor/Destructor
    CCMarshalCF();
    ~CCMarshalCF();

    // IUnknown
    STDMETHODIMP QueryInterface(REFIID iid, void FAR * FAR * ppv);
    STDMETHODIMP_(ULONG) AddRef(void);
    STDMETHODIMP_(ULONG) Release(void);


    // IClassFactory
    STDMETHODIMP CreateInstance(IUnknown FAR* pUnkOuter,
	                        REFIID iidInterface,
				void FAR* FAR* ppv);

    STDMETHODIMP LockServer(BOOL fLock);

private:

    ULONG ref_count;;
};



class CMarshalBase : public IMarshal
{
  public:

    CMarshalBase();
    ~CMarshalBase();

    // IMarshal
    STDMETHOD(GetUnmarshalClass) (THIS_ REFIID riid, LPVOID pv,
        		  DWORD dwDestContext, LPVOID pvDestContext,
        		  DWORD mshlflags, LPCLSID pCid);
    STDMETHOD(GetMarshalSizeMax) (THIS_ REFIID riid, LPVOID pv,
        		  DWORD dwDestContext, LPVOID pvDestContext,
        		  DWORD mshlflags, LPDWORD pSize);
    STDMETHOD(MarshalInterface)  (THIS_ IStream  * pStm, REFIID riid,
        		  LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext,
        		  DWORD mshlflags);
    STDMETHOD(UnmarshalInterface)(THIS_ IStream  * pStm, REFIID riid,
                          LPVOID	* ppv);
    STDMETHOD(ReleaseMarshalData)(THIS_ IStream  * pStm);
    STDMETHOD(DisconnectObject)  (THIS_ DWORD dwReserved);

    ITest    *proxy;

  private:
    IMarshal *marshaller;

};

//+-------------------------------------------------------------------
//
//  Class:    CCMarshal
//
//  Synopsis: Test class CCMarshal
//
//  Methods:
//
//  History:  21-Mar-92  SarahJ  Created
//
//--------------------------------------------------------------------


class FAR CCMarshal: public ITest, public CMarshalBase
{
public:
// Constructor/Destructor
	CCMarshal();
	~CCMarshal();

    // IUnknown
    STDMETHODIMP QueryInterface(REFIID iid, void FAR * FAR * ppv);
    STDMETHODIMP_(ULONG) AddRef(void);
    STDMETHODIMP_(ULONG) Release(void);

    //	ITest
    STDMETHOD_(DWORD, die)    ( ITest *, ULONG, ULONG, ULONG );
    STDMETHOD (die_cpp)       ( ULONG );
    STDMETHOD (die_nt)        ( ULONG );
    STDMETHOD_(DWORD, DoTest) ( ITest *, ITest * );
    STDMETHOD_(BOOL, hello)   ( );
    STDMETHOD (interrupt)     ( ITest *, BOOL );
    STDMETHOD (recurse)       ( ITest *, ULONG );
    STDMETHOD (recurse_interrupt)( ITest *, ULONG );
    STDMETHOD (sick)          ( ULONG );
    STDMETHOD (sleep)         ( ULONG );

private:

  ULONG     ref_count;
};

#endif