1
/* scanner.c generated by valac 0.13.0, the Vala compiler
2
* generated from scanner.vala, do not modify */
2
* Copyright (C) 2009 Canonical Ltd.
5
* Copyright (C) 2009-2011 Canonical Ltd.
3
6
* Author: Robert Ancell <robert.ancell@canonical.com>
5
8
* This program is free software: you can redistribute it and/or modify it under
6
9
* the terms of the GNU General Public License as published by the Free Software
7
10
* Foundation, either version 3 of the License, or (at your option) any later
8
11
* version. See http://www.gnu.org/copyleft/gpl.html the full text of the
14
/* TODO: Could indicate the start of the next page immediately after the last page is received (i.e. before the sane_cancel()) */
17
#include <glib-object.h>
12
18
#include <stdlib.h>
13
19
#include <string.h>
15
22
#include <sane/sane.h>
23
#include <glib/gi18n-lib.h>
16
24
#include <sane/saneopts.h>
17
#include <glib/gi18n.h>
21
/* TODO: Could indicate the start of the next page immediately after the last page is received (i.e. before the sane_cancel()) */
35
static guint signals[LAST_SIGNAL] = { 0, };
51
gint page_width, page_height;
68
gchar *username, *password;
25
#include <gobject/gvaluecollector.h>
28
#define TYPE_SCAN_DEVICE (scan_device_get_type ())
29
#define SCAN_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SCAN_DEVICE, ScanDevice))
30
#define SCAN_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SCAN_DEVICE, ScanDeviceClass))
31
#define IS_SCAN_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SCAN_DEVICE))
32
#define IS_SCAN_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SCAN_DEVICE))
33
#define SCAN_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SCAN_DEVICE, ScanDeviceClass))
35
typedef struct _ScanDevice ScanDevice;
36
typedef struct _ScanDeviceClass ScanDeviceClass;
37
typedef struct _ScanDevicePrivate ScanDevicePrivate;
38
#define _g_free0(var) (var = (g_free (var), NULL))
39
typedef struct _ParamSpecScanDevice ParamSpecScanDevice;
41
#define TYPE_SCAN_PAGE_INFO (scan_page_info_get_type ())
42
#define SCAN_PAGE_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SCAN_PAGE_INFO, ScanPageInfo))
43
#define SCAN_PAGE_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SCAN_PAGE_INFO, ScanPageInfoClass))
44
#define IS_SCAN_PAGE_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SCAN_PAGE_INFO))
45
#define IS_SCAN_PAGE_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SCAN_PAGE_INFO))
46
#define SCAN_PAGE_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SCAN_PAGE_INFO, ScanPageInfoClass))
48
typedef struct _ScanPageInfo ScanPageInfo;
49
typedef struct _ScanPageInfoClass ScanPageInfoClass;
50
typedef struct _ScanPageInfoPrivate ScanPageInfoPrivate;
51
typedef struct _ParamSpecScanPageInfo ParamSpecScanPageInfo;
53
#define TYPE_SCAN_LINE (scan_line_get_type ())
54
#define SCAN_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SCAN_LINE, ScanLine))
55
#define SCAN_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SCAN_LINE, ScanLineClass))
56
#define IS_SCAN_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SCAN_LINE))
57
#define IS_SCAN_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SCAN_LINE))
58
#define SCAN_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SCAN_LINE, ScanLineClass))
60
typedef struct _ScanLine ScanLine;
61
typedef struct _ScanLineClass ScanLineClass;
62
typedef struct _ScanLinePrivate ScanLinePrivate;
63
typedef struct _ParamSpecScanLine ParamSpecScanLine;
65
#define TYPE_SCAN_MODE (scan_mode_get_type ())
67
#define TYPE_SCAN_TYPE (scan_type_get_type ())
69
#define TYPE_SCAN_OPTIONS (scan_options_get_type ())
70
#define SCAN_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SCAN_OPTIONS, ScanOptions))
71
#define SCAN_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SCAN_OPTIONS, ScanOptionsClass))
72
#define IS_SCAN_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SCAN_OPTIONS))
73
#define IS_SCAN_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SCAN_OPTIONS))
74
#define SCAN_OPTIONS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SCAN_OPTIONS, ScanOptionsClass))
76
typedef struct _ScanOptions ScanOptions;
77
typedef struct _ScanOptionsClass ScanOptionsClass;
78
typedef struct _ScanOptionsPrivate ScanOptionsPrivate;
79
typedef struct _ParamSpecScanOptions ParamSpecScanOptions;
81
#define TYPE_SCAN_JOB (scan_job_get_type ())
82
#define SCAN_JOB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SCAN_JOB, ScanJob))
83
#define SCAN_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SCAN_JOB, ScanJobClass))
84
#define IS_SCAN_JOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SCAN_JOB))
85
#define IS_SCAN_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SCAN_JOB))
86
#define SCAN_JOB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SCAN_JOB, ScanJobClass))
88
typedef struct _ScanJob ScanJob;
89
typedef struct _ScanJobClass ScanJobClass;
90
typedef struct _ScanJobPrivate ScanJobPrivate;
91
typedef struct _ParamSpecScanJob ParamSpecScanJob;
93
#define TYPE_REQUEST (request_get_type ())
94
#define REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_REQUEST, Request))
95
#define REQUEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_REQUEST, RequestClass))
96
#define IS_REQUEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_REQUEST))
97
#define IS_REQUEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_REQUEST))
98
#define REQUEST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_REQUEST, RequestClass))
100
typedef struct _Request Request;
101
typedef struct _RequestClass RequestClass;
102
typedef struct _RequestPrivate RequestPrivate;
103
typedef struct _ParamSpecRequest ParamSpecRequest;
105
#define TYPE_REQUEST_REDETECT (request_redetect_get_type ())
106
#define REQUEST_REDETECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_REQUEST_REDETECT, RequestRedetect))
107
#define REQUEST_REDETECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_REQUEST_REDETECT, RequestRedetectClass))
108
#define IS_REQUEST_REDETECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_REQUEST_REDETECT))
109
#define IS_REQUEST_REDETECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_REQUEST_REDETECT))
110
#define REQUEST_REDETECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_REQUEST_REDETECT, RequestRedetectClass))
112
typedef struct _RequestRedetect RequestRedetect;
113
typedef struct _RequestRedetectClass RequestRedetectClass;
114
typedef struct _RequestRedetectPrivate RequestRedetectPrivate;
116
#define TYPE_REQUEST_CANCEL (request_cancel_get_type ())
117
#define REQUEST_CANCEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_REQUEST_CANCEL, RequestCancel))
118
#define REQUEST_CANCEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_REQUEST_CANCEL, RequestCancelClass))
119
#define IS_REQUEST_CANCEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_REQUEST_CANCEL))
120
#define IS_REQUEST_CANCEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_REQUEST_CANCEL))
121
#define REQUEST_CANCEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_REQUEST_CANCEL, RequestCancelClass))
123
typedef struct _RequestCancel RequestCancel;
124
typedef struct _RequestCancelClass RequestCancelClass;
125
typedef struct _RequestCancelPrivate RequestCancelPrivate;
127
#define TYPE_REQUEST_START_SCAN (request_start_scan_get_type ())
128
#define REQUEST_START_SCAN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_REQUEST_START_SCAN, RequestStartScan))
129
#define REQUEST_START_SCAN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_REQUEST_START_SCAN, RequestStartScanClass))
130
#define IS_REQUEST_START_SCAN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_REQUEST_START_SCAN))
131
#define IS_REQUEST_START_SCAN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_REQUEST_START_SCAN))
132
#define REQUEST_START_SCAN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_REQUEST_START_SCAN, RequestStartScanClass))
134
typedef struct _RequestStartScan RequestStartScan;
135
typedef struct _RequestStartScanClass RequestStartScanClass;
136
typedef struct _RequestStartScanPrivate RequestStartScanPrivate;
137
#define _scan_job_unref0(var) ((var == NULL) ? NULL : (var = (scan_job_unref (var), NULL)))
139
#define TYPE_REQUEST_QUIT (request_quit_get_type ())
140
#define REQUEST_QUIT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_REQUEST_QUIT, RequestQuit))
141
#define REQUEST_QUIT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_REQUEST_QUIT, RequestQuitClass))
142
#define IS_REQUEST_QUIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_REQUEST_QUIT))
143
#define IS_REQUEST_QUIT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_REQUEST_QUIT))
144
#define REQUEST_QUIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_REQUEST_QUIT, RequestQuitClass))
146
typedef struct _RequestQuit RequestQuit;
147
typedef struct _RequestQuitClass RequestQuitClass;
148
typedef struct _RequestQuitPrivate RequestQuitPrivate;
150
#define TYPE_CREDENTIALS (credentials_get_type ())
151
#define CREDENTIALS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CREDENTIALS, Credentials))
152
#define CREDENTIALS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_CREDENTIALS, CredentialsClass))
153
#define IS_CREDENTIALS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CREDENTIALS))
154
#define IS_CREDENTIALS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CREDENTIALS))
155
#define CREDENTIALS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_CREDENTIALS, CredentialsClass))
157
typedef struct _Credentials Credentials;
158
typedef struct _CredentialsClass CredentialsClass;
159
typedef struct _CredentialsPrivate CredentialsPrivate;
160
typedef struct _ParamSpecCredentials ParamSpecCredentials;
162
#define TYPE_SCAN_STATE (scan_state_get_type ())
164
#define TYPE_NOTIFY (notify_get_type ())
165
#define NOTIFY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFY, Notify))
166
#define NOTIFY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFY, NotifyClass))
167
#define IS_NOTIFY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFY))
168
#define IS_NOTIFY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFY))
169
#define NOTIFY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFY, NotifyClass))
171
typedef struct _Notify Notify;
172
typedef struct _NotifyClass NotifyClass;
173
typedef struct _NotifyPrivate NotifyPrivate;
175
#define TYPE_SCANNER (scanner_get_type ())
176
#define SCANNER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SCANNER, Scanner))
177
#define SCANNER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SCANNER, ScannerClass))
178
#define IS_SCANNER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SCANNER))
179
#define IS_SCANNER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SCANNER))
180
#define SCANNER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SCANNER, ScannerClass))
182
typedef struct _Scanner Scanner;
183
typedef struct _ScannerClass ScannerClass;
184
typedef struct _ParamSpecNotify ParamSpecNotify;
186
#define TYPE_NOTIFY_SCANNING_CHANGED (notify_scanning_changed_get_type ())
187
#define NOTIFY_SCANNING_CHANGED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFY_SCANNING_CHANGED, NotifyScanningChanged))
188
#define NOTIFY_SCANNING_CHANGED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFY_SCANNING_CHANGED, NotifyScanningChangedClass))
189
#define IS_NOTIFY_SCANNING_CHANGED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFY_SCANNING_CHANGED))
190
#define IS_NOTIFY_SCANNING_CHANGED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFY_SCANNING_CHANGED))
191
#define NOTIFY_SCANNING_CHANGED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFY_SCANNING_CHANGED, NotifyScanningChangedClass))
193
typedef struct _NotifyScanningChanged NotifyScanningChanged;
194
typedef struct _NotifyScanningChangedClass NotifyScanningChangedClass;
195
typedef struct _NotifyScanningChangedPrivate NotifyScanningChangedPrivate;
197
#define TYPE_NOTIFY_UPDATE_DEVICES (notify_update_devices_get_type ())
198
#define NOTIFY_UPDATE_DEVICES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFY_UPDATE_DEVICES, NotifyUpdateDevices))
199
#define NOTIFY_UPDATE_DEVICES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFY_UPDATE_DEVICES, NotifyUpdateDevicesClass))
200
#define IS_NOTIFY_UPDATE_DEVICES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFY_UPDATE_DEVICES))
201
#define IS_NOTIFY_UPDATE_DEVICES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFY_UPDATE_DEVICES))
202
#define NOTIFY_UPDATE_DEVICES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFY_UPDATE_DEVICES, NotifyUpdateDevicesClass))
204
typedef struct _NotifyUpdateDevices NotifyUpdateDevices;
205
typedef struct _NotifyUpdateDevicesClass NotifyUpdateDevicesClass;
206
typedef struct _NotifyUpdateDevicesPrivate NotifyUpdateDevicesPrivate;
207
#define __g_list_free__scan_device_unref0_0(var) ((var == NULL) ? NULL : (var = (_g_list_free__scan_device_unref0_ (var), NULL)))
209
#define TYPE_NOTIFY_REQUEST_AUTHORIZATION (notify_request_authorization_get_type ())
210
#define NOTIFY_REQUEST_AUTHORIZATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFY_REQUEST_AUTHORIZATION, NotifyRequestAuthorization))
211
#define NOTIFY_REQUEST_AUTHORIZATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFY_REQUEST_AUTHORIZATION, NotifyRequestAuthorizationClass))
212
#define IS_NOTIFY_REQUEST_AUTHORIZATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFY_REQUEST_AUTHORIZATION))
213
#define IS_NOTIFY_REQUEST_AUTHORIZATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFY_REQUEST_AUTHORIZATION))
214
#define NOTIFY_REQUEST_AUTHORIZATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFY_REQUEST_AUTHORIZATION, NotifyRequestAuthorizationClass))
216
typedef struct _NotifyRequestAuthorization NotifyRequestAuthorization;
217
typedef struct _NotifyRequestAuthorizationClass NotifyRequestAuthorizationClass;
218
typedef struct _NotifyRequestAuthorizationPrivate NotifyRequestAuthorizationPrivate;
220
#define TYPE_NOTIFY_SCAN_FAILED (notify_scan_failed_get_type ())
221
#define NOTIFY_SCAN_FAILED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFY_SCAN_FAILED, NotifyScanFailed))
222
#define NOTIFY_SCAN_FAILED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFY_SCAN_FAILED, NotifyScanFailedClass))
223
#define IS_NOTIFY_SCAN_FAILED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFY_SCAN_FAILED))
224
#define IS_NOTIFY_SCAN_FAILED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFY_SCAN_FAILED))
225
#define NOTIFY_SCAN_FAILED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFY_SCAN_FAILED, NotifyScanFailedClass))
227
typedef struct _NotifyScanFailed NotifyScanFailed;
228
typedef struct _NotifyScanFailedClass NotifyScanFailedClass;
229
typedef struct _NotifyScanFailedPrivate NotifyScanFailedPrivate;
231
#define TYPE_NOTIFY_DOCUMENT_DONE (notify_document_done_get_type ())
232
#define NOTIFY_DOCUMENT_DONE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFY_DOCUMENT_DONE, NotifyDocumentDone))
233
#define NOTIFY_DOCUMENT_DONE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFY_DOCUMENT_DONE, NotifyDocumentDoneClass))
234
#define IS_NOTIFY_DOCUMENT_DONE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFY_DOCUMENT_DONE))
235
#define IS_NOTIFY_DOCUMENT_DONE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFY_DOCUMENT_DONE))
236
#define NOTIFY_DOCUMENT_DONE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFY_DOCUMENT_DONE, NotifyDocumentDoneClass))
238
typedef struct _NotifyDocumentDone NotifyDocumentDone;
239
typedef struct _NotifyDocumentDoneClass NotifyDocumentDoneClass;
240
typedef struct _NotifyDocumentDonePrivate NotifyDocumentDonePrivate;
242
#define TYPE_NOTIFY_EXPECT_PAGE (notify_expect_page_get_type ())
243
#define NOTIFY_EXPECT_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFY_EXPECT_PAGE, NotifyExpectPage))
244
#define NOTIFY_EXPECT_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFY_EXPECT_PAGE, NotifyExpectPageClass))
245
#define IS_NOTIFY_EXPECT_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFY_EXPECT_PAGE))
246
#define IS_NOTIFY_EXPECT_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFY_EXPECT_PAGE))
247
#define NOTIFY_EXPECT_PAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFY_EXPECT_PAGE, NotifyExpectPageClass))
249
typedef struct _NotifyExpectPage NotifyExpectPage;
250
typedef struct _NotifyExpectPageClass NotifyExpectPageClass;
251
typedef struct _NotifyExpectPagePrivate NotifyExpectPagePrivate;
253
#define TYPE_NOTIFY_GOT_PAGE_INFO (notify_got_page_info_get_type ())
254
#define NOTIFY_GOT_PAGE_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFY_GOT_PAGE_INFO, NotifyGotPageInfo))
255
#define NOTIFY_GOT_PAGE_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFY_GOT_PAGE_INFO, NotifyGotPageInfoClass))
256
#define IS_NOTIFY_GOT_PAGE_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFY_GOT_PAGE_INFO))
257
#define IS_NOTIFY_GOT_PAGE_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFY_GOT_PAGE_INFO))
258
#define NOTIFY_GOT_PAGE_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFY_GOT_PAGE_INFO, NotifyGotPageInfoClass))
260
typedef struct _NotifyGotPageInfo NotifyGotPageInfo;
261
typedef struct _NotifyGotPageInfoClass NotifyGotPageInfoClass;
262
typedef struct _NotifyGotPageInfoPrivate NotifyGotPageInfoPrivate;
263
#define _scan_page_info_unref0(var) ((var == NULL) ? NULL : (var = (scan_page_info_unref (var), NULL)))
265
#define TYPE_NOTIFY_PAGE_DONE (notify_page_done_get_type ())
266
#define NOTIFY_PAGE_DONE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFY_PAGE_DONE, NotifyPageDone))
267
#define NOTIFY_PAGE_DONE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFY_PAGE_DONE, NotifyPageDoneClass))
268
#define IS_NOTIFY_PAGE_DONE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFY_PAGE_DONE))
269
#define IS_NOTIFY_PAGE_DONE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFY_PAGE_DONE))
270
#define NOTIFY_PAGE_DONE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFY_PAGE_DONE, NotifyPageDoneClass))
272
typedef struct _NotifyPageDone NotifyPageDone;
273
typedef struct _NotifyPageDoneClass NotifyPageDoneClass;
274
typedef struct _NotifyPageDonePrivate NotifyPageDonePrivate;
276
#define TYPE_NOTIFY_GOT_LINE (notify_got_line_get_type ())
277
#define NOTIFY_GOT_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFY_GOT_LINE, NotifyGotLine))
278
#define NOTIFY_GOT_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFY_GOT_LINE, NotifyGotLineClass))
279
#define IS_NOTIFY_GOT_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFY_GOT_LINE))
280
#define IS_NOTIFY_GOT_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFY_GOT_LINE))
281
#define NOTIFY_GOT_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFY_GOT_LINE, NotifyGotLineClass))
283
typedef struct _NotifyGotLine NotifyGotLine;
284
typedef struct _NotifyGotLineClass NotifyGotLineClass;
285
typedef struct _NotifyGotLinePrivate NotifyGotLinePrivate;
286
#define _scan_line_unref0(var) ((var == NULL) ? NULL : (var = (scan_line_unref (var), NULL)))
287
typedef struct _ScannerPrivate ScannerPrivate;
288
#define _g_async_queue_unref0(var) ((var == NULL) ? NULL : (var = (g_async_queue_unref (var), NULL)))
289
#define __g_list_free__scan_job_unref0_0(var) ((var == NULL) ? NULL : (var = (_g_list_free__scan_job_unref0_ (var), NULL)))
290
#define _scanner_unref0(var) ((var == NULL) ? NULL : (var = (scanner_unref (var), NULL)))
291
#define _notify_unref0(var) ((var == NULL) ? NULL : (var = (notify_unref (var), NULL)))
292
#define _g_regex_unref0(var) ((var == NULL) ? NULL : (var = (g_regex_unref (var), NULL)))
293
#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
294
#define _scan_device_unref0(var) ((var == NULL) ? NULL : (var = (scan_device_unref (var), NULL)))
295
#define _credentials_unref0(var) ((var == NULL) ? NULL : (var = (credentials_unref (var), NULL)))
296
#define _request_unref0(var) ((var == NULL) ? NULL : (var = (request_unref (var), NULL)))
297
typedef struct _ParamSpecScanner ParamSpecScanner;
300
GTypeInstance parent_instance;
301
volatile int ref_count;
302
ScanDevicePrivate * priv;
307
struct _ScanDeviceClass {
308
GTypeClass parent_class;
309
void (*finalize) (ScanDevice *self);
312
struct _ParamSpecScanDevice {
313
GParamSpec parent_instance;
316
struct _ScanPageInfo {
317
GTypeInstance parent_instance;
318
volatile int ref_count;
319
ScanPageInfoPrivate * priv;
328
struct _ScanPageInfoClass {
329
GTypeClass parent_class;
330
void (*finalize) (ScanPageInfo *self);
333
struct _ParamSpecScanPageInfo {
334
GParamSpec parent_instance;
338
GTypeInstance parent_instance;
339
volatile int ref_count;
340
ScanLinePrivate * priv;
351
struct _ScanLineClass {
352
GTypeClass parent_class;
353
void (*finalize) (ScanLine *self);
356
struct _ParamSpecScanLine {
357
GParamSpec parent_instance;
374
struct _ScanOptions {
375
GTypeInstance parent_instance;
376
volatile int ref_count;
377
ScanOptionsPrivate * priv;
386
struct _ScanOptionsClass {
387
GTypeClass parent_class;
388
void (*finalize) (ScanOptions *self);
391
struct _ParamSpecScanOptions {
392
GParamSpec parent_instance;
396
GTypeInstance parent_instance;
397
volatile int ref_count;
398
ScanJobPrivate * priv;
408
struct _ScanJobClass {
409
GTypeClass parent_class;
410
void (*finalize) (ScanJob *self);
413
struct _ParamSpecScanJob {
414
GParamSpec parent_instance;
418
GTypeInstance parent_instance;
419
volatile int ref_count;
420
RequestPrivate * priv;
423
struct _RequestClass {
424
GTypeClass parent_class;
425
void (*finalize) (Request *self);
428
struct _ParamSpecRequest {
429
GParamSpec parent_instance;
432
struct _RequestRedetect {
433
Request parent_instance;
434
RequestRedetectPrivate * priv;
437
struct _RequestRedetectClass {
438
RequestClass parent_class;
441
struct _RequestCancel {
442
Request parent_instance;
443
RequestCancelPrivate * priv;
446
struct _RequestCancelClass {
447
RequestClass parent_class;
450
struct _RequestStartScan {
451
Request parent_instance;
452
RequestStartScanPrivate * priv;
456
struct _RequestStartScanClass {
457
RequestClass parent_class;
460
struct _RequestQuit {
461
Request parent_instance;
462
RequestQuitPrivate * priv;
465
struct _RequestQuitClass {
466
RequestClass parent_class;
469
struct _Credentials {
470
GTypeInstance parent_instance;
471
volatile int ref_count;
472
CredentialsPrivate * priv;
477
struct _CredentialsClass {
478
GTypeClass parent_class;
479
void (*finalize) (Credentials *self);
482
struct _ParamSpecCredentials {
483
GParamSpec parent_instance;
490
SCAN_STATE_GET_OPTION,
492
SCAN_STATE_GET_PARAMETERS,
84
GAsyncQueue *scan_queue, *authorize_queue;
87
gchar *default_device;
94
/* Handle to SANE device */
96
gchar *current_device;
98
SANE_Parameters parameters;
100
/* Last option read */
101
SANE_Int option_index;
103
/* Option index for scan area */
104
SANE_Int br_x_option_index, br_y_option_index;
106
/* Buffer for received line */
108
SANE_Int buffer_size, n_used;
110
SANE_Int bytes_remaining, line_count, pass_number, page_number, notified_page;
115
G_DEFINE_TYPE (Scanner, scanner, G_TYPE_OBJECT);
118
/* Table of scanner objects for each thread (required for authorization callback) */
119
static GHashTable *scanners;
123
send_signal (SignalInfo *info)
125
g_signal_emit (info->instance, signals[info->sig], 0, info->data);
130
GList *iter, *devices = info->data;
131
for (iter = devices; iter; iter = iter->next) {
132
ScanDevice *device = iter->data;
133
g_free (device->name);
134
g_free (device->label);
137
g_list_free (devices);
142
gchar *resource = info->data;
148
ScanPageInfo *page_info = info->data;
154
ScanLine *line = info->data;
161
GError *error = info->data;
162
g_error_free (error);
170
g_assert (info->data == NULL);
179
/* Emit signals in main loop */
181
emit_signal (Scanner *scanner, guint sig, gpointer data)
185
info = g_malloc(sizeof(SignalInfo));
186
info->instance = scanner;
189
g_idle_add ((GSourceFunc) send_signal, info);
194
set_scanning (Scanner *scanner, gboolean is_scanning)
196
if ((scanner->priv->scanning && !is_scanning) || (!scanner->priv->scanning && is_scanning)) {
197
scanner->priv->scanning = is_scanning;
198
emit_signal (scanner, SCANNING_CHANGED, NULL);
204
get_device_weight (const gchar *device)
206
/* NOTE: This is using trends in the naming of SANE devices, SANE should be able to provide this information better */
208
/* Use webcams as a last resort */
209
if (g_str_has_prefix (device, "vfl:"))
212
/* Use locally connected devices first */
213
if (strstr (device, "usb"))
221
compare_devices (ScanDevice *device1, ScanDevice *device2)
223
gint weight1, weight2;
225
/* TODO: Should do some fuzzy matching on the last selected device and set that to the default */
227
weight1 = get_device_weight (device1->name);
228
weight2 = get_device_weight (device2->name);
229
if (weight1 != weight2)
230
return weight1 - weight2;
232
return strcmp (device1->label, device2->label);
237
get_status_string (SANE_Status status)
243
{ SANE_STATUS_GOOD, "SANE_STATUS_GOOD"},
244
{ SANE_STATUS_UNSUPPORTED, "SANE_STATUS_UNSUPPORTED"},
245
{ SANE_STATUS_CANCELLED, "SANE_STATUS_CANCELLED"},
246
{ SANE_STATUS_DEVICE_BUSY, "SANE_STATUS_DEVICE_BUSY"},
247
{ SANE_STATUS_INVAL, "SANE_STATUS_INVAL"},
248
{ SANE_STATUS_EOF, "SANE_STATUS_EOF"},
249
{ SANE_STATUS_JAMMED, "SANE_STATUS_JAMMED"},
250
{ SANE_STATUS_NO_DOCS, "SANE_STATUS_NO_DOCS"},
251
{ SANE_STATUS_COVER_OPEN, "SANE_STATUS_COVER_OPEN"},
252
{ SANE_STATUS_IO_ERROR, "SANE_STATUS_IO_ERROR"},
253
{ SANE_STATUS_NO_MEM, "SANE_STATUS_NO_MEM"},
254
{ SANE_STATUS_ACCESS_DENIED, "SANE_STATUS_ACCESS_DENIED"},
257
static char *unknown_string = NULL;
260
for (i = 0; status_names[i].name != NULL && status_names[i].status != status; i++);
262
if (status_names[i].name == NULL) {
263
g_free (unknown_string);
264
unknown_string = g_strdup_printf ("SANE_STATUS(%d)", status);
265
return unknown_string; /* Note result is undefined on second call to this function */
268
return status_names[i].name;
273
get_action_string (SANE_Action action)
279
{ SANE_ACTION_GET_VALUE, "SANE_ACTION_GET_VALUE" },
280
{ SANE_ACTION_SET_VALUE, "SANE_ACTION_SET_VALUE" },
281
{ SANE_ACTION_SET_AUTO, "SANE_ACTION_SET_AUTO" },
284
static char *unknown_string = NULL;
287
for (i = 0; action_names[i].name != NULL && action_names[i].action != action; i++);
289
if (action_names[i].name == NULL) {
290
g_free (unknown_string);
291
unknown_string = g_strdup_printf ("SANE_ACTION(%d)", action);
292
return unknown_string; /* Note result is undefined on second call to this function */
295
return action_names[i].name;
300
get_frame_string (SANE_Frame frame)
306
{ SANE_FRAME_GRAY, "SANE_FRAME_GRAY" },
307
{ SANE_FRAME_RGB, "SANE_FRAME_RGB" },
308
{ SANE_FRAME_RED, "SANE_FRAME_RED" },
309
{ SANE_FRAME_GREEN, "SANE_FRAME_GREEN" },
310
{ SANE_FRAME_BLUE, "SANE_FRAME_BLUE" },
313
static char *unknown_string = NULL;
316
for (i = 0; frame_names[i].name != NULL && frame_names[i].frame != frame; i++);
318
if (frame_names[i].name == NULL) {
319
g_free (unknown_string);
320
unknown_string = g_strdup_printf ("SANE_FRAME(%d)", frame);
321
return unknown_string; /* Note result is undefined on second call to this function */
324
return frame_names[i].name;
329
do_redetect (Scanner *scanner)
331
const SANE_Device **device_list, **device_iter;
333
GList *devices = NULL;
335
status = sane_get_devices (&device_list, SANE_FALSE);
336
g_debug ("sane_get_devices () -> %s", get_status_string (status));
337
if (status != SANE_STATUS_GOOD) {
338
g_warning ("Unable to get SANE devices: %s", sane_strstatus(status));
339
scanner->priv->state = STATE_IDLE;
343
for (device_iter = device_list; *device_iter; device_iter++) {
344
const SANE_Device *device = *device_iter;
345
ScanDevice *scan_device;
348
g_debug ("Device: name=\"%s\" vendor=\"%s\" model=\"%s\" type=\"%s\"",
349
device->name, device->vendor, device->model, device->type);
351
scan_device = g_malloc0 (sizeof (ScanDevice));
353
scan_device->name = g_strdup (device->name);
355
/* Abbreviate HP as it is a long string and does not match what is on the physical scanner */
356
if (strcmp (device->vendor, "Hewlett-Packard") == 0)
357
label = g_strdup_printf ("HP %s", device->model);
359
label = g_strdup_printf ("%s %s", device->vendor, device->model);
361
/* Replace underscored in name */
362
for (c = label; *c; c++)
366
scan_device->label = label;
368
devices = g_list_append (devices, scan_device);
371
/* Sort devices by priority */
372
devices = g_list_sort (devices, (GCompareFunc) compare_devices);
374
scanner->priv->redetect = FALSE;
375
scanner->priv->state = STATE_IDLE;
377
g_free (scanner->priv->default_device);
379
ScanDevice *device = g_list_nth_data (devices, 0);
380
scanner->priv->default_device = g_strdup (device->name);
383
scanner->priv->default_device = NULL;
385
emit_signal (scanner, UPDATE_DEVICES, devices);
390
control_option (SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int index, SANE_Action action, void *value)
395
switch (option->type) {
397
old_value = g_strdup_printf (*((SANE_Bool *) value) ? "SANE_TRUE" : "SANE_FALSE");
400
old_value = g_strdup_printf ("%d", *((SANE_Int *) value));
402
case SANE_TYPE_FIXED:
403
old_value = g_strdup_printf ("%f", SANE_UNFIX (*((SANE_Fixed *) value)));
405
case SANE_TYPE_STRING:
406
old_value = g_strdup_printf ("\"%s\"", (char *) value);
409
old_value = g_strdup ("?");
413
status = sane_control_option (handle, index, action, value, NULL);
414
switch (option->type) {
416
g_debug ("sane_control_option (%d, %s, %s) -> (%s, %s)",
417
index, get_action_string (action),
418
*((SANE_Bool *) value) ? "SANE_TRUE" : "SANE_FALSE",
419
get_status_string (status),
423
g_debug ("sane_control_option (%d, %s, %d) -> (%s, %s)",
424
index, get_action_string (action),
425
*((SANE_Int *) value),
426
get_status_string (status),
429
case SANE_TYPE_FIXED:
430
g_debug ("sane_control_option (%d, %s, %f) -> (%s, %s)",
431
index, get_action_string (action),
432
SANE_UNFIX (*((SANE_Fixed *) value)),
433
get_status_string (status),
436
case SANE_TYPE_STRING:
437
g_debug ("sane_control_option (%d, %s, \"%s\") -> (%s, %s)",
438
index, get_action_string (action),
440
get_status_string (status),
448
if (status != SANE_STATUS_GOOD)
449
g_warning ("Error setting option %s: %s", option->name, sane_strstatus(status));
451
return status == SANE_STATUS_GOOD;
456
set_default_option (SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index)
460
/* Check if supports automatic option */
461
if ((option->cap & SANE_CAP_AUTOMATIC) == 0)
464
status = sane_control_option (handle, option_index, SANE_ACTION_SET_AUTO, NULL, NULL);
465
g_debug ("sane_control_option (%d, SANE_ACTION_SET_AUTO) -> %s",
466
option_index, get_status_string (status));
467
if (status != SANE_STATUS_GOOD)
468
g_warning ("Error setting default option %s: %s", option->name, sane_strstatus(status));
470
return status == SANE_STATUS_GOOD;
475
set_bool_option (SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, SANE_Bool value, SANE_Bool *result)
478
g_return_if_fail (option->type == SANE_TYPE_BOOL);
479
control_option (handle, option, option_index, SANE_ACTION_SET_VALUE, &v);
486
set_int_option (SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, SANE_Int value, SANE_Int *result)
490
g_return_if_fail (option->type == SANE_TYPE_INT);
492
if (option->constraint_type == SANE_CONSTRAINT_RANGE) {
493
if (option->constraint.range->quant)
494
v *= option->constraint.range->quant;
495
if (v < option->constraint.range->min)
496
v = option->constraint.range->min;
497
if (v > option->constraint.range->max)
498
v = option->constraint.range->max;
500
else if (option->constraint_type == SANE_CONSTRAINT_WORD_LIST) {
502
SANE_Int distance = INT_MAX, nearest = 0;
504
/* Find nearest value to requested */
505
for (i = 0; i < option->constraint.word_list[0]; i++) {
506
SANE_Int x = option->constraint.word_list[i+1];
507
if (abs (x - v) < distance) {
508
distance = abs (x - v);
515
control_option (handle, option, option_index, SANE_ACTION_SET_VALUE, &v);
522
set_fixed_option (SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, gdouble value, gdouble *result)
527
g_return_if_fail (option->type == SANE_TYPE_FIXED);
529
if (option->constraint_type == SANE_CONSTRAINT_RANGE) {
530
double min = SANE_UNFIX (option->constraint.range->min);
531
double max = SANE_UNFIX (option->constraint.range->max);
538
else if (option->constraint_type == SANE_CONSTRAINT_WORD_LIST) {
540
double distance = DBL_MAX, nearest = 0.0;
542
/* Find nearest value to requested */
543
for (i = 0; i < option->constraint.word_list[0]; i++) {
544
double x = SANE_UNFIX (option->constraint.word_list[i+1]);
545
if (fabs (x - v) < distance) {
546
distance = fabs (x - v);
553
v_fixed = SANE_FIX (v);
554
control_option (handle, option, option_index, SANE_ACTION_SET_VALUE, &v_fixed);
556
*result = SANE_UNFIX (v_fixed);
561
set_string_option (SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, const char *value, char **result)
564
gsize value_size, size;
567
g_return_val_if_fail (option->type == SANE_TYPE_STRING, FALSE);
569
value_size = strlen (value) + 1;
570
size = option->size > value_size ? option->size : value_size;
571
string = g_malloc(sizeof(char) * size);
572
strcpy (string, value);
573
error = control_option (handle, option, option_index, SANE_ACTION_SET_VALUE, string);
584
set_constrained_string_option (SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, const char *values[], char **result)
588
g_return_val_if_fail (option->type == SANE_TYPE_STRING, FALSE);
589
g_return_val_if_fail (option->constraint_type == SANE_CONSTRAINT_STRING_LIST, FALSE);
591
for (i = 0; values[i] != NULL; i++) {
592
for (j = 0; option->constraint.string_list[j]; j++) {
593
if (strcmp (values[i], option->constraint.string_list[j]) == 0)
597
if (option->constraint.string_list[j] != NULL)
598
return set_string_option (handle, option, option_index, values[i], result);
606
log_option (SANE_Int index, const SANE_Option_Descriptor *option)
612
string = g_string_new ("");
614
g_string_append_printf (string, "Option %d:", index);
617
g_string_append_printf (string, " name='%s'", option->name);
620
g_string_append_printf (string, " title='%s'", option->title);
622
switch (option->type) {
624
g_string_append (string, " type=bool");
627
g_string_append (string, " type=int");
629
case SANE_TYPE_FIXED:
630
g_string_append (string, " type=fixed");
632
case SANE_TYPE_STRING:
633
g_string_append (string, " type=string");
635
case SANE_TYPE_BUTTON:
636
g_string_append (string, " type=button");
638
case SANE_TYPE_GROUP:
639
g_string_append (string, " type=group");
642
g_string_append_printf (string, " type=%d", option->type);
646
g_string_append_printf (string, " size=%d", option->size);
648
switch (option->unit) {
651
case SANE_UNIT_PIXEL:
652
g_string_append (string, " unit=pixels");
655
g_string_append (string, " unit=bits");
658
g_string_append (string, " unit=mm");
661
g_string_append (string, " unit=dpi");
663
case SANE_UNIT_PERCENT:
664
g_string_append (string, " unit=percent");
666
case SANE_UNIT_MICROSECOND:
667
g_string_append (string, " unit=microseconds");
670
g_string_append_printf (string, " unit=%d", option->unit);
674
switch (option->constraint_type) {
675
case SANE_CONSTRAINT_RANGE:
676
if (option->type == SANE_TYPE_FIXED)
677
g_string_append_printf (string, " min=%f, max=%f, quant=%d",
678
SANE_UNFIX (option->constraint.range->min), SANE_UNFIX (option->constraint.range->max),
679
option->constraint.range->quant);
681
g_string_append_printf (string, " min=%d, max=%d, quant=%d",
682
option->constraint.range->min, option->constraint.range->max,
683
option->constraint.range->quant);
685
case SANE_CONSTRAINT_WORD_LIST:
686
g_string_append (string, " values=[");
687
for (i = 0; i < option->constraint.word_list[0]; i++) {
689
g_string_append (string, ", ");
690
if (option->type == SANE_TYPE_INT)
691
g_string_append_printf (string, "%d", option->constraint.word_list[i+1]);
693
g_string_append_printf (string, "%f", SANE_UNFIX (option->constraint.word_list[i+1]));
695
g_string_append (string, "]");
697
case SANE_CONSTRAINT_STRING_LIST:
698
g_string_append (string, " values=[");
699
for (i = 0; option->constraint.string_list[i]; i++) {
701
g_string_append (string, ", ");
702
g_string_append_printf (string, "\"%s\"", option->constraint.string_list[i]);
704
g_string_append (string, "]");
716
{ SANE_CAP_SOFT_SELECT, "soft-select"},
717
{ SANE_CAP_HARD_SELECT, "hard-select"},
718
{ SANE_CAP_SOFT_DETECT, "soft-detect"},
719
{ SANE_CAP_EMULATED, "emulated"},
720
{ SANE_CAP_AUTOMATIC, "automatic"},
721
{ SANE_CAP_INACTIVE, "inactive"},
722
{ SANE_CAP_ADVANCED, "advanced"},
727
g_string_append (string, " cap=");
728
for (i = 0; caps[i].cap > 0; i++) {
729
if (cap & caps[i].cap) {
732
g_string_append (string, ",");
733
g_string_append (string, caps[i].name);
737
/* Unknown capabilities */
740
g_string_append (string, ",");
741
g_string_append_printf (string, "%x", cap);
745
g_debug ("%s", string->str);
746
g_string_free (string, TRUE);
749
g_debug (" Description: %s", option->desc);
754
authorization_cb (SANE_String_Const resource, SANE_Char username[SANE_MAX_USERNAME_LEN], SANE_Char password[SANE_MAX_PASSWORD_LEN])
757
Credentials *credentials;
759
scanner = g_hash_table_lookup (scanners, g_thread_self ());
761
emit_signal (scanner, AUTHORIZE, g_strdup (resource));
763
credentials = g_async_queue_pop (scanner->priv->authorize_queue);
764
strncpy (username, credentials->username, SANE_MAX_USERNAME_LEN);
765
strncpy (password, credentials->password, SANE_MAX_PASSWORD_LEN);
766
g_free (credentials);
771
scanner_authorize (Scanner *scanner, const gchar *username, const gchar *password)
773
Credentials *credentials;
775
credentials = g_malloc (sizeof (Credentials));
776
credentials->username = g_strdup (username);
777
credentials->password = g_strdup (password);
778
g_async_queue_push (scanner->priv->authorize_queue, credentials);
783
close_device (Scanner *scanner)
787
if (scanner->priv->handle) {
788
sane_cancel (scanner->priv->handle);
789
g_debug ("sane_cancel ()");
791
sane_close (scanner->priv->handle);
792
g_debug ("sane_close ()");
793
scanner->priv->handle = NULL;
796
g_free (scanner->priv->buffer);
797
scanner->priv->buffer = NULL;
799
for (iter = scanner->priv->job_queue; iter; iter = iter->next) {
800
ScanJob *job = (ScanJob *) iter->data;
801
g_free (job->device);
804
g_list_free (scanner->priv->job_queue);
805
scanner->priv->job_queue = NULL;
807
set_scanning (scanner, FALSE);
811
fail_scan (Scanner *scanner, gint error_code, const gchar *error_string)
813
close_device (scanner);
814
scanner->priv->state = STATE_IDLE;
815
emit_signal (scanner, SCAN_FAILED, g_error_new (SCANNER_TYPE, error_code, "%s", error_string));
820
handle_requests (Scanner *scanner)
822
gint request_count = 0;
824
/* Redetect when idle */
825
if (scanner->priv->state == STATE_IDLE && scanner->priv->redetect)
826
scanner->priv->state = STATE_REDETECT;
828
/* Process all requests */
830
ScanRequest *request = NULL;
832
if ((scanner->priv->state == STATE_IDLE && request_count == 0) ||
833
g_async_queue_length (scanner->priv->scan_queue) > 0)
834
request = g_async_queue_pop (scanner->priv->scan_queue);
838
g_debug ("Processing request");
841
switch (request->type) {
842
case REQUEST_REDETECT:
845
case REQUEST_START_SCAN:
846
scanner->priv->job_queue = g_list_append (scanner->priv->job_queue, request->job);
850
fail_scan (scanner, SANE_STATUS_CANCELLED, "Scan cancelled - do not report this error");
854
close_device (scanner);
867
do_open (Scanner *scanner)
872
job = (ScanJob *) scanner->priv->job_queue->data;
874
scanner->priv->line_count = 0;
875
scanner->priv->pass_number = 0;
876
scanner->priv->page_number = 0;
877
scanner->priv->notified_page = -1;
878
scanner->priv->option_index = 0;
879
scanner->priv->br_x_option_index = 0;
880
scanner->priv->br_y_option_index = 0;
882
if (!job->device && scanner->priv->default_device)
883
job->device = g_strdup (scanner->priv->default_device);
886
g_warning ("No scan device available");
887
fail_scan (scanner, 0,
888
/* Error displayed when no scanners to scan with */
889
_("No scanners available. Please connect a scanner."));
893
/* See if we can use the already open device */
894
if (scanner->priv->handle) {
895
if (strcmp (scanner->priv->current_device, job->device) == 0) {
896
scanner->priv->state = STATE_GET_OPTION;
900
sane_close (scanner->priv->handle);
901
g_debug ("sane_close ()");
902
scanner->priv->handle = NULL;
905
g_free (scanner->priv->current_device);
906
scanner->priv->current_device = NULL;
908
status = sane_open (job->device, &scanner->priv->handle);
909
g_debug ("sane_open (\"%s\") -> %s", job->device, get_status_string (status));
911
if (status != SANE_STATUS_GOOD) {
912
g_warning ("Unable to get open device: %s", sane_strstatus (status));
913
scanner->priv->handle = NULL;
914
fail_scan (scanner, status,
915
/* Error displayed when cannot connect to scanner */
916
_("Unable to connect to scanner"));
920
scanner->priv->current_device = g_strdup (job->device);
921
scanner->priv->state = STATE_GET_OPTION;
926
do_get_option (Scanner *scanner)
928
const SANE_Option_Descriptor *option;
929
SANE_Int option_index;
932
job = (ScanJob *) scanner->priv->job_queue->data;
934
option = sane_get_option_descriptor (scanner->priv->handle, scanner->priv->option_index);
935
g_debug ("sane_get_option_descriptor (%d)", scanner->priv->option_index);
936
option_index = scanner->priv->option_index;
937
scanner->priv->option_index++;
940
/* Always use maximum scan area - some scanners default to using partial areas. This should be patched in sane-backends */
941
if (scanner->priv->br_x_option_index) {
942
option = sane_get_option_descriptor (scanner->priv->handle, scanner->priv->br_x_option_index);
943
g_debug ("sane_get_option_descriptor (%d)", scanner->priv->br_x_option_index);
944
if (option->constraint_type == SANE_CONSTRAINT_RANGE) {
945
if (option->type == SANE_TYPE_FIXED)
946
set_fixed_option (scanner->priv->handle, option, scanner->priv->br_x_option_index, SANE_UNFIX (option->constraint.range->max), NULL);
948
set_int_option (scanner->priv->handle, option, scanner->priv->br_x_option_index, option->constraint.range->max, NULL);
951
if (scanner->priv->br_y_option_index) {
952
option = sane_get_option_descriptor (scanner->priv->handle, scanner->priv->br_y_option_index);
953
g_debug ("sane_get_option_descriptor (%d)", scanner->priv->br_y_option_index);
954
if (option->constraint_type == SANE_CONSTRAINT_RANGE) {
955
if (option->type == SANE_TYPE_FIXED)
956
set_fixed_option (scanner->priv->handle, option, scanner->priv->br_y_option_index, SANE_UNFIX (option->constraint.range->max), NULL);
958
set_int_option (scanner->priv->handle, option, scanner->priv->br_y_option_index, option->constraint.range->max, NULL);
962
scanner->priv->state = STATE_START;
966
log_option (option_index, option);
969
if (option->type == SANE_TYPE_GROUP)
972
/* Option disabled */
973
if (option->cap & SANE_CAP_INACTIVE)
976
/* Some options are unnammed (e.g. Option 0) */
977
if (option->name == NULL)
980
if (strcmp (option->name, SANE_NAME_SCAN_RESOLUTION) == 0) {
981
if (option->type == SANE_TYPE_FIXED) {
982
set_fixed_option (scanner->priv->handle, option, option_index, job->dpi, &job->dpi);
986
set_int_option (scanner->priv->handle, option, option_index, job->dpi, &dpi);
990
else if (strcmp (option->name, SANE_NAME_SCAN_SOURCE) == 0) {
991
const char *flatbed_sources[] =
996
SANE_I18N ("Flatbed"),
999
SANE_I18N ("Normal"),
1003
const char *adf_sources[] =
1005
"Automatic Document Feeder",
1006
SANE_I18N ("Automatic Document Feeder"),
1008
"Automatic Document Feeder(left aligned)", /* Seen in the proprietary brother3 driver */
1009
"Automatic Document Feeder(centrally aligned)", /* Seen in the proprietary brother3 driver */
1013
const char *adf_front_sources[] =
1016
SANE_I18N ("ADF Front"),
1020
const char *adf_back_sources[] =
1023
SANE_I18N ("ADF Back"),
1027
const char *adf_duplex_sources[] =
1030
SANE_I18N ("ADF Duplex"),
1034
switch (job->type) {
1036
if (!set_default_option (scanner->priv->handle, option, option_index))
1037
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, flatbed_sources, NULL))
1038
g_warning ("Unable to set single page source, please file a bug");
1040
case SCAN_ADF_FRONT:
1041
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, adf_front_sources, NULL))
1042
if (!!set_constrained_string_option (scanner->priv->handle, option, option_index, adf_sources, NULL))
1043
g_warning ("Unable to set front ADF source, please file a bug");
1046
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, adf_back_sources, NULL))
1047
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, adf_sources, NULL))
1048
g_warning ("Unable to set back ADF source, please file a bug");
1051
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, adf_duplex_sources, NULL))
1052
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, adf_sources, NULL))
1053
g_warning ("Unable to set duplex ADF source, please file a bug");
1057
else if (strcmp (option->name, "duplex") == 0) {
1058
if (option->type == SANE_TYPE_BOOL)
1059
set_bool_option (scanner->priv->handle, option, option_index, job->type == SCAN_ADF_BOTH, NULL);
1061
else if (strcmp (option->name, "batch-scan") == 0) {
1062
if (option->type == SANE_TYPE_BOOL)
1063
set_bool_option (scanner->priv->handle, option, option_index, job->type != SCAN_SINGLE, NULL);
1065
else if (strcmp (option->name, SANE_NAME_BIT_DEPTH) == 0) {
1067
set_int_option (scanner->priv->handle, option, option_index, job->depth, NULL);
1069
else if (strcmp (option->name, SANE_NAME_SCAN_MODE) == 0) {
1070
/* The names of scan modes often used in drivers, as taken from the sane-backends source */
1071
const char *color_scan_modes[] =
1073
SANE_VALUE_SCAN_MODE_COLOR,
1075
"24bit Color", /* Seen in the proprietary brother3 driver */
1078
const char *gray_scan_modes[] =
1080
SANE_VALUE_SCAN_MODE_GRAY,
1083
SANE_I18N ("Grayscale"),
1084
"True Gray", /* Seen in the proprietary brother3 driver */
1087
const char *lineart_scan_modes[] =
1089
SANE_VALUE_SCAN_MODE_LINEART,
1092
SANE_I18N ("LineArt"),
1094
SANE_I18N ("Black & White"),
1096
SANE_I18N ("Binary"),
1098
SANE_VALUE_SCAN_MODE_GRAY,
1101
SANE_I18N ("Grayscale"),
1102
"True Gray", /* Seen in the proprietary brother3 driver */
1106
switch (job->scan_mode) {
1107
case SCAN_MODE_COLOR:
1108
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, color_scan_modes, NULL))
1109
g_warning ("Unable to set Color mode, please file a bug");
1111
case SCAN_MODE_GRAY:
1112
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, gray_scan_modes, NULL))
1113
g_warning ("Unable to set Gray mode, please file a bug");
1115
case SCAN_MODE_LINEART:
1116
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, lineart_scan_modes, NULL))
1117
g_warning ("Unable to set Lineart mode, please file a bug");
1123
/* Disable compression, we will compress after scanning */
1124
else if (strcmp (option->name, "compression") == 0) {
1125
const char *disable_compression_names[] =
1134
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, disable_compression_names, NULL))
1135
g_warning ("Unable to disable compression, please file a bug");
1137
else if (strcmp (option->name, SANE_NAME_SCAN_BR_X) == 0)
1138
scanner->priv->br_x_option_index = option_index;
1139
else if (strcmp (option->name, SANE_NAME_SCAN_BR_Y) == 0)
1140
scanner->priv->br_y_option_index = option_index;
1141
else if (strcmp (option->name, SANE_NAME_PAGE_WIDTH) == 0) {
1142
if (job->page_width > 0.0) {
1143
if (option->type == SANE_TYPE_FIXED)
1144
set_fixed_option (scanner->priv->handle, option, option_index, job->page_width / 10.0, NULL);
1146
set_int_option (scanner->priv->handle, option, option_index, job->page_width / 10, NULL);
1149
else if (strcmp (option->name, SANE_NAME_PAGE_HEIGHT) == 0) {
1150
if (job->page_height > 0.0) {
1151
if (option->type == SANE_TYPE_FIXED)
1152
set_fixed_option (scanner->priv->handle, option, option_index, job->page_height / 10.0, NULL);
1154
set_int_option (scanner->priv->handle, option, option_index, job->page_height / 10, NULL);
1158
/* Test scanner options (hoping will not effect other scanners...) */
1159
if (strcmp (scanner->priv->current_device, "test") == 0) {
1160
if (strcmp (option->name, "hand-scanner") == 0) {
1161
set_bool_option (scanner->priv->handle, option, option_index, FALSE, NULL);
1163
else if (strcmp (option->name, "three-pass") == 0) {
1164
set_bool_option (scanner->priv->handle, option, option_index, FALSE, NULL);
1166
else if (strcmp (option->name, "test-picture") == 0) {
1167
set_string_option (scanner->priv->handle, option, option_index, "Color pattern", NULL);
1169
else if (strcmp (option->name, "read-delay") == 0) {
1170
set_bool_option (scanner->priv->handle, option, option_index, TRUE, NULL);
1172
else if (strcmp (option->name, "read-delay-duration") == 0) {
1173
set_int_option (scanner->priv->handle, option, option_index, 200000, NULL);
1180
do_complete_document (Scanner *scanner)
1184
job = (ScanJob *) scanner->priv->job_queue->data;
1185
g_free (job->device);
1187
scanner->priv->job_queue = g_list_remove_link (scanner->priv->job_queue, scanner->priv->job_queue);
1189
scanner->priv->state = STATE_IDLE;
1191
/* Continue onto the next job */
1192
if (scanner->priv->job_queue) {
1193
scanner->priv->state = STATE_OPEN;
1197
/* Trigger timeout to close */
1200
emit_signal (scanner, DOCUMENT_DONE, NULL);
1201
set_scanning (scanner, FALSE);
1206
do_start (Scanner *scanner)
1210
emit_signal (scanner, EXPECT_PAGE, NULL);
1212
status = sane_start (scanner->priv->handle);
1213
g_debug ("sane_start (page=%d, pass=%d) -> %s", scanner->priv->page_number, scanner->priv->pass_number, get_status_string (status));
1214
if (status == SANE_STATUS_GOOD) {
1215
scanner->priv->state = STATE_GET_PARAMETERS;
1217
else if (status == SANE_STATUS_NO_DOCS) {
1218
do_complete_document (scanner);
1221
g_warning ("Unable to start device: %s", sane_strstatus (status));
1222
fail_scan (scanner, status,
1223
/* Error display when unable to start scan */
1224
_("Unable to start scan"));
1230
do_get_parameters (Scanner *scanner)
1236
status = sane_get_parameters (scanner->priv->handle, &scanner->priv->parameters);
1237
g_debug ("sane_get_parameters () -> %s", get_status_string (status));
1238
if (status != SANE_STATUS_GOOD) {
1239
g_warning ("Unable to get device parameters: %s", sane_strstatus (status));
1240
fail_scan (scanner, status,
1241
/* Error displayed when communication with scanner broken */
1242
_("Error communicating with scanner"));
1246
job = (ScanJob *) scanner->priv->job_queue->data;
1248
g_debug ("Parameters: format=%s last_frame=%s bytes_per_line=%d pixels_per_line=%d lines=%d depth=%d",
1249
get_frame_string (scanner->priv->parameters.format),
1250
scanner->priv->parameters.last_frame ? "SANE_TRUE" : "SANE_FALSE",
1251
scanner->priv->parameters.bytes_per_line,
1252
scanner->priv->parameters.pixels_per_line,
1253
scanner->priv->parameters.lines,
1254
scanner->priv->parameters.depth);
1256
info = g_malloc(sizeof(ScanPageInfo));
1257
info->width = scanner->priv->parameters.pixels_per_line;
1258
info->height = scanner->priv->parameters.lines;
1259
info->depth = scanner->priv->parameters.depth;
1260
/* Reduce bit depth if requested lower than received */
1261
// FIXME: This a hack and only works on 8 bit gray to 2 bit gray
1262
if (scanner->priv->parameters.depth == 8 && scanner->priv->parameters.format == SANE_FRAME_GRAY && job->depth == 2 && job->scan_mode == SCAN_MODE_GRAY)
1263
info->depth = job->depth;
1264
info->n_channels = scanner->priv->parameters.format == SANE_FRAME_GRAY ? 1 : 3;
1265
info->dpi = job->dpi; // FIXME: This is the requested DPI, not the actual DPI
1266
info->device = g_strdup (scanner->priv->current_device);
1268
if (scanner->priv->page_number != scanner->priv->notified_page) {
1269
emit_signal (scanner, GOT_PAGE_INFO, info);
1270
scanner->priv->notified_page = scanner->priv->page_number;
1273
/* Prepare for read */
1274
scanner->priv->buffer_size = scanner->priv->parameters.bytes_per_line + 1; /* Use +1 so buffer is not resized if driver returns one line per read */
1275
scanner->priv->buffer = g_malloc (sizeof(SANE_Byte) * scanner->priv->buffer_size);
1276
scanner->priv->n_used = 0;
1277
scanner->priv->line_count = 0;
1278
scanner->priv->pass_number = 0;
1279
scanner->priv->state = STATE_READ;
1284
do_complete_page (Scanner *scanner)
1288
emit_signal (scanner, PAGE_DONE, NULL);
1290
job = (ScanJob *) scanner->priv->job_queue->data;
1292
/* If multi-pass then scan another page */
1293
if (!scanner->priv->parameters.last_frame) {
1294
scanner->priv->pass_number++;
1295
scanner->priv->state = STATE_START;
1299
/* Go back for another page */
1300
if (job->type != SCAN_SINGLE) {
1301
scanner->priv->page_number++;
1302
scanner->priv->pass_number = 0;
1303
emit_signal (scanner, PAGE_DONE, NULL);
1304
scanner->priv->state = STATE_START;
1308
sane_cancel (scanner->priv->handle);
1309
g_debug ("sane_cancel ()");
1311
do_complete_document (scanner);
1316
do_read (Scanner *scanner)
1320
SANE_Int n_to_read, n_read;
1321
gboolean full_read = FALSE;
1323
job = (ScanJob *) scanner->priv->job_queue->data;
1325
/* Read as many bytes as we expect */
1326
n_to_read = scanner->priv->buffer_size - scanner->priv->n_used;
1328
status = sane_read (scanner->priv->handle,
1329
scanner->priv->buffer + scanner->priv->n_used,
1330
n_to_read, &n_read);
1331
g_debug ("sane_read (%d) -> (%s, %d)", n_to_read, get_status_string (status), n_read);
1333
/* Completed read */
1334
if (status == SANE_STATUS_EOF) {
1335
if (scanner->priv->parameters.lines > 0 && scanner->priv->line_count != scanner->priv->parameters.lines)
1336
g_warning ("Scan completed with %d lines, expected %d lines", scanner->priv->parameters.lines, scanner->priv->parameters.lines);
1337
if (scanner->priv->n_used > 0)
1338
g_warning ("Scan complete with %d bytes of unused data", scanner->priv->n_used);
1339
do_complete_page (scanner);
1343
/* Communication error */
1344
if (status != SANE_STATUS_GOOD) {
1345
g_warning ("Unable to read frame from device: %s", sane_strstatus (status));
1346
fail_scan (scanner, status,
1347
/* Error displayed when communication with scanner broken */
1348
_("Error communicating with scanner"));
1352
if (scanner->priv->n_used == 0 && n_read == scanner->priv->buffer_size)
1354
scanner->priv->n_used += n_read;
1356
/* Feed out lines */
1357
if (scanner->priv->n_used >= scanner->priv->parameters.bytes_per_line) {
1361
line = g_malloc(sizeof(ScanLine));
1362
switch (scanner->priv->parameters.format) {
1363
case SANE_FRAME_GRAY:
1366
case SANE_FRAME_RGB:
1369
case SANE_FRAME_RED:
1372
case SANE_FRAME_GREEN:
1375
case SANE_FRAME_BLUE:
1379
line->width = scanner->priv->parameters.pixels_per_line;
1380
line->depth = scanner->priv->parameters.depth;
1381
line->data = scanner->priv->buffer;
1382
line->data_length = scanner->priv->parameters.bytes_per_line;
1383
line->number = scanner->priv->line_count;
1384
line->n_lines = scanner->priv->n_used / line->data_length;
1386
scanner->priv->buffer = NULL;
1387
scanner->priv->line_count += line->n_lines;
1389
/* Increase buffer size if did full read */
1391
scanner->priv->buffer_size += scanner->priv->parameters.bytes_per_line;
1393
scanner->priv->buffer = g_malloc(sizeof(SANE_Byte) * scanner->priv->buffer_size);
1394
n_remaining = scanner->priv->n_used - (line->n_lines * line->data_length);
1395
scanner->priv->n_used = 0;
1396
for (i = 0; i < n_remaining; i++) {
1397
scanner->priv->buffer[i] = line->data[i + (line->n_lines * line->data_length)];
1398
scanner->priv->n_used++;
1401
/* Reduce bit depth if requested lower than received */
1402
// FIXME: This a hack and only works on 8 bit gray to 2 bit gray
1403
if (scanner->priv->parameters.depth == 8 && scanner->priv->parameters.format == SANE_FRAME_GRAY &&
1404
job->depth == 2 && job->scan_mode == SCAN_MODE_GRAY) {
1405
gint block_shift = 6;
1407
guchar *write_ptr = line->data;
1409
for (i = 0; i < line->n_lines; i++) {
1410
guchar *in_line = line->data + i * line->data_length;
1413
for (x = 0; x < line->width; x++) {
1414
guchar *p = in_line + x;
1419
else if (p[0] >= 128)
1421
else if (p[0] >= 64)
1426
block |= sample << block_shift;
1427
if (block_shift == 0) {
1438
/* Finish each line on a byte boundary */
1439
if (block_shift != 6) {
1447
line->data_length = (line->width * 2 + 7) / 8;
1450
emit_signal (scanner, GOT_LINE, line);
1456
scan_thread (Scanner *scanner)
1459
SANE_Int version_code;
1461
g_hash_table_insert (scanners, g_thread_self (), scanner);
1463
scanner->priv->state = STATE_IDLE;
1465
status = sane_init (&version_code, authorization_cb);
1466
g_debug ("sane_init () -> %s", get_status_string (status));
1467
if (status != SANE_STATUS_GOOD) {
1468
g_warning ("Unable to initialize SANE backend: %s", sane_strstatus(status));
1471
g_debug ("SANE version %d.%d.%d",
1472
SANE_VERSION_MAJOR(version_code),
1473
SANE_VERSION_MINOR(version_code),
1474
SANE_VERSION_BUILD(version_code));
1476
/* Scan for devices on first start */
1477
scanner_redetect (scanner);
1479
while (handle_requests (scanner)) {
1480
switch (scanner->priv->state) {
1482
if (scanner->priv->job_queue) {
1483
set_scanning (scanner, TRUE);
1484
scanner->priv->state = STATE_OPEN;
1487
case STATE_REDETECT:
1488
do_redetect (scanner);
1493
case STATE_GET_OPTION:
1494
do_get_option (scanner);
1499
case STATE_GET_PARAMETERS:
1500
do_get_parameters (scanner);
1515
return g_object_new (SCANNER_TYPE, NULL);
1520
scanner_start (Scanner *scanner)
1522
GError *error = NULL;
1523
scanner->priv->thread = g_thread_create ((GThreadFunc) scan_thread, scanner, TRUE, &error);
1525
g_critical ("Unable to create thread: %s", error->message);
1526
g_error_free (error);
1532
scanner_redetect (Scanner *scanner)
1534
ScanRequest *request;
1536
if (scanner->priv->redetect)
1538
scanner->priv->redetect = TRUE;
1540
g_debug ("Requesting redetection of scan devices");
1542
request = g_malloc0 (sizeof (ScanRequest));
1543
request->type = REQUEST_REDETECT;
1544
g_async_queue_push (scanner->priv->scan_queue, request);
1549
scanner_is_scanning (Scanner *scanner)
1551
return scanner->priv->scanning;
1556
scanner_scan (Scanner *scanner, const char *device, ScanOptions *options)
1558
ScanRequest *request;
1559
const gchar *type_string;
1561
switch (options->type) {
1563
type_string = "SCAN_SINGLE";
1565
case SCAN_ADF_FRONT:
1566
type_string = "SCAN_ADF_FRONT";
1569
type_string = "SCAN_ADF_BACK";
1572
type_string = "SCAN_ADF_BOTH";
1579
g_debug ("scanner_scan (\"%s\", %d, %s)", device ? device : "(null)", options->dpi, type_string);
1580
request = g_malloc0 (sizeof (ScanRequest));
1581
request->type = REQUEST_START_SCAN;
1582
request->job = g_malloc0 (sizeof (ScanJob));
1583
request->job->device = g_strdup (device);
1584
request->job->dpi = options->dpi;
1585
request->job->scan_mode = options->scan_mode;
1586
request->job->depth = options->depth;
1587
request->job->type = options->type;
1588
request->job->page_width = options->paper_width;
1589
request->job->page_height = options->paper_height;
1590
g_async_queue_push (scanner->priv->scan_queue, request);
1595
scanner_cancel (Scanner *scanner)
1597
ScanRequest *request;
1599
request = g_malloc0 (sizeof (ScanRequest));
1600
request->type = REQUEST_CANCEL;
1601
g_async_queue_push (scanner->priv->scan_queue, request);
1605
void scanner_free (Scanner *scanner)
1607
ScanRequest *request;
1609
g_debug ("Stopping scan thread");
1611
request = g_malloc0 (sizeof (ScanRequest));
1612
request->type = REQUEST_QUIT;
1613
g_async_queue_push (scanner->priv->scan_queue, request);
1615
if (scanner->priv->thread)
1616
g_thread_join (scanner->priv->thread);
1618
g_async_queue_unref (scanner->priv->scan_queue);
1619
g_object_unref (scanner);
1622
g_debug ("sane_exit ()");
1627
scanner_class_init (ScannerClass *klass)
1629
signals[AUTHORIZE] =
1630
g_signal_new ("authorize",
1631
G_TYPE_FROM_CLASS (klass),
1633
G_STRUCT_OFFSET (ScannerClass, authorize),
1635
g_cclosure_marshal_VOID__STRING,
1636
G_TYPE_NONE, 1, G_TYPE_STRING);
1637
signals[UPDATE_DEVICES] =
1638
g_signal_new ("update-devices",
1639
G_TYPE_FROM_CLASS (klass),
1641
G_STRUCT_OFFSET (ScannerClass, update_devices),
1643
g_cclosure_marshal_VOID__POINTER,
1644
G_TYPE_NONE, 1, G_TYPE_POINTER);
1645
signals[EXPECT_PAGE] =
1646
g_signal_new ("expect-page",
1647
G_TYPE_FROM_CLASS (klass),
1649
G_STRUCT_OFFSET (ScannerClass, expect_page),
1651
g_cclosure_marshal_VOID__VOID,
1653
signals[GOT_PAGE_INFO] =
1654
g_signal_new ("got-page-info",
1655
G_TYPE_FROM_CLASS (klass),
1657
G_STRUCT_OFFSET (ScannerClass, got_page_info),
1659
g_cclosure_marshal_VOID__POINTER,
1660
G_TYPE_NONE, 1, G_TYPE_POINTER);
1662
g_signal_new ("got-line",
1663
G_TYPE_FROM_CLASS (klass),
1665
G_STRUCT_OFFSET (ScannerClass, got_line),
1667
g_cclosure_marshal_VOID__POINTER,
1668
G_TYPE_NONE, 1, G_TYPE_POINTER);
1669
signals[SCAN_FAILED] =
1670
g_signal_new ("scan-failed",
1671
G_TYPE_FROM_CLASS (klass),
1673
G_STRUCT_OFFSET (ScannerClass, scan_failed),
1675
g_cclosure_marshal_VOID__POINTER,
1676
G_TYPE_NONE, 1, G_TYPE_POINTER);
1677
signals[PAGE_DONE] =
1678
g_signal_new ("page-done",
1679
G_TYPE_FROM_CLASS (klass),
1681
G_STRUCT_OFFSET (ScannerClass, page_done),
1683
g_cclosure_marshal_VOID__VOID,
1685
signals[DOCUMENT_DONE] =
1686
g_signal_new ("document-done",
1687
G_TYPE_FROM_CLASS (klass),
1689
G_STRUCT_OFFSET (ScannerClass, document_done),
1691
g_cclosure_marshal_VOID__VOID,
1693
signals[SCANNING_CHANGED] =
1694
g_signal_new ("scanning-changed",
1695
G_TYPE_FROM_CLASS (klass),
1697
G_STRUCT_OFFSET (ScannerClass, scanning_changed),
1699
g_cclosure_marshal_VOID__VOID,
1702
g_type_class_add_private (klass, sizeof (ScannerPrivate));
1704
scanners = g_hash_table_new (g_direct_hash, g_direct_equal);
1709
scanner_init (Scanner *scanner)
1711
scanner->priv = G_TYPE_INSTANCE_GET_PRIVATE (scanner, SCANNER_TYPE, ScannerPrivate);
1712
scanner->priv->scan_queue = g_async_queue_new ();
1713
scanner->priv->authorize_queue = g_async_queue_new ();
497
GTypeInstance parent_instance;
498
volatile int ref_count;
499
NotifyPrivate * priv;
502
struct _NotifyClass {
503
GTypeClass parent_class;
504
void (*finalize) (Notify *self);
505
void (*run) (Notify* self, Scanner* scanner);
508
struct _ParamSpecNotify {
509
GParamSpec parent_instance;
512
struct _NotifyScanningChanged {
513
Notify parent_instance;
514
NotifyScanningChangedPrivate * priv;
517
struct _NotifyScanningChangedClass {
518
NotifyClass parent_class;
521
struct _NotifyUpdateDevices {
522
Notify parent_instance;
523
NotifyUpdateDevicesPrivate * priv;
526
struct _NotifyUpdateDevicesClass {
527
NotifyClass parent_class;
530
struct _NotifyUpdateDevicesPrivate {
534
struct _NotifyRequestAuthorization {
535
Notify parent_instance;
536
NotifyRequestAuthorizationPrivate * priv;
539
struct _NotifyRequestAuthorizationClass {
540
NotifyClass parent_class;
543
struct _NotifyRequestAuthorizationPrivate {
547
struct _NotifyScanFailed {
548
Notify parent_instance;
549
NotifyScanFailedPrivate * priv;
552
struct _NotifyScanFailedClass {
553
NotifyClass parent_class;
556
struct _NotifyScanFailedPrivate {
561
struct _NotifyDocumentDone {
562
Notify parent_instance;
563
NotifyDocumentDonePrivate * priv;
566
struct _NotifyDocumentDoneClass {
567
NotifyClass parent_class;
570
struct _NotifyExpectPage {
571
Notify parent_instance;
572
NotifyExpectPagePrivate * priv;
575
struct _NotifyExpectPageClass {
576
NotifyClass parent_class;
579
struct _NotifyGotPageInfo {
580
Notify parent_instance;
581
NotifyGotPageInfoPrivate * priv;
584
struct _NotifyGotPageInfoClass {
585
NotifyClass parent_class;
588
struct _NotifyGotPageInfoPrivate {
592
struct _NotifyPageDone {
593
Notify parent_instance;
594
NotifyPageDonePrivate * priv;
597
struct _NotifyPageDoneClass {
598
NotifyClass parent_class;
601
struct _NotifyGotLine {
602
Notify parent_instance;
603
NotifyGotLinePrivate * priv;
606
struct _NotifyGotLineClass {
607
NotifyClass parent_class;
610
struct _NotifyGotLinePrivate {
615
GTypeInstance parent_instance;
616
volatile int ref_count;
617
ScannerPrivate * priv;
620
struct _ScannerClass {
621
GTypeClass parent_class;
622
void (*finalize) (Scanner *self);
625
struct _ScannerPrivate {
627
GAsyncQueue* request_queue;
628
GAsyncQueue* notify_queue;
629
GAsyncQueue* authorize_queue;
630
gchar* default_device;
632
gboolean need_redetect;
635
gboolean have_handle;
636
gchar* current_device;
637
SANE_Parameters parameters;
638
SANE_Int option_index;
639
SANE_Int br_x_option_index;
640
SANE_Int br_y_option_index;
652
struct _ParamSpecScanner {
653
GParamSpec parent_instance;
657
static gpointer scan_device_parent_class = NULL;
658
static gpointer scan_page_info_parent_class = NULL;
659
static gpointer scan_line_parent_class = NULL;
660
static gpointer scan_options_parent_class = NULL;
661
static gpointer scan_job_parent_class = NULL;
662
static gpointer request_parent_class = NULL;
663
static gpointer request_redetect_parent_class = NULL;
664
static gpointer request_cancel_parent_class = NULL;
665
static gpointer request_start_scan_parent_class = NULL;
666
static gpointer request_quit_parent_class = NULL;
667
static gpointer credentials_parent_class = NULL;
668
static gpointer notify_parent_class = NULL;
669
static gpointer notify_scanning_changed_parent_class = NULL;
670
static gpointer notify_update_devices_parent_class = NULL;
671
static gpointer notify_request_authorization_parent_class = NULL;
672
static gpointer notify_scan_failed_parent_class = NULL;
673
static gpointer notify_document_done_parent_class = NULL;
674
static gpointer notify_expect_page_parent_class = NULL;
675
static gpointer notify_got_page_info_parent_class = NULL;
676
static gpointer notify_page_done_parent_class = NULL;
677
static gpointer notify_got_line_parent_class = NULL;
678
static gpointer scanner_parent_class = NULL;
679
static Scanner* scanner_scanner_object;
680
static Scanner* scanner_scanner_object = NULL;
682
gpointer scan_device_ref (gpointer instance);
683
void scan_device_unref (gpointer instance);
684
GParamSpec* param_spec_scan_device (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
685
void value_set_scan_device (GValue* value, gpointer v_object);
686
void value_take_scan_device (GValue* value, gpointer v_object);
687
gpointer value_get_scan_device (const GValue* value);
688
GType scan_device_get_type (void) G_GNUC_CONST;
690
SCAN_DEVICE_DUMMY_PROPERTY
692
ScanDevice* scan_device_new (void);
693
ScanDevice* scan_device_construct (GType object_type);
694
static void scan_device_finalize (ScanDevice* obj);
695
gpointer scan_page_info_ref (gpointer instance);
696
void scan_page_info_unref (gpointer instance);
697
GParamSpec* param_spec_scan_page_info (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
698
void value_set_scan_page_info (GValue* value, gpointer v_object);
699
void value_take_scan_page_info (GValue* value, gpointer v_object);
700
gpointer value_get_scan_page_info (const GValue* value);
701
GType scan_page_info_get_type (void) G_GNUC_CONST;
703
SCAN_PAGE_INFO_DUMMY_PROPERTY
705
ScanPageInfo* scan_page_info_new (void);
706
ScanPageInfo* scan_page_info_construct (GType object_type);
707
static void scan_page_info_finalize (ScanPageInfo* obj);
708
gpointer scan_line_ref (gpointer instance);
709
void scan_line_unref (gpointer instance);
710
GParamSpec* param_spec_scan_line (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
711
void value_set_scan_line (GValue* value, gpointer v_object);
712
void value_take_scan_line (GValue* value, gpointer v_object);
713
gpointer value_get_scan_line (const GValue* value);
714
GType scan_line_get_type (void) G_GNUC_CONST;
716
SCAN_LINE_DUMMY_PROPERTY
718
ScanLine* scan_line_new (void);
719
ScanLine* scan_line_construct (GType object_type);
720
static void scan_line_finalize (ScanLine* obj);
721
GType scan_mode_get_type (void) G_GNUC_CONST;
722
GType scan_type_get_type (void) G_GNUC_CONST;
723
gpointer scan_options_ref (gpointer instance);
724
void scan_options_unref (gpointer instance);
725
GParamSpec* param_spec_scan_options (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
726
void value_set_scan_options (GValue* value, gpointer v_object);
727
void value_take_scan_options (GValue* value, gpointer v_object);
728
gpointer value_get_scan_options (const GValue* value);
729
GType scan_options_get_type (void) G_GNUC_CONST;
731
SCAN_OPTIONS_DUMMY_PROPERTY
733
ScanOptions* scan_options_new (void);
734
ScanOptions* scan_options_construct (GType object_type);
735
static void scan_options_finalize (ScanOptions* obj);
736
gpointer scan_job_ref (gpointer instance);
737
void scan_job_unref (gpointer instance);
738
GParamSpec* param_spec_scan_job (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
739
void value_set_scan_job (GValue* value, gpointer v_object);
740
void value_take_scan_job (GValue* value, gpointer v_object);
741
gpointer value_get_scan_job (const GValue* value);
742
GType scan_job_get_type (void) G_GNUC_CONST;
744
SCAN_JOB_DUMMY_PROPERTY
746
ScanJob* scan_job_new (void);
747
ScanJob* scan_job_construct (GType object_type);
748
static void scan_job_finalize (ScanJob* obj);
749
gpointer request_ref (gpointer instance);
750
void request_unref (gpointer instance);
751
GParamSpec* param_spec_request (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
752
void value_set_request (GValue* value, gpointer v_object);
753
void value_take_request (GValue* value, gpointer v_object);
754
gpointer value_get_request (const GValue* value);
755
GType request_get_type (void) G_GNUC_CONST;
757
REQUEST_DUMMY_PROPERTY
759
Request* request_new (void);
760
Request* request_construct (GType object_type);
761
static void request_finalize (Request* obj);
762
GType request_redetect_get_type (void) G_GNUC_CONST;
764
REQUEST_REDETECT_DUMMY_PROPERTY
766
RequestRedetect* request_redetect_new (void);
767
RequestRedetect* request_redetect_construct (GType object_type);
768
GType request_cancel_get_type (void) G_GNUC_CONST;
770
REQUEST_CANCEL_DUMMY_PROPERTY
772
RequestCancel* request_cancel_new (void);
773
RequestCancel* request_cancel_construct (GType object_type);
774
GType request_start_scan_get_type (void) G_GNUC_CONST;
776
REQUEST_START_SCAN_DUMMY_PROPERTY
778
RequestStartScan* request_start_scan_new (void);
779
RequestStartScan* request_start_scan_construct (GType object_type);
780
static void request_start_scan_finalize (Request* obj);
781
GType request_quit_get_type (void) G_GNUC_CONST;
783
REQUEST_QUIT_DUMMY_PROPERTY
785
RequestQuit* request_quit_new (void);
786
RequestQuit* request_quit_construct (GType object_type);
787
gpointer credentials_ref (gpointer instance);
788
void credentials_unref (gpointer instance);
789
GParamSpec* param_spec_credentials (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
790
void value_set_credentials (GValue* value, gpointer v_object);
791
void value_take_credentials (GValue* value, gpointer v_object);
792
gpointer value_get_credentials (const GValue* value);
793
GType credentials_get_type (void) G_GNUC_CONST;
795
CREDENTIALS_DUMMY_PROPERTY
797
Credentials* credentials_new (void);
798
Credentials* credentials_construct (GType object_type);
799
static void credentials_finalize (Credentials* obj);
800
GType scan_state_get_type (void) G_GNUC_CONST;
801
gpointer notify_ref (gpointer instance);
802
void notify_unref (gpointer instance);
803
GParamSpec* param_spec_notify (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
804
void value_set_notify (GValue* value, gpointer v_object);
805
void value_take_notify (GValue* value, gpointer v_object);
806
gpointer value_get_notify (const GValue* value);
807
GType notify_get_type (void) G_GNUC_CONST;
808
gpointer scanner_ref (gpointer instance);
809
void scanner_unref (gpointer instance);
810
GParamSpec* param_spec_scanner (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
811
void value_set_scanner (GValue* value, gpointer v_object);
812
void value_take_scanner (GValue* value, gpointer v_object);
813
gpointer value_get_scanner (const GValue* value);
814
GType scanner_get_type (void) G_GNUC_CONST;
816
NOTIFY_DUMMY_PROPERTY
818
void notify_run (Notify* self, Scanner* scanner);
819
static void notify_real_run (Notify* self, Scanner* scanner);
820
Notify* notify_new (void);
821
Notify* notify_construct (GType object_type);
822
static void notify_finalize (Notify* obj);
823
GType notify_scanning_changed_get_type (void) G_GNUC_CONST;
825
NOTIFY_SCANNING_CHANGED_DUMMY_PROPERTY
827
static void notify_scanning_changed_real_run (Notify* base, Scanner* scanner);
828
NotifyScanningChanged* notify_scanning_changed_new (void);
829
NotifyScanningChanged* notify_scanning_changed_construct (GType object_type);
830
GType notify_update_devices_get_type (void) G_GNUC_CONST;
831
#define NOTIFY_UPDATE_DEVICES_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_NOTIFY_UPDATE_DEVICES, NotifyUpdateDevicesPrivate))
833
NOTIFY_UPDATE_DEVICES_DUMMY_PROPERTY
835
static void _scan_device_unref0_ (gpointer var);
836
static void _g_list_free__scan_device_unref0_ (GList* self);
837
NotifyUpdateDevices* notify_update_devices_new (GList* devices);
838
NotifyUpdateDevices* notify_update_devices_construct (GType object_type, GList* devices);
839
static void notify_update_devices_real_run (Notify* base, Scanner* scanner);
840
static void notify_update_devices_finalize (Notify* obj);
841
GType notify_request_authorization_get_type (void) G_GNUC_CONST;
842
#define NOTIFY_REQUEST_AUTHORIZATION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_NOTIFY_REQUEST_AUTHORIZATION, NotifyRequestAuthorizationPrivate))
844
NOTIFY_REQUEST_AUTHORIZATION_DUMMY_PROPERTY
846
NotifyRequestAuthorization* notify_request_authorization_new (const gchar* resource);
847
NotifyRequestAuthorization* notify_request_authorization_construct (GType object_type, const gchar* resource);
848
static void notify_request_authorization_real_run (Notify* base, Scanner* scanner);
849
static void notify_request_authorization_finalize (Notify* obj);
850
GType notify_scan_failed_get_type (void) G_GNUC_CONST;
851
#define NOTIFY_SCAN_FAILED_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_NOTIFY_SCAN_FAILED, NotifyScanFailedPrivate))
853
NOTIFY_SCAN_FAILED_DUMMY_PROPERTY
855
NotifyScanFailed* notify_scan_failed_new (gint error_code, const gchar* error_string);
856
NotifyScanFailed* notify_scan_failed_construct (GType object_type, gint error_code, const gchar* error_string);
857
static void notify_scan_failed_real_run (Notify* base, Scanner* scanner);
858
static void notify_scan_failed_finalize (Notify* obj);
859
GType notify_document_done_get_type (void) G_GNUC_CONST;
861
NOTIFY_DOCUMENT_DONE_DUMMY_PROPERTY
863
static void notify_document_done_real_run (Notify* base, Scanner* scanner);
864
NotifyDocumentDone* notify_document_done_new (void);
865
NotifyDocumentDone* notify_document_done_construct (GType object_type);
866
GType notify_expect_page_get_type (void) G_GNUC_CONST;
868
NOTIFY_EXPECT_PAGE_DUMMY_PROPERTY
870
static void notify_expect_page_real_run (Notify* base, Scanner* scanner);
871
NotifyExpectPage* notify_expect_page_new (void);
872
NotifyExpectPage* notify_expect_page_construct (GType object_type);
873
GType notify_got_page_info_get_type (void) G_GNUC_CONST;
874
#define NOTIFY_GOT_PAGE_INFO_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_NOTIFY_GOT_PAGE_INFO, NotifyGotPageInfoPrivate))
876
NOTIFY_GOT_PAGE_INFO_DUMMY_PROPERTY
878
NotifyGotPageInfo* notify_got_page_info_new (ScanPageInfo* info);
879
NotifyGotPageInfo* notify_got_page_info_construct (GType object_type, ScanPageInfo* info);
880
static void notify_got_page_info_real_run (Notify* base, Scanner* scanner);
881
static void notify_got_page_info_finalize (Notify* obj);
882
GType notify_page_done_get_type (void) G_GNUC_CONST;
884
NOTIFY_PAGE_DONE_DUMMY_PROPERTY
886
static void notify_page_done_real_run (Notify* base, Scanner* scanner);
887
NotifyPageDone* notify_page_done_new (void);
888
NotifyPageDone* notify_page_done_construct (GType object_type);
889
GType notify_got_line_get_type (void) G_GNUC_CONST;
890
#define NOTIFY_GOT_LINE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_NOTIFY_GOT_LINE, NotifyGotLinePrivate))
892
NOTIFY_GOT_LINE_DUMMY_PROPERTY
894
NotifyGotLine* notify_got_line_new (ScanLine* line);
895
NotifyGotLine* notify_got_line_construct (GType object_type, ScanLine* line);
896
static void notify_got_line_real_run (Notify* base, Scanner* scanner);
897
static void notify_got_line_finalize (Notify* obj);
898
#define SCANNER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_SCANNER, ScannerPrivate))
900
SCANNER_DUMMY_PROPERTY
902
static void _scan_job_unref0_ (gpointer var);
903
static void _g_list_free__scan_job_unref0_ (GList* self);
904
static Scanner* scanner_new (void);
905
static Scanner* scanner_construct (GType object_type);
906
Scanner* scanner_get_instance (void);
907
static gboolean scanner_notify_idle_cb (Scanner* self);
908
static void scanner_notify (Scanner* self, Notify* notification);
909
static gboolean _scanner_notify_idle_cb_gsource_func (gpointer self);
910
static void scanner_set_scanning (Scanner* self, gboolean is_scanning);
911
static gint scanner_get_device_weight (const gchar* device);
912
static gint scanner_compare_devices (ScanDevice* device1, ScanDevice* device2);
913
static void scanner_do_redetect (Scanner* self);
914
static gint _scanner_compare_devices_gcompare_func (gconstpointer a, gconstpointer b);
915
static gboolean scanner_set_default_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index);
916
static void scanner_set_bool_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, gboolean value, gboolean* _result_);
917
static void scanner_set_int_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, gint value, gint* _result_);
918
static void scanner_set_fixed_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, gdouble value, gdouble* _result_);
919
static gboolean scanner_set_string_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, const gchar* value, gchar** _result_);
920
static gboolean scanner_set_constrained_string_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, gchar** values, int values_length1, gchar** _result_);
921
static void scanner_log_option (Scanner* self, SANE_Int index, const SANE_Option_Descriptor* option);
922
static void scanner_authorization_cb (const gchar* resource, gchar* username, int username_length1, gchar* password, int password_length1);
923
void scanner_authorize (Scanner* self, const gchar* username, const gchar* password);
924
static void scanner_close_device (Scanner* self);
925
static void scanner_fail_scan (Scanner* self, gint error_code, const gchar* error_string);
926
static gboolean scanner_handle_requests (Scanner* self);
927
static void scanner_do_open (Scanner* self);
928
static void scanner_do_get_option (Scanner* self);
929
static void scanner_do_complete_document (Scanner* self);
930
static void scanner_do_start (Scanner* self);
931
static void scanner_do_get_parameters (Scanner* self);
932
static void scanner_do_complete_page (Scanner* self);
933
static void scanner_do_read (Scanner* self);
934
static gboolean scanner_scan_thread (Scanner* self);
935
static void _scanner_authorization_cb_sane_authcallback (const gchar* resource, gchar* username, gchar* password);
936
void scanner_redetect (Scanner* self);
937
void scanner_start (Scanner* self);
938
static gpointer _scanner_scan_thread_gthread_func (gpointer self);
939
gboolean scanner_is_scanning (Scanner* self);
940
static gchar* scanner_get_scan_mode_string (Scanner* self, ScanMode mode);
941
static gchar* scanner_get_scan_type_string (Scanner* self, ScanType type);
942
void scanner_scan (Scanner* self, const gchar* device, ScanOptions* options);
943
void scanner_cancel (Scanner* self);
944
void scanner_free (Scanner* self);
945
static void g_cclosure_user_marshal_VOID__SCAN_PAGE_INFO (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
946
static void g_cclosure_user_marshal_VOID__SCAN_LINE (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
947
static void g_cclosure_user_marshal_VOID__INT_STRING (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
948
static void scanner_finalize (Scanner* obj);
949
static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func);
950
static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func);
953
ScanDevice* scan_device_construct (GType object_type) {
954
ScanDevice* self = NULL;
955
self = (ScanDevice*) g_type_create_instance (object_type);
960
ScanDevice* scan_device_new (void) {
961
return scan_device_construct (TYPE_SCAN_DEVICE);
965
static void value_scan_device_init (GValue* value) {
966
value->data[0].v_pointer = NULL;
970
static void value_scan_device_free_value (GValue* value) {
971
if (value->data[0].v_pointer) {
972
scan_device_unref (value->data[0].v_pointer);
977
static void value_scan_device_copy_value (const GValue* src_value, GValue* dest_value) {
978
if (src_value->data[0].v_pointer) {
979
dest_value->data[0].v_pointer = scan_device_ref (src_value->data[0].v_pointer);
981
dest_value->data[0].v_pointer = NULL;
986
static gpointer value_scan_device_peek_pointer (const GValue* value) {
987
return value->data[0].v_pointer;
991
static gchar* value_scan_device_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
992
if (collect_values[0].v_pointer) {
994
object = collect_values[0].v_pointer;
995
if (object->parent_instance.g_class == NULL) {
996
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
997
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
998
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1000
value->data[0].v_pointer = scan_device_ref (object);
1002
value->data[0].v_pointer = NULL;
1008
static gchar* value_scan_device_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1009
ScanDevice** object_p;
1010
object_p = collect_values[0].v_pointer;
1012
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
1014
if (!value->data[0].v_pointer) {
1016
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
1017
*object_p = value->data[0].v_pointer;
1019
*object_p = scan_device_ref (value->data[0].v_pointer);
1025
GParamSpec* param_spec_scan_device (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
1026
ParamSpecScanDevice* spec;
1027
g_return_val_if_fail (g_type_is_a (object_type, TYPE_SCAN_DEVICE), NULL);
1028
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
1029
G_PARAM_SPEC (spec)->value_type = object_type;
1030
return G_PARAM_SPEC (spec);
1034
gpointer value_get_scan_device (const GValue* value) {
1035
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_DEVICE), NULL);
1036
return value->data[0].v_pointer;
1040
void value_set_scan_device (GValue* value, gpointer v_object) {
1042
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_DEVICE));
1043
old = value->data[0].v_pointer;
1045
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCAN_DEVICE));
1046
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1047
value->data[0].v_pointer = v_object;
1048
scan_device_ref (value->data[0].v_pointer);
1050
value->data[0].v_pointer = NULL;
1053
scan_device_unref (old);
1058
void value_take_scan_device (GValue* value, gpointer v_object) {
1060
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_DEVICE));
1061
old = value->data[0].v_pointer;
1063
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCAN_DEVICE));
1064
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1065
value->data[0].v_pointer = v_object;
1067
value->data[0].v_pointer = NULL;
1070
scan_device_unref (old);
1075
static void scan_device_class_init (ScanDeviceClass * klass) {
1076
scan_device_parent_class = g_type_class_peek_parent (klass);
1077
SCAN_DEVICE_CLASS (klass)->finalize = scan_device_finalize;
1081
static void scan_device_instance_init (ScanDevice * self) {
1082
self->ref_count = 1;
1086
static void scan_device_finalize (ScanDevice* obj) {
1088
self = SCAN_DEVICE (obj);
1089
_g_free0 (self->name);
1090
_g_free0 (self->label);
1094
GType scan_device_get_type (void) {
1095
static volatile gsize scan_device_type_id__volatile = 0;
1096
if (g_once_init_enter (&scan_device_type_id__volatile)) {
1097
static const GTypeValueTable g_define_type_value_table = { value_scan_device_init, value_scan_device_free_value, value_scan_device_copy_value, value_scan_device_peek_pointer, "p", value_scan_device_collect_value, "p", value_scan_device_lcopy_value };
1098
static const GTypeInfo g_define_type_info = { sizeof (ScanDeviceClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) scan_device_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ScanDevice), 0, (GInstanceInitFunc) scan_device_instance_init, &g_define_type_value_table };
1099
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
1100
GType scan_device_type_id;
1101
scan_device_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ScanDevice", &g_define_type_info, &g_define_type_fundamental_info, 0);
1102
g_once_init_leave (&scan_device_type_id__volatile, scan_device_type_id);
1104
return scan_device_type_id__volatile;
1108
gpointer scan_device_ref (gpointer instance) {
1111
g_atomic_int_inc (&self->ref_count);
1116
void scan_device_unref (gpointer instance) {
1119
if (g_atomic_int_dec_and_test (&self->ref_count)) {
1120
SCAN_DEVICE_GET_CLASS (self)->finalize (self);
1121
g_type_free_instance ((GTypeInstance *) self);
1126
ScanPageInfo* scan_page_info_construct (GType object_type) {
1127
ScanPageInfo* self = NULL;
1128
self = (ScanPageInfo*) g_type_create_instance (object_type);
1133
ScanPageInfo* scan_page_info_new (void) {
1134
return scan_page_info_construct (TYPE_SCAN_PAGE_INFO);
1138
static void value_scan_page_info_init (GValue* value) {
1139
value->data[0].v_pointer = NULL;
1143
static void value_scan_page_info_free_value (GValue* value) {
1144
if (value->data[0].v_pointer) {
1145
scan_page_info_unref (value->data[0].v_pointer);
1150
static void value_scan_page_info_copy_value (const GValue* src_value, GValue* dest_value) {
1151
if (src_value->data[0].v_pointer) {
1152
dest_value->data[0].v_pointer = scan_page_info_ref (src_value->data[0].v_pointer);
1154
dest_value->data[0].v_pointer = NULL;
1159
static gpointer value_scan_page_info_peek_pointer (const GValue* value) {
1160
return value->data[0].v_pointer;
1164
static gchar* value_scan_page_info_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1165
if (collect_values[0].v_pointer) {
1166
ScanPageInfo* object;
1167
object = collect_values[0].v_pointer;
1168
if (object->parent_instance.g_class == NULL) {
1169
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1170
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
1171
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1173
value->data[0].v_pointer = scan_page_info_ref (object);
1175
value->data[0].v_pointer = NULL;
1181
static gchar* value_scan_page_info_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1182
ScanPageInfo** object_p;
1183
object_p = collect_values[0].v_pointer;
1185
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
1187
if (!value->data[0].v_pointer) {
1189
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
1190
*object_p = value->data[0].v_pointer;
1192
*object_p = scan_page_info_ref (value->data[0].v_pointer);
1198
GParamSpec* param_spec_scan_page_info (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
1199
ParamSpecScanPageInfo* spec;
1200
g_return_val_if_fail (g_type_is_a (object_type, TYPE_SCAN_PAGE_INFO), NULL);
1201
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
1202
G_PARAM_SPEC (spec)->value_type = object_type;
1203
return G_PARAM_SPEC (spec);
1207
gpointer value_get_scan_page_info (const GValue* value) {
1208
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_PAGE_INFO), NULL);
1209
return value->data[0].v_pointer;
1213
void value_set_scan_page_info (GValue* value, gpointer v_object) {
1215
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_PAGE_INFO));
1216
old = value->data[0].v_pointer;
1218
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCAN_PAGE_INFO));
1219
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1220
value->data[0].v_pointer = v_object;
1221
scan_page_info_ref (value->data[0].v_pointer);
1223
value->data[0].v_pointer = NULL;
1226
scan_page_info_unref (old);
1231
void value_take_scan_page_info (GValue* value, gpointer v_object) {
1233
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_PAGE_INFO));
1234
old = value->data[0].v_pointer;
1236
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCAN_PAGE_INFO));
1237
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1238
value->data[0].v_pointer = v_object;
1240
value->data[0].v_pointer = NULL;
1243
scan_page_info_unref (old);
1248
static void scan_page_info_class_init (ScanPageInfoClass * klass) {
1249
scan_page_info_parent_class = g_type_class_peek_parent (klass);
1250
SCAN_PAGE_INFO_CLASS (klass)->finalize = scan_page_info_finalize;
1254
static void scan_page_info_instance_init (ScanPageInfo * self) {
1255
self->ref_count = 1;
1259
static void scan_page_info_finalize (ScanPageInfo* obj) {
1260
ScanPageInfo * self;
1261
self = SCAN_PAGE_INFO (obj);
1262
_g_free0 (self->device);
1266
GType scan_page_info_get_type (void) {
1267
static volatile gsize scan_page_info_type_id__volatile = 0;
1268
if (g_once_init_enter (&scan_page_info_type_id__volatile)) {
1269
static const GTypeValueTable g_define_type_value_table = { value_scan_page_info_init, value_scan_page_info_free_value, value_scan_page_info_copy_value, value_scan_page_info_peek_pointer, "p", value_scan_page_info_collect_value, "p", value_scan_page_info_lcopy_value };
1270
static const GTypeInfo g_define_type_info = { sizeof (ScanPageInfoClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) scan_page_info_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ScanPageInfo), 0, (GInstanceInitFunc) scan_page_info_instance_init, &g_define_type_value_table };
1271
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
1272
GType scan_page_info_type_id;
1273
scan_page_info_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ScanPageInfo", &g_define_type_info, &g_define_type_fundamental_info, 0);
1274
g_once_init_leave (&scan_page_info_type_id__volatile, scan_page_info_type_id);
1276
return scan_page_info_type_id__volatile;
1280
gpointer scan_page_info_ref (gpointer instance) {
1283
g_atomic_int_inc (&self->ref_count);
1288
void scan_page_info_unref (gpointer instance) {
1291
if (g_atomic_int_dec_and_test (&self->ref_count)) {
1292
SCAN_PAGE_INFO_GET_CLASS (self)->finalize (self);
1293
g_type_free_instance ((GTypeInstance *) self);
1298
ScanLine* scan_line_construct (GType object_type) {
1299
ScanLine* self = NULL;
1300
self = (ScanLine*) g_type_create_instance (object_type);
1305
ScanLine* scan_line_new (void) {
1306
return scan_line_construct (TYPE_SCAN_LINE);
1310
static void value_scan_line_init (GValue* value) {
1311
value->data[0].v_pointer = NULL;
1315
static void value_scan_line_free_value (GValue* value) {
1316
if (value->data[0].v_pointer) {
1317
scan_line_unref (value->data[0].v_pointer);
1322
static void value_scan_line_copy_value (const GValue* src_value, GValue* dest_value) {
1323
if (src_value->data[0].v_pointer) {
1324
dest_value->data[0].v_pointer = scan_line_ref (src_value->data[0].v_pointer);
1326
dest_value->data[0].v_pointer = NULL;
1331
static gpointer value_scan_line_peek_pointer (const GValue* value) {
1332
return value->data[0].v_pointer;
1336
static gchar* value_scan_line_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1337
if (collect_values[0].v_pointer) {
1339
object = collect_values[0].v_pointer;
1340
if (object->parent_instance.g_class == NULL) {
1341
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1342
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
1343
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1345
value->data[0].v_pointer = scan_line_ref (object);
1347
value->data[0].v_pointer = NULL;
1353
static gchar* value_scan_line_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1354
ScanLine** object_p;
1355
object_p = collect_values[0].v_pointer;
1357
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
1359
if (!value->data[0].v_pointer) {
1361
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
1362
*object_p = value->data[0].v_pointer;
1364
*object_p = scan_line_ref (value->data[0].v_pointer);
1370
GParamSpec* param_spec_scan_line (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
1371
ParamSpecScanLine* spec;
1372
g_return_val_if_fail (g_type_is_a (object_type, TYPE_SCAN_LINE), NULL);
1373
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
1374
G_PARAM_SPEC (spec)->value_type = object_type;
1375
return G_PARAM_SPEC (spec);
1379
gpointer value_get_scan_line (const GValue* value) {
1380
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_LINE), NULL);
1381
return value->data[0].v_pointer;
1385
void value_set_scan_line (GValue* value, gpointer v_object) {
1387
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_LINE));
1388
old = value->data[0].v_pointer;
1390
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCAN_LINE));
1391
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1392
value->data[0].v_pointer = v_object;
1393
scan_line_ref (value->data[0].v_pointer);
1395
value->data[0].v_pointer = NULL;
1398
scan_line_unref (old);
1403
void value_take_scan_line (GValue* value, gpointer v_object) {
1405
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_LINE));
1406
old = value->data[0].v_pointer;
1408
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCAN_LINE));
1409
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1410
value->data[0].v_pointer = v_object;
1412
value->data[0].v_pointer = NULL;
1415
scan_line_unref (old);
1420
static void scan_line_class_init (ScanLineClass * klass) {
1421
scan_line_parent_class = g_type_class_peek_parent (klass);
1422
SCAN_LINE_CLASS (klass)->finalize = scan_line_finalize;
1426
static void scan_line_instance_init (ScanLine * self) {
1427
self->ref_count = 1;
1431
static void scan_line_finalize (ScanLine* obj) {
1433
self = SCAN_LINE (obj);
1434
self->data = (g_free (self->data), NULL);
1438
GType scan_line_get_type (void) {
1439
static volatile gsize scan_line_type_id__volatile = 0;
1440
if (g_once_init_enter (&scan_line_type_id__volatile)) {
1441
static const GTypeValueTable g_define_type_value_table = { value_scan_line_init, value_scan_line_free_value, value_scan_line_copy_value, value_scan_line_peek_pointer, "p", value_scan_line_collect_value, "p", value_scan_line_lcopy_value };
1442
static const GTypeInfo g_define_type_info = { sizeof (ScanLineClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) scan_line_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ScanLine), 0, (GInstanceInitFunc) scan_line_instance_init, &g_define_type_value_table };
1443
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
1444
GType scan_line_type_id;
1445
scan_line_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ScanLine", &g_define_type_info, &g_define_type_fundamental_info, 0);
1446
g_once_init_leave (&scan_line_type_id__volatile, scan_line_type_id);
1448
return scan_line_type_id__volatile;
1452
gpointer scan_line_ref (gpointer instance) {
1455
g_atomic_int_inc (&self->ref_count);
1460
void scan_line_unref (gpointer instance) {
1463
if (g_atomic_int_dec_and_test (&self->ref_count)) {
1464
SCAN_LINE_GET_CLASS (self)->finalize (self);
1465
g_type_free_instance ((GTypeInstance *) self);
1470
GType scan_mode_get_type (void) {
1471
static volatile gsize scan_mode_type_id__volatile = 0;
1472
if (g_once_init_enter (&scan_mode_type_id__volatile)) {
1473
static const GEnumValue values[] = {{SCAN_MODE_DEFAULT, "SCAN_MODE_DEFAULT", "default"}, {SCAN_MODE_COLOR, "SCAN_MODE_COLOR", "color"}, {SCAN_MODE_GRAY, "SCAN_MODE_GRAY", "gray"}, {SCAN_MODE_LINEART, "SCAN_MODE_LINEART", "lineart"}, {0, NULL, NULL}};
1474
GType scan_mode_type_id;
1475
scan_mode_type_id = g_enum_register_static ("ScanMode", values);
1476
g_once_init_leave (&scan_mode_type_id__volatile, scan_mode_type_id);
1478
return scan_mode_type_id__volatile;
1482
GType scan_type_get_type (void) {
1483
static volatile gsize scan_type_type_id__volatile = 0;
1484
if (g_once_init_enter (&scan_type_type_id__volatile)) {
1485
static const GEnumValue values[] = {{SCAN_TYPE_SINGLE, "SCAN_TYPE_SINGLE", "single"}, {SCAN_TYPE_ADF_FRONT, "SCAN_TYPE_ADF_FRONT", "adf-front"}, {SCAN_TYPE_ADF_BACK, "SCAN_TYPE_ADF_BACK", "adf-back"}, {SCAN_TYPE_ADF_BOTH, "SCAN_TYPE_ADF_BOTH", "adf-both"}, {0, NULL, NULL}};
1486
GType scan_type_type_id;
1487
scan_type_type_id = g_enum_register_static ("ScanType", values);
1488
g_once_init_leave (&scan_type_type_id__volatile, scan_type_type_id);
1490
return scan_type_type_id__volatile;
1494
ScanOptions* scan_options_construct (GType object_type) {
1495
ScanOptions* self = NULL;
1496
self = (ScanOptions*) g_type_create_instance (object_type);
1501
ScanOptions* scan_options_new (void) {
1502
return scan_options_construct (TYPE_SCAN_OPTIONS);
1506
static void value_scan_options_init (GValue* value) {
1507
value->data[0].v_pointer = NULL;
1511
static void value_scan_options_free_value (GValue* value) {
1512
if (value->data[0].v_pointer) {
1513
scan_options_unref (value->data[0].v_pointer);
1518
static void value_scan_options_copy_value (const GValue* src_value, GValue* dest_value) {
1519
if (src_value->data[0].v_pointer) {
1520
dest_value->data[0].v_pointer = scan_options_ref (src_value->data[0].v_pointer);
1522
dest_value->data[0].v_pointer = NULL;
1527
static gpointer value_scan_options_peek_pointer (const GValue* value) {
1528
return value->data[0].v_pointer;
1532
static gchar* value_scan_options_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1533
if (collect_values[0].v_pointer) {
1534
ScanOptions* object;
1535
object = collect_values[0].v_pointer;
1536
if (object->parent_instance.g_class == NULL) {
1537
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1538
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
1539
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1541
value->data[0].v_pointer = scan_options_ref (object);
1543
value->data[0].v_pointer = NULL;
1549
static gchar* value_scan_options_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1550
ScanOptions** object_p;
1551
object_p = collect_values[0].v_pointer;
1553
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
1555
if (!value->data[0].v_pointer) {
1557
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
1558
*object_p = value->data[0].v_pointer;
1560
*object_p = scan_options_ref (value->data[0].v_pointer);
1566
GParamSpec* param_spec_scan_options (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
1567
ParamSpecScanOptions* spec;
1568
g_return_val_if_fail (g_type_is_a (object_type, TYPE_SCAN_OPTIONS), NULL);
1569
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
1570
G_PARAM_SPEC (spec)->value_type = object_type;
1571
return G_PARAM_SPEC (spec);
1575
gpointer value_get_scan_options (const GValue* value) {
1576
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_OPTIONS), NULL);
1577
return value->data[0].v_pointer;
1581
void value_set_scan_options (GValue* value, gpointer v_object) {
1583
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_OPTIONS));
1584
old = value->data[0].v_pointer;
1586
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCAN_OPTIONS));
1587
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1588
value->data[0].v_pointer = v_object;
1589
scan_options_ref (value->data[0].v_pointer);
1591
value->data[0].v_pointer = NULL;
1594
scan_options_unref (old);
1599
void value_take_scan_options (GValue* value, gpointer v_object) {
1601
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_OPTIONS));
1602
old = value->data[0].v_pointer;
1604
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCAN_OPTIONS));
1605
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1606
value->data[0].v_pointer = v_object;
1608
value->data[0].v_pointer = NULL;
1611
scan_options_unref (old);
1616
static void scan_options_class_init (ScanOptionsClass * klass) {
1617
scan_options_parent_class = g_type_class_peek_parent (klass);
1618
SCAN_OPTIONS_CLASS (klass)->finalize = scan_options_finalize;
1622
static void scan_options_instance_init (ScanOptions * self) {
1623
self->ref_count = 1;
1627
static void scan_options_finalize (ScanOptions* obj) {
1629
self = SCAN_OPTIONS (obj);
1633
GType scan_options_get_type (void) {
1634
static volatile gsize scan_options_type_id__volatile = 0;
1635
if (g_once_init_enter (&scan_options_type_id__volatile)) {
1636
static const GTypeValueTable g_define_type_value_table = { value_scan_options_init, value_scan_options_free_value, value_scan_options_copy_value, value_scan_options_peek_pointer, "p", value_scan_options_collect_value, "p", value_scan_options_lcopy_value };
1637
static const GTypeInfo g_define_type_info = { sizeof (ScanOptionsClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) scan_options_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ScanOptions), 0, (GInstanceInitFunc) scan_options_instance_init, &g_define_type_value_table };
1638
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
1639
GType scan_options_type_id;
1640
scan_options_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ScanOptions", &g_define_type_info, &g_define_type_fundamental_info, 0);
1641
g_once_init_leave (&scan_options_type_id__volatile, scan_options_type_id);
1643
return scan_options_type_id__volatile;
1647
gpointer scan_options_ref (gpointer instance) {
1650
g_atomic_int_inc (&self->ref_count);
1655
void scan_options_unref (gpointer instance) {
1658
if (g_atomic_int_dec_and_test (&self->ref_count)) {
1659
SCAN_OPTIONS_GET_CLASS (self)->finalize (self);
1660
g_type_free_instance ((GTypeInstance *) self);
1665
ScanJob* scan_job_construct (GType object_type) {
1666
ScanJob* self = NULL;
1667
self = (ScanJob*) g_type_create_instance (object_type);
1672
ScanJob* scan_job_new (void) {
1673
return scan_job_construct (TYPE_SCAN_JOB);
1677
static void value_scan_job_init (GValue* value) {
1678
value->data[0].v_pointer = NULL;
1682
static void value_scan_job_free_value (GValue* value) {
1683
if (value->data[0].v_pointer) {
1684
scan_job_unref (value->data[0].v_pointer);
1689
static void value_scan_job_copy_value (const GValue* src_value, GValue* dest_value) {
1690
if (src_value->data[0].v_pointer) {
1691
dest_value->data[0].v_pointer = scan_job_ref (src_value->data[0].v_pointer);
1693
dest_value->data[0].v_pointer = NULL;
1698
static gpointer value_scan_job_peek_pointer (const GValue* value) {
1699
return value->data[0].v_pointer;
1703
static gchar* value_scan_job_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1704
if (collect_values[0].v_pointer) {
1706
object = collect_values[0].v_pointer;
1707
if (object->parent_instance.g_class == NULL) {
1708
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1709
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
1710
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1712
value->data[0].v_pointer = scan_job_ref (object);
1714
value->data[0].v_pointer = NULL;
1720
static gchar* value_scan_job_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1722
object_p = collect_values[0].v_pointer;
1724
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
1726
if (!value->data[0].v_pointer) {
1728
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
1729
*object_p = value->data[0].v_pointer;
1731
*object_p = scan_job_ref (value->data[0].v_pointer);
1737
GParamSpec* param_spec_scan_job (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
1738
ParamSpecScanJob* spec;
1739
g_return_val_if_fail (g_type_is_a (object_type, TYPE_SCAN_JOB), NULL);
1740
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
1741
G_PARAM_SPEC (spec)->value_type = object_type;
1742
return G_PARAM_SPEC (spec);
1746
gpointer value_get_scan_job (const GValue* value) {
1747
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_JOB), NULL);
1748
return value->data[0].v_pointer;
1752
void value_set_scan_job (GValue* value, gpointer v_object) {
1754
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_JOB));
1755
old = value->data[0].v_pointer;
1757
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCAN_JOB));
1758
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1759
value->data[0].v_pointer = v_object;
1760
scan_job_ref (value->data[0].v_pointer);
1762
value->data[0].v_pointer = NULL;
1765
scan_job_unref (old);
1770
void value_take_scan_job (GValue* value, gpointer v_object) {
1772
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCAN_JOB));
1773
old = value->data[0].v_pointer;
1775
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCAN_JOB));
1776
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1777
value->data[0].v_pointer = v_object;
1779
value->data[0].v_pointer = NULL;
1782
scan_job_unref (old);
1787
static void scan_job_class_init (ScanJobClass * klass) {
1788
scan_job_parent_class = g_type_class_peek_parent (klass);
1789
SCAN_JOB_CLASS (klass)->finalize = scan_job_finalize;
1793
static void scan_job_instance_init (ScanJob * self) {
1794
self->ref_count = 1;
1798
static void scan_job_finalize (ScanJob* obj) {
1800
self = SCAN_JOB (obj);
1801
_g_free0 (self->device);
1805
GType scan_job_get_type (void) {
1806
static volatile gsize scan_job_type_id__volatile = 0;
1807
if (g_once_init_enter (&scan_job_type_id__volatile)) {
1808
static const GTypeValueTable g_define_type_value_table = { value_scan_job_init, value_scan_job_free_value, value_scan_job_copy_value, value_scan_job_peek_pointer, "p", value_scan_job_collect_value, "p", value_scan_job_lcopy_value };
1809
static const GTypeInfo g_define_type_info = { sizeof (ScanJobClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) scan_job_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ScanJob), 0, (GInstanceInitFunc) scan_job_instance_init, &g_define_type_value_table };
1810
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
1811
GType scan_job_type_id;
1812
scan_job_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ScanJob", &g_define_type_info, &g_define_type_fundamental_info, 0);
1813
g_once_init_leave (&scan_job_type_id__volatile, scan_job_type_id);
1815
return scan_job_type_id__volatile;
1819
gpointer scan_job_ref (gpointer instance) {
1822
g_atomic_int_inc (&self->ref_count);
1827
void scan_job_unref (gpointer instance) {
1830
if (g_atomic_int_dec_and_test (&self->ref_count)) {
1831
SCAN_JOB_GET_CLASS (self)->finalize (self);
1832
g_type_free_instance ((GTypeInstance *) self);
1837
Request* request_construct (GType object_type) {
1838
Request* self = NULL;
1839
self = (Request*) g_type_create_instance (object_type);
1844
Request* request_new (void) {
1845
return request_construct (TYPE_REQUEST);
1849
static void value_request_init (GValue* value) {
1850
value->data[0].v_pointer = NULL;
1854
static void value_request_free_value (GValue* value) {
1855
if (value->data[0].v_pointer) {
1856
request_unref (value->data[0].v_pointer);
1861
static void value_request_copy_value (const GValue* src_value, GValue* dest_value) {
1862
if (src_value->data[0].v_pointer) {
1863
dest_value->data[0].v_pointer = request_ref (src_value->data[0].v_pointer);
1865
dest_value->data[0].v_pointer = NULL;
1870
static gpointer value_request_peek_pointer (const GValue* value) {
1871
return value->data[0].v_pointer;
1875
static gchar* value_request_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1876
if (collect_values[0].v_pointer) {
1878
object = collect_values[0].v_pointer;
1879
if (object->parent_instance.g_class == NULL) {
1880
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1881
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
1882
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1884
value->data[0].v_pointer = request_ref (object);
1886
value->data[0].v_pointer = NULL;
1892
static gchar* value_request_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1894
object_p = collect_values[0].v_pointer;
1896
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
1898
if (!value->data[0].v_pointer) {
1900
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
1901
*object_p = value->data[0].v_pointer;
1903
*object_p = request_ref (value->data[0].v_pointer);
1909
GParamSpec* param_spec_request (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
1910
ParamSpecRequest* spec;
1911
g_return_val_if_fail (g_type_is_a (object_type, TYPE_REQUEST), NULL);
1912
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
1913
G_PARAM_SPEC (spec)->value_type = object_type;
1914
return G_PARAM_SPEC (spec);
1918
gpointer value_get_request (const GValue* value) {
1919
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_REQUEST), NULL);
1920
return value->data[0].v_pointer;
1924
void value_set_request (GValue* value, gpointer v_object) {
1926
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_REQUEST));
1927
old = value->data[0].v_pointer;
1929
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_REQUEST));
1930
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1931
value->data[0].v_pointer = v_object;
1932
request_ref (value->data[0].v_pointer);
1934
value->data[0].v_pointer = NULL;
1937
request_unref (old);
1942
void value_take_request (GValue* value, gpointer v_object) {
1944
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_REQUEST));
1945
old = value->data[0].v_pointer;
1947
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_REQUEST));
1948
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1949
value->data[0].v_pointer = v_object;
1951
value->data[0].v_pointer = NULL;
1954
request_unref (old);
1959
static void request_class_init (RequestClass * klass) {
1960
request_parent_class = g_type_class_peek_parent (klass);
1961
REQUEST_CLASS (klass)->finalize = request_finalize;
1965
static void request_instance_init (Request * self) {
1966
self->ref_count = 1;
1970
static void request_finalize (Request* obj) {
1972
self = REQUEST (obj);
1976
GType request_get_type (void) {
1977
static volatile gsize request_type_id__volatile = 0;
1978
if (g_once_init_enter (&request_type_id__volatile)) {
1979
static const GTypeValueTable g_define_type_value_table = { value_request_init, value_request_free_value, value_request_copy_value, value_request_peek_pointer, "p", value_request_collect_value, "p", value_request_lcopy_value };
1980
static const GTypeInfo g_define_type_info = { sizeof (RequestClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) request_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Request), 0, (GInstanceInitFunc) request_instance_init, &g_define_type_value_table };
1981
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
1982
GType request_type_id;
1983
request_type_id = g_type_register_fundamental (g_type_fundamental_next (), "Request", &g_define_type_info, &g_define_type_fundamental_info, 0);
1984
g_once_init_leave (&request_type_id__volatile, request_type_id);
1986
return request_type_id__volatile;
1990
gpointer request_ref (gpointer instance) {
1993
g_atomic_int_inc (&self->ref_count);
1998
void request_unref (gpointer instance) {
2001
if (g_atomic_int_dec_and_test (&self->ref_count)) {
2002
REQUEST_GET_CLASS (self)->finalize (self);
2003
g_type_free_instance ((GTypeInstance *) self);
2008
RequestRedetect* request_redetect_construct (GType object_type) {
2009
RequestRedetect* self = NULL;
2010
self = (RequestRedetect*) request_construct (object_type);
2015
RequestRedetect* request_redetect_new (void) {
2016
return request_redetect_construct (TYPE_REQUEST_REDETECT);
2020
static void request_redetect_class_init (RequestRedetectClass * klass) {
2021
request_redetect_parent_class = g_type_class_peek_parent (klass);
2025
static void request_redetect_instance_init (RequestRedetect * self) {
2029
GType request_redetect_get_type (void) {
2030
static volatile gsize request_redetect_type_id__volatile = 0;
2031
if (g_once_init_enter (&request_redetect_type_id__volatile)) {
2032
static const GTypeInfo g_define_type_info = { sizeof (RequestRedetectClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) request_redetect_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RequestRedetect), 0, (GInstanceInitFunc) request_redetect_instance_init, NULL };
2033
GType request_redetect_type_id;
2034
request_redetect_type_id = g_type_register_static (TYPE_REQUEST, "RequestRedetect", &g_define_type_info, 0);
2035
g_once_init_leave (&request_redetect_type_id__volatile, request_redetect_type_id);
2037
return request_redetect_type_id__volatile;
2041
RequestCancel* request_cancel_construct (GType object_type) {
2042
RequestCancel* self = NULL;
2043
self = (RequestCancel*) request_construct (object_type);
2048
RequestCancel* request_cancel_new (void) {
2049
return request_cancel_construct (TYPE_REQUEST_CANCEL);
2053
static void request_cancel_class_init (RequestCancelClass * klass) {
2054
request_cancel_parent_class = g_type_class_peek_parent (klass);
2058
static void request_cancel_instance_init (RequestCancel * self) {
2062
GType request_cancel_get_type (void) {
2063
static volatile gsize request_cancel_type_id__volatile = 0;
2064
if (g_once_init_enter (&request_cancel_type_id__volatile)) {
2065
static const GTypeInfo g_define_type_info = { sizeof (RequestCancelClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) request_cancel_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RequestCancel), 0, (GInstanceInitFunc) request_cancel_instance_init, NULL };
2066
GType request_cancel_type_id;
2067
request_cancel_type_id = g_type_register_static (TYPE_REQUEST, "RequestCancel", &g_define_type_info, 0);
2068
g_once_init_leave (&request_cancel_type_id__volatile, request_cancel_type_id);
2070
return request_cancel_type_id__volatile;
2074
RequestStartScan* request_start_scan_construct (GType object_type) {
2075
RequestStartScan* self = NULL;
2076
self = (RequestStartScan*) request_construct (object_type);
2081
RequestStartScan* request_start_scan_new (void) {
2082
return request_start_scan_construct (TYPE_REQUEST_START_SCAN);
2086
static void request_start_scan_class_init (RequestStartScanClass * klass) {
2087
request_start_scan_parent_class = g_type_class_peek_parent (klass);
2088
REQUEST_CLASS (klass)->finalize = request_start_scan_finalize;
2092
static void request_start_scan_instance_init (RequestStartScan * self) {
2096
static void request_start_scan_finalize (Request* obj) {
2097
RequestStartScan * self;
2098
self = REQUEST_START_SCAN (obj);
2099
_scan_job_unref0 (self->job);
2100
REQUEST_CLASS (request_start_scan_parent_class)->finalize (obj);
2104
GType request_start_scan_get_type (void) {
2105
static volatile gsize request_start_scan_type_id__volatile = 0;
2106
if (g_once_init_enter (&request_start_scan_type_id__volatile)) {
2107
static const GTypeInfo g_define_type_info = { sizeof (RequestStartScanClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) request_start_scan_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RequestStartScan), 0, (GInstanceInitFunc) request_start_scan_instance_init, NULL };
2108
GType request_start_scan_type_id;
2109
request_start_scan_type_id = g_type_register_static (TYPE_REQUEST, "RequestStartScan", &g_define_type_info, 0);
2110
g_once_init_leave (&request_start_scan_type_id__volatile, request_start_scan_type_id);
2112
return request_start_scan_type_id__volatile;
2116
RequestQuit* request_quit_construct (GType object_type) {
2117
RequestQuit* self = NULL;
2118
self = (RequestQuit*) request_construct (object_type);
2123
RequestQuit* request_quit_new (void) {
2124
return request_quit_construct (TYPE_REQUEST_QUIT);
2128
static void request_quit_class_init (RequestQuitClass * klass) {
2129
request_quit_parent_class = g_type_class_peek_parent (klass);
2133
static void request_quit_instance_init (RequestQuit * self) {
2137
GType request_quit_get_type (void) {
2138
static volatile gsize request_quit_type_id__volatile = 0;
2139
if (g_once_init_enter (&request_quit_type_id__volatile)) {
2140
static const GTypeInfo g_define_type_info = { sizeof (RequestQuitClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) request_quit_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RequestQuit), 0, (GInstanceInitFunc) request_quit_instance_init, NULL };
2141
GType request_quit_type_id;
2142
request_quit_type_id = g_type_register_static (TYPE_REQUEST, "RequestQuit", &g_define_type_info, 0);
2143
g_once_init_leave (&request_quit_type_id__volatile, request_quit_type_id);
2145
return request_quit_type_id__volatile;
2149
Credentials* credentials_construct (GType object_type) {
2150
Credentials* self = NULL;
2151
self = (Credentials*) g_type_create_instance (object_type);
2156
Credentials* credentials_new (void) {
2157
return credentials_construct (TYPE_CREDENTIALS);
2161
static void value_credentials_init (GValue* value) {
2162
value->data[0].v_pointer = NULL;
2166
static void value_credentials_free_value (GValue* value) {
2167
if (value->data[0].v_pointer) {
2168
credentials_unref (value->data[0].v_pointer);
2173
static void value_credentials_copy_value (const GValue* src_value, GValue* dest_value) {
2174
if (src_value->data[0].v_pointer) {
2175
dest_value->data[0].v_pointer = credentials_ref (src_value->data[0].v_pointer);
2177
dest_value->data[0].v_pointer = NULL;
2182
static gpointer value_credentials_peek_pointer (const GValue* value) {
2183
return value->data[0].v_pointer;
2187
static gchar* value_credentials_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
2188
if (collect_values[0].v_pointer) {
2189
Credentials* object;
2190
object = collect_values[0].v_pointer;
2191
if (object->parent_instance.g_class == NULL) {
2192
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
2193
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
2194
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
2196
value->data[0].v_pointer = credentials_ref (object);
2198
value->data[0].v_pointer = NULL;
2204
static gchar* value_credentials_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
2205
Credentials** object_p;
2206
object_p = collect_values[0].v_pointer;
2208
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
2210
if (!value->data[0].v_pointer) {
2212
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
2213
*object_p = value->data[0].v_pointer;
2215
*object_p = credentials_ref (value->data[0].v_pointer);
2221
GParamSpec* param_spec_credentials (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
2222
ParamSpecCredentials* spec;
2223
g_return_val_if_fail (g_type_is_a (object_type, TYPE_CREDENTIALS), NULL);
2224
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
2225
G_PARAM_SPEC (spec)->value_type = object_type;
2226
return G_PARAM_SPEC (spec);
2230
gpointer value_get_credentials (const GValue* value) {
2231
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_CREDENTIALS), NULL);
2232
return value->data[0].v_pointer;
2236
void value_set_credentials (GValue* value, gpointer v_object) {
2238
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_CREDENTIALS));
2239
old = value->data[0].v_pointer;
2241
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_CREDENTIALS));
2242
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
2243
value->data[0].v_pointer = v_object;
2244
credentials_ref (value->data[0].v_pointer);
2246
value->data[0].v_pointer = NULL;
2249
credentials_unref (old);
2254
void value_take_credentials (GValue* value, gpointer v_object) {
2256
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_CREDENTIALS));
2257
old = value->data[0].v_pointer;
2259
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_CREDENTIALS));
2260
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
2261
value->data[0].v_pointer = v_object;
2263
value->data[0].v_pointer = NULL;
2266
credentials_unref (old);
2271
static void credentials_class_init (CredentialsClass * klass) {
2272
credentials_parent_class = g_type_class_peek_parent (klass);
2273
CREDENTIALS_CLASS (klass)->finalize = credentials_finalize;
2277
static void credentials_instance_init (Credentials * self) {
2278
self->ref_count = 1;
2282
static void credentials_finalize (Credentials* obj) {
2284
self = CREDENTIALS (obj);
2285
_g_free0 (self->username);
2286
_g_free0 (self->password);
2290
GType credentials_get_type (void) {
2291
static volatile gsize credentials_type_id__volatile = 0;
2292
if (g_once_init_enter (&credentials_type_id__volatile)) {
2293
static const GTypeValueTable g_define_type_value_table = { value_credentials_init, value_credentials_free_value, value_credentials_copy_value, value_credentials_peek_pointer, "p", value_credentials_collect_value, "p", value_credentials_lcopy_value };
2294
static const GTypeInfo g_define_type_info = { sizeof (CredentialsClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) credentials_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Credentials), 0, (GInstanceInitFunc) credentials_instance_init, &g_define_type_value_table };
2295
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
2296
GType credentials_type_id;
2297
credentials_type_id = g_type_register_fundamental (g_type_fundamental_next (), "Credentials", &g_define_type_info, &g_define_type_fundamental_info, 0);
2298
g_once_init_leave (&credentials_type_id__volatile, credentials_type_id);
2300
return credentials_type_id__volatile;
2304
gpointer credentials_ref (gpointer instance) {
2307
g_atomic_int_inc (&self->ref_count);
2312
void credentials_unref (gpointer instance) {
2315
if (g_atomic_int_dec_and_test (&self->ref_count)) {
2316
CREDENTIALS_GET_CLASS (self)->finalize (self);
2317
g_type_free_instance ((GTypeInstance *) self);
2322
GType scan_state_get_type (void) {
2323
static volatile gsize scan_state_type_id__volatile = 0;
2324
if (g_once_init_enter (&scan_state_type_id__volatile)) {
2325
static const GEnumValue values[] = {{SCAN_STATE_IDLE, "SCAN_STATE_IDLE", "idle"}, {SCAN_STATE_REDETECT, "SCAN_STATE_REDETECT", "redetect"}, {SCAN_STATE_OPEN, "SCAN_STATE_OPEN", "open"}, {SCAN_STATE_GET_OPTION, "SCAN_STATE_GET_OPTION", "get-option"}, {SCAN_STATE_START, "SCAN_STATE_START", "start"}, {SCAN_STATE_GET_PARAMETERS, "SCAN_STATE_GET_PARAMETERS", "get-parameters"}, {SCAN_STATE_READ, "SCAN_STATE_READ", "read"}, {0, NULL, NULL}};
2326
GType scan_state_type_id;
2327
scan_state_type_id = g_enum_register_static ("ScanState", values);
2328
g_once_init_leave (&scan_state_type_id__volatile, scan_state_type_id);
2330
return scan_state_type_id__volatile;
2334
static void notify_real_run (Notify* self, Scanner* scanner) {
2335
g_return_if_fail (self != NULL);
2336
g_return_if_fail (scanner != NULL);
2340
void notify_run (Notify* self, Scanner* scanner) {
2341
NOTIFY_GET_CLASS (self)->run (self, scanner);
2345
Notify* notify_construct (GType object_type) {
2346
Notify* self = NULL;
2347
self = (Notify*) g_type_create_instance (object_type);
2352
Notify* notify_new (void) {
2353
return notify_construct (TYPE_NOTIFY);
2357
static void value_notify_init (GValue* value) {
2358
value->data[0].v_pointer = NULL;
2362
static void value_notify_free_value (GValue* value) {
2363
if (value->data[0].v_pointer) {
2364
notify_unref (value->data[0].v_pointer);
2369
static void value_notify_copy_value (const GValue* src_value, GValue* dest_value) {
2370
if (src_value->data[0].v_pointer) {
2371
dest_value->data[0].v_pointer = notify_ref (src_value->data[0].v_pointer);
2373
dest_value->data[0].v_pointer = NULL;
2378
static gpointer value_notify_peek_pointer (const GValue* value) {
2379
return value->data[0].v_pointer;
2383
static gchar* value_notify_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
2384
if (collect_values[0].v_pointer) {
2386
object = collect_values[0].v_pointer;
2387
if (object->parent_instance.g_class == NULL) {
2388
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
2389
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
2390
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
2392
value->data[0].v_pointer = notify_ref (object);
2394
value->data[0].v_pointer = NULL;
2400
static gchar* value_notify_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
2402
object_p = collect_values[0].v_pointer;
2404
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
2406
if (!value->data[0].v_pointer) {
2408
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
2409
*object_p = value->data[0].v_pointer;
2411
*object_p = notify_ref (value->data[0].v_pointer);
2417
GParamSpec* param_spec_notify (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
2418
ParamSpecNotify* spec;
2419
g_return_val_if_fail (g_type_is_a (object_type, TYPE_NOTIFY), NULL);
2420
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
2421
G_PARAM_SPEC (spec)->value_type = object_type;
2422
return G_PARAM_SPEC (spec);
2426
gpointer value_get_notify (const GValue* value) {
2427
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_NOTIFY), NULL);
2428
return value->data[0].v_pointer;
2432
void value_set_notify (GValue* value, gpointer v_object) {
2434
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_NOTIFY));
2435
old = value->data[0].v_pointer;
2437
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_NOTIFY));
2438
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
2439
value->data[0].v_pointer = v_object;
2440
notify_ref (value->data[0].v_pointer);
2442
value->data[0].v_pointer = NULL;
2450
void value_take_notify (GValue* value, gpointer v_object) {
2452
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_NOTIFY));
2453
old = value->data[0].v_pointer;
2455
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_NOTIFY));
2456
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
2457
value->data[0].v_pointer = v_object;
2459
value->data[0].v_pointer = NULL;
2467
static void notify_class_init (NotifyClass * klass) {
2468
notify_parent_class = g_type_class_peek_parent (klass);
2469
NOTIFY_CLASS (klass)->finalize = notify_finalize;
2470
NOTIFY_CLASS (klass)->run = notify_real_run;
2474
static void notify_instance_init (Notify * self) {
2475
self->ref_count = 1;
2479
static void notify_finalize (Notify* obj) {
2481
self = NOTIFY (obj);
2485
GType notify_get_type (void) {
2486
static volatile gsize notify_type_id__volatile = 0;
2487
if (g_once_init_enter (¬ify_type_id__volatile)) {
2488
static const GTypeValueTable g_define_type_value_table = { value_notify_init, value_notify_free_value, value_notify_copy_value, value_notify_peek_pointer, "p", value_notify_collect_value, "p", value_notify_lcopy_value };
2489
static const GTypeInfo g_define_type_info = { sizeof (NotifyClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notify_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Notify), 0, (GInstanceInitFunc) notify_instance_init, &g_define_type_value_table };
2490
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
2491
GType notify_type_id;
2492
notify_type_id = g_type_register_fundamental (g_type_fundamental_next (), "Notify", &g_define_type_info, &g_define_type_fundamental_info, 0);
2493
g_once_init_leave (¬ify_type_id__volatile, notify_type_id);
2495
return notify_type_id__volatile;
2499
gpointer notify_ref (gpointer instance) {
2502
g_atomic_int_inc (&self->ref_count);
2507
void notify_unref (gpointer instance) {
2510
if (g_atomic_int_dec_and_test (&self->ref_count)) {
2511
NOTIFY_GET_CLASS (self)->finalize (self);
2512
g_type_free_instance ((GTypeInstance *) self);
2517
static void notify_scanning_changed_real_run (Notify* base, Scanner* scanner) {
2518
NotifyScanningChanged * self;
2519
self = (NotifyScanningChanged*) base;
2520
g_return_if_fail (scanner != NULL);
2521
g_signal_emit_by_name (scanner, "scanning-changed");
2525
NotifyScanningChanged* notify_scanning_changed_construct (GType object_type) {
2526
NotifyScanningChanged* self = NULL;
2527
self = (NotifyScanningChanged*) notify_construct (object_type);
2532
NotifyScanningChanged* notify_scanning_changed_new (void) {
2533
return notify_scanning_changed_construct (TYPE_NOTIFY_SCANNING_CHANGED);
2537
static void notify_scanning_changed_class_init (NotifyScanningChangedClass * klass) {
2538
notify_scanning_changed_parent_class = g_type_class_peek_parent (klass);
2539
NOTIFY_CLASS (klass)->run = notify_scanning_changed_real_run;
2543
static void notify_scanning_changed_instance_init (NotifyScanningChanged * self) {
2547
GType notify_scanning_changed_get_type (void) {
2548
static volatile gsize notify_scanning_changed_type_id__volatile = 0;
2549
if (g_once_init_enter (¬ify_scanning_changed_type_id__volatile)) {
2550
static const GTypeInfo g_define_type_info = { sizeof (NotifyScanningChangedClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notify_scanning_changed_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (NotifyScanningChanged), 0, (GInstanceInitFunc) notify_scanning_changed_instance_init, NULL };
2551
GType notify_scanning_changed_type_id;
2552
notify_scanning_changed_type_id = g_type_register_static (TYPE_NOTIFY, "NotifyScanningChanged", &g_define_type_info, 0);
2553
g_once_init_leave (¬ify_scanning_changed_type_id__volatile, notify_scanning_changed_type_id);
2555
return notify_scanning_changed_type_id__volatile;
2559
static void _scan_device_unref0_ (gpointer var) {
2560
(var == NULL) ? NULL : (var = (scan_device_unref (var), NULL));
2564
static void _g_list_free__scan_device_unref0_ (GList* self) {
2565
g_list_foreach (self, (GFunc) _scan_device_unref0_, NULL);
2570
NotifyUpdateDevices* notify_update_devices_construct (GType object_type, GList* devices) {
2571
NotifyUpdateDevices* self = NULL;
2573
self = (NotifyUpdateDevices*) notify_construct (object_type);
2576
__g_list_free__scan_device_unref0_0 (self->priv->devices);
2577
self->priv->devices = _tmp0_;
2578
__g_list_free__scan_device_unref0_0 (devices);
2583
NotifyUpdateDevices* notify_update_devices_new (GList* devices) {
2584
return notify_update_devices_construct (TYPE_NOTIFY_UPDATE_DEVICES, devices);
2588
static void notify_update_devices_real_run (Notify* base, Scanner* scanner) {
2589
NotifyUpdateDevices * self;
2590
self = (NotifyUpdateDevices*) base;
2591
g_return_if_fail (scanner != NULL);
2592
g_signal_emit_by_name (scanner, "update-devices", self->priv->devices);
2596
static void notify_update_devices_class_init (NotifyUpdateDevicesClass * klass) {
2597
notify_update_devices_parent_class = g_type_class_peek_parent (klass);
2598
NOTIFY_CLASS (klass)->finalize = notify_update_devices_finalize;
2599
g_type_class_add_private (klass, sizeof (NotifyUpdateDevicesPrivate));
2600
NOTIFY_CLASS (klass)->run = notify_update_devices_real_run;
2604
static void notify_update_devices_instance_init (NotifyUpdateDevices * self) {
2605
self->priv = NOTIFY_UPDATE_DEVICES_GET_PRIVATE (self);
2609
static void notify_update_devices_finalize (Notify* obj) {
2610
NotifyUpdateDevices * self;
2611
self = NOTIFY_UPDATE_DEVICES (obj);
2612
__g_list_free__scan_device_unref0_0 (self->priv->devices);
2613
NOTIFY_CLASS (notify_update_devices_parent_class)->finalize (obj);
2617
GType notify_update_devices_get_type (void) {
2618
static volatile gsize notify_update_devices_type_id__volatile = 0;
2619
if (g_once_init_enter (¬ify_update_devices_type_id__volatile)) {
2620
static const GTypeInfo g_define_type_info = { sizeof (NotifyUpdateDevicesClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notify_update_devices_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (NotifyUpdateDevices), 0, (GInstanceInitFunc) notify_update_devices_instance_init, NULL };
2621
GType notify_update_devices_type_id;
2622
notify_update_devices_type_id = g_type_register_static (TYPE_NOTIFY, "NotifyUpdateDevices", &g_define_type_info, 0);
2623
g_once_init_leave (¬ify_update_devices_type_id__volatile, notify_update_devices_type_id);
2625
return notify_update_devices_type_id__volatile;
2629
NotifyRequestAuthorization* notify_request_authorization_construct (GType object_type, const gchar* resource) {
2630
NotifyRequestAuthorization* self = NULL;
2632
g_return_val_if_fail (resource != NULL, NULL);
2633
self = (NotifyRequestAuthorization*) notify_construct (object_type);
2634
_tmp0_ = g_strdup (resource);
2635
_g_free0 (self->priv->resource);
2636
self->priv->resource = _tmp0_;
2641
NotifyRequestAuthorization* notify_request_authorization_new (const gchar* resource) {
2642
return notify_request_authorization_construct (TYPE_NOTIFY_REQUEST_AUTHORIZATION, resource);
2646
static void notify_request_authorization_real_run (Notify* base, Scanner* scanner) {
2647
NotifyRequestAuthorization * self;
2648
self = (NotifyRequestAuthorization*) base;
2649
g_return_if_fail (scanner != NULL);
2650
g_signal_emit_by_name (scanner, "request-authorization", self->priv->resource);
2654
static void notify_request_authorization_class_init (NotifyRequestAuthorizationClass * klass) {
2655
notify_request_authorization_parent_class = g_type_class_peek_parent (klass);
2656
NOTIFY_CLASS (klass)->finalize = notify_request_authorization_finalize;
2657
g_type_class_add_private (klass, sizeof (NotifyRequestAuthorizationPrivate));
2658
NOTIFY_CLASS (klass)->run = notify_request_authorization_real_run;
2662
static void notify_request_authorization_instance_init (NotifyRequestAuthorization * self) {
2663
self->priv = NOTIFY_REQUEST_AUTHORIZATION_GET_PRIVATE (self);
2667
static void notify_request_authorization_finalize (Notify* obj) {
2668
NotifyRequestAuthorization * self;
2669
self = NOTIFY_REQUEST_AUTHORIZATION (obj);
2670
_g_free0 (self->priv->resource);
2671
NOTIFY_CLASS (notify_request_authorization_parent_class)->finalize (obj);
2675
GType notify_request_authorization_get_type (void) {
2676
static volatile gsize notify_request_authorization_type_id__volatile = 0;
2677
if (g_once_init_enter (¬ify_request_authorization_type_id__volatile)) {
2678
static const GTypeInfo g_define_type_info = { sizeof (NotifyRequestAuthorizationClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notify_request_authorization_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (NotifyRequestAuthorization), 0, (GInstanceInitFunc) notify_request_authorization_instance_init, NULL };
2679
GType notify_request_authorization_type_id;
2680
notify_request_authorization_type_id = g_type_register_static (TYPE_NOTIFY, "NotifyRequestAuthorization", &g_define_type_info, 0);
2681
g_once_init_leave (¬ify_request_authorization_type_id__volatile, notify_request_authorization_type_id);
2683
return notify_request_authorization_type_id__volatile;
2687
NotifyScanFailed* notify_scan_failed_construct (GType object_type, gint error_code, const gchar* error_string) {
2688
NotifyScanFailed* self = NULL;
2690
g_return_val_if_fail (error_string != NULL, NULL);
2691
self = (NotifyScanFailed*) notify_construct (object_type);
2692
self->priv->error_code = error_code;
2693
_tmp0_ = g_strdup (error_string);
2694
_g_free0 (self->priv->error_string);
2695
self->priv->error_string = _tmp0_;
2700
NotifyScanFailed* notify_scan_failed_new (gint error_code, const gchar* error_string) {
2701
return notify_scan_failed_construct (TYPE_NOTIFY_SCAN_FAILED, error_code, error_string);
2705
static void notify_scan_failed_real_run (Notify* base, Scanner* scanner) {
2706
NotifyScanFailed * self;
2707
self = (NotifyScanFailed*) base;
2708
g_return_if_fail (scanner != NULL);
2709
g_signal_emit_by_name (scanner, "scan-failed", self->priv->error_code, self->priv->error_string);
2713
static void notify_scan_failed_class_init (NotifyScanFailedClass * klass) {
2714
notify_scan_failed_parent_class = g_type_class_peek_parent (klass);
2715
NOTIFY_CLASS (klass)->finalize = notify_scan_failed_finalize;
2716
g_type_class_add_private (klass, sizeof (NotifyScanFailedPrivate));
2717
NOTIFY_CLASS (klass)->run = notify_scan_failed_real_run;
2721
static void notify_scan_failed_instance_init (NotifyScanFailed * self) {
2722
self->priv = NOTIFY_SCAN_FAILED_GET_PRIVATE (self);
2726
static void notify_scan_failed_finalize (Notify* obj) {
2727
NotifyScanFailed * self;
2728
self = NOTIFY_SCAN_FAILED (obj);
2729
_g_free0 (self->priv->error_string);
2730
NOTIFY_CLASS (notify_scan_failed_parent_class)->finalize (obj);
2734
GType notify_scan_failed_get_type (void) {
2735
static volatile gsize notify_scan_failed_type_id__volatile = 0;
2736
if (g_once_init_enter (¬ify_scan_failed_type_id__volatile)) {
2737
static const GTypeInfo g_define_type_info = { sizeof (NotifyScanFailedClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notify_scan_failed_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (NotifyScanFailed), 0, (GInstanceInitFunc) notify_scan_failed_instance_init, NULL };
2738
GType notify_scan_failed_type_id;
2739
notify_scan_failed_type_id = g_type_register_static (TYPE_NOTIFY, "NotifyScanFailed", &g_define_type_info, 0);
2740
g_once_init_leave (¬ify_scan_failed_type_id__volatile, notify_scan_failed_type_id);
2742
return notify_scan_failed_type_id__volatile;
2746
static void notify_document_done_real_run (Notify* base, Scanner* scanner) {
2747
NotifyDocumentDone * self;
2748
self = (NotifyDocumentDone*) base;
2749
g_return_if_fail (scanner != NULL);
2750
g_signal_emit_by_name (scanner, "document-done");
2754
NotifyDocumentDone* notify_document_done_construct (GType object_type) {
2755
NotifyDocumentDone* self = NULL;
2756
self = (NotifyDocumentDone*) notify_construct (object_type);
2761
NotifyDocumentDone* notify_document_done_new (void) {
2762
return notify_document_done_construct (TYPE_NOTIFY_DOCUMENT_DONE);
2766
static void notify_document_done_class_init (NotifyDocumentDoneClass * klass) {
2767
notify_document_done_parent_class = g_type_class_peek_parent (klass);
2768
NOTIFY_CLASS (klass)->run = notify_document_done_real_run;
2772
static void notify_document_done_instance_init (NotifyDocumentDone * self) {
2776
GType notify_document_done_get_type (void) {
2777
static volatile gsize notify_document_done_type_id__volatile = 0;
2778
if (g_once_init_enter (¬ify_document_done_type_id__volatile)) {
2779
static const GTypeInfo g_define_type_info = { sizeof (NotifyDocumentDoneClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notify_document_done_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (NotifyDocumentDone), 0, (GInstanceInitFunc) notify_document_done_instance_init, NULL };
2780
GType notify_document_done_type_id;
2781
notify_document_done_type_id = g_type_register_static (TYPE_NOTIFY, "NotifyDocumentDone", &g_define_type_info, 0);
2782
g_once_init_leave (¬ify_document_done_type_id__volatile, notify_document_done_type_id);
2784
return notify_document_done_type_id__volatile;
2788
static void notify_expect_page_real_run (Notify* base, Scanner* scanner) {
2789
NotifyExpectPage * self;
2790
self = (NotifyExpectPage*) base;
2791
g_return_if_fail (scanner != NULL);
2792
g_signal_emit_by_name (scanner, "expect-page");
2796
NotifyExpectPage* notify_expect_page_construct (GType object_type) {
2797
NotifyExpectPage* self = NULL;
2798
self = (NotifyExpectPage*) notify_construct (object_type);
2803
NotifyExpectPage* notify_expect_page_new (void) {
2804
return notify_expect_page_construct (TYPE_NOTIFY_EXPECT_PAGE);
2808
static void notify_expect_page_class_init (NotifyExpectPageClass * klass) {
2809
notify_expect_page_parent_class = g_type_class_peek_parent (klass);
2810
NOTIFY_CLASS (klass)->run = notify_expect_page_real_run;
2814
static void notify_expect_page_instance_init (NotifyExpectPage * self) {
2818
GType notify_expect_page_get_type (void) {
2819
static volatile gsize notify_expect_page_type_id__volatile = 0;
2820
if (g_once_init_enter (¬ify_expect_page_type_id__volatile)) {
2821
static const GTypeInfo g_define_type_info = { sizeof (NotifyExpectPageClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notify_expect_page_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (NotifyExpectPage), 0, (GInstanceInitFunc) notify_expect_page_instance_init, NULL };
2822
GType notify_expect_page_type_id;
2823
notify_expect_page_type_id = g_type_register_static (TYPE_NOTIFY, "NotifyExpectPage", &g_define_type_info, 0);
2824
g_once_init_leave (¬ify_expect_page_type_id__volatile, notify_expect_page_type_id);
2826
return notify_expect_page_type_id__volatile;
2830
static gpointer _scan_page_info_ref0 (gpointer self) {
2831
return self ? scan_page_info_ref (self) : NULL;
2835
NotifyGotPageInfo* notify_got_page_info_construct (GType object_type, ScanPageInfo* info) {
2836
NotifyGotPageInfo* self = NULL;
2837
ScanPageInfo* _tmp0_;
2838
g_return_val_if_fail (info != NULL, NULL);
2839
self = (NotifyGotPageInfo*) notify_construct (object_type);
2840
_tmp0_ = _scan_page_info_ref0 (info);
2841
_scan_page_info_unref0 (self->priv->info);
2842
self->priv->info = _tmp0_;
2847
NotifyGotPageInfo* notify_got_page_info_new (ScanPageInfo* info) {
2848
return notify_got_page_info_construct (TYPE_NOTIFY_GOT_PAGE_INFO, info);
2852
static void notify_got_page_info_real_run (Notify* base, Scanner* scanner) {
2853
NotifyGotPageInfo * self;
2854
self = (NotifyGotPageInfo*) base;
2855
g_return_if_fail (scanner != NULL);
2856
g_signal_emit_by_name (scanner, "got-page-info", self->priv->info);
2860
static void notify_got_page_info_class_init (NotifyGotPageInfoClass * klass) {
2861
notify_got_page_info_parent_class = g_type_class_peek_parent (klass);
2862
NOTIFY_CLASS (klass)->finalize = notify_got_page_info_finalize;
2863
g_type_class_add_private (klass, sizeof (NotifyGotPageInfoPrivate));
2864
NOTIFY_CLASS (klass)->run = notify_got_page_info_real_run;
2868
static void notify_got_page_info_instance_init (NotifyGotPageInfo * self) {
2869
self->priv = NOTIFY_GOT_PAGE_INFO_GET_PRIVATE (self);
2873
static void notify_got_page_info_finalize (Notify* obj) {
2874
NotifyGotPageInfo * self;
2875
self = NOTIFY_GOT_PAGE_INFO (obj);
2876
_scan_page_info_unref0 (self->priv->info);
2877
NOTIFY_CLASS (notify_got_page_info_parent_class)->finalize (obj);
2881
GType notify_got_page_info_get_type (void) {
2882
static volatile gsize notify_got_page_info_type_id__volatile = 0;
2883
if (g_once_init_enter (¬ify_got_page_info_type_id__volatile)) {
2884
static const GTypeInfo g_define_type_info = { sizeof (NotifyGotPageInfoClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notify_got_page_info_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (NotifyGotPageInfo), 0, (GInstanceInitFunc) notify_got_page_info_instance_init, NULL };
2885
GType notify_got_page_info_type_id;
2886
notify_got_page_info_type_id = g_type_register_static (TYPE_NOTIFY, "NotifyGotPageInfo", &g_define_type_info, 0);
2887
g_once_init_leave (¬ify_got_page_info_type_id__volatile, notify_got_page_info_type_id);
2889
return notify_got_page_info_type_id__volatile;
2893
static void notify_page_done_real_run (Notify* base, Scanner* scanner) {
2894
NotifyPageDone * self;
2895
self = (NotifyPageDone*) base;
2896
g_return_if_fail (scanner != NULL);
2897
g_signal_emit_by_name (scanner, "page-done");
2901
NotifyPageDone* notify_page_done_construct (GType object_type) {
2902
NotifyPageDone* self = NULL;
2903
self = (NotifyPageDone*) notify_construct (object_type);
2908
NotifyPageDone* notify_page_done_new (void) {
2909
return notify_page_done_construct (TYPE_NOTIFY_PAGE_DONE);
2913
static void notify_page_done_class_init (NotifyPageDoneClass * klass) {
2914
notify_page_done_parent_class = g_type_class_peek_parent (klass);
2915
NOTIFY_CLASS (klass)->run = notify_page_done_real_run;
2919
static void notify_page_done_instance_init (NotifyPageDone * self) {
2923
GType notify_page_done_get_type (void) {
2924
static volatile gsize notify_page_done_type_id__volatile = 0;
2925
if (g_once_init_enter (¬ify_page_done_type_id__volatile)) {
2926
static const GTypeInfo g_define_type_info = { sizeof (NotifyPageDoneClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notify_page_done_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (NotifyPageDone), 0, (GInstanceInitFunc) notify_page_done_instance_init, NULL };
2927
GType notify_page_done_type_id;
2928
notify_page_done_type_id = g_type_register_static (TYPE_NOTIFY, "NotifyPageDone", &g_define_type_info, 0);
2929
g_once_init_leave (¬ify_page_done_type_id__volatile, notify_page_done_type_id);
2931
return notify_page_done_type_id__volatile;
2935
static gpointer _scan_line_ref0 (gpointer self) {
2936
return self ? scan_line_ref (self) : NULL;
2940
NotifyGotLine* notify_got_line_construct (GType object_type, ScanLine* line) {
2941
NotifyGotLine* self = NULL;
2943
g_return_val_if_fail (line != NULL, NULL);
2944
self = (NotifyGotLine*) notify_construct (object_type);
2945
_tmp0_ = _scan_line_ref0 (line);
2946
_scan_line_unref0 (self->priv->line);
2947
self->priv->line = _tmp0_;
2952
NotifyGotLine* notify_got_line_new (ScanLine* line) {
2953
return notify_got_line_construct (TYPE_NOTIFY_GOT_LINE, line);
2957
static void notify_got_line_real_run (Notify* base, Scanner* scanner) {
2958
NotifyGotLine * self;
2959
self = (NotifyGotLine*) base;
2960
g_return_if_fail (scanner != NULL);
2961
g_signal_emit_by_name (scanner, "got-line", self->priv->line);
2965
static void notify_got_line_class_init (NotifyGotLineClass * klass) {
2966
notify_got_line_parent_class = g_type_class_peek_parent (klass);
2967
NOTIFY_CLASS (klass)->finalize = notify_got_line_finalize;
2968
g_type_class_add_private (klass, sizeof (NotifyGotLinePrivate));
2969
NOTIFY_CLASS (klass)->run = notify_got_line_real_run;
2973
static void notify_got_line_instance_init (NotifyGotLine * self) {
2974
self->priv = NOTIFY_GOT_LINE_GET_PRIVATE (self);
2978
static void notify_got_line_finalize (Notify* obj) {
2979
NotifyGotLine * self;
2980
self = NOTIFY_GOT_LINE (obj);
2981
_scan_line_unref0 (self->priv->line);
2982
NOTIFY_CLASS (notify_got_line_parent_class)->finalize (obj);
2986
GType notify_got_line_get_type (void) {
2987
static volatile gsize notify_got_line_type_id__volatile = 0;
2988
if (g_once_init_enter (¬ify_got_line_type_id__volatile)) {
2989
static const GTypeInfo g_define_type_info = { sizeof (NotifyGotLineClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notify_got_line_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (NotifyGotLine), 0, (GInstanceInitFunc) notify_got_line_instance_init, NULL };
2990
GType notify_got_line_type_id;
2991
notify_got_line_type_id = g_type_register_static (TYPE_NOTIFY, "NotifyGotLine", &g_define_type_info, 0);
2992
g_once_init_leave (¬ify_got_line_type_id__volatile, notify_got_line_type_id);
2994
return notify_got_line_type_id__volatile;
2998
static void _scan_job_unref0_ (gpointer var) {
2999
(var == NULL) ? NULL : (var = (scan_job_unref (var), NULL));
3003
static void _g_list_free__scan_job_unref0_ (GList* self) {
3004
g_list_foreach (self, (GFunc) _scan_job_unref0_, NULL);
3009
static Scanner* scanner_construct (GType object_type) {
3010
Scanner* self = NULL;
3011
GAsyncQueue* _tmp0_ = NULL;
3012
GAsyncQueue* _tmp1_ = NULL;
3013
GAsyncQueue* _tmp2_ = NULL;
3014
self = (Scanner*) g_type_create_instance (object_type);
3015
_tmp0_ = g_async_queue_new ();
3016
_g_async_queue_unref0 (self->priv->request_queue);
3017
self->priv->request_queue = _tmp0_;
3018
_tmp1_ = g_async_queue_new ();
3019
_g_async_queue_unref0 (self->priv->notify_queue);
3020
self->priv->notify_queue = _tmp1_;
3021
_tmp2_ = g_async_queue_new ();
3022
_g_async_queue_unref0 (self->priv->authorize_queue);
3023
self->priv->authorize_queue = _tmp2_;
3028
static Scanner* scanner_new (void) {
3029
return scanner_construct (TYPE_SCANNER);
3033
static gpointer _scanner_ref0 (gpointer self) {
3034
return self ? scanner_ref (self) : NULL;
3038
Scanner* scanner_get_instance (void) {
3039
Scanner* result = NULL;
3041
if (scanner_scanner_object == NULL) {
3042
Scanner* _tmp0_ = NULL;
3043
_tmp0_ = scanner_new ();
3044
_scanner_unref0 (scanner_scanner_object);
3045
scanner_scanner_object = _tmp0_;
3047
_tmp1_ = _scanner_ref0 (scanner_scanner_object);
3053
static gboolean scanner_notify_idle_cb (Scanner* self) {
3054
gboolean result = FALSE;
3055
gpointer _tmp0_ = NULL;
3056
Notify* notification;
3057
g_return_val_if_fail (self != NULL, FALSE);
3058
_tmp0_ = g_async_queue_pop (self->priv->notify_queue);
3059
notification = (Notify*) _tmp0_;
3060
notify_run (notification, self);
3062
_notify_unref0 (notification);
3067
static gpointer _notify_ref0 (gpointer self) {
3068
return self ? notify_ref (self) : NULL;
3072
static gboolean _scanner_notify_idle_cb_gsource_func (gpointer self) {
3074
result = scanner_notify_idle_cb (self);
3079
static void scanner_notify (Scanner* self, Notify* notification) {
3081
g_return_if_fail (self != NULL);
3082
g_return_if_fail (notification != NULL);
3083
_tmp0_ = _notify_ref0 (notification);
3084
g_async_queue_push (self->priv->notify_queue, _tmp0_);
3085
g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, _scanner_notify_idle_cb_gsource_func, scanner_ref (self), scanner_unref);
3089
static void scanner_set_scanning (Scanner* self, gboolean is_scanning) {
3090
gboolean _tmp0_ = FALSE;
3091
gboolean _tmp1_ = FALSE;
3092
g_return_if_fail (self != NULL);
3093
if (self->priv->scanning) {
3094
_tmp1_ = !is_scanning;
3101
gboolean _tmp2_ = FALSE;
3102
if (!self->priv->scanning) {
3103
_tmp2_ = is_scanning;
3110
NotifyScanningChanged* _tmp3_ = NULL;
3111
NotifyScanningChanged* _tmp4_;
3112
self->priv->scanning = is_scanning;
3113
g_signal_emit_by_name (self, "scanning-changed");
3114
_tmp3_ = notify_scanning_changed_new ();
3116
scanner_notify (self, (Notify*) _tmp4_);
3117
_notify_unref0 (_tmp4_);
3122
static gboolean string_contains (const gchar* self, const gchar* needle) {
3123
gboolean result = FALSE;
3124
gchar* _tmp0_ = NULL;
3125
g_return_val_if_fail (self != NULL, FALSE);
3126
g_return_val_if_fail (needle != NULL, FALSE);
3127
_tmp0_ = strstr ((gchar*) self, (gchar*) needle);
3128
result = _tmp0_ != NULL;
3133
static gint scanner_get_device_weight (const gchar* device) {
3137
g_return_val_if_fail (device != NULL, 0);
3138
_tmp0_ = g_str_has_prefix (device, "vfl:");
3143
_tmp1_ = string_contains (device, "usb");
3153
static gint scanner_compare_devices (ScanDevice* device1, ScanDevice* device2) {
3160
g_return_val_if_fail (device1 != NULL, 0);
3161
g_return_val_if_fail (device2 != NULL, 0);
3162
_tmp0_ = scanner_get_device_weight (device1->name);
3164
_tmp1_ = scanner_get_device_weight (device2->name);
3166
if (weight1 != weight2) {
3167
result = weight1 - weight2;
3170
_tmp2_ = g_strcmp0 (device1->label, device2->label);
3176
static gchar* sane_status_to_string (SANE_Status status) {
3177
gchar* result = NULL;
3179
case SANE_STATUS_GOOD:
3182
_tmp0_ = g_strdup ("SANE_STATUS_GOOD");
3186
case SANE_STATUS_UNSUPPORTED:
3189
_tmp1_ = g_strdup ("SANE_STATUS_UNSUPPORTED");
3193
case SANE_STATUS_CANCELLED:
3196
_tmp2_ = g_strdup ("SANE_STATUS_CANCELLED");
3200
case SANE_STATUS_DEVICE_BUSY:
3203
_tmp3_ = g_strdup ("SANE_STATUS_DEVICE_BUSY");
3207
case SANE_STATUS_INVAL:
3210
_tmp4_ = g_strdup ("SANE_STATUS_INVAL");
3214
case SANE_STATUS_EOF:
3217
_tmp5_ = g_strdup ("SANE_STATUS_EOF");
3221
case SANE_STATUS_JAMMED:
3224
_tmp6_ = g_strdup ("SANE_STATUS_JAMMED");
3228
case SANE_STATUS_NO_DOCS:
3231
_tmp7_ = g_strdup ("SANE_STATUS_NO_DOCS");
3235
case SANE_STATUS_COVER_OPEN:
3238
_tmp8_ = g_strdup ("SANE_STATUS_COVER_OPEN");
3242
case SANE_STATUS_IO_ERROR:
3245
_tmp9_ = g_strdup ("SANE_STATUS_IO_ERROR");
3249
case SANE_STATUS_NO_MEM:
3252
_tmp10_ = g_strdup ("SANE_STATUS_NO_MEM");
3256
case SANE_STATUS_ACCESS_DENIED:
3259
_tmp11_ = g_strdup ("SANE_STATUS_ACCESS_DENIED");
3265
gchar* _tmp12_ = NULL;
3266
_tmp12_ = g_strdup_printf ("SANE_STATUS(%d)", (gint) status);
3274
static gchar* string_replace (const gchar* self, const gchar* old, const gchar* replacement) {
3275
gchar* result = NULL;
3276
GError * _inner_error_ = NULL;
3277
g_return_val_if_fail (self != NULL, NULL);
3278
g_return_val_if_fail (old != NULL, NULL);
3279
g_return_val_if_fail (replacement != NULL, NULL);
3281
gchar* _tmp0_ = NULL;
3283
GRegex* _tmp2_ = NULL;
3286
gchar* _tmp4_ = NULL;
3288
_tmp0_ = g_regex_escape_string (old, -1);
3290
_tmp2_ = g_regex_new (_tmp1_, 0, 0, &_inner_error_);
3294
if (_inner_error_ != NULL) {
3295
if (_inner_error_->domain == G_REGEX_ERROR) {
3296
goto __catch8_g_regex_error;
3298
g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
3299
g_clear_error (&_inner_error_);
3302
_tmp4_ = g_regex_replace_literal (regex, self, (gssize) (-1), 0, replacement, 0, &_inner_error_);
3304
if (_inner_error_ != NULL) {
3305
_g_regex_unref0 (regex);
3306
if (_inner_error_->domain == G_REGEX_ERROR) {
3307
goto __catch8_g_regex_error;
3309
_g_regex_unref0 (regex);
3310
g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
3311
g_clear_error (&_inner_error_);
3315
_g_regex_unref0 (regex);
3319
__catch8_g_regex_error:
3323
_inner_error_ = NULL;
3324
g_assert_not_reached ();
3328
if (_inner_error_ != NULL) {
3329
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
3330
g_clear_error (&_inner_error_);
3336
static gpointer _scan_device_ref0 (gpointer self) {
3337
return self ? scan_device_ref (self) : NULL;
3341
static gint _scanner_compare_devices_gcompare_func (gconstpointer a, gconstpointer b) {
3343
result = scanner_compare_devices (a, b);
3348
static void scanner_do_redetect (Scanner* self) {
3349
SANE_Device** device_list;
3350
gint device_list_length1;
3351
gint _device_list_size_;
3352
SANE_Device** _tmp0_ = NULL;
3355
gchar* _tmp2_ = NULL;
3359
NotifyUpdateDevices* _tmp18_ = NULL;
3360
NotifyUpdateDevices* _tmp19_;
3361
g_return_if_fail (self != NULL);
3363
device_list_length1 = 0;
3364
_device_list_size_ = device_list_length1;
3365
_tmp1_ = sane_get_devices (&_tmp0_, FALSE);
3366
device_list = _tmp0_;
3367
device_list_length1 = -1;
3368
_device_list_size_ = device_list_length1;
3370
_tmp2_ = sane_status_to_string (status);
3372
g_debug ("scanner.vala:318: sane_get_devices () -> %s", _tmp3_);
3374
if (status != SANE_STATUS_GOOD) {
3375
const gchar* _tmp4_ = NULL;
3376
_tmp4_ = sane_strstatus (status);
3377
g_warning ("scanner.vala:321: Unable to get SANE devices: %s", _tmp4_);
3378
self->priv->need_redetect = FALSE;
3379
self->priv->state = SCAN_STATE_IDLE;
3390
ScanDevice* _tmp6_ = NULL;
3391
ScanDevice* scan_device;
3395
gchar* _tmp10_ = NULL;
3396
gchar* _tmp11_ = NULL;
3398
ScanDevice* _tmp13_;
3403
if (!(device_list[i] != NULL)) {
3406
g_debug ("scanner.vala:330: Device: name=\"%s\" vendor=\"%s\" model=\"%s\" type=" \
3407
"\"%s\"", device_list[i]->name, device_list[i]->vendor, device_list[i]->model, device_list[i]->type);
3408
_tmp6_ = scan_device_new ();
3409
scan_device = _tmp6_;
3410
_tmp7_ = g_strdup (device_list[i]->name);
3411
_g_free0 (scan_device->name);
3412
scan_device->name = _tmp7_;
3413
_tmp8_ = g_strdup (device_list[i]->vendor);
3415
if (g_strcmp0 (vendor, "Hewlett-Packard") == 0) {
3417
_tmp9_ = g_strdup ("HP");
3421
_tmp10_ = g_strdup_printf ("%s %s", vendor, device_list[i]->model);
3422
_g_free0 (scan_device->label);
3423
scan_device->label = _tmp10_;
3424
_tmp11_ = string_replace (scan_device->label, "_", " ");
3427
_tmp13_ = _scan_device_ref0 (scan_device);
3428
devices = g_list_append (devices, _tmp13_);
3430
_scan_device_unref0 (scan_device);
3434
devices = g_list_sort (devices, _scanner_compare_devices_gcompare_func);
3435
self->priv->need_redetect = FALSE;
3436
self->priv->state = SCAN_STATE_IDLE;
3437
if (devices != NULL) {
3438
gconstpointer _tmp14_ = NULL;
3439
ScanDevice* _tmp15_;
3442
_tmp14_ = g_list_nth_data (devices, (guint) 0);
3443
_tmp15_ = _scan_device_ref0 ((ScanDevice*) _tmp14_);
3445
_tmp16_ = g_strdup (device->name);
3446
_g_free0 (self->priv->default_device);
3447
self->priv->default_device = _tmp16_;
3448
_scan_device_unref0 (device);
3450
_g_free0 (self->priv->default_device);
3451
self->priv->default_device = NULL;
3455
_tmp18_ = notify_update_devices_new (_tmp17_);
3457
scanner_notify (self, (Notify*) _tmp19_);
3458
_notify_unref0 (_tmp19_);
3459
__g_list_free__scan_device_unref0_0 (devices);
3463
static gboolean scanner_set_default_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index) {
3464
gboolean result = FALSE;
3467
gchar* _tmp1_ = NULL;
3469
g_return_val_if_fail (self != NULL, FALSE);
3470
g_return_val_if_fail (option != NULL, FALSE);
3471
if ((option->cap & SANE_CAP_AUTOMATIC) == 0) {
3475
_tmp0_ = sane_control_option (handle, option_index, SANE_ACTION_SET_AUTO, NULL, NULL);
3477
_tmp1_ = sane_status_to_string (status);
3479
g_debug ("scanner.vala:372: sane_control_option (%d, SANE_ACTION_SET_AUTO) -> %s", (gint) option_index, _tmp2_);
3481
if (status != SANE_STATUS_GOOD) {
3482
const gchar* _tmp3_ = NULL;
3483
_tmp3_ = sane_strstatus (status);
3484
g_warning ("scanner.vala:374: Error setting default option %s: %s", option->name, _tmp3_);
3486
result = status == SANE_STATUS_GOOD;
3491
static void scanner_set_bool_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, gboolean value, gboolean* _result_) {
3492
gboolean _result = FALSE;
3496
const gchar* _tmp1_ = NULL;
3497
const gchar* _tmp2_ = NULL;
3498
gchar* _tmp3_ = NULL;
3500
g_return_if_fail (self != NULL);
3501
g_return_if_fail (option != NULL);
3502
g_return_if_fail (option->type == SANE_TYPE_BOOL);
3503
v = (SANE_Bool) value;
3504
_tmp0_ = sane_control_option (handle, option_index, SANE_ACTION_SET_VALUE, &v, NULL);
3506
_result = (gboolean) v;
3508
_tmp1_ = "SANE_TRUE";
3510
_tmp1_ = "SANE_FALSE";
3513
_tmp2_ = "SANE_TRUE";
3515
_tmp2_ = "SANE_FALSE";
3517
_tmp3_ = sane_status_to_string (status);
3519
g_debug ("scanner.vala:386: sane_control_option (%d, SANE_ACTION_SET_VALUE, %s) " \
3520
"-> (%s, %s)", (gint) option_index, _tmp1_, _tmp4_, _tmp2_);
3523
*_result_ = _result;
3528
static void scanner_set_int_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, gint value, gint* _result_) {
3533
gchar* _tmp3_ = NULL;
3535
g_return_if_fail (self != NULL);
3536
g_return_if_fail (option != NULL);
3537
g_return_if_fail (option->type == SANE_TYPE_INT);
3538
v = (SANE_Int) value;
3539
if (option->constraint_type == SANE_CONSTRAINT_RANGE) {
3540
if (option->constraint.range->quant != 0) {
3541
v = v * option->constraint.range->quant;
3543
if (v < option->constraint.range->min) {
3544
v = (SANE_Int) option->constraint.range->min;
3546
if (v > option->constraint.range->max) {
3547
v = (SANE_Int) option->constraint.range->max;
3550
if (option->constraint_type == SANE_CONSTRAINT_WORD_LIST) {
3553
distance = G_MAXINT;
3569
if (!(i < option->constraint.word_list[0])) {
3572
x = (gint) option->constraint.word_list[i + 1];
3573
_tmp1_ = abs (x - v);
3582
v = (SANE_Int) nearest;
3585
_tmp2_ = sane_control_option (handle, option_index, SANE_ACTION_SET_VALUE, &v, NULL);
3587
_tmp3_ = sane_status_to_string (status);
3589
g_debug ("scanner.vala:422: sane_control_option (%d, SANE_ACTION_SET_VALUE, %d) " \
3590
"-> (%s, %d)", (gint) option_index, value, _tmp4_, (gint) v);
3594
*_result_ = _result;
3599
static void scanner_set_fixed_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, gdouble value, gdouble* _result_) {
3600
gdouble _result = 0.0;
3606
gchar* _tmp8_ = NULL;
3610
g_return_if_fail (self != NULL);
3611
g_return_if_fail (option != NULL);
3613
g_return_if_fail (option->type == SANE_TYPE_FIXED);
3614
if (option->constraint_type == SANE_CONSTRAINT_RANGE) {
3619
_tmp0_ = SANE_UNFIX ((SANE_Fixed) option->constraint.range->min);
3621
_tmp1_ = SANE_UNFIX ((SANE_Fixed) option->constraint.range->max);
3630
if (option->constraint_type == SANE_CONSTRAINT_WORD_LIST) {
3649
if (!(i < option->constraint.word_list[0])) {
3652
_tmp3_ = SANE_UNFIX ((SANE_Fixed) option->constraint.word_list[i + 1]);
3654
_tmp4_ = fabs (x - v);
3655
if (_tmp4_ < distance) {
3657
_tmp5_ = fabs (x - v);
3667
_tmp6_ = SANE_FIX (v);
3669
_tmp7_ = sane_control_option (handle, option_index, SANE_ACTION_SET_VALUE, &v_fixed, NULL);
3671
_tmp8_ = sane_status_to_string (status);
3673
_tmp10_ = SANE_UNFIX (v_fixed);
3674
g_debug ("scanner.vala:462: sane_control_option (%d, SANE_ACTION_SET_VALUE, %f) " \
3675
"-> (%s, %f)", (gint) option_index, value, _tmp9_, _tmp10_);
3677
_tmp11_ = SANE_UNFIX (v_fixed);
3680
*_result_ = _result;
3685
static gchar string_get (const gchar* self, glong index) {
3686
gchar result = '\0';
3687
g_return_val_if_fail (self != NULL, '\0');
3688
result = ((gchar*) self)[index];
3693
static gboolean scanner_set_string_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, const gchar* value, gchar** _result_) {
3694
gchar* _result = NULL;
3695
gboolean result = FALSE;
3696
gchar* _tmp0_ = NULL;
3704
gchar* _tmp7_ = NULL;
3706
g_return_val_if_fail (self != NULL, FALSE);
3707
g_return_val_if_fail (option != NULL, FALSE);
3708
g_return_val_if_fail (value != NULL, FALSE);
3709
g_return_val_if_fail (option->type == SANE_TYPE_STRING, FALSE);
3710
_tmp0_ = g_new0 (gchar, option->size);
3712
s_length1 = option->size;
3713
_s_size_ = s_length1;
3719
gboolean _tmp2_ = FALSE;
3725
if (i < (option->size - 1)) {
3727
_tmp3_ = string_get (value, (glong) i);
3728
_tmp2_ = _tmp3_ != '\0';
3735
_tmp4_ = string_get (value, (glong) i);
3740
_tmp5_ = sane_control_option (handle, option_index, SANE_ACTION_SET_VALUE, s, NULL);
3742
_tmp6_ = g_strdup ((const gchar*) s);
3745
_tmp7_ = sane_status_to_string (status);
3747
g_debug ("scanner.vala:478: sane_control_option (%d, SANE_ACTION_SET_VALUE, \"%s" \
3748
"\") -> (%s, \"%s\")", (gint) option_index, value, _tmp8_, _result);
3750
result = status == SANE_STATUS_GOOD;
3751
s = (g_free (s), NULL);
3753
*_result_ = _result;
3761
static gboolean scanner_set_constrained_string_option (Scanner* self, SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, gchar** values, int values_length1, gchar** _result_) {
3762
gchar* _result = NULL;
3763
gboolean result = FALSE;
3764
g_return_val_if_fail (self != NULL, FALSE);
3765
g_return_val_if_fail (option != NULL, FALSE);
3766
g_return_val_if_fail (option->type == SANE_TYPE_STRING, FALSE);
3767
g_return_val_if_fail (option->constraint_type == SANE_CONSTRAINT_STRING_LIST, FALSE);
3780
if (!(values[i] != NULL)) {
3792
if (!(option->constraint.string_list[j] != NULL)) {
3795
if (g_strcmp0 (values[i], option->constraint.string_list[j]) == 0) {
3800
if (option->constraint.string_list[j] != NULL) {
3801
gchar* _tmp2_ = NULL;
3803
_tmp3_ = scanner_set_string_option (self, handle, option, option_index, values[i], &_tmp2_);
3808
*_result_ = _result;
3819
*_result_ = _result;
3827
static void scanner_log_option (Scanner* self, SANE_Int index, const SANE_Option_Descriptor* option) {
3828
gchar* _tmp0_ = NULL;
3830
gchar* _tmp16_ = NULL;
3834
g_return_if_fail (self != NULL);
3835
g_return_if_fail (option != NULL);
3836
_tmp0_ = g_strdup_printf ("Option %d:", (gint) index);
3838
if (g_strcmp0 (option->name, "") != 0) {
3839
gchar* _tmp1_ = NULL;
3842
_tmp1_ = g_strdup_printf (" name='%s'", option->name);
3844
_tmp3_ = g_strconcat (s, _tmp2_, NULL);
3849
if (g_strcmp0 (option->title, "") != 0) {
3850
gchar* _tmp4_ = NULL;
3853
_tmp4_ = g_strdup_printf (" title='%s'", option->title);
3855
_tmp6_ = g_strconcat (s, _tmp5_, NULL);
3860
switch (option->type) {
3861
case SANE_TYPE_BOOL:
3864
_tmp7_ = g_strconcat (s, " type=bool", NULL);
3872
_tmp8_ = g_strconcat (s, " type=int", NULL);
3877
case SANE_TYPE_FIXED:
3880
_tmp9_ = g_strconcat (s, " type=fixed", NULL);
3885
case SANE_TYPE_STRING:
3888
_tmp10_ = g_strconcat (s, " type=string", NULL);
3893
case SANE_TYPE_BUTTON:
3896
_tmp11_ = g_strconcat (s, " type=button", NULL);
3901
case SANE_TYPE_GROUP:
3904
_tmp12_ = g_strconcat (s, " type=group", NULL);
3911
gchar* _tmp13_ = NULL;
3914
_tmp13_ = g_strdup_printf (" type=%d", (gint) option->type);
3916
_tmp15_ = g_strconcat (s, _tmp14_, NULL);
3923
_tmp16_ = g_strdup_printf (" size=%d", (gint) option->size);
3925
_tmp18_ = g_strconcat (s, _tmp17_, NULL);
3929
switch (option->unit) {
3930
case SANE_UNIT_NONE:
3934
case SANE_UNIT_PIXEL:
3937
_tmp19_ = g_strconcat (s, " unit=pixels", NULL);
3945
_tmp20_ = g_strconcat (s, " unit=bits", NULL);
3953
_tmp21_ = g_strconcat (s, " unit=mm", NULL);
3961
_tmp22_ = g_strconcat (s, " unit=dpi", NULL);
3966
case SANE_UNIT_PERCENT:
3969
_tmp23_ = g_strconcat (s, " unit=percent", NULL);
3974
case SANE_UNIT_MICROSECOND:
3977
_tmp24_ = g_strconcat (s, " unit=microseconds", NULL);
3984
gchar* _tmp25_ = NULL;
3987
_tmp25_ = g_strdup_printf (" unit=%d", (gint) option->unit);
3989
_tmp27_ = g_strconcat (s, _tmp26_, NULL);
3996
switch (option->constraint_type) {
3997
case SANE_CONSTRAINT_RANGE:
3999
if (option->type == SANE_TYPE_FIXED) {
4002
gchar* _tmp30_ = NULL;
4005
_tmp28_ = SANE_UNFIX ((SANE_Fixed) option->constraint.range->min);
4006
_tmp29_ = SANE_UNFIX ((SANE_Fixed) option->constraint.range->max);
4007
_tmp30_ = g_strdup_printf (" min=%f, max=%f, quant=%d", _tmp28_, _tmp29_, (gint) option->constraint.range->quant);
4009
_tmp32_ = g_strconcat (s, _tmp31_, NULL);
4014
gchar* _tmp33_ = NULL;
4017
_tmp33_ = g_strdup_printf (" min=%d, max=%d, quant=%d", (gint) option->constraint.range->min, (gint) option->constraint.range->max, (gint) option->constraint.range->quant);
4019
_tmp35_ = g_strconcat (s, _tmp34_, NULL);
4026
case SANE_CONSTRAINT_WORD_LIST:
4030
_tmp36_ = g_strconcat (s, " values=[", NULL);
4044
if (!(i < option->constraint.word_list[0])) {
4049
_tmp38_ = g_strconcat (s, ", ", NULL);
4053
if (option->type == SANE_TYPE_INT) {
4054
gchar* _tmp39_ = NULL;
4057
_tmp39_ = g_strdup_printf ("%d", (gint) option->constraint.word_list[i + 1]);
4059
_tmp41_ = g_strconcat (s, _tmp40_, NULL);
4065
gchar* _tmp43_ = NULL;
4068
_tmp42_ = SANE_UNFIX ((SANE_Fixed) option->constraint.word_list[i + 1]);
4069
_tmp43_ = g_strdup_printf ("%f", _tmp42_);
4071
_tmp45_ = g_strconcat (s, _tmp44_, NULL);
4079
_tmp46_ = g_strconcat (s, "]", NULL);
4084
case SANE_CONSTRAINT_STRING_LIST:
4088
_tmp47_ = g_strconcat (s, " values=[", NULL);
4098
gchar* _tmp50_ = NULL;
4105
if (!(option->constraint.string_list[i] != NULL)) {
4110
_tmp49_ = g_strconcat (s, ", ", NULL);
4114
_tmp50_ = g_strdup_printf ("\"%s\"", option->constraint.string_list[i]);
4116
_tmp52_ = g_strconcat (s, _tmp51_, NULL);
4123
_tmp53_ = g_strconcat (s, "]", NULL);
4136
_tmp54_ = g_strconcat (s, " cap=", NULL);
4139
if ((cap & SANE_CAP_SOFT_SELECT) != 0) {
4141
if (g_strcmp0 (s, "") != 0) {
4143
_tmp55_ = g_strconcat (s, ",", NULL);
4147
_tmp56_ = g_strconcat (s, "soft-select", NULL);
4150
cap = cap & (~SANE_CAP_SOFT_SELECT);
4152
if ((cap & SANE_CAP_HARD_SELECT) != 0) {
4154
if (g_strcmp0 (s, "") != 0) {
4156
_tmp57_ = g_strconcat (s, ",", NULL);
4160
_tmp58_ = g_strconcat (s, "hard-select", NULL);
4163
cap = cap & (~SANE_CAP_HARD_SELECT);
4165
if ((cap & SANE_CAP_SOFT_DETECT) != 0) {
4167
if (g_strcmp0 (s, "") != 0) {
4169
_tmp59_ = g_strconcat (s, ",", NULL);
4173
_tmp60_ = g_strconcat (s, "soft-detect", NULL);
4176
cap = cap & (~SANE_CAP_SOFT_DETECT);
4178
if ((cap & SANE_CAP_EMULATED) != 0) {
4180
if (g_strcmp0 (s, "") != 0) {
4182
_tmp61_ = g_strconcat (s, ",", NULL);
4186
_tmp62_ = g_strconcat (s, "emulated", NULL);
4189
cap = cap & (~SANE_CAP_EMULATED);
4191
if ((cap & SANE_CAP_AUTOMATIC) != 0) {
4193
if (g_strcmp0 (s, "") != 0) {
4195
_tmp63_ = g_strconcat (s, ",", NULL);
4199
_tmp64_ = g_strconcat (s, "automatic", NULL);
4202
cap = cap & (~SANE_CAP_AUTOMATIC);
4204
if ((cap & SANE_CAP_INACTIVE) != 0) {
4206
if (g_strcmp0 (s, "") != 0) {
4208
_tmp65_ = g_strconcat (s, ",", NULL);
4212
_tmp66_ = g_strconcat (s, "inactive", NULL);
4215
cap = cap & (~SANE_CAP_INACTIVE);
4217
if ((cap & SANE_CAP_ADVANCED) != 0) {
4219
if (g_strcmp0 (s, "") != 0) {
4221
_tmp67_ = g_strconcat (s, ",", NULL);
4225
_tmp68_ = g_strconcat (s, "advanced", NULL);
4228
cap = cap & (~SANE_CAP_ADVANCED);
4231
gchar* _tmp70_ = NULL;
4234
if (g_strcmp0 (s, "") != 0) {
4236
_tmp69_ = g_strconcat (s, ",", NULL);
4240
_tmp70_ = g_strdup_printf ("%x", (guint) cap);
4242
_tmp72_ = g_strconcat (s, _tmp71_, NULL);
4248
g_debug ("scanner.vala:665: %s", s);
4249
if (option->desc != NULL) {
4250
g_debug ("scanner.vala:668: Description: %s", option->desc);
4256
static void scanner_authorization_cb (const gchar* resource, gchar* username, int username_length1, gchar* password, int password_length1) {
4257
NotifyRequestAuthorization* _tmp0_ = NULL;
4258
NotifyRequestAuthorization* _tmp1_;
4259
gpointer _tmp2_ = NULL;
4260
Credentials* credentials;
4261
g_return_if_fail (resource != NULL);
4262
_tmp0_ = notify_request_authorization_new (resource);
4264
scanner_notify (scanner_scanner_object, (Notify*) _tmp1_);
4265
_notify_unref0 (_tmp1_);
4266
_tmp2_ = g_async_queue_pop (scanner_scanner_object->priv->authorize_queue);
4267
credentials = (Credentials*) _tmp2_;
4275
gboolean _tmp4_ = FALSE;
4282
_tmp5_ = string_get (credentials->username, (glong) i);
4283
if (_tmp5_ != '\0') {
4284
_tmp4_ = i < SANE_MAX_USERNAME_LEN;
4291
_tmp6_ = string_get (credentials->username, (glong) i);
4292
username[i] = _tmp6_;
4303
gboolean _tmp8_ = FALSE;
4310
_tmp9_ = string_get (credentials->password, (glong) i);
4311
if (_tmp9_ != '\0') {
4312
_tmp8_ = i < SANE_MAX_USERNAME_LEN;
4319
_tmp10_ = string_get (credentials->password, (glong) i);
4320
password[i] = _tmp10_;
4324
_credentials_unref0 (credentials);
4328
static gpointer _credentials_ref0 (gpointer self) {
4329
return self ? credentials_ref (self) : NULL;
4333
void scanner_authorize (Scanner* self, const gchar* username, const gchar* password) {
4334
Credentials* _tmp0_ = NULL;
4335
Credentials* credentials;
4338
Credentials* _tmp3_;
4339
g_return_if_fail (self != NULL);
4340
g_return_if_fail (username != NULL);
4341
g_return_if_fail (password != NULL);
4342
_tmp0_ = credentials_new ();
4343
credentials = _tmp0_;
4344
_tmp1_ = g_strdup (username);
4345
_g_free0 (credentials->username);
4346
credentials->username = _tmp1_;
4347
_tmp2_ = g_strdup (password);
4348
_g_free0 (credentials->password);
4349
credentials->password = _tmp2_;
4350
_tmp3_ = _credentials_ref0 (credentials);
4351
g_async_queue_push (self->priv->authorize_queue, _tmp3_);
4352
_credentials_unref0 (credentials);
4356
static void scanner_close_device (Scanner* self) {
4357
g_return_if_fail (self != NULL);
4358
if (self->priv->have_handle) {
4359
sane_cancel (self->priv->handle);
4360
g_debug ("scanner.vala:695: sane_cancel ()");
4361
sane_close (self->priv->handle);
4362
g_debug ("scanner.vala:698: sane_close ()");
4363
self->priv->have_handle = FALSE;
4365
self->priv->buffer = (g_free (self->priv->buffer), NULL);
4366
self->priv->buffer = NULL;
4367
self->priv->buffer_length1 = 0;
4368
self->priv->_buffer_size_ = self->priv->buffer_length1;
4369
__g_list_free__scan_job_unref0_0 (self->priv->job_queue);
4370
self->priv->job_queue = NULL;
4371
scanner_set_scanning (self, FALSE);
4375
static void scanner_fail_scan (Scanner* self, gint error_code, const gchar* error_string) {
4376
NotifyScanFailed* _tmp0_ = NULL;
4377
NotifyScanFailed* _tmp1_;
4378
g_return_if_fail (self != NULL);
4379
g_return_if_fail (error_string != NULL);
4380
scanner_close_device (self);
4381
self->priv->state = SCAN_STATE_IDLE;
4382
_tmp0_ = notify_scan_failed_new (error_code, error_string);
4384
scanner_notify (self, (Notify*) _tmp1_);
4385
_notify_unref0 (_tmp1_);
4389
static gpointer _request_ref0 (gpointer self) {
4390
return self ? request_ref (self) : NULL;
4394
static gpointer _scan_job_ref0 (gpointer self) {
4395
return self ? scan_job_ref (self) : NULL;
4399
static gboolean scanner_handle_requests (Scanner* self) {
4400
gboolean result = FALSE;
4401
gboolean _tmp0_ = FALSE;
4403
g_return_val_if_fail (self != NULL, FALSE);
4404
if (self->priv->state == SCAN_STATE_IDLE) {
4405
_tmp0_ = self->priv->need_redetect;
4410
self->priv->state = SCAN_STATE_REDETECT;
4414
Request* request = NULL;
4415
gboolean _tmp1_ = FALSE;
4416
gboolean _tmp2_ = FALSE;
4417
if (self->priv->state == SCAN_STATE_IDLE) {
4418
_tmp2_ = request_count == 0;
4426
_tmp3_ = g_async_queue_length (self->priv->request_queue);
4427
_tmp1_ = _tmp3_ > 0;
4430
gpointer _tmp4_ = NULL;
4431
_tmp4_ = g_async_queue_pop (self->priv->request_queue);
4432
_request_unref0 (request);
4433
request = (Request*) _tmp4_;
4436
_request_unref0 (request);
4439
g_debug ("scanner.vala:732: Processing request");
4441
if (IS_REQUEST_START_SCAN (request)) {
4442
RequestStartScan* _tmp5_;
4443
RequestStartScan* r;
4445
_tmp5_ = _request_ref0 (REQUEST_START_SCAN (request));
4447
_tmp6_ = _scan_job_ref0 (r->job);
4448
self->priv->job_queue = g_list_append (self->priv->job_queue, _tmp6_);
4449
_request_unref0 (r);
4451
if (IS_REQUEST_CANCEL (request)) {
4452
scanner_fail_scan (self, (gint) SANE_STATUS_CANCELLED, "Scan cancelled - do not report this error");
4454
if (IS_REQUEST_QUIT (request)) {
4455
scanner_close_device (self);
4457
_request_unref0 (request);
4462
_request_unref0 (request);
4467
static void scanner_do_open (Scanner* self) {
4470
gboolean _tmp1_ = FALSE;
4474
gchar* _tmp6_ = NULL;
4477
g_return_if_fail (self != NULL);
4478
_tmp0_ = _scan_job_ref0 (SCAN_JOB ((ScanJob*) self->priv->job_queue->data));
4480
self->priv->line_count = 0;
4481
self->priv->pass_number = 0;
4482
self->priv->page_number = 0;
4483
self->priv->notified_page = -1;
4484
self->priv->option_index = (SANE_Int) 0;
4485
self->priv->br_x_option_index = (SANE_Int) 0;
4486
self->priv->br_y_option_index = (SANE_Int) 0;
4487
if (job->device == NULL) {
4488
_tmp1_ = self->priv->default_device != NULL;
4494
_tmp2_ = g_strdup (self->priv->default_device);
4495
_g_free0 (job->device);
4496
job->device = _tmp2_;
4498
if (job->device == NULL) {
4499
const gchar* _tmp3_ = NULL;
4500
g_warning ("scanner.vala:769: No scan device available");
4501
_tmp3_ = _ ("No scanners available. Please connect a scanner.");
4502
scanner_fail_scan (self, 0, _tmp3_);
4503
_scan_job_unref0 (job);
4506
if (self->priv->have_handle) {
4507
if (g_strcmp0 (self->priv->current_device, job->device) == 0) {
4508
self->priv->state = SCAN_STATE_GET_OPTION;
4509
_scan_job_unref0 (job);
4512
sane_close (self->priv->handle);
4513
g_debug ("scanner.vala:786: sane_close ()");
4514
self->priv->have_handle = FALSE;
4516
_g_free0 (self->priv->current_device);
4517
self->priv->current_device = NULL;
4518
self->priv->have_handle = FALSE;
4519
_tmp5_ = sane_open (job->device, &_tmp4_);
4520
self->priv->handle = _tmp4_;
4522
_tmp6_ = sane_status_to_string (status);
4524
g_debug ("scanner.vala:794: sane_open (\"%s\") -> %s", job->device, _tmp7_);
4526
if (status != SANE_STATUS_GOOD) {
4527
const gchar* _tmp8_ = NULL;
4528
const gchar* _tmp9_ = NULL;
4529
_tmp8_ = sane_strstatus (status);
4530
g_warning ("scanner.vala:798: Unable to get open device: %s", _tmp8_);
4531
_tmp9_ = _ ("Unable to connect to scanner");
4532
scanner_fail_scan (self, (gint) status, _tmp9_);
4533
_scan_job_unref0 (job);
4536
self->priv->have_handle = TRUE;
4537
_tmp10_ = g_strdup (job->device);
4538
_g_free0 (self->priv->current_device);
4539
self->priv->current_device = _tmp10_;
4540
self->priv->state = SCAN_STATE_GET_OPTION;
4541
_scan_job_unref0 (job);
4545
static void scanner_do_get_option (Scanner* self) {
4548
const SANE_Option_Descriptor* _tmp1_ = NULL;
4549
const SANE_Option_Descriptor* option;
4551
g_return_if_fail (self != NULL);
4552
_tmp0_ = _scan_job_ref0 (SCAN_JOB ((ScanJob*) self->priv->job_queue->data));
4554
_tmp1_ = sane_get_option_descriptor (self->priv->handle, self->priv->option_index);
4556
g_debug ("scanner.vala:815: sane_get_option_descriptor (%d)", (gint) self->priv->option_index);
4557
index = self->priv->option_index;
4558
self->priv->option_index++;
4559
if (option == NULL) {
4560
if (self->priv->br_x_option_index != 0) {
4561
const SANE_Option_Descriptor* _tmp2_ = NULL;
4562
_tmp2_ = sane_get_option_descriptor (self->priv->handle, self->priv->br_x_option_index);
4564
g_debug ("scanner.vala:825: sane_get_option_descriptor (%d)", (gint) self->priv->br_x_option_index);
4565
if (option->constraint_type == SANE_CONSTRAINT_RANGE) {
4566
if (option->type == SANE_TYPE_FIXED) {
4568
_tmp3_ = SANE_UNFIX ((SANE_Fixed) option->constraint.range->max);
4569
scanner_set_fixed_option (self, self->priv->handle, option, self->priv->br_x_option_index, _tmp3_, NULL);
4571
scanner_set_int_option (self, self->priv->handle, option, self->priv->br_x_option_index, (gint) option->constraint.range->max, NULL);
4575
if (self->priv->br_y_option_index != 0) {
4576
const SANE_Option_Descriptor* _tmp4_ = NULL;
4577
_tmp4_ = sane_get_option_descriptor (self->priv->handle, self->priv->br_y_option_index);
4579
g_debug ("scanner.vala:837: sane_get_option_descriptor (%d)", (gint) self->priv->br_y_option_index);
4580
if (option->constraint_type == SANE_CONSTRAINT_RANGE) {
4581
if (option->type == SANE_TYPE_FIXED) {
4583
_tmp5_ = SANE_UNFIX ((SANE_Fixed) option->constraint.range->max);
4584
scanner_set_fixed_option (self, self->priv->handle, option, self->priv->br_y_option_index, _tmp5_, NULL);
4586
scanner_set_int_option (self, self->priv->handle, option, self->priv->br_y_option_index, (gint) option->constraint.range->max, NULL);
4590
self->priv->state = SCAN_STATE_START;
4591
_scan_job_unref0 (job);
4594
scanner_log_option (self, index, option);
4595
if (option->type == SANE_TYPE_GROUP) {
4596
_scan_job_unref0 (job);
4599
if ((option->cap & SANE_CAP_INACTIVE) != 0) {
4600
_scan_job_unref0 (job);
4603
if (option->name == NULL) {
4604
_scan_job_unref0 (job);
4607
if (g_strcmp0 (option->name, SANE_NAME_SCAN_RESOLUTION) == 0) {
4608
if (option->type == SANE_TYPE_FIXED) {
4610
scanner_set_fixed_option (self, self->priv->handle, option, index, job->dpi, &_tmp6_);
4615
scanner_set_int_option (self, self->priv->handle, option, index, (gint) job->dpi, &_tmp7_);
4617
job->dpi = (gdouble) dpi;
4620
if (g_strcmp0 (option->name, SANE_NAME_SCAN_SOURCE) == 0) {
4622
const gchar* _tmp9_ = NULL;
4625
const gchar* _tmp12_ = NULL;
4629
const gchar* _tmp16_ = NULL;
4631
gchar** _tmp18_ = NULL;
4632
gchar** flatbed_sources;
4633
gint flatbed_sources_length1;
4634
gint _flatbed_sources_size_;
4636
const gchar* _tmp20_ = NULL;
4641
gchar** _tmp25_ = NULL;
4642
gchar** adf_sources;
4643
gint adf_sources_length1;
4644
gint _adf_sources_size_;
4646
const gchar* _tmp27_ = NULL;
4648
gchar** _tmp29_ = NULL;
4649
gchar** adf_front_sources;
4650
gint adf_front_sources_length1;
4651
gint _adf_front_sources_size_;
4653
const gchar* _tmp31_ = NULL;
4655
gchar** _tmp33_ = NULL;
4656
gchar** adf_back_sources;
4657
gint adf_back_sources_length1;
4658
gint _adf_back_sources_size_;
4660
const gchar* _tmp35_ = NULL;
4662
gchar** _tmp37_ = NULL;
4663
gchar** adf_duplex_sources;
4664
gint adf_duplex_sources_length1;
4665
gint _adf_duplex_sources_size_;
4666
_tmp8_ = g_strdup ("Auto");
4667
_tmp9_ = SANE_I18N ("Auto");
4668
_tmp10_ = g_strdup (_tmp9_);
4669
_tmp11_ = g_strdup ("Flatbed");
4670
_tmp12_ = SANE_I18N ("Flatbed");
4671
_tmp13_ = g_strdup (_tmp12_);
4672
_tmp14_ = g_strdup ("FlatBed");
4673
_tmp15_ = g_strdup ("Normal");
4674
_tmp16_ = SANE_I18N ("Normal");
4675
_tmp17_ = g_strdup (_tmp16_);
4676
_tmp18_ = g_new0 (gchar*, 7 + 1);
4677
_tmp18_[0] = _tmp8_;
4678
_tmp18_[1] = _tmp10_;
4679
_tmp18_[2] = _tmp11_;
4680
_tmp18_[3] = _tmp13_;
4681
_tmp18_[4] = _tmp14_;
4682
_tmp18_[5] = _tmp15_;
4683
_tmp18_[6] = _tmp17_;
4684
flatbed_sources = _tmp18_;
4685
flatbed_sources_length1 = 7;
4686
_flatbed_sources_size_ = flatbed_sources_length1;
4687
_tmp19_ = g_strdup ("Automatic Document Feeder");
4688
_tmp20_ = SANE_I18N ("Automatic Document Feeder");
4689
_tmp21_ = g_strdup (_tmp20_);
4690
_tmp22_ = g_strdup ("ADF");
4691
_tmp23_ = g_strdup ("Automatic Document Feeder(left aligned)");
4692
_tmp24_ = g_strdup ("Automatic Document Feeder(centrally aligned)");
4693
_tmp25_ = g_new0 (gchar*, 5 + 1);
4694
_tmp25_[0] = _tmp19_;
4695
_tmp25_[1] = _tmp21_;
4696
_tmp25_[2] = _tmp22_;
4697
_tmp25_[3] = _tmp23_;
4698
_tmp25_[4] = _tmp24_;
4699
adf_sources = _tmp25_;
4700
adf_sources_length1 = 5;
4701
_adf_sources_size_ = adf_sources_length1;
4702
_tmp26_ = g_strdup ("ADF Front");
4703
_tmp27_ = SANE_I18N ("ADF Front");
4704
_tmp28_ = g_strdup (_tmp27_);
4705
_tmp29_ = g_new0 (gchar*, 2 + 1);
4706
_tmp29_[0] = _tmp26_;
4707
_tmp29_[1] = _tmp28_;
4708
adf_front_sources = _tmp29_;
4709
adf_front_sources_length1 = 2;
4710
_adf_front_sources_size_ = adf_front_sources_length1;
4711
_tmp30_ = g_strdup ("ADF Back");
4712
_tmp31_ = SANE_I18N ("ADF Back");
4713
_tmp32_ = g_strdup (_tmp31_);
4714
_tmp33_ = g_new0 (gchar*, 2 + 1);
4715
_tmp33_[0] = _tmp30_;
4716
_tmp33_[1] = _tmp32_;
4717
adf_back_sources = _tmp33_;
4718
adf_back_sources_length1 = 2;
4719
_adf_back_sources_size_ = adf_back_sources_length1;
4720
_tmp34_ = g_strdup ("ADF Duplex");
4721
_tmp35_ = SANE_I18N ("ADF Duplex");
4722
_tmp36_ = g_strdup (_tmp35_);
4723
_tmp37_ = g_new0 (gchar*, 2 + 1);
4724
_tmp37_[0] = _tmp34_;
4725
_tmp37_[1] = _tmp36_;
4726
adf_duplex_sources = _tmp37_;
4727
adf_duplex_sources_length1 = 2;
4728
_adf_duplex_sources_size_ = adf_duplex_sources_length1;
4729
switch (job->type) {
4730
case SCAN_TYPE_SINGLE:
4733
_tmp38_ = scanner_set_default_option (self, self->priv->handle, option, index);
4736
_tmp39_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, flatbed_sources, flatbed_sources_length1, NULL);
4738
g_warning ("scanner.vala:921: Unable to set single page source, please file a bug");
4743
case SCAN_TYPE_ADF_FRONT:
4746
_tmp40_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, adf_front_sources, adf_front_sources_length1, NULL);
4749
_tmp41_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, adf_sources, adf_sources_length1, NULL);
4751
g_warning ("scanner.vala:926: Unable to set front ADF source, please file a bug");
4756
case SCAN_TYPE_ADF_BACK:
4759
_tmp42_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, adf_back_sources, adf_back_sources_length1, NULL);
4762
_tmp43_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, adf_sources, adf_sources_length1, NULL);
4764
g_warning ("scanner.vala:931: Unable to set back ADF source, please file a bug");
4769
case SCAN_TYPE_ADF_BOTH:
4772
_tmp44_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, adf_duplex_sources, adf_duplex_sources_length1, NULL);
4775
_tmp45_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, adf_sources, adf_sources_length1, NULL);
4777
g_warning ("scanner.vala:936: Unable to set duplex ADF source, please file a bug");
4785
adf_duplex_sources = (_vala_array_free (adf_duplex_sources, adf_duplex_sources_length1, (GDestroyNotify) g_free), NULL);
4786
adf_back_sources = (_vala_array_free (adf_back_sources, adf_back_sources_length1, (GDestroyNotify) g_free), NULL);
4787
adf_front_sources = (_vala_array_free (adf_front_sources, adf_front_sources_length1, (GDestroyNotify) g_free), NULL);
4788
adf_sources = (_vala_array_free (adf_sources, adf_sources_length1, (GDestroyNotify) g_free), NULL);
4789
flatbed_sources = (_vala_array_free (flatbed_sources, flatbed_sources_length1, (GDestroyNotify) g_free), NULL);
4791
if (g_strcmp0 (option->name, "duplex") == 0) {
4792
if (option->type == SANE_TYPE_BOOL) {
4793
scanner_set_bool_option (self, self->priv->handle, option, index, job->type == SCAN_TYPE_ADF_BOTH, NULL);
4796
if (g_strcmp0 (option->name, "batch-scan") == 0) {
4797
if (option->type == SANE_TYPE_BOOL) {
4798
scanner_set_bool_option (self, self->priv->handle, option, index, job->type != SCAN_TYPE_SINGLE, NULL);
4801
if (g_strcmp0 (option->name, SANE_NAME_BIT_DEPTH) == 0) {
4802
if (job->depth > 0) {
4803
scanner_set_int_option (self, self->priv->handle, option, index, job->depth, NULL);
4806
if (g_strcmp0 (option->name, SANE_NAME_SCAN_MODE) == 0) {
4810
gchar** _tmp49_ = NULL;
4811
gchar** color_scan_modes;
4812
gint color_scan_modes_length1;
4813
gint _color_scan_modes_size_;
4817
const gchar* _tmp53_ = NULL;
4820
gchar** _tmp56_ = NULL;
4821
gchar** gray_scan_modes;
4822
gint gray_scan_modes_length1;
4823
gint _gray_scan_modes_size_;
4827
const gchar* _tmp60_ = NULL;
4830
const gchar* _tmp63_ = NULL;
4833
const gchar* _tmp66_ = NULL;
4839
const gchar* _tmp72_ = NULL;
4842
gchar** _tmp75_ = NULL;
4843
gchar** lineart_scan_modes;
4844
gint lineart_scan_modes_length1;
4845
gint _lineart_scan_modes_size_;
4846
_tmp46_ = g_strdup (SANE_VALUE_SCAN_MODE_COLOR);
4847
_tmp47_ = g_strdup ("Color");
4848
_tmp48_ = g_strdup ("24bit Color");
4849
_tmp49_ = g_new0 (gchar*, 3 + 1);
4850
_tmp49_[0] = _tmp46_;
4851
_tmp49_[1] = _tmp47_;
4852
_tmp49_[2] = _tmp48_;
4853
color_scan_modes = _tmp49_;
4854
color_scan_modes_length1 = 3;
4855
_color_scan_modes_size_ = color_scan_modes_length1;
4856
_tmp50_ = g_strdup (SANE_VALUE_SCAN_MODE_GRAY);
4857
_tmp51_ = g_strdup ("Gray");
4858
_tmp52_ = g_strdup ("Grayscale");
4859
_tmp53_ = SANE_I18N ("Grayscale");
4860
_tmp54_ = g_strdup (_tmp53_);
4861
_tmp55_ = g_strdup ("True Gray");
4862
_tmp56_ = g_new0 (gchar*, 5 + 1);
4863
_tmp56_[0] = _tmp50_;
4864
_tmp56_[1] = _tmp51_;
4865
_tmp56_[2] = _tmp52_;
4866
_tmp56_[3] = _tmp54_;
4867
_tmp56_[4] = _tmp55_;
4868
gray_scan_modes = _tmp56_;
4869
gray_scan_modes_length1 = 5;
4870
_gray_scan_modes_size_ = gray_scan_modes_length1;
4871
_tmp57_ = g_strdup (SANE_VALUE_SCAN_MODE_LINEART);
4872
_tmp58_ = g_strdup ("Lineart");
4873
_tmp59_ = g_strdup ("LineArt");
4874
_tmp60_ = SANE_I18N ("LineArt");
4875
_tmp61_ = g_strdup (_tmp60_);
4876
_tmp62_ = g_strdup ("Black & White");
4877
_tmp63_ = SANE_I18N ("Black & White");
4878
_tmp64_ = g_strdup (_tmp63_);
4879
_tmp65_ = g_strdup ("Binary");
4880
_tmp66_ = SANE_I18N ("Binary");
4881
_tmp67_ = g_strdup (_tmp66_);
4882
_tmp68_ = g_strdup ("Thresholded");
4883
_tmp69_ = g_strdup (SANE_VALUE_SCAN_MODE_GRAY);
4884
_tmp70_ = g_strdup ("Gray");
4885
_tmp71_ = g_strdup ("Grayscale");
4886
_tmp72_ = SANE_I18N ("Grayscale");
4887
_tmp73_ = g_strdup (_tmp72_);
4888
_tmp74_ = g_strdup ("True Gray");
4889
_tmp75_ = g_new0 (gchar*, 14 + 1);
4890
_tmp75_[0] = _tmp57_;
4891
_tmp75_[1] = _tmp58_;
4892
_tmp75_[2] = _tmp59_;
4893
_tmp75_[3] = _tmp61_;
4894
_tmp75_[4] = _tmp62_;
4895
_tmp75_[5] = _tmp64_;
4896
_tmp75_[6] = _tmp65_;
4897
_tmp75_[7] = _tmp67_;
4898
_tmp75_[8] = _tmp68_;
4899
_tmp75_[9] = _tmp69_;
4900
_tmp75_[10] = _tmp70_;
4901
_tmp75_[11] = _tmp71_;
4902
_tmp75_[12] = _tmp73_;
4903
_tmp75_[13] = _tmp74_;
4904
lineart_scan_modes = _tmp75_;
4905
lineart_scan_modes_length1 = 14;
4906
_lineart_scan_modes_size_ = lineart_scan_modes_length1;
4907
switch (job->scan_mode) {
4908
case SCAN_MODE_COLOR:
4911
_tmp76_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, color_scan_modes, color_scan_modes_length1, NULL);
4913
g_warning ("scanner.vala:994: Unable to set Color mode, please file a bug");
4917
case SCAN_MODE_GRAY:
4920
_tmp77_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, gray_scan_modes, gray_scan_modes_length1, NULL);
4922
g_warning ("scanner.vala:998: Unable to set Gray mode, please file a bug");
4926
case SCAN_MODE_LINEART:
4929
_tmp78_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, lineart_scan_modes, lineart_scan_modes_length1, NULL);
4931
g_warning ("scanner.vala:1002: Unable to set Lineart mode, please file a bug");
4940
lineart_scan_modes = (_vala_array_free (lineart_scan_modes, lineart_scan_modes_length1, (GDestroyNotify) g_free), NULL);
4941
gray_scan_modes = (_vala_array_free (gray_scan_modes, gray_scan_modes_length1, (GDestroyNotify) g_free), NULL);
4942
color_scan_modes = (_vala_array_free (color_scan_modes, color_scan_modes_length1, (GDestroyNotify) g_free), NULL);
4944
if (g_strcmp0 (option->name, "compression") == 0) {
4945
const gchar* _tmp79_ = NULL;
4947
const gchar* _tmp81_ = NULL;
4951
gchar** _tmp85_ = NULL;
4952
gchar** disable_compression_names;
4953
gint disable_compression_names_length1;
4954
gint _disable_compression_names_size_;
4956
_tmp79_ = SANE_I18N ("None");
4957
_tmp80_ = g_strdup (_tmp79_);
4958
_tmp81_ = SANE_I18N ("none");
4959
_tmp82_ = g_strdup (_tmp81_);
4960
_tmp83_ = g_strdup ("None");
4961
_tmp84_ = g_strdup ("none");
4962
_tmp85_ = g_new0 (gchar*, 4 + 1);
4963
_tmp85_[0] = _tmp80_;
4964
_tmp85_[1] = _tmp82_;
4965
_tmp85_[2] = _tmp83_;
4966
_tmp85_[3] = _tmp84_;
4967
disable_compression_names = _tmp85_;
4968
disable_compression_names_length1 = 4;
4969
_disable_compression_names_size_ = disable_compression_names_length1;
4970
_tmp86_ = scanner_set_constrained_string_option (self, self->priv->handle, option, index, disable_compression_names, disable_compression_names_length1, NULL);
4972
g_warning ("scanner.vala:1020: Unable to disable compression, please file a bug");
4974
disable_compression_names = (_vala_array_free (disable_compression_names, disable_compression_names_length1, (GDestroyNotify) g_free), NULL);
4976
if (g_strcmp0 (option->name, SANE_NAME_SCAN_BR_X) == 0) {
4977
self->priv->br_x_option_index = index;
4979
if (g_strcmp0 (option->name, SANE_NAME_SCAN_BR_Y) == 0) {
4980
self->priv->br_y_option_index = index;
4982
if (g_strcmp0 (option->name, SANE_NAME_PAGE_WIDTH) == 0) {
4983
if (job->page_width > 0.0) {
4984
if (option->type == SANE_TYPE_FIXED) {
4985
scanner_set_fixed_option (self, self->priv->handle, option, index, job->page_width / 10.0, NULL);
4987
scanner_set_int_option (self, self->priv->handle, option, index, job->page_width / 10, NULL);
4991
if (g_strcmp0 (option->name, SANE_NAME_PAGE_HEIGHT) == 0) {
4992
if (job->page_height > 0.0) {
4993
if (option->type == SANE_TYPE_FIXED) {
4994
scanner_set_fixed_option (self, self->priv->handle, option, index, job->page_height / 10.0, NULL);
4996
scanner_set_int_option (self, self->priv->handle, option, index, job->page_height / 10, NULL);
5010
if (g_strcmp0 (self->priv->current_device, "test") == 0) {
5011
if (g_strcmp0 (option->name, "hand-scanner") == 0) {
5012
scanner_set_bool_option (self, self->priv->handle, option, index, FALSE, NULL);
5014
if (g_strcmp0 (option->name, "three-pass") == 0) {
5015
scanner_set_bool_option (self, self->priv->handle, option, index, FALSE, NULL);
5017
if (g_strcmp0 (option->name, "test-picture") == 0) {
5018
scanner_set_string_option (self, self->priv->handle, option, index, "Color pattern", NULL);
5020
if (g_strcmp0 (option->name, "read-delay") == 0) {
5021
scanner_set_bool_option (self, self->priv->handle, option, index, TRUE, NULL);
5023
if (g_strcmp0 (option->name, "read-delay-duration") == 0) {
5024
scanner_set_int_option (self, self->priv->handle, option, index, 200000, NULL);
5031
_scan_job_unref0 (job);
5035
static void scanner_do_complete_document (Scanner* self) {
5036
NotifyDocumentDone* _tmp0_ = NULL;
5037
NotifyDocumentDone* _tmp1_;
5038
g_return_if_fail (self != NULL);
5039
self->priv->job_queue = g_list_remove_link (self->priv->job_queue, self->priv->job_queue);
5040
self->priv->state = SCAN_STATE_IDLE;
5041
if (self->priv->job_queue != NULL) {
5042
self->priv->state = SCAN_STATE_OPEN;
5045
_tmp0_ = notify_document_done_new ();
5047
scanner_notify (self, (Notify*) _tmp1_);
5048
_notify_unref0 (_tmp1_);
5049
scanner_set_scanning (self, FALSE);
5053
static void scanner_do_start (Scanner* self) {
5054
SANE_Status status = 0;
5055
NotifyExpectPage* _tmp0_ = NULL;
5056
NotifyExpectPage* _tmp1_;
5058
gchar* _tmp3_ = NULL;
5060
g_return_if_fail (self != NULL);
5061
_tmp0_ = notify_expect_page_new ();
5063
scanner_notify (self, (Notify*) _tmp1_);
5064
_notify_unref0 (_tmp1_);
5065
_tmp2_ = sane_start (self->priv->handle);
5067
_tmp3_ = sane_status_to_string (status);
5069
g_debug ("scanner.vala:1090: sane_start (page=%d, pass=%d) -> %s", self->priv->page_number, self->priv->pass_number, _tmp4_);
5071
if (status == SANE_STATUS_GOOD) {
5072
self->priv->state = SCAN_STATE_GET_PARAMETERS;
5074
if (status == SANE_STATUS_NO_DOCS) {
5075
scanner_do_complete_document (self);
5077
const gchar* _tmp5_ = NULL;
5078
const gchar* _tmp6_ = NULL;
5079
_tmp5_ = sane_strstatus (status);
5080
g_warning ("scanner.vala:1097: Unable to start device: %s", _tmp5_);
5081
_tmp6_ = _ ("Unable to start scan");
5082
scanner_fail_scan (self, (gint) status, _tmp6_);
5088
static gchar* sane_frame_to_string (SANE_Frame frame) {
5089
gchar* result = NULL;
5091
case SANE_FRAME_GRAY:
5094
_tmp0_ = g_strdup ("SANE_FRAME_GRAY");
5098
case SANE_FRAME_RGB:
5101
_tmp1_ = g_strdup ("SANE_FRAME_RGB");
5105
case SANE_FRAME_RED:
5108
_tmp2_ = g_strdup ("SANE_FRAME_RED");
5112
case SANE_FRAME_GREEN:
5115
_tmp3_ = g_strdup ("SANE_FRAME_GREEN");
5119
case SANE_FRAME_BLUE:
5122
_tmp4_ = g_strdup ("SANE_FRAME_BLUE");
5128
gchar* _tmp5_ = NULL;
5129
_tmp5_ = g_strdup_printf ("SANE_FRAME(%d)", (gint) frame);
5137
static void scanner_do_get_parameters (Scanner* self) {
5138
SANE_Parameters _tmp0_ = {0};
5141
gchar* _tmp2_ = NULL;
5145
const gchar* _tmp7_ = NULL;
5146
gchar* _tmp8_ = NULL;
5148
ScanPageInfo* _tmp10_ = NULL;
5150
gboolean _tmp11_ = FALSE;
5151
gboolean _tmp12_ = FALSE;
5152
gboolean _tmp13_ = FALSE;
5156
guchar* _tmp18_ = NULL;
5157
g_return_if_fail (self != NULL);
5158
_tmp1_ = sane_get_parameters (self->priv->handle, &_tmp0_);
5159
self->priv->parameters = _tmp0_;
5161
_tmp2_ = sane_status_to_string (status);
5163
g_debug ("scanner.vala:1107: sane_get_parameters () -> %s", _tmp3_);
5165
if (status != SANE_STATUS_GOOD) {
5166
const gchar* _tmp4_ = NULL;
5167
const gchar* _tmp5_ = NULL;
5168
_tmp4_ = sane_strstatus (status);
5169
g_warning ("scanner.vala:1110: Unable to get device parameters: %s", _tmp4_);
5170
_tmp5_ = _ ("Error communicating with scanner");
5171
scanner_fail_scan (self, (gint) status, _tmp5_);
5174
_tmp6_ = _scan_job_ref0 (SCAN_JOB ((ScanJob*) self->priv->job_queue->data));
5176
if (self->priv->parameters.last_frame) {
5177
_tmp7_ = "SANE_TRUE";
5179
_tmp7_ = "SANE_FALSE";
5181
_tmp8_ = sane_frame_to_string (self->priv->parameters.format);
5183
g_debug ("scanner.vala:1119: Parameters: format=%s last_frame=%s bytes_per_line=" \
5184
"%d pixels_per_line=%d lines=%d depth=%d", _tmp9_, _tmp7_, self->priv->parameters.bytes_per_line, self->priv->parameters.pixels_per_line, self->priv->parameters.lines, self->priv->parameters.depth);
5186
_tmp10_ = scan_page_info_new ();
5188
info->width = self->priv->parameters.pixels_per_line;
5189
info->height = self->priv->parameters.lines;
5190
info->depth = self->priv->parameters.depth;
5191
if (self->priv->parameters.depth == 8) {
5192
_tmp13_ = self->priv->parameters.format == SANE_FRAME_GRAY;
5197
_tmp12_ = job->depth == 2;
5202
_tmp11_ = job->scan_mode == SCAN_MODE_GRAY;
5207
info->depth = job->depth;
5209
if (self->priv->parameters.format == SANE_FRAME_GRAY) {
5214
info->n_channels = _tmp14_;
5215
info->dpi = job->dpi;
5216
_tmp15_ = g_strdup (self->priv->current_device);
5217
_g_free0 (info->device);
5218
info->device = _tmp15_;
5219
if (self->priv->page_number != self->priv->notified_page) {
5220
NotifyGotPageInfo* _tmp16_ = NULL;
5221
NotifyGotPageInfo* _tmp17_;
5222
_tmp16_ = notify_got_page_info_new (info);
5224
scanner_notify (self, (Notify*) _tmp17_);
5225
_notify_unref0 (_tmp17_);
5226
self->priv->notified_page = self->priv->page_number;
5228
buffer_size = self->priv->parameters.bytes_per_line + 1;
5229
_tmp18_ = g_new0 (guchar, buffer_size);
5230
self->priv->buffer = (g_free (self->priv->buffer), NULL);
5231
self->priv->buffer = _tmp18_;
5232
self->priv->buffer_length1 = buffer_size;
5233
self->priv->_buffer_size_ = self->priv->buffer_length1;
5234
self->priv->n_used = 0;
5235
self->priv->line_count = 0;
5236
self->priv->pass_number = 0;
5237
self->priv->state = SCAN_STATE_READ;
5238
_scan_page_info_unref0 (info);
5239
_scan_job_unref0 (job);
5243
static void scanner_do_complete_page (Scanner* self) {
5244
NotifyPageDone* _tmp0_ = NULL;
5245
NotifyPageDone* _tmp1_;
5248
g_return_if_fail (self != NULL);
5249
_tmp0_ = notify_page_done_new ();
5251
scanner_notify (self, (Notify*) _tmp1_);
5252
_notify_unref0 (_tmp1_);
5253
_tmp2_ = _scan_job_ref0 (SCAN_JOB ((ScanJob*) self->priv->job_queue->data));
5255
if (!self->priv->parameters.last_frame) {
5256
self->priv->pass_number++;
5257
self->priv->state = SCAN_STATE_START;
5258
_scan_job_unref0 (job);
5261
if (job->type != SCAN_TYPE_SINGLE) {
5262
NotifyPageDone* _tmp3_ = NULL;
5263
NotifyPageDone* _tmp4_;
5264
self->priv->page_number++;
5265
self->priv->pass_number = 0;
5266
_tmp3_ = notify_page_done_new ();
5268
scanner_notify (self, (Notify*) _tmp4_);
5269
_notify_unref0 (_tmp4_);
5270
self->priv->state = SCAN_STATE_START;
5271
_scan_job_unref0 (job);
5274
sane_cancel (self->priv->handle);
5275
g_debug ("scanner.vala:1179: sane_cancel ()");
5276
scanner_do_complete_document (self);
5277
_scan_job_unref0 (job);
5281
static void scanner_do_read (Scanner* self) {
5290
gchar* _tmp3_ = NULL;
5293
gboolean _tmp8_ = FALSE;
5294
g_return_if_fail (self != NULL);
5295
_tmp0_ = _scan_job_ref0 (SCAN_JOB ((ScanJob*) self->priv->job_queue->data));
5297
n_to_read = self->priv->buffer_length1 - self->priv->n_used;
5298
b = (guchar*) self->priv->buffer;
5299
_tmp2_ = sane_read (self->priv->handle, (guint8*) (b + self->priv->n_used), (SANE_Int) n_to_read, &_tmp1_);
5302
_tmp3_ = sane_status_to_string (status);
5304
g_debug ("scanner.vala:1194: sane_read (%d) -> (%s, %d)", n_to_read, _tmp4_, (gint) n_read);
5306
if (status == SANE_STATUS_EOF) {
5307
gboolean _tmp5_ = FALSE;
5308
if (self->priv->parameters.lines > 0) {
5309
_tmp5_ = self->priv->line_count != self->priv->parameters.lines;
5314
g_warning ("scanner.vala:1200: Scan completed with %d lines, expected %d lines", self->priv->parameters.lines, self->priv->parameters.lines);
5316
if (self->priv->n_used > 0) {
5317
g_warning ("scanner.vala:1202: Scan complete with %d bytes of unused data", self->priv->n_used);
5319
scanner_do_complete_page (self);
5320
_scan_job_unref0 (job);
5323
if (status != SANE_STATUS_GOOD) {
5324
const gchar* _tmp6_ = NULL;
5325
const gchar* _tmp7_ = NULL;
5326
_tmp6_ = sane_strstatus (status);
5327
g_warning ("scanner.vala:1210: Unable to read frame from device: %s", _tmp6_);
5328
_tmp7_ = _ ("Error communicating with scanner");
5329
scanner_fail_scan (self, (gint) status, _tmp7_);
5330
_scan_job_unref0 (job);
5334
if (self->priv->n_used == 0) {
5335
_tmp8_ = n_read == self->priv->buffer_length1;
5342
self->priv->n_used = self->priv->n_used + n_read;
5343
if (self->priv->n_used >= self->priv->parameters.bytes_per_line) {
5344
ScanLine* _tmp9_ = NULL;
5349
guchar* _tmp12_ = NULL;
5351
gboolean _tmp14_ = FALSE;
5352
gboolean _tmp15_ = FALSE;
5353
gboolean _tmp16_ = FALSE;
5354
NotifyGotLine* _tmp19_ = NULL;
5355
NotifyGotLine* _tmp20_;
5356
_tmp9_ = scan_line_new ();
5358
switch (self->priv->parameters.format) {
5359
case SANE_FRAME_GRAY:
5364
case SANE_FRAME_RGB:
5369
case SANE_FRAME_RED:
5374
case SANE_FRAME_GREEN:
5379
case SANE_FRAME_BLUE:
5387
line->width = self->priv->parameters.pixels_per_line;
5388
line->depth = self->priv->parameters.depth;
5389
_tmp10_ = self->priv->buffer;
5390
_tmp11_ = self->priv->buffer_length1;
5391
self->priv->buffer = NULL;
5392
line->data = (g_free (line->data), NULL);
5393
line->data = _tmp10_;
5394
line->data_length1 = _tmp11_;
5395
line->data_length = self->priv->parameters.bytes_per_line;
5396
line->number = self->priv->line_count;
5397
line->n_lines = self->priv->n_used / line->data_length;
5398
self->priv->line_count = self->priv->line_count + line->n_lines;
5399
buffer_size = self->priv->buffer_length1;
5401
buffer_size = buffer_size + self->priv->parameters.bytes_per_line;
5403
_tmp12_ = g_new0 (guchar, buffer_size);
5404
self->priv->buffer = (g_free (self->priv->buffer), NULL);
5405
self->priv->buffer = _tmp12_;
5406
self->priv->buffer_length1 = buffer_size;
5407
self->priv->_buffer_size_ = self->priv->buffer_length1;
5408
n_remaining = self->priv->n_used - (line->n_lines * line->data_length);
5409
self->priv->n_used = 0;
5421
if (!(i < n_remaining)) {
5424
self->priv->buffer[i] = line->data[i + (line->n_lines * line->data_length)];
5425
self->priv->n_used++;
5429
if (self->priv->parameters.depth == 8) {
5430
_tmp16_ = self->priv->parameters.format == SANE_FRAME_GRAY;
5435
_tmp15_ = job->depth == 2;
5440
_tmp14_ = job->scan_mode == SCAN_MODE_GRAY;
5463
if (!(i < line->n_lines)) {
5466
offset = i * line->data_length;
5475
guchar sample = '\0';
5480
if (!(x < line->width)) {
5483
p = line->data[offset + x];
5485
sample = (guchar) 3;
5488
sample = (guchar) 2;
5491
sample = (guchar) 1;
5493
sample = (guchar) 0;
5497
block = block | (sample << block_shift);
5498
if (block_shift == 0) {
5499
line->data[write_offset] = block;
5504
block_shift = block_shift - 2;
5509
if (block_shift != 6) {
5510
line->data[write_offset] = block;
5518
line->data_length = ((line->width * 2) + 7) / 8;
5520
_tmp19_ = notify_got_line_new (line);
5522
scanner_notify (self, (Notify*) _tmp20_);
5523
_notify_unref0 (_tmp20_);
5524
_scan_line_unref0 (line);
5526
_scan_job_unref0 (job);
5530
static void _scanner_authorization_cb_sane_authcallback (const gchar* resource, gchar* username, gchar* password) {
5531
scanner_authorization_cb (resource, username, -1, password, -1);
5535
static gboolean scanner_scan_thread (Scanner* self) {
5536
gboolean result = FALSE;
5537
SANE_Int version_code;
5541
gchar* _tmp2_ = NULL;
5546
g_return_val_if_fail (self != NULL, FALSE);
5547
self->priv->state = SCAN_STATE_IDLE;
5548
_tmp1_ = sane_init (&_tmp0_, _scanner_authorization_cb_sane_authcallback);
5549
version_code = _tmp0_;
5551
_tmp2_ = sane_status_to_string (status);
5553
g_debug ("scanner.vala:1327: sane_init () -> %s", _tmp3_);
5555
if (status != SANE_STATUS_GOOD) {
5556
const gchar* _tmp4_ = NULL;
5557
_tmp4_ = sane_strstatus (status);
5558
g_warning ("scanner.vala:1330: Unable to initialize SANE backend: %s", _tmp4_);
5562
_tmp5_ = SANE_VERSION_MAJOR (version_code);
5563
_tmp6_ = SANE_VERSION_MINOR (version_code);
5564
_tmp7_ = SANE_VERSION_BUILD (version_code);
5565
g_debug ("scanner.vala:1333: SANE version %d.%d.%d", _tmp5_, _tmp6_, _tmp7_);
5566
scanner_redetect (self);
5569
_tmp8_ = scanner_handle_requests (self);
5573
switch (self->priv->state) {
5574
case SCAN_STATE_IDLE:
5576
if (self->priv->job_queue != NULL) {
5577
scanner_set_scanning (self, TRUE);
5578
self->priv->state = SCAN_STATE_OPEN;
5582
case SCAN_STATE_REDETECT:
5584
scanner_do_redetect (self);
5587
case SCAN_STATE_OPEN:
5589
scanner_do_open (self);
5592
case SCAN_STATE_GET_OPTION:
5594
scanner_do_get_option (self);
5597
case SCAN_STATE_START:
5599
scanner_do_start (self);
5602
case SCAN_STATE_GET_PARAMETERS:
5604
scanner_do_get_parameters (self);
5607
case SCAN_STATE_READ:
5609
scanner_do_read (self);
5621
static gpointer _scanner_scan_thread_gthread_func (gpointer self) {
5623
result = scanner_scan_thread (self);
5628
void scanner_start (Scanner* self) {
5629
GError * _inner_error_ = NULL;
5630
g_return_if_fail (self != NULL);
5632
GThread* _tmp0_ = NULL;
5634
_tmp0_ = g_thread_create (_scanner_scan_thread_gthread_func, self, TRUE, &_inner_error_);
5636
if (_inner_error_ != NULL) {
5637
goto __catch9_g_error;
5639
self->priv->thread = _tmp1_;
5646
_inner_error_ = NULL;
5647
g_critical ("scanner.vala:1384: Unable to create thread: %s", e->message);
5651
if (_inner_error_ != NULL) {
5652
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
5653
g_clear_error (&_inner_error_);
5659
void scanner_redetect (Scanner* self) {
5660
RequestRedetect* _tmp0_ = NULL;
5661
g_return_if_fail (self != NULL);
5662
if (self->priv->need_redetect) {
5665
self->priv->need_redetect = TRUE;
5666
g_debug ("scanner.vala:1394: Requesting redetection of scan devices");
5667
_tmp0_ = request_redetect_new ();
5668
g_async_queue_push (self->priv->request_queue, (Request*) _tmp0_);
5672
gboolean scanner_is_scanning (Scanner* self) {
5673
gboolean result = FALSE;
5674
g_return_val_if_fail (self != NULL, FALSE);
5675
result = self->priv->scanning;
5680
static gchar* scanner_get_scan_mode_string (Scanner* self, ScanMode mode) {
5681
gchar* result = NULL;
5682
g_return_val_if_fail (self != NULL, NULL);
5684
case SCAN_MODE_DEFAULT:
5687
_tmp0_ = g_strdup ("ScanMode.DEFAULT");
5691
case SCAN_MODE_COLOR:
5694
_tmp1_ = g_strdup ("ScanMode.COLOR");
5698
case SCAN_MODE_GRAY:
5701
_tmp2_ = g_strdup ("ScanMode.GRAY");
5705
case SCAN_MODE_LINEART:
5708
_tmp3_ = g_strdup ("ScanMode.LINEART");
5714
gchar* _tmp4_ = NULL;
5715
_tmp4_ = g_strdup_printf ("%d", (gint) mode);
5723
static gchar* scanner_get_scan_type_string (Scanner* self, ScanType type) {
5724
gchar* result = NULL;
5725
g_return_val_if_fail (self != NULL, NULL);
5727
case SCAN_TYPE_SINGLE:
5730
_tmp0_ = g_strdup ("ScanType.SINGLE");
5734
case SCAN_TYPE_ADF_FRONT:
5737
_tmp1_ = g_strdup ("ScanType.ADF_FRONT");
5741
case SCAN_TYPE_ADF_BACK:
5744
_tmp2_ = g_strdup ("ScanType.ADF_BACK");
5748
case SCAN_TYPE_ADF_BOTH:
5751
_tmp3_ = g_strdup ("ScanType.ADF_BOTH");
5757
gchar* _tmp4_ = NULL;
5758
_tmp4_ = g_strdup_printf ("%d", (gint) type);
5766
void scanner_scan (Scanner* self, const gchar* device, ScanOptions* options) {
5767
const gchar* _tmp0_ = NULL;
5768
gchar* _tmp1_ = NULL;
5770
gchar* _tmp3_ = NULL;
5772
RequestStartScan* _tmp5_ = NULL;
5773
RequestStartScan* request;
5774
ScanJob* _tmp6_ = NULL;
5777
g_return_if_fail (self != NULL);
5778
g_return_if_fail (options != NULL);
5779
if (device != NULL) {
5784
_tmp1_ = scanner_get_scan_mode_string (self, options->scan_mode);
5786
_tmp3_ = scanner_get_scan_type_string (self, options->type);
5788
g_debug ("scanner.vala:1440: Scanner.scan (\"%s\", dpi=%d, scan_mode=%s, depth=%" \
5789
"d, type=%s, paper_width=%d, paper_height=%d)", _tmp0_, options->dpi, _tmp2_, options->depth, _tmp4_, options->paper_width, options->paper_height);
5792
_tmp5_ = request_start_scan_new ();
5794
_tmp6_ = scan_job_new ();
5795
_scan_job_unref0 (request->job);
5796
request->job = _tmp6_;
5797
_tmp7_ = g_strdup (device);
5798
_g_free0 (request->job->device);
5799
request->job->device = _tmp7_;
5800
request->job->dpi = (gdouble) options->dpi;
5801
request->job->scan_mode = options->scan_mode;
5802
request->job->depth = options->depth;
5803
request->job->type = options->type;
5804
request->job->page_width = options->paper_width;
5805
request->job->page_height = options->paper_height;
5806
_tmp8_ = _request_ref0 ((Request*) request);
5807
g_async_queue_push (self->priv->request_queue, _tmp8_);
5808
_request_unref0 (request);
5812
void scanner_cancel (Scanner* self) {
5813
RequestCancel* _tmp0_ = NULL;
5814
g_return_if_fail (self != NULL);
5815
_tmp0_ = request_cancel_new ();
5816
g_async_queue_push (self->priv->request_queue, (Request*) _tmp0_);
5820
void scanner_free (Scanner* self) {
5821
RequestQuit* _tmp0_ = NULL;
5822
g_return_if_fail (self != NULL);
5823
g_debug ("scanner.vala:1462: Stopping scan thread");
5824
_tmp0_ = request_quit_new ();
5825
g_async_queue_push (self->priv->request_queue, (Request*) _tmp0_);
5826
if (self->priv->thread != NULL) {
5827
g_thread_join (self->priv->thread);
5830
g_debug ("scanner.vala:1470: sane_exit ()");
5834
static void g_cclosure_user_marshal_VOID__SCAN_PAGE_INFO (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
5835
typedef void (*GMarshalFunc_VOID__SCAN_PAGE_INFO) (gpointer data1, gpointer arg_1, gpointer data2);
5836
register GMarshalFunc_VOID__SCAN_PAGE_INFO callback;
5837
register GCClosure * cc;
5838
register gpointer data1;
5839
register gpointer data2;
5840
cc = (GCClosure *) closure;
5841
g_return_if_fail (n_param_values == 2);
5842
if (G_CCLOSURE_SWAP_DATA (closure)) {
5843
data1 = closure->data;
5844
data2 = param_values->data[0].v_pointer;
5846
data1 = param_values->data[0].v_pointer;
5847
data2 = closure->data;
5849
callback = (GMarshalFunc_VOID__SCAN_PAGE_INFO) (marshal_data ? marshal_data : cc->callback);
5850
callback (data1, value_get_scan_page_info (param_values + 1), data2);
5854
static void g_cclosure_user_marshal_VOID__SCAN_LINE (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
5855
typedef void (*GMarshalFunc_VOID__SCAN_LINE) (gpointer data1, gpointer arg_1, gpointer data2);
5856
register GMarshalFunc_VOID__SCAN_LINE callback;
5857
register GCClosure * cc;
5858
register gpointer data1;
5859
register gpointer data2;
5860
cc = (GCClosure *) closure;
5861
g_return_if_fail (n_param_values == 2);
5862
if (G_CCLOSURE_SWAP_DATA (closure)) {
5863
data1 = closure->data;
5864
data2 = param_values->data[0].v_pointer;
5866
data1 = param_values->data[0].v_pointer;
5867
data2 = closure->data;
5869
callback = (GMarshalFunc_VOID__SCAN_LINE) (marshal_data ? marshal_data : cc->callback);
5870
callback (data1, value_get_scan_line (param_values + 1), data2);
5874
static void g_cclosure_user_marshal_VOID__INT_STRING (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
5875
typedef void (*GMarshalFunc_VOID__INT_STRING) (gpointer data1, gint arg_1, const char* arg_2, gpointer data2);
5876
register GMarshalFunc_VOID__INT_STRING callback;
5877
register GCClosure * cc;
5878
register gpointer data1;
5879
register gpointer data2;
5880
cc = (GCClosure *) closure;
5881
g_return_if_fail (n_param_values == 3);
5882
if (G_CCLOSURE_SWAP_DATA (closure)) {
5883
data1 = closure->data;
5884
data2 = param_values->data[0].v_pointer;
5886
data1 = param_values->data[0].v_pointer;
5887
data2 = closure->data;
5889
callback = (GMarshalFunc_VOID__INT_STRING) (marshal_data ? marshal_data : cc->callback);
5890
callback (data1, g_value_get_int (param_values + 1), g_value_get_string (param_values + 2), data2);
5894
static void value_scanner_init (GValue* value) {
5895
value->data[0].v_pointer = NULL;
5899
static void value_scanner_free_value (GValue* value) {
5900
if (value->data[0].v_pointer) {
5901
scanner_unref (value->data[0].v_pointer);
5906
static void value_scanner_copy_value (const GValue* src_value, GValue* dest_value) {
5907
if (src_value->data[0].v_pointer) {
5908
dest_value->data[0].v_pointer = scanner_ref (src_value->data[0].v_pointer);
5910
dest_value->data[0].v_pointer = NULL;
5915
static gpointer value_scanner_peek_pointer (const GValue* value) {
5916
return value->data[0].v_pointer;
5920
static gchar* value_scanner_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
5921
if (collect_values[0].v_pointer) {
5923
object = collect_values[0].v_pointer;
5924
if (object->parent_instance.g_class == NULL) {
5925
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
5926
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
5927
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
5929
value->data[0].v_pointer = scanner_ref (object);
5931
value->data[0].v_pointer = NULL;
5937
static gchar* value_scanner_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
5939
object_p = collect_values[0].v_pointer;
5941
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
5943
if (!value->data[0].v_pointer) {
5945
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
5946
*object_p = value->data[0].v_pointer;
5948
*object_p = scanner_ref (value->data[0].v_pointer);
5954
GParamSpec* param_spec_scanner (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
5955
ParamSpecScanner* spec;
5956
g_return_val_if_fail (g_type_is_a (object_type, TYPE_SCANNER), NULL);
5957
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
5958
G_PARAM_SPEC (spec)->value_type = object_type;
5959
return G_PARAM_SPEC (spec);
5963
gpointer value_get_scanner (const GValue* value) {
5964
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCANNER), NULL);
5965
return value->data[0].v_pointer;
5969
void value_set_scanner (GValue* value, gpointer v_object) {
5971
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCANNER));
5972
old = value->data[0].v_pointer;
5974
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCANNER));
5975
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
5976
value->data[0].v_pointer = v_object;
5977
scanner_ref (value->data[0].v_pointer);
5979
value->data[0].v_pointer = NULL;
5982
scanner_unref (old);
5987
void value_take_scanner (GValue* value, gpointer v_object) {
5989
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SCANNER));
5990
old = value->data[0].v_pointer;
5992
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SCANNER));
5993
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
5994
value->data[0].v_pointer = v_object;
5996
value->data[0].v_pointer = NULL;
5999
scanner_unref (old);
6004
static void scanner_class_init (ScannerClass * klass) {
6005
scanner_parent_class = g_type_class_peek_parent (klass);
6006
SCANNER_CLASS (klass)->finalize = scanner_finalize;
6007
g_type_class_add_private (klass, sizeof (ScannerPrivate));
6008
g_signal_new ("update_devices", TYPE_SCANNER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER);
6009
g_signal_new ("request_authorization", TYPE_SCANNER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING);
6010
g_signal_new ("expect_page", TYPE_SCANNER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
6011
g_signal_new ("got_page_info", TYPE_SCANNER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__SCAN_PAGE_INFO, G_TYPE_NONE, 1, TYPE_SCAN_PAGE_INFO);
6012
g_signal_new ("got_line", TYPE_SCANNER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__SCAN_LINE, G_TYPE_NONE, 1, TYPE_SCAN_LINE);
6013
g_signal_new ("scan_failed", TYPE_SCANNER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__INT_STRING, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING);
6014
g_signal_new ("page_done", TYPE_SCANNER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
6015
g_signal_new ("document_done", TYPE_SCANNER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
6016
g_signal_new ("scanning_changed", TYPE_SCANNER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
6020
static void scanner_instance_init (Scanner * self) {
6021
self->priv = SCANNER_GET_PRIVATE (self);
6022
self->ref_count = 1;
6026
static void scanner_finalize (Scanner* obj) {
6028
self = SCANNER (obj);
6029
_g_async_queue_unref0 (self->priv->request_queue);
6030
_g_async_queue_unref0 (self->priv->notify_queue);
6031
_g_async_queue_unref0 (self->priv->authorize_queue);
6032
_g_free0 (self->priv->default_device);
6033
__g_list_free__scan_job_unref0_0 (self->priv->job_queue);
6034
_g_free0 (self->priv->current_device);
6035
self->priv->buffer = (g_free (self->priv->buffer), NULL);
6039
GType scanner_get_type (void) {
6040
static volatile gsize scanner_type_id__volatile = 0;
6041
if (g_once_init_enter (&scanner_type_id__volatile)) {
6042
static const GTypeValueTable g_define_type_value_table = { value_scanner_init, value_scanner_free_value, value_scanner_copy_value, value_scanner_peek_pointer, "p", value_scanner_collect_value, "p", value_scanner_lcopy_value };
6043
static const GTypeInfo g_define_type_info = { sizeof (ScannerClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) scanner_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Scanner), 0, (GInstanceInitFunc) scanner_instance_init, &g_define_type_value_table };
6044
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
6045
GType scanner_type_id;
6046
scanner_type_id = g_type_register_fundamental (g_type_fundamental_next (), "Scanner", &g_define_type_info, &g_define_type_fundamental_info, 0);
6047
g_once_init_leave (&scanner_type_id__volatile, scanner_type_id);
6049
return scanner_type_id__volatile;
6053
gpointer scanner_ref (gpointer instance) {
6056
g_atomic_int_inc (&self->ref_count);
6061
void scanner_unref (gpointer instance) {
6064
if (g_atomic_int_dec_and_test (&self->ref_count)) {
6065
SCANNER_GET_CLASS (self)->finalize (self);
6066
g_type_free_instance ((GTypeInstance *) self);
6071
static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) {
6072
if ((array != NULL) && (destroy_func != NULL)) {
6074
for (i = 0; i < array_length; i = i + 1) {
6075
if (((gpointer*) array)[i] != NULL) {
6076
destroy_func (((gpointer*) array)[i]);
6083
static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) {
6084
_vala_array_destroy (array, array_length, destroy_func);