/* * 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. */ #ifndef __LIB_WPRINT_H__ #define __LIB_WPRINT_H__ #include "wtypes.h" #include "wprint_df_types.h" #include "mime_types.h" #include "printer_capabilities_types.h" #include "wprint_status_types.h" #include "ifc_wprint.h" #include <dlfcn.h> #include <ctype.h> #include <stdlib.h> #define WPRINT_BAD_JOB_HANDLE ((wJob_t) ERROR) #define _INTERFACE_MAJOR_VERSION 1 #define _INTERFACE_MINOR_VERSION 0 #define _PLUGIN_MAJOR_VERSION 1 #define WPRINT_INTERFACE_VERSION ((uint32)((_INTERFACE_MAJOR_VERSION << 16) | \ (_INTERFACE_MINOR_VERSION & 0xffff))) #define WPRINT_PLUGIN_VERSION(X) ((uint32)((_PLUGIN_MAJOR_VERSION << 16) | (X & 0xffff))) #define major_version(X) ((X >> 16) & 0xffff) #define minor_version(X) ((X >> 0) & 0xffff) #define STRIPE_HEIGHT (16) #define BUFFERED_ROWS (STRIPE_HEIGHT * 8) #define MAX_MIME_LENGTH (64) #define MAX_PRINTER_ADDR_LENGTH (64) #define MAX_FILENAME_LENGTH (32) #define MAX_PATHNAME_LENGTH (255) #define MAX_ID_STRING_LENGTH (64) #define MAX_NAME_LENGTH (255) #ifdef __cplusplus extern "C" { #endif typedef enum { DUPLEX_DRY_TIME_NORMAL, // 18 seconds DUPLEX_DRY_TIME_LOWER, // 10 seconds DUPLEX_DRY_TIME_MINIMUM // 5 seconds } duplex_dry_time_t; typedef enum { PORT_INVALID = -1, PORT_FILE = 0, PORT_IPP = 631, } port_t; typedef enum { PCLNONE, PCLm, PCLJPEG, PCLPWG, PCL_NUM_TYPES } pcl_t; typedef enum { AUTO_ROTATE, CENTER_VERTICAL, CENTER_HORIZONTAL, ROTATE_BACK_PAGE, BACK_PAGE_PREROTATED, AUTO_SCALE, AUTO_FIT, PORTRAIT_MODE, LANDSCAPE_MODE, CENTER_ON_ORIENTATION, DOCUMENT_SCALING, } render_flags_t; #define RENDER_FLAG_AUTO_ROTATE (1 << AUTO_ROTATE) #define RENDER_FLAG_ROTATE_BACK_PAGE (1 << ROTATE_BACK_PAGE) #define RENDER_FLAG_BACK_PAGE_PREROTATED (1 << BACK_PAGE_PREROTATED) #define RENDER_FLAG_CENTER_VERTICAL (1 << CENTER_VERTICAL) #define RENDER_FLAG_CENTER_HORIZONTAL (1 << CENTER_HORIZONTAL) #define RENDER_FLAG_AUTO_SCALE (1 << AUTO_SCALE) #define RENDER_FLAG_AUTO_FIT (1 << AUTO_FIT) #define RENDER_FLAG_PORTRAIT_MODE (1 << PORTRAIT_MODE) #define RENDER_FLAG_LANDSCAPE_MODE (1 << LANDSCAPE_MODE) #define RENDER_FLAG_CENTER_ON_ORIENTATION (1 << CENTER_ON_ORIENTATION) #define RENDER_FLAG_DOCUMENT_SCALING (1 << DOCUMENT_SCALING) #define AUTO_SCALE_RENDER_FLAGS (RENDER_FLAG_AUTO_SCALE | \ RENDER_FLAG_AUTO_ROTATE | \ RENDER_FLAG_CENTER_VERTICAL | \ RENDER_FLAG_CENTER_HORIZONTAL) #define AUTO_FIT_RENDER_FLAGS (RENDER_FLAG_AUTO_FIT | \ RENDER_FLAG_AUTO_ROTATE | \ RENDER_FLAG_CENTER_ON_ORIENTATION) #define ORIENTATION_RENDER_FLAGS (RENDER_FLAG_AUTO_ROTATE | \ RENDER_FLAG_PORTRAIT_MODE | \ RENDER_FLAG_LANDSCAPE_MODE | \ RENDER_FLAG_CENTER_ON_ORIENTATION) typedef void (*wprint_status_cb_t)(wJob_t job_id, void *parm); /* * Parameters describing a job request */ typedef struct { media_size_t media_size; media_type_t media_type; duplex_t duplex; duplex_dry_time_t dry_time; color_space_t color_space; media_tray_t media_tray; unsigned int num_copies; bool borderless; unsigned int render_flags; float job_top_margin; float job_left_margin; float job_right_margin; float job_bottom_margin; bool renderInReverseOrder; // these values are pixels unsigned int print_top_margin; unsigned int print_left_margin; unsigned int print_right_margin; unsigned int print_bottom_margin; // these values are in pixels unsigned int pixel_units; unsigned int width; unsigned int height; unsigned int printable_area_width; unsigned int printable_area_height; unsigned int strip_height; bool cancelled; bool last_page; int page_num; int copy_num; int copy_page_num; int page_corrupted; bool page_printing; bool page_backside; bool media_size_name; // these values are in inches float page_width; float page_height; float page_top_margin; float page_left_margin; float page_right_margin; float page_bottom_margin; const char *print_format; char *page_range; pcl_t pcl_type; void *plugin_data; bool ipp_1_0_supported; bool ipp_2_0_supported; bool epcl_ipp_supported; bool accepts_pclm; bool accepts_pdf; bool copies_supported; int print_quality; const char *useragent; char docCategory[10]; const char *media_default; // Expected certificate if any uint8 *certificate; int certificate_len; // IPP max job-name is 2**31 - 1, we set a shorter limit char job_name[MAX_ID_STRING_LENGTH + 1]; char job_originating_user_name[MAX_NAME_LENGTH + 1]; int pdf_render_resolution; bool accepts_app_name; bool accepts_app_version; bool accepts_os_name; bool accepts_os_version; } wprint_job_params_t; typedef struct wprint_connect_info_st wprint_connect_info_t; /* * Parameters defining how to reach a remote printing service */ struct wprint_connect_info_st { const char *printer_addr; const char *uri_path; const char *uri_scheme; int port_num; /* Timeout per retry in milliseconds */ long timeout; /* Return non-0 if the received certificate is not acceptable. */ int (*validate_certificate)(struct wprint_connect_info_st *connect_info, uint8 *data, int data_len); /* User-supplied data. */ void *user; }; /* * Current state of a queued job */ typedef enum { JOB_QUEUED = 1, JOB_RUNNING, JOB_BLOCKED, JOB_DONE } wprint_job_state_t; typedef struct { wprint_job_state_t state; unsigned int blocked_reasons; int job_done_result; // Certificate received from printer, if any uint8 *certificate; int certificate_len; } wprint_job_callback_params_t; typedef enum { PRIORITY_PASSTHRU = 1, PRIORITY_LOCAL, } wprint_priority_t; /* Forward declaration (actual definition in ifc_print_job.h) */ struct ifc_print_job_st; /* * Defines an interface for delivering print jobs */ typedef struct { uint32 version; wprint_priority_t priority; char const **(*get_mime_types)(void); char const **(*get_print_formats)(void); status_t (*start_job)(wJob_t job_handle, const ifc_wprint_t *wprint_ifc, const struct ifc_print_job_st *job_ifc, wprint_job_params_t *job_params); status_t (*print_page)(wprint_job_params_t *job_params, const char *mime_type, const char *pathname); status_t (*print_blank_page)(wJob_t job_handle, wprint_job_params_t *job_params); status_t (*end_job)(wprint_job_params_t *job_params); } wprint_plugin_t; /* * Initialize the wprint system. Identify and gather capabilities of available plug-ins. * Returns the number of plugins found or ERROR. */ int wprintInit(void); /* * Call to test if wprint is running or has been shut down. */ bool wprintIsRunning(); /* * Gets the capabilities of the specified printer. */ status_t wprintGetCapabilities(const wprint_connect_info_t *connect_info, printer_capabilities_t *printer_cap); /* * Fills in the job params structure with default values. */ status_t wprintGetDefaultJobParams(wprint_job_params_t *job_params); /* * Fills in the job params structure with values in accordance with printer capabilities. */ status_t wprintGetFinalJobParams(wprint_job_params_t *job_param, const printer_capabilities_t *printer_cap); /* * Called once per job at the start of the job. Returns a print job handle that is used in * other functions of this library. Returns WPRINT_BAD_JOB_HANDLE for errors. */ wJob_t wprintStartJob(const char *printer_addr, port_t port_num, const wprint_job_params_t *job_params, const printer_capabilities_t *printer_cap, const char *mime_type, const char *pathname, wprint_status_cb_t cb_fn, const char *debugDir, const char *scheme); /* * Sent once per job at the end of the job. A current print job must end for the next one * to start. */ status_t wprintEndJob(wJob_t job_handle); /* * Sent once per page of a multi-page job to deliver a page image in a previously * specified MIME type. The page_number must increment from 1. last_page flag is true if it * is the last page of the job. * * top/left/right/bottom margin are the incremental per page margins in pixels * at the current print resolution that are added on top of the physical page * page margins, passing in 0 results in the default page margins being used. */ status_t wprintPage(wJob_t job_handle, int page_number, const char *filename, bool last_page, bool pdf_page, unsigned int top_margin, unsigned int left_margin, unsigned int right_margin, unsigned int bottom_margin); /* * Cancels a spooled or running job. Returns OK or ERROR */ status_t wprintCancelJob(wJob_t job_handle); /* * Exits the print subsystem */ status_t wprintExit(void); /* * Supplies info about the sending application and OS name */ void wprintSetSourceInfo(const char *appName, const char *appVersion, const char *osName); /* Global variables to hold API, application, and OS details */ extern int g_API_version; extern char g_osName[MAX_ID_STRING_LENGTH + 1]; extern char g_appName[MAX_ID_STRING_LENGTH + 1]; extern char g_appVersion[MAX_ID_STRING_LENGTH + 1]; #ifdef __cplusplus } #endif #endif // __LIB_WPRINT_H__