gecko-dev/widget/nsCUPSShim.cpp
Emilio Cobos Álvarez 576f4c3f48 Bug 1701019 - Add support for cups 1.6+ to the printing code. r=jwatt
Just make some functions optional and deal with them not being there.

We won't have localized media names and per-printer paper lists, but
that seems fine, it's an obvious improvement over not showing printers.

Also, add some logging so next time we need to debug something like this
we can figure out without having to rebuild.

Differential Revision: https://phabricator.services.mozilla.com/D110032
2021-03-29 10:08:44 +00:00

77 lines
2.4 KiB
C++

/* -*- Mode: C; tab-width: 4; 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/. */
#include "nsDebug.h"
#include "nsString.h"
#include "nsCUPSShim.h"
#include "mozilla/ArrayUtils.h"
#include "mozilla/Logging.h"
#include "prlink.h"
#ifdef CUPS_SHIM_RUNTIME_LINK
mozilla::LazyLogModule gCupsLinkLog("CupsLink");
# define DEBUG_LOG(...) \
MOZ_LOG(gCupsLinkLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
// TODO: This is currently pointless as we always use the compile-time linked
// version of CUPS, but in the future this may become a configure option.
// We also cannot use NSPR's library suffix support, since that cannot handle
// version number suffixes.
# ifdef XP_MACOSX
static const char gCUPSLibraryName[] = "libcups.2.dylib";
# else
static const char gCUPSLibraryName[] = "libcups.so.2";
# endif
static bool LoadCupsFunc(PRLibrary* aLib, void** aDest, const char* const aName,
nsCUPSShim::Optional aOptional) {
*aDest = PR_FindSymbol(aLib, aName);
if (!*aDest) {
DEBUG_LOG("%s not found in CUPS library", aName);
return bool(aOptional);
}
return true;
}
nsCUPSShim::nsCUPSShim() {
mCupsLib = PR_LoadLibrary(gCUPSLibraryName);
if (!mCupsLib) {
DEBUG_LOG("CUPS library not found");
return;
}
bool success = true;
// This is a macro so that it could also load from libcups if we are
// configured to use it as a compile-time dependency.
//
// We try to load all functions even if some fail so that we get the debug log
// unconditionally.
# define CUPS_SHIM_LOAD(opt_, fn_) \
success |= \
LoadCupsFunc(mCupsLib, reinterpret_cast<void**>(&fn_), #fn_, opt_);
CUPS_SHIM_ALL_FUNCS(CUPS_SHIM_LOAD)
# undef CUPS_SHIM_LOAD
if (!success) {
# ifndef MOZ_TSAN
// With TSan, we cannot unload libcups once we have loaded it because
// TSan does not support unloading libraries that are matched from its
// suppression list. Hence we just keep the library loaded in TSan builds.
PR_UnloadLibrary(mCupsLib);
# endif
mCupsLib = nullptr;
return;
}
// Set mInitOkay only if all cups functions are loaded successfully.
mInitOkay = true;
}
#endif