如何通过CUPS API得知CUPS打印作业失败的原因?
使用CUPS API,我打印了两个打印失败的作业。在CUPS Web界面上,我可以看到它们失败的原因:“不支持的打印数据”。和“无法写入打印数据”。
但是,API似乎不包含这些原因。 cupsGetJobs()
方法返回 cups_job_s
结构,如下所示:
struct cups_job_s {
time_t completed_time;
time_t creation_time;
char *dest;
char *format;
int id;
int priority;
time_t processing_time;
int size;
ipp_jstate_t state;
char *title;
char *user;
};
我检查了所有这些字段,没有一个包含屏幕快照中显示的错误字符串。
最佳答案
我相信这可以归结为job-state-message
属性。要检索作业属性,我相信您必须使用IPP API,例如(未测试):
ipp_t *request = ippNewRequest(IPP_GET_JOBS);
...
ipp_t *response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
...
ipp_attribute_t *attr = ippFindAttribute(response, "job-state-message", IPP_TAG_TEXT);
重要的是要注意,与
job-state
相关的属性可能在接受作业后的某个时刻进行了更新。由于服务器不知道打印是否会真正成功(由于墨菲定律(Murphy's Law)有许多因素),因此该作业被接受,并且在失败时会相应地更新job-state
和相关属性。 job-state-message
不是必需的。如果您希望您的应用程序对这些事件使用react,而不是继续以固定的时间间隔查询CUPS服务器,则可以订阅一些 D-Bus事件(see Apple's implementation)。如果您想使用消费者实现的示例,则可以阅读Printer's Panel code from gnome-control-center。
下面我尝试引用RFC 2911(IPP 1.1)的一些相关部分:
3.1.9创造就业机会
4.3.7工作状态(类型1枚举)
4.3.9作业状态消息(text(MAX))
脚注:我个人没有做过,但是RFC确实告诉您您应该期望什么。