#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 = "ìpÙˆ¬cê<"; 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; }