// GetPrinters gets all CUPS printers found on the CUPS server. func (c *CUPS) GetPrinters() ([]lib.Printer, error) { pa := C.newArrayOfStrings(C.int(len(c.printerAttributes))) defer C.freeStringArrayAndStrings(pa, C.int(len(c.printerAttributes))) for i, a := range c.printerAttributes { C.setStringArrayValue(pa, C.int(i), C.CString(a)) } response, err := c.cc.getPrinters(pa, C.int(len(c.printerAttributes))) if err != nil { return nil, err } // cupsDoRequest() returns ipp_t pointer which needs explicit free. defer C.ippDelete(response) if C.getIPPRequestStatusCode(response) == C.IPP_STATUS_ERROR_NOT_FOUND { // Normal error when there are no printers. return make([]lib.Printer, 0), nil } printers := c.responseToPrinters(response) printers = filterRawPrinters(printers) printers = c.addPPDDescriptionToPrinters(printers) printers = addStaticDescriptionToPrinters(printers) return printers, nil }
// doRequest calls cupsDoRequest(). func (cc *cupsCore) doRequest(request *C.ipp_t, acceptableStatusCodes []C.ipp_status_t) (*C.ipp_t, error) { http, err := cc.connect() if err != nil { return nil, err } defer cc.disconnect(http) if C.ippValidateAttributes(request) != 1 { return nil, fmt.Errorf("Bad IPP request: %s", C.GoString(C.cupsLastErrorString())) } response := C.cupsDoRequest(http, request, C.POST_RESOURCE) if response == nil { return nil, fmt.Errorf("cupsDoRequest failed: %d %s", int(C.cupsLastError()), C.GoString(C.cupsLastErrorString())) } statusCode := C.getIPPRequestStatusCode(response) for _, sc := range acceptableStatusCodes { if statusCode == sc { return response, nil } } return nil, fmt.Errorf("IPP status code %d", int(statusCode)) }