int job_implObj::submit(const std::string_view &title) { size_t s=title.size(); char title_str[s+1]; std::copy(title.begin(), title.end(), title_str); title_str[s]=0; job_info_t::lock job_lock{job_info}; if (job_lock->documents.empty()) return 0; destination_implObj::info_t::lock lock{*destination}; int job_id; auto status=cupsCreateDestJob(lock->http, lock->dest, lock->info, &job_id, title_str, job_lock->num_options, job_lock->options); if (status != IPP_STATUS_OK) throw EXCEPTION(ippErrorString(status)); auto job_sentry=make_sentry([&] { cupsCancelDestJob(lock->http, lock->dest, job_id); }); job_sentry.guard(); for (const auto &doc:job_lock->documents) { auto [mime_type, contents]=doc.document(); auto status=cupsStartDestDocument(lock->http, lock->dest, lock->info, job_id, doc.name.c_str(), mime_type.c_str(), 0, NULL, 0); if (status != HTTP_STATUS_CONTINUE) throw EXCEPTION(httpStatus(status)); auto doc_sentry=make_sentry ([&] { cupsFinishDestDocument(lock->http, lock->dest, lock->info); }); doc_sentry.guard(); while (auto res=contents()) { status=cupsWriteRequestData(lock->http, res->data(), res->size()); if (status != HTTP_STATUS_CONTINUE) throw EXCEPTION(httpStatus(status)); } doc_sentry.unguard(); auto ipp_status=cupsFinishDestDocument(lock->http, lock->dest, lock->info); if (ipp_status != IPP_STATUS_OK) throw EXCEPTION(cupsLastErrorString()); } job_sentry.unguard(); auto ipp_status=cupsCloseDestJob(lock->http, lock->dest, lock->info, job_id); if (ipp_status != IPP_STATUS_OK) throw EXCEPTION(cupsLastErrorString()); return job_id; }
static void print_file(http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ const char *filename, /* I - File to print */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { cups_file_t *fp; /* File to print */ int job_id; /* Job ID */ ipp_status_t status; /* Submission status */ const char *title; /* Title of job */ char buffer[32768]; /* File buffer */ ssize_t bytes; /* Bytes read/to write */ if ((fp = cupsFileOpen(filename, "r")) == NULL) { printf("Unable to open \"%s\": %s\n", filename, strerror(errno)); return; } if ((title = strrchr(filename, '/')) != NULL) title ++; else title = filename; if ((status = cupsCreateDestJob(http, dest, dinfo, &job_id, title, num_options, options)) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED) { printf("Unable to create job: %s\n", cupsLastErrorString()); cupsFileClose(fp); return; } printf("Created job ID: %d\n", job_id); if (cupsStartDestDocument(http, dest, dinfo, job_id, title, CUPS_FORMAT_AUTO, 0, NULL, 1) != HTTP_STATUS_CONTINUE) { printf("Unable to send document: %s\n", cupsLastErrorString()); cupsFileClose(fp); return; } while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) { if (cupsWriteRequestData(http, buffer, (size_t)bytes) != HTTP_STATUS_CONTINUE) { printf("Unable to write document data: %s\n", cupsLastErrorString()); break; } } cupsFileClose(fp); if ((status = cupsFinishDestDocument(http, dest, dinfo)) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED) { printf("Unable to send document: %s\n", cupsLastErrorString()); return; } puts("Job queued."); }