223 lines
4.2 KiB
C++
Executable File
223 lines
4.2 KiB
C++
Executable File
#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(-1, "Hardlock serial number is %s: %d",
|
||
(_SerNo == 0xFFFF) ? "Bad" : "OK", (int)_SerNo);
|
||
|
||
return _SerNo;
|
||
}
|
||
|
||
unsigned short THardlockServer::GetUsers()
|
||
{
|
||
_Users = 0;
|
||
_AssistanceYear = 0;
|
||
if (_SerNo == 0)
|
||
{
|
||
_Users = 4;
|
||
_AssistanceYear = 1998;
|
||
}
|
||
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);
|
||
_AssistanceYear = Val[0];
|
||
_Users = Val[1];
|
||
}
|
||
}
|
||
Trace(-1, "Assistance Year is %d", (int)_AssistanceYear);
|
||
Trace(-1, "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(-1, "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;
|
||
}
|
||
|