• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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__