bool ImageDirEngineImpl::LoadImageDir(const WCHAR *dirName) { fileName = str::Dup(dirName); fileExt = L""; ScopedMem<WCHAR> pattern(path::Join(dirName, L"*")); WIN32_FIND_DATA fdata; HANDLE hfind = FindFirstFile(pattern, &fdata); if (INVALID_HANDLE_VALUE == hfind) return false; do { if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { if (ImageEngine::IsSupportedFile(fdata.cFileName)) pageFileNames.Append(path::Join(dirName, fdata.cFileName)); } } while (FindNextFile(hfind, &fdata)); FindClose(hfind); if (pageFileNames.Count() == 0) return false; pageFileNames.SortNatural(); pages.AppendBlanks(pageFileNames.Count()); mediaboxes.AppendBlanks(pageFileNames.Count()); return true; }
bool DirFileProvider::OpenDir(const WCHAR* dirPath) { AssertCrash(filesToOpen.size() == 0); bool hasFiles = CollectStressTestSupportedFilesFromDirectory(dirPath, fileFilter, filesToOpen); filesToOpen.SortNatural(); AutoFreeW pattern(str::Format(L"%s\\*", dirPath)); bool hasSubDirs = CollectPathsFromDirectory(pattern, dirsToVisit, true); return hasFiles || hasSubDirs; }
bool DirFileProvider::OpenDir(const WCHAR *dirPath) { assert(filesToOpen.Count() == 0); bool hasFiles = CollectStressTestSupportedFilesFromDirectory(dirPath, fileFilter, filesToOpen); filesToOpen.SortNatural(); ScopedMem<WCHAR> pattern(str::Format(L"%s\\*", dirPath)); bool hasSubDirs = CollectPathsFromDirectory(pattern, dirsToVisit, true); return hasFiles || hasSubDirs; }
// parses a list of page ranges such as 1,3-5,7- (i..e all but pages 2 and 6) // into an interable list (returns nullptr on parsing errors) // caller must delete the result bool ParsePageRanges(const WCHAR* ranges, Vec<PageRange>& result) { if (!ranges) return false; WStrVec rangeList; rangeList.Split(ranges, L",", true); rangeList.SortNatural(); for (size_t i = 0; i < rangeList.size(); i++) { int start, end; if (str::Parse(rangeList.at(i), L"%d-%d%$", &start, &end) && 0 < start && start <= end) result.Append(PageRange(start, end)); else if (str::Parse(rangeList.at(i), L"%d-%$", &start) && 0 < start) result.Append(PageRange(start, INT_MAX)); else if (str::Parse(rangeList.at(i), L"%d%$", &start) && 0 < start) result.Append(PageRange(start, start)); else return false; } return result.size() > 0; }
static WCHAR *GetGhostscriptPath() { WCHAR *gsProducts[] = { L"AFPL Ghostscript", L"Aladdin Ghostscript", L"GPL Ghostscript", L"GNU Ghostscript", }; // find all installed Ghostscript versions WStrVec versions; REGSAM access = KEY_READ | KEY_WOW64_32KEY; TryAgain64Bit: for (int i = 0; i < dimof(gsProducts); i++) { HKEY hkey; ScopedMem<WCHAR> keyName(str::Join(L"Software\\", gsProducts[i])); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, access, &hkey) != ERROR_SUCCESS) continue; WCHAR subkey[32]; for (DWORD ix = 0; RegEnumKey(hkey, ix, subkey, dimof(subkey)) == ERROR_SUCCESS; ix++) versions.Append(str::Dup(subkey)); RegCloseKey(hkey); } if ((access & KEY_WOW64_32KEY)) { // also look for 64-bit Ghostscript versions under 64-bit Windows access = KEY_READ | KEY_WOW64_64KEY; #ifndef _WIN64 // (unless this is 32-bit Windows) if (IsRunningInWow64()) #endif goto TryAgain64Bit; } versions.SortNatural(); // return the path to the newest installation for (size_t ix = versions.Count(); ix > 0; ix--) { for (int i = 0; i < dimof(gsProducts); i++) { ScopedMem<WCHAR> keyName(str::Format(L"Software\\%s\\%s", gsProducts[i], versions.At(ix - 1))); ScopedMem<WCHAR> GS_DLL(ReadRegStr(HKEY_LOCAL_MACHINE, keyName, L"GS_DLL")); if (!GS_DLL) continue; ScopedMem<WCHAR> dir(path::GetDir(GS_DLL)); ScopedMem<WCHAR> exe(path::Join(dir, L"gswin32c.exe")); if (file::Exists(exe)) return exe.StealData(); exe.Set(path::Join(dir, L"gswin64c.exe")); if (file::Exists(exe)) return exe.StealData(); } } // if Ghostscript isn't found in the Registry, try finding it in the %PATH% DWORD size = GetEnvironmentVariable(L"PATH", NULL, 0); ScopedMem<WCHAR> envpath(AllocArray<WCHAR>(size)); if (size > 0 && envpath) { GetEnvironmentVariable(L"PATH", envpath, size); WStrVec paths; paths.Split(envpath, L";", true); for (size_t ix = 0; ix < paths.Count(); ix++) { ScopedMem<WCHAR> exe(path::Join(paths.At(ix), L"gswin32c.exe")); if (file::Exists(exe)) return exe.StealData(); exe.Set(path::Join(paths.At(ix), L"gswin64c.exe")); if (file::Exists(exe)) return exe.StealData(); } } return NULL; }