⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modemprotocol.cpp

📁 .net 方面的开发说明资料。
💻 CPP
字号:
// ========================================================
// Modem Protocol Handler
//
// Design and Implementation by Floris van den Berg
// ========================================================

#pragma warning (disable : 4275)
#pragma warning (disable : 4786)

#include <string.h>
#include <memory.h>

#include "OpenNet.h"
#include "Transport.h"
#include "ModemProtocol.h"

// --------------------------------------------------------

struct MemberData {
	TRANSPORT_HANDLE m_transport;
	unsigned char m_buffer[4096];
	int m_read_size;
};

// --------------------------------------------------------

#define HANDLEMSG(S, EVENT) \
{ \
	int strlength = strlen(S); \
	for (int j = start_pos; j < members->m_read_size; ++j) { \
		if (toupper(members->m_buffer[j]) == toupper(S[0])) { \
			int length = (members->m_read_size - j >= strlength) ? strlength : members->m_read_size - j; \
			if (strnicmp((char *)members->m_buffer + j, S, length) == 0) { \
				if (length < strlength) \
					return; \
				event.msg = EVENT; \
				EpDispatchEvent(members->m_transport, &event); \
				EpCancelTimeout(members->m_transport, CLSID_MODEM_PROTOCOL, event.msg); \
				found_pos = j; \
				start_pos = j + strlength; \
				break; \
			} \
		} \
	} \
}

void
MoveFromBuffer(void *self, int position) {
	MemberData *members = (MemberData *)self;
	memcpy(members->m_buffer, members->m_buffer + position, 4096 - position - 1);
	members->m_read_size -= position;
}

// --------------------------------------------------------

static void *DLL_CALLCONV
Create(TRANSPORT_HANDLE transport) {
	MemberData *data = new MemberData;
	data->m_transport = transport;
	data->m_read_size = 0;
	return data;
}

static void DLL_CALLCONV
Receive(void *self, unsigned char *data, int size) {
	MemberData *members = (MemberData *)self;

	// copy the received data in the buffer

	memcpy(&members->m_buffer[members->m_read_size], data, size);
	members->m_read_size += size;

	// analyze the data... if it is something regognized, handle it

	EpEvent event;
	event.reference_id = 0;
	event.size = 0;
	event.protocol = CLSID_MODEM_PROTOCOL;
	event.data = NULL;

	int start_pos = 0;
	int found_pos = 0;

	while (found_pos != -1) {
		found_pos = -1;

		HANDLEMSG("CONNECT", MODEM_CONNECT);
		HANDLEMSG("NO CARRIER", MODEM_NOCARRIER);
		HANDLEMSG("BUSY", MODEM_BUSY);
		HANDLEMSG("NO DIALTONE", MODEM_NODIALTONE);
		HANDLEMSG("NO DIAL TONE", MODEM_NODIALTONE);		
		HANDLEMSG("OK", MODEM_OK);
		HANDLEMSG("DELAYED NUMBER WAIT", MODEM_DELAYEDNUMBERWAIT);
		HANDLEMSG("FORBIDDEN NUMBER", MODEM_FORBIDDENNUMBER);	
		HANDLEMSG("RING", MODEM_RING);	
		HANDLEMSG("ERROR", MODEM_ERROR_IN_COMMAND);		
	}
	
	MoveFromBuffer(self, size);
}

static void DLL_CALLCONV
Send(void *self, EpAction *action) {
	MemberData *data = (MemberData *)self;
}

static void DLL_CALLCONV
Reset(void *self) {
	MemberData *data = (MemberData *)self;
}

static void DLL_CALLCONV
Destroy(void *self) {
	delete (MemberData *)self;
}

static int DLL_CALLCONV
GetName(void *self, char *name, int size) {
	if ((name) && (size >= 6))
		strcpy(name, "Modem");

	return 6;
}

static int DLL_CALLCONV
GetMessageName(void *self, int msg, char *name, int size) {
	switch(msg) {
		case MODEM_OK :
			if ((name) && (size >= 9))
				strcpy(name, "MODEM_OK");

			return 9;

		case MODEM_CONNECT :
			if ((name) && (size >= 14))
				strcpy(name, "MODEM_CONNECT");

			return 14;

		case MODEM_BUSY :
			if ((name) && (size >= 11))
				strcpy(name, "MODEM_BUSY");

			return 11;

		case MODEM_NOCARRIER :
			if ((name) && (size >= 16))
				strcpy(name, "MODEM_NOCARRIER");

			return 16;

		case MODEM_NODIALTONE :
			if ((name) && (size >= 17))
				strcpy(name, "MODEM_NODIALTONE");

			return 17;

		case MODEM_DELAYEDNUMBERWAIT :
			if ((name) && (size >= 24))
				strcpy(name, "MODEM_DELAYEDNUMBERWAIT");

			return 24;

		case MODEM_FORBIDDENNUMBER :
			if ((name) && (size >= 22))
				strcpy(name, "MODEM_FORBIDDENNUMBER");

			return 22;

		case MODEM_RING :
			if ((name) && (size >= 11))
				strcpy(name, "MODEM_RING");

			return 11;

		case MODEM_ERROR_IN_COMMAND :
			if ((name) && (size >= 23))
				strcpy(name, "MODEM_ERROR_IN_COMMAND");

			return 23;
	};

	return 0;
}

// --------------------------------------------------------
// Make protocol available for use
// --------------------------------------------------------

GUID DLL_CALLCONV
ModemProtocolInit(int count, Protocol *protocol) {
	protocol->create = Create;
	protocol->destroy = Destroy;
	protocol->receive = Receive;
	protocol->send = Send;
	protocol->reset = Reset;
	protocol->getname = GetName;
	protocol->getmessagename = GetMessageName;
	return CLSID_MODEM_PROTOCOL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -