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 #ifndef __LIB_WPRINT_H__ 20 #define __LIB_WPRINT_H__ 21 22 #include "wtypes.h" 23 #include "wprint_df_types.h" 24 #include "mime_types.h" 25 #include "printer_capabilities_types.h" 26 #include "wprint_status_types.h" 27 #include "ifc_wprint.h" 28 #include <dlfcn.h> 29 #include <ctype.h> 30 #include <stdlib.h> 31 32 #define WPRINT_BAD_JOB_HANDLE ((wJob_t) ERROR) 33 34 #define _INTERFACE_MAJOR_VERSION 1 35 #define _INTERFACE_MINOR_VERSION 0 36 37 #define _PLUGIN_MAJOR_VERSION 1 38 39 #define WPRINT_INTERFACE_VERSION ((uint32)((_INTERFACE_MAJOR_VERSION << 16) | \ 40 (_INTERFACE_MINOR_VERSION & 0xffff))) 41 #define WPRINT_PLUGIN_VERSION(X) ((uint32)((_PLUGIN_MAJOR_VERSION << 16) | (X & 0xffff))) 42 43 #define major_version(X) ((X >> 16) & 0xffff) 44 #define minor_version(X) ((X >> 0) & 0xffff) 45 46 #define STRIPE_HEIGHT (16) 47 #define BUFFERED_ROWS (STRIPE_HEIGHT * 8) 48 49 #define MAX_MIME_LENGTH (64) 50 #define MAX_PRINTER_ADDR_LENGTH (64) 51 #define MAX_FILENAME_LENGTH (32) 52 #define MAX_PATHNAME_LENGTH (255) 53 #define MAX_ID_STRING_LENGTH (64) 54 #define MAX_NAME_LENGTH (255) 55 56 #ifdef __cplusplus 57 extern "C" 58 { 59 #endif 60 61 typedef enum { 62 DUPLEX_DRY_TIME_NORMAL, // 18 seconds 63 DUPLEX_DRY_TIME_LOWER, // 10 seconds 64 DUPLEX_DRY_TIME_MINIMUM // 5 seconds 65 } duplex_dry_time_t; 66 67 typedef enum { 68 PORT_INVALID = -1, 69 PORT_FILE = 0, 70 PORT_IPP = 631, 71 } port_t; 72 73 typedef enum { 74 PCLNONE, 75 PCLm, 76 PCLJPEG, 77 PCLPWG, 78 79 PCL_NUM_TYPES 80 } pcl_t; 81 82 typedef enum { 83 AUTO_ROTATE, 84 CENTER_VERTICAL, 85 CENTER_HORIZONTAL, 86 ROTATE_BACK_PAGE, 87 BACK_PAGE_PREROTATED, 88 AUTO_SCALE, 89 AUTO_FIT, 90 PORTRAIT_MODE, 91 LANDSCAPE_MODE, 92 CENTER_ON_ORIENTATION, 93 DOCUMENT_SCALING, 94 } render_flags_t; 95 96 #define RENDER_FLAG_AUTO_ROTATE (1 << AUTO_ROTATE) 97 #define RENDER_FLAG_ROTATE_BACK_PAGE (1 << ROTATE_BACK_PAGE) 98 #define RENDER_FLAG_BACK_PAGE_PREROTATED (1 << BACK_PAGE_PREROTATED) 99 #define RENDER_FLAG_CENTER_VERTICAL (1 << CENTER_VERTICAL) 100 #define RENDER_FLAG_CENTER_HORIZONTAL (1 << CENTER_HORIZONTAL) 101 #define RENDER_FLAG_AUTO_SCALE (1 << AUTO_SCALE) 102 #define RENDER_FLAG_AUTO_FIT (1 << AUTO_FIT) 103 #define RENDER_FLAG_PORTRAIT_MODE (1 << PORTRAIT_MODE) 104 #define RENDER_FLAG_LANDSCAPE_MODE (1 << LANDSCAPE_MODE) 105 #define RENDER_FLAG_CENTER_ON_ORIENTATION (1 << CENTER_ON_ORIENTATION) 106 #define RENDER_FLAG_DOCUMENT_SCALING (1 << DOCUMENT_SCALING) 107 108 #define AUTO_SCALE_RENDER_FLAGS (RENDER_FLAG_AUTO_SCALE | \ 109 RENDER_FLAG_AUTO_ROTATE | \ 110 RENDER_FLAG_CENTER_VERTICAL | \ 111 RENDER_FLAG_CENTER_HORIZONTAL) 112 113 #define AUTO_FIT_RENDER_FLAGS (RENDER_FLAG_AUTO_FIT | \ 114 RENDER_FLAG_AUTO_ROTATE | \ 115 RENDER_FLAG_CENTER_ON_ORIENTATION) 116 117 #define ORIENTATION_RENDER_FLAGS (RENDER_FLAG_AUTO_ROTATE | \ 118 RENDER_FLAG_PORTRAIT_MODE | \ 119 RENDER_FLAG_LANDSCAPE_MODE | \ 120 RENDER_FLAG_CENTER_ON_ORIENTATION) 121 122 typedef void (*wprint_status_cb_t)(wJob_t job_id, void *parm); 123 124 /* 125 * Parameters describing a job request 126 */ 127 typedef struct { 128 media_size_t media_size; 129 media_type_t media_type; 130 duplex_t duplex; 131 duplex_dry_time_t dry_time; 132 color_space_t color_space; 133 media_tray_t media_tray; 134 unsigned int num_copies; 135 bool borderless; 136 unsigned int render_flags; 137 float job_top_margin; 138 float job_left_margin; 139 float job_right_margin; 140 float job_bottom_margin; 141 142 bool renderInReverseOrder; 143 144 // these values are pixels 145 unsigned int print_top_margin; 146 unsigned int print_left_margin; 147 unsigned int print_right_margin; 148 unsigned int print_bottom_margin; 149 150 // these values are in pixels 151 unsigned int pixel_units; 152 unsigned int width; 153 unsigned int height; 154 unsigned int printable_area_width; 155 unsigned int printable_area_height; 156 unsigned int strip_height; 157 158 bool cancelled; 159 bool last_page; 160 int page_num; 161 int copy_num; 162 int copy_page_num; 163 int page_corrupted; 164 bool page_printing; 165 bool page_backside; 166 167 bool media_size_name; 168 169 // these values are in inches 170 float page_width; 171 float page_height; 172 float page_top_margin; 173 float page_left_margin; 174 float page_right_margin; 175 float page_bottom_margin; 176 177 const char *print_format; 178 char *page_range; 179 pcl_t pcl_type; 180 void *plugin_data; 181 bool ipp_1_0_supported; 182 bool ipp_2_0_supported; 183 bool epcl_ipp_supported; 184 bool accepts_pclm; 185 bool accepts_pdf; 186 bool copies_supported; 187 const char *useragent; 188 char docCategory[10]; 189 const char *media_default; 190 191 // IPP max job-name is 2**31 - 1, we set a shorter limit 192 char job_name[MAX_ID_STRING_LENGTH + 1]; 193 char job_originating_user_name[MAX_NAME_LENGTH + 1]; 194 int pdf_render_resolution; 195 bool accepts_app_name; 196 bool accepts_app_version; 197 bool accepts_os_name; 198 bool accepts_os_version; 199 } wprint_job_params_t; 200 201 /* 202 * Parameters defining how to reach a remote printing service 203 */ 204 typedef struct { 205 const char *printer_addr; 206 const char *uri_path; 207 const char *uri_scheme; 208 int port_num; 209 /* Timeout per retry in milliseconds */ 210 long timeout; 211 } wprint_connect_info_t; 212 213 /* 214 * Current state of a queued job 215 */ 216 typedef enum { 217 JOB_QUEUED = 1, 218 JOB_RUNNING, 219 JOB_BLOCKED, 220 JOB_DONE 221 } wprint_job_state_t; 222 223 typedef struct { 224 wprint_job_state_t state; 225 unsigned int blocked_reasons; 226 int job_done_result; 227 } wprint_job_callback_params_t; 228 229 typedef enum { 230 PRIORITY_PASSTHRU = 1, 231 PRIORITY_LOCAL, 232 } wprint_priority_t; 233 234 /* Forward declaration (actual definition in ifc_print_job.h) */ 235 struct ifc_print_job_st; 236 237 /* 238 * Defines an interface for delivering print jobs 239 */ 240 typedef struct { 241 uint32 version; 242 wprint_priority_t priority; 243 244 char const **(*get_mime_types)(void); 245 246 char const **(*get_print_formats)(void); 247 248 status_t (*start_job)(wJob_t job_handle, const ifc_wprint_t *wprint_ifc, 249 const struct ifc_print_job_st *job_ifc, wprint_job_params_t *job_params); 250 251 status_t (*print_page)(wprint_job_params_t *job_params, const char *mime_type, 252 const char *pathname); 253 254 status_t (*print_blank_page)(wJob_t job_handle, 255 wprint_job_params_t *job_params); 256 257 status_t (*end_job)(wprint_job_params_t *job_params); 258 } wprint_plugin_t; 259 260 /* 261 * Initialize the wprint system. Identify and gather capabilities of available plug-ins. 262 * Returns the number of plugins found or ERROR. 263 */ 264 int wprintInit(void); 265 266 /* 267 * Call to test if wprint is running or has been shut down. 268 */ 269 bool wprintIsRunning(); 270 271 /* 272 * Gets the capabilities of the specified printer. 273 */ 274 status_t wprintGetCapabilities(const wprint_connect_info_t *connect_info, 275 printer_capabilities_t *printer_cap); 276 277 /* 278 * Fills in the job params structure with default values. 279 */ 280 status_t wprintGetDefaultJobParams(wprint_job_params_t *job_params); 281 282 /* 283 * Fills in the job params structure with values in accordance with printer capabilities. 284 */ 285 status_t wprintGetFinalJobParams(wprint_job_params_t *job_param, 286 const printer_capabilities_t *printer_cap); 287 288 /* 289 * Called once per job at the start of the job. Returns a print job handle that is used in 290 * other functions of this library. Returns WPRINT_BAD_JOB_HANDLE for errors. 291 */ 292 wJob_t wprintStartJob(const char *printer_addr, port_t port_num, 293 const wprint_job_params_t *job_params, const printer_capabilities_t *printer_cap, 294 const char *mime_type, const char *pathname, wprint_status_cb_t cb_fn, 295 const char *debugDir, const char *scheme); 296 297 /* 298 * Sent once per job at the end of the job. A current print job must end for the next one 299 * to start. 300 */ 301 status_t wprintEndJob(wJob_t job_handle); 302 303 /* 304 * Sent once per page of a multi-page job to deliver a page image in a previously 305 * specified MIME type. The page_number must increment from 1. last_page flag is true if it 306 * is the last page of the job. 307 * 308 * top/left/right/bottom margin are the incremental per page margins in pixels 309 * at the current print resolution that are added on top of the physical page 310 * page margins, passing in 0 results in the default page margins being used. 311 */ 312 status_t wprintPage(wJob_t job_handle, int page_number, const char *filename, bool last_page, 313 bool pdf_page, unsigned int top_margin, unsigned int left_margin, 314 unsigned int right_margin, unsigned int bottom_margin); 315 316 /* 317 * Cancels a spooled or running job. Returns OK or ERROR 318 */ 319 status_t wprintCancelJob(wJob_t job_handle); 320 321 /* 322 * Exits the print subsystem 323 */ 324 status_t wprintExit(void); 325 326 /* 327 * Supplies info about the sending application and OS name 328 */ 329 void wprintSetSourceInfo(const char *appName, const char *appVersion, const char *osName); 330 331 /* Global variables to hold API, application, and OS details */ 332 extern int g_API_version; 333 extern char g_osName[MAX_ID_STRING_LENGTH + 1]; 334 extern char g_appName[MAX_ID_STRING_LENGTH + 1]; 335 extern char g_appVersion[MAX_ID_STRING_LENGTH + 1]; 336 337 #ifdef __cplusplus 338 } 339 #endif 340 341 #endif // __LIB_WPRINT_H__