// checkupdate.cpp: implementation of the Ccheckupdate class. // ////////////////////////////////////////////////////////////////////// #include "GeoMative.h" #include "Constant.h" #include "checkupdate.h" #include "FileOperTools.h" #include #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// #define GEOMATIVE_FILE_TYPE 0x10 extern HHOOK hHook; extern LRESULT __stdcall CBTHookProc(long nCode, WPARAM wParam, LPARAM lParam); extern void SplitterString(CStringArray &szArray,const CString& szSource, const CString& szSplitter); extern BOOL GetSubStringInHeadAndTail(const CString& szSource, CString& szSub, const CString& szHead, const CString& szTail); extern int g_iUILanguage; extern CGeoMativeApp theApp; Ccheckupdate::Ccheckupdate() { nIndex = 0; buffer = NULL; m_pDevice = NULL; m_bIsCrulInitaled = false; m_vtDonwFileInfo.clear(); // m_strCurVerArray.RemoveAll(); // for (int i = 0; i < MAX_GD10_MODULE_CNT; i++) // { // m_strCurVerArray.Add(_T("NUL")); // } m_mapVerInfo.clear(); m_bIsNeedUpgGeomative = false; } Ccheckupdate::Ccheckupdate(CDevice *pDev) { m_pDevice = NULL; nIndex = 0; buffer = NULL; m_bIsCrulInitaled = false; m_vtDonwFileInfo.clear(); // m_strCurVerArray.RemoveAll(); m_pDevice = pDev; // for (int i = 0; i < MAX_GD10_MODULE_CNT; i++) // { // m_strCurVerArray.Add(_T("NUL")); // } m_mapVerInfo.clear(); m_bIsNeedUpgGeomative = false; // m_FileTransfer.InitalLogInfo(); } Ccheckupdate::~Ccheckupdate() { if (buffer) { delete []buffer; buffer = NULL; } } BOOL Ccheckupdate::checkGeoMaive() { BOOL bResult = FALSE; CString szGeoVersion; CString szGDTenVersion; szGeoVersion = GetGeoMativeVersion(); if( szGeoVersion == "NULL" ) { // hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); // ::AfxMessageBox("get geomative version failed,failed code is 00001"); return FALSE; } CString szVersionFile = "/GeomativeVersion.txt"; CString szHost = "218.17.161.7"; int nPort = 9520; if(RequestFileContent(szVersionFile,szHost,nPort) != HTTP_OK) { return FALSE; } CString szRequest = "GeoMativeVersion"; CString szRequestValue; szRequestValue = GetValue(szRequest); if(szGeoVersion == szRequestValue) { bResult = FALSE; } else { bResult = TRUE; } return bResult; } CString Ccheckupdate::GetGeoMativeVersion() { TCHAR szFullPath[MAX_PATH]; DWORD dwVerInfoSize = 0; DWORD dwVerHnd; VS_FIXEDFILEINFO * pFileInfo; CString strVersion = "NULL"; GetModuleFileName(NULL, szFullPath, sizeof(szFullPath)); dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd); if (dwVerInfoSize) { // If we were able to get the information, process it: HANDLE hMem; LPVOID lpvMem; unsigned int uInfoSize = 0; hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize); lpvMem = GlobalLock(hMem); if( !GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpvMem) ) { GetLastErrorEx(); return strVersion; } if( !::VerQueryValue(lpvMem, (LPTSTR)_T("\\"), (void**)&pFileInfo, &uInfoSize) ) { GetLastErrorEx(); return strVersion; } WORD m_nProdVersion[4]; // Product version from the FILEVERSION of the version info resource m_nProdVersion[0] = HIWORD(pFileInfo->dwProductVersionMS); m_nProdVersion[1] = LOWORD(pFileInfo->dwProductVersionMS); m_nProdVersion[2] = HIWORD(pFileInfo->dwProductVersionLS); m_nProdVersion[3] = LOWORD(pFileInfo->dwProductVersionLS); strVersion.Format(_T("%d.%d.%d.%d"),m_nProdVersion[0], m_nProdVersion[1],m_nProdVersion[2],m_nProdVersion[3]); GlobalUnlock(hMem); GlobalFree(hMem); } return strVersion; } void Ccheckupdate::GetLastErrorEx() { TCHAR szBuf[128]; LPVOID lpMsgBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); wsprintf(szBuf, _T("出错码:%d: %s"), dw, lpMsgBuf); hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); // AfxMessageBox(szBuf); LocalFree(lpMsgBuf); } BOOL Ccheckupdate::RequestFileContent(CString filename, CString host, int port) { AfxSocketInit(); CSocket psocket; //设置SOCKET并链接 if(!psocket.Create()) { char *szMsg = new char[1024]; memset(szMsg,0,1024); sprintf(szMsg, "ERROR:PLEASE CHECK INTERNET code: %d", psocket.GetLastError()); hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); MessageBoxEx(NULL, szMsg, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); delete szMsg; return FALSE; } psocket.Connect(host,port); //设置请求报头并发送 CString strSend; CString szVersionFile; szVersionFile = filename; strSend = "GET " + filename + " HTTP/1.1\r\n"; strSend += "Host: " + host + "\r\n"; strSend += "Accept: */*\r\n"; strSend += "Pragma: no-cache\r\n"; strSend += "Cache-Control: no-cache\r\n"; strSend += "Connection: close\r\n"; strSend += "\r\n"; if (!psocket.Send(strSend.GetBuffer(0), strSend.GetLength())) { char *szSendMsg = new char[1024]; memset(szSendMsg,0,1024); sprintf(szSendMsg, "ERROR:PLEASE CHECK INTERNET code: %d", psocket.GetLastError()); hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); MessageBoxEx(NULL, szSendMsg, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); delete szSendMsg; return FALSE; } strSend.ReleaseBuffer(); //接受GeomativeVersion文件的内容并保存到BUFF中 int nReadCount; char *cReadBuff = new char[1026]; memset(cReadBuff,0,1025); CString szHeader; nReadCount = psocket.Receive(cReadBuff,1025); if(nReadCount == -1) { char *szRecvMsg = new char[1024]; memset(szRecvMsg,0,1024); sprintf(szRecvMsg, "ERROR:PLEASE CHECK INTERNET code: %d", psocket.GetLastError()); hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); MessageBoxEx(NULL, szRecvMsg, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); delete szRecvMsg; return FALSE; } szHeader.Format("%s",cReadBuff); long int ContentLength; switch ( GetInfo(szHeader, &ContentLength) ) { case HTTP_OK: break; case HTTP_REDIRECT: hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); // ::AfxMessageBox("connect has been REDIRECT"); case HTTP_FAIL: hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); MessageBoxEx(NULL, _T("Connect TIMEOUT"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); default: return FALSE; } //分析报头并将数据保存到成员变量中 CString szOutHeader = szHeader; int nFileSize;//接收到的文件大小 int nHeadLength; nFileSize = 0; nHeadLength = GetHeadLength(szOutHeader.GetBuffer(0)); szOutHeader.ReleaseBuffer(); nFileSize = nReadCount - nHeadLength;//数据体的长度 buffer = new char[ContentLength + 1]; memset(buffer,0,ContentLength + 1); memcpy(buffer,cReadBuff+nHeadLength,nFileSize); delete cReadBuff; int nOnceRead; nOnceRead = 0; while (1) { if(nFileSize == ContentLength) break; nOnceRead = psocket.Receive(buffer+nFileSize,1024); if(nOnceRead == -1) { hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); // ::AfxMessageBox("链接丢失"); break; } nFileSize += nOnceRead; } psocket.Close(); return HTTP_OK; } UINT Ccheckupdate::GetInfo(LPCTSTR lpszHeader, long int *FileLength) { CString strHeader = lpszHeader; strHeader.MakeLower(); int nPos = strHeader.Find("\r\n"); if (nPos == -1) return HTTP_FAIL; CString strFirstLine = strHeader.Left(nPos); // 获得返回码: Status Code DWORD dwStatusCode; strFirstLine.TrimLeft(); strFirstLine.TrimRight(); nPos = strFirstLine.Find(' '); if( nPos == -1 ) return HTTP_FAIL; strFirstLine = strFirstLine.Mid(nPos+1); nPos = strFirstLine.Find(' '); if( nPos == -1 ) return HTTP_FAIL; strFirstLine = strFirstLine.Left(nPos); dwStatusCode = (DWORD)_ttoi((LPCTSTR)strFirstLine); if( dwStatusCode >= 300 && dwStatusCode < 400 ) { return HTTP_REDIRECT; } if( dwStatusCode >= 500 ) return HTTP_ERROR; // 客户端错误,重试无用 if( dwStatusCode >=400 && dwStatusCode <500 ) return HTTP_FAIL; // 获取ContentLength nPos = strHeader.Find("content-length:"); if (nPos == -1) return HTTP_FAIL; CString strDownFileLen = strHeader.Mid(nPos + strlen("content-length:")); nPos = strDownFileLen.Find("\r\n"); if (nPos == -1) return HTTP_FAIL; strDownFileLen = strDownFileLen.Left(nPos); strDownFileLen.TrimLeft(); strDownFileLen.TrimRight(); *FileLength = (DWORD) _ttoi( (LPCTSTR)strDownFileLen ); // m_ContentLength = (DWORD) _ttoi( (LPCTSTR)strDownFileLen ); return HTTP_OK; } int Ccheckupdate::GetHeadLength(char *lpData) { //...得到Head串的长度,遇到空行停止 int ndx = 0; CString str; while(1) { str.Empty(); str = GetLine(lpData, ndx); if(str.IsEmpty()) break; } return (ndx); } CString Ccheckupdate::GetLine(char *lpData, int &ndx) { BOOL bLine = FALSE; CString str; while ( bLine == FALSE && ndx < 1025 ) { char ch = (char)(lpData[ndx]); switch( ch ) { case '\r': // ignore break; case '\n': // end-of-line bLine = TRUE; break; default: // other.... str += ch; break; } ++ndx; } return str; } CString Ccheckupdate::GetValue(CString val) { int nIdex; nIdex = 0; CString szLine = "NULL"; while(1) { szLine.Empty(); szLine = GetLine(buffer, nIdex); if (szLine.Left(szLine.Find(':')) == val) { szLine = szLine.Right(szLine.GetLength() - szLine.ReverseFind(':') - 1); return szLine; } else if(szLine == "end") return szLine; } return szLine; } bool Ccheckupdate::UpdateAppToDev() { int i = 0; CString szOrder = _T(""); CString strErrInfo = _T(""); CString strResBuffer = _T(""); for (; i < m_vtDonwFileInfo.size(); i++) { if (EN_APP_MODULE == m_vtDonwFileInfo[i].FileType) { if (false == m_vtDonwFileInfo[i].bIsCompatible) { strErrInfo.Empty(); if (LANG_ZHCN == g_iUILanguage) { strErrInfo.Format(_T("新版本(版本号:%s, 名称:%s) 和设备中的硬件版本不匹配!"), m_vtDonwFileInfo[i].strNewVer, m_vtDonwFileInfo[i].strFileName); AfxMessageBox(strErrInfo); } else { strErrInfo.Format(_T("New version(ver:%s, name:%s) is not match with version of hardware in device!"), m_vtDonwFileInfo[i].strNewVer, m_vtDonwFileInfo[i].strFileName); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } m_bIsNeedUpgGeomative = false; return true; } //下载附加文件列表 for (int j = 0; j < m_vtDonwFileInfo[i].vtAddtionalFile.size(); j++) { szOrder.Empty(); szOrder.Format(_T("rm(\"/SD/%s\")\r\n"),m_vtDonwFileInfo[i].vtAddtionalFile[j]); if (!m_pDevice->ExecuteOrder(szOrder, ">", &strResBuffer)) { strErrInfo.Empty(); strErrInfo.Format(_T("Excute remove %s failed!!!"), m_vtDonwFileInfo[i].vtAddtionalFile[j]); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (!m_pDevice->SendFile(_T("/SD/"), _T(".\\firmware\\"), m_vtDonwFileInfo[i].vtAddtionalFile[j])) { strErrInfo.Empty(); strErrInfo.Format(_T("Send file %s failed!!!"), m_vtDonwFileInfo[i].vtAddtionalFile[j]); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } } break; } } if (i == m_vtDonwFileInfo.size()) { return true; } //刷固件: if(!MakeSureDirectoryPathExists(_T(".\\tools\\"))) { hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("工具文件已经丢失,请联系管理员.")); else MessageBoxEx(NULL, _T("Tools file had been miss please contact admimnistrator"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } CString szFolderName = "tools"; CString szFilePath = ".//"; CString szBatPath; szOrder.Empty(); szOrder = "isp()\r\n"; if (!m_pDevice->m_sComPort.ExecuteNoResOrder(szOrder)) { hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); MessageBoxEx(NULL, _T("Send update device cmd failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } Sleep(5000); char cReadBuff[1024]; int nLength = 0; memset(cReadBuff, 0, 1024); m_pDevice->m_sComPort.ReceiveDataDirectly(cReadBuff, &nLength); //判断是否电量低 if (nLength != 0) { CString strRcv = cReadBuff; //当找到Low字符时,认为此时的电量不足 if (strRcv.Find("Low") != -1) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("电量太低,请先充电.")); else MessageBoxEx(NULL, _T("Bettery is low, please charge"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } } szBatPath = ".\\tools\\IAP-GD20.bat"; PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo; //入口参数 ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.dwFlags = STARTF_USESHOWWINDOW; StartupInfo.wShowWindow = SW_SHOW; StartupInfo.cb = sizeof StartupInfo; //分配大小 unsigned long nTime = 0; if(CreateProcess(szBatPath, NULL,NULL,NULL,FALSE,0,NULL,NULL,&StartupInfo,&ProcessInfo)) { int nAbandondeCount = 0; int nTimeoutCount = 0; while(TRUE) { switch(WaitForSingleObject(ProcessInfo.hProcess,500)) { case WAIT_ABANDONED: nTime += 500; if (nAbandondeCount++ > 200) { CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); return false; } break; case WAIT_TIMEOUT: nTime += 500; if (nTimeoutCount++ > 900) { CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); return false; } break; case WAIT_OBJECT_0: CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); if (nTime < 10000) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("设备更新失败,请检查操作系统环境.")); else MessageBoxEx(NULL, _T("Device upData failed, please check operation system environment"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } return true; } } } return true; } bool Ccheckupdate::UpdateGD10Dev() { CString strIniFile = _T("firmware\\firmware_version_info.ini"); if (false == CFileOperTools::GetInstance()->IsFileExist(strIniFile)) { MessageBoxEx(NULL, _T("Update device software failed because of firmware_version_info.ini can't be found!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } for (int i = 0; i < m_vtDonwFileInfo.size(); i++) { m_vtDonwFileInfo[i].bIsCompatible = CheckHwSwCompatible(m_vtDonwFileInfo[i].FileType, m_vtDonwFileInfo[i].strNewVer, strIniFile); if (false == m_vtDonwFileInfo[i].bIsCompatible) { CString strErr = _T(""); if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("更新主机设备软件失败: 新版本(%s)和设备里的硬件版本不兼容!"), m_vtDonwFileInfo[i].strFileName); AfxMessageBox(strErr); } else { strErr.Format(_T("Faild to upgrade mainframe: new version\r\nsoftware(%s) is not compatible to hardware\r\nof mainframe!"), m_vtDonwFileInfo[i].strFileName); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } } if (!UpdateFunctionBoard()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("升级功能板失败!")); else MessageBoxEx(NULL, _T("Upgrade function board failed!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (!UpdateAppToDev()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("升级设备APP失败!")); else MessageBoxEx(NULL, _T("Upgrade App to device failed!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } return true; } BOOL Ccheckupdate::FindFolder(CString Foldername, CString FindFolderName) { CFileFind tempFind; BOOL bFound; bFound=tempFind.FindFile(Foldername+ "\\*.*"); int nPos = FindFolderName.ReverseFind('/'); if (nPos != -1) { FindFolderName = FindFolderName.Right(FindFolderName.GetLength() - nPos -1); } CString strTmp; while(bFound) { bFound=tempFind.FindNextFile(); if(tempFind.IsDots()) continue; // if(tempFind.IsDirectory()) // { strTmp.Empty(); strTmp = tempFind.GetFileName(); if (strTmp == FindFolderName) { strTmp.Empty(); strTmp=tempFind.GetFilePath(); m_szPath = strTmp; return TRUE; } // } // else // { // continue; // } } strTmp.Empty(); strTmp=tempFind.GetFilePath(); strTmp = strTmp.Left(strTmp.ReverseFind('\\') + 1); m_szPath = strTmp; tempFind.Close(); return FALSE; } CString Ccheckupdate::GetPath() { CString szFileName; szFileName = GetLine(buffer,nIndex); return szFileName; } bool Ccheckupdate::DownLoadFileList() { if (!m_bIsCrulInitaled) { if (!m_FileTransfer.Inital()) { MessageBoxEx(NULL, _T("FileTransfer Initail Failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } m_bIsCrulInitaled = true; } //http://218.17.161.7:9520/liushq/GD10_FileList.ini //http://192.168.1.110:8080/liushq CString strUrl = _T(""); strUrl.Format(_T("%sGD10_FileList.txt"),theApp.m_strUpgUrl); m_FileTransfer.SetOption(OPT_URL_ADDRESS, strUrl); m_FileTransfer.SetOption(OPT_DOWNLOAD_PATH, ".\\updates\\"); m_FileTransfer.SetOption(OPT_DOWNLOAD_NAME, "GD10_FileList.ini"); m_FileTransfer.SetOption(OPT_TIMEOUT, "30"); m_FileTransfer.SetOption(OPT_NEED_PROGRESS, "", false); return m_FileTransfer.DownloadFile(); } int Ccheckupdate::StartUpdateSoft() { CString strFolderInfo = ".\\updates\\"; //首先检查是否创建用于存放更新文件的文件夹 if(!MakeSureDirectoryPathExists(strFolderInfo.GetBuffer(0))) { CString strShow = _T(""); strShow.Format(_T("Create folder updats failed! errorcode = %d"), GetLastError()); MessageBoxEx(NULL, strShow.GetBuffer(0), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return enUpdateFail; } if (!GetGDVersionInfo()) { return enUpdateFail; } //下载兼容文件 if (!DownLoadGD10CompatVerFile()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("下载兼容版本配置文件失败!")); else MessageBoxEx(NULL, _T("Download device compatable-version file Failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return enUpdateFail; } //下载FileList.ini文件 if (!DownLoadFileList()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("下载配置文件失败!")); else MessageBoxEx(NULL, _T("Download FileList Failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return enUpdateFail; } //解析文件 if (!ParserFileList()) { MessageBoxEx(NULL, _T("Parser FileList Failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); m_vtDonwFileInfo.clear(); return enUpdateFail; } if (m_vtDonwFileInfo.empty()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("主机设备软件已经是最新版本,不需要进行升级!")); else MessageBoxEx(NULL, _T("Now GD_10 is the newest version, don't need to update!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return enNoNeedUpdate; } if (!DownLoadUpdateFiles()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("下载文件失败!")); else MessageBoxEx(NULL, _T("Download File Failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); // DeleteDownloadFile(_T(".\\updates")); // m_bIsUpdating = false; // m_bIsStartUpdate = false; return enUpdateFail; } if (!UpdateFiles()) { // GetDlgItem(IDC_TITLE)->SetWindowText(_T("Update File Failed!!!")); // m_bIsUpdating = false; // m_bIsStartUpdate = false; // DeleteDownloadFile(_T(".\\updates")); return enUpdateFail; } DeleteDownloadFile(_T(".\\updates")); // m_bIsUpdating = false; // m_bIsStartUpdate = false; // GetDlgItem(IDC_TITLE)->SetWindowText(_T("update complete...")); // AfxMessageBox(_T("update file complete")); return enUpdateSucc; } //在调用此函数之前一定要确保GD10_FileList.ini已经下载下来了 bool Ccheckupdate::ParserFileList() { m_bIsNeedUpgGeomative = false; CString strFileName = _T(".\\updates\\GD10_FileList.ini"); char chBuf[MAX_PATH]; UINT unFileCount = GetPrivateProfileInt("FileUpdateInfo", "FileCount", 255, strFileName); CString strTmp = _T(""); if (255 == unFileCount) { MessageBoxEx(NULL, _T("Get updates fileinfo number failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); // strTmp.Format(_T("[%d] Get updates fileinfo number failed, filecount = %d, version = %s, errorno= %d"), __LINE__, // unFileCount, m_strNewVersion.GetBuffer(0), GetLastError()); // PrintLog(strTmp); return false; } m_vtDonwFileInfo.clear(); CString strVersion = _T(""); for (int i = 0; i < unFileCount; i++) { STDownFileInfo stFileInfo; CString strSection = _T(""); strVersion.Empty(); strSection.Format(_T("FileInfo%d"), i+1); memset(chBuf, 0, sizeof(chBuf)); GetPrivateProfileString(strSection, _T("Version"), _T("NULL"), chBuf, MAX_PATH, strFileName); strVersion = chBuf; if (0 == strVersion.Compare(_T("NULL"))) { strTmp.Empty(); strTmp.Format(_T("Get version in %s failed!"), strSection); MessageBoxEx(NULL, strTmp, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } memset(chBuf, 0, sizeof(chBuf)); GetPrivateProfileString(strSection, "FileName", "NULL", chBuf, MAX_PATH, strFileName); stFileInfo.strFileName = chBuf; stFileInfo.FileType = GetPrivateProfileInt(strSection, "FileType", 255, strFileName); if (0 == stFileInfo.strFileName.Compare("NULL")) { strTmp.Empty(); strTmp.Format(_T("Get FileName in %s failed!"), strSection); MessageBoxEx(NULL, strTmp, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (255 == stFileInfo.FileType) { strTmp.Empty(); strTmp.Format(_T("Get Filetype in %s failed!"), strSection); MessageBoxEx(NULL, strTmp, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } //如果这里又配套的需要更新的Geomative的话 if (GEOMATIVE_FILE_TYPE == stFileInfo.FileType) { m_bIsNeedUpgGeomative = true; continue; } //首先找到相应的硬件标示,标示匹配后在比较版本号 std::map::iterator iter = m_mapVerInfo.find(stFileInfo.FileType); if (iter != m_mapVerInfo.end()) { //删除左右两边的空格 strVersion.TrimLeft(); strVersion.TrimRight(); if (strVersion.GetLength() != iter->second.strSWVer.GetLength()) { strTmp.Empty(); strTmp.Format(_T("The format of Version in %s is error!"), strSection); MessageBoxEx(NULL, strTmp, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } //如果版本不匹配,则加入到下载文件列表中去 if (0 == strVersion.Compare(iter->second.strSWVer)) { continue; } stFileInfo.strNewVer = strVersion; stFileInfo.bIsCompatible = false; int nAdditinalFileCnt = GetPrivateProfileInt(strSection, "AddtionalFileCnt", 255, strFileName); //如果存在附加文件列表,则将文件列表信息加入到下载信息中去 if (255 != nAdditinalFileCnt) { CString strAddFileIndex = _T(""),strAddFileName = _T(""); stFileInfo.vtAddtionalFile.clear(); for (int nAddFileIndex = 1; nAddFileIndex <= nAdditinalFileCnt; nAddFileIndex++) { strAddFileIndex.Empty(); strAddFileName.Empty(); strAddFileIndex.Format(_T("AddtionalFile%d"),nAddFileIndex); memset(chBuf, 0, sizeof(chBuf)); GetPrivateProfileString(strSection, strAddFileIndex, _T("NULL"), chBuf, MAX_PATH, strFileName); strAddFileName = chBuf; if (0 != strAddFileName.Compare(_T("NULL"))) { stFileInfo.vtAddtionalFile.push_back(strAddFileName); } } } m_vtDonwFileInfo.push_back(stFileInfo); } } return true; } bool Ccheckupdate::DownLoadUpdateFiles() { if (!m_bIsCrulInitaled) { if (!m_FileTransfer.Inital()) { MessageBoxEx(NULL, _T("FileTransfer Initail Failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } m_bIsCrulInitaled = true; } m_FileTransfer.SetOption(OPT_TIMEOUT, "180"); m_FileTransfer.SetOption(OPT_NEED_PROGRESS, "", false); m_FileTransfer.SetOption(OPT_DOWNLOAD_PATH, ".\\updates\\"); for (int i = 0; i < m_vtDonwFileInfo.size(); i++) { // m_bIsUpdating = true; m_FileTransfer.SetOption(OPT_DOWNLOAD_NAME, m_vtDonwFileInfo[i].strFileName); CString strUrl =_T(""); strUrl.Format(_T("%s%s"), theApp.m_strUpgUrl,m_vtDonwFileInfo[i].strFileName.GetBuffer(0)); m_FileTransfer.SetOption(OPT_URL_ADDRESS, strUrl); CString strTmp = _T(""); strTmp.Format(_T("Download %s, please wait..."),m_vtDonwFileInfo[i].strFileName.GetBuffer(0)); if (!m_FileTransfer.DownloadFile()) { strTmp.Empty(); if (LANG_ZHCN == g_iUILanguage) { strTmp.Format(_T("下载文件 %s 失败!"), m_vtDonwFileInfo[i].strFileName.GetBuffer(0)); AfxMessageBox(strTmp); } else { strTmp.Format(_T("DownLoad file %s failed!"), m_vtDonwFileInfo[i].strFileName.GetBuffer(0)); MessageBoxEx(NULL, strTmp, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } // strTmp.Format(_T("[%d] download file failed!, index = %d, url = %s"),__LINE__, i+1, strUrl.GetBuffer(0)); // PrintLog(strTmp); return false; } //下载附件文件 for (int j = 0; j < m_vtDonwFileInfo[i].vtAddtionalFile.size(); j++) { //将scr替换成txt CString strConverName = m_vtDonwFileInfo[i].vtAddtionalFile[j]; if (-1 != strConverName.Find(_T(".scr"))) { strConverName.Replace(_T(".scr"), _T(".txt")); } strUrl.Empty(); strUrl.Format(_T("%s%s"), theApp.m_strUpgUrl,strConverName); m_FileTransfer.SetOption(OPT_DOWNLOAD_NAME, m_vtDonwFileInfo[i].vtAddtionalFile[j]); m_FileTransfer.SetOption(OPT_URL_ADDRESS, strUrl); if (!m_FileTransfer.DownloadFile()) { strTmp.Empty(); if (LANG_ZHCN == g_iUILanguage) { strTmp.Format(_T("下载文件 %s 失败!"), m_vtDonwFileInfo[i].vtAddtionalFile[j]); AfxMessageBox(strTmp); } else { strTmp.Format(_T("DownLoad file %s failed!"), m_vtDonwFileInfo[i].vtAddtionalFile[j]); MessageBoxEx(NULL, strTmp, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } } // m_progrss.SetPos(100); // GetDlgItem(IDC_NUM)->SetWindowText("100%%"); } return true; } bool Ccheckupdate::UpdateFiles() { if(!MakeSureDirectoryPathExists(_T(".\\firmware\\"))) { CString strShow = _T(""); strShow.Format(_T("Create folder firmware failed! errorcode = %d"), GetLastError()); MessageBoxEx(NULL, strShow.GetBuffer(0), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } CString strSrcFile = _T(".\\updates\\firmware_version_info.ini"); CString strDstFile = _T(".\\firmware\\firmware_version_info.ini"); if (!CopyFile(strSrcFile.GetBuffer(0), strDstFile.GetBuffer(0), FALSE)) { CString strTmp =_T(""); strTmp.Format(_T("Copy file failed, src_file = %s ,dst_file = %s, errorno = %d"), strSrcFile, strDstFile, GetLastError()); MessageBoxEx(NULL, strTmp, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } for (int i = 0; i < m_vtDonwFileInfo.size(); i++) { strSrcFile.Empty(); strDstFile.Empty(); strSrcFile.Format(_T(".\\updates\\%s"), m_vtDonwFileInfo[i].strFileName); strDstFile.Format(_T(".\\firmware\\%s"), m_vtDonwFileInfo[i].strFileName); if (!CopyFile(strSrcFile.GetBuffer(0), strDstFile.GetBuffer(0), FALSE)) { CString strTmp =_T(""); strTmp.Format(_T("Copy file failed, src_file = %s ,dst_file = %s, errorno = %d"), strSrcFile.GetBuffer(0), strDstFile.GetBuffer(0), GetLastError()); MessageBoxEx(NULL, strTmp, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } for (int j = 0; j < m_vtDonwFileInfo[i].vtAddtionalFile.size(); j++) { strSrcFile.Empty(); strDstFile.Empty(); strSrcFile.Format(_T(".\\updates\\%s"), m_vtDonwFileInfo[i].vtAddtionalFile[j]); strDstFile.Format(_T(".\\firmware\\%s"), m_vtDonwFileInfo[i].vtAddtionalFile[j]); if (!CopyFile(strSrcFile.GetBuffer(0), strDstFile.GetBuffer(0), FALSE)) { CString strTmp =_T(""); strTmp.Format(_T("Copy file failed, src_file = %s ,dst_file = %s, errorno = %d"), strSrcFile.GetBuffer(0), strDstFile.GetBuffer(0), GetLastError()); MessageBoxEx(NULL, strTmp, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } } } return true; } bool Ccheckupdate::GetGDVersionInfo() { if (NULL == m_pDevice) { MessageBoxEx(NULL, _T("Device Ptr can not be NULL!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } CString strOrder = _T("version()\r\n"); CString strResBuffer = _T(""); if (!m_pDevice->ExecuteOrder(strOrder, ">", &strResBuffer)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("获取主机设备的版本信息失败!")); else MessageBoxEx(NULL, _T("Faild to get the version information of mainframe!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } CStringArray strTemp; strTemp.RemoveAll(); SplitterString(strTemp, strResBuffer, ";"); if (strTemp.GetSize() < 1) { MessageBoxEx(NULL, _T("Parser version information of mainframe error!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } m_mapVerInfo.clear(); int nPosComma = -1; //逗号的位置 int nPosColon = -1; //冒号的位置 int nSWPos = -1; //软件版本号SW字符的起始位置 int nHWPos = -1; //硬件版本号HW字符的起始位置 int nSWVerLen = 6; CString strInfo = _T(""); // BYTE ucFlag = 0; for (int i = 0; i < strTemp.GetSize(); i++) { //查找软件版本号,如果此时未能查找到软件版本号则直接跳转到下一个查询 nSWPos = strTemp[i].Find(_T("SW")); nHWPos = strTemp[i].Find(_T("HW")); if (-1 == nSWPos || -1 == nHWPos) { continue; } if (strTemp[i].GetLength() < (nSWPos + 6)) { strInfo.Format("Parser version info error,version = %s",strTemp[i]); MessageBoxEx(NULL, strInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } //取出硬件版本信息,在这里默认硬件的ID标示只有1位数字, //也就是HW1.0中的1,因此最多支持从0-9 int nHWID = atoi(strTemp[i].Mid(nHWPos+2,1)); if (nHWID < 0 || nHWID > 9) { strInfo.Format("Parser version's hardware info error,version = %s",strTemp[i]); MessageBoxEx(NULL, strInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } STFirmwareVerInfo stFWVer; stFWVer.strHWVer = strTemp[i].Mid(nHWPos+2,3); //在这里支持的软件版本的格式为SW1.2.01,也就是6位 strInfo.Empty(); stFWVer.strSWVer = strTemp[i].Mid(nSWPos+2,6); //将版本信息插入到map中去 m_mapVerInfo[nHWID] = stFWVer; /* strTemp[i].TrimRight();//删除右侧的空格 nPosComma = strTemp[i].Find(_T(",")); nPosColon = strTemp[i].Find(_T(":")); if (-1 == nPosColon) { continue; } strInfo.Empty(); strInfo = strTemp[i].Mid(nPosColon-3, 3); //在这里有一个基础依据就是如果存在着软件版本和硬件版本,软件版本和硬件用逗号隔开 //并且软件版本在逗号的左边,硬件版本在逗号的右边 int nCnt = (-1 == nPosComma) ? strTemp[i].GetLength()-nPosColon-1 : nPosComma-nPosColon-1; if (_T("APP") == strInfo) { m_strCurVerArray[EN_APP_MODULE] = strTemp[i].Mid(nPosColon+1, nCnt); ucFlag = ucFlag | 0x01; } else if (_T("TXB") == strInfo) { m_strCurVerArray[EN_TXB_MODULE] = strTemp[i].Mid(nPosColon+1, nCnt); ucFlag = ucFlag | 0x02; } else if (_T("RXB") == strInfo) { m_strCurVerArray[EN_RXB_MODULE] = strTemp[i].Mid(nPosColon+1, nCnt); ucFlag = ucFlag | 0x04; } else continue; */ } //判断三个版本信息是不是都获取到了 if (m_mapVerInfo.size() < 3) { MessageBoxEx(NULL, _T("Can not get all gd20 modules's version!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } return true; } bool Ccheckupdate::UpdateFunctionBoard() { //_T(".\\firmware\\%s"), CString strFuncFileInfo = _T(""); CString strOrder = _T(""); CString strResBuffer = _T(""); CString strResult = _T(""); CString strErrInfo = _T(""); CString strUpgCmd = _T(""); int nWaitTimes = 12000; for (int i = 0; i < m_vtDonwFileInfo.size(); i++) { strUpgCmd.Empty(); switch (m_vtDonwFileInfo[i].FileType) { case EN_APP_MODULE: continue; case EN_TXB_MODULE: strUpgCmd = _T("upgrade(\"TXB\")\r\n"); break; case EN_RXB_MODULE: strUpgCmd = _T("upgrade(\"RXB\")\r\n"); break; case EN_CBL_MODULE: strUpgCmd = _T("iapcable()"); break; default: strErrInfo.Empty(); strErrInfo.Format(_T("Not support hardware type(%d)!"),m_vtDonwFileInfo[i].FileType); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); continue; } if (false == m_vtDonwFileInfo[i].bIsCompatible) { strErrInfo.Empty(); if (LANG_ZHCN == g_iUILanguage) { strErrInfo.Format(_T("新版本软件(版本号:%s, 名称:%s) 和设备上的硬件版本不兼容!"), m_vtDonwFileInfo[i].strNewVer, m_vtDonwFileInfo[i].strFileName); AfxMessageBox(strErrInfo); } else { strErrInfo.Format(_T("New version(ver:%s, name:%s) is not match with version of hardware in device!"), m_vtDonwFileInfo[i].strNewVer, m_vtDonwFileInfo[i].strFileName); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } continue; } //先下载附件文件 for (int j = 0; j < m_vtDonwFileInfo[i].vtAddtionalFile.size(); j++) { strOrder.Empty(); strOrder.Format(_T("rm(\"/SD/%s\")\r\n"),m_vtDonwFileInfo[i].vtAddtionalFile[j]); if (!m_pDevice->ExecuteOrder(strOrder, ">", &strResBuffer)) { strErrInfo.Empty(); strErrInfo.Format(_T("Excute remove %s failed!!!"), m_vtDonwFileInfo[i].vtAddtionalFile[j]); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (!m_pDevice->SendFile(_T("/SD/"), _T(".\\firmware\\"), m_vtDonwFileInfo[i].vtAddtionalFile[j])) { strErrInfo.Empty(); strErrInfo.Format(_T("Send file %s failed!!!"),m_vtDonwFileInfo[i].vtAddtionalFile[j]); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } } strFuncFileInfo.Empty(); strOrder.Empty(); strResBuffer.Empty(); strOrder.Format(_T("rm(\"/SD/%s\")\r\n"),m_vtDonwFileInfo[i].strFileName); if (!m_pDevice->ExecuteOrder(strOrder, ">", &strResBuffer)) { strErrInfo.Empty(); strErrInfo.Format(_T("Excute remove %s failed!!!"), m_vtDonwFileInfo[i].strFileName); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (!m_pDevice->SendFile(_T("/SD/"), _T(".\\firmware\\"), m_vtDonwFileInfo[i].strFileName)) { strErrInfo.Empty(); strErrInfo.Format(_T("Send file %s failed!!!"),m_vtDonwFileInfo[i].strFileName); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } strResBuffer.Empty(); strResult.Empty(); if (!m_pDevice->ExecuteOrder(strUpgCmd, ">", &strResBuffer,3,nWaitTimes)) { strErrInfo.Empty(); strErrInfo.Format(_T("Excute upgrade %s failed,please restart your gd-20 device and retry it!"),m_vtDonwFileInfo[i].strFileName); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (-1 == strResBuffer.Find(_T("]"))) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("该设备不支持升级功能,请检查主机设备版本信息!")); else MessageBoxEx(NULL, _T("Upgrade function is not supported in device, please check your gd-20 version!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); CString strErrShow = _T(""); strErrShow.Format(_T("[Ccheckupdate][%d]Upgrade function is not supported in device,return info = %s"),__LINE__,strResBuffer); CFileOperTools::GetInstance()->WriteComLog(strErrShow); return false; } GetSubStringInHeadAndTail(strResBuffer, strResult, _T("["), _T("]")); if (_T("1") != strResult) { strErrInfo.Empty(); strErrInfo.Format(_T("Upgrade %s to function board failed!!!"),m_vtDonwFileInfo[i].strFileName); MessageBoxEx(NULL, strErrInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } } return true; } void Ccheckupdate::DeleteDownloadFile(CString strPath) { CString strFileName = _T(""); strFileName.Format(_T("%s\\firmware_version_info.ini"),strPath); DeleteFile(strFileName); strFileName.Empty(); strFileName.Format(_T("%s\\GD10_FileList.ini"),strPath); DeleteFile(strFileName); for (int i = 0; i < m_vtDonwFileInfo.size(); i++) { strFileName.Empty(); strFileName.Format(_T("%s\\%s"),strPath,m_vtDonwFileInfo[i].strFileName); DeleteFile(strFileName); for (int j = 0; j < m_vtDonwFileInfo[i].vtAddtionalFile.size(); j++) { strFileName.Empty(); strFileName.Format(_T("%s\\%s"),strPath,m_vtDonwFileInfo[i].vtAddtionalFile[j]); DeleteFile(strFileName); } } } bool Ccheckupdate::CheckHwSwCompatible(int iCompHWType, CString strCompSWVer,CString strFileName) { char chBuf[MAX_PATH]; memset(chBuf, 0, sizeof(chBuf)); CString strInfo = _T(""); CString strText = _T(""); UINT unFWCnt = GetPrivateProfileInt(_T("FirmwareInfo"), _T("FirmwareCount"), 255, strFileName); if (255 == unFWCnt) { MessageBoxEx(NULL, _T("Parser firmware_version_info info error!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } for (int i = 1; i <= unFWCnt; i++) { CString strIndex = _T(""); strIndex.Format(_T("Firmware%d"),i); int iHWType = GetPrivateProfileInt(strIndex, _T("HW_Type"), 255, strFileName); if (255 == iHWType) { strText.Empty(); strText.Format(_T("Parser HWtype error in %s!"),strIndex); MessageBoxEx(NULL, strText, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } //首先查找是否下载了硬件相应的驱动,下载了的话则检查兼容性 if (iCompHWType != iHWType) { continue; } int iHwVerCnt = GetPrivateProfileInt(strIndex, _T("HW_Version_Count"), 255, strFileName); if (255 == iHwVerCnt) { strText.Empty(); strText.Format(_T("Parser HW_Version_Count error in %s!"),strIndex); MessageBoxEx(NULL, strText, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } std::map::iterator iter = m_mapVerInfo.find(iHWType); if (iter == m_mapVerInfo.end()) { strText.Empty(); strText.Format(_T("HWType(%d) in %s is not found in gd20's verion infomation!"),iHWType, strIndex); MessageBoxEx(NULL, strText, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } CString strHWVerInfo = _T(""); CString strVerIndex = _T(""); CString strSWInfo = _T(""); //首先用GD10现有的硬件版本号去版本适配文件中查找,如果找到,则对比软件版本号是否匹配 for (int iHWVerIndx = 1; iHWVerIndx <= iHwVerCnt; iHWVerIndx++) { strVerIndex.Empty(); strHWVerInfo.Empty(); strVerIndex.Format(_T("HW_Version%d"), iHWVerIndx); memset(chBuf, 0, sizeof(chBuf)); GetPrivateProfileString(strIndex, strVerIndex, _T("NULL"), chBuf, MAX_PATH, strFileName); strHWVerInfo = chBuf; if (0 == strHWVerInfo.Compare(_T("NULL"))) { strText.Empty(); strText.Format(_T("Get %s in %s failed!"), strVerIndex, strIndex); MessageBoxEx(NULL, strText, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (0 == strHWVerInfo.Compare(iter->second.strHWVer)) { strVerIndex.Empty(); strSWInfo.Empty(); strVerIndex.Format(_T("HW_Version%d_Adapter_SW"), iHWVerIndx); memset(chBuf, 0, sizeof(chBuf)); GetPrivateProfileString(strIndex, strVerIndex, _T("NULL"), chBuf, MAX_PATH, strFileName); strSWInfo = chBuf; if (0 == strSWInfo.Compare(_T("NULL"))) { strText.Empty(); strText.Format(_T("Get %s in %s failed!"), strVerIndex, strIndex); MessageBoxEx(NULL, strText, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (CheckSWVerIsCompatibale(strSWInfo, strCompSWVer)) { return true; } return false; } } return false; } return false; } bool Ccheckupdate::CheckSWVerIsCompatibale(CString strAdapaterVer, CString strSWver) { if (strAdapaterVer.IsEmpty() || strSWver.IsEmpty()) { MessageBoxEx(NULL, _T("Neither adapaterVer nor comparedVer can be empty!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } CStringArray strVerArr; strVerArr.RemoveAll(); SplitterString(strVerArr, strAdapaterVer, _T(",")); CString strText = _T(""); if (strVerArr.GetSize() < 1) { strText.Format(_T("Parser adapater version info error!version context = %s"), strAdapaterVer); MessageBoxEx(NULL, strText, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } CString strVal = _T(""); strSWver.Remove(_T('.')); int iCompareVer = atoi(strSWver); for (int i = 0; i < strVerArr.GetSize(); i++) { strVal.Empty(); strVal = strVerArr.GetAt(i); strVal.TrimLeft(); strVal.TrimRight(); if (-1 != strVal.Find(_T("-"))) { CStringArray strArrVerRanger; strArrVerRanger.RemoveAll(); SplitterString(strArrVerRanger, strVal, _T("-")); if (2 != strArrVerRanger.GetSize()) { strText.Empty(); strText.Format(_T("Parser separative sign error! conteng = %s"), strVal); MessageBoxEx(NULL, strText, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } int iMinVer = 0, iMaxVer = 0; CString strTmp = _T(""); strTmp = strArrVerRanger.GetAt(0); strTmp.Remove(_T('.')); iMinVer = atoi(strTmp); strTmp.Empty(); strTmp = strArrVerRanger.GetAt(1); strTmp.Remove(_T('.')); iMaxVer = atoi(strTmp); //如果最小版本大于最大版本则提示错误 if (iMinVer > iMaxVer) { strText.Empty(); strText.Format(_T("compatiable version info disorder! content = %s"),strVal); return false; } if (iCompareVer>= iMinVer && iCompareVer <= iMaxVer) { return true; } continue; } strVal.Remove(_T('.')); if (atoi(strVal) == iCompareVer) { return true; } } return false; } bool Ccheckupdate::DownLoadGD10CompatVerFile() { if (!m_bIsCrulInitaled) { if (!m_FileTransfer.Inital()) { MessageBoxEx(NULL, _T("FileTransfer Initail Failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } m_bIsCrulInitaled = true; } //http://218.17.161.7:9520/liushq/GD10_FileList.ini //http://192.168.1.110:8080/liushq CString strUrl; strUrl.Format(_T("%sfirmware_version_info.txt"),theApp.m_strUpgUrl); m_FileTransfer.SetOption(OPT_URL_ADDRESS, strUrl); m_FileTransfer.SetOption(OPT_DOWNLOAD_PATH, ".\\updates\\"); m_FileTransfer.SetOption(OPT_DOWNLOAD_NAME, "firmware_version_info.ini"); m_FileTransfer.SetOption(OPT_TIMEOUT, "30"); m_FileTransfer.SetOption(OPT_NEED_PROGRESS, "", false); return m_FileTransfer.DownloadFile(); }