按照乙方修改的文档,修改上传用户行为功能

This commit is contained in:
luoliangyi 2022-07-26 18:22:02 +08:00
parent 304bb14215
commit 002e798c8f
5 changed files with 162 additions and 41 deletions

View File

@ -39,9 +39,11 @@ HGBase_WriteLog
HGBase_CreateNamedPipe HGBase_CreateNamedPipe
HGBase_DestroyNamedPipe HGBase_DestroyNamedPipe
HGBase_WriteNamedPipe HGBase_WriteNamedPipe
HGBase_StopWriteNamedPipe
HGBase_OpenNamedPipe HGBase_OpenNamedPipe
HGBase_CloseNamedPipe HGBase_CloseNamedPipe
HGBase_ReadNamedPipe HGBase_ReadNamedPipe
HGBase_StopReadNamedPipe
HGBase_OpenConsole HGBase_OpenConsole
HGBase_CloseConsole HGBase_CloseConsole

View File

@ -19,5 +19,6 @@
#include "HGIni.h" #include "HGIni.h"
#include "HGMsgPump.h" #include "HGMsgPump.h"
#include "HGTime.h" #include "HGTime.h"
#include "HGNamedPipe.h"
#endif /* __HGBASE_H__ */ #endif /* __HGBASE_H__ */

View File

@ -6,8 +6,12 @@ struct HGNamedPipeOutImpl
HGNamedPipeOutImpl() HGNamedPipeOutImpl()
{ {
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
m_hConnectEvent = NULL;
m_hWriteEvent = NULL;
m_hPipe = INVALID_HANDLE_VALUE; m_hPipe = INVALID_HANDLE_VALUE;
m_pOverlapped = NULL;
#else #else
m_filePath.empty();
m_fdPipe = -1; m_fdPipe = -1;
#endif #endif
} }
@ -15,25 +19,26 @@ struct HGNamedPipeOutImpl
~HGNamedPipeOutImpl() ~HGNamedPipeOutImpl()
{ {
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
if (INVALID_HANDLE_VALUE != m_hPipe) delete m_pOverlapped;
{ m_pOverlapped = NULL;
CloseHandle(m_hPipe); CloseHandle(m_hPipe);
m_hPipe = INVALID_HANDLE_VALUE; m_hPipe = INVALID_HANDLE_VALUE;
} CloseHandle(m_hWriteEvent);
m_hWriteEvent = NULL;
CloseHandle(m_hConnectEvent);
m_hConnectEvent = NULL;
#else #else
if (-1 != m_fdPipe)
{
close(m_fdPipe); close(m_fdPipe);
m_fdPipe = -1; m_fdPipe = -1;
}
if (!m_filePath.empty())
unlink(m_filePath.c_str()); unlink(m_filePath.c_str());
#endif #endif
} }
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
HANDLE m_hConnectEvent;
HANDLE m_hWriteEvent;
HANDLE m_hPipe; HANDLE m_hPipe;
OVERLAPPED *m_pOverlapped;
#else #else
std::string m_filePath; std::string m_filePath;
int m_fdPipe; int m_fdPipe;
@ -45,6 +50,7 @@ struct HGNamedPipeInImpl
HGNamedPipeInImpl() HGNamedPipeInImpl()
{ {
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
m_hReadEvent = NULL;
m_hPipe = INVALID_HANDLE_VALUE; m_hPipe = INVALID_HANDLE_VALUE;
#else #else
m_fdPipe = -1; m_fdPipe = -1;
@ -54,21 +60,18 @@ struct HGNamedPipeInImpl
~HGNamedPipeInImpl() ~HGNamedPipeInImpl()
{ {
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
if (INVALID_HANDLE_VALUE != m_hPipe)
{
CloseHandle(m_hPipe); CloseHandle(m_hPipe);
m_hPipe = INVALID_HANDLE_VALUE; m_hPipe = INVALID_HANDLE_VALUE;
} CloseHandle(m_hReadEvent);
m_hReadEvent = NULL;
#else #else
if (-1 != m_fdPipe)
{
close(m_fdPipe); close(m_fdPipe);
m_fdPipe = -1; m_fdPipe = -1;
}
#endif #endif
} }
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
HANDLE m_hReadEvent;
HANDLE m_hPipe; HANDLE m_hPipe;
#else #else
int m_fdPipe; int m_fdPipe;
@ -83,21 +86,43 @@ HGResult HGAPI HGBase_CreateNamedPipe(const HGChar* pipeName, HGNamedPipeOut* pi
} }
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
HANDLE hConnectEvent = CreateEventA(NULL, TRUE, FALSE, NULL);
assert(NULL != hConnectEvent);
HANDLE hWriteEvent = CreateEventA(NULL, TRUE, FALSE, NULL);
assert(NULL != hWriteEvent);
char name[256]; char name[256];
sprintf(name, "\\\\.\\pipe\\%s", pipeName); sprintf(name, "\\\\.\\pipe\\%s", pipeName);
HANDLE hPipe = CreateNamedPipeA(name, PIPE_ACCESS_OUTBOUND, PIPE_READMODE_BYTE | PIPE_WAIT, HANDLE hPipe = CreateNamedPipeA(name, PIPE_ACCESS_OUTBOUND | FILE_FLAG_FIRST_PIPE_INSTANCE | FILE_FLAG_OVERLAPPED,
PIPE_UNLIMITED_INSTANCES, 0, 0, 0, NULL); 0, 1, 1024, 1024, 0, NULL);
if (INVALID_HANDLE_VALUE == hPipe) if (INVALID_HANDLE_VALUE == hPipe)
return HGBASE_ERR_FAIL;
if (!ConnectNamedPipe(hPipe, NULL))
{ {
CloseHandle(hPipe); CloseHandle(hWriteEvent);
CloseHandle(hConnectEvent);
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
OVERLAPPED* pOverlapped = new OVERLAPPED;
memset(pOverlapped, 0, sizeof(OVERLAPPED));
pOverlapped->hEvent = hConnectEvent;
if (!ConnectNamedPipe(hPipe, pOverlapped))
{
DWORD err = GetLastError();
if (ERROR_IO_PENDING != err && ERROR_PIPE_CONNECTED != err)
{
delete pOverlapped;
CloseHandle(hPipe);
CloseHandle(hWriteEvent);
CloseHandle(hConnectEvent);
return HGBASE_ERR_FAIL;
}
}
HGNamedPipeOutImpl* pipeOutImpl = new HGNamedPipeOutImpl; HGNamedPipeOutImpl* pipeOutImpl = new HGNamedPipeOutImpl;
pipeOutImpl->m_hConnectEvent = hConnectEvent;
pipeOutImpl->m_hWriteEvent = hWriteEvent;
pipeOutImpl->m_hPipe = hPipe; pipeOutImpl->m_hPipe = hPipe;
pipeOutImpl->m_pOverlapped = pOverlapped;
#else #else
char name[256]; char name[256];
sprintf(name, "/tmp/%s", pipeName); sprintf(name, "/tmp/%s", pipeName);
@ -140,16 +165,43 @@ HGResult HGAPI HGBase_WriteNamedPipe(HGNamedPipeOut pipeOut, const HGByte* data,
} }
HGNamedPipeOutImpl* pipeOutImpl = (HGNamedPipeOutImpl*)pipeOut; HGNamedPipeOutImpl* pipeOutImpl = (HGNamedPipeOutImpl*)pipeOut;
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
DWORD dwNumerOfWriteBytes = 0; // 等待连接
if (!WriteFile(pipeOutImpl->m_hPipe, data, size, &dwNumerOfWriteBytes, NULL)) WaitForSingleObject(pipeOutImpl->m_hConnectEvent, INFINITE);
DWORD dwTransferBytes = 0; // 此值无意义
if (!GetOverlappedResult(pipeOutImpl->m_hPipe, pipeOutImpl->m_pOverlapped, &dwTransferBytes, TRUE))
{
// 手动停止
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
}
OVERLAPPED overlapped = { 0 };
overlapped.hEvent = pipeOutImpl->m_hWriteEvent;
DWORD dwNumerOfWriteBytes = 0;
if (!WriteFile(pipeOutImpl->m_hPipe, data, size, &dwNumerOfWriteBytes, &overlapped))
{
if (ERROR_IO_PENDING != GetLastError())
{
// 写入错误
return HGBASE_ERR_FAIL;
}
WaitForSingleObject(pipeOutImpl->m_hWriteEvent, INFINITE);
if (!GetOverlappedResult(pipeOutImpl->m_hPipe, &overlapped, &dwNumerOfWriteBytes, TRUE))
{
// 手动停止
return HGBASE_ERR_FAIL;
}
}
if (NULL != writeSize) if (NULL != writeSize)
*writeSize = dwNumerOfWriteBytes; *writeSize = dwNumerOfWriteBytes;
#else #else
int res = write(pipeOutImpl->m_fdPipe, data, size); int res = write(pipeOutImpl->m_fdPipe, data, size);
if (-1 == res) if (-1 == res)
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
if (NULL != writeSize) if (NULL != writeSize)
*writeSize = res; *writeSize = res;
#endif #endif
@ -157,6 +209,22 @@ HGResult HGAPI HGBase_WriteNamedPipe(HGNamedPipeOut pipeOut, const HGByte* data,
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGAPI HGBase_StopWriteNamedPipe(HGNamedPipeOut pipeOut)
{
if (NULL == pipeOut)
{
return HGBASE_ERR_INVALIDARG;
}
HGNamedPipeOutImpl* pipeOutImpl = (HGNamedPipeOutImpl*)pipeOut;
#if defined(HG_CMP_MSC)
SetEvent(pipeOutImpl->m_hConnectEvent);
SetEvent(pipeOutImpl->m_hWriteEvent);
#else
#endif
return HGBASE_ERR_OK;
}
HGResult HGAPI HGBase_OpenNamedPipe(const HGChar* pipeName, HGNamedPipeIn* pipeIn) HGResult HGAPI HGBase_OpenNamedPipe(const HGChar* pipeName, HGNamedPipeIn* pipeIn)
{ {
if (NULL == pipeName || NULL == pipeIn) if (NULL == pipeName || NULL == pipeIn)
@ -165,15 +233,26 @@ HGResult HGAPI HGBase_OpenNamedPipe(const HGChar* pipeName, HGNamedPipeIn* pipeI
} }
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
HANDLE hReadEvent = CreateEventA(NULL, TRUE, FALSE, NULL);
assert(NULL != hReadEvent);
char name[256]; char name[256];
sprintf(name, "\\\\.\\pipe\\%s", pipeName); sprintf(name, "\\\\.\\pipe\\%s", pipeName);
if (!WaitNamedPipeA(pipeName, NMPWAIT_USE_DEFAULT_WAIT)) if (!WaitNamedPipeA(name, NMPWAIT_USE_DEFAULT_WAIT))
{
DWORD dw = GetLastError();
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
HANDLE hPipe = CreateFileA(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); }
HANDLE hPipe = CreateFileA(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
if (INVALID_HANDLE_VALUE == hPipe) if (INVALID_HANDLE_VALUE == hPipe)
{
CloseHandle(hReadEvent);
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
}
HGNamedPipeInImpl* pipeInImpl = new HGNamedPipeInImpl; HGNamedPipeInImpl* pipeInImpl = new HGNamedPipeInImpl;
pipeInImpl->m_hReadEvent = hReadEvent;
pipeInImpl->m_hPipe = hPipe; pipeInImpl->m_hPipe = hPipe;
#else #else
char name[256]; char name[256];
@ -211,9 +290,25 @@ HGResult HGAPI HGBase_ReadNamedPipe(HGNamedPipeIn pipeIn, HGByte* data, HGUInt s
HGNamedPipeInImpl* pipeInImpl = (HGNamedPipeInImpl*)pipeIn; HGNamedPipeInImpl* pipeInImpl = (HGNamedPipeInImpl*)pipeIn;
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
OVERLAPPED overlapped = { 0 };
overlapped.hEvent = pipeInImpl->m_hReadEvent;
DWORD dwNumerOfReadBytes = 0; DWORD dwNumerOfReadBytes = 0;
if (!ReadFile(pipeInImpl->m_hPipe, data, size, &dwNumerOfReadBytes, NULL)) if (!ReadFile(pipeInImpl->m_hPipe, data, size, &dwNumerOfReadBytes, &overlapped))
{
if (ERROR_IO_PENDING != GetLastError())
{
// 读取错误
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
}
WaitForSingleObject(pipeInImpl->m_hReadEvent, INFINITE);
if (!GetOverlappedResult(pipeInImpl->m_hPipe, &overlapped, &dwNumerOfReadBytes, TRUE))
{
// 手动停止
return HGBASE_ERR_FAIL;
}
}
if (NULL != readSize) if (NULL != readSize)
*readSize = dwNumerOfReadBytes; *readSize = dwNumerOfReadBytes;
#else #else
@ -226,3 +321,18 @@ HGResult HGAPI HGBase_ReadNamedPipe(HGNamedPipeIn pipeIn, HGByte* data, HGUInt s
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGAPI HGBase_StopReadNamedPipe(HGNamedPipeIn pipeIn)
{
if (NULL == pipeIn)
{
return HGBASE_ERR_INVALIDARG;
}
HGNamedPipeInImpl* pipeInImpl = (HGNamedPipeInImpl*)pipeIn;
#if defined(HG_CMP_MSC)
SetEvent(pipeInImpl->m_hReadEvent);
#else
#endif
return HGBASE_ERR_OK;
}

View File

@ -13,10 +13,14 @@ HGEXPORT HGResult HGAPI HGBase_DestroyNamedPipe(HGNamedPipeOut pipeOut);
HGEXPORT HGResult HGAPI HGBase_WriteNamedPipe(HGNamedPipeOut pipeOut, const HGByte *data, HGUInt size, HGUInt *writeSize); HGEXPORT HGResult HGAPI HGBase_WriteNamedPipe(HGNamedPipeOut pipeOut, const HGByte *data, HGUInt size, HGUInt *writeSize);
HGEXPORT HGResult HGAPI HGBase_StopWriteNamedPipe(HGNamedPipeOut pipeOut);
HGEXPORT HGResult HGAPI HGBase_OpenNamedPipe(const HGChar *pipeName, HGNamedPipeIn *pipeIn); HGEXPORT HGResult HGAPI HGBase_OpenNamedPipe(const HGChar *pipeName, HGNamedPipeIn *pipeIn);
HGEXPORT HGResult HGAPI HGBase_CloseNamedPipe(HGNamedPipeIn pipeIn); HGEXPORT HGResult HGAPI HGBase_CloseNamedPipe(HGNamedPipeIn pipeIn);
HGEXPORT HGResult HGAPI HGBase_ReadNamedPipe(HGNamedPipeIn pipeIn, HGByte *data, HGUInt size, HGUInt *readSize); HGEXPORT HGResult HGAPI HGBase_ReadNamedPipe(HGNamedPipeIn pipeIn, HGByte *data, HGUInt size, HGUInt *readSize);
HGEXPORT HGResult HGAPI HGBase_StopReadNamedPipe(HGNamedPipeIn pipeIn);
#endif /* __HGNAMEDPIPE_H__ */ #endif /* __HGNAMEDPIPE_H__ */

View File

@ -718,7 +718,7 @@ static HGResult PostDeviceInfo(const std::string& devName, const std::string& de
return ret; return ret;
} }
static HGResult PostUserInfo(const std::string& appName, const std::string& action) static HGResult PostUserInfo(const std::string& appName, HGUInt powerOn, HGUInt powerOff, HGUInt login, HGUInt logout)
{ {
HGResult ret = HGBASE_ERR_FAIL; HGResult ret = HGBASE_ERR_FAIL;
CURL* curl = curl_easy_init(); CURL* curl = curl_easy_init();
@ -768,7 +768,11 @@ static HGResult PostUserInfo(const std::string& appName, const std::string& acti
cJSON_AddItemToObject(json, "cpu", cJSON_CreateString(archName.c_str())); cJSON_AddItemToObject(json, "cpu", cJSON_CreateString(archName.c_str()));
cJSON_AddItemToObject(json, "oem", cJSON_CreateString(oemName.c_str())); cJSON_AddItemToObject(json, "oem", cJSON_CreateString(oemName.c_str()));
cJSON_AddItemToObject(json, "app_name", cJSON_CreateString(appName.c_str())); cJSON_AddItemToObject(json, "app_name", cJSON_CreateString(appName.c_str()));
cJSON_AddItemToObject(json, "act", cJSON_CreateString(action.c_str()));
cJSON_AddItemToObject(json, "power_on", cJSON_CreateNumber(powerOn));
cJSON_AddItemToObject(json, "power_off", cJSON_CreateNumber(powerOff));
cJSON_AddItemToObject(json, "login", cJSON_CreateNumber(login));
cJSON_AddItemToObject(json, "logout", cJSON_CreateNumber(logout));
jsonStr = cJSON_Print(json); jsonStr = cJSON_Print(json);
cJSON_Delete(json); cJSON_Delete(json);
@ -1392,28 +1396,28 @@ void HGVersionMgrImpl::MsgPumpFunc(HGMsgPump msgPump, const HGMsg* msg, HGPointe
case MsgId_PostUserOpenInfo: case MsgId_PostUserOpenInfo:
{ {
PostUserInfoParam* param = (PostUserInfoParam*)msg->data; PostUserInfoParam* param = (PostUserInfoParam*)msg->data;
::PostUserInfo(param->appName, "power_on"); ::PostUserInfo(param->appName, 1, 0, 0, 0);
delete param; delete param;
} }
break; break;
case MsgId_PostUserCloseInfo: case MsgId_PostUserCloseInfo:
{ {
PostUserInfoParam* param = (PostUserInfoParam*)msg->data; PostUserInfoParam* param = (PostUserInfoParam*)msg->data;
::PostUserInfo(param->appName, "power_off"); ::PostUserInfo(param->appName, 0, 1, 0, 0);
delete param; delete param;
} }
break; break;
case MsgId_PostUserLoginInfo: case MsgId_PostUserLoginInfo:
{ {
PostUserInfoParam* param = (PostUserInfoParam*)msg->data; PostUserInfoParam* param = (PostUserInfoParam*)msg->data;
::PostUserInfo(param->appName, "login"); ::PostUserInfo(param->appName, 0, 0, 1, 0);
delete param; delete param;
} }
break; break;
case MsgId_PostUserLogoutInfo: case MsgId_PostUserLogoutInfo:
{ {
PostUserInfoParam* param = (PostUserInfoParam*)msg->data; PostUserInfoParam* param = (PostUserInfoParam*)msg->data;
::PostUserInfo(param->appName, "logout"); ::PostUserInfo(param->appName, 0, 0, 0, 1);
delete param; delete param;
} }
break; break;