You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.9 KiB
133 lines
3.9 KiB
/*
|
|
* Copyright (C) 2016 The Android Open Source Project
|
|
* Copyright (C) 2016 Mopria Alliance, Inc.
|
|
* Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
#include "ifc_print_job.h"
|
|
#include "wprint_debug.h"
|
|
|
|
#define TAG "plugin_pdf"
|
|
#define BUFF_SIZE 8192
|
|
|
|
extern int g_API_version;
|
|
|
|
typedef struct {
|
|
const ifc_wprint_t *wprint_ifc;
|
|
const ifc_print_job_t *print_ifc;
|
|
} plugin_data_t;
|
|
|
|
static const char *_mime_types[] = {
|
|
MIME_TYPE_PDF,
|
|
NULL};
|
|
|
|
static const char *_print_formats[] = {
|
|
PRINT_FORMAT_PDF,
|
|
NULL};
|
|
|
|
static const char **_get_mime_types(void) {
|
|
return _mime_types;
|
|
}
|
|
|
|
static const char **_get_print_formats(void) {
|
|
return _print_formats;
|
|
}
|
|
|
|
static int _start_job(wJob_t job_handle, const ifc_wprint_t *wprint_ifc_p,
|
|
const ifc_print_job_t *print_job_ifc_p,
|
|
wprint_job_params_t *job_params) {
|
|
plugin_data_t *priv;
|
|
if (job_params == NULL) return ERROR;
|
|
|
|
job_params->plugin_data = NULL;
|
|
if ((wprint_ifc_p == NULL) || (print_job_ifc_p == NULL)) return ERROR;
|
|
|
|
priv = (plugin_data_t *) malloc(sizeof(plugin_data_t));
|
|
priv->wprint_ifc = (ifc_wprint_t *) wprint_ifc_p;
|
|
priv->print_ifc = (ifc_print_job_t *) print_job_ifc_p;
|
|
|
|
job_params->plugin_data = (void *) priv;
|
|
return OK;
|
|
}
|
|
|
|
static int _print_page(wprint_job_params_t *job_params, const char *mime_type,
|
|
const char *pathname) {
|
|
plugin_data_t *priv;
|
|
int fd;
|
|
int result = OK;
|
|
int rbytes, wbytes, nbytes = 0;
|
|
char *buff;
|
|
|
|
if (job_params == NULL) return ERROR;
|
|
|
|
priv = (plugin_data_t *) job_params->plugin_data;
|
|
|
|
if (priv == NULL) return ERROR;
|
|
|
|
// open the PDF file and dump it to the socket
|
|
if (pathname && strlen(pathname)) {
|
|
buff = malloc(BUFF_SIZE);
|
|
if (buff == NULL) {
|
|
return ERROR;
|
|
}
|
|
|
|
fd = open(pathname, O_RDONLY);
|
|
if (fd != ERROR) {
|
|
rbytes = read(fd, buff, BUFF_SIZE);
|
|
|
|
while ((rbytes > 0) && !job_params->cancelled) {
|
|
wbytes = priv->print_ifc->send_data(priv->print_ifc, buff, rbytes);
|
|
if (wbytes == rbytes) {
|
|
nbytes += wbytes;
|
|
rbytes = read(fd, buff, BUFF_SIZE);
|
|
} else {
|
|
LOGE("ERROR: write() failed, %s", strerror(errno));
|
|
result = ERROR;
|
|
break;
|
|
}
|
|
}
|
|
LOGI("dumped %d bytes of %s to printer", nbytes, pathname);
|
|
close(fd);
|
|
}
|
|
|
|
free(buff);
|
|
}
|
|
if ((job_params->page_range != NULL) && (strcmp(job_params->page_range, "") != 0)) {
|
|
remove(pathname);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
static int _end_job(wprint_job_params_t *job_params) {
|
|
if (job_params != NULL) {
|
|
if (job_params->plugin_data != NULL) {
|
|
free(job_params->plugin_data);
|
|
}
|
|
}
|
|
return OK;
|
|
}
|
|
|
|
wprint_plugin_t *libwprintplugin_pdf_reg(void) {
|
|
static const wprint_plugin_t _pdf_plugin = {.version = WPRINT_PLUGIN_VERSION(0),
|
|
.priority = PRIORITY_PASSTHRU, .get_mime_types = _get_mime_types,
|
|
.get_print_formats = _get_print_formats, .start_job = _start_job,
|
|
.print_page = _print_page, .print_blank_page = NULL, .end_job = _end_job,};
|
|
return ((wprint_plugin_t *) &_pdf_plugin);
|
|
} |