//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1993.
//
//  File:       DdeChC.cxx
//
//  Contents:   CDdeChannelControl implementation for DDE. This
//		implementation requires no instance data, therefore it is
//		intended to be static.
//
//  Functions:
//
//  History:    08-May-94 Johann Posch (johannp)    Created
//  		10-May-94 KevinRo  Made simpler and commented
//
//--------------------------------------------------------------------------
#ifndef __DDECHC_HXX__
#define __DDECHC_HXX__

class CDdeObject;
//
// The following are the possible callbacks that would be supported by
// the CDdeObject
//

typedef enum
{
    DDE_DISP_SENDONDATACHANGE = 1,
    DDE_DISP_OLECALLBACK = 2 ,
    DDE_DISP_SRVRWNDPROC = 3 ,
    DDE_DISP_DOCWNDPROC = 4
} DDE_DISPATCH_FUNC;


//
// The following defines a base class for the OLE 1.0 support
//

typedef struct tagOLE1DISPATCHDATA
{
    DDE_DISPATCH_FUNC wDispFunc;
}OLE1DISPATCHDATA, *POLE1DISPATCHDATA;

//
// The following structure is used by OLE 1.0 server support code
//

typedef struct tagDDEDISPATCHDATA : public CPrivAlloc, public OLE1DISPATCHDATA
{
    CDdeObject *pCDdeObject;
    UINT iArg;
} DDEDISPATCHDATA, *PDDEDISPATCHDATA;


//
// The following structure is used by the OLE 1.0 client support code
// to dispatch incoming calls to Execute from the server window.
//

typedef struct tagSRVRDISPATCHDATA : public OLE1DISPATCHDATA,public CPrivAlloc
{
    HWND hwnd;
    HANDLE hData;
    HWND wParam;
    LPSRVR lpsrvr;
} SRVRDISPATCHDATA, *PSRVRDISPATCHDATA;

INTERNAL SrvrDispatchIncomingCall(PSRVRDISPATCHDATA psdd);


//
// The following structure is used by the OLE 1.0 client support code
// to dispatch incoming calls to a document window
//

typedef struct tagDOCDISPATCHDATA : public OLE1DISPATCHDATA,public CPrivAlloc
{
    HWND hwnd;
    ULONG msg;
    WPARAM wParam;
    LPARAM lParam;
    HANDLE hdata;		// If already determined, these two hold
    ATOM aItem;			// valid data. All depends on the message
    LPCLIENT lpclient;
} DOCDISPATCHDATA, *PDOCDISPATCHDATA;

INTERNAL DocDispatchIncomingCall(PDOCDISPATCHDATA psdd);



//
// DDECALLDATA is all the information needed to transmit the outbound call
// to the server. Since this DDE channel uses PostMessage, the members
// should look amazingly alot like the parameters to PostMessage.
//
// The hwndCli is used for setting callback information.
// fInitialSend is used by IChannelControl::Transmit().
//
typedef struct tagDDECALLDATA : public CPrivAlloc
{
    HWND  hwndSvr;	     	// Server DDE window
    WORD  wMsg;			// Post parameters
    WPARAM  wParam;
    LPARAM  lParam;

    HWND  hwndCli;		// Handle to client side window
    BOOL  fInitialSend;		// True if the first post has been made
				// already.
} DDECALLDATA, *PDDECALLDATA;


class CDdeChannelControl : public IChannelControl
{
  public:
    //  IUnknown methods
    STDMETHOD (QueryInterface)   ( REFIID riid, LPVOID FAR* ppvObj);
    STDMETHOD_(ULONG,AddRef)     ( void );
    STDMETHOD_(ULONG,Release)    ( void );

    //  IChannelControl
    STDMETHOD (DispatchCall)( PDISPATCHDATA );
    STDMETHOD (OnEvent)     ( PCALLDATA );
    STDMETHOD (TransmitCall)( PCALLDATA );
};

//
// All threads can use a single instance of this class. Therefore, we
// provide the following global variable
//

extern CDdeChannelControl g_CDdeChannelControl;

#endif // __DDECHC__HXX__

