eDosStation/OkReadBadge/OkReadBadge.h
Luc Vandenbroucke e29970b7a9 test persons
2020-02-11 16:33:49 +01:00

163 lines
4.3 KiB
C++

#pragma once
#include <windows.h>
#include <devguid.h> // for GUID_DEVCLASS_CDROM etc
#include <setupapi.h>
#include <cfgmgr32.h> // for MAX_DEVICE_ID_LEN, CM_Get_Parent and CM_Get_Device_ID
#include <hidsdi.h>
#include <Hidclass.h>
#include <string>
#include "okClr.h"
#include <msclr\auto_gcroot.h>
namespace OkReadBadge
{
public class BadgeUnmanaged
{
private:
LPOVERLAPPED Overlapped;
msclr::auto_gcroot<BadgeMessageHandler^> m_clr;
public:
// TODO: Add your methods for this class here.
wchar_t * DevicePath;
int DeviceType;
BYTE buffer[100];
DWORD bread;
bool nextCSN = false;
bool nextSite = false;
bool nextCode = false;
bool nextFinish = false;
bool completed = false;
char Res [100];
char CSN[50];
char Site[20];
char Badge[20];
int parse(char *rall)
{
int items;
char *source;
int sourcelen;
char *dest;
int destlen;
char *r = rall;
char *mx = r + strlen(rall);
items = 0;
Res[0] = 0;
while (r < mx && items<3) {
if (!strncmp("csn:", r, 4)) {
items++;
dest = CSN; destlen = sizeof(CSN);
source = r + 4; //na csn:
}
else if (!strncmp("site:", r, 4)) {
items++;
dest = Site; destlen = sizeof(Site);
source = r + 5; //na site:
}
else if (!strncmp("code:", r, 4)) {
items++;
dest = Badge; destlen = sizeof(Badge);
source = r + 5; //na code:
}
else {
dest = NULL; destlen = 0;
}
char *x = strchr(source, ';');
*x = 0; sourcelen = strlen(source);
if (dest != NULL) {
memcpy_s(dest, destlen, source, sourcelen + 1);
}
r = x + 1;
}
return items;
}
static bool CALLBACK Message(int err, LPARAM param)
{
//m_clr.Result = gcnew buffer
BadgeUnmanaged *bu = static_cast<BadgeUnmanaged *>((void *)param);
if (err == 0) {
byte l = bu->buffer[2];
char *r = (char *)&bu->buffer[4];
r[l] = 0;
if (bu->nextCSN) {
memcpy_s(bu->CSN, sizeof(bu->CSN), r, l + 1);
memcpy_s(bu->Res, sizeof(bu->Res), r, l + 1);
bu->nextCSN = false;
}
else if (bu->nextSite) {
memcpy_s(bu->Site, 20, r, l + 1);
strncat_s(bu->Res, (const char *)r, l); bu->nextSite = false; }
else if (bu->nextCode) {
memcpy_s(bu->Badge, sizeof(bu->Badge), r, l + 1);
strncat_s(bu->Res, (const char *)r, l); bu->nextCode = false; bu->nextFinish = true;
}
else if (!strncmp("csn:", r, 4)) {
bu->nextCSN = true; bu->nextFinish = bu->nextCode = bu->nextSite = bu->completed = false;
if (strstr(r, "code:") != NULL) {
int it = bu->parse(r);
//char *s = r + 4; //na csn:
//char *x = strchr(r, ';');
//*x = 0; l = strlen(s);
//memcpy_s(bu->CSN, sizeof(bu->CSN), s, l + 1);
////x+1 should be "site:"
//s = x + 6; // n a site:v
//x = strchr(s, ';'); *x = 0; l = strlen(s);
////x+1 should be "code:"
//memcpy_s(bu->Site, sizeof(bu->Site), s, l + 1);
//s = x + 6; // no code:
//x = strchr(s, ';'); *x = 0; l = strlen(s);
//memcpy_s(bu->Badge, sizeof(bu->Badge), s, l + 1);
bu->completed = true;
}
else {
memset(bu->Res, 0, sizeof(bu->Res));
memset(bu->CSN, 0, sizeof(bu->CSN));
memset(bu->Site, 0, sizeof(bu->Site));
memset(bu->Badge, 0, sizeof(bu->Badge));
bu->completed = false;
bu->m_clr->Final = false;
}
}
else if (!strncmp("site:", r, 5)) { bu->nextSite = true; }
else if (!strncmp("code:", r, 5)) { bu->nextCode = true; }
else if (!strncmp(";", r, 1)) {
strncat_s(bu->Res, r, 1);
bu->nextCode = bu->nextSite = bu->nextCSN = false;
if (bu->nextFinish) {
bu->nextFinish = false;
bu->completed = true;
}
}
if (bu->completed)
{
bu->m_clr->Final = true;
bu->m_clr->CSN= gcnew String(bu->CSN);
bu->m_clr->Site = gcnew String(bu->Site);
bu->m_clr->Badge= gcnew String(bu->Badge);
}
else
bu->m_clr->Result = gcnew String(r);
}
else {
if (bu->nextCSN | bu->nextFinish | bu->nextCode | bu->nextSite | bu->nextCSN )
bu->m_clr->Result = gcnew String(bu->Res);
else {
bu->m_clr->Result = String::Empty;
bu->m_clr->Final = false;
}
}
return bu->m_clr->OnMessage((int)err);
}
BadgeUnmanaged(BadgeMessageHandler^ clr);
void GetDeviceUSB(std::wstring vid, std::wstring pid, std::wstring pid2);
int read();
};
}