13bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
23bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2016 The Android Open Source Project
33bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2016 Mopria Alliance, Inc.
43bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
53bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
63bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Licensed under the Apache License, Version 2.0 (the "License");
73bf66744d61d18c66d46f2608de0467ad3df0268Mopria * you may not use this file except in compliance with the License.
83bf66744d61d18c66d46f2608de0467ad3df0268Mopria * You may obtain a copy of the License at
93bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
103bf66744d61d18c66d46f2608de0467ad3df0268Mopria *      http://www.apache.org/licenses/LICENSE-2.0
113bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
123bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Unless required by applicable law or agreed to in writing, software
133bf66744d61d18c66d46f2608de0467ad3df0268Mopria * distributed under the License is distributed on an "AS IS" BASIS,
143bf66744d61d18c66d46f2608de0467ad3df0268Mopria * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153bf66744d61d18c66d46f2608de0467ad3df0268Mopria * See the License for the specific language governing permissions and
163bf66744d61d18c66d46f2608de0467ad3df0268Mopria * limitations under the License.
173bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
183bf66744d61d18c66d46f2608de0467ad3df0268Mopria
193bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <stdlib.h>
203bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <stdio.h>
213bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <unistd.h>
223bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <fcntl.h>
233bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <errno.h>
243bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include "ifc_print_job.h"
253bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include "wprint_debug.h"
263bf66744d61d18c66d46f2608de0467ad3df0268Mopria
273bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define TAG "plugin_pdf"
283bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define BUFF_SIZE 8192
293bf66744d61d18c66d46f2608de0467ad3df0268Mopria
303bf66744d61d18c66d46f2608de0467ad3df0268Mopriaextern int g_API_version;
313bf66744d61d18c66d46f2608de0467ad3df0268Mopria
323bf66744d61d18c66d46f2608de0467ad3df0268Mopriatypedef struct {
333bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const ifc_wprint_t *wprint_ifc;
343bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const ifc_print_job_t *print_ifc;
353bf66744d61d18c66d46f2608de0467ad3df0268Mopria} plugin_data_t;
363bf66744d61d18c66d46f2608de0467ad3df0268Mopria
373bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic const char *_mime_types[] = {
383bf66744d61d18c66d46f2608de0467ad3df0268Mopria        MIME_TYPE_PDF,
393bf66744d61d18c66d46f2608de0467ad3df0268Mopria        NULL};
403bf66744d61d18c66d46f2608de0467ad3df0268Mopria
413bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic const char *_print_formats[] = {
423bf66744d61d18c66d46f2608de0467ad3df0268Mopria        PRINT_FORMAT_PDF,
433bf66744d61d18c66d46f2608de0467ad3df0268Mopria        NULL};
443bf66744d61d18c66d46f2608de0467ad3df0268Mopria
453bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic const char **_get_mime_types(void) {
463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return _mime_types;
473bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
483bf66744d61d18c66d46f2608de0467ad3df0268Mopria
493bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic const char **_get_print_formats(void) {
503bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return _print_formats;
513bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
523bf66744d61d18c66d46f2608de0467ad3df0268Mopria
533bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic int _start_job(wJob_t job_handle, const ifc_wprint_t *wprint_ifc_p,
543bf66744d61d18c66d46f2608de0467ad3df0268Mopria        const ifc_print_job_t *print_job_ifc_p,
553bf66744d61d18c66d46f2608de0467ad3df0268Mopria        wprint_job_params_t *job_params) {
563bf66744d61d18c66d46f2608de0467ad3df0268Mopria    plugin_data_t *priv;
573bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (job_params == NULL) return ERROR;
583bf66744d61d18c66d46f2608de0467ad3df0268Mopria
593bf66744d61d18c66d46f2608de0467ad3df0268Mopria    job_params->plugin_data = NULL;
603bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if ((wprint_ifc_p == NULL) || (print_job_ifc_p == NULL)) return ERROR;
613bf66744d61d18c66d46f2608de0467ad3df0268Mopria
623bf66744d61d18c66d46f2608de0467ad3df0268Mopria    priv = (plugin_data_t *) malloc(sizeof(plugin_data_t));
633bf66744d61d18c66d46f2608de0467ad3df0268Mopria    priv->wprint_ifc = (ifc_wprint_t *) wprint_ifc_p;
643bf66744d61d18c66d46f2608de0467ad3df0268Mopria    priv->print_ifc = (ifc_print_job_t *) print_job_ifc_p;
653bf66744d61d18c66d46f2608de0467ad3df0268Mopria
663bf66744d61d18c66d46f2608de0467ad3df0268Mopria    job_params->plugin_data = (void *) priv;
673bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return OK;
683bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
693bf66744d61d18c66d46f2608de0467ad3df0268Mopria
703bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic int _print_page(wprint_job_params_t *job_params, const char *mime_type,
713bf66744d61d18c66d46f2608de0467ad3df0268Mopria        const char *pathname) {
723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    plugin_data_t *priv;
733bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int fd;
743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int result = OK;
753bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int rbytes, wbytes, nbytes = 0;
763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char *buff;
773bf66744d61d18c66d46f2608de0467ad3df0268Mopria
783bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (job_params == NULL) return ERROR;
793bf66744d61d18c66d46f2608de0467ad3df0268Mopria
803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    priv = (plugin_data_t *) job_params->plugin_data;
813bf66744d61d18c66d46f2608de0467ad3df0268Mopria
823bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (priv == NULL) return ERROR;
833bf66744d61d18c66d46f2608de0467ad3df0268Mopria
843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    //  open the PDF file and dump it to the socket
853bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (pathname && strlen(pathname)) {
863bf66744d61d18c66d46f2608de0467ad3df0268Mopria        buff = malloc(BUFF_SIZE);
873bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (buff == NULL) {
883bf66744d61d18c66d46f2608de0467ad3df0268Mopria            return ERROR;
893bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
903bf66744d61d18c66d46f2608de0467ad3df0268Mopria
913bf66744d61d18c66d46f2608de0467ad3df0268Mopria        fd = open(pathname, O_RDONLY);
923bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (fd != ERROR) {
933bf66744d61d18c66d46f2608de0467ad3df0268Mopria            rbytes = read(fd, buff, BUFF_SIZE);
943bf66744d61d18c66d46f2608de0467ad3df0268Mopria
953bf66744d61d18c66d46f2608de0467ad3df0268Mopria            while ((rbytes > 0) && !job_params->cancelled) {
963bf66744d61d18c66d46f2608de0467ad3df0268Mopria                wbytes = priv->print_ifc->send_data(priv->print_ifc, buff, rbytes);
973bf66744d61d18c66d46f2608de0467ad3df0268Mopria                if (wbytes == rbytes) {
983bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    nbytes += wbytes;
993bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    rbytes = read(fd, buff, BUFF_SIZE);
1003bf66744d61d18c66d46f2608de0467ad3df0268Mopria                } else {
1013bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    LOGE("ERROR: write() failed, %s", strerror(errno));
1023bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    result = ERROR;
1033bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    break;
1043bf66744d61d18c66d46f2608de0467ad3df0268Mopria                }
1053bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
1063bf66744d61d18c66d46f2608de0467ad3df0268Mopria            LOGI("dumped %d bytes of %s to printer", nbytes, pathname);
1073bf66744d61d18c66d46f2608de0467ad3df0268Mopria            close(fd);
1083bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
1093bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1103bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(buff);
1113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1123bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if ((job_params->page_range != NULL) && (strcmp(job_params->page_range, "") != 0)) {
1133bf66744d61d18c66d46f2608de0467ad3df0268Mopria        remove(pathname);
1143bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return result;
1163bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
1173bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1183bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic int _end_job(wprint_job_params_t *job_params) {
1193bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (job_params != NULL) {
1203bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (job_params->plugin_data != NULL) {
1213bf66744d61d18c66d46f2608de0467ad3df0268Mopria            free(job_params->plugin_data);
1223bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
1233bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1243bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return OK;
1253bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
1263bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1273bf66744d61d18c66d46f2608de0467ad3df0268Mopriawprint_plugin_t *libwprintplugin_pdf_reg(void) {
1283bf66744d61d18c66d46f2608de0467ad3df0268Mopria    static const wprint_plugin_t _pdf_plugin = {.version = WPRINT_PLUGIN_VERSION(0),
1293bf66744d61d18c66d46f2608de0467ad3df0268Mopria            .priority = PRIORITY_PASSTHRU, .get_mime_types = _get_mime_types,
1303bf66744d61d18c66d46f2608de0467ad3df0268Mopria            .get_print_formats = _get_print_formats, .start_job = _start_job,
1313bf66744d61d18c66d46f2608de0467ad3df0268Mopria            .print_page = _print_page, .print_blank_page = NULL, .end_job = _end_job,};
1323bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return ((wprint_plugin_t *) &_pdf_plugin);
1333bf66744d61d18c66d46f2608de0467ad3df0268Mopria}