Files
Sun1602/Server/KiSS/KISSApiWrapper.cpp
2022-10-26 12:25:11 +08:00

262 lines
5.5 KiB
C++

#include "stdafx.h"
#include "KISSApiWrapper.h"
#include <tchar.h>
#include <stdlib.h>
#include <strsafe.h>
#ifndef _M_X64
#ifdef _DEBUG
#define KISS_API_MODULE_NAME _T("KISSApi_x86d.dll")
#else
#define KISS_API_MODULE_NAME _T("KISSApi_x86.dll")
#endif // #ifdef _DEBUG
#else
#ifdef _DEBUG
#define KISS_API_MODULE_NAME _T("KISSApi_x64d.dll")
#else
#define KISS_API_MODULE_NAME _T("KISSApi_x64.dll")
#endif // #ifdef _DEBUG
#endif // #ifndef _M_X64
CKISSApiWrapper::CKISSApiWrapper()
: m_hLib(NULL)
, m_pMainHandle(NULL)
, m_fpGetHandle(NULL)
{
}
CKISSApiWrapper::~CKISSApiWrapper()
{
Close();
}
DWORD CKISSApiWrapper::LoadModule(LPCTSTR _lpszPath/* = NULL*/)
{
if(NULL != m_hLib)
return ERROR_SUCCESS;
TCHAR szLibPath[MAX_PATH * 2] = {0,};
if(NULL != _lpszPath)
StringCchPrintf(szLibPath, MAX_PATH * 2, _T("%s\\%s"), _lpszPath, KISS_API_MODULE_NAME);
else
StringCchPrintf(szLibPath, MAX_PATH * 2, _T("%s"), KISS_API_MODULE_NAME);
m_hLib = ::LoadLibrary(szLibPath);
if(NULL == m_hLib)
return ::GetLastError();
m_fpGetHandle = (LPFN_GET_HANDLE)::GetProcAddress(m_hLib, "GetHandle");
if(NULL == m_fpGetHandle)
{
DWORD dwErr = ::GetLastError();
UnloadModule();
return dwErr;
}
m_pMainHandle = m_fpGetHandle();
return ERROR_SUCCESS;
}
void CKISSApiWrapper::UnloadModule()
{
if(NULL != m_hLib)
{
::FreeLibrary(m_hLib);
m_hLib = NULL;
m_pMainHandle = NULL;
m_fpGetHandle = NULL;
}
}
UINT CKISSApiWrapper::Open(LPCTSTR _lpszPath/* = NULL*/)
{
DWORD dwRet = LoadModule(_lpszPath);
if(ERROR_SUCCESS != dwRet)
return dwRet;
if( NULL == m_pMainHandle ||
NULL == m_pMainHandle->lpfnOpen )
{
return ERROR_INVALID_HANDLE;
}
return m_pMainHandle->lpfnOpen();
}
void CKISSApiWrapper::Close()
{
if(NULL != m_pMainHandle)
{
if(NULL != m_pMainHandle->lpfnClose )
m_pMainHandle->lpfnClose();
}
UnloadModule();
}
bool CKISSApiWrapper::IsOpened() const
{
if( NULL == m_pMainHandle ||
NULL == m_pMainHandle->lpfnIsOpened )
{
return false;
}
return m_pMainHandle->lpfnIsOpened();
}
DWORD CKISSApiWrapper::NotifyNumber(const LPNOTIFY_INFO_NUM _lpInfo)
{
if( NULL == m_pMainHandle ||
NULL == m_pMainHandle->lpfnNotifyNumber )
{
return ERROR_INVALID_HANDLE;
}
return m_pMainHandle->lpfnNotifyNumber(_lpInfo);
}
DWORD CKISSApiWrapper::NotifyStringA(const LPNOTIFY_INFO_STRA _lpInfo)
{
if( NULL == m_pMainHandle ||
NULL == m_pMainHandle->lpfnNotifyStringW )
{
return ERROR_INVALID_HANDLE;
}
NOTIFY_INFO_STRW info;
ConvertNotifyInfoStringAtoW(_lpInfo, &info);
return m_pMainHandle->lpfnNotifyStringW(&info);
}
DWORD CKISSApiWrapper::NotifyStringW(const LPNOTIFY_INFO_STRW _lpInfo)
{
if( NULL == m_pMainHandle ||
NULL == m_pMainHandle->lpfnNotifyStringW )
{
return ERROR_INVALID_HANDLE;
}
return m_pMainHandle->lpfnNotifyStringW(_lpInfo);
}
DWORD CKISSApiWrapper::NotifyHeartbeat()
{
if( NULL == m_pMainHandle ||
NULL == m_pMainHandle->lpfnNotifyNumber )
{
return ERROR_INVALID_HANDLE;
}
NOTIFY_INFO_NUM info;
InitNotifyInfoNumber(&info, KAC_HEART_BEAT, 0);
return m_pMainHandle->lpfnNotifyNumber(&info);
}
DWORD CKISSApiWrapper::NotifyConcurrentUserCount(const DWORD _dwPortNo, const float _fVal)
{
if( NULL == m_pMainHandle ||
NULL == m_pMainHandle->lpfnNotifyNumber )
{
return ERROR_INVALID_HANDLE;
}
NOTIFY_INFO_NUM info;
InitNotifyInfoNumber(&info, KAC_CONC_USER_COUNT, _fVal,MEANINGLESS_VALUE,MEANINGLESS_VALUE,_dwPortNo);
return m_pMainHandle->lpfnNotifyNumber(&info);
}
DWORD CKISSApiWrapper::GetNumber(LPNOTIFY_INFO_NUM _lpInfo)
{
if( NULL == m_pMainHandle ||
NULL == m_pMainHandle->lpfnGetNumber )
{
return ERROR_INVALID_HANDLE;
}
return m_pMainHandle->lpfnGetNumber(_lpInfo);
}
DWORD CKISSApiWrapper::GetStringW(LPNOTIFY_INFO_STRW _lpInfo)
{
if( NULL == m_pMainHandle ||
NULL == m_pMainHandle->lpfnGetStringW )
{
return ERROR_INVALID_HANDLE;
}
return m_pMainHandle->lpfnGetStringW(_lpInfo);
}
void InitNotifyInfoNumber(LPNOTIFY_INFO_NUM _lpInfo, const int _nActivityId/* = 0*/,
const float _fValue/* = MEANINGLESS_VALUE*/, const float _fMin/* = MEANINGLESS_VALUE*/, const float _fMax/* = MEANINGLESS_VALUE*/ ,
const DWORD _dwPortNo /*= 0*/ )
{
if(NULL == _lpInfo)
return;
::GetLocalTime(&_lpInfo->registered_time);
_lpInfo->activity_id = _nActivityId;
_lpInfo->max_val = _fMax;
_lpInfo->min_val = _fMin;
_lpInfo->val = _fValue;
_lpInfo->port_no = _dwPortNo;
}
void InitNotifyInfoStringA(LPNOTIFY_INFO_STRA _lpInfo, const int _nActivityId/* = 0*/, LPCSTR _lpszString/* = ""*/)
{
if(NULL == _lpInfo)
return;
::GetLocalTime(&_lpInfo->registered_time);
_lpInfo->activity_id = _nActivityId;
StringCchCopyA(_lpInfo->content, sizeof(_lpInfo->content), _lpszString);
}
void InitNotifyInfoStringW(LPNOTIFY_INFO_STRW _lpInfo, const int _nActivityId/* = 0*/, LPCWSTR _lpszString/* = L""*/)
{
if(NULL == _lpInfo)
return;
::GetLocalTime(&_lpInfo->registered_time);
_lpInfo->activity_id = _nActivityId;
StringCchCopyW(_lpInfo->content, sizeof(_lpInfo->content), _lpszString);
}
void ConvertNotifyInfoStringAtoW(const LPNOTIFY_INFO_STRA _src, LPNOTIFY_INFO_STRW _dst)
{
if(NULL == _src || NULL == _dst)
return;
_dst->registered_time = _src->registered_time;
_dst->activity_id = _src->activity_id;
ZeroMemory(_dst->content, sizeof(_dst->content));
::MultiByteToWideChar(CP_ACP, 0, _src->content, -1, _dst->content, _countof(_dst->content));
}
LPMAIN_HANDLE GetMainHandle(CKISSApiWrapper* pAPIWrapper)
{
if(NULL == pAPIWrapper)
return NULL ;
return pAPIWrapper->m_pMainHandle ;
}