- 论坛徽章:
- 0
|
保险起见,代码全贴上了,有点长。。。
问题是这样的,如果在外部调用PseudoModemDrivers::CreateModem(tty, route, callbackEndPoint),则指向以下代码中PseudoModem *PseudoModemDrivers::CreateModem()的声明。而该CreatModem()方法调用了drivers.CreatePseudoModem(tty, route, callbackEndPoint)
,看有这样一句drivers[numDrivers].CreatePseudoModem = CreatePseudoModem,俺觉得可能就是调用CreatePseudoModem,再往下就不懂了。还有这样的句子: PseudoModem##suffix,两个井号是干什么的阿???
其实按照程序的思路,这里应该继续调用drv_pty.cxx,声成其中定义的PseudoModemPty类。。。可我怎么看也和这个drv_pty.cxx没有联系阿。
小弟本来不懂c++的,老板逼我读这个代码。。。问题问得太弱了大家见谅。
#include <ptlib.h>;
#include "pmodemi.h"
#include "drivers.h"
#include "drv_pty.h"
#include "drv_c0c.h"
///////////////////////////////////////////////////////////////
#define new PNEW
///////////////////////////////////////////////////////////////
static int numDrivers = 0;
///////////////////////////////////////////////////////////////
#define MAX_DRIVERS 10
static struct {
const char *name;
BOOL (*CheckTty)(
const PString &_tty
);
PStringArray (*Description)();
PseudoModem *(*CreatePseudoModem)(
const PString &tty,
const PString &route,
const PNotifier &callbackEndPoint
);
} drivers[MAX_DRIVERS];
static int addDriver(
const char *name,
BOOL (*CheckTty)(
const PString &_tty
),
PStringArray (*Description)(),
PseudoModem *(*CreatePseudoModem)(
const PString &tty,
const PString &route,
const PNotifier &callbackEndPoint
)
)
{
if (numDrivers >;= MAX_DRIVERS)
return -1;
drivers[numDrivers].name = name;
drivers[numDrivers].CheckTty = CheckTty;
drivers[numDrivers].Description = Description;
drivers[numDrivers].CreatePseudoModem = CreatePseudoModem;
return numDrivers++;
}
///////////////////////////////////////////////////////////////
#define DECLARE_MODEM_DRIVER(name, suffix) \
static PseudoModem *CreatePseudoModem##suffix( \
const PString &tty, \
const PString &route, \
const PNotifier &callbackEndPoint) \
{ \
return new \
PseudoModem##suffix(tty, route, callbackEndPoint); \
} \
static const int ___addDriver##suffix = addDriver( \
name, \
& seudoModem##suffix::CheckTty, \
& seudoModem##suffix: escription, \
&CreatePseudoModem##suffix \
); \
///////////////////////////////////////////////////////////////
#ifdef MODEM_DRIVER_Pty
DECLARE_MODEM_DRIVER(" TY", Pty)
#endif
#ifdef MODEM_DRIVER_C0C
DECLARE_MODEM_DRIVER("C0C", C0C)
#endif
///////////////////////////////////////////////////////////////
PseudoModem *PseudoModemDrivers::CreateModem(
const PString &tty,
const PString &route,
const PNotifier &callbackEndPoint
)
{
PseudoModem *modem = NULL;
for (int i = 0 ; i < numDrivers ; i++) {
if (drivers.CheckTty(tty)) {
modem = drivers.CreatePseudoModem(tty, route, callbackEndPoint);
if (!modem) {
myPTRACE(1, " seudoModemDrivers::CreateModem " << tty << " was not created" ;
return NULL;
}
break;
}
}
if (!modem) {
myPTRACE(1, " seudoModemDrivers::CreateModem " << tty << " is not a valid value" ;
return NULL;
}
if (!modem->;IsValid()) {
myPTRACE(1, " seudoModemDrivers::CreateModem " << tty << " is not valid" ;
delete modem;
return NULL;
}
return modem;
}
PStringArray PseudoModemDrivers: escriptions()
{
PStringArray descriptions;
for (int i = 0 ; i < numDrivers ; i++) {
descriptions.Append(new PString(drivers.name));
PStringArray description = drivers.Description();
for (PINDEX j = 0 ; j < description.GetSize() ; j++)
descriptions.Append(new PString(PString(" " + description[j]));
}
return descriptions;
}
/////////////////////////////////////////////////////////////// |
|