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}