shared_ptr<IBackgroundJob::Details> PortalsOptimizerJob::getDetails() const { String jobName(Engine::instance()->getText("job.optimizer")); shared_ptr<Portal> portal = getPortal(); if(portal != nullptr) { jobName.append(" - "); jobName.append(portal->getPovName()); } shared_ptr<Details> details(OS_NEW Details(jobName.to_wide())); return details; }
shared_ptr<IBackgroundJob::Details> PortalsImporterJob::getDetails() const { String jobName(Engine::instance()->getText("job.importer")); shared_ptr<Portal> portal = m_impl->getPortal(); if(portal != nullptr) { jobName.append(" - "); jobName.append(portal->getName()); } shared_ptr<Details> details(OS_NEW Details(jobName.to_wide())); String status = Engine::instance()->getText(_S("job.importer.status.") + m_impl->getStatus()); details->setStatus(status.to_wide()); shared_ptr<PortalsSerializer> serializer = m_impl->getSerializer(); if(serializer != nullptr) details->setPercentage(serializer->getProgressPercentage()); shared_ptr<PortalsSerializer::IResult> result = m_impl->getResult(); if(portal != nullptr && result != nullptr) { // TOTRANSLATE String msg = _S("[center][a class=\"os_button\" href=\"{@url}\"]Enter in portal[/a][br/][sub]Objects: [b]{@total}[/b], Imported: [b]{@imported}[/b], Skipped: [b]{@skipped}[/b], Invalid: [b]{@invalid}[/b][/sub][/center]"); msg.replace_all(_S("{@url}"), portal->getLink("view")); msg.replace_all(_S("{@total}"), conversions::to_utf16(result->getTotalObjects())); msg.replace_all(_S("{@imported}"), conversions::to_utf16(result->getImportedObjects())); msg.replace_all(_S("{@skipped}"), conversions::to_utf16(result->getSkippedObjects())); msg.replace_all(_S("{@invalid}"), conversions::to_utf16(result->getCorruptedObjects())); details->setResult(msg); } return details; }
shared_ptr<IBackgroundJob::Details> PortalsExporterJob::getDetails() const { String jobName(Engine::instance()->getText("job.exporter")); shared_ptr<Portal> portal = getPortal(); if(portal != nullptr) { jobName.append(" - "); jobName.append(portal->getName()); } shared_ptr<Details> details(OS_NEW Details(jobName.to_wide())); details->setPercentage(m_serializer->getProgressPercentage()); if(m_file != nullptr && m_downloadDirectory != nullptr) { // TOTRANSLATE String msg = _S("[center][a class=\"os_button\" href=\"{@url}\"]Click here for download[/a][/center]"); msg.replace_all(_S("{@url}"), m_downloadDirectory->getPath().getUrl()); details->setResult(msg); //details->setUrl(m_downloadDirectory->getPath().getUrl().to_ascii()); } return details; }
// see http://itexmac.sourceforge.net/pdfsync.html for the specification int Pdfsync::RebuildIndex() { size_t len; ScopedMem<char> data(file::ReadAll(syncfilepath, &len)); if (!data) return PDFSYNCERR_SYNCFILE_CANNOT_BE_OPENED; // convert the file data into a list of zero-terminated strings str::TransChars(data, "\r\n", "\0\0"); // parse preamble (jobname and version marker) char *line = data; char *dataEnd = data + len; // replace star by spaces (TeX uses stars instead of spaces in filenames) str::TransChars(line, "*/", " \\"); ScopedMem<WCHAR> jobName(str::conv::FromAnsi(line)); jobName.Set(str::Join(jobName, L".tex")); jobName.Set(PrependDir(jobName)); line = Advance0Line(line, dataEnd); UINT versionNumber = 0; if (!line || !str::Parse(line, "version %u", &versionNumber) || versionNumber != 1) return PDFSYNCERR_SYNCFILE_CANNOT_BE_OPENED; // reset synchronizer database srcfiles.Reset(); lines.Reset(); points.Reset(); fileIndex.Reset(); sheetIndex.Reset(); Vec<size_t> filestack; UINT page = 1; sheetIndex.Append(0); // add the initial tex file to the source file stack filestack.Push(srcfiles.Count()); srcfiles.Append(jobName.StealData()); PdfsyncFileIndex findex = { 0 }; fileIndex.Append(findex); PdfsyncLine psline; PdfsyncPoint pspoint; // parse data UINT maxPageNo = engine->PageCount(); while ((line = Advance0Line(line, dataEnd)) != NULL) { if (!line) break; switch (*line) { case 'l': psline.file = filestack.Last(); if (str::Parse(line, "l %u %u %u", &psline.record, &psline.line, &psline.column)) lines.Append(psline); else if (str::Parse(line, "l %u %u", &psline.record, &psline.line)) { psline.column = 0; lines.Append(psline); } // else dbg("Bad 'l' line in the pdfsync file"); break; case 's': if (str::Parse(line, "s %u", &page)) sheetIndex.Append(points.Count()); // else dbg("Bad 's' line in the pdfsync file"); // if (0 == page || page > maxPageNo) // dbg("'s' line with invalid page number in the pdfsync file"); break; case 'p': pspoint.page = page; if (0 == page || page > maxPageNo) /* ignore point for invalid page number */; else if (str::Parse(line, "p %u %u %u", &pspoint.record, &pspoint.x, &pspoint.y)) points.Append(pspoint); else if (str::Parse(line, "p* %u %u %u", &pspoint.record, &pspoint.x, &pspoint.y)) points.Append(pspoint); // else dbg("Bad 'p' line in the pdfsync file"); break; case '(': { ScopedMem<WCHAR> filename(str::conv::FromAnsi(line + 1)); // if the filename contains quotes then remove them // TODO: this should never happen!? if (filename[0] == '"' && filename[str::Len(filename) - 1] == '"') filename.Set(str::DupN(filename + 1, str::Len(filename) - 2)); // undecorate the filepath: replace * by space and / by \ str::TransChars(filename, L"*/", L" \\"); // if the file name extension is not specified then add the suffix '.tex' if (str::IsEmpty(path::GetExt(filename))) filename.Set(str::Join(filename, L".tex")); // ensure that the path is absolute if (PathIsRelative(filename)) filename.Set(PrependDir(filename)); filestack.Push(srcfiles.Count()); srcfiles.Append(filename.StealData()); findex.start = findex.end = lines.Count(); fileIndex.Append(findex); } break; case ')': if (filestack.Count() > 1) fileIndex.At(filestack.Pop()).end = lines.Count(); // else dbg("Unbalanced ')' line in the pdfsync file"); break; default: // dbg("Ignoring invalid pdfsync line starting with '%c'", *line); break; } } fileIndex.At(0).end = lines.Count(); assert(filestack.Count() == 1); return Synchronizer::RebuildIndex(); }