2012-07-19 9 views
1

System V 필터가 설치된 컵에 프로그래밍 방식으로 프린터를 추가해야합니다. 이 올바르게 I 때문에 컵 프린터를 시스템에 추가하는 표시컵 API를 사용하여 System V 필터를 추가하려면 어떻게합니까?

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

: conversaion을 위해서

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); 

: 지금은 프린터를 추가로 요청을 만들려면 다음 코드를 사용하고 다음 명령을 사용하여 인쇄를 보낼 수 있습니다 내 첫번째 생각은 그냥이 /etc/cups/interfaces D에 필터로 사용하기 원하는 파일을 복사하는 것이 었습니다

lp -d myptr test.print 

전화 번호는 myptr입니다. 내가 해냈어, 올바른 사용자, 그룹 및 사용 권한을 준, 그리고 그것은 작동하지 않았다. 나는 심지어 sleep 60을 스크립트 앞에 붙이려고했는데 ps에 나타나지 않았습니다.

나는 다음과 같이 lpadmin를 사용하여 프린터를 추가하는 시도하고 제대로 작동 :

난 이후 cupsacceptcupsenable 전화를해야
lpadmin -h localhost -p myptr2 -v "serial:/dev/pts/12?baud=2400+bits=7+parity=none+flow=none" -i /tmp/my.serial.filter 

하지만 프린터 작업을하고 내 필터를 통해 인쇄를 보냅니다. lpadmin은 내 프로그램에서와 마찬가지로 /tmp의 파일을 /etc/cups/interfaces으로 올바르게 복사하고 myptr2으로 이름을 바꿉니다. 내 생각에 저를 생각하는 컵 구성 파일에서 필터에 대한 참조를 찾을 수 없습니다. 나는 한 걸음도 놓치고있다. 그럼에도 lpadmin과 함께 추가 한 myptr2 프린터는 올바르게 작동하고 API를 사용하여 추가 한 myptr 프린터는 을 인쇄하지만 인쇄를 수행하면 이 아니고이 필터를 통해 인쇄됩니다. 내가 만든 다양한 Google 검색 중

, 나는 CUPS ImplementationHTTP and IPP APIs Documentation을 읽고, 나는에 온 그 가장 가까운 이전에, 읽는 CUPS-Add-Modify-Printer Operation에 대한 주석이,이었다 :

CUPS-Add-Modify-Printer 요청에 선택적으로 프린터에 사용할 PPD 파일 또는 System V 인터페이스 스크립트를 사용할 수 있습니다. "ppd-name"속성은 로컬 CUPS PPD 파일로 요청의 끝 부분에 첨부 된 모든 파일을 겹쳐 씁니다.

하지만 아무 소용, szFilter은 (물론, 별도의 시험에서) 모두 "/tmp/my.serial.filter""/etc/cups/interfaces/myptr"로 설정된

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

사용하려고 나를 이끌었다.

어디에서 잘못 될지 누가 알 수 있습니까?

답변

1

좋아요, 저는 cups 소스 저장소에서 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 예상대로 필터를 통해 이동합니다.

따라서, 최종 용액은 다음과 같이 위에 pstResponse 행을 변경하는 것이다

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