2012-07-19 51 views
1

我需要以編程方式將打印機添加到安裝了System V過濾器的杯子中。現在我用下面的代碼創建請求添加打印機:如何使用cups API添加System V過濾器?

pstRequest = ippNew(); 

pstRequest->request.op.operation_id = CUPS_ADD_PRINTER; 
pstRequest->request.any.request_id = 1; 

ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "us-ascii"); 
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, "en"); 

ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); 
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_URI, "device-uri", NULL, szUri); 
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, szPrinterUri); 
ippAddInteger(pstRequest, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", IPP_PRINTER_IDLE); 
ippAddBoolean(pstRequest, IPP_TAG_PRINTER, "printer-is-accepting-jobs", true); 

對於conversaion的緣故:

szUri  = "serial:/dev/pts/12?baud=2400+bits=7+parity=none+flow=none"; 
szPrinterUri = "ipp://localhost/printers/myptr"; 

這似乎與打印機正確添加到杯子的系統,因爲我然後,可以使用下面的命令發送打印它:

lp -d myptr test.print 

我首先想到的是把剛纔複製,我想作爲過濾器使用到/etc/cups/interfaces d文件irectory並將其稱爲myptr。我這樣做,給了它正確的用戶,組和權限,它似乎沒有工作。我甚至嘗試在腳本的前面粘貼sleep 60,並且它從未出現在ps中。

我嘗試添加使用lpadmin如下打印機,它能夠正常工作:

lpadmin -h localhost -p myptr2 -v "serial:/dev/pts/12?baud=2400+bits=7+parity=none+flow=none" -i /tmp/my.serial.filter 

我要叫cupsacceptcupsenable之後,但打印機的工作原理,並通過我的過濾器將打印。 lpadmin正確地複製文件/tmp/etc/cups/interfaces並將其命名爲myptr2,就像我在我的程序中所做的一樣,並且在我的生活中,我無法找到任何引用過濾器的任何cup配置文件,這些文件使我想到我錯過了一步。儘管如此,我用lpadmin添加的myptr2打印機工作正常,而我使用API​​添加的myptr打印機,而它確實打印,確實不是打印通過過濾器。

在我所做的各種谷歌搜索,我已經通過CUPS ImplementationHTTP and IPP APIs Documentation閱讀,那我來最接近的是,在前者中,存在對讀取CUPS-Add-Modify-Printer Operation評論:

CUPS-Add-Modify-Printer請求可以選擇跟隨一個PPD文件或系統V接口腳本來用於打印機。 「ppd-name」屬性用本地CUPS PPD文件覆蓋附加到請求末尾的任何文件。

這使我使用

ippAddString(pstRequest, IPP_TAG_PRINTER, IPP_TAG_NAME, "ppd-name", NULL, szFilter); 

與szFilter設置爲兩個"/tmp/my.serial.filter""/etc/cups/interfaces/myptr"(在單獨的測試,當然)的嘗試,但都無濟於事。

任何人都可以告訴我哪裏可能會出錯嗎?

回答

1

好的,我從杯子源代碼倉庫獲得了lpadmin的源代碼,答案比我試圖做的更容易。顯然,我在最初的發帖中沒有包含足夠的信息來源。從上面的代碼段後,我打電話以下幾點:

pstHttpServer = httpConnectEncrypt("localhost", ippPort(), cupsEncryption()); 
pstResponse = cupsDoFileRequest(pstHttpServer, pstRequest, "/admin/", NULL); 
ippDelete(pstResponse); 
httpClose(pstHttpServer); 

(適用錯誤檢查,當然)

回答我的問題是,在NULL指針,我是路過的第四參數爲cupsDoFileRequest。如上所述,「CUPS-Add-Modify-Printer請求可以選擇跟隨一個PPD文件或System V接口腳本。」我沒有將兩者綁在一起,但是這句話指的是cupsDoFileRequest的第四個參數,其中如果我放置了我的過濾器的路徑"/tmp/my.serial.filter",請求成功並且my.serial.filter被正確複製爲/etc/cups/interfaces,作爲myptr,之後所有我的打印到myptr按預期方式通過過濾器。

因此,最終的解決方案是改變上面如下pstResponse行:

pstResponse = cupsDoFileRequest(pstHttpServer, pstRequest, "/admin/", "/tmp/my.serial.filter");