Ver Fonte

#IQRV #comment [DeviceControl] 本地适配文件枚举实现

gifur há 4 anos atrás
pai
commit
b21169198e

+ 82 - 0
Module/mod_DeviceControl/DeviceAdaptChecker.cpp

@@ -0,0 +1,82 @@
+#include "DeviceAdaptChecker.h"
+#include <vector>
+#include <string>
+
+ErrorCodeEnum CAdapterLoader::loadConfig()
+{
+    ErrorCodeEnum result(Error_Succeed);
+    CSmartPointer<IConfigInfo> spRootConfig;
+     result = pEntityBase->GetFunction()->OpenConfig(Config_Root, spRootConfig);
+     CSimpleStringA strSection = CSimpleStringA("Device.") + vendorLibInfo.strDevice;
+     spRootConfig->ReadConfigValue(strSection, "Vendor", vendorLibInfo.strVendor);
+     spRootConfig->ReadConfigValue(strSection, "Version", vendorLibInfo.strVersion);
+     spRootConfig->ReadConfigValue(strSection, "Batch", vendorLibInfo.strBatch);
+     return result;
+}
+
+ErrorCodeEnum CAdapterLoader::GetAdapterFullPath(CSimpleStringA& strLibFullPath)
+{
+    ErrorCodeEnum result(Error_Succeed);
+    CSimpleStringA strLibName = vendorLibInfo.toLibNameString();
+    CSimpleStringA strDepPath;
+    result = pEntityBase->GetFunction()->GetPath("Dep", strDepPath);
+    strLibFullPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (LPCTSTR)strDepPath, (LPCTSTR)strLibName);
+    return result;
+}
+
+void CAdapterLoadChecker::Init(CEntityBase* pEntity)
+{
+    for (int i = 0; i < array_size(adapterList); ++i) {
+        if (mAdapterConfigList[i] == nullptr) {
+            CAdapterLoader* item = new CAdapterLoader(adapterList[i], pEntity);
+            mAdapterConfigList[i] = item;
+        }
+        mAdapterConfigList[i]->loadConfig();
+    }
+}
+
+bool CAdapterLoadChecker::IsThisFileConfigure(LPCTSTR fileName)
+{
+    bool result(false);
+
+    for (int i = 0; i < mAdapterConfigList.GetCount(); ++i) {
+        if(mAdapterConfigList[i] == nullptr)
+            continue;
+        CAdapterLoader*& item = mAdapterConfigList[i];
+        if (item->GetAdaperFileName().Compare(fileName) == 0) {
+            result = true;
+            break;
+        }
+    }
+
+    return result;
+}
+
+CAutoArray<CSimpleStringA> CAdapterLoadChecker::GetConfigedAdapterFileName()
+{
+    CAutoArray<CSimpleStringA> result;
+    std::vector<std::string> tmp;
+    for (int i = 0; i < mAdapterConfigList.GetCount(); ++i) {
+        if (mAdapterConfigList[i] == nullptr)
+            continue;
+        CAdapterLoader*& item = mAdapterConfigList[i];
+        if (item->IsFullConfig()) {
+            tmp.push_back(std::string(item->GetAdaperFileName().GetData()));
+        }
+    }
+
+    result.Init(tmp.size());
+    int cnt(0);
+    for (auto it = tmp.cbegin(); it != tmp.cend(); ++it) {
+        result[cnt++] = it->c_str();
+    }
+
+    return result;
+}
+
+ErrorCodeEnum CAdapterLoadChecker::CheckDeviceAndAdapterAvailable(
+        LPCTSTR deviceName, DWORD& dwErrorCode, CSimpleStringA& strErrMsg)
+{
+    ErrorCodeEnum result(Error_Succeed);
+    return result;
+}

+ 82 - 0
Module/mod_DeviceControl/DeviceAdaptChecker.h

@@ -0,0 +1,82 @@
+#ifndef DEVICE_ADAPTER_CHECKER_H_
+#define DEVICE_ADAPTER_CHECKER_H_
+
+#include "DevEntityCommBase.hpp"
+#include "DevFSMCommBase.hpp"
+#include "toolkit.h"
+
+//Stand2S
+static const char* adapterList[] = {
+    "PinPad", "CardIssuer",  "IDCertificate","ContactlessCard","HSPScanner", "FingerPrint",  "WatchDog", "Gpio",  "Ups" };
+
+class CAdapterLoader
+{
+public:
+    CAdapterLoader(LPCTSTR lpcszAdapterName, CEntityBase* pEntity) {
+        vendorLibInfo.strDevice = lpcszAdapterName;
+        pEntityBase = pEntity;
+    }
+    ~CAdapterLoader() {}
+
+    ErrorCodeEnum loadConfig();
+
+    bool IsNoAnyConfigure() const
+    {
+        return vendorLibInfo.IsNotConfig();
+    }
+
+    bool IsFullConfig() const
+    {
+        return vendorLibInfo.IsValid();
+    }
+
+    bool IsConfigIncomplete() const
+    {
+        return (!IsNoAnyConfigure() && !IsFullConfig());
+    }
+
+    ErrorCodeEnum GetAdapterFullPath(CSimpleStringA& strLibFullPath);
+
+    CSimpleStringA GetAdaperFileName()
+    {
+        return vendorLibInfo.toLibNameString();
+    }
+
+protected:
+
+private:
+
+    CEntityBase* pEntityBase;
+    VendorLibInfo vendorLibInfo;
+};
+
+class CAdapterLoadChecker
+{
+public:
+    CAdapterLoadChecker() {
+        mAdapterConfigList.Init(array_size(adapterList));
+        for (int i = 0; i < mAdapterConfigList.GetCount(); ++i) {
+            mAdapterConfigList[i] = nullptr;
+        }
+    }
+    ~CAdapterLoadChecker() {
+        for (int i = 0; i < mAdapterConfigList.GetCount(); ++i) {
+            if (mAdapterConfigList[i] != nullptr) {
+                delete mAdapterConfigList[i];
+                mAdapterConfigList[i] = nullptr;
+            }
+        }
+    }
+    void Init(CEntityBase* pEntity);
+
+    bool IsThisFileConfigure(LPCTSTR fileName);
+
+    CAutoArray<CSimpleStringA> GetConfigedAdapterFileName();
+
+    ErrorCodeEnum CheckDeviceAndAdapterAvailable(LPCTSTR deviceName, DWORD& dwErrorCode, CSimpleStringA& strErrMsg);
+
+private:
+    CAutoArray<CAdapterLoader*> mAdapterConfigList;
+};
+
+#endif

+ 61 - 39
Module/mod_DeviceControl/mod_DeviceControl.cpp

@@ -13,9 +13,7 @@
 #include <vector>
 
 #include "publicFunExport.h"
-
-//Stand2S
-static const char* adapterList[] = { "PinPad", "CardIssuer",  "IDCertificate","ContactlessCard","HSPScanner", "FingerPrint",  "WatchDog", "Gpio",  "Ups" };
+#include "DeviceAdaptChecker.h"
 
 void CDeviceControlServerSession::Handle_USB(SpReqAnsContext<DeviceControlService_USB_Req, DeviceControlService_USB_Ans>::Pointer ctx)
 {
@@ -172,14 +170,12 @@ void CDeviceControlEntity::TestConnectivity(SpReqAnsContext<DeviceControlService
 
 }
 
+
 static CSimpleStringA  GetRegexPatternString(const DeviceControlService_GetVendorFileList_Req& req)
 {
     const char* prefix = "^lib";
     const char* suffix = "\\.so$";
     CSimpleStringA strRegexPattern(prefix);
-    if (req.root) {
-
-    }
 
     //^lib(Gpio|PinPad)\.[a-zA-Z]*\.[0-9]*\.[0-9]*\.so$
     if (req.adapter.IsNullOrEmpty() || req.adapter.Compare("*") == 0) {
@@ -233,46 +229,72 @@ void CDeviceControlEntity::GetVendorFileList(SpReqAnsContext<DeviceControlServic
     CSimpleStringA tmpMsg(true);
 
     CSimpleStringA strDepDirPath;
-    std::vector<std::string> adapterFiles;
-    
     result = GetFunction()->GetPath("Dep", strDepDirPath);
 
-    array_header_t* subs = fileutil_get_sub_files_a(strDepDirPath);
-    if (subs) {
-        regex_t reg;
-        CSimpleStringA pattern = GetRegexPatternString(ctx->Req);
-        int ret = regcomp(&reg, pattern, REG_EXTENDED | REG_NOSUB);
-        if (ret) {
-            char ebuff[256];
-            regerror(ret, &reg, ebuff, 256);
-            Dbg("regex failed: %s", ebuff);
-            tmpResult = Error_Unexpect;
-            tmpMsg = CSimpleStringA::Format("ÄÚ²¿´íÎó£ºREGEX %s", ebuff);
-        } else {
-            Dbg("pattern: %s", pattern.GetData());
-            for (int i = 0; i < subs->nelts; ++i) {
-                char* filenamePath = ARRAY_IDX(subs, i, char*);
-                char* filename = &filenamePath[strDepDirPath.GetLength() + 1];
-                ret = regexec(&reg, filename, 0, NULL, 0);
-                if (0 == ret) {
-                    Dbg("filename %s matched!", filename);
-                    adapterFiles.push_back(std::string(filename));
+    if (ctx->Req.root) {
+        CAdapterLoadChecker* checker = new CAdapterLoadChecker();
+        checker->Init(this);
+        ctx->Ans.filenames = checker->GetConfigedAdapterFileName();
+        ctx->Ans.status.Init(ctx->Ans.filenames.GetCount());
+        CSimpleStringA strDepDirPath2 = strDepDirPath + SPLIT_SLASH_STR;
+        for (int i = 0; i < ctx->Ans.filenames.GetCount(); ++i) {
+            CSimpleStringA fullPath = strDepDirPath2 + ctx->Ans.filenames[i];
+            ctx->Ans.status[i] = 0x2;
+            if (ExistsFileA(fullPath)) {
+                ctx->Ans.status[i] |= 0x1;
+            }
+        }
+        delete checker;
+    } else {
+        std::vector<std::string> adapterFiles;
+        array_header_t* subs = fileutil_get_sub_files_a(strDepDirPath);
+        if (subs) {
+            regex_t reg;
+            CSimpleStringA pattern = GetRegexPatternString(ctx->Req);
+            int ret = regcomp(&reg, pattern, REG_EXTENDED | REG_NOSUB);
+            if (ret) {
+                char ebuff[256];
+                regerror(ret, &reg, ebuff, 256);
+                Dbg("regex failed: %s", ebuff);
+                tmpResult = Error_Unexpect;
+                tmpMsg = CSimpleStringA::Format("ÄÚ²¿´íÎó£ºREGEX %s", ebuff);
+            } else {
+                Dbg("pattern: %s", pattern.GetData());
+                for (int i = 0; i < subs->nelts; ++i) {
+                    char* filenamePath = ARRAY_IDX(subs, i, char*);
+                    char* filename = &filenamePath[strDepDirPath.GetLength() + 1];
+                    ret = regexec(&reg, filename, 0, NULL, 0);
+                    if (0 == ret) {
+                        Dbg("filename %s matched!", filename);
+                        adapterFiles.push_back(std::string(filename));
+                    }
+                }
+            }
+
+            const int curSize = adapterFiles.size();
+            ctx->Ans.filenames.Init(curSize);
+            ctx->Ans.status.Init(curSize);
+            for (int i = 0; i < curSize; ++i) ctx->Ans.status[i] = 0;
+
+            if (curSize > 0) {
+                CAdapterLoadChecker* checker = new CAdapterLoadChecker();
+                checker->Init(this);
+                int cnt = 0;
+                for (auto iter = adapterFiles.cbegin(); iter != adapterFiles.cend(); ++iter, ++cnt) {
+                    ctx->Ans.filenames[cnt] = iter->c_str();
+                    ctx->Ans.status[cnt] = 0x1;
+                    if (checker->IsThisFileConfigure(iter->c_str())) {
+                        ctx->Ans.status[cnt] |= 0x2;
+                    }
                 }
+
+                delete checker;
             }
+
+            toolkit_array_free2(subs);
         }
-        toolkit_array_free2(subs);
     }
-    
-    ctx->Ans.filenames.Init(adapterFiles.size());
-    ctx->Ans.status.Init(adapterFiles.size());
-    int cnt = 0;
-    for (auto iter = adapterFiles.cbegin(); iter != adapterFiles.cend(); ++iter, ++cnt) {
-        ctx->Ans.filenames[cnt] = iter->c_str();
-        ctx->Ans.status[cnt] &= (0x1);
-    }
-    if (!ctx->Req.root) {
 
-    }
 
     ctx->Ans.result = tmpResult;
     ctx->Ans.msg = tmpMsg;

+ 1 - 1
Module/mod_DeviceControl/mod_DeviceControl.h

@@ -145,7 +145,7 @@ public:
 
 private:
     std::pair<ErrorCodeEnum, CSimpleStringA> __ReadCenterConfigStr(CSimpleStringA key, CSimpleStringA entityName);
-
+ 
 private:
     CDeviceControlFSM m_fsm;
 };

+ 1 - 1
addin/res/ManagerDesktop/guide.html

@@ -404,7 +404,7 @@
                                     </div>
                                 </div>
                             </div>
-                            <div class="clearboth border_bottom" style="height:45px;width:480px; margin-left:100px; margin-right: 200px;"></div>
+                            <div class="clearboth border_bottom" style="height:30px;width:480px; margin-left:100px; margin-right: 200px;"></div>
                             <div id="gui_adapter_config_adapter_div" class="clearboth" style="padding-top:30px;">
                                 <div class="pull-left" style="width:330px;">
                                     <div class="text-right guide_input_label">适配器列表</div>

+ 11 - 7
addin/res/ManagerDesktop/js/guide.js

@@ -437,8 +437,16 @@ $(function () {
                 type: selectid
             };
             var pushHtml = '';
-            pushHtml = '<div id="{{type}}_item_{{loop}}" option="{{deviceName}}" class="select_medium hide_with_ellipsis">'
-            pushHtml += '{{deviceName}}</div>'
+            pushHtml = '<div id="{{type}}_item_{{loop}}" option="{{deviceName}}" class="select_medium hide_with_ellipsis"'
+            if(!(status[loop] & 0x1)) {
+                pushHtml += ' style="color:#C0C0C0;"'
+            }
+            //root.ini 配置
+            if((status[loop] & 0x2)) {
+                pushHtml += '>{{deviceName}}&nbsp;(当前配置)</div>'
+            } else {
+                pushHtml += '>{{deviceName}}</div>'
+            }
             $('#' +  selectid).secureAppend(pushHtml, deviceTemplateData);
         }
     }
@@ -499,7 +507,7 @@ $(function () {
     function FulfillDevAdapterFileList(flag)
     {
         let req = new Request();
-        req.root = false;
+        req.root = true;
         req.adapter="";
         req.vendor="";
         req.version="";
@@ -521,10 +529,6 @@ $(function () {
                 } else if(typeof flag !== 'undefined') {
                     utilStartAlertDialog("操作失败:[" + result.result + "] " + result.msg);
                 }
-
-
-
-
             } else if(typeof flag !== 'undefined'){
                 RVC.CameraConfigEntity.commErrorCallback(ret);
             }