From eae75dbe448b0395aee7e49c2a9cca9f82680782 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 19 Jun 2022 08:56:36 -0400 Subject: Add Pl_Function -- a generic function pipeline --- include/qpdf/Pl_Function.hh | 73 +++++++++++++++++++++++++++++++++++++++++++++ include/qpdf/Pl_String.hh | 10 +++---- 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 include/qpdf/Pl_Function.hh (limited to 'include') diff --git a/include/qpdf/Pl_Function.hh b/include/qpdf/Pl_Function.hh new file mode 100644 index 00000000..dd700e80 --- /dev/null +++ b/include/qpdf/Pl_Function.hh @@ -0,0 +1,73 @@ +// Copyright (c) 2005-2022 Jay Berkenbilt +// +// This file is part of qpdf. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Versions of qpdf prior to version 7 were released under the terms +// of version 2.0 of the Artistic License. At your option, you may +// continue to consider qpdf to be licensed under those terms. Please +// see the manual for additional information. + +#ifndef PL_FUNCTION_HH +#define PL_FUNCTION_HH + +// This pipeline calls an arbitrary function with whatever data is +// passed to it. This pipeline can be reused. +// +// For this pipeline, "next" may be null. If a next pointer is +// provided, this pipeline will also pass the data through to it and +// will forward finish() to it. +// +// It is okay to not call finish() on this pipeline if it has no +// "next". + +#include + +#include + +class QPDF_DLL_CLASS Pl_Function: public Pipeline +{ + public: + typedef std::function writer_t; + + QPDF_DLL + Pl_Function(char const* identifier, Pipeline* next, writer_t fn); + QPDF_DLL + virtual ~Pl_Function(); + + QPDF_DLL + virtual void write(unsigned char const* buf, size_t len); + QPDF_DLL + virtual void finish(); + + private: + class QPDF_DLL_PRIVATE Members + { + friend class Pl_Function; + + public: + QPDF_DLL + ~Members() = default; + + private: + Members(writer_t); + Members(Members const&) = delete; + + writer_t fn; + }; + + std::shared_ptr m; +}; + +#endif // PL_FUNCTION_HH diff --git a/include/qpdf/Pl_String.hh b/include/qpdf/Pl_String.hh index 327598da..906a2660 100644 --- a/include/qpdf/Pl_String.hh +++ b/include/qpdf/Pl_String.hh @@ -30,11 +30,11 @@ // provided, this pipeline will also pass the data through to it and // will forward finish() to it. // -// It is okay to not call finish() on this pipeline. This makes it -// easy to stick this in front of another pipeline to capture data -// that is written to the other pipeline without interfering with when -// finish is called on the other pipeline and without having to put a -// Pl_Concatenate after it. +// It is okay to not call finish() on this pipeline if it has no +// "next". This makes it easy to stick this in front of another +// pipeline to capture data that is written to the other pipeline +// without interfering with when finish is called on the other +// pipeline and without having to put a Pl_Concatenate after it. #include -- cgit v1.2.3-54-g00ecf