From b74e7989c34e041e7a6461e00ae045045273ca51 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 30 Jan 2022 13:39:17 -0500 Subject: QPDFJob_json: implement handlers except pages --- libqpdf/QPDFJob_json.cc | 172 ++++++++++++++++++++++++++++-------------------- 1 file changed, 100 insertions(+), 72 deletions(-) (limited to 'libqpdf/QPDFJob_json.cc') diff --git a/libqpdf/QPDFJob_json.cc b/libqpdf/QPDFJob_json.cc index a9d68d49..8ebbb926 100644 --- a/libqpdf/QPDFJob_json.cc +++ b/libqpdf/QPDFJob_json.cc @@ -229,7 +229,9 @@ Handlers::setupInputFilename(std::string const& key) void Handlers::setupInputPassword(std::string const& key) { - // QXXXQ + addParameter(key, [this](char const* p) { + c_main->password(p); + }); } void @@ -281,21 +283,53 @@ Handlers::endOutputOptions() } void -Handlers::beginOutputOptionsEncrypt(JSON) +Handlers::beginOutputOptionsEncrypt(JSON j) { - // QXXXQ -// if (this->keylen_seen == 0) -// { -// usage("exactly one of 40bit, 128bit, or 256bit must be given;" -// " an empty dictionary may be supplied for one of them" -// " to set the key length without imposing any restrictions"); -// } + // This method is only called if the overall JSON structure + // matches the schema, so we already know that keys that are + // present have the right types. + int key_len = 0; + std::string user_password; + std::string owner_password; + bool user_password_seen = false; + bool owner_password_seen = false; + j.forEachDictItem([&](std::string const& key, JSON value){ + if ((key == "40bit") || (key == "128bit") || (key == "256bit")) + { + if (key_len != 0) + { + usage("exactly one of 40bit, 128bit, or 256bit must be given"); + } + key_len = QUtil::string_to_int(key.c_str()); + } + else if (key == "userPassword") + { + user_password_seen = value.getString(user_password); + } + else if (key == "ownerPassword") + { + owner_password_seen = value.getString(owner_password); + } + }); + if (key_len == 0) + { + usage("exactly one of 40bit, 128bit, or 256bit must be given;" + " an empty dictionary may be supplied for one of them" + " to set the key length without imposing any restrictions"); + } + if (! (user_password_seen && owner_password_seen)) + { + usage("the user and owner password are both required; use the empty" + " string for the user password if you don't want a password"); + } + this->c_enc = c_main->encrypt(key_len, user_password, owner_password); } void Handlers::endOutputOptionsEncrypt() { - // QXXXQ + this->c_enc->endEncrypt(); + this->c_enc = nullptr; } void @@ -371,147 +405,141 @@ Handlers::endInspect() } void -Handlers::beginTransform(JSON) -{ - // nothing needed -} - -void -Handlers::endTransform() -{ - // nothing needed -} - -void -Handlers::beginModify(JSON) -{ - // nothing needed -} - -void -Handlers::endModify() +Handlers::beginOptionsAddAttachment(JSON) { - // nothing needed + this->c_att = c_main->addAttachment(); } void -Handlers::beginModifyAddAttachment(JSON) +Handlers::endOptionsAddAttachment() { - // QXXXQ + this->c_att->endAddAttachment(); + this->c_att = nullptr; } void -Handlers::endModifyAddAttachment() +Handlers::setupOptionsAddAttachmentPath(std::string const& key) { - // QXXXQ -} - -void -Handlers::setupModifyAddAttachmentPath(std::string const& key) -{ - // QXXXQ setup + addParameter(key, [this](char const* p) { + c_att->path(p); + }); } void -Handlers::beginModifyCopyAttachmentsFrom(JSON) +Handlers::beginOptionsCopyAttachmentsFrom(JSON) { - // QXXXQ + this->c_copy_att = c_main->copyAttachmentsFrom(); } void -Handlers::endModifyCopyAttachmentsFrom() +Handlers::endOptionsCopyAttachmentsFrom() { - // QXXXQ + this->c_copy_att->endCopyAttachmentsFrom(); + this->c_copy_att = nullptr; } void -Handlers::setupModifyCopyAttachmentsFromPath(std::string const& key) +Handlers::setupOptionsCopyAttachmentsFromPath(std::string const& key) { - // QXXXQ setup + addParameter(key, [this](char const* p) { + c_copy_att->path(p); + }); } void -Handlers::setupModifyCopyAttachmentsFromPassword(std::string const& key) +Handlers::setupOptionsCopyAttachmentsFromPassword(std::string const& key) { - // QXXXQ setup + addParameter(key, [this](char const* p) { + c_copy_att->password(p); + }); } void -Handlers::beginModifyPages(JSON) +Handlers::beginOptionsPages(JSON) { // QXXXQ } void -Handlers::endModifyPages() +Handlers::endOptionsPages() { // QXXXQ } void -Handlers::setupModifyPagesFile(std::string const& key) +Handlers::setupOptionsPagesFile(std::string const& key) { - // QXXXQ setup + // handled in beginOptionsPages } void -Handlers::setupModifyPagesPassword(std::string const& key) +Handlers::setupOptionsPagesPassword(std::string const& key) { - // QXXXQ setup + // handled in beginOptionsPages } void -Handlers::setupModifyPagesRange(std::string const& key) +Handlers::setupOptionsPagesRange(std::string const& key) { - // QXXXQ setup + // handled in beginOptionsPages } void -Handlers::beginModifyOverlay(JSON) +Handlers::beginOptionsOverlay(JSON) { - // QXXXQ + this->c_uo = c_main->overlay(); } void -Handlers::endModifyOverlay() +Handlers::endOptionsOverlay() { - // QXXXQ + c_uo->endUnderlayOverlay(); + c_uo = nullptr; } void -Handlers::setupModifyOverlayFile(std::string const& key) +Handlers::setupOptionsOverlayFile(std::string const& key) { - // QXXXQ setup + addParameter(key, [this](char const* p) { + c_uo->path(p); + }); } void -Handlers::setupModifyOverlayPassword(std::string const& key) +Handlers::setupOptionsOverlayPassword(std::string const& key) { - // QXXXQ setup + addParameter(key, [this](char const* p) { + c_uo->password(p); + }); } void -Handlers::beginModifyUnderlay(JSON) +Handlers::beginOptionsUnderlay(JSON) { - // QXXXQ + this->c_uo = c_main->underlay(); } void -Handlers::endModifyUnderlay() +Handlers::endOptionsUnderlay() { - // QXXXQ + c_uo->endUnderlayOverlay(); + c_uo = nullptr; } void -Handlers::setupModifyUnderlayFile(std::string const& key) +Handlers::setupOptionsUnderlayFile(std::string const& key) { - // QXXXQ setup + addParameter(key, [this](char const* p) { + c_uo->path(p); + }); } void -Handlers::setupModifyUnderlayPassword(std::string const& key) +Handlers::setupOptionsUnderlayPassword(std::string const& key) { - // QXXXQ setup + addParameter(key, [this](char const* p) { + c_uo->password(p); + }); } void -- cgit v1.2.3-70-g09d2