ソースを参照

修复自动更新的bug

zhangyang 6 年 前
コミット
44115f49ba

BIN
bin/Win32/Debug/lewaimai_pos_windows/db/pos.db


BIN
bin/Win32/Debug/lewaimai_pos_windows/lewaimai_pos_windows.exe


BIN
bin/Win32/Release/lewaimai_pos_windows/lewaimai_pos_windows.exe


BIN
bin/Win32/Release/setup/lewaimai_pos_windows_setup_1.0.0.3.exe


+ 1 - 1
bin/Win32/Release/setup/乐外卖接单软件安装脚本.nsi

@@ -2,7 +2,7 @@
 
 ; HM NIS Edit Wizard helper defines
 !define PRODUCT_NAME "乐外卖接单软件"
-!define PRODUCT_VERSION "1.0.0.3"
+!define PRODUCT_VERSION "1.0.0.4"
 !define PRODUCT_PUBLISHER "深圳市迅享科技有限公司"
 !define PRODUCT_WEB_SITE "https://www.lewaimai.com"
 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}.exe"

+ 99 - 70
lewaimai_pos_windows/helper/CLewaimaiString.cpp

@@ -20,22 +20,27 @@ unsigned char ToHex(unsigned char x)
 unsigned char FromHex(unsigned char x)
 {
     unsigned char y;
+
     if(x >= 'A' && x <= 'Z')
     {
         y = x - 'A' + 10;
     }
+
     else if(x >= 'a' && x <= 'z')
     {
         y = x - 'a' + 10;
     }
+
     else if(x >= '0' && x <= '9')
     {
         y = x - '0';
     }
+
     else
     {
         assert(0);
     }
+
     return y;
 }
 
@@ -52,19 +57,24 @@ bool CLewaimaiString::base64_encode(const string& input, string* output)
 {
     typedef base64_from_binary<transform_width<string::const_iterator, 6, 8>> Base64EncodeIterator;
     stringstream result;
+
     try
     {
         copy(Base64EncodeIterator(input.begin()), Base64EncodeIterator(input.end()), ostream_iterator<char>(result));
     }
+
     catch(...)
     {
         return false;
     }
+
     size_t equal_count = (3 - input.length() % 3) % 3;
+
     for(size_t i = 0; i < equal_count; i++)
     {
         result.put('=');
     }
+
     *output = result.str();
     return output->empty() == false;
 }
@@ -73,14 +83,17 @@ bool CLewaimaiString::base64_decode(const string& input, string* output)
 {
     typedef transform_width<binary_from_base64<string::const_iterator>, 8, 6> Base64DecodeIterator;
     stringstream result;
+
     try
     {
         copy(Base64DecodeIterator(input.begin()), Base64DecodeIterator(input.end()), ostream_iterator<char>(result));
     }
+
     catch(...)
     {
         return false;
     }
+
     *output = result.str();
     return output->empty() == false;
 }
@@ -98,6 +111,7 @@ std::string CLewaimaiString::UrlEncode(const std::string& str)
 {
     std::string strTemp = "";
     size_t length = str.length();
+
     for(size_t i = 0; i < length; i++)
     {
         if(isalnum((unsigned char)str[i]) ||
@@ -108,10 +122,12 @@ std::string CLewaimaiString::UrlEncode(const std::string& str)
         {
             strTemp += str[i];
         }
+
         else if(str[i] == ' ')
         {
             strTemp += "+";
         }
+
         else
         {
             strTemp += '%';
@@ -119,6 +135,7 @@ std::string CLewaimaiString::UrlEncode(const std::string& str)
             strTemp += ToHex((unsigned char)str[i] % 16);
         }
     }
+
     return strTemp;
 }
 
@@ -126,12 +143,14 @@ std::string CLewaimaiString::UrlDecode(const std::string& str)
 {
     std::string strTemp = "";
     size_t length = str.length();
+
     for(size_t i = 0; i < length; i++)
     {
         if(str[i] == '+')
         {
             strTemp += ' ';
         }
+
         else if(str[i] == '%')
         {
             assert(i + 2 < length);
@@ -139,78 +158,72 @@ std::string CLewaimaiString::UrlDecode(const std::string& str)
             unsigned char low = FromHex((unsigned char)str[++i]);
             strTemp += high * 16 + low;
         }
+
         else
         {
             strTemp += str[i];
         }
     }
+
     return strTemp;
 }
 
 std::string CLewaimaiString::UnicodeToUTF8(const std::wstring& wstr)
 {
     std::string ret;
+
     try
     {
         std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
         ret = wcv.to_bytes(wstr);
     }
+
     catch(const std::exception& e)
     {
         std::cerr << e.what() << std::endl;
     }
+
     return ret;
 }
 
 std::wstring CLewaimaiString::UTF8ToUnicode(const std::string& str)
 {
     std::wstring ret;
+
     try
     {
         std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
         ret = wcv.from_bytes(str);
     }
+
     catch(const std::exception& e)
     {
         std::cerr << e.what() << std::endl;
     }
+
     return ret;
 }
 
 std::string CLewaimaiString::UnicodeToANSI(const std::wstring& wstr)
 {
-    std::string ret;
-    std::mbstate_t state = {};
-    const wchar_t* src = wstr.data();
-    size_t len = std::wcsrtombs(nullptr, &src, 0, &state);
-    if(static_cast<size_t>(-1) != len)
-    {
-        std::unique_ptr< char[] > buff(new char[len + 1]);
-        len = std::wcsrtombs(buff.get(), &src, len, &state);
-        if(static_cast<size_t>(-1) != len)
-        {
-            ret.assign(buff.get(), len);
-        }
-    }
-    return ret;
+    unsigned len = wstr.size() * 4;
+    setlocale(LC_CTYPE, "");
+    char *p = new char[len];
+    wcstombs(p, wstr.c_str(), len);
+    std::string str1(p);
+    delete[] p;
+    return str1;
 }
 
 std::wstring CLewaimaiString::ANSIToUnicode(const std::string& str)
 {
-    std::wstring ret;
-    std::mbstate_t state = {};
-    const char* src = str.data();
-    size_t len = std::mbsrtowcs(nullptr, &src, 0, &state);
-    if(static_cast<size_t>(-1) != len)
-    {
-        std::unique_ptr< wchar_t[] > buff(new wchar_t[len + 1]);
-        len = std::mbsrtowcs(buff.get(), &src, len, &state);
-        if(static_cast<size_t>(-1) != len)
-        {
-            ret.assign(buff.get(), len);
-        }
-    }
-    return ret;
+    unsigned len = str.size() * 2;// 预留字节数
+    setlocale(LC_CTYPE, "");     //必须调用此函数
+    wchar_t *p = new wchar_t[len];// 申请一段内存存放转换后的字符串
+    mbstowcs(p, str.c_str(), len);// 转换
+    std::wstring str1(p);
+    delete[] p;// 释放申请的内存
+    return str1;
 }
 
 std::string CLewaimaiString::UTF8ToANSI(const std::string& str)
@@ -239,18 +252,22 @@ bool CLewaimaiString::isIPAddressValid(const char* pszIPAddr)
     {
         return false;    //若pszIPAddr为空
     }
+
     char IP1[100], cIP[4];
     int len = strlen(pszIPAddr);
     int i = 0, j = len - 1;
     int k, m = 0, n = 0, num = 0;
+
     //去除首尾空格(取出从i-1到j+1之间的字符):
     while(pszIPAddr[i++] == ' ');
+
     while(pszIPAddr[j--] == ' ');
 
     for(k = i - 1; k <= j + 1; k++)
     {
         IP1[m++] = *(pszIPAddr + k);
     }
+
     IP1[m] = '\0';
 
     char* p = IP1;
@@ -261,29 +278,35 @@ bool CLewaimaiString::isIPAddressValid(const char* pszIPAddr)
         {
             return false;
         }
+
         cIP[n++] = *p; //保存每个子段的第一个字符,用于之后判断该子段是否为0开头
 
         int sum = 0;  //sum为每一子段的数值,应在0到255之间
+
         while(*p != '.' && *p != '\0')
         {
             if(*p == ' ' || *p < '0' || *p > '9')
             {
                 return false;
             }
+
             sum = sum * 10 + *p - 48;  //每一子段字符串转化为整数
             p++;
         }
+
         if(*p == '.')
         {
             if((*(p - 1) >= '0' && *(p - 1) <= '9') && (*(p + 1) >= '0' && *(p + 1) <= '9')) //判断"."前后是否有数字,若无,则为无效IP,如“1.1.127.”
             {
                 num++;    //记录“.”出现的次数,不能大于3
             }
+
             else
             {
                 return false;
             }
         };
+
         if((sum > 255) || (sum > 0 && cIP[0] == '0') || num > 3)
         {
             return false;    //若子段的值>255或为0开头的非0子段或“.”的数目>3,则为无效IP
@@ -293,35 +316,38 @@ bool CLewaimaiString::isIPAddressValid(const char* pszIPAddr)
         {
             p++;
         }
+
         n = 0;
     }
+
     if(num != 3)
     {
         return false;
     }
+
     return true;
 }
 
 vector<string> CLewaimaiString::Split(const string& in, const string& delim)
 {
-	vector<string> ret;
-
-	try
-	{
-		regex re{ delim };
-		return vector<string>
-		{
-			sregex_token_iterator(in.begin(), in.end(), re, -1),
-				sregex_token_iterator()
-		};
-	}
-
-	catch (const std::exception& e)
-	{
-		cout << "error:" << e.what() << std::endl;
-	}
-
-	return ret;
+    vector<string> ret;
+
+    try
+    {
+        regex re{ delim };
+        return vector<string>
+        {
+            sregex_token_iterator(in.begin(), in.end(), re, -1),
+            sregex_token_iterator()
+        };
+    }
+
+    catch(const std::exception& e)
+    {
+        cout << "error:" << e.what() << std::endl;
+    }
+
+    return ret;
 }
 
 /*
@@ -329,28 +355,31 @@ vector<string> CLewaimaiString::Split(const string& in, const string& delim)
  **/
 int CLewaimaiString::Replace(std::wstring& strContent, std::wstring strReplace, std::wstring strDest, int nNum)
 {
-	int nCount = 0;
-	while (true)
-	{
-		size_t pos = strContent.find(strReplace);
-		if (pos != std::wstring::npos)
-		{
-			WCHAR pBuf[1] = { L'\0' };
-			strContent.replace(pos, strReplace.length(), pBuf, 0);
-			strContent.insert(pos, strDest);
-
-			nCount++;
-
-			if (nCount == nNum)
-			{
-				break;
-			}
-		}
-		else
-		{
-			break;
-		}
-	}
-
-	return 0;
+    int nCount = 0;
+
+    while(true)
+    {
+        size_t pos = strContent.find(strReplace);
+
+        if(pos != std::wstring::npos)
+        {
+            WCHAR pBuf[1] = { L'\0' };
+            strContent.replace(pos, strReplace.length(), pBuf, 0);
+            strContent.insert(pos, strDest);
+
+            nCount++;
+
+            if(nCount == nNum)
+            {
+                break;
+            }
+        }
+
+        else
+        {
+            break;
+        }
+    }
+
+    return 0;
 }

BIN
lewaimai_pos_windows/resource/lewaimai_pos_windows.aps


BIN
lewaimai_pos_windows/resource/lewaimai_pos_windows.rc


+ 14 - 0
lewaimai_pos_windows/wnd/CUpdateWnd.cpp

@@ -267,6 +267,13 @@ double CUpdateWnd::getDownloadFileLength(std::string url)
 
         // Only get the header data
         ret = curl_easy_setopt(easy_handle, CURLOPT_URL, url.c_str());
+
+		if (url.find("https://") == 0)
+		{
+			ret |= curl_easy_setopt(easy_handle, CURLOPT_SSL_VERIFYPEER, false);
+			ret |= curl_easy_setopt(easy_handle, CURLOPT_SSL_VERIFYHOST, false);
+		}
+		
         ret |= curl_easy_setopt(easy_handle, CURLOPT_HEADER, 1L);
         ret |= curl_easy_setopt(easy_handle, CURLOPT_NOBODY, 1L);
         ret |= curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, nousecb);    // libcurl_a.lib will return error code 23 without this sentence on windows
@@ -326,6 +333,13 @@ void CUpdateWnd::Run()
         m_outfile = fopen(m_filepath.c_str(), "ab+");
 
         curl_easy_setopt(m_curl, CURLOPT_URL, m_url.c_str());//在此要注意,此url必须是多字节
+
+		if (m_url.find("https://") == 0)
+		{
+			curl_easy_setopt(m_curl, CURLOPT_SSL_VERIFYPEER, false);
+			curl_easy_setopt(m_curl, CURLOPT_SSL_VERIFYHOST, false);
+		}
+		
         curl_easy_setopt(m_curl, CURLOPT_TIMEOUT, 0);
         curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, m_outfile);
         curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, my_write_func);