2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-05-29 16:30:53 +00:00

QPDFJob: partial mode for initializeFromJson

This commit is contained in:
Jay Berkenbilt 2022-01-30 14:39:38 -05:00
parent cd30f626fe
commit 1355d95d08
3 changed files with 26 additions and 7 deletions

View File

@ -73,8 +73,20 @@ class QPDFJob
void initializeFromArgv(int argc, char* argv[],
char const* progname_env = nullptr);
// Initialize a QPDFJob from json. Passing partial = true prevents
// this method from doing the final checks (calling
// checkConfiguration) after processing the json file. This makes
// it possible to initialze QPDFJob in stages using multiple json
// files or to have a json file that can be processed from the CLI
// with --job-json-file and be combined with other arguments. For
// example, you might include only encryption parameters, leaving
// it up to the rest of the command-line arguments to provide
// input and output files. initializeFromJson is called with
// partial = true when invoked from the command line. To make sure
// that the json file is fully valid on its own, just don't
// specify any other command-line flags.
QPDF_DLL
void initializeFromJson(std::string const& json);
void initializeFromJson(std::string const& json, bool partial = false);
// Set name that is used to prefix verbose messages, progress
// messages, and other things that the library writes to output

View File

@ -730,7 +730,7 @@ QPDFJob::Config::jobJsonFile(char const* parameter)
QUtil::read_file_into_memory(parameter, file_buf, size);
try
{
o.initializeFromJson(std::string(file_buf.getPointer(), size));
o.initializeFromJson(std::string(file_buf.getPointer(), size), true);
}
catch (std::exception& e)
{

View File

@ -15,7 +15,7 @@ namespace
class Handlers
{
public:
Handlers(std::shared_ptr<QPDFJob::Config> c_main);
Handlers(bool partial, std::shared_ptr<QPDFJob::Config> c_main);
void handle(JSON&);
private:
@ -47,6 +47,7 @@ namespace
setup_handler_t bindSetup(void (Handlers::*f)(std::string const&));
std::list<std::shared_ptr<JSONHandler>> json_handlers;
bool partial;
JSONHandler* jh; // points to last of json_handlers
std::shared_ptr<QPDFJob::Config> c_main;
std::shared_ptr<QPDFJob::CopyAttConfig> c_copy_att;
@ -57,7 +58,8 @@ namespace
};
}
Handlers::Handlers(std::shared_ptr<QPDFJob::Config> c_main) :
Handlers::Handlers(bool partial, std::shared_ptr<QPDFJob::Config> c_main) :
partial(partial),
jh(nullptr),
c_main(c_main)
{
@ -95,7 +97,12 @@ Handlers::initHandlers()
this->jh = this->json_handlers.back().get();
jh->addDictHandlers(
[](std::string const&, JSON){},
[this](std::string const&){c_main->checkConfiguration();});
[this](std::string const&){
if (! this->partial)
{
c_main->checkConfiguration();
}
});
# include <qpdf/auto_job_json_init.hh>
@ -623,7 +630,7 @@ Handlers::setupOptionsUnderlayPassword(std::string const& key)
}
void
QPDFJob::initializeFromJson(std::string const& json)
QPDFJob::initializeFromJson(std::string const& json, bool partial)
{
std::list<std::string> errors;
JSON j = JSON::parse(json);
@ -639,5 +646,5 @@ QPDFJob::initializeFromJson(std::string const& json)
throw std::runtime_error(msg.str());
}
Handlers(config()).handle(j);
Handlers(partial, config()).handle(j);
}