diff options
| author | Alessio Treglia <alessio@debian.org> | 2011-09-03 12:12:52 +0200 | 
|---|---|---|
| committer | Alessio Treglia <alessio@debian.org> | 2011-09-03 12:12:52 +0200 | 
| commit | 8227fe5bd1a0cee50359c2581184c32a371c754e (patch) | |
| tree | 80723467abe036465fd977816881849a70030111 /src | |
| parent | 87ebc2af1f0417b3bc38a233e28ff673eff4fa51 (diff) | |
Imported Upstream version 3.1.90upstream/3.1.90
Diffstat (limited to 'src')
| -rw-r--r-- | src/book.c | 8 | ||||
| -rw-r--r-- | src/book.vala | 8 | ||||
| -rw-r--r-- | src/scanner.c | 18 | ||||
| -rw-r--r-- | src/simple-scan.c | 374 | ||||
| -rw-r--r-- | src/simple-scan.vala | 79 | ||||
| -rw-r--r-- | src/ui.c | 56 | 
6 files changed, 458 insertions, 85 deletions
| @@ -859,8 +859,8 @@ static void book_save_pdf (Book* self, GFile* file, GError** error) {  	}  	_tmp1_ = pdf_writer_new (stream);  	writer = _tmp1_; -	pdf_writer_write_string (writer, "%%PDF-1.3\n"); -	pdf_writer_write_string (writer, "%%\xe2\xe3\xcf\xd3\n"); +	pdf_writer_write_string (writer, "%PDF-1.3\n"); +	pdf_writer_write_string (writer, "%\xe2\xe3\xcf\xd3\n");  	_tmp2_ = pdf_writer_start_object (writer);  	catalog_number = _tmp2_;  	_tmp3_ = g_strdup_printf ("%u 0 obj\n", catalog_number); @@ -1501,7 +1501,7 @@ static void book_save_pdf (Book* self, GFile* file, GError** error) {  			{  				gchar* _tmp108_ = NULL;  				gchar* _tmp109_; -				_tmp108_ = g_strdup_printf ("%010zu 0000 n\n", (gsize) offset); +				_tmp108_ = g_strdup_printf ("%010zu 00000 n \n", (gsize) offset);  				_tmp109_ = _tmp108_;  				pdf_writer_write_string (writer, _tmp109_);  				_g_free0 (_tmp109_); @@ -1529,7 +1529,7 @@ static void book_save_pdf (Book* self, GFile* file, GError** error) {  	_tmp118_ = _tmp117_;  	pdf_writer_write_string (writer, _tmp118_);  	_g_free0 (_tmp118_); -	pdf_writer_write_string (writer, "%%%%EOF\n"); +	pdf_writer_write_string (writer, "%%EOF\n");  	_pdf_writer_unref0 (writer);  	_g_object_unref0 (stream);  } diff --git a/src/book.vala b/src/book.vala index 1aed281..64f7c60 100644 --- a/src/book.vala +++ b/src/book.vala @@ -207,10 +207,10 @@ public class Book          var writer = new PDFWriter (stream);          /* Header */ -        writer.write_string ("%%PDF-1.3\n"); +        writer.write_string ("%PDF-1.3\n");          /* Comment with binary as recommended so file is treated as binary */ -        writer.write_string ("%%\xe2\xe3\xcf\xd3\n"); +        writer.write_string ("%\xe2\xe3\xcf\xd3\n");          /* Catalog */          var catalog_number = writer.start_object (); @@ -464,7 +464,7 @@ public class Book          writer.write_string ("xref\n");          writer.write_string ("1 %zu\n".printf (writer.object_offsets.length ()));          foreach (var offset in writer.object_offsets) -            writer.write_string ("%010zu 0000 n\n".printf (offset)); +            writer.write_string ("%010zu 00000 n \n".printf (offset));          /* Trailer */          writer.write_string ("trailer\n"); @@ -476,7 +476,7 @@ public class Book          writer.write_string (">>\n");          writer.write_string ("startxref\n");          writer.write_string ("%zu\n".printf (xref_offset)); -        writer.write_string ("%%%%EOF\n"); +        writer.write_string ("%%EOF\n");      }      public void save (string type, File file) throws Error diff --git a/src/scanner.c b/src/scanner.c index e7e83cc..c26d691 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -3293,7 +3293,7 @@ static gchar* string_replace (const gchar* self, const gchar* old, const gchar*  		regex = _tmp3_;  		if (_inner_error_ != NULL) {  			if (_inner_error_->domain == G_REGEX_ERROR) { -				goto __catch8_g_regex_error; +				goto __catch9_g_regex_error;  			}  			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);  			g_clear_error (&_inner_error_); @@ -3304,7 +3304,7 @@ static gchar* string_replace (const gchar* self, const gchar* old, const gchar*  		if (_inner_error_ != NULL) {  			_g_regex_unref0 (regex);  			if (_inner_error_->domain == G_REGEX_ERROR) { -				goto __catch8_g_regex_error; +				goto __catch9_g_regex_error;  			}  			_g_regex_unref0 (regex);  			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); @@ -3315,8 +3315,8 @@ static gchar* string_replace (const gchar* self, const gchar* old, const gchar*  		_g_regex_unref0 (regex);  		return result;  	} -	goto __finally8; -	__catch8_g_regex_error: +	goto __finally9; +	__catch9_g_regex_error:  	{  		GError* e = NULL;  		e = _inner_error_; @@ -3324,7 +3324,7 @@ static gchar* string_replace (const gchar* self, const gchar* old, const gchar*  		g_assert_not_reached ();  		_g_error_free0 (e);  	} -	__finally8: +	__finally9:  	if (_inner_error_ != NULL) {  		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);  		g_clear_error (&_inner_error_); @@ -5634,12 +5634,12 @@ void scanner_start (Scanner* self) {  		_tmp0_ = g_thread_create (_scanner_scan_thread_gthread_func, self, TRUE, &_inner_error_);  		_tmp1_ = _tmp0_;  		if (_inner_error_ != NULL) { -			goto __catch9_g_error; +			goto __catch10_g_error;  		}  		self->priv->thread = _tmp1_;  	} -	goto __finally9; -	__catch9_g_error: +	goto __finally10; +	__catch10_g_error:  	{  		GError* e = NULL;  		e = _inner_error_; @@ -5647,7 +5647,7 @@ void scanner_start (Scanner* self) {  		g_critical ("scanner.vala:1384: Unable to create thread: %s", e->message);  		_g_error_free0 (e);  	} -	__finally9: +	__finally10:  	if (_inner_error_ != NULL) {  		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);  		g_clear_error (&_inner_error_); diff --git a/src/simple-scan.c b/src/simple-scan.c index 1f1f599..85943bf 100644 --- a/src/simple-scan.c +++ b/src/simple-scan.c @@ -15,9 +15,9 @@  #include <glib.h>  #include <glib-object.h>  #include <gudev/gudev.h> -#include <stdio.h>  #include <stdlib.h>  #include <string.h> +#include <stdio.h>  #include <float.h>  #include <math.h>  #include <sane/sane.h> @@ -140,9 +140,12 @@ typedef struct _ScanOptionsPrivate ScanOptionsPrivate;  #define TYPE_SCAN_TYPE (scan_type_get_type ())  #define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL))) +#define _fclose0(var) ((var == NULL) ? NULL : (var = (fclose (var), NULL))) +#define _g_match_info_free0(var) ((var == NULL) ? NULL : (var = (g_match_info_free (var), NULL))) +#define _g_string_free0(var) ((var == NULL) ? NULL : (var = (g_string_free (var, TRUE), NULL))) +#define _g_regex_unref0(var) ((var == NULL) ? NULL : (var = (g_regex_unref (var), NULL)))  #define _g_option_context_free0(var) ((var == NULL) ? NULL : (var = (g_option_context_free (var), NULL)))  #define _g_timer_destroy0(var) ((var == NULL) ? NULL : (var = (g_timer_destroy (var), NULL))) -#define _fclose0(var) ((var == NULL) ? NULL : (var = (fclose (var), NULL)))  #define _application_unref0(var) ((var == NULL) ? NULL : (var = (application_unref (var), NULL)))  typedef struct _ParamSpecApplication ParamSpecApplication; @@ -244,6 +247,8 @@ static gboolean application_show_version;  static gboolean application_show_version = FALSE;  static gboolean application_debug_enabled;  static gboolean application_debug_enabled = FALSE; +static gchar* application_fix_pdf_filename; +static gchar* application_fix_pdf_filename = NULL;  static GTimer* application_log_timer;  static GTimer* application_log_timer = NULL;  static FILE* application_log_file; @@ -398,6 +403,7 @@ void page_save (Page* self, const gchar* type, GFile* file, GError** error);  void scanner_free (Scanner* self);  static void application_log_cb (const gchar* log_domain, GLogLevelFlags log_level, const gchar* message);  void scanner_redetect (Scanner* self); +static void application_fix_pdf (const gchar* filename, GError** error);  gint application_main (gchar** args, int args_length1);  ScanDevice* scan_device_new (void);  ScanDevice* scan_device_construct (GType object_type); @@ -406,7 +412,7 @@ static void application_finalize (Application* obj);  static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func);  static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func); -const GOptionEntry APPLICATION_options[3] = {{"version", 'v', 0, G_OPTION_ARG_NONE, &application_show_version, "Show release version", NULL}, {"debug", 'd', 0, G_OPTION_ARG_NONE, &application_debug_enabled, "Print debugging messages", NULL}, {NULL}}; +const GOptionEntry APPLICATION_options[4] = {{"version", 'v', 0, G_OPTION_ARG_NONE, &application_show_version, "Show release version", NULL}, {"debug", 'd', 0, G_OPTION_ARG_NONE, &application_debug_enabled, "Print debugging messages", NULL}, {"fix-pdf", (gchar) 0, 0, G_OPTION_ARG_STRING, &application_fix_pdf_filename, "Fix PDF files generated with older versions of Simple Scan", "FILENAME..."}, {NULL}};  static gpointer _scan_device_ref0 (gpointer self) {  	return self ? scan_device_ref (self) : NULL; @@ -747,7 +753,7 @@ static void application_scanner_page_info_cb (Application* self, Scanner* scanne  	g_return_if_fail (self != NULL);  	g_return_if_fail (scanner != NULL);  	g_return_if_fail (info != NULL); -	g_debug ("simple-scan.vala:233: Page is %d pixels wide, %d pixels high, %d bits " \ +	g_debug ("simple-scan.vala:236: Page is %d pixels wide, %d pixels high, %d bits " \  "per pixel", info->width, info->height, info->depth);  	_tmp0_ = application_append_page (self);  	page = _tmp0_; @@ -848,7 +854,7 @@ static void application_scan_cb (Application* self, SimpleScan* ui, const gchar*  	g_return_if_fail (self != NULL);  	g_return_if_fail (ui != NULL);  	g_return_if_fail (options != NULL); -	g_debug ("simple-scan.vala:293: Requesting scan at %d dpi from device '%s'", options->dpi, device); +	g_debug ("simple-scan.vala:296: Requesting scan at %d dpi from device '%s'", options->dpi, device);  	_tmp0_ = scanner_is_scanning (self->priv->scanner);  	if (!_tmp0_) {  		Page* _tmp1_ = NULL; @@ -918,7 +924,7 @@ static gchar* application_get_temporary_filename (Application* self, const gchar  		GError* e = NULL;  		e = _inner_error_;  		_inner_error_ = NULL; -		g_warning ("simple-scan.vala:329: Error saving email attachment: %s", e->message); +		g_warning ("simple-scan.vala:332: Error saving email attachment: %s", e->message);  		result = NULL;  		_g_error_free0 (e);  		_g_free0 (path); @@ -975,7 +981,7 @@ static void application_email_cb (Application* self, SimpleScan* ui, const gchar  				GError* e = NULL;  				e = _inner_error_;  				_inner_error_ = NULL; -				g_warning ("simple-scan.vala:355: Unable to save email file: %s", e->message); +				g_warning ("simple-scan.vala:358: Unable to save email file: %s", e->message);  				_g_error_free0 (e);  				_g_object_unref0 (file);  				_g_free0 (path); @@ -1050,7 +1056,7 @@ static void application_email_cb (Application* self, SimpleScan* ui, const gchar  						GError* e = NULL;  						e = _inner_error_;  						_inner_error_ = NULL; -						g_warning ("simple-scan.vala:379: Unable to save email file: %s", e->message); +						g_warning ("simple-scan.vala:382: Unable to save email file: %s", e->message);  						_g_error_free0 (e);  						_g_object_unref0 (file);  						_g_free0 (path); @@ -1083,7 +1089,7 @@ static void application_email_cb (Application* self, SimpleScan* ui, const gchar  			}  		}  	} -	g_debug ("simple-scan.vala:389: Launching email client: %s", command_line); +	g_debug ("simple-scan.vala:392: Launching email client: %s", command_line);  	{  		g_spawn_command_line_async (command_line, &_inner_error_);  		if (_inner_error_ != NULL) { @@ -1096,7 +1102,7 @@ static void application_email_cb (Application* self, SimpleScan* ui, const gchar  		GError* e = NULL;  		e = _inner_error_;  		_inner_error_ = NULL; -		g_warning ("simple-scan.vala:396: Unable to start email: %s", e->message); +		g_warning ("simple-scan.vala:399: Unable to start email: %s", e->message);  		_g_error_free0 (e);  	}  	__finally6: @@ -1209,6 +1215,243 @@ static void application_on_uevent (Application* self, GUdevClient* client, const  } +static glong string_strnlen (gchar* str, glong maxlen) { +	glong result = 0L; +	gchar* _tmp0_ = NULL; +	gchar* end; +	_tmp0_ = memchr (str, 0, (gsize) maxlen); +	end = _tmp0_; +	if (end == NULL) { +		result = maxlen; +		return result; +	} else { +		result = (glong) (end - str); +		return result; +	} +} + + +static gchar* string_substring (const gchar* self, glong offset, glong len) { +	gchar* result = NULL; +	glong string_length = 0L; +	gboolean _tmp0_ = FALSE; +	gchar* _tmp3_ = NULL; +	g_return_val_if_fail (self != NULL, NULL); +	if (offset >= ((glong) 0)) { +		_tmp0_ = len >= ((glong) 0); +	} else { +		_tmp0_ = FALSE; +	} +	if (_tmp0_) { +		glong _tmp1_; +		_tmp1_ = string_strnlen ((gchar*) self, offset + len); +		string_length = _tmp1_; +	} else { +		gint _tmp2_; +		_tmp2_ = strlen (self); +		string_length = (glong) _tmp2_; +	} +	if (offset < ((glong) 0)) { +		offset = string_length + offset; +		g_return_val_if_fail (offset >= ((glong) 0), NULL); +	} else { +		g_return_val_if_fail (offset <= string_length, NULL); +	} +	if (len < ((glong) 0)) { +		len = string_length - offset; +	} +	g_return_val_if_fail ((offset + len) <= string_length, NULL); +	_tmp3_ = g_strndup (((gchar*) self) + offset, (gsize) len); +	result = _tmp3_; +	return result; +} + + +static void application_fix_pdf (const gchar* filename, GError** error) { +	guint8* data = NULL; +	gint data_length1 = 0; +	gint _data_size_ = 0; +	guint8* _tmp0_ = NULL; +	size_t _tmp1_; +	gchar* _tmp2_; +	gchar* _tmp3_; +	FILE* _tmp4_ = NULL; +	FILE* _tmp5_; +	FILE* fixed_file; +	gint offset; +	gint line_number; +	gint xref_offset; +	gint xref_line; +	GRegex* _tmp6_ = NULL; +	GRegex* xref_regex; +	GMatchInfo* xref_match = NULL; +	GString* _tmp7_ = NULL; +	GString* line; +	gchar* _tmp25_; +	gchar* _tmp26_; +	gint _tmp27_; +	gboolean _tmp28_; +	GError * _inner_error_ = NULL; +	g_return_if_fail (filename != NULL); +	g_file_get_contents (filename, (gchar**) (&_tmp0_), &_tmp1_, &_inner_error_); +	data = (g_free (data), NULL); +	data = _tmp0_; +	data_length1 = _tmp1_; +	_data_size_ = data_length1; +	if (_inner_error_ != NULL) { +		g_propagate_error (error, _inner_error_); +		data = (g_free (data), NULL); +		return; +	} +	_tmp2_ = g_strconcat (filename, ".fixed", NULL); +	_tmp3_ = _tmp2_; +	_tmp4_ = fopen (_tmp3_, "w"); +	_tmp5_ = _tmp4_; +	_g_free0 (_tmp3_); +	fixed_file = _tmp5_; +	offset = 0; +	line_number = 0; +	xref_offset = 0; +	xref_line = -1; +	_tmp6_ = g_regex_new ("^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d 0000 n$", 0, 0, &_inner_error_); +	xref_regex = _tmp6_; +	if (_inner_error_ != NULL) { +		g_propagate_error (error, _inner_error_); +		_fclose0 (fixed_file); +		data = (g_free (data), NULL); +		return; +	} +	_tmp7_ = g_string_new (""); +	line = _tmp7_; +	while (TRUE) { +		gint end_offset; +		gboolean _tmp8_ = FALSE; +		if (!(offset < data_length1)) { +			break; +		} +		end_offset = offset; +		g_string_assign (line, ""); +		while (TRUE) { +			guint8 c; +			if (!(end_offset < data_length1)) { +				break; +			} +			c = data[end_offset]; +			g_string_append_c (line, (gchar) c); +			end_offset++; +			if (c == ((guint8) '\n')) { +				break; +			} +		} +		if (g_strcmp0 (line->str, "startxref\n") == 0) { +			xref_line = line_number; +		} +		if (line_number < 2) { +			gboolean _tmp9_; +			_tmp9_ = g_str_has_prefix (line->str, "%%"); +			_tmp8_ = _tmp9_; +		} else { +			_tmp8_ = FALSE; +		} +		if (_tmp8_) { +			gchar* _tmp10_ = NULL; +			gchar* _tmp11_; +			xref_offset--; +			_tmp10_ = string_substring (line->str, (glong) 1, (glong) (-1)); +			_tmp11_ = _tmp10_; +			fprintf (fixed_file, "%s", _tmp11_); +			_g_free0 (_tmp11_); +		} else { +			GMatchInfo* _tmp12_ = NULL; +			gboolean _tmp13_; +			_tmp13_ = g_regex_match (xref_regex, line->str, 0, &_tmp12_); +			_g_match_info_free0 (xref_match); +			xref_match = _tmp12_; +			if (_tmp13_) { +				const gchar* _tmp14_ = NULL; +				gint _tmp15_; +				_tmp14_ = g_match_info_get_string (xref_match); +				_tmp15_ = atoi (_tmp14_); +				fprintf (fixed_file, "%010d 00000 n \n", _tmp15_ + xref_offset); +			} else { +				gboolean _tmp16_ = FALSE; +				if (xref_line > 0) { +					_tmp16_ = line_number == (xref_line + 1); +				} else { +					_tmp16_ = FALSE; +				} +				if (_tmp16_) { +					gint _tmp17_; +					gchar* _tmp18_ = NULL; +					gchar* _tmp19_; +					_tmp17_ = atoi (line->str); +					_tmp18_ = g_strdup_printf ("%d\n", _tmp17_ + xref_offset); +					_tmp19_ = _tmp18_; +					fprintf (fixed_file, "%s", _tmp19_); +					_g_free0 (_tmp19_); +				} else { +					gboolean _tmp20_ = FALSE; +					if (line_number == (xref_line + 2)) { +						gboolean _tmp21_; +						_tmp21_ = g_str_has_prefix (line->str, "%%%%"); +						_tmp20_ = _tmp21_; +					} else { +						_tmp20_ = FALSE; +					} +					if (_tmp20_) { +						gchar* _tmp22_ = NULL; +						gchar* _tmp23_; +						_tmp22_ = string_substring (line->str, (glong) 2, (glong) (-1)); +						_tmp23_ = _tmp22_; +						fprintf (fixed_file, "%s", _tmp23_); +						_g_free0 (_tmp23_); +					} else { +						{ +							gint i; +							i = offset; +							{ +								gboolean _tmp24_; +								_tmp24_ = TRUE; +								while (TRUE) { +									if (!_tmp24_) { +										i++; +									} +									_tmp24_ = FALSE; +									if (!(i < end_offset)) { +										break; +									} +									fputc ((gchar) data[i], fixed_file); +								} +							} +						} +					} +				} +			} +		} +		line_number++; +		offset = end_offset; +	} +	_tmp25_ = g_strconcat (filename, "~", NULL); +	_tmp26_ = _tmp25_; +	_tmp27_ = g_rename (filename, _tmp26_); +	_tmp28_ = _tmp27_ >= 0; +	_g_free0 (_tmp26_); +	if (_tmp28_) { +		gchar* _tmp29_; +		gchar* _tmp30_; +		_tmp29_ = g_strconcat (filename, ".fixed", NULL); +		_tmp30_ = _tmp29_; +		g_rename (_tmp30_, filename); +		_g_free0 (_tmp30_); +	} +	_g_string_free0 (line); +	_g_match_info_free0 (xref_match); +	_g_regex_unref0 (xref_regex); +	_fclose0 (fixed_file); +	data = (g_free (data), NULL); +} + +  static void _application_log_cb_glog_func (const gchar* log_domain, GLogLevelFlags log_levels, const gchar* message, gpointer self) {  	application_log_cb (log_domain, log_levels, message);  } @@ -1221,15 +1464,15 @@ gint application_main (gchar** args, int args_length1) {  	GOptionContext* c;  	GOptionGroup* _tmp2_ = NULL;  	ScanDevice* device; -	GTimer* _tmp7_ = NULL; -	const gchar* _tmp8_ = NULL; -	gchar* _tmp9_ = NULL; +	GTimer* _tmp8_ = NULL; +	const gchar* _tmp9_ = NULL; +	gchar* _tmp10_ = NULL;  	gchar* path; -	const gchar* _tmp10_ = NULL; -	gchar* _tmp11_ = NULL; -	FILE* _tmp12_ = NULL; -	pid_t _tmp13_; -	Application* _tmp14_ = NULL; +	const gchar* _tmp11_ = NULL; +	gchar* _tmp12_ = NULL; +	FILE* _tmp13_ = NULL; +	pid_t _tmp14_; +	Application* _tmp15_ = NULL;  	Application* app;  	GError * _inner_error_ = NULL;  	setlocale (LC_ALL, ""); @@ -1278,40 +1521,91 @@ gint application_main (gchar** args, int args_length1) {  		_g_option_context_free0 (c);  		return result;  	} +	if (application_fix_pdf_filename != NULL) { +		{ +			application_fix_pdf (application_fix_pdf_filename, &_inner_error_); +			if (_inner_error_ != NULL) { +				goto __catch8_g_error; +			} +			{ +				gint i; +				i = 1; +				{ +					gboolean _tmp4_; +					_tmp4_ = TRUE; +					while (TRUE) { +						if (!_tmp4_) { +							i++; +						} +						_tmp4_ = FALSE; +						if (!(i < args_length1)) { +							break; +						} +						application_fix_pdf (args[i], &_inner_error_); +						if (_inner_error_ != NULL) { +							goto __catch8_g_error; +						} +					} +				} +			} +		} +		goto __finally8; +		__catch8_g_error: +		{ +			GError* e = NULL; +			e = _inner_error_; +			_inner_error_ = NULL; +			fprintf (stderr, "Error fixing PDF file: %s", e->message); +			result = EXIT_FAILURE; +			_g_error_free0 (e); +			_g_option_context_free0 (c); +			return result; +		} +		__finally8: +		if (_inner_error_ != NULL) { +			_g_option_context_free0 (c); +			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); +			g_clear_error (&_inner_error_); +			return 0; +		} +		result = EXIT_SUCCESS; +		_g_option_context_free0 (c); +		return result; +	}  	device = NULL;  	if (args_length1 > 1) { -		ScanDevice* _tmp4_ = NULL; -		gchar* _tmp5_; +		ScanDevice* _tmp5_ = NULL;  		gchar* _tmp6_; -		_tmp4_ = scan_device_new (); +		gchar* _tmp7_; +		_tmp5_ = scan_device_new ();  		_scan_device_unref0 (device); -		device = _tmp4_; -		_tmp5_ = g_strdup (args[1]); -		_g_free0 (device->name); -		device->name = _tmp5_; +		device = _tmp5_;  		_tmp6_ = g_strdup (args[1]); +		_g_free0 (device->name); +		device->name = _tmp6_; +		_tmp7_ = g_strdup (args[1]);  		_g_free0 (device->label); -		device->label = _tmp6_; +		device->label = _tmp7_;  	} -	_tmp7_ = g_timer_new (); +	_tmp8_ = g_timer_new ();  	_g_timer_destroy0 (application_log_timer); -	application_log_timer = _tmp7_; -	_tmp8_ = g_get_user_cache_dir (); -	_tmp9_ = g_build_filename (_tmp8_, "simple-scan", NULL, NULL); -	path = _tmp9_; +	application_log_timer = _tmp8_; +	_tmp9_ = g_get_user_cache_dir (); +	_tmp10_ = g_build_filename (_tmp9_, "simple-scan", NULL, NULL); +	path = _tmp10_;  	g_mkdir_with_parents (path, 0700); -	_tmp10_ = g_get_user_cache_dir (); -	_tmp11_ = g_build_filename (_tmp10_, "simple-scan", "simple-scan.log", NULL, NULL); +	_tmp11_ = g_get_user_cache_dir (); +	_tmp12_ = g_build_filename (_tmp11_, "simple-scan", "simple-scan.log", NULL, NULL);  	_g_free0 (path); -	path = _tmp11_; -	_tmp12_ = fopen (path, "w"); +	path = _tmp12_; +	_tmp13_ = fopen (path, "w");  	_fclose0 (application_log_file); -	application_log_file = _tmp12_; +	application_log_file = _tmp13_;  	g_log_set_default_handler (_application_log_cb_glog_func, NULL); -	_tmp13_ = getpid (); -	g_debug ("simple-scan.vala:507: Starting Simple Scan %s, PID=%i", VERSION, (gint) _tmp13_); -	_tmp14_ = application_new (device); -	app = _tmp14_; +	_tmp14_ = getpid (); +	g_debug ("simple-scan.vala:586: Starting Simple Scan %s, PID=%i", VERSION, (gint) _tmp14_); +	_tmp15_ = application_new (device); +	app = _tmp15_;  	application_start (app);  	gtk_main ();  	result = EXIT_SUCCESS; diff --git a/src/simple-scan.vala b/src/simple-scan.vala index 0ced7ad..cff06f8 100644 --- a/src/simple-scan.vala +++ b/src/simple-scan.vala @@ -13,6 +13,7 @@ public class Application  {      static bool show_version;      static bool debug_enabled; +    static string? fix_pdf_filename = null;      public static const OptionEntry[] options =      {          { "version", 'v', 0, OptionArg.NONE, ref show_version, @@ -21,6 +22,8 @@ public class Application          { "debug", 'd', 0, OptionArg.NONE, ref debug_enabled,            /* Help string for command line --debug flag */            N_("Print debugging messages"), null}, +        { "fix-pdf", 0, 0, OptionArg.STRING, ref fix_pdf_filename, +          N_("Fix PDF files generated with older versions of Simple Scan"), "FILENAME..."},          { null }      };      private static Timer log_timer; @@ -455,6 +458,67 @@ public class Application      {          scanner.redetect ();      } +     +    private static void fix_pdf (string filename) throws Error +    { +        uint8[] data; +        FileUtils.get_data (filename, out data); + +        var fixed_file = FileStream.open (filename + ".fixed", "w"); + +        var offset = 0; +        var line_number = 0; +        var xref_offset = 0; +        var xref_line = -1; +        var xref_regex = new Regex ("^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d 0000 n$"); +        MatchInfo xref_match; +        var line = new StringBuilder (); +        while (offset < data.length) +        { +            var end_offset = offset; +            line.assign (""); +            while (end_offset < data.length) +            { +                var c = data[end_offset]; +                line.append_c ((char) c); +                end_offset++; +                if (c == '\n') +                    break; +            } + +            if (line.str == "startxref\n") +                xref_line = line_number; + +            /* Fix PDF header and binary comment */ +            if (line_number < 2 && line.str.has_prefix ("%%")) +            { +                xref_offset--; +                fixed_file.printf ("%s", line.str.substring (1)); +            } + +            /* Fix xref format */ +            else if (xref_regex.match (line.str, 0, out xref_match)) +                fixed_file.printf ("%010d 00000 n \n", int.parse (xref_match.get_string ()) + xref_offset); + +            /* Fix xref offset */ +            else if (xref_line > 0 && line_number == xref_line + 1) +                fixed_file.printf ("%d\n".printf (int.parse (line.str) + xref_offset)); + +            /* Fix EOF marker */ +            else if (line_number == xref_line + 2 && line.str.has_prefix ("%%%%")) +                fixed_file.printf ("%s", line.str.substring (2)); + +            else +                for (var i = offset; i < end_offset; i++) +                    fixed_file.putc ((char) data[i]); + +            line_number++; +            offset = end_offset; +        } +         +        if (FileUtils.rename (filename, filename + "~") >= 0) +            FileUtils.rename (filename + ".fixed", filename); +    }      public static int main (string[] args)      { @@ -487,6 +551,21 @@ public class Application              stderr.printf ("simple-scan %s\n", Config.VERSION);              return Posix.EXIT_SUCCESS;          } +        if (fix_pdf_filename != null) +        { +            try +            { +                fix_pdf (fix_pdf_filename); +                for (var i = 1; i < args.length; i++) +                    fix_pdf (args[i]); +            } +            catch (Error e) +            { +                stderr.printf ("Error fixing PDF file: %s", e.message); +                return Posix.EXIT_FAILURE;                 +            } +            return Posix.EXIT_SUCCESS; +        }          ScanDevice? device = null;          if (args.length > 1) @@ -1191,11 +1191,11 @@ static gboolean simple_scan_save_document (SimpleScan* self, gboolean force_choo  	{  		book_save (self->priv->book, format, file, &_inner_error_);  		if (_inner_error_ != NULL) { -			goto __catch10_g_error; +			goto __catch11_g_error;  		}  	} -	goto __finally10; -	__catch10_g_error: +	goto __finally11; +	__catch11_g_error:  	{  		GError* e = NULL;  		const gchar* _tmp16_ = NULL; @@ -1212,7 +1212,7 @@ static gboolean simple_scan_save_document (SimpleScan* self, gboolean force_choo  		_g_free0 (uri);  		return result;  	} -	__finally10: +	__finally11:  	if (_inner_error_ != NULL) {  		_g_free0 (format);  		_g_free0 (uri_lower); @@ -1769,12 +1769,12 @@ static gchar* simple_scan_get_temporary_filename (SimpleScan* self, const gchar*  		path = _tmp1_;  		fd = _tmp2_;  		if (_inner_error_ != NULL) { -			goto __catch11_g_error; +			goto __catch12_g_error;  		}  		close (fd);  	} -	goto __finally11; -	__catch11_g_error: +	goto __finally12; +	__catch12_g_error:  	{  		GError* e = NULL;  		e = _inner_error_; @@ -1786,7 +1786,7 @@ static gchar* simple_scan_get_temporary_filename (SimpleScan* self, const gchar*  		_g_free0 (filename);  		return result;  	} -	__finally11: +	__finally12:  	if (_inner_error_ != NULL) {  		_g_free0 (path);  		_g_free0 (filename); @@ -1820,11 +1820,11 @@ static void simple_scan_show_page_cb (SimpleScan* self, BookView* view, Page* pa  	{  		page_save (page, "tiff", file, &_inner_error_);  		if (_inner_error_ != NULL) { -			goto __catch12_g_error; +			goto __catch13_g_error;  		}  	} -	goto __finally12; -	__catch12_g_error: +	goto __finally13; +	__catch13_g_error:  	{  		GError* e = NULL;  		const gchar* _tmp2_ = NULL; @@ -1837,7 +1837,7 @@ static void simple_scan_show_page_cb (SimpleScan* self, BookView* view, Page* pa  		_g_free0 (path);  		return;  	} -	__finally12: +	__finally13:  	if (_inner_error_ != NULL) {  		_g_object_unref0 (file);  		_g_free0 (path); @@ -1857,11 +1857,11 @@ static void simple_scan_show_page_cb (SimpleScan* self, BookView* view, Page* pa  		gtk_show_uri (_tmp3_, _tmp5_, _tmp6_, &_inner_error_);  		_g_free0 (_tmp5_);  		if (_inner_error_ != NULL) { -			goto __catch13_g_error; +			goto __catch14_g_error;  		}  	} -	goto __finally13; -	__catch13_g_error: +	goto __finally14; +	__catch14_g_error:  	{  		GError* e = NULL;  		const gchar* _tmp7_ = NULL; @@ -1871,7 +1871,7 @@ static void simple_scan_show_page_cb (SimpleScan* self, BookView* view, Page* pa  		simple_scan_show_error_dialog (self, _tmp7_, e->message);  		_g_error_free0 (e);  	} -	__finally13: +	__finally14:  	if (_inner_error_ != NULL) {  		_g_object_unref0 (file);  		_g_free0 (path); @@ -2266,11 +2266,11 @@ void G_MODULE_EXPORT print_button_clicked_cb (GtkWidget* widget, SimpleScan* sel  	{  		gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, self->priv->window, &_inner_error_);  		if (_inner_error_ != NULL) { -			goto __catch14_g_error; +			goto __catch15_g_error;  		}  	} -	goto __finally14; -	__catch14_g_error: +	goto __finally15; +	__catch15_g_error:  	{  		GError* e = NULL;  		e = _inner_error_; @@ -2278,7 +2278,7 @@ void G_MODULE_EXPORT print_button_clicked_cb (GtkWidget* widget, SimpleScan* sel  		g_warning ("ui.vala:1044: Error printing: %s", e->message);  		_g_error_free0 (e);  	} -	__finally14: +	__finally15:  	if (_inner_error_ != NULL) {  		_g_object_unref0 (print);  		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); @@ -2300,11 +2300,11 @@ void G_MODULE_EXPORT help_contents_menuitem_activate_cb (GtkWidget* widget, Simp  		_tmp1_ = gtk_get_current_event_time ();  		gtk_show_uri (_tmp0_, "ghelp:simple-scan", _tmp1_, &_inner_error_);  		if (_inner_error_ != NULL) { -			goto __catch15_g_error; +			goto __catch16_g_error;  		}  	} -	goto __finally15; -	__catch15_g_error: +	goto __finally16; +	__catch16_g_error:  	{  		GError* e = NULL;  		const gchar* _tmp2_ = NULL; @@ -2314,7 +2314,7 @@ void G_MODULE_EXPORT help_contents_menuitem_activate_cb (GtkWidget* widget, Simp  		simple_scan_show_error_dialog (self, _tmp2_, e->message);  		_g_error_free0 (e);  	} -	__finally15: +	__finally16:  	if (_inner_error_ != NULL) {  		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);  		g_clear_error (&_inner_error_); @@ -2820,11 +2820,11 @@ static void simple_scan_load (SimpleScan* self) {  	{  		gtk_builder_add_from_file (self->priv->builder, filename, &_inner_error_);  		if (_inner_error_ != NULL) { -			goto __catch16_g_error; +			goto __catch17_g_error;  		}  	} -	goto __finally16; -	__catch16_g_error: +	goto __finally17; +	__catch17_g_error:  	{  		GError* e = NULL;  		const gchar* _tmp3_ = NULL; @@ -2838,7 +2838,7 @@ static void simple_scan_load (SimpleScan* self) {  		exit (EXIT_FAILURE);  		_g_error_free0 (e);  	} -	__finally16: +	__finally17:  	if (_inner_error_ != NULL) {  		_g_free0 (filename);  		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); | 
