如何通过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确实告诉您您应该期望什么。

10-07 19:17
查看更多