guy 2594a69bab Aggiunto supporto per l'anno d'assistenza
git-svn-id: svn://10.65.10.50/trunk@6037 c028cbd2-c16b-5b4b-a496-9718f37d4682
1998-01-27 10:53:26 +00:00

223 lines
4.2 KiB
C++
Executable File
Raw Blame History

#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><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;
}