bool ViewWithExternalViewer(size_t idx, const WCHAR *filePath, int pageNo) { if (!HasPermission(Perm_DiskAccess) || !file::Exists(filePath)) return false; for (size_t i = 0; i < gGlobalPrefs->externalViewers->Count() && i <= idx; i++) { ExternalViewer *ev = gGlobalPrefs->externalViewers->At(i); // cf. AppendExternalViewersToMenu in Menu.cpp if (!ev->commandLine || ev->filter && !str::Eq(ev->filter, L"*") && !(filePath && path::Match(filePath, ev->filter))) idx++; } if (idx >= gGlobalPrefs->externalViewers->Count() || !gGlobalPrefs->externalViewers->At(idx)->commandLine) return false; ExternalViewer *ev = gGlobalPrefs->externalViewers->At(idx); WStrVec args; ParseCmdLine(ev->commandLine, args, 2); if (args.Count() == 0 || !file::Exists(args.At(0))) return false; // if the command line contains %p, it's replaced with the current page number // if it contains %1, it's replaced with the file path (else the file path is appended) const WCHAR *cmdLine = args.Count() > 1 ? args.At(1) : L"\"%1\""; ScopedMem<WCHAR> pageNoStr(str::Format(L"%d", pageNo)); ScopedMem<WCHAR> params(str::Replace(cmdLine, L"%p", pageNoStr)); if (str::Find(params, L"%1")) params.Set(str::Replace(params, L"%1", filePath)); else params.Set(str::Format(L"%s \"%s\"", params.Get(), filePath)); return LaunchFile(args.At(0), params); }
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; }
int TesterMain() { RedirectIOToConsole(); WCHAR *cmdLine = GetCommandLine(); WStrVec argv; ParseCmdLine(cmdLine, argv); InitAllCommonControls(); ScopedGdiPlus gdi; mui::Initialize(); WCHAR *dirOrFile = NULL; bool mobiTest = false; size_t i = 2; // skip program name and "/tester" while (i < argv.Count()) { if (str::Eq(argv[i], L"-mobi")) { ++i; if (i == argv.Count()) return Usage(); mobiTest = true; dirOrFile = argv[i]; ++i; } else if (str::Eq(argv[i], L"-layout")) { gLayout = true; ++i; } else if (str::Eq(argv[i], L"-save-html")) { gSaveHtml = true; ++i; } else if (str::Eq(argv[i], L"-save-images")) { gSaveImages = true; ++i; } else if (str::Eq(argv[i], L"-zip-create")) { ZipCreateTest(); ++i; } else if (str::Eq(argv[i], L"-bench-md5")) { BenchMD5(); ++i; } else { // unknown argument return Usage(); } } if (2 == i) { // no arguments return Usage(); } if (mobiTest) { MobiTest(dirOrFile); } mui::Destroy(); system("pause"); return 0; }
static void WStrVecTest() { WStrVec v; v.Append(str::Dup(L"foo")); v.Append(str::Dup(L"bar")); WCHAR *s = v.Join(); utassert(v.Count() == 2); utassert(str::Eq(L"foobar", s)); free(s); s = v.Join(L";"); utassert(v.Count() == 2); utassert(str::Eq(L"foo;bar", s)); free(s); v.Append(str::Dup(L"glee")); s = v.Join(L"_ _"); utassert(v.Count() == 3); utassert(str::Eq(L"foo_ _bar_ _glee", s)); free(s); v.Sort(); s = v.Join(); utassert(str::Eq(L"barfooglee", s)); free(s); { WStrVec v2(v); utassert(str::Eq(v2.At(1), L"foo")); v2.Append(str::Dup(L"nobar")); utassert(str::Eq(v2.At(3), L"nobar")); v2 = v; utassert(v2.Count() == 3 && v2.At(0) != v.At(0)); utassert(str::Eq(v2.At(1), L"foo")); utassert(&v2.At(2) == v2.AtPtr(2) && str::Eq(*v2.AtPtr(2), L"glee")); } { WStrVec v2; size_t count = v2.Split(L"a,b,,c,", L","); utassert(count == 5 && v2.Find(L"c") == 3); utassert(v2.Find(L"") == 2 && v2.Find(L"", 3) == 4 && v2.Find(L"", 5) == -1); utassert(v2.Find(L"B") == -1 && v2.FindI(L"B") == 1); ScopedMem<WCHAR> joined(v2.Join(L";")); utassert(str::Eq(joined, L"a;b;;c;")); } { WStrVec v2; size_t count = v2.Split(L"a,b,,c,", L",", true); utassert(count == 3 && v2.Find(L"c") == 2); ScopedMem<WCHAR> joined(v2.Join(L";")); utassert(str::Eq(joined, L"a;b;c")); ScopedMem<WCHAR> last(v2.Pop()); utassert(v2.Count() == 2 && str::Eq(last, L"c")); } }
virtual void Execute() { for (size_t i = 0; i < paths.Count(); i++) { gFileHistory.MarkFileInexistent(paths.At(i), true); } // update the Frequently Read page in case it's been displayed already if (paths.Count() > 0 && gWindows.Count() > 0 && gWindows.At(0)->IsAboutWindow()) gWindows.At(0)->RedrawAll(true); // prepare for clean-up (Join() just to be safe) gFileExistenceChecker = NULL; Join(); }
// Select random files to test. We want to test each file type equally, so // we first group them by file extension and then select up to maxPerType // for each extension, randomly, and inter-leave the files with different // extensions, so their testing is evenly distributed. // Returns result in <files>. static void RandomizeFiles(WStrVec& files, int maxPerType) { WStrVec fileExts; Vec<WStrVec *> filesPerType; for (size_t i = 0; i < files.Count(); i++) { const WCHAR *file = files.At(i); const WCHAR *ext = path::GetExt(file); CrashAlwaysIf(!ext); int typeNo = fileExts.FindI(ext); if (-1 == typeNo) { fileExts.Append(str::Dup(ext)); filesPerType.Append(new WStrVec()); typeNo = (int)filesPerType.Count() - 1; } filesPerType.At(typeNo)->Append(str::Dup(file)); } for (size_t j = 0; j < filesPerType.Count(); j++) { WStrVec *all = filesPerType.At(j); WStrVec *random = new WStrVec(); for (int n = 0; n < maxPerType && all->Count() > 0; n++) { int idx = rand() % all->Count(); WCHAR *file = all->At(idx); random->Append(file); all->RemoveAtFast(idx); } filesPerType.At(j) = random; delete all; } files.Reset(); bool gotAll = false; while (!gotAll) { gotAll = true; for (size_t j = 0; j < filesPerType.Count(); j++) { WStrVec *random = filesPerType.At(j); if (random->Count() > 0) { gotAll = false; WCHAR *file = random->At(0); files.Append(file); random->RemoveAtFast(0); } } } for (size_t j = 0; j < filesPerType.Count(); j++) { delete filesPerType.At(j); } }
// Find a record corresponding to the given source file, line number and optionally column number. // (at the moment the column parameter is ignored) // // If there are several *consecutively declared* records for the same line then they are all returned. // The list of records is added to the vector 'records' // // If there is no record for that line, the record corresponding to the nearest line is selected // (within a range of EPSILON_LINE) // // The function returns PDFSYNCERR_SUCCESS if a matching record was found. UINT Pdfsync::SourceToRecord(const WCHAR* srcfilename, UINT line, UINT col, Vec<size_t> &records) { if (!srcfilename) return PDFSYNCERR_INVALID_ARGUMENT; ScopedMem<WCHAR> srcfilepath; // convert the source file to an absolute path if (PathIsRelative(srcfilename)) srcfilepath.Set(PrependDir(srcfilename)); else srcfilepath.Set(str::Dup(srcfilename)); if (!srcfilepath) return PDFSYNCERR_OUTOFMEMORY; // find the source file entry size_t isrc; for (isrc = 0; isrc < srcfiles.Count(); isrc++) if (path::IsSame(srcfilepath, srcfiles.At(isrc))) break; if (isrc == srcfiles.Count()) return PDFSYNCERR_UNKNOWN_SOURCEFILE; if (fileIndex.At(isrc).start == fileIndex.At(isrc).end) return PDFSYNCERR_NORECORD_IN_SOURCEFILE; // there is not any record declaration for that particular source file // look for sections belonging to the specified file // starting with the first section that is declared within the scope of the file. UINT min_distance = EPSILON_LINE; // distance to the closest record size_t lineIx = (size_t)-1; // closest record-line index for (size_t isec = fileIndex.At(isrc).start; isec < fileIndex.At(isrc).end; isec++) { // does this section belong to the desired file? if (lines.At(isec).file != isrc) continue; UINT d = abs((int)lines.At(isec).line - (int)line); if (d < min_distance) { min_distance = d; lineIx = isec; if (0 == d) break; // We have found a record for the requested line! } } if (lineIx == (size_t)-1) return PDFSYNCERR_NORECORD_FOR_THATLINE; // we read all the consecutive records until we reach a record belonging to another line for (size_t i = lineIx; i < lines.Count() && lines.At(i).line == lines.At(lineIx).line; i++) records.Push(lines.At(i).record); return PDFSYNCERR_SUCCESS; }
static void SetCloseProcessMsg() { ScopedMem<WCHAR> procNames(str::Dup(ReadableProcName(gProcessesToClose.At(0)))); for (size_t i = 1; i < gProcessesToClose.Count(); i++) { const WCHAR *name = ReadableProcName(gProcessesToClose.At(i)); if (i < gProcessesToClose.Count() - 1) procNames.Set(str::Join(procNames, L", ", name)); else procNames.Set(str::Join(procNames, L" and ", name)); } ScopedMem<WCHAR> s(str::Format(_TR("Please close %s to proceed!"), procNames)); SetMsg(s, COLOR_MSG_FAILED); }
WCHAR *DirFileProvider::NextFile() { if (filesToOpen.Count() > 0) { return filesToOpen.PopAt(0); } if (dirsToVisit.Count() > 0) { // test next directory ScopedMem<WCHAR> path(dirsToVisit.PopAt(0)); OpenDir(path); return NextFile(); } return nullptr; }
// creates an archive from files (starting at index skipFiles); // file paths may be relative to the current directory or absolute and // may end in a colon followed by the desired path in the archive // (this is required for absolute paths) bool CreateArchive(const WCHAR *archivePath, WStrVec& files, size_t skipFiles=0) { size_t prevDataLen = 0; ScopedMem<char> prevData(file::ReadAll(archivePath, &prevDataLen)); lzma::SimpleArchive prevArchive; if (!lzma::ParseSimpleArchive(prevData, prevDataLen, &prevArchive)) prevArchive.filesCount = 0; str::Str<char> data; str::Str<char> content; ByteWriterLE lzsaHeader(data.AppendBlanks(8), 8); lzsaHeader.Write32(LZMA_MAGIC_ID); lzsaHeader.Write32((uint32_t)(files.Count() - skipFiles)); for (size_t i = skipFiles; i < files.Count(); i++) { ScopedMem<WCHAR> filePath(str::Dup(files.At(i))); WCHAR *sep = str::FindCharLast(filePath, ':'); ScopedMem<char> utf8Name; if (sep) { utf8Name.Set(str::conv::ToUtf8(sep + 1)); *sep = '\0'; } else { utf8Name.Set(str::conv::ToUtf8(filePath)); } str::TransChars(utf8Name, "/", "\\"); if ('/' == *utf8Name || str::Find(utf8Name, "../")) { fprintf(stderr, "In-archive name must not be an absolute path: %s\n", utf8Name); return false; } int idx = GetIdxFromName(&prevArchive, utf8Name); lzma::FileInfo *fi = NULL; if (idx != -1) fi = &prevArchive.files[idx]; if (!AppendEntry(data, content, filePath, utf8Name, fi)) return false; } uint32_t headerCrc32 = crc32(0, (const uint8_t *)data.Get(), (uint32_t)data.Size()); ByteWriterLE(data.AppendBlanks(4), 4).Write32(headerCrc32); if (!data.AppendChecked(content.Get(), content.Size())) return false; return file::WriteAll(archivePath, data.Get(), data.Size()); }
// extract ComicBookInfo metadata // cf. http://code.google.com/p/comicbookinfo/ bool CbxEngineImpl::Visit(const char *path, const char *value, json::DataType type) { if (json::Type_String == type && str::Eq(path, "/ComicBookInfo/1.0/title")) propTitle.Set(str::conv::FromUtf8(value)); else if (json::Type_Number == type && str::Eq(path, "/ComicBookInfo/1.0/publicationYear")) propDate.Set(str::Format(L"%s/%d", propDate ? propDate : L"", atoi(value))); else if (json::Type_Number == type && str::Eq(path, "/ComicBookInfo/1.0/publicationMonth")) propDate.Set(str::Format(L"%d%s", atoi(value), propDate ? propDate : L"")); else if (json::Type_String == type && str::Eq(path, "/appID")) propCreator.Set(str::conv::FromUtf8(value)); else if (json::Type_String == type && str::Eq(path, "/lastModified")) propModDate.Set(str::conv::FromUtf8(value)); else if (json::Type_String == type && str::Eq(path, "/X-summary")) propSummary.Set(str::conv::FromUtf8(value)); else if (str::StartsWith(path, "/ComicBookInfo/1.0/credits[")) { int idx = -1; const char *prop = str::Parse(path, "/ComicBookInfo/1.0/credits[%d]/", &idx); if (prop) { if (json::Type_String == type && str::Eq(prop, "person")) propAuthorTmp.Set(str::conv::FromUtf8(value)); else if (json::Type_Bool == type && str::Eq(prop, "primary") && propAuthorTmp && propAuthors.Find(propAuthorTmp) == -1) { propAuthors.Append(propAuthorTmp.StealData()); } } return true; } // stop parsing once we have all desired information return !propTitle || propAuthors.Count() == 0 || !propCreator || !propDate || str::FindChar(propDate, '/') <= propDate; }
/* The html looks like: <li> <object type="text/sitemap"> <param name="Keyword" value="- operator"> <param name="Name" value="Subtraction Operator (-)"> <param name="Local" value="html/vsoprsubtract.htm"> <param name="Name" value="Subtraction Operator (-)"> <param name="Local" value="html/js56jsoprsubtract.htm"> </object> <ul> ... optional children ... </ul> <li> ... siblings ... */ static bool VisitChmIndexItem(EbookTocVisitor *visitor, HtmlElement *el, UINT cp, int level) { CrashIf(el->tag != Tag_Object || level > 1 && (!el->up || el->up->tag != Tag_Li)); WStrVec references; ScopedMem<WCHAR> keyword, name; for (el = el->GetChildByTag(Tag_Param); el; el = el->next) { if (Tag_Param != el->tag) continue; ScopedMem<WCHAR> attrName(el->GetAttribute("name")); ScopedMem<WCHAR> attrVal(el->GetAttribute("value")); if (attrName && attrVal && cp != CP_CHM_DEFAULT) { ScopedMem<char> bytes(str::conv::ToCodePage(attrVal, CP_CHM_DEFAULT)); attrVal.Set(str::conv::FromCodePage(bytes, cp)); } if (!attrName || !attrVal) /* ignore incomplete/unneeded <param> */; else if (str::EqI(attrName, L"Keyword")) keyword.Set(attrVal.StealData()); else if (str::EqI(attrName, L"Name")) { name.Set(attrVal.StealData()); // some CHM documents seem to use a lonely Name instead of Keyword if (!keyword) keyword.Set(str::Dup(name)); } else if (str::EqI(attrName, L"Local") && name) { // remove the ITS protocol and any filename references from the URLs if (str::Find(attrVal, L"::/")) attrVal.Set(str::Dup(str::Find(attrVal, L"::/") + 3)); references.Append(name.StealData()); references.Append(attrVal.StealData()); } } if (!keyword) return false; if (references.Count() == 2) { visitor->Visit(keyword, references.At(1), level); return true; } visitor->Visit(keyword, NULL, level); for (size_t i = 0; i < references.Count(); i += 2) { visitor->Visit(references.At(i), references.At(i + 1), level + 1); } return true; }
FilesProvider(WStrVec& newFiles, int n, int offset) { // get every n-th file starting at offset for (size_t i = offset; i < newFiles.Count(); i += n) { const WCHAR *f = newFiles.At(i); files.Append(str::Dup(f)); } provided = 0; }
static void BenchDir(WCHAR *dir) { WStrVec files; CollectFilesToBench(dir, files); for (size_t i = 0; i < files.Count(); i++) { BenchFile(files.At(i), nullptr); } }
static void ParseCommandLine(WCHAR *cmdLine) { WStrVec argList; ParseCmdLine(cmdLine, argList); #define is_arg(param) str::EqI(arg + 1, TEXT(param)) #define is_arg_with_param(param) (is_arg(param) && i < argList.Count() - 1) // skip the first arg (exe path) for (size_t i = 1; i < argList.Count(); i++) { WCHAR *arg = argList.At(i); if ('-' != *arg && '/' != *arg) continue; if (is_arg("s")) gGlobalData.silent = true; else if (is_arg_with_param("d")) str::ReplacePtr(&gGlobalData.installDir, argList.At(++i)); #ifndef BUILD_UNINSTALLER else if (is_arg("register")) gGlobalData.registerAsDefault = true; else if (is_arg_with_param("opt")) { WCHAR *opts = argList.At(++i); str::ToLower(opts); str::TransChars(opts, L" ;", L",,"); WStrVec optlist; optlist.Split(opts, L",", true); if (optlist.Contains(L"pdffilter")) gGlobalData.installPdfFilter = true; if (optlist.Contains(L"pdfpreviewer")) gGlobalData.installPdfPreviewer = true; // uninstall the deprecated browser plugin if it's not // explicitly listed (only applies if the /opt flag is used) if (!optlist.Contains(L"plugin")) gGlobalData.keepBrowserPlugin = false; } else if (is_arg("x")) { gGlobalData.justExtractFiles = true; // silently extract files to the current directory (if /d isn't used) gGlobalData.silent = true; if (!gGlobalData.installDir) str::ReplacePtr(&gGlobalData.installDir, L"."); } else if (is_arg("autoupdate")) { gGlobalData.autoUpdate = true; } #endif else if (is_arg("h") || is_arg("help") || is_arg("?")) gGlobalData.showUsageAndQuit = true; #ifdef ENABLE_CRASH_TESTING else if (is_arg("crash")) { // will induce crash when 'Install' button is pressed // for testing crash handling gForceCrash = true; } #endif } }
static size_t GetAllMatchingFiles(const WCHAR *dir, const WCHAR *filter, WStrVec& files, bool showProgress) { WStrVec dirsToVisit; dirsToVisit.Append(str::Dup(dir)); while (dirsToVisit.Count() > 0) { if (showProgress) { wprintf(L"."); fflush(stdout); } ScopedMem<WCHAR> path(dirsToVisit.PopAt(0)); CollectStressTestSupportedFilesFromDirectory(path, filter, files); ScopedMem<WCHAR> pattern(str::Format(L"%s\\*", path)); CollectPathsFromDirectory(pattern, dirsToVisit, true); } return files.Count(); }
WCHAR *DirFileProvider::NextFile() { while (filesToOpen.Count() > 0) { ScopedMem<WCHAR> path(filesToOpen.At(0)); filesToOpen.RemoveAt(0); return path.StealData(); } if (dirsToVisit.Count() > 0) { // test next directory ScopedMem<WCHAR> path(dirsToVisit.At(0)); dirsToVisit.RemoveAt(0); OpenDir(path); return NextFile(); } return NULL; }
int ImageDirEngineImpl::GetPageByLabel(const WCHAR *label) { for (size_t i = 0; i < pageFileNames.Count(); i++) { const WCHAR *fileName = path::GetBaseName(pageFileNames.At(i)); const WCHAR *fileExt = path::GetExt(fileName); if (str::StartsWithI(fileName, label) && (fileName + str::Len(label) == fileExt || fileName[str::Len(label)] == '\0')) return (int)i + 1; } return BaseEngine::GetPageByLabel(label); }
static bool SetupPluginMode(CommandLineInfo& i) { if (!IsWindow(i.hwndPluginParent) || i.fileNames.Count() == 0) return false; gPluginURL = i.pluginURL; if (!gPluginURL) gPluginURL = i.fileNames.At(0); assert(i.fileNames.Count() == 1); while (i.fileNames.Count() > 1) { free(i.fileNames.Pop()); } i.reuseInstance = i.exitWhenDone = false; gGlobalPrefs->reuseInstance = false; // always display the toolbar when embedded (as there's no menubar in that case) gGlobalPrefs->showToolbar = true; // never allow esc as a shortcut to quit gGlobalPrefs->escToExit = false; // never show the sidebar by default gGlobalPrefs->showToc = false; if (DM_AUTOMATIC == gGlobalPrefs->defaultDisplayModeEnum) { // if the user hasn't changed the default display mode, // display documents as single page/continuous/fit width // (similar to Adobe Reader, Google Chrome and how browsers display HTML) gGlobalPrefs->defaultDisplayModeEnum = DM_CONTINUOUS; gGlobalPrefs->defaultZoomFloat = ZOOM_FIT_WIDTH; } // use fixed page UI for all document types (so that the context menu always // contains all plugin specific entries and the main window is never closed) gGlobalPrefs->ebookUI.useFixedPageUI = gGlobalPrefs->chmUI.useFixedPageUI = true; // extract some command line arguments from the URL's hash fragment where available // see http://www.adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf#nameddest=G4.1501531 if (i.pluginURL && str::FindChar(i.pluginURL, '#')) { ScopedMem<WCHAR> args(str::Dup(str::FindChar(i.pluginURL, '#') + 1)); str::TransChars(args, L"#", L"&"); WStrVec parts; parts.Split(args, L"&", true); for (size_t k = 0; k < parts.Count(); k++) { WCHAR *part = parts.At(k); int pageNo; if (str::StartsWithI(part, L"page=") && str::Parse(part + 4, L"=%d%$", &pageNo)) i.pageNumber = pageNo; else if (str::StartsWithI(part, L"nameddest=") && part[10]) str::ReplacePtr(&i.destName, part + 10); else if (!str::FindChar(part, '=') && part[0]) str::ReplacePtr(&i.destName, part); } } return true; }
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; }
virtual void Run() { // filters all file paths on network drives, removable drives and // all paths which still exist from the list (remaining paths will // be marked as inexistent in gFileHistory) for (size_t i = 0; i < paths.Count() && !WasCancelRequested(); i++) { WCHAR *path = paths.At(i); if (!path || !path::IsOnFixedDrive(path) || DocumentPathExists(path)) { free(paths.PopAt(i--)); } } if (!WasCancelRequested()) uitask::Post(this); }
bool ImageDirEngineImpl::SaveFileAs(const WCHAR *copyFileName) { // only copy the files if the target directory doesn't exist yet if (!CreateDirectory(copyFileName, NULL)) return false; bool ok = true; for (size_t i = 0; i < pageFileNames.Count(); i++) { const WCHAR *filePathOld = pageFileNames.At(i); ScopedMem<WCHAR> filePathNew(path::Join(copyFileName, path::GetBaseName(filePathOld))); ok = ok && CopyFile(filePathOld, filePathNew, TRUE); } return ok; }
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLineA, int nCmdShow) { WStrVec argList; ParseCmdLine(GetCommandLine(), argList); if (argList.Count() == 1) { ScopedMem<WCHAR> msg(str::Format(L"Syntax: %s [<SumatraPDF.exe>] [<URL>] <filename.ext>", path::GetBaseName(argList.At(0)))); MessageBox(NULL, msg, PLUGIN_TEST_NAME, MB_OK | MB_ICONINFORMATION); return 1; } if (argList.Count() == 2 || !str::EndsWithI(argList.At(1), L".exe")) { argList.InsertAt(1, GetSumatraExePath()); } if (argList.Count() == 3) { argList.InsertAt(2, NULL); } WNDCLASS wc = { 0 }; wc.lpfnWndProc = PluginParentWndProc; wc.hInstance = hInstance; wc.lpszClassName = PLUGIN_TEST_NAME; wc.hCursor = LoadCursor(NULL, IDC_ARROW); RegisterClass(&wc); PluginStartData data = { argList.At(1), argList.At(3), argList.At(2) }; HWND hwnd = CreateWindow(PLUGIN_TEST_NAME, PLUGIN_TEST_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, &data); ShowWindow(hwnd, nCmdShow); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
// removes thumbnails that don't belong to any frequently used item in file history void CleanUpThumbnailCache(FileHistory& fileHistory) { ScopedMem<WCHAR> thumbsPath(AppGenDataFilename(THUMBNAILS_DIR_NAME)); if (!thumbsPath) return; ScopedMem<WCHAR> pattern(path::Join(thumbsPath, L"*.png")); WStrVec files; WIN32_FIND_DATA fdata; HANDLE hfind = FindFirstFile(pattern, &fdata); if (INVALID_HANDLE_VALUE == hfind) return; do { if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) files.Append(str::Dup(fdata.cFileName)); } while (FindNextFile(hfind, &fdata)); FindClose(hfind); Vec<DisplayState *> list; fileHistory.GetFrequencyOrder(list); for (size_t i = 0; i < list.Count() && i < FILE_HISTORY_MAX_FREQUENT * 2; i++) { ScopedMem<WCHAR> bmpPath(GetThumbnailPath(list.At(i)->filePath)); if (!bmpPath) continue; int idx = files.Find(path::GetBaseName(bmpPath)); if (idx != -1) { CrashIf(idx < 0 || files.Count() <= (size_t)idx); WCHAR *fileName = files.At(idx); files.RemoveAt(idx); free(fileName); } } for (size_t i = 0; i < files.Count(); i++) { ScopedMem<WCHAR> bmpPath(path::Join(thumbsPath, files.At(i))); file::Delete(bmpPath); } }
int main(int argc, char **argv) { #ifdef DEBUG // report memory leaks on stderr _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif WStrVec args; ParseCmdLine(GetCommandLine(), args); int errorStep = 1; if (args.Count() == 2 && file::Exists(args.At(1))) return mainVerify(args.At(1)); FailIf(args.Count() < 3, "Syntax: %S <archive.lzsa> <filename>[:<in-archive name>] [...]", path::GetBaseName(args.At(0))); bool ok = lzsa::CreateArchive(args.At(1), args, 2); FailIf(!ok, "Failed to create \"%S\"", args.At(1)); return 0; }
static void ApplyPrintSettings(const WCHAR *settings, int pageCount, Vec<PRINTPAGERANGE> &ranges, Print_Advanced_Data &advanced, LPDEVMODE devMode) { WStrVec rangeList; if (settings) rangeList.Split(settings, L",", true); for (size_t i = 0; i < rangeList.Count(); i++) { int val; PRINTPAGERANGE pr; if (str::Parse(rangeList.At(i), L"%d-%d%$", &pr.nFromPage, &pr.nToPage)) { pr.nFromPage = limitValue(pr.nFromPage, (DWORD)1, (DWORD)pageCount); pr.nToPage = limitValue(pr.nToPage, (DWORD)1, (DWORD)pageCount); ranges.Append(pr); } else if (str::Parse(rangeList.At(i), L"%d%$", &pr.nFromPage)) { pr.nFromPage = pr.nToPage = limitValue(pr.nFromPage, (DWORD)1, (DWORD)pageCount); ranges.Append(pr); } else if (str::EqI(rangeList.At(i), L"even")) advanced.range = PrintRangeEven; else if (str::EqI(rangeList.At(i), L"odd")) advanced.range = PrintRangeOdd; else if (str::EqI(rangeList.At(i), L"noscale")) advanced.scale = PrintScaleNone; else if (str::EqI(rangeList.At(i), L"shrink")) advanced.scale = PrintScaleShrink; else if (str::EqI(rangeList.At(i), L"fit")) advanced.scale = PrintScaleFit; else if (str::Parse(rangeList.At(i), L"%dx%$", &val) && 0 < val && val < 1000) devMode->dmCopies = (short)val; else if (str::EqI(rangeList.At(i), L"simplex")) devMode->dmDuplex = DMDUP_SIMPLEX; else if (str::EqI(rangeList.At(i), L"duplex") || str::EqI(rangeList.At(i), L"duplexlong")) devMode->dmDuplex = DMDUP_VERTICAL; else if (str::EqI(rangeList.At(i), L"duplexshort")) devMode->dmDuplex = DMDUP_HORIZONTAL; else if (str::EqI(rangeList.At(i), L"color")) devMode->dmColor = DMCOLOR_COLOR; else if (str::EqI(rangeList.At(i), L"monochrome")) devMode->dmColor = DMCOLOR_MONOCHROME; else if (str::StartsWithI(rangeList.At(i), L"bin=")) devMode->dmDefaultSource = GetPaperSourceByName(rangeList.At(i) + 4, devMode); else if (str::StartsWithI(rangeList.At(i), L"paper=")) devMode->dmPaperSize = GetPaperByName(rangeList.At(i) + 6); } if (ranges.Count() == 0) { PRINTPAGERANGE pr = { 1, (DWORD)pageCount }; ranges.Append(pr); } }
bool CheckInstallUninstallPossible(bool silent) { ProcessesUsingInstallation(gProcessesToClose); bool possible = gProcessesToClose.Count() == 0; if (possible) { SetDefaultMsg(); } else { SetCloseProcessMsg(); if (!silent) MessageBeep(MB_ICONEXCLAMATION); } InvalidateFrame(); return possible; }
static void ParseCommandLine(WCHAR *cmdLine) { WStrVec argList; ParseCmdLine(cmdLine, argList); #define is_arg(param) str::EqI(arg + 1, TEXT(param)) #define is_arg_with_param(param) (is_arg(param) && i < argList.Count() - 1) // skip the first arg (exe path) for (size_t i = 1; i < argList.Count(); i++) { WCHAR *arg = argList.At(i); if ('-' != *arg && '/' != *arg) continue; if (is_arg("s")) gGlobalData.silent = true; else if (is_arg_with_param("d")) str::ReplacePtr(&gGlobalData.installDir, argList.At(++i)); #ifndef BUILD_UNINSTALLER else if (is_arg("register")) gGlobalData.registerAsDefault = true; else if (is_arg_with_param("opt")) { WCHAR *opts = argList.At(++i); str::ToLower(opts); str::TransChars(opts, L" ;", L",,"); WStrVec optlist; optlist.Split(opts, L",", true); if (optlist.Find(L"plugin") != -1) gGlobalData.installBrowserPlugin = true; if (optlist.Find(L"pdffilter") != -1) gGlobalData.installPdfFilter = true; if (optlist.Find(L"pdfpreviewer") != -1) gGlobalData.installPdfPreviewer = true; } #endif else if (is_arg("h") || is_arg("help") || is_arg("?")) gGlobalData.showUsageAndQuit = true; #ifdef ENABLE_CRASH_TESTING else if (is_arg("crash")) { // will induce crash when 'Install' button is pressed // for testing crash handling gForceCrash = true; } #endif } }
void BenchFileOrDir(WStrVec& pathsToBench) { gLog = new slog::StderrLogger(); size_t n = pathsToBench.Count() / 2; for (size_t i = 0; i < n; i++) { WCHAR *path = pathsToBench.At(2 * i); if (file::Exists(path)) BenchFile(path, pathsToBench.At(2 * i + 1)); else if (dir::Exists(path)) BenchDir(path); else logbench(L"Error: file or dir %s doesn't exist", path); } delete gLog; }
static void ApplyPrintSettings(const WCHAR *settings, int pageCount, Vec<PRINTPAGERANGE>& ranges, Print_Advanced_Data& advanced, LPDEVMODE devMode) { WStrVec rangeList; if (settings) rangeList.Split(settings, L",", true); for (size_t i = 0; i < rangeList.Count(); i++) { int val; PRINTPAGERANGE pr; if (str::Parse(rangeList.At(i), L"%d-%d%$", &pr.nFromPage, &pr.nToPage)) { pr.nFromPage = limitValue(pr.nFromPage, (DWORD)1, (DWORD)pageCount); pr.nToPage = limitValue(pr.nToPage, (DWORD)1, (DWORD)pageCount); ranges.Append(pr); } else if (str::Parse(rangeList.At(i), L"%d%$", &pr.nFromPage)) { pr.nFromPage = pr.nToPage = limitValue(pr.nFromPage, (DWORD)1, (DWORD)pageCount); ranges.Append(pr); } else if (str::Eq(rangeList.At(i), L"even")) advanced.range = PrintRangeEven; else if (str::Eq(rangeList.At(i), L"odd")) advanced.range = PrintRangeOdd; else if (str::Eq(rangeList.At(i), L"noscale")) advanced.scale = PrintScaleNone; else if (str::Eq(rangeList.At(i), L"shrink")) advanced.scale = PrintScaleShrink; else if (str::Eq(rangeList.At(i), L"fit")) advanced.scale = PrintScaleFit; else if (str::Eq(rangeList.At(i), L"compat")) advanced.asImage = true; else if (str::Parse(rangeList.At(i), L"%dx%$", &val) && 0 < val && val < 1000) devMode->dmCopies = (short)val; else if (str::Eq(rangeList.At(i), L"duplex") || str::Eq(rangeList.At(i), L"duplexlong")) devMode->dmDuplex = DMDUP_VERTICAL; else if (str::Eq(rangeList.At(i), L"duplexshort")) devMode->dmDuplex = DMDUP_HORIZONTAL; } if (ranges.Count() == 0) { PRINTPAGERANGE pr = { 1, pageCount }; ranges.Append(pr); } }