Rewrite BuildCommDCB16 to depend on BuildCommDCB, not vice-versa.
This commit is contained in:
parent
7dd9ad72be
commit
fe0529dbea
|
@ -411,27 +411,71 @@ static void comm_waitwrite(struct DosDeviceStruct *ptr)
|
||||||
COMM16_WriteComplete);
|
COMM16_WriteComplete);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* COMM16_DCBtoDCB16 (Internal)
|
||||||
|
*/
|
||||||
|
INT16 COMM16_DCBtoDCB16(LPDCB lpdcb, LPDCB16 lpdcb16)
|
||||||
|
{
|
||||||
|
if(lpdcb->BaudRate<0x10000)
|
||||||
|
lpdcb16->BaudRate = lpdcb->BaudRate;
|
||||||
|
else if(lpdcb->BaudRate==115200)
|
||||||
|
lpdcb16->BaudRate = 57601;
|
||||||
|
else {
|
||||||
|
WARN("Baud rate can't be converted\n");
|
||||||
|
lpdcb16->BaudRate = 57601;
|
||||||
|
}
|
||||||
|
lpdcb16->ByteSize = lpdcb->ByteSize;
|
||||||
|
lpdcb16->fParity = lpdcb->fParity;
|
||||||
|
lpdcb16->Parity = lpdcb->Parity;
|
||||||
|
lpdcb16->StopBits = lpdcb->StopBits;
|
||||||
|
|
||||||
|
lpdcb16->RlsTimeout = 50;
|
||||||
|
lpdcb16->CtsTimeout = 50;
|
||||||
|
lpdcb16->DsrTimeout = 50;
|
||||||
|
lpdcb16->fNull = 0;
|
||||||
|
lpdcb16->fChEvt = 0;
|
||||||
|
lpdcb16->fBinary = 1;
|
||||||
|
lpdcb16->fDtrDisable = 0;
|
||||||
|
|
||||||
|
lpdcb16->fDtrflow = (lpdcb->fDtrControl==DTR_CONTROL_ENABLE);
|
||||||
|
lpdcb16->fRtsflow = (lpdcb->fRtsControl==RTS_CONTROL_ENABLE);
|
||||||
|
lpdcb16->fOutxCtsFlow = lpdcb->fOutxCtsFlow;
|
||||||
|
lpdcb16->fOutxDsrFlow = lpdcb->fOutxDsrFlow;
|
||||||
|
lpdcb16->fDtrDisable = (lpdcb->fDtrControl==DTR_CONTROL_DISABLE);
|
||||||
|
|
||||||
|
lpdcb16->fInX = lpdcb->fInX;
|
||||||
|
|
||||||
|
lpdcb16->fOutX = lpdcb->fOutX;
|
||||||
|
/*
|
||||||
|
lpdcb16->XonChar =
|
||||||
|
lpdcb16->XoffChar =
|
||||||
|
*/
|
||||||
|
lpdcb16->XonLim = 10;
|
||||||
|
lpdcb16->XoffLim = 10;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* BuildCommDCB (USER.213)
|
* BuildCommDCB (USER.213)
|
||||||
*
|
*
|
||||||
* According to the ECMA-234 (368.3) the function will return FALSE on
|
* According to the ECMA-234 (368.3) the function will return FALSE on
|
||||||
* success, otherwise it will return -1.
|
* success, otherwise it will return -1.
|
||||||
* IF THIS IS NOT CORRECT THE RETURNVALUE CHECK IN BuildCommDCBAndTimeoutsA
|
|
||||||
* NEEDS TO BE FIXED
|
|
||||||
*/
|
*/
|
||||||
INT16 WINAPI BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb)
|
INT16 WINAPI BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb)
|
||||||
{
|
{
|
||||||
/* "COM1:96,n,8,1" */
|
/* "COM1:96,n,8,1" */
|
||||||
/* 012345 */
|
/* 012345 */
|
||||||
int port;
|
int port;
|
||||||
char *ptr, temp[256];
|
DCB dcb;
|
||||||
|
|
||||||
TRACE("(%s), ptr %p\n", device, lpdcb);
|
TRACE("(%s), ptr %p\n", device, lpdcb);
|
||||||
|
|
||||||
if (!strncasecmp(device,"COM",3)) {
|
if (strncasecmp(device,"COM",3))
|
||||||
|
return -1;
|
||||||
port = device[3] - '0';
|
port = device[3] - '0';
|
||||||
|
|
||||||
|
|
||||||
if (port-- == 0) {
|
if (port-- == 0) {
|
||||||
ERR("BUG ! COM0 can't exist!\n");
|
ERR("BUG ! COM0 can't exist!\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -445,102 +489,16 @@ INT16 WINAPI BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb)
|
||||||
memset(lpdcb, 0, sizeof(DCB16)); /* initialize */
|
memset(lpdcb, 0, sizeof(DCB16)); /* initialize */
|
||||||
|
|
||||||
lpdcb->Id = port;
|
lpdcb->Id = port;
|
||||||
|
dcb.DCBlength = sizeof(DCB);
|
||||||
if (!*(device+4))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (*(device+4) != ':')
|
if (strchr(device,'=')) /* block new style */
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
strcpy(temp,device+5);
|
|
||||||
ptr = strtok(temp, ", ");
|
|
||||||
|
|
||||||
if (COM[port].baudrate > 0)
|
if(!BuildCommDCBA(device,&dcb))
|
||||||
lpdcb->BaudRate = COM[port].baudrate;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int rate;
|
|
||||||
/* DOS/Windows only compares the first two numbers
|
|
||||||
* and assigns an appropriate baud rate.
|
|
||||||
* You can supply 961324245, it still returns 9600 ! */
|
|
||||||
if (strlen(ptr) < 2)
|
|
||||||
{
|
|
||||||
WARN("Unknown baudrate string '%s' !\n", ptr);
|
|
||||||
return -1; /* error: less than 2 chars */
|
|
||||||
}
|
|
||||||
ptr[2] = '\0';
|
|
||||||
rate = atoi(ptr);
|
|
||||||
|
|
||||||
switch (rate) {
|
|
||||||
case 11:
|
|
||||||
case 30:
|
|
||||||
case 60:
|
|
||||||
rate *= 10;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
case 24:
|
|
||||||
case 48:
|
|
||||||
case 96:
|
|
||||||
rate *= 100;
|
|
||||||
break;
|
|
||||||
case 19:
|
|
||||||
rate = 19200;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
WARN("Unknown baudrate indicator %d !\n", rate);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
lpdcb->BaudRate = rate;
|
return COMM16_DCBtoDCB16(&dcb, lpdcb);
|
||||||
}
|
}
|
||||||
TRACE("baudrate (%d)\n", lpdcb->BaudRate);
|
|
||||||
|
|
||||||
ptr = strtok(NULL, ", ");
|
|
||||||
if (islower(*ptr))
|
|
||||||
*ptr = toupper(*ptr);
|
|
||||||
|
|
||||||
TRACE("parity (%c)\n", *ptr);
|
|
||||||
lpdcb->fParity = TRUE;
|
|
||||||
switch (*ptr) {
|
|
||||||
case 'N':
|
|
||||||
lpdcb->Parity = NOPARITY;
|
|
||||||
lpdcb->fParity = FALSE;
|
|
||||||
break;
|
|
||||||
case 'E':
|
|
||||||
lpdcb->Parity = EVENPARITY;
|
|
||||||
break;
|
|
||||||
case 'M':
|
|
||||||
lpdcb->Parity = MARKPARITY;
|
|
||||||
break;
|
|
||||||
case 'O':
|
|
||||||
lpdcb->Parity = ODDPARITY;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
WARN("Unknown parity `%c'!\n", *ptr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = strtok(NULL, ", ");
|
|
||||||
TRACE("charsize (%c)\n", *ptr);
|
|
||||||
lpdcb->ByteSize = *ptr - '0';
|
|
||||||
|
|
||||||
ptr = strtok(NULL, ", ");
|
|
||||||
TRACE("stopbits (%c)\n", *ptr);
|
|
||||||
switch (*ptr) {
|
|
||||||
case '1':
|
|
||||||
lpdcb->StopBits = ONESTOPBIT;
|
|
||||||
break;
|
|
||||||
case '2':
|
|
||||||
lpdcb->StopBits = TWOSTOPBITS;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
WARN("Unknown # of stopbits `%c'!\n", *ptr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* OpenComm (USER.200)
|
* OpenComm (USER.200)
|
||||||
|
@ -993,42 +951,8 @@ INT16 WINAPI GetCommState16(INT16 cid, LPDCB16 lpdcb)
|
||||||
}
|
}
|
||||||
|
|
||||||
lpdcb->Id = cid;
|
lpdcb->Id = cid;
|
||||||
if(dcb.BaudRate<0x10000)
|
|
||||||
lpdcb->BaudRate = dcb.BaudRate;
|
|
||||||
else if(dcb.BaudRate==115200)
|
|
||||||
lpdcb->BaudRate = 57601;
|
|
||||||
else {
|
|
||||||
WARN("Baud rate can't be converted\n");
|
|
||||||
lpdcb->BaudRate = 57601;
|
|
||||||
}
|
|
||||||
lpdcb->ByteSize = dcb.ByteSize;
|
|
||||||
lpdcb->fParity = dcb.fParity;
|
|
||||||
lpdcb->Parity = dcb.Parity;
|
|
||||||
lpdcb->StopBits = dcb.StopBits;
|
|
||||||
|
|
||||||
lpdcb->RlsTimeout = 50;
|
COMM16_DCBtoDCB16(&dcb,lpdcb);
|
||||||
lpdcb->CtsTimeout = 50;
|
|
||||||
lpdcb->DsrTimeout = 50;
|
|
||||||
lpdcb->fNull = 0;
|
|
||||||
lpdcb->fChEvt = 0;
|
|
||||||
lpdcb->fBinary = 1;
|
|
||||||
lpdcb->fDtrDisable = 0;
|
|
||||||
|
|
||||||
lpdcb->fDtrflow = (dcb.fDtrControl==DTR_CONTROL_ENABLE);
|
|
||||||
lpdcb->fRtsflow = (dcb.fRtsControl==RTS_CONTROL_ENABLE);
|
|
||||||
lpdcb->fOutxCtsFlow = dcb.fOutxCtsFlow;
|
|
||||||
lpdcb->fOutxDsrFlow = dcb.fOutxDsrFlow;
|
|
||||||
lpdcb->fDtrDisable = (dcb.fDtrControl==DTR_CONTROL_DISABLE);
|
|
||||||
|
|
||||||
lpdcb->fInX = dcb.fInX;
|
|
||||||
|
|
||||||
lpdcb->fOutX = dcb.fOutX;
|
|
||||||
/*
|
|
||||||
lpdcb->XonChar =
|
|
||||||
lpdcb->XoffChar =
|
|
||||||
*/
|
|
||||||
lpdcb->XonLim = 10;
|
|
||||||
lpdcb->XoffLim = 10;
|
|
||||||
|
|
||||||
lpdcb->EvtChar = ptr->evtchar;
|
lpdcb->EvtChar = ptr->evtchar;
|
||||||
|
|
||||||
|
@ -1233,6 +1157,137 @@ BOOL16 WINAPI EnableCommNotification16( INT16 cid, HWND16 hwnd,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* COMM_BuildOldCommDCB (Internal)
|
||||||
|
*
|
||||||
|
* Build a DCB using the old style settings string eg: "COMx:96,n,8,1"
|
||||||
|
* We ignore the COM port index, since we can support more than 4 ports.
|
||||||
|
*/
|
||||||
|
BOOL WINAPI COMM_BuildOldCommDCB(LPCSTR device, LPDCB lpdcb)
|
||||||
|
{
|
||||||
|
/* "COM1:96,n,8,1" */
|
||||||
|
/* 012345 */
|
||||||
|
char *ptr, temp[256], last;
|
||||||
|
int rate;
|
||||||
|
|
||||||
|
TRACE("(%s), ptr %p\n", device, lpdcb);
|
||||||
|
|
||||||
|
if (strncasecmp(device,"COM",3))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!*(device+4))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (*(device+4) != ':')
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
strcpy(temp,device+5);
|
||||||
|
last=temp[strlen(temp)-1];
|
||||||
|
ptr = strtok(temp, ", ");
|
||||||
|
|
||||||
|
/* DOS/Windows only compares the first two numbers
|
||||||
|
* and assigns an appropriate baud rate.
|
||||||
|
* You can supply 961324245, it still returns 9600 ! */
|
||||||
|
if (strlen(ptr) < 2)
|
||||||
|
{
|
||||||
|
WARN("Unknown baudrate string '%s' !\n", ptr);
|
||||||
|
return FALSE; /* error: less than 2 chars */
|
||||||
|
}
|
||||||
|
ptr[2] = '\0';
|
||||||
|
rate = atoi(ptr);
|
||||||
|
|
||||||
|
switch (rate) {
|
||||||
|
case 11:
|
||||||
|
case 30:
|
||||||
|
case 60:
|
||||||
|
rate *= 10;
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
case 24:
|
||||||
|
case 48:
|
||||||
|
case 96:
|
||||||
|
rate *= 100;
|
||||||
|
break;
|
||||||
|
case 19:
|
||||||
|
rate = 19200;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WARN("Unknown baudrate indicator %d !\n", rate);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
lpdcb->BaudRate = rate;
|
||||||
|
TRACE("baudrate (%ld)\n", lpdcb->BaudRate);
|
||||||
|
|
||||||
|
ptr = strtok(NULL, ", ");
|
||||||
|
if (islower(*ptr))
|
||||||
|
*ptr = toupper(*ptr);
|
||||||
|
|
||||||
|
TRACE("parity (%c)\n", *ptr);
|
||||||
|
lpdcb->fParity = TRUE;
|
||||||
|
switch (*ptr) {
|
||||||
|
case 'N':
|
||||||
|
lpdcb->Parity = NOPARITY;
|
||||||
|
lpdcb->fParity = FALSE;
|
||||||
|
break;
|
||||||
|
case 'E':
|
||||||
|
lpdcb->Parity = EVENPARITY;
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
lpdcb->Parity = MARKPARITY;
|
||||||
|
break;
|
||||||
|
case 'O':
|
||||||
|
lpdcb->Parity = ODDPARITY;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WARN("Unknown parity `%c'!\n", *ptr);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = strtok(NULL, ", ");
|
||||||
|
TRACE("charsize (%c)\n", *ptr);
|
||||||
|
lpdcb->ByteSize = *ptr - '0';
|
||||||
|
|
||||||
|
ptr = strtok(NULL, ", ");
|
||||||
|
TRACE("stopbits (%c)\n", *ptr);
|
||||||
|
switch (*ptr) {
|
||||||
|
case '1':
|
||||||
|
lpdcb->StopBits = ONESTOPBIT;
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
lpdcb->StopBits = TWOSTOPBITS;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WARN("Unknown # of stopbits `%c'!\n", *ptr);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (last == 'x') {
|
||||||
|
lpdcb->fInX = TRUE;
|
||||||
|
lpdcb->fOutX = TRUE;
|
||||||
|
lpdcb->fOutxCtsFlow = FALSE;
|
||||||
|
lpdcb->fOutxDsrFlow = FALSE;
|
||||||
|
lpdcb->fDtrControl = DTR_CONTROL_ENABLE;
|
||||||
|
lpdcb->fRtsControl = RTS_CONTROL_ENABLE;
|
||||||
|
} else if (last=='p') {
|
||||||
|
lpdcb->fInX = FALSE;
|
||||||
|
lpdcb->fOutX = FALSE;
|
||||||
|
lpdcb->fOutxCtsFlow = TRUE;
|
||||||
|
lpdcb->fOutxDsrFlow = TRUE;
|
||||||
|
lpdcb->fDtrControl = DTR_CONTROL_HANDSHAKE;
|
||||||
|
lpdcb->fRtsControl = RTS_CONTROL_HANDSHAKE;
|
||||||
|
} else {
|
||||||
|
lpdcb->fInX = FALSE;
|
||||||
|
lpdcb->fOutX = FALSE;
|
||||||
|
lpdcb->fOutxCtsFlow = FALSE;
|
||||||
|
lpdcb->fOutxDsrFlow = FALSE;
|
||||||
|
lpdcb->fDtrControl = DTR_CONTROL_ENABLE;
|
||||||
|
lpdcb->fRtsControl = RTS_CONTROL_ENABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* BuildCommDCBA (KERNEL32.@)
|
* BuildCommDCBA (KERNEL32.@)
|
||||||
*
|
*
|
||||||
|
@ -1286,53 +1341,11 @@ BOOL WINAPI BuildCommDCBAndTimeoutsA(
|
||||||
} else
|
} else
|
||||||
temp=(LPSTR)device;
|
temp=(LPSTR)device;
|
||||||
|
|
||||||
|
memset(lpdcb,0,sizeof (DCB));
|
||||||
lpdcb->DCBlength = sizeof(DCB);
|
lpdcb->DCBlength = sizeof(DCB);
|
||||||
if (strchr(temp,',')) { /* old style */
|
if (strchr(temp,',')) { /* old style */
|
||||||
DCB16 dcb16;
|
|
||||||
BOOL16 ret;
|
|
||||||
char last=temp[strlen(temp)-1];
|
|
||||||
|
|
||||||
ret=BuildCommDCB16(device,&dcb16);
|
return COMM_BuildOldCommDCB(device,lpdcb);
|
||||||
if (ret)
|
|
||||||
return FALSE;
|
|
||||||
lpdcb->BaudRate = dcb16.BaudRate;
|
|
||||||
lpdcb->ByteSize = dcb16.ByteSize;
|
|
||||||
lpdcb->fBinary = dcb16.fBinary;
|
|
||||||
lpdcb->Parity = dcb16.Parity;
|
|
||||||
lpdcb->fParity = dcb16.fParity;
|
|
||||||
lpdcb->fNull = dcb16.fNull;
|
|
||||||
lpdcb->StopBits = dcb16.StopBits;
|
|
||||||
if (last == 'x') {
|
|
||||||
lpdcb->fInX = TRUE;
|
|
||||||
lpdcb->fOutX = TRUE;
|
|
||||||
lpdcb->fOutxCtsFlow = FALSE;
|
|
||||||
lpdcb->fOutxDsrFlow = FALSE;
|
|
||||||
lpdcb->fDtrControl = DTR_CONTROL_ENABLE;
|
|
||||||
lpdcb->fRtsControl = RTS_CONTROL_ENABLE;
|
|
||||||
} else if (last=='p') {
|
|
||||||
lpdcb->fInX = FALSE;
|
|
||||||
lpdcb->fOutX = FALSE;
|
|
||||||
lpdcb->fOutxCtsFlow = TRUE;
|
|
||||||
lpdcb->fOutxDsrFlow = TRUE;
|
|
||||||
lpdcb->fDtrControl = DTR_CONTROL_HANDSHAKE;
|
|
||||||
lpdcb->fRtsControl = RTS_CONTROL_HANDSHAKE;
|
|
||||||
} else {
|
|
||||||
lpdcb->fInX = FALSE;
|
|
||||||
lpdcb->fOutX = FALSE;
|
|
||||||
lpdcb->fOutxCtsFlow = FALSE;
|
|
||||||
lpdcb->fOutxDsrFlow = FALSE;
|
|
||||||
lpdcb->fDtrControl = DTR_CONTROL_ENABLE;
|
|
||||||
lpdcb->fRtsControl = RTS_CONTROL_ENABLE;
|
|
||||||
}
|
|
||||||
lpdcb->XonChar = dcb16.XonChar;
|
|
||||||
lpdcb->XoffChar = dcb16.XoffChar;
|
|
||||||
lpdcb->ErrorChar= dcb16.PeChar;
|
|
||||||
lpdcb->fErrorChar= dcb16.fPeChar;
|
|
||||||
lpdcb->EofChar = dcb16.EofChar;
|
|
||||||
lpdcb->EvtChar = dcb16.EvtChar;
|
|
||||||
lpdcb->XonLim = dcb16.XonLim;
|
|
||||||
lpdcb->XoffLim = dcb16.XoffLim;
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
ptr=strtok(temp," ");
|
ptr=strtok(temp," ");
|
||||||
while (ptr) {
|
while (ptr) {
|
||||||
|
|
Loading…
Reference in New Issue