?? modemprotocol.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;
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -