1/*
2 * "$Id: lpmove.c 11093 2013-07-03 20:48:42Z msweet $"
3 *
4 *   "lpmove" command for CUPS.
5 *
6 *   Copyright 2007-2010 by Apple Inc.
7 *   Copyright 1997-2006 by Easy Software Products.
8 *
9 *   These coded instructions, statements, and computer programs are the
10 *   property of Apple Inc. and are protected by Federal copyright
11 *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
12 *   which should have been included with this file.  If this file is
13 *   file is missing or damaged, see the license at "http://www.cups.org/".
14 *
15 * Contents:
16 *
17 *   main()     - Parse options and move jobs.
18 *   move_job() - Move a job.
19 */
20
21/*
22 * Include necessary headers...
23 */
24
25#include <cups/cups-private.h>
26
27
28/*
29 * Local functions...
30 */
31
32static int	move_job(http_t *http, const char *src, int jobid,
33		         const char *dest);
34
35
36/*
37 * 'main()' - Parse options and show status information.
38 */
39
40int
41main(int  argc,				/* I - Number of command-line arguments */
42     char *argv[])			/* I - Command-line arguments */
43{
44  int		i;			/* Looping var */
45  http_t	*http;			/* Connection to server */
46  const char	*job;			/* Job name */
47  int		jobid;			/* Job ID */
48  int		num_dests;		/* Number of destinations */
49  cups_dest_t	*dests;			/* Destinations */
50  const char	*src,			/* Original queue */
51		*dest;			/* New destination */
52
53
54  _cupsSetLocale(argv);
55
56  dest      = NULL;
57  dests     = NULL;
58  job       = NULL;
59  jobid     = 0;
60  num_dests = 0;
61  src       = NULL;
62
63  for (i = 1; i < argc; i ++)
64    if (argv[i][0] == '-')
65      switch (argv[i][1])
66      {
67        case 'E' : /* Encrypt */
68#ifdef HAVE_SSL
69	    cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
70
71#else
72            _cupsLangPrintf(stderr,
73	                    _("%s: Sorry, no encryption support."),
74	                    argv[0]);
75#endif /* HAVE_SSL */
76	    break;
77
78        case 'h' : /* Connect to host */
79	    if (argv[i][2] != '\0')
80	      cupsSetServer(argv[i] + 2);
81	    else
82	    {
83	      i ++;
84
85	      if (i >= argc)
86	      {
87	        _cupsLangPuts(stderr,
88		              _("Error: need hostname after \"-h\" option."));
89		return (1);
90              }
91
92	      cupsSetServer(argv[i]);
93	    }
94	    break;
95
96	default :
97	    _cupsLangPrintf(stderr, _("lpmove: Unknown option \"%c\"."),
98	                    argv[i][1]);
99	    return (1);
100      }
101    else if (!jobid && !src)
102    {
103      if (num_dests == 0)
104        num_dests = cupsGetDests(&dests);
105
106      if ((job = strrchr(argv[i], '-')) != NULL &&
107          cupsGetDest(argv[i], NULL, num_dests, dests) == NULL)
108        jobid = atoi(job + 1);
109      else if (isdigit(argv[i][0] & 255) &&
110               !cupsGetDest(argv[i], NULL, num_dests, dests))
111        jobid = atoi(argv[i]);
112      else
113        src = argv[i];
114    }
115    else if (dest == NULL)
116      dest = argv[i];
117    else
118    {
119      _cupsLangPrintf(stderr, _("lpmove: Unknown argument \"%s\"."), argv[i]);
120      return (1);
121    }
122
123  if ((!jobid && !src) || !dest)
124  {
125    _cupsLangPuts(stdout, _("Usage: lpmove job/src dest"));
126    return (1);
127  }
128
129  http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
130
131  if (http == NULL)
132  {
133    _cupsLangPrintf(stderr, _("lpmove: Unable to connect to server: %s"),
134		    strerror(errno));
135    return (1);
136  }
137
138  return (move_job(http, src, jobid, dest));
139}
140
141
142/*
143 * 'move_job()' - Move a job.
144 */
145
146static int				/* O - 0 on success, 1 on error */
147move_job(http_t     *http,		/* I - HTTP connection to server */
148         const char *src,		/* I - Source queue */
149         int        jobid,		/* I - Job ID */
150	 const char *dest)		/* I - Destination queue */
151{
152  ipp_t	*request;			/* IPP Request */
153  char	job_uri[HTTP_MAX_URI],		/* job-uri */
154	printer_uri[HTTP_MAX_URI];	/* job-printer-uri */
155
156
157  if (!http)
158    return (1);
159
160 /*
161  * Build a CUPS_MOVE_JOB request, which requires the following
162  * attributes:
163  *
164  *    attributes-charset
165  *    attributes-natural-language
166  *    job-uri/printer-uri
167  *    job-printer-uri
168  *    requesting-user-name
169  */
170
171  request = ippNewRequest(CUPS_MOVE_JOB);
172
173  if (jobid)
174  {
175    snprintf(job_uri, sizeof(job_uri), "ipp://localhost/jobs/%d", jobid);
176    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
177        	 job_uri);
178  }
179  else
180  {
181    httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
182                     "localhost", 0, "/printers/%s", src);
183    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
184        	 job_uri);
185  }
186
187  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
188               NULL, cupsUser());
189
190  httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
191                   "ipp", NULL, "localhost", 0, "/printers/%s", dest);
192  ippAddString(request, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri",
193               NULL, printer_uri);
194
195 /*
196  * Do the request and get back a response...
197  */
198
199  ippDelete(cupsDoRequest(http, request, "/jobs"));
200
201  if (cupsLastError() > IPP_OK_CONFLICT)
202  {
203    _cupsLangPrintf(stderr, "lpmove: %s", cupsLastErrorString());
204    return (1);
205  }
206  else
207    return (0);
208}
209
210
211/*
212 * End of "$Id: lpmove.c 11093 2013-07-03 20:48:42Z msweet $".
213 */
214