295 lines
7.9 KiB
C++
295 lines
7.9 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
#pragma once
|
|
|
|
#ifndef UINT16
|
|
#define INT16 SHORT
|
|
#define UINT16 USHORT
|
|
#define UINT8 BYTE
|
|
#define PINT16 PSHORT
|
|
#define PUINT16 PUSHORT
|
|
#define PUINT8 PBYTE
|
|
#endif
|
|
|
|
#pragma warning(disable: 4512)
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
class ITimerSink
|
|
{
|
|
public:
|
|
virtual VOID OnTimerFired(VOID) = 0;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
struct CNetwork
|
|
{
|
|
CNetwork * pNext;
|
|
UINT32 nAddr;
|
|
UINT32 nMask;
|
|
UINT32 nCast;
|
|
UINT32 nGate;
|
|
BOOL fCreated; // Updated on SocketLoadNetworks.
|
|
BOOL fChanged; // Updated on SocketLoadNetworks.
|
|
BOOL fDeleted; // Updated on SocketLoadNetworks.
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////// UDP Sockets.
|
|
//
|
|
class ISocketSource
|
|
{
|
|
public:
|
|
virtual UINT SocketSend(UINT32 nAddr,
|
|
UINT16 nPort,
|
|
PBYTE pbData,
|
|
UINT cbData) = 0;
|
|
|
|
virtual UINT SocketClose(UINT dwError) = 0;
|
|
};
|
|
|
|
class ISocketSink
|
|
{
|
|
public:
|
|
virtual VOID OnSocketCreate(ISocketSource *pSource) = 0;
|
|
|
|
virtual VOID OnSocketRecv(UINT dwError,
|
|
UINT32 nAddr,
|
|
UINT16 nPort,
|
|
PBYTE pbData,
|
|
UINT cbRcvd) = 0;
|
|
|
|
virtual VOID OnSocketClose(UINT dwError) = 0;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////// Sessions.
|
|
//
|
|
class ISessionSource
|
|
{
|
|
public:
|
|
virtual UINT SessionSend(PBYTE pbData, UINT cbData) = 0;
|
|
virtual UINT SessionClose(UINT dwError) = 0;
|
|
};
|
|
|
|
class ISessionSink
|
|
{
|
|
public:
|
|
virtual VOID OnSessionCreate(ISessionSource *pSource,
|
|
PVOID pvContext) = 0;
|
|
|
|
virtual VOID OnSessionRecv(UINT dwError,
|
|
PBYTE pbData,
|
|
UINT cbRcvd) = 0;
|
|
|
|
virtual VOID OnSessionClose(UINT dwError) = 0;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
class ISessionFactorySource
|
|
{
|
|
public:
|
|
virtual UINT FactorySessionCreate(UINT32 nPeerAddr,
|
|
UINT16 nPeerPort,
|
|
ISessionSink **ppSink,
|
|
PVOID pvContext) = 0;
|
|
|
|
virtual UINT FactorySend(UINT32 nAddr,
|
|
UINT16 nPort,
|
|
PBYTE pbData,
|
|
UINT cbData) = 0;
|
|
|
|
virtual UINT FactoryClose() = 0;
|
|
};
|
|
|
|
class ISessionFactorySink
|
|
{
|
|
public:
|
|
virtual VOID OnFactoryCreate(ISessionFactorySource *pFactorySource) = 0;
|
|
|
|
virtual VOID OnFactoryRecv(UINT dwError,
|
|
UINT32 nAddr,
|
|
UINT16 nPort,
|
|
PBYTE pbData,
|
|
UINT cbRcvd) = 0;
|
|
|
|
virtual VOID OnFactoryClose(UINT dwError) = 0;
|
|
|
|
virtual VOID OnSessionCreate(UINT32 nPeerAddr,
|
|
UINT16 nPeerPort,
|
|
ISessionSource *pSource,
|
|
ISessionSink **ppSink,
|
|
PVOID pvContext) = 0;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
class CSocketSink : public ISocketSink
|
|
{
|
|
public:
|
|
CSocketSink()
|
|
: m_pSource(NULL)
|
|
{
|
|
}
|
|
|
|
~CSocketSink()
|
|
{
|
|
if (m_pSource) {
|
|
m_pSource->SocketClose(0);
|
|
m_pSource = NULL;
|
|
}
|
|
}
|
|
|
|
virtual VOID OnSocketCreate(ISocketSource *pSource)
|
|
{
|
|
m_pSource = pSource;
|
|
}
|
|
|
|
virtual VOID OnSocketClose(UINT dwError)
|
|
{
|
|
(void)dwError;
|
|
m_pSource = NULL;
|
|
}
|
|
|
|
virtual VOID OnSocketRecv(UINT dwError,
|
|
UINT32 nAddr, UINT16 nPort,
|
|
PBYTE pbData, UINT cbData) = 0;
|
|
|
|
UINT SocketSend(UINT32 nAddr, UINT16 nPort, PBYTE pbData, UINT cbData)
|
|
{
|
|
return m_pSource->SocketSend(nAddr, nPort, pbData, cbData);
|
|
}
|
|
|
|
public:
|
|
ISocketSource * m_pSource;
|
|
};
|
|
|
|
class CSessionSink : public ISessionSink
|
|
{
|
|
public:
|
|
CSessionSink()
|
|
: m_pSource(NULL)
|
|
{
|
|
}
|
|
|
|
~CSessionSink()
|
|
{
|
|
if (m_pSource) {
|
|
m_pSource->SessionClose(0);
|
|
m_pSource = NULL;
|
|
}
|
|
}
|
|
|
|
virtual VOID OnSessionCreate(ISessionSource *pSource, PVOID pvContext)
|
|
{
|
|
(void)pvContext;
|
|
|
|
m_pSource = pSource;
|
|
}
|
|
|
|
virtual VOID OnSessionClose(UINT dwError)
|
|
{
|
|
(void)dwError;
|
|
m_pSource = NULL;
|
|
}
|
|
|
|
virtual VOID OnSessionRecv(UINT dwError, PBYTE pbData, UINT cbData) = 0;
|
|
|
|
UINT SessionSend(PBYTE pbData, UINT cbData)
|
|
{
|
|
return m_pSource->SessionSend(pbData, cbData);
|
|
}
|
|
|
|
public:
|
|
ISessionSource * m_pSource;
|
|
};
|
|
|
|
class CSessionFactorySink : public ISessionFactorySink
|
|
{
|
|
public:
|
|
CSessionFactorySink()
|
|
: m_pFactorySource(NULL)
|
|
{
|
|
}
|
|
|
|
~CSessionFactorySink()
|
|
{
|
|
if (m_pFactorySource) {
|
|
m_pFactorySource->FactoryClose();
|
|
m_pFactorySource = NULL;
|
|
}
|
|
}
|
|
|
|
// ISessionFactorySink
|
|
public:
|
|
virtual VOID OnFactoryCreate(ISessionFactorySource *pFactorySource)
|
|
{
|
|
m_pFactorySource = pFactorySource;
|
|
}
|
|
|
|
virtual VOID OnFactoryRecv(UINT dwError,
|
|
UINT32 nAddr,
|
|
UINT16 nPort,
|
|
PBYTE pbData,
|
|
UINT cbRcvd) = 0;
|
|
|
|
virtual VOID OnFactoryClose(UINT dwError)
|
|
{
|
|
(void)dwError;
|
|
m_pFactorySource = NULL;
|
|
}
|
|
|
|
virtual VOID OnSessionCreate(UINT32 nPeerAddr,
|
|
UINT16 nPeerPort,
|
|
ISessionSource *pSource,
|
|
ISessionSink **ppSink,
|
|
PVOID pvContext) = 0;
|
|
|
|
UINT FactorySessionCreate(UINT32 nPeerAddr,
|
|
UINT16 nPeerPort,
|
|
ISessionSink **ppSink,
|
|
PVOID pvContext)
|
|
{
|
|
return m_pFactorySource->FactorySessionCreate(nPeerAddr, nPeerPort,
|
|
ppSink, pvContext);
|
|
}
|
|
|
|
UINT FactorySend(UINT32 nAddr,
|
|
UINT16 nPort,
|
|
PBYTE pbData,
|
|
UINT cbData)
|
|
{
|
|
return m_pFactorySource->FactorySend(nAddr, nPort, pbData, cbData);
|
|
}
|
|
|
|
UINT FactoryClose()
|
|
{
|
|
return m_pFactorySource->FactoryClose();
|
|
}
|
|
|
|
public:
|
|
ISessionFactorySource * m_pFactorySource;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
BOOL TimerSet(ITimerSink *pTimerSink, UINT nMilliseconds);
|
|
BOOL TimerClr(ITimerSink *pTimerSink);
|
|
|
|
VOID SocketInit(HWND hWnd, UINT nMsg);
|
|
LRESULT SocketEvent(WPARAM wParam, LPARAM lParam);
|
|
UINT SocketCreate(UINT32 nLocalAddr, UINT16 wLocalPort,
|
|
ISocketSink *pSink);
|
|
UINT SessionFactoryCreate(UINT32 nLocalAddr, UINT16 wLocalPort,
|
|
ISessionFactorySink *pFactorySink);
|
|
|
|
BOOL SocketLoadNetworks(CNetwork ** ppNetworks);
|
|
|
|
PCSTR SocketToString(UINT32 dwAddr);
|
|
|
|
//
|
|
///////////////////////////////////////////////////////////////// End of File.
|