/* poppler.cc: glib wrapper for poppler
 * Copyright (C) 2005, Red Hat, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
 */

#include <config.h>
#include "poppler.h"

#ifndef __GI_SCANNER__
#    include <Error.h>
#endif

#include "poppler-private.h"

/**
 * SECTION: poppler-errors
 * @title: Error handling
 * @short_description: Error domain and codes
 *
 */

/**
 * POPPLER_ERROR:
 *
 * Error domain for poppler operations. Errors in this domain will
 * be from the #PopplerError enumeration. See #GError for information
 * on error domains.
 */

GQuark poppler_error_quark(void)
{
    static GQuark q = 0;

    if (q == 0) {
        q = g_quark_from_static_string("poppler-quark");
    }

    return q;
}

/**
 * poppler_get_backend:
 *
 * Returns the backend compiled into the poppler library.
 *
 * Return value: The backend used by poppler
 **/
PopplerBackend poppler_get_backend(void)
{
    return POPPLER_BACKEND_CAIRO;
}

static const char poppler_version[] = PACKAGE_VERSION;

/**
 * poppler_get_version:
 *
 * Returns the version of poppler in use.  This result is not to be freed.
 *
 * Return value: the version of poppler.
 **/
const char *poppler_get_version(void)
{
    return poppler_version;
}

/* We want to install an error callback so that PDF syntax warnings etc
 * can be redirected through the GLib logging API instead of always just
 * going to stderr.
 */

void _poppler_error_cb(ErrorCategory category, Goffset pos, const char *message)
{
    static const char *const cat_str[] = { "Syntax warning", "Syntax error", nullptr, nullptr, "IO error", nullptr, "Unimplemented feature", "Internal error" };

    /* The following will never occur in poppler-glib */
    if (category == errConfig || category == errCommandLine || category == errNotAllowed) {
        return;
    }

    g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "%s at position %" G_GOFFSET_FORMAT ": %s", cat_str[category], (goffset)pos, message);
}
