summaryrefslogtreecommitdiffstats
path: root/widget/nsCUPSShim.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/nsCUPSShim.h')
-rw-r--r--widget/nsCUPSShim.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/widget/nsCUPSShim.h b/widget/nsCUPSShim.h
new file mode 100644
index 0000000000..658c1e7a17
--- /dev/null
+++ b/widget/nsCUPSShim.h
@@ -0,0 +1,85 @@
+/* -*- 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
+
+ /**
+ * Function pointers for supported functions. These are only
+ * valid after successful initialization.
+ */
+#define CUPS_SHIM_ALL_FUNCS(X) \
+ X(cupsAddOption) \
+ X(cupsCheckDestSupported) \
+ X(cupsConnectDest) \
+ X(cupsCopyDest) \
+ X(cupsCopyDestInfo) \
+ X(cupsDoRequest) \
+ X(cupsEnumDests) \
+ X(cupsFindDestDefault) \
+ X(cupsFreeDestInfo) \
+ X(cupsFreeDests) \
+ X(cupsGetDestMediaDefault) \
+ X(cupsGetDestMediaCount) \
+ X(cupsGetDestMediaByIndex) \
+ X(cupsGetDestMediaByName) \
+ X(cupsGetDest) \
+ X(cupsGetDests) \
+ X(cupsGetNamedDest) \
+ X(cupsGetOption) \
+ X(cupsLocalizeDestMedia) \
+ X(cupsPrintFile) \
+ X(cupsTempFd) \
+ X(httpClose) \
+ X(ippAddString) \
+ X(ippAddStrings) \
+ X(ippDelete) \
+ X(ippFindAttribute) \
+ X(ippGetCount) \
+ X(ippGetString) \
+ X(ippNewRequest)
+
+#ifdef CUPS_SHIM_RUNTIME_LINK
+ // Define a single field which holds a function pointer.
+# define CUPS_SHIM_FUNC_DECL(X) decltype(::X)* X = nullptr;
+#else
+ // Define a static constexpr function pointer. GCC can sometimes optimize
+ // away the pointer fetch for this.
+# define CUPS_SHIM_FUNC_DECL(X) static constexpr decltype(::X)* const X = ::X;
+#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___ */