/** * @brief Get folder for temporary files. * This function returns system temp folder. * @param [out] pnerr Error code if erorr happened. * @return Temp path, or empty string if error happened. * @note Temp path is cached after first call. * @todo Should we return NULL for error case? */ LPCTSTR env_GetTempPath(int * pnerr) { if (strTempPath.empty()) { if (GetOptionsMgr()->GetBool(OPT_USE_SYSTEM_TEMP_PATH)) { int cchTempPath = GetTempPath(0, 0); strTempPath.resize(cchTempPath - 1); if (!GetTempPath(cchTempPath, &*strTempPath.begin())) { int err = GetLastError(); if (pnerr) *pnerr = err; #ifdef _DEBUG String sysErr = GetSysError(err); // for debugging #endif return strTempPath.c_str(); // empty } } else { strTempPath = GetOptionsMgr()->GetString(OPT_CUSTOM_TEMP_PATH); if (!paths_EndsWithSlash(strTempPath.c_str())) strTempPath += '\\'; } strTempPath = paths_GetLongPath(strTempPath.c_str()); } return strTempPath.c_str(); }
/** * @brief Get file status into member variables * * Reads file's status (size and full path). * @return true on success, false on failure. * @note Function sets filesize member to zero, and status as read * also when failing. That is needed so caller doesn't need to waste * time checking if file already exists (and ignores return value). */ bool UniLocalFile::DoGetFileStatus() { struct _stati64 fstats = {0}; m_statusFetched = -1; m_lastError.ClearError(); m_filepath = paths_GetLongPath(m_filepath.c_str()); if (_tstati64(m_filepath.c_str(), &fstats) == 0) { m_filesize = fstats.st_size; if (m_filesize == 0) { // if m_filesize equals zero, the file size is really zero or the file is a symbolic link. // use GetCompressedFileSize() to get the file size of the symbolic link target whether the file is symbolic link or not. // if the file is not symbolic link, GetCompressedFileSize() will return zero. // NOTE: GetCompressedFileSize() returns error for pre-W2K windows versions DWORD dwFileSizeLow, dwFileSizeHigh; dwFileSizeLow = GetCompressedFileSize(m_filepath.c_str(), &dwFileSizeHigh); if (GetLastError() == 0) m_filesize = ((__int64)dwFileSizeHigh << 32) + dwFileSizeLow; } m_statusFetched = 1; return true; } else { m_filesize = 0; m_statusFetched = 1; // Yep, done for this file still LastError(_T("_tstati64"), 0); return false; } }
/** * @brief Called when dialog is closed with "OK". * * Checks that paths are valid and sets filters. */ void COpenView::OnOK() { int pathsType; // enum from PATH_EXISTENCE in paths.h const String filterPrefix = _("[F] "); UpdateData(TRUE); TrimPaths(); int index; int nFiles = 0; for (index = 0; index < countof(m_strPath); index++) { if (index == 2 && m_strPath[index].empty()) break; m_files.SetSize(nFiles + 1); m_files[nFiles] = m_strPath[index]; m_dwFlags[nFiles] &= ~FFILEOPEN_READONLY; m_dwFlags[nFiles] |= m_bReadOnly[index] ? FFILEOPEN_READONLY : 0; nFiles++; } // If left path is a project-file, load it String ext; paths_SplitFilename(m_strPath[0], NULL, NULL, &ext); if (m_strPath[1].empty() && string_compare_nocase(ext, ProjectFile::PROJECTFILE_EXT) == 0) LoadProjectFile(m_strPath[0]); pathsType = GetPairComparability(m_files, IsArchiveFile); if (pathsType == DOES_NOT_EXIST) { LangMessageBox(IDS_ERROR_INCOMPARABLE, MB_ICONSTOP); return; } for (index = 0; index < nFiles; index++) { // If user has edited path by hand, expand environment variables bool bExpand = false; if (string_compare_nocase(m_strBrowsePath[index], m_files[index]) != 0) bExpand = true; if (!paths_IsURLorCLSID(m_files[index])) { m_files[index] = paths_GetLongPath(m_files[index], bExpand); // Add trailing '\' for directories if its missing if (paths_DoesPathExist(m_files[index]) == IS_EXISTING_DIR) m_files[index] = paths_AddTrailingSlash(m_files[index]); m_strPath[index] = m_files[index]; } } UpdateData(FALSE); KillTimer(IDT_CHECKFILES); String filter(string_trim_ws(m_strExt)); // If prefix found from start.. if (filter.find(filterPrefix, 0) == 0) { // Remove prefix + space filter.erase(0, filterPrefix.length()); if (!theApp.m_pGlobalFileFilter->SetFilter(filter)) { // If filtername is not found use default *.* mask theApp.m_pGlobalFileFilter->SetFilter(_T("*.*")); filter = _T("*.*"); } GetOptionsMgr()->SaveOption(OPT_FILEFILTER_CURRENT, filter); } else { BOOL bFilterSet = theApp.m_pGlobalFileFilter->SetFilter(filter); if (!bFilterSet) m_strExt = theApp.m_pGlobalFileFilter->GetFilterNameOrMask(); GetOptionsMgr()->SaveOption(OPT_FILEFILTER_CURRENT, filter); } SaveComboboxStates(); GetOptionsMgr()->SaveOption(OPT_CMP_INCLUDE_SUBDIRS, m_bRecurse); LoadComboboxStates(); m_constraint.Persist(true, false); COpenDoc *pDoc = GetDocument(); pDoc->m_files = m_files; pDoc->m_bRecurse = m_bRecurse; pDoc->m_strExt = m_strExt; pDoc->m_strUnpacker = m_strUnpacker; pDoc->m_infoHandler = m_infoHandler; pDoc->m_dwFlags[0] = m_dwFlags[0]; pDoc->m_dwFlags[1] = m_dwFlags[1]; pDoc->m_dwFlags[2] = m_dwFlags[2]; if (GetOptionsMgr()->GetBool(OPT_CLOSE_WITH_OK)) GetParentFrame()->PostMessage(WM_CLOSE); GetMainFrame()->DoFileOpen( &PathContext(pDoc->m_files), &std::vector<DWORD>(pDoc->m_dwFlags, pDoc->m_dwFlags + 3)[0], NULL, _T(""), !!pDoc->m_bRecurse, NULL, _T(""), &PackingInfo(pDoc->m_infoHandler)); }