/*++
Copyright (c) 1995 Intel Corp
Module Name:
ws2chat.h
Abstract:
This module defines the data structures and constants
for the WinSock 2 sample chat application.
--*/
#ifndef _ws2chat_H
#define _ws2chat_H
#include "nowarn.h" /* turn off benign warnings */
#ifndef _WINSOCKAPI_
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */
#endif
#include <windows.h>
#include "nowarn.h" /* some warnings may have been turned back on */
#include <winsock2.h>
#include "queue.h"
// turn off "unreferenced formal parameter" warning
#pragma warning(disable: 4100)
//
// Manifest Constants
//
// UI/MDI
#define MAIN_MENU_POS 1
#define CLIENT_WINDOW_ID 1
#define EC_SEND_CHILD 0
#define EC_RECV_CHILD 1
#define IDM_CONNECT 10
#define IDM_CLOSE 12
#define IDM_EXIT 13
#define IDM_TILE 30
#define IDM_CASCADE 31
#define IDM_ARRANGE 32
#define IDM_CLOSEALL 33
#define IDM_CLEAR_SENDBUFFER 34
#define IDM_CLEAR_RECVBUFFER 35
#define IDM_FIRSTCHILD 100
// For some reason, 30k is the most characters you can have in an edit
// control at once. This keeps us from going over.
#define MAX_EC_TEXT 25500
// resource constants
#define IDC_SUBJECT 1000
#define IDC_CALLEENAME 1001
#define IDC_CALLERNAME 1002
#define IDC_FAM_LB 1003
#define IDC_INET_ADDRESS 1004
#define IDC_INET_PORT 1005
#define IDC_ADDRESS 1006
#define IDC_LISTEN_PORT 1007
#define IDC_LISTEN_ADDR 1008
#define IDC_STATIC -1
// data lengths
#define NAME_LEN 20
#define ADDR_LEN 40
#define SUB_LEN 80
#define MSG_LEN 200
#define TITLE_LEN 40
#define BUFFER_LENGTH 1024
// various stuff
#define MAX_SOCKADDR_LEN 512
#define MAX_LISTENING_SOCKETS 64
#define CONN_WND_EXTRA 8
#define GWL_CONNINFO 0
#define GWL_OLDEDITPROC 4
#define NO_MAX_MSG_SIZE 0xffffffff
// what kind of send?
#define OVERLAPPED_IO 0
#define NON_OVERLAPPED_IO 1
// chat return values
#define CHAT_OK 0
#define CHAT_ERROR 1
#define CHAT_CLOSED 2
#define CHAT_WOULD_BLOCK 3
#define CHAT_ABORTED 4
// for Internet connections
#define INET_ADDR_LEN 64
#define INET_PORT_LEN 5
#define INET_DEFAULT_PORT 9009
// for LSP connections
#define LSP_ADDR_LEN 10
#define LSP_DEFAULT_ADDR 9009
// user message values
#define USMSG_ACCEPT WM_USER+1
#define USMSG_CONNECT WM_USER+2
#define USMSG_TEXTOUT WM_USER+3
#define USMSG_QOS WM_USER+4
// version of Winsock we need
#define VERSION_MAJOR 2
#define VERSION_MINOR 0
// quality of Service
#define TOKENRATE 100
#define QOS_UNSPECIFIED (DWORD)-1
//
// Types and Data Structures
//
typedef struct _CONNDATA CONNDATA, *PCONNDATA;
typedef struct _OUTPUT_REQUEST OUTPUT_REQUEST, *POUTPUT_REQUEST;
// structure created by the user interface and passed to the
// input/output thread -- tells the I/O thread what to send and how to
// send it.
struct _OUTPUT_REQUEST {
int Type; // OVERLAPPED_IO or NON_OVERLAPPED_IO
WSABUF Buffer; // holds the buffer (pointer) and size
char Character; // for one-character ouput events
PCONNDATA ConnData; // data for the associated connection
LPWSAOVERLAPPED Overlapped; // NULL if not an overlapped send
};
// structure for storing data unique to each connection.
struct _CONNDATA {
// the socket for the connection
SOCKET Socket;
DWORD RefCount; // so we know when to free it
// string containing the name of the user (only
// valid if user-data is supported by the protocol)
char PeerName[NAME_LEN + 1];
// string containing the subject of the chat
// session, as entered by the calling entity
char Subject[SUB_LEN + 1];
// string containing the (human-readable) address
// of the connected entity
char PeerAddress[ADDR_LEN + 1];
// handle to thread that takes care of network events
HANDLE IOThreadHandle;
// handle to event signaled when a network event
// occurs
HANDLE SocketEventObject;
// handle to event signaled when output is ready
// to be shipped
HANDLE OutputEventObject;
// This event is signalled in CleanupConnection to tell the thread to exit
HANDLE ThreadTerminationEvent;
// points to a queue used to hold output buffers
PQUEUE OutputQueue;
// handle to window associated with the connection
HWND ConnectionWindow;
// handle to the sending and receiving edit controls
HWND SendWindow;
HWND RecvWindow;
// the remote socket address for the connection
WSABUF RemoteSockAddr;
// buffer used by the connecting entity to get
// user-data back when the USMSG_CONNECT is
// received
WSABUF CalleeBuffer;
// points to a protocol information struct which
// represents the protocol for this connection
LPWSAPROTOCOL_INFO ProtocolInfo;
// are we waiting for an FD_WRITE?
BOOL WriteOk;
// How many events the wait in the I/O thread is
// waiting on. Once that thread starts, this will
// always be at least 2 -- the SocketEventObject
// and the OutputEventObject.
DWORD NumEvents;
// The array of events which the I/O thread is
// currently waiting on. Contains NumEvents entries.
WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
// An array of pointers to output request
// structures, indexed in parallel to EventArray,
// above. This allows us to associate the events
// with the output requests, so we can free the
// right memory when the event is signaled.
POUTPUT_REQUEST OutReqArray[WSA_MAXIMUM_WAIT_EVENTS];
// The maximum message size we can send on this
// socket. This value is either an integer or the
// manifest constant NO_MAX_MSG_SIZE.
DWORD MaxMsgSize;
};
// structure to associate listening sockets with a protocol
// information struct.
typedef struct _LISTENDATA {
SOCKET Socket; // a listening socket
LPWSAPROTOCOL_INFO ProtocolInfo; // the associated protocol info. struct
} LISTENDATA, *PLISTENDATA;
//
// Function prototypes for functions to be used outside of ws2chat.c
//
void
OutputString(
IN HWND RecvWindow,
IN char *String);
BOOL
ExtractTwoStrings(
IN char *Buffer,
OUT char *String1,
IN char Length1,
OUT char *String2,
IN int Length2);
BOOL
TranslateHex(
OUT LPVOID Buffer,
IN int BufferLen,
IN char *HexString,
IN HWND WindowHandle);
BOOL
PackTwoStrings(
OUT char *Buffer,
IN int BufferLen,
IN char *String1,
IN char *String2);
BOOL
MakeRoom(
IN HWND EditControl,
IN int HowMuch);
void
ChatSysError(
IN char *FailedFunction,
IN char *InFunction,
IN BOOL Fatal);
VOID
ParseCmdLine(
LPSTR CmdLine
);
INT
usage();
DWORD
StartConnection(
IN HWND WindowHandle
);
BOOL
HandleSocketEvent(
IN OUT PCONNDATA ConnData);
int
HandleEvents(
IN PCONNDATA ConnData,
IN LPWSANETWORKEVENTS NetworkEvents);
//
// Externally-Visible Variables
//
extern HANDLE GlobalInstance; // Identifies the instance of chat
extern char ConnClassStr[]; // String to register window class
extern char ChatClassStr[]; // String to register window class
extern HWND GlobalFrameWindow; // Chat's main -- or frame -- window
extern DWORD ThisAddr;
extern DWORD OtherAddr;
extern DWORD NumSockets;
extern DWORD LocalPort;
extern BOOL UseAsyncSelect;
#endif // _ws2chat_