[cups.general] Need help for modify job-state attribute with an IPP request

Ludovic Hutin lhutin at umb.u-strasbg.fr
Wed Sep 1 04:08:21 PDT 2004


Hello,

I want to create my own fonction in C with this i can del or change the 
attribut JOB-HOLD-UNTIL attribute to now.
I can del a job with the cups fonction cupsCancelJob(dest,nbjob);
but for changing the job state to IPP_JOB_PENDING i try to do a ipp 
request and i receive the answer : "bad request" at each time ...
if you can help me for the request.

i must release job by hand in order to print the queue list in 
differents order like cups do.
Thanks for help


Here is the source code.

Ludovic HUTIN
Université Marc Bloch

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cups/cups.h>
#include <cups/language.h>

int main(int argc, char * argv[])
{
    http_t     *http ; // Connection to server
    cups_lang_t    *language ;// Langage par defaut
    char *dest, *user ;
    int resu, status ;
    long nbjob ;
 
  if ( argc != 5)
    {
        printf("Usage : setjob printer user numberjob status\n") ;
        return (1) ;
    }
    dest = argv[1] ;
    user = argv[2] ;
    nbjob = atoi(argv[3]) ;
    status = atoi(argv[4]) ;
   
    if (( http = 
httpConnectEncrypt(cupsServer(),ippPort(),cupsEncryption())) == NULL )
    {
        fputs("Test : Connection impossible au serveur !\n",stderr);
        return (1) ;
    }
   
    // On fait une request avec le nom de l'imprimante et le nom du user
   
    if ( status == 2 ) // We del the jobs
    {
        resu = cupsCancelJob(dest,nbjob);
        return (1) ;
    }
    else if ( status == 1 )
    {
        resu = set_jobs(http,dest,user,nbjob) ;
    }
    else
    {
        printf("Erreur 1") ;
        return (0) ;
      }
}

int            /* O - Number of jobs in queue */
set_jobs(http_t     *http,    /* I - HTTP connection to server */
          const char *dest,    /* I - Destination */
      const char *user,    /* USER */
      const long *nbjob)    /* I - Numero du jobs */
{
  ipp_t        *request,    /* IPP Request */
        *response;    /* IPP Response */
  ipp_attribute_t *attr;    /* Current attribute */
  cups_lang_t    *language;    /* Default language */


  if (http == NULL)
    return (0);

  request = ippNew();

  request->request.op.operation_id = IPP_SET_JOB_ATTRIBUTES;
  request->request.op.request_id   = 1;

  language = cupsLangDefault();

  attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
                      "attributes-charset", NULL, 
cupsLangEncoding(language));

  attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
                      "attributes-natural-language", NULL, 
language->language);

  snprintf(resource, sizeof(resource), "ipp://localhost/printers/%s", dest);
  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", 
NULL, resource);
 
  snprintf(resource, sizeof(resource), "ipp://localhost/jobs/%d", nbjob);
  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, 
resource);
 
  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_JOB,
                 "requesting-user-name", NULL, user);
  ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1);
 
  ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER,
                 "job-state", IPP_JOB_PENDING);
 
/*
  * REQUEST -> RESPONSE  */
 
 if ((response = cupsDoRequest(http, request, "/")) != NULL)
  {
    if (response->request.status.status_code > IPP_OK_CONFLICT)
    {
      fprintf(stderr, "releasejob: failed: %s\n",
              ippErrorString(response->request.status.status_code));
      ippDelete(response);
      return (0);
    }
  }
  else
  {
    fprintf(stderr, "releasejob: get-jobs failed: %s\n", 
ippErrorString(cupsLastError()));
    return (0);
  }
  return (1) ;
}





More information about the cups mailing list