Blob Blame Raw


#include "TUSBScannerIO.h"
#include "tsystem.h"

#include <windows.h>

class TUSBScannerIOPD
{
public:
	TUSBScannerIOPD()
		: m_handle(INVALID_HANDLE_VALUE), m_trace(false)
	{
	}
	HANDLE m_handle;
	bool m_trace;
};

//-----------------------------------------------------------------------------
namespace
{
void buf2printable(const unsigned char *buffer, const int size, ostrstream &os)
{
	int i = 0;
	if ((size == 2) && (buffer[0] == 0x1b)) {
		os << "ESC ";
		char c = buffer[1];
		if (isprint(c))
			os << c << " ";
		return;
	}
	os << std::hex;
	for (; i < tmin(size, 0x40); ++i) {
		char c = buffer[i];
		os << "0x" << (unsigned int)c << " ";
	}
	if (i < size)
		os << "...";
}
}

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

TUSBScannerIO::TUSBScannerIO()
	: m_data(new TUSBScannerIOPD())
{
}

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

bool TUSBScannerIO::open()
{
	m_data->m_handle = CreateFile("\\\\.\\usbscan0", GENERIC_WRITE | GENERIC_READ,
								  FILE_SHARE_WRITE | FILE_SHARE_READ,
								  NULL,
								  OPEN_EXISTING,
								  0,
								  NULL);
	if (m_data->m_handle == INVALID_HANDLE_VALUE)
		return false;
	return true;
}

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

void TUSBScannerIO::close()
{
	if (m_data->m_handle && (m_data->m_handle != INVALID_HANDLE_VALUE))
		CloseHandle(m_data->m_handle);
}

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

int TUSBScannerIO::receive(unsigned char *buffer, int size)
{
	int bytesLeft = size;
	unsigned char *ptr = buffer;
	DWORD count;

	static int m_maxReadSize = 0x10000;

	do {
		int bytesToRead = bytesLeft;
		notMoreThan<int>(m_maxReadSize, bytesToRead);

		OVERLAPPED overlapped;
		memset(&overlapped, 0, sizeof(OVERLAPPED));
		overlapped.hEvent = CreateEvent(
			NULL, //pointertosecurityattributes,
			//WIN95ignoresthisparameter
			FALSE, //automaticreset
			FALSE, //initializetonotsignaled
			NULL); //pointertotheevent-objectname

		ReadFile(m_data->m_handle, ptr, bytesToRead, &count, &overlapped);
		DWORD waitRC = WaitForSingleObject(overlapped.hEvent, INFINITE);
		if (m_data->m_trace) {
			ostrstream os;
			os.freeze(false);
			os << "receive: size=" << size << " got = " << count << " buf=";
			buf2printable(ptr, count, os);
			os << '\n' << '\0';
			TSystem::outputDebug(os.str());
		}

		if (count != bytesToRead)
			return 0;

		ptr += count;
		bytesLeft = bytesLeft - count;
	} while (bytesLeft);

	return size;
}

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

int TUSBScannerIO::send(unsigned char *buffer, int size)
{
	int bytesLeft = size;
	DWORD count;
	static int m_maxWriteSize = 64;
	//bytesLeft = 64;
	do {
		int bytesToWrite = bytesLeft;
		notMoreThan<int>(m_maxWriteSize, bytesToWrite);
		WriteFile(m_data->m_handle, buffer, bytesToWrite, &count, 0);

		if (m_data->m_trace) {
			ostrstream os;
			os.freeze(false);
			os << "send: size=" << size << " wrote = " << count << " buf=";
			buf2printable(buffer, size, os);
			os << '\n' << '\0';
			TSystem::outputDebug(os.str());
		}

		if (count != bytesToWrite)
			return 0;

		// ptr += count;
		bytesLeft = bytesLeft - count;
	} while (bytesLeft);

	return size;
}

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

void TUSBScannerIO::trace(bool on)
{
	m_data->m_trace = on;
}

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

TUSBScannerIO::~TUSBScannerIO()
{
}