217 lines
4.1 KiB
C++
217 lines
4.1 KiB
C++
|
#include "StdAfx.h"
|
|||
|
|
|||
|
#include "hlapi_c.h"
|
|||
|
#define EYECAST (Word DATAFAR_ *)
|
|||
|
|
|||
|
#include "connect.h"
|
|||
|
#include "server.h"
|
|||
|
#include "tracing.h"
|
|||
|
|
|||
|
#ifdef _DEBUG
|
|||
|
#define new DEBUG_NEW
|
|||
|
#undef THIS_FILE
|
|||
|
static char THIS_FILE[] = __FILE__;
|
|||
|
#endif
|
|||
|
|
|||
|
// @doc INTERNAL
|
|||
|
|
|||
|
// @rdesc Ritorna il valore corrispondente alla chiave appartenente
|
|||
|
// ad una sezione del file di configurazione
|
|||
|
|
|||
|
static CString GetIniString(LPCSTR sec, // @parm Sezione
|
|||
|
LPCSTR key, // @parm Chiave
|
|||
|
LPCSTR def) // @parm Valore di default
|
|||
|
{
|
|||
|
// Nome del file .ini
|
|||
|
static CString m_strIniFile;
|
|||
|
|
|||
|
// Lunghezza massima di un nome di directory
|
|||
|
// o di un valore del file .ini
|
|||
|
const DWORD dwSize = _MAX_DIR + 1;
|
|||
|
|
|||
|
// Costruisce il nome del file .ini se necessario
|
|||
|
if (m_strIniFile.IsEmpty())
|
|||
|
{
|
|||
|
GetCurrentDirectory(dwSize, m_strIniFile.GetBuffer(dwSize));
|
|||
|
m_strIniFile.ReleaseBuffer();
|
|||
|
m_strIniFile += "\\prawin.ini";
|
|||
|
}
|
|||
|
|
|||
|
// Legge il valore della chiave nella sezione specificata
|
|||
|
CString tmp;
|
|||
|
char* buf = tmp.GetBuffer(dwSize);
|
|||
|
GetPrivateProfileString(sec, key, def, buf, dwSize, m_strIniFile);
|
|||
|
tmp.ReleaseBuffer();
|
|||
|
return tmp;
|
|||
|
}
|
|||
|
|
|||
|
#define HLBLOCK 1
|
|||
|
|
|||
|
unsigned short THardlockServer::GetSer()
|
|||
|
{
|
|||
|
_SerNo = 0xFFFF;
|
|||
|
|
|||
|
if (HL_AVAIL() == STATUS_OK)
|
|||
|
{
|
|||
|
Word Val[4] = { 0, 0, 0, 0 };
|
|||
|
HL_READ(0, EYECAST &Val[0]);
|
|||
|
HL_READ(1, EYECAST &Val[1]);
|
|||
|
HL_READ(2, EYECAST &Val[2]);
|
|||
|
HL_READ(3, EYECAST &Val[3]);
|
|||
|
HL_CODE(EYECAST Val, HLBLOCK);
|
|||
|
if (Val[0] == 0xFAE8)
|
|||
|
_SerNo = Val[1];
|
|||
|
else
|
|||
|
_SerNo = 0;
|
|||
|
}
|
|||
|
|
|||
|
Trace(0, "Hardlock serial number is %s: %d",
|
|||
|
(_SerNo == 0xFFFF) ? "Bad" : "OK", (int)_SerNo);
|
|||
|
|
|||
|
return _SerNo;
|
|||
|
}
|
|||
|
|
|||
|
unsigned short THardlockServer::GetUsers()
|
|||
|
{
|
|||
|
_Users = 0;
|
|||
|
if (_SerNo == 0)
|
|||
|
_Users = 1;
|
|||
|
else
|
|||
|
{
|
|||
|
if (_SerNo != 0xFFFF)
|
|||
|
{
|
|||
|
Word Val[4] = { 0, 0, 0, 0 };
|
|||
|
HL_READ(60, EYECAST &Val[0]);
|
|||
|
HL_READ(61, EYECAST &Val[1]);
|
|||
|
HL_READ(62, EYECAST &Val[2]);
|
|||
|
HL_READ(63, EYECAST &Val[3]);
|
|||
|
HL_CODE(Val, HLBLOCK);
|
|||
|
_Users = Val[1];
|
|||
|
}
|
|||
|
}
|
|||
|
Trace(0, "Maximum number of users is %d", (int)_Users);
|
|||
|
return _Users;
|
|||
|
}
|
|||
|
|
|||
|
BOOL THardlockServer::GetAut()
|
|||
|
{
|
|||
|
if (_SerNo == 0xFFFF)
|
|||
|
return FALSE;
|
|||
|
|
|||
|
if (_SerNo == 0)
|
|||
|
return TRUE;
|
|||
|
|
|||
|
HL_READ(48, EYECAST &_int_tab[0]);
|
|||
|
HL_READ(49, EYECAST &_int_tab[1]);
|
|||
|
HL_READ(50, EYECAST &_int_tab[2]);
|
|||
|
HL_READ(51, EYECAST &_int_tab[3]);
|
|||
|
HL_CODE(_int_tab, HLBLOCK);
|
|||
|
|
|||
|
for (int i = 0; i < 4; i++)
|
|||
|
_int_tab[i] ^= _SerNo;
|
|||
|
if (_int_tab[3])
|
|||
|
return(FALSE);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL THardlockServer::Login() const
|
|||
|
{
|
|||
|
const char* const REFKEY = "CAMPOKEY";
|
|||
|
const char* const VERKEY = "<EFBFBD>pو<EFBFBD>c<EFBFBD><";
|
|||
|
|
|||
|
unsigned char ref[9]; strcpy((char*)ref, REFKEY);
|
|||
|
unsigned char ver[9]; strcpy((char*)ver, VERKEY);
|
|||
|
|
|||
|
const int status = HL_LOGIN(26952, LOCAL_DEVICE, ref, ver);
|
|||
|
|
|||
|
Trace(0, "Hardlock login %s: %d",
|
|||
|
status == STATUS_OK ? "OK" : "Failed", status);
|
|||
|
|
|||
|
return status == STATUS_OK;
|
|||
|
}
|
|||
|
|
|||
|
void THardlockServer::Logout() const
|
|||
|
{
|
|||
|
HL_LOGOUT();
|
|||
|
}
|
|||
|
|
|||
|
BOOL THardlockServer::OnConnect(const CString& topic)
|
|||
|
{
|
|||
|
BOOL ok = Connections() <= MaxUsers();
|
|||
|
if (!ok)
|
|||
|
Trace(0, "Refusing Topic %s", (const char*)topic);
|
|||
|
return ok;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
TConnection* THardlockServer::OnCreateConnection(DWORD id)
|
|||
|
{
|
|||
|
TConnection* c = NULL;
|
|||
|
if (Connections() <= MaxUsers())
|
|||
|
{
|
|||
|
Trace(0, "Connecting %lu", id);
|
|||
|
c = new TPrassiConnection(this, id);
|
|||
|
}
|
|||
|
else
|
|||
|
Trace(0, "Refusing Connection %lu", id);
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
BOOL THardlockServer::OnRemoveConnection(DWORD id)
|
|||
|
{
|
|||
|
Trace(0, "Disconnecting %lu", id);
|
|||
|
return BASE_SERVER::OnRemoveConnection(id);
|
|||
|
}
|
|||
|
|
|||
|
THardlockServer::THardlockServer()
|
|||
|
: BASE_SERVER("HARDLOCK")
|
|||
|
{
|
|||
|
_SerNo = 0xFFFF;
|
|||
|
_int_tab[0] = 0xFFFF;
|
|||
|
_int_tab[1] = 0xFFFF;
|
|||
|
_int_tab[2] = 0xFFFF;
|
|||
|
_int_tab[3] = 0x0000;
|
|||
|
|
|||
|
Login();
|
|||
|
GetSer();
|
|||
|
GetUsers();
|
|||
|
}
|
|||
|
|
|||
|
THardlockServer::~THardlockServer()
|
|||
|
{
|
|||
|
Logout();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////
|
|||
|
// Start/Stop server
|
|||
|
|
|||
|
static THardlockServer* pDDE = NULL;
|
|||
|
|
|||
|
BOOL StopServer()
|
|||
|
{
|
|||
|
BOOL ok = pDDE != NULL;
|
|||
|
if (ok)
|
|||
|
{
|
|||
|
delete pDDE;
|
|||
|
pDDE = NULL;
|
|||
|
}
|
|||
|
return ok;
|
|||
|
}
|
|||
|
|
|||
|
THardlockServer& GetServer()
|
|||
|
{
|
|||
|
ASSERT(pDDE);
|
|||
|
return *pDDE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL StartServer()
|
|||
|
{
|
|||
|
BOOL ok = pDDE == NULL;
|
|||
|
if (ok)
|
|||
|
pDDE = new THardlockServer;
|
|||
|
return ok;
|
|||
|
}
|
|||
|
|