mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-27 23:02:20 +00:00
b0dc7110a9
Allow to continue enumeration of the printers for all protocols (ie. ipp and ipps). Following advice given by cups guys to use cupsGetDests2 to avoid duplicates of printers in the list: https://bugzilla.redhat.com/show_bug.cgi?id=1983403#c18 Differential Revision: https://phabricator.services.mozilla.com/D147508
97 lines
3.2 KiB
C++
97 lines
3.2 KiB
C++
/* -*- 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___ */
|