/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ex: set tabstop=8 softtabstop=4 shiftwidth=4 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___

/* Various CUPS data types. We don't #include cups headers to avoid
 * requiring CUPS to be installed on the build host (and to avoid having
 * to test for CUPS in configure).
 */
typedef struct /**** Printer Options ****/
{
  char* name;  /* Name of option */
  char* value; /* Value of option */
} cups_option_t;

typedef struct /**** Destination ****/
{
  char *name,             /* Printer or class name */
      *instance;          /* Local instance name or nullptr */
  int is_default;         /* Is this printer the default? */
  int num_options;        /* Number of options */
  cups_option_t* options; /* Options */
} cups_dest_t;

typedef cups_dest_t* (*CupsGetDestType)(const char* printer,
                                        const char* instance, int num_dests,
                                        cups_dest_t* dests);
typedef int (*CupsGetDestsType)(cups_dest_t** dests);
typedef int (*CupsFreeDestsType)(int num_dests, cups_dest_t* dests);
typedef int (*CupsPrintFileType)(const char* printer, const char* filename,
                                 const char* title, int num_options,
                                 cups_option_t* options);
typedef int (*CupsTempFdType)(char* filename, int length);
typedef int (*CupsAddOptionType)(const char* name, const char* value,
                                 int num_options, cups_option_t** options);

struct PRLibrary;

/* Note: this class relies on static initialization. */
class nsCUPSShim {
 public:
  /**
   * Initialize this object. Attempt to load the CUPS shared
   * library and find function pointers for the supported
   * functions (see below).
   * @return false if the shared library could not be loaded, or if
   *                  any of the functions could not be found.
   *         true  for successful initialization.
   */
  bool Init();

  /**
   * @return true  if the object was initialized successfully.
   *         false otherwise.
   */
  bool IsInitialized() { return nullptr != mCupsLib; }

  /* Function pointers for supported functions. These are only
   * valid after successful initialization.
   */
  CupsAddOptionType mCupsAddOption;
  CupsFreeDestsType mCupsFreeDests;
  CupsGetDestType mCupsGetDest;
  CupsGetDestsType mCupsGetDests;
  CupsPrintFileType mCupsPrintFile;
  CupsTempFdType mCupsTempFd;

 private:
  PRLibrary* mCupsLib;
};

#endif /* nsCUPSShim_h___ */
