//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is free 
// software: you can redistribute it and/or modify it under the terms of 
// the GNU General Public License as published by the Free Software Foundation, 
// either version 3 of the License, or (at your option) any later version.

// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed 
// in the hope that it will be useful, but with permitted additional restrictions 
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT 
// distributed with this program. You should have received a copy of the 
// GNU General Public License along with permitted additional restrictions 
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection

/***************************************************************************
 **   C O N F I D E N T I A L --- W E S T W O O D    S T U D I O S        **
 ***************************************************************************
 *                                                                         *
 *                 Project Name : Dynamic Data Encapsulation					*
 *                                                                         *
 *                    File Name : DDE.H												*
 *                                                                         *
 *                   Programmer : Steve Wetherill									*
 *                                                                         *
 *                   Start Date : June 1, 1996		                        *
 *                                                                         *
 *                  Last Update : June 8, 1996   [SW]                 		*
 *                                                                         *
 *-------------------------------------------------------------------------*
 *                                                                         *
 * This is the DDE (Instance_Class) which provides a simple CLIENT/SERVER	*
 * DDE model for data transactions between Windows applications.				*
 * This is a fairly naieve implementation allowing only one client/server	*
 * per Instance_Class object. 															*
 *																									*
 * Typical uses for this class are:														*
 *																									*
 * i. Robust verification of whether an application is running					*
 * ii. Data transfer between applications												*
 *																									*
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

/*
***************************** Class defines *****************************
*/

#ifndef 	__DDE_H
#define	__DDE_H

#define	DDE_ADVISE_CONNECT		-1		// advisory "client has connected"
#define	DDE_ADVISE_DISCONNECT	-2		// advisory "client has disconnected"

/*
***************************** Class Declaration *****************************
*/

class	Instance_Class {

	/*
	---------------------------- Public Interface ----------------------------
	*/
	public:

		/*.....................................................................
		Constructor:
		- takes null terminated ASCII strings names for client and server
		.....................................................................*/

		Instance_Class(		// constructor
			LPSTR,				// null terminated local sever name string
			LPSTR					// null terminated remote server name string
			);

		/*.....................................................................
		Destructor:
		.....................................................................*/
		~Instance_Class(void);	// the destructor

		/*.....................................................................
		Send data routine:
		- sends an unsolicited packet of data to the remote server
		.....................................................................*/
		BOOL	Poke_Server( LPBYTE, DWORD);

		/*.....................................................................
		Send data routine:
		- sets up DNS for the server and registers a user callback to handle
		  incoming data
		.....................................................................*/
		BOOL	Register_Server( BOOL (CALLBACK *)(LPBYTE, long));

		/*.....................................................................
		Does a trial connect to the remote server.
		- used to determine whether server is alive or not (and thus running)
		.....................................................................*/
		BOOL	Test_Server_Running( HSZ );

		/*.....................................................................
		Enables user callback (disabled by default)
		.....................................................................*/
		BOOL	Enable_Callback( BOOL );		// enable or disable callback

		/*.....................................................................
		Open a connection for sending data to remote server
		.....................................................................*/
		BOOL	Open_Poke_Connection( HSZ );

		/*.....................................................................
		Close connection with remote server
		.....................................................................*/
		BOOL	Close_Poke_Connection( void );

		//
		// static members
		//

		/*.....................................................................
		User callback - called upon receipt of incoming data (static member!)
		.....................................................................*/
		static BOOL (CALLBACK *callback) (

			LPBYTE pointer,		// pointer to received data
			long length				// if >0 length of received data
										// if <0
										//	-1 == client connect detected
										// -2 == client disconnect detected
			);

		/*.....................................................................
		DDE callback, called when DDEML has an event for us
		.....................................................................*/
		static HDDEDATA CALLBACK dde_callback(

			UINT  uType,		// transaction type
			UINT  uFmt,			// clipboard data format
			HCONV  hconv,		// handle of the conversation
			HSZ  hsz1,			// handle of a string
			HSZ  hsz2,			// handle of a string
			HDDEDATA  hdata,	// handle of a global memory object
			DWORD  dwData1,	// transaction-specific data
			DWORD  dwData2 	// transaction-specific data
			);
		HANDLE	instance;	// this application's instance
		HWND		hwnd;			// valid window handle

		/*.....................................................................
		member variables
		.....................................................................*/

		static DWORD id_inst;			// instance identifier set by DdeInitialize
		static BOOL	process_pokes;		// controls response to pokes
		static char ascii_name[32];	// name of server

		//
		// non-static member variables
		//

		HSZ remote_name; 		// string handle for remote server name
		HSZ local_name; 		// string handle for local server name
		HSZ system_topic;		// string handle for the "system" topic
		HSZ poke_topic;		// string handle for poking data to server topic
		HSZ poke_item;			// string handle for poking data to server item

		HCONV conv_handle;   // conversation handle
		BOOL	dde_error;		// error flag

};

#endif