Home | History | Annotate | Download | only in plugins
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  * Copyright (C) 2016 Mopria Alliance, Inc.
      4  * Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 
     19 #include <stdlib.h>
     20 #include <stdio.h>
     21 #include <unistd.h>
     22 #include <fcntl.h>
     23 #include <errno.h>
     24 #include "ifc_print_job.h"
     25 #include "wprint_debug.h"
     26 
     27 #define TAG "plugin_pdf"
     28 #define BUFF_SIZE 8192
     29 
     30 extern int g_API_version;
     31 
     32 typedef struct {
     33     const ifc_wprint_t *wprint_ifc;
     34     const ifc_print_job_t *print_ifc;
     35 } plugin_data_t;
     36 
     37 static const char *_mime_types[] = {
     38         MIME_TYPE_PDF,
     39         NULL};
     40 
     41 static const char *_print_formats[] = {
     42         PRINT_FORMAT_PDF,
     43         NULL};
     44 
     45 static const char **_get_mime_types(void) {
     46     return _mime_types;
     47 }
     48 
     49 static const char **_get_print_formats(void) {
     50     return _print_formats;
     51 }
     52 
     53 static int _start_job(wJob_t job_handle, const ifc_wprint_t *wprint_ifc_p,
     54         const ifc_print_job_t *print_job_ifc_p,
     55         wprint_job_params_t *job_params) {
     56     plugin_data_t *priv;
     57     if (job_params == NULL) return ERROR;
     58 
     59     job_params->plugin_data = NULL;
     60     if ((wprint_ifc_p == NULL) || (print_job_ifc_p == NULL)) return ERROR;
     61 
     62     priv = (plugin_data_t *) malloc(sizeof(plugin_data_t));
     63     priv->wprint_ifc = (ifc_wprint_t *) wprint_ifc_p;
     64     priv->print_ifc = (ifc_print_job_t *) print_job_ifc_p;
     65 
     66     job_params->plugin_data = (void *) priv;
     67     return OK;
     68 }
     69 
     70 static int _print_page(wprint_job_params_t *job_params, const char *mime_type,
     71         const char *pathname) {
     72     plugin_data_t *priv;
     73     int fd;
     74     int result = OK;
     75     int rbytes, wbytes, nbytes = 0;
     76     char *buff;
     77 
     78     if (job_params == NULL) return ERROR;
     79 
     80     priv = (plugin_data_t *) job_params->plugin_data;
     81 
     82     if (priv == NULL) return ERROR;
     83 
     84     //  open the PDF file and dump it to the socket
     85     if (pathname && strlen(pathname)) {
     86         buff = malloc(BUFF_SIZE);
     87         if (buff == NULL) {
     88             return ERROR;
     89         }
     90 
     91         fd = open(pathname, O_RDONLY);
     92         if (fd != ERROR) {
     93             rbytes = read(fd, buff, BUFF_SIZE);
     94 
     95             while ((rbytes > 0) && !job_params->cancelled) {
     96                 wbytes = priv->print_ifc->send_data(priv->print_ifc, buff, rbytes);
     97                 if (wbytes == rbytes) {
     98                     nbytes += wbytes;
     99                     rbytes = read(fd, buff, BUFF_SIZE);
    100                 } else {
    101                     LOGE("ERROR: write() failed, %s", strerror(errno));
    102                     result = ERROR;
    103                     break;
    104                 }
    105             }
    106             LOGI("dumped %d bytes of %s to printer", nbytes, pathname);
    107             close(fd);
    108         }
    109 
    110         free(buff);
    111     }
    112     if ((job_params->page_range != NULL) && (strcmp(job_params->page_range, "") != 0)) {
    113         remove(pathname);
    114     }
    115     return result;
    116 }
    117 
    118 static int _end_job(wprint_job_params_t *job_params) {
    119     if (job_params != NULL) {
    120         if (job_params->plugin_data != NULL) {
    121             free(job_params->plugin_data);
    122         }
    123     }
    124     return OK;
    125 }
    126 
    127 wprint_plugin_t *libwprintplugin_pdf_reg(void) {
    128     static const wprint_plugin_t _pdf_plugin = {.version = WPRINT_PLUGIN_VERSION(0),
    129             .priority = PRIORITY_PASSTHRU, .get_mime_types = _get_mime_types,
    130             .get_print_formats = _get_print_formats, .start_job = _start_job,
    131             .print_page = _print_page, .print_blank_page = NULL, .end_job = _end_job,};
    132     return ((wprint_plugin_t *) &_pdf_plugin);
    133 }