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 }