/** * ERRORS: * ERROR_INVALID_HANDLE */ BOOL SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; DWORD bytesReturned; if (!CommInitialized()) return FALSE; if (!pComm || pComm->Type != HANDLE_TYPE_COMM || !pComm->fd) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } /* as of today, SERIAL_TIMEOUTS and COMMTIMEOUTS structures are identical */ if (!CommDeviceIoControl(pComm, IOCTL_SERIAL_SET_TIMEOUTS, lpCommTimeouts, sizeof(COMMTIMEOUTS), NULL, 0, &bytesReturned, NULL)) { CommLog_Print(WLOG_WARN, "SetCommTimeouts failure."); return FALSE; } return TRUE; }
BOOL SetupComm(HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; SERIAL_QUEUE_SIZE queueSize; DWORD bytesReturned = 0; if (!CommInitialized()) return FALSE; if (!pComm || pComm->Type != HANDLE_TYPE_COMM || !pComm->fd ) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } queueSize.InSize = dwInQueue; queueSize.OutSize = dwOutQueue; if (!CommDeviceIoControl(pComm, IOCTL_SERIAL_SET_QUEUE_SIZE, &queueSize, sizeof(SERIAL_QUEUE_SIZE), NULL, 0, &bytesReturned, NULL)) { CommLog_Print(WLOG_WARN, "SetCommTimeouts failure."); return FALSE; } return TRUE; }
/** * Returns the number of target paths in the buffer pointed to by * lpTargetPath. * * The current implementation returns in any case 0 and 1 target * path. A NULL lpDeviceName is not supported yet to get all the * paths. * * ERRORS: * ERROR_SUCCESS * ERROR_DLL_INIT_FAILED * ERROR_OUTOFMEMORY was not possible to get mappings. * ERROR_NOT_SUPPORTED equivalent QueryDosDevice feature not supported. * ERROR_INVALID_DATA was not possible to retrieve any device information. * ERROR_INSUFFICIENT_BUFFER too small lpTargetPath */ DWORD QueryCommDevice(LPCTSTR lpDeviceName, LPTSTR lpTargetPath, DWORD ucchMax) { int i; LPTSTR storedTargetPath; SetLastError(ERROR_SUCCESS); if (!CommInitialized()) return 0; if (_CommDevices == NULL) { SetLastError(ERROR_DLL_INIT_FAILED); return 0; } if (lpDeviceName == NULL || lpTargetPath == NULL) { SetLastError(ERROR_NOT_SUPPORTED); return 0; } EnterCriticalSection(&_CommDevicesLock); storedTargetPath = NULL; for (i=0; i<COMM_DEVICE_MAX; i++) { if (_CommDevices[i] != NULL) { if (_tcscmp(_CommDevices[i]->name, lpDeviceName) == 0) { storedTargetPath = _CommDevices[i]->path; break; } continue; } break; } LeaveCriticalSection(&_CommDevicesLock); if (storedTargetPath == NULL) { SetLastError(ERROR_INVALID_DATA); return 0; } if (_tcslen(storedTargetPath) + 2 > ucchMax) { SetLastError(ERROR_INSUFFICIENT_BUFFER); return 0; } _tcscpy(lpTargetPath, storedTargetPath); lpTargetPath[_tcslen(storedTargetPath) + 1] = '\0'; /* 2nd final '\0' */ return _tcslen(lpTargetPath) + 2; }
BOOL BuildCommDCBW(LPCWSTR lpDef, LPDCB lpDCB) { if (!CommInitialized()) return FALSE; /* TODO: not implemented */ return TRUE; }
BOOL BuildCommDCBAndTimeoutsW(LPCWSTR lpDef, LPDCB lpDCB, LPCOMMTIMEOUTS lpCommTimeouts) { if (!CommInitialized()) return FALSE; /* TODO: not implemented */ return TRUE; }
BOOL CommConfigDialogW(LPCWSTR lpszName, HWND hWnd, LPCOMMCONFIG lpCC) { if (!CommInitialized()) return FALSE; /* TODO: not implemented */ return TRUE; }
BOOL SetDefaultCommConfigW(LPCWSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize) { if (!CommInitialized()) return FALSE; /* TODO: not implemented */ return TRUE; }
BOOL SetDefaultCommConfigW(LPCWSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize) { if (!CommInitialized()) return FALSE; /* TODO: not implemented */ CommLog_Print(WLOG_ERROR, "%s: Not implemented", __FUNCTION__); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }
BOOL CommConfigDialogW(LPCWSTR lpszName, HWND hWnd, LPCOMMCONFIG lpCC) { if (!CommInitialized()) return FALSE; /* TODO: not implemented */ CommLog_Print(WLOG_ERROR, "%s: Not implemented", __FUNCTION__); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }
void CommLog_Print(int level, char *fmt, ...) { if (!CommInitialized()) return; va_list ap; va_start(ap, fmt); WLog_PrintVA(_Log, level, fmt, ap); va_end(ap); }
BOOL BuildCommDCBW(LPCWSTR lpDef, LPDCB lpDCB) { if (!CommInitialized()) return FALSE; /* TODO: not implemented */ CommLog_Print(WLOG_ERROR, "%s: Not implemented", __FUNCTION__); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }
BOOL BuildCommDCBAndTimeoutsA(LPCSTR lpDef, LPDCB lpDCB, LPCOMMTIMEOUTS lpCommTimeouts) { if (!CommInitialized()) return FALSE; /* TODO: not implemented */ CommLog_Print(WLOG_ERROR, "%s: Not implemented", __FUNCTION__); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }
BOOL CommCloseHandle(HANDLE handle) { WINPR_COMM *pComm; if (!CommInitialized()) return FALSE; pComm = (WINPR_COMM*)handle; if (!pComm || pComm->Type != HANDLE_TYPE_COMM) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (pComm->PendingEvents & SERIAL_EV_FREERDP_WAITING) { ULONG WaitMask = 0; DWORD BytesReturned = 0; /* ensures to gracefully stop the WAIT_ON_MASK's loop */ if (!CommDeviceIoControl(handle, IOCTL_SERIAL_SET_WAIT_MASK, &WaitMask, sizeof(ULONG), NULL, 0, &BytesReturned, NULL)) { CommLog_Print(WLOG_WARN, "failure to WAIT_ON_MASK's loop!"); } } DeleteCriticalSection(&pComm->ReadLock); DeleteCriticalSection(&pComm->WriteLock); DeleteCriticalSection(&pComm->EventsLock); if (pComm->fd > 0) close(pComm->fd); if (pComm->fd_write > 0) close(pComm->fd_write); if (pComm->fd_write_event > 0) close(pComm->fd_write_event); if (pComm->fd_read > 0) close(pComm->fd_read); if (pComm->fd_read_event > 0) close(pComm->fd_read_event); free(pComm); return TRUE; }
BOOL SetCommMask(HANDLE hFile, DWORD dwEvtMask) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; return TRUE; }
BOOL WaitCommEvent(HANDLE hFile, PDWORD lpEvtMask, LPOVERLAPPED lpOverlapped) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; return TRUE; }
BOOL TransmitCommChar(HANDLE hFile, char cChar) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; return TRUE; }
/** * Checks whether lpDeviceName is a valid and registered Communication device. */ BOOL IsCommDevice(LPCTSTR lpDeviceName) { TCHAR lpTargetPath[MAX_PATH]; if (!CommInitialized()) return FALSE; if (QueryCommDevice(lpDeviceName, lpTargetPath, MAX_PATH) > 0) { return TRUE; } return FALSE; }
BOOL ClearCommError(HANDLE hFile, PDWORD lpErrors, LPCOMSTAT lpStat) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; return TRUE; }
BOOL EscapeCommFunction(HANDLE hFile, DWORD dwFunc) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; return TRUE; }
BOOL SetCommConfig(HANDLE hCommDev, LPCOMMCONFIG lpCC, DWORD dwSize) { WINPR_COMM* pComm = (WINPR_COMM*) hCommDev; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; return TRUE; }
BOOL ClearCommBreak(HANDLE hFile) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; return TRUE; }
BOOL GetCommModemStatus(HANDLE hFile, PDWORD lpModemStat) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; return TRUE; }
BOOL SetCommConfig(HANDLE hCommDev, LPCOMMCONFIG lpCC, DWORD dwSize) { WINPR_COMM* pComm = (WINPR_COMM*) hCommDev; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; CommLog_Print(WLOG_ERROR, "%s: Not implemented", __FUNCTION__); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }
BOOL ClearCommError(HANDLE hFile, PDWORD lpErrors, LPCOMSTAT lpStat) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; CommLog_Print(WLOG_ERROR, "%s: Not implemented", __FUNCTION__); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }
BOOL EscapeCommFunction(HANDLE hFile, DWORD dwFunc) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; CommLog_Print(WLOG_ERROR, "%s: Not implemented", __FUNCTION__); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }
BOOL TransmitCommChar(HANDLE hFile, char cChar) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; CommLog_Print(WLOG_ERROR, "%s: Not implemented", __FUNCTION__); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }
BOOL WaitCommEvent(HANDLE hFile, PDWORD lpEvtMask, LPOVERLAPPED lpOverlapped) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; if (!CommInitialized()) return FALSE; /* TODO: not implemented */ if (!pComm) return FALSE; CommLog_Print(WLOG_ERROR, "%s: Not implemented", __FUNCTION__); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }
BOOL CommIsHandled(HANDLE handle) { WINPR_COMM *pComm; if (!CommInitialized()) return FALSE; pComm = (WINPR_COMM*)handle; if (!pComm || (pComm->Type != HANDLE_TYPE_COMM) || (pComm == INVALID_HANDLE_VALUE)) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } return TRUE; }
/** * Sets */ void _comm_setServerSerialDriver(HANDLE hComm, SERIAL_DRIVER_ID driverId) { ULONG Type; PVOID Object; WINPR_COMM* pComm; if (!CommInitialized()) return; if (!winpr_Handle_GetInfo(hComm, &Type, &Object)) { CommLog_Print(WLOG_WARN, "_comm_setServerSerialDriver failure"); return; } pComm = (WINPR_COMM*)Object; pComm->serverSerialDriverId = driverId; }
BOOL PurgeComm(HANDLE hFile, DWORD dwFlags) { WINPR_COMM* pComm = (WINPR_COMM*) hFile; DWORD bytesReturned = 0; if (!CommInitialized()) return FALSE; if (!pComm || pComm->Type != HANDLE_TYPE_COMM || !pComm->fd ) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (!CommDeviceIoControl(pComm, IOCTL_SERIAL_PURGE, &dwFlags, sizeof(DWORD), NULL, 0, &bytesReturned, NULL)) { CommLog_Print(WLOG_WARN, "PurgeComm failure."); return FALSE; } return TRUE; }