diff options
Diffstat (limited to '')
-rw-r--r-- | widget/nsCUPSShim.h | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/widget/nsCUPSShim.h b/widget/nsCUPSShim.h new file mode 100644 index 0000000000..8ab00a48ad --- /dev/null +++ b/widget/nsCUPSShim.h @@ -0,0 +1,96 @@ +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ex: set tabstop=8 softtabstop=2 shiftwidth=2 expandtab: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef nsCUPSShim_h___ +#define nsCUPSShim_h___ + +#include <cups/cups.h> +#include "mozilla/Atomics.h" +#include "mozilla/Mutex.h" + +// TODO: This should be a configure option, ideally. +#ifndef XP_MACOSX +# define CUPS_SHIM_RUNTIME_LINK +#endif + +struct PRLibrary; + +class nsCUPSShim { + public: +#ifdef CUPS_SHIM_RUNTIME_LINK + nsCUPSShim(); + bool InitOkay() { return mInitOkay; } +#else + nsCUPSShim() = default; + bool InitOkay() { return true; } +#endif + + // We allow some functions to be missing, to degrade as gracefully as possible + // for older versions of CUPS. + // + // The current target is CUPS 1.6 (bug 1701019). + enum class Optional : bool { No, Yes }; + + /** + * Function pointers for supported functions. These are only + * valid after successful initialization. + */ +#define CUPS_SHIM_ALL_FUNCS(X) \ + X(Optional::No, cupsAddOption) \ + X(Optional::No, cupsCheckDestSupported) \ + X(Optional::No, cupsConnectDest) \ + X(Optional::No, cupsCopyDest) \ + X(Optional::No, cupsCopyDestInfo) \ + X(Optional::No, cupsDoRequest) \ + X(Optional::No, cupsEnumDests) \ + X(Optional::No, cupsFreeDestInfo) \ + X(Optional::No, cupsFreeDests) \ + X(Optional::No, cupsGetDestMediaByName) \ + X(Optional::Yes, cupsFindDestDefault) \ + X(Optional::Yes, cupsGetDestMediaDefault) \ + X(Optional::Yes, cupsGetDestMediaCount) \ + X(Optional::Yes, cupsGetDestMediaByIndex) \ + X(Optional::Yes, cupsLocalizeDestMedia) \ + X(Optional::No, cupsGetDest) \ + X(Optional::No, cupsGetDests) \ + X(Optional::No, cupsGetDests2) \ + X(Optional::No, cupsGetNamedDest) \ + X(Optional::No, cupsGetOption) \ + X(Optional::No, cupsServer) \ + X(Optional::Yes, httpAddrPort) \ + X(Optional::No, httpClose) \ + X(Optional::No, httpGetHostname) \ + X(Optional::Yes, httpGetAddress) \ + X(Optional::No, ippAddString) \ + X(Optional::No, ippAddStrings) \ + X(Optional::No, ippDelete) \ + X(Optional::No, ippFindAttribute) \ + X(Optional::No, ippGetCount) \ + X(Optional::No, ippGetString) \ + X(Optional::No, ippNewRequest) \ + X(Optional::No, ippPort) + +#ifdef CUPS_SHIM_RUNTIME_LINK + // Define a single field which holds a function pointer. +# define CUPS_SHIM_FUNC_DECL(opt_, fn_) decltype(::fn_)* fn_ = nullptr; +#else + // Define a static constexpr function pointer. GCC can sometimes optimize + // away the pointer fetch for this. +# define CUPS_SHIM_FUNC_DECL(opt_, fn_) \ + static constexpr decltype(::fn_)* const fn_ = ::fn_; +#endif + + CUPS_SHIM_ALL_FUNCS(CUPS_SHIM_FUNC_DECL) +#undef CUPS_SHIM_FUNC_DECL + +#ifdef CUPS_SHIM_RUNTIME_LINK + private: + bool mInitOkay = false; + PRLibrary* mCupsLib = nullptr; +#endif +}; + +#endif /* nsCUPSShim_h___ */ |