Add initial content handler for PDF format

This commit is contained in:
Vincent Sanders 2017-12-31 00:05:28 +00:00
parent fdaad39a57
commit 0d486a1ffe
10 changed files with 215 additions and 16 deletions

View File

@ -513,7 +513,6 @@ include Makefile.defaults
# libraries enabled by feature switch without pkgconfig file
$(eval $(call feature_switch,JPEG,JPEG (libjpeg),-DWITH_JPEG,-ljpeg,-UWITH_JPEG,))
$(eval $(call feature_switch,HARU_PDF,PDF export (haru),-DWITH_PDF_EXPORT,-lhpdf -lpng,-UWITH_PDF_EXPORT,))
$(eval $(call feature_switch,LIBICONV_PLUG,glibc internal iconv,-DLIBICONV_PLUG,,-ULIBICONV_PLUG,-liconv))
$(eval $(call feature_switch,DUKTAPE,Javascript (Duktape),,,,,))
@ -538,6 +537,7 @@ NETSURF_FEATURE_OPENSSL_CFLAGS := -DWITH_OPENSSL
NETSURF_FEATURE_ROSPRITE_CFLAGS := -DWITH_NSSPRITE
NETSURF_FEATURE_NSPSL_CFLAGS := -DWITH_NSPSL
NETSURF_FEATURE_NSLOG_CFLAGS := -DWITH_NSLOG
NETSURF_FEATURE_NSPDF_CFLAGS := -DWITH_NSPDF
# libcurl and openssl ordering matters as if libcurl requires ssl it
# needs to come first in link order to ensure its symbols can be
@ -559,6 +559,7 @@ $(eval $(call pkg_config_find_and_add_enabled,NSSVG,libsvgtiny,SVG))
$(eval $(call pkg_config_find_and_add_enabled,ROSPRITE,librosprite,Sprite))
$(eval $(call pkg_config_find_and_add_enabled,NSPSL,libnspsl,PSL))
$(eval $(call pkg_config_find_and_add_enabled,NSLOG,libnslog,LOG))
$(eval $(call pkg_config_find_and_add_enabled,NSPDF,libnspdf,PDF))
# List of directories in which headers are searched for
INCLUDE_DIRS :=. include $(OBJROOT)

View File

@ -63,11 +63,9 @@ NETSURF_USE_VIDEO := NO
# Valid options: YES, NO
NETSURF_USE_DUKTAPE := YES
# Enable NetSurf's use of libharu for PDF export and GTK printing support.
# There is no auto-detection available for this, as it does not have a
# pkg-config file.
# Valid options: YES, NO
NETSURF_USE_HARU_PDF := NO
# Enable the use of netsurf integrated pdf viewing
# Valid options: YES, NO, AUTO
NETSURF_USE_NSPDF := AUTO
# Enable the use of the Public suffix library to detect supercookies
# Valid options: YES, NO, AUTO (highly recommended)

View File

@ -17,8 +17,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/** \file
* Content handling (interface).
/**
* \file
* Content handling interface.
*
* The content functions manipulate struct contents, which correspond to URLs.
*/
@ -36,17 +37,34 @@ struct content_redraw_data;
struct http_parameter;
struct content_handler {
/**
* content handler finalisation
*/
void (*fini)(void);
/**
* create a content
*/
nserror (*create)(const struct content_handler *handler,
lwc_string *imime_type,
const struct http_parameter *params,
struct llcache_handle *llcache,
const char *fallback_charset, bool quirks,
const char *fallback_charset,
bool quirks,
struct content **c);
/**
* ongoing fetch has received data
*/
bool (*process_data)(struct content *c,
const char *data, unsigned int size);
const char *data,
unsigned int size);
/**
* fetcher has completed retrieving all the data
*
* \param c The completed content.
*/
bool (*data_complete)(struct content *c);
void (*reformat)(struct content *c, int width, int height);
void (*destroy)(struct content *c);
@ -82,10 +100,14 @@ struct content_handler {
void (*add_user)(struct content *c);
void (*remove_user)(struct content *c);
/** handler dependant content sensitive internal data interface. */
/**
* handler dependant content sensitive internal data interface.
*/
void * (*get_internal)(const struct content *c, void *context);
/** There must be one content per user for this type. */
/**
* There must be one content per user for this type.
*/
bool no_share;
};

View File

@ -13,4 +13,9 @@ include content/handlers/javascript/Makefile
S_CONTENT += $(addprefix handlers/javascript/,$(S_JAVASCRIPT))
# PDF source
include content/handlers/pdf/Makefile
S_CONTENT += $(addprefix handlers/pdf/,$(S_PDF))
INCLUDE_DIRS += content/handlers

View File

@ -17,8 +17,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/** \file
* Content for image/jpeg (implementation).
/**
* \file
* implementation of content handling for JPEG images.
*
* This implementation uses the IJG JPEG library.
*/

View File

@ -0,0 +1,11 @@
#
# NetSurf pdf source file inclusion
#
# Included by content handlers Makefile
#
ifeq ($(NETSURF_USE_NSPDF),YES)
S_PDF := pdf.c
else
S_PDF :=
endif

122
content/handlers/pdf/pdf.c Normal file
View File

@ -0,0 +1,122 @@
/*
* Copyright 2004 James Bursa <bursa@users.sourceforge.net>
* Copyright 2004 John M Bell <jmb202@ecs.soton.ac.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
* NetSurf 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; version 2 of the License.
*
* NetSurf 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, see <http://www.gnu.org/licenses/>.
*/
/**
* \file
* implementation of content handling for PDF.
*
* This implementation uses the netsurf pdf library.
*/
#include <stdbool.h>
#include <stdlib.h>
#include "utils/utils.h"
#include "content/llcache.h"
#include "content/content_protected.h"
#include "pdf.h"
/**
* Content create entry point.
*/
static nserror
pdf_create(const content_handler *handler,
lwc_string *imime_type,
const struct http_parameter *params,
llcache_handle *llcache,
const char *fallback_charset,
bool quirks,
struct content **c)
{
struct content *jpeg;
nserror error;
jpeg = calloc(1, sizeof(struct content));
if (jpeg == NULL)
return NSERROR_NOMEM;
error = content__init(jpeg, handler, imime_type, params,
llcache, fallback_charset, quirks);
if (error != NSERROR_OK) {
free(jpeg);
return error;
}
*c = jpeg;
return NSERROR_OK;
}
/* exported interface documented in image_cache.h */
static void pdf_destroy(struct content *content)
{
}
static bool pdf_convert(struct content *c)
{
content_set_ready(c);
content_set_done(c);
return true;
}
/* exported interface documented in image_cache.h */
static bool
pdf_redraw(struct content *c,
struct content_redraw_data *data,
const struct rect *clip,
const struct redraw_context *ctx)
{
return true;
}
/**
* Clone content.
*/
static nserror pdf_clone(const struct content *old, struct content **newc)
{
return NSERROR_NOMEM;
}
static content_type pdf_content_type(void)
{
return CONTENT_PDF;
}
static const content_handler nspdf_content_handler = {
.create = pdf_create,
.data_complete = pdf_convert,
.destroy = pdf_destroy,
.redraw = pdf_redraw,
.clone = pdf_clone,
.type = pdf_content_type,
.no_share = false,
};
static const char *nspdf_types[] = {
"application/pdf",
"application/x-pdf",
"application/acrobat",
"applications/vnd.pdf",
"text/pdf",
"text/x-pdf"
};
CONTENT_FACTORY_REGISTER_TYPES(nspdf, nspdf_types, nspdf_content_handler);

View File

@ -0,0 +1,29 @@
/*
* Copyright 2018 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
* NetSurf 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; version 2 of the License.
*
* NetSurf 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, see <http://www.gnu.org/licenses/>.
*/
/**
* \file
* Interface for PDF content handler.
*/
#ifndef NETSURF_PDF_PDF_H_
#define NETSURF_PDF_PDF_H_
nserror nspdf_init(void);
#endif

View File

@ -43,6 +43,7 @@
#include "javascript/js.h"
#include "render/html.h"
#include "render/textplain.h"
#include "pdf/pdf.h"
#include "netsurf/browser_window.h"
#include "desktop/system_colour.h"
@ -214,6 +215,12 @@ nserror netsurf_init(const char *store_path)
if (ret != NSERROR_OK)
return ret;
#ifdef WITH_NSPDF
ret = nspdf_init();
if (ret != NSERROR_OK)
return ret;
#endif
setlocale(LC_ALL, "");
/* initialise the fetchers */

View File

@ -1,5 +1,5 @@
/*
* Copyright 2003 James Bursa <bursa@users.sourceforge.net>
* Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@ -68,8 +68,11 @@ typedef enum {
/** All script types. */
CONTENT_SCRIPT = 0x40,
/** Portable Document Format. */
CONTENT_PDF = 0x80,
/** Any content matches */
CONTENT_ANY = 0x7f
CONTENT_ANY = 0xff
} content_type;