void CCheckForUpdatesDlg::FillDownloads(CAutoConfig& versioncheck, const CString version) { #if WIN64 const CString x86x64 = _T("64"); #else const CString x86x64 = _T("32"); #endif versioncheck.GetString(_T("tortoisegit.baseurl"), m_sFilesURL); if (m_sFilesURL.IsEmpty()) m_sFilesURL.Format(_T("http://updater.download.tortoisegit.org/tgit/%s/"), (LPCTSTR)version); bool isHotfix = false; versioncheck.GetBool(_T("tortoisegit.hotfix"), isHotfix); if (isHotfix) m_ctrlFiles.InsertItem(0, _T("TortoiseGit Hotfix")); else m_ctrlFiles.InsertItem(0, _T("TortoiseGit")); CString filenameMain, filenamePattern; versioncheck.GetString(_T("tortoisegit.mainfilename"), filenamePattern); if (filenamePattern.IsEmpty()) filenamePattern = _T("TortoiseGit-%1!s!-%2!s!bit.msi"); filenameMain.FormatMessage(filenamePattern, version, x86x64); m_ctrlFiles.SetItemData(0, (DWORD_PTR)(new CUpdateListCtrl::Entry(filenameMain, CUpdateListCtrl::STATUS_NONE))); m_ctrlFiles.SetCheck(0 , TRUE); if (isHotfix) { DialogEnableWindow(IDC_BUTTON_UPDATE, TRUE); return; } struct LangPack { CString m_PackName; CString m_LangName; DWORD m_LocaleID; CString m_LangCode; bool m_Installed; }; struct LanguagePacks { std::vector<LangPack> availableLangs; std::vector<DWORD> installedLangs; } languagePacks; { // set up the language selecting combobox CString path = CPathUtils::GetAppParentDirectory(); path = path + _T("Languages\\"); CSimpleFileFind finder(path, _T("*.dll")); while (finder.FindNextFileNoDirectories()) { CString file = finder.GetFilePath(); CString filename = finder.GetFileName(); if (filename.Left(12).CompareNoCase(_T("TortoiseProc")) == 0) { CString sVer = _T(STRPRODUCTVER); sVer = sVer.Left(sVer.ReverseFind('.')); CString sFileVer = CPathUtils::GetVersionFromFile(file); sFileVer = sFileVer.Left(sFileVer.ReverseFind('.')); CString sLoc = filename.Mid(12); sLoc = sLoc.Left(sLoc.GetLength() - 4); // cut off ".dll" if ((sLoc.Left(2) == L"32") && (sLoc.GetLength() > 5)) continue; DWORD loc = _tstoi(filename.Mid(12)); languagePacks.installedLangs.push_back(loc); } } } git_config_get_multivar_foreach(versioncheck, "tortoisegit.langs", nullptr, [](const git_config_entry* configentry, void* payload) -> int { LanguagePacks* languagePacks = (LanguagePacks*)payload; CString langs = CUnicodeUtils::GetUnicode(configentry->value); int nextTokenPos = langs.Find(_T(";"), 5); // be extensible for the future if (nextTokenPos > 0) langs = langs.Left(nextTokenPos); CString sLang = _T("TortoiseGit Language Pack ") + langs.Mid(5); DWORD loc = _tstoi(langs.Mid(0, 4)); TCHAR buf[MAX_PATH] = { 0 }; GetLocaleInfo(loc, LOCALE_SNATIVELANGNAME, buf, _countof(buf)); CString sLang2(buf); GetLocaleInfo(loc, LOCALE_SNATIVECTRYNAME, buf, _countof(buf)); if (buf[0]) { sLang2 += _T(" ("); sLang2 += buf; sLang2 += _T(")"); } bool installed = std::find(languagePacks->installedLangs.cbegin(), languagePacks->installedLangs.cend(), loc) != languagePacks->installedLangs.cend(); LangPack pack = { sLang, sLang2, loc, langs.Mid(5), installed }; languagePacks->availableLangs.push_back(pack); return 0; }, &languagePacks); std::stable_sort(languagePacks.availableLangs.begin(), languagePacks.availableLangs.end(), [&](const LangPack& a, const LangPack& b) -> int { return (a.m_Installed && !b.m_Installed) ? 1 : (!a.m_Installed && b.m_Installed) ? 0 : (a.m_PackName.Compare(b.m_PackName) < 0); }); filenamePattern.Empty(); versioncheck.GetString(_T("tortoisegit.languagepackfilename"), filenamePattern); if (filenamePattern.IsEmpty()) filenamePattern = _T("TortoiseGit-LanguagePack-%1!s!-%2!s!bit-%3!s!.msi"); for (const auto& langs : languagePacks.availableLangs) { int pos = m_ctrlFiles.InsertItem(m_ctrlFiles.GetItemCount(), langs.m_PackName); m_ctrlFiles.SetItemText(pos, 1, langs.m_LangName); CString filename; filename.FormatMessage(filenamePattern, version, x86x64, langs.m_LangCode, langs.m_LocaleID); m_ctrlFiles.SetItemData(pos, (DWORD_PTR)(new CUpdateListCtrl::Entry(filename, CUpdateListCtrl::STATUS_NONE))); if (langs.m_Installed) m_ctrlFiles.SetCheck(pos , TRUE); } DialogEnableWindow(IDC_BUTTON_UPDATE, TRUE); }
void CCheckForUpdatesDlg::FillDownloads(CStdioFile &file, CString version) { #if WIN64 const CString x86x64 = _T("64"); #else const CString x86x64 = _T("32"); #endif if (!file.ReadString(m_sFilesURL) || m_sFilesURL.IsEmpty()) m_sFilesURL = _T("http://tortoisegit.googlecode.com/files/"); m_ctrlFiles.InsertItem(0, _T("TortoiseGit")); CString filename; filename.Format(_T("TortoiseGit-%s-%sbit.msi"), version, x86x64); m_ctrlFiles.SetItemData(0, (DWORD_PTR)(new CUpdateListCtrl::Entry(filename, CUpdateListCtrl::STATUS_NONE))); m_ctrlFiles.SetCheck(0 , TRUE); std::vector<DWORD> m_installedLangs; { // set up the language selecting combobox CString path = CPathUtils::GetAppParentDirectory(); path = path + _T("Languages\\"); CSimpleFileFind finder(path, _T("*.dll")); while (finder.FindNextFileNoDirectories()) { CString file = finder.GetFilePath(); CString filename = finder.GetFileName(); if (filename.Left(12).CompareNoCase(_T("TortoiseProc")) == 0) { CString sVer = _T(STRPRODUCTVER); sVer = sVer.Left(sVer.ReverseFind('.')); CString sFileVer = CPathUtils::GetVersionFromFile(file); sFileVer = sFileVer.Left(sFileVer.ReverseFind('.')); CString sLoc = filename.Mid(12); sLoc = sLoc.Left(sLoc.GetLength() - 4); // cut off ".dll" if ((sLoc.Left(2) == L"32") && (sLoc.GetLength() > 5)) continue; DWORD loc = _tstoi(filename.Mid(12)); m_installedLangs.push_back(loc); } } } CString langs; while (file.ReadString(langs) && !langs.IsEmpty()) { CString sLang = _T("TortoiseGit Language Pack ") + langs.Mid(5); DWORD loc = _tstoi(langs.Mid(0, 4)); TCHAR buf[MAX_PATH]; GetLocaleInfo(loc, LOCALE_SNATIVELANGNAME, buf, _countof(buf)); CString sLang2(buf); GetLocaleInfo(loc, LOCALE_SNATIVECTRYNAME, buf, _countof(buf)); if (buf[0]) { sLang2 += _T(" ("); sLang2 += buf; sLang2 += _T(")"); } int pos = m_ctrlFiles.InsertItem(m_ctrlFiles.GetItemCount(), sLang); m_ctrlFiles.SetItemText(pos, 1, sLang2); CString filename; filename.Format(_T("TortoiseGit-LanguagePack-%s-%sbit-%s.msi"), version, x86x64, langs.Mid(5)); m_ctrlFiles.SetItemData(pos, (DWORD_PTR)(new CUpdateListCtrl::Entry(filename, CUpdateListCtrl::STATUS_NONE))); if (std::find(m_installedLangs.begin(), m_installedLangs.end(), loc) != m_installedLangs.end()) m_ctrlFiles.SetCheck(pos , TRUE); } DialogEnableWindow(IDC_BUTTON_UPDATE, TRUE); }