From 002e798c8f60e0200f6105ac65a053c1fe12d6f3 Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Tue, 26 Jul 2022 18:22:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=89=E7=85=A7=E4=B9=99=E6=96=B9=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=9A=84=E6=96=87=E6=A1=A3=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=94=A8=E6=88=B7=E8=A1=8C=E4=B8=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/windows/HGBase/HGBase.def | 2 + modules/base/HGBase.h | 1 + modules/base/HGNamedPipe.cpp | 180 ++++++++++++++++++++++++------ modules/base/HGNamedPipe.h | 4 + modules/version/HGVersionImpl.cpp | 16 ++- 5 files changed, 162 insertions(+), 41 deletions(-) diff --git a/build/windows/HGBase/HGBase.def b/build/windows/HGBase/HGBase.def index e6fb58ad..193c2dff 100644 --- a/build/windows/HGBase/HGBase.def +++ b/build/windows/HGBase/HGBase.def @@ -39,9 +39,11 @@ HGBase_WriteLog HGBase_CreateNamedPipe HGBase_DestroyNamedPipe HGBase_WriteNamedPipe +HGBase_StopWriteNamedPipe HGBase_OpenNamedPipe HGBase_CloseNamedPipe HGBase_ReadNamedPipe +HGBase_StopReadNamedPipe HGBase_OpenConsole HGBase_CloseConsole diff --git a/modules/base/HGBase.h b/modules/base/HGBase.h index 59ed1659..afcd65fe 100644 --- a/modules/base/HGBase.h +++ b/modules/base/HGBase.h @@ -19,5 +19,6 @@ #include "HGIni.h" #include "HGMsgPump.h" #include "HGTime.h" +#include "HGNamedPipe.h" #endif /* __HGBASE_H__ */ \ No newline at end of file diff --git a/modules/base/HGNamedPipe.cpp b/modules/base/HGNamedPipe.cpp index 4315358d..896a8502 100644 --- a/modules/base/HGNamedPipe.cpp +++ b/modules/base/HGNamedPipe.cpp @@ -6,8 +6,12 @@ struct HGNamedPipeOutImpl HGNamedPipeOutImpl() { #if defined(HG_CMP_MSC) + m_hConnectEvent = NULL; + m_hWriteEvent = NULL; m_hPipe = INVALID_HANDLE_VALUE; + m_pOverlapped = NULL; #else + m_filePath.empty(); m_fdPipe = -1; #endif } @@ -15,25 +19,26 @@ struct HGNamedPipeOutImpl ~HGNamedPipeOutImpl() { #if defined(HG_CMP_MSC) - if (INVALID_HANDLE_VALUE != m_hPipe) - { - CloseHandle(m_hPipe); - m_hPipe = INVALID_HANDLE_VALUE; - } + delete m_pOverlapped; + m_pOverlapped = NULL; + CloseHandle(m_hPipe); + m_hPipe = INVALID_HANDLE_VALUE; + CloseHandle(m_hWriteEvent); + m_hWriteEvent = NULL; + CloseHandle(m_hConnectEvent); + m_hConnectEvent = NULL; #else - if (-1 != m_fdPipe) - { - close(m_fdPipe); - m_fdPipe = -1; - } - - if (!m_filePath.empty()) - unlink(m_filePath.c_str()); + close(m_fdPipe); + m_fdPipe = -1; + unlink(m_filePath.c_str()); #endif } #if defined(HG_CMP_MSC) + HANDLE m_hConnectEvent; + HANDLE m_hWriteEvent; HANDLE m_hPipe; + OVERLAPPED *m_pOverlapped; #else std::string m_filePath; int m_fdPipe; @@ -45,6 +50,7 @@ struct HGNamedPipeInImpl HGNamedPipeInImpl() { #if defined(HG_CMP_MSC) + m_hReadEvent = NULL; m_hPipe = INVALID_HANDLE_VALUE; #else m_fdPipe = -1; @@ -54,21 +60,18 @@ struct HGNamedPipeInImpl ~HGNamedPipeInImpl() { #if defined(HG_CMP_MSC) - if (INVALID_HANDLE_VALUE != m_hPipe) - { - CloseHandle(m_hPipe); - m_hPipe = INVALID_HANDLE_VALUE; - } + CloseHandle(m_hPipe); + m_hPipe = INVALID_HANDLE_VALUE; + CloseHandle(m_hReadEvent); + m_hReadEvent = NULL; #else - if (-1 != m_fdPipe) - { - close(m_fdPipe); - m_fdPipe = -1; - } + close(m_fdPipe); + m_fdPipe = -1; #endif } #if defined(HG_CMP_MSC) + HANDLE m_hReadEvent; HANDLE m_hPipe; #else int m_fdPipe; @@ -83,21 +86,43 @@ HGResult HGAPI HGBase_CreateNamedPipe(const HGChar* pipeName, HGNamedPipeOut* pi } #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]; sprintf(name, "\\\\.\\pipe\\%s", pipeName); - HANDLE hPipe = CreateNamedPipeA(name, PIPE_ACCESS_OUTBOUND, PIPE_READMODE_BYTE | PIPE_WAIT, - PIPE_UNLIMITED_INSTANCES, 0, 0, 0, NULL); + HANDLE hPipe = CreateNamedPipeA(name, PIPE_ACCESS_OUTBOUND | FILE_FLAG_FIRST_PIPE_INSTANCE | FILE_FLAG_OVERLAPPED, + 0, 1, 1024, 1024, 0, NULL); if (INVALID_HANDLE_VALUE == hPipe) - return HGBASE_ERR_FAIL; - - if (!ConnectNamedPipe(hPipe, NULL)) { - CloseHandle(hPipe); + CloseHandle(hWriteEvent); + CloseHandle(hConnectEvent); 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; + pipeOutImpl->m_hConnectEvent = hConnectEvent; + pipeOutImpl->m_hWriteEvent = hWriteEvent; pipeOutImpl->m_hPipe = hPipe; + pipeOutImpl->m_pOverlapped = pOverlapped; #else char name[256]; sprintf(name, "/tmp/%s", pipeName); @@ -140,16 +165,43 @@ HGResult HGAPI HGBase_WriteNamedPipe(HGNamedPipeOut pipeOut, const HGByte* data, } HGNamedPipeOutImpl* pipeOutImpl = (HGNamedPipeOutImpl*)pipeOut; + #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; + } + + 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) *writeSize = dwNumerOfWriteBytes; #else int res = write(pipeOutImpl->m_fdPipe, data, size); if (-1 == res) return HGBASE_ERR_FAIL; + if (NULL != writeSize) *writeSize = res; #endif @@ -157,6 +209,22 @@ HGResult HGAPI HGBase_WriteNamedPipe(HGNamedPipeOut pipeOut, const HGByte* data, 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) { if (NULL == pipeName || NULL == pipeIn) @@ -165,15 +233,26 @@ HGResult HGAPI HGBase_OpenNamedPipe(const HGChar* pipeName, HGNamedPipeIn* pipeI } #if defined(HG_CMP_MSC) + HANDLE hReadEvent = CreateEventA(NULL, TRUE, FALSE, NULL); + assert(NULL != hReadEvent); + char name[256]; 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; - 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) + { + CloseHandle(hReadEvent); return HGBASE_ERR_FAIL; + } HGNamedPipeInImpl* pipeInImpl = new HGNamedPipeInImpl; + pipeInImpl->m_hReadEvent = hReadEvent; pipeInImpl->m_hPipe = hPipe; #else char name[256]; @@ -211,9 +290,25 @@ HGResult HGAPI HGBase_ReadNamedPipe(HGNamedPipeIn pipeIn, HGByte* data, HGUInt s HGNamedPipeInImpl* pipeInImpl = (HGNamedPipeInImpl*)pipeIn; #if defined(HG_CMP_MSC) + OVERLAPPED overlapped = { 0 }; + overlapped.hEvent = pipeInImpl->m_hReadEvent; DWORD dwNumerOfReadBytes = 0; - if (!ReadFile(pipeInImpl->m_hPipe, data, size, &dwNumerOfReadBytes, NULL)) - return HGBASE_ERR_FAIL; + if (!ReadFile(pipeInImpl->m_hPipe, data, size, &dwNumerOfReadBytes, &overlapped)) + { + if (ERROR_IO_PENDING != GetLastError()) + { + // 读取错误 + return HGBASE_ERR_FAIL; + } + + WaitForSingleObject(pipeInImpl->m_hReadEvent, INFINITE); + if (!GetOverlappedResult(pipeInImpl->m_hPipe, &overlapped, &dwNumerOfReadBytes, TRUE)) + { + // 手动停止 + return HGBASE_ERR_FAIL; + } + } + if (NULL != readSize) *readSize = dwNumerOfReadBytes; #else @@ -224,5 +319,20 @@ HGResult HGAPI HGBase_ReadNamedPipe(HGNamedPipeIn pipeIn, HGByte* data, HGUInt s *readSize = res; #endif + 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; } \ No newline at end of file diff --git a/modules/base/HGNamedPipe.h b/modules/base/HGNamedPipe.h index 737ffc16..48352720 100644 --- a/modules/base/HGNamedPipe.h +++ b/modules/base/HGNamedPipe.h @@ -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_StopWriteNamedPipe(HGNamedPipeOut pipeOut); + HGEXPORT HGResult HGAPI HGBase_OpenNamedPipe(const HGChar *pipeName, 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_StopReadNamedPipe(HGNamedPipeIn pipeIn); + #endif /* __HGNAMEDPIPE_H__ */ \ No newline at end of file diff --git a/modules/version/HGVersionImpl.cpp b/modules/version/HGVersionImpl.cpp index a4270261..a34f456a 100644 --- a/modules/version/HGVersionImpl.cpp +++ b/modules/version/HGVersionImpl.cpp @@ -718,7 +718,7 @@ static HGResult PostDeviceInfo(const std::string& devName, const std::string& de 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; 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, "oem", cJSON_CreateString(oemName.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); cJSON_Delete(json); @@ -1392,28 +1396,28 @@ void HGVersionMgrImpl::MsgPumpFunc(HGMsgPump msgPump, const HGMsg* msg, HGPointe case MsgId_PostUserOpenInfo: { PostUserInfoParam* param = (PostUserInfoParam*)msg->data; - ::PostUserInfo(param->appName, "power_on"); + ::PostUserInfo(param->appName, 1, 0, 0, 0); delete param; } break; case MsgId_PostUserCloseInfo: { PostUserInfoParam* param = (PostUserInfoParam*)msg->data; - ::PostUserInfo(param->appName, "power_off"); + ::PostUserInfo(param->appName, 0, 1, 0, 0); delete param; } break; case MsgId_PostUserLoginInfo: { PostUserInfoParam* param = (PostUserInfoParam*)msg->data; - ::PostUserInfo(param->appName, "login"); + ::PostUserInfo(param->appName, 0, 0, 1, 0); delete param; } break; case MsgId_PostUserLogoutInfo: { PostUserInfoParam* param = (PostUserInfoParam*)msg->data; - ::PostUserInfo(param->appName, "logout"); + ::PostUserInfo(param->appName, 0, 0, 0, 1); delete param; } break;