1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
#include "list.h"
#include "ida.h"
#include "readers.h"
#include "filebutton.h"
#include "fileops.h"
#include <jpeglib.h>
#include "transupp.h" /* Support routines for jpegtran */
#include "jpegtools.h"
/*----------------------------------------------------------------------*/
struct jobqueue {
struct list_head list;
char *op;
char *filename;
char *args;
};
static LIST_HEAD(jobs);
static XtWorkProcId jobproc;
/*----------------------------------------------------------------------*/
static Boolean job_worker(XtPointer clientdata)
{
struct jobqueue *job;
unsigned int flags =
JFLAG_TRANSFORM_IMAGE |
JFLAG_TRANSFORM_THUMBNAIL |
JFLAG_UPDATE_ORIENTATION;
if (list_empty(&jobs)) {
/* nothing to do */
jobproc = 0;
return TRUE;
}
job = list_entry(jobs.next, struct jobqueue, list);
/* process job */
if (debug)
fprintf(stderr,"job worker: %s %s\n",job->op,job->filename);
ptr_busy();
if (0 == strcmp(job->op,"rotexif")) {
jpeg_transform_inplace(job->filename, -1/*auto*/,
NULL, NULL, 0, flags);
} else if (0 == strcmp(job->op,"rotcw")) {
jpeg_transform_inplace(job->filename, JXFORM_ROT_90,
NULL, NULL, 0, flags);
} else if (0 == strcmp(job->op,"rotccw")) {
jpeg_transform_inplace(job->filename, JXFORM_ROT_270,
NULL, NULL, 0, flags);
} else if (0 == strcmp(job->op,"comment")) {
jpeg_transform_inplace(job->filename, JXFORM_NONE, job->args,
NULL, 0,
JFLAG_UPDATE_COMMENT);
} else {
fprintf(stderr,"job: \"%s\" is *unknown*\n",job->op);
}
ptr_idle();
fileinfo_invalidate(job->filename);
/* cleanup */
list_del(&job->list);
free(job->filename);
free(job->op);
if (job->args)
free(job->args);
free(job);
return FALSE;
}
/*----------------------------------------------------------------------*/
void job_submit(char *op, char *filename, char *args)
{
struct jobqueue *job;
job = malloc(sizeof(*job));
memset(job,0,sizeof(*job));
job->op = strdup(op);
job->filename = strdup(filename);
if (args)
job->args = strdup(args);
list_add_tail(&job->list,&jobs);
if (debug)
fprintf(stderr,"job submit: %s %s\n",job->op,job->filename);
if (0 == jobproc)
jobproc = XtAppAddWorkProc(app_context,job_worker,NULL);
}
|