// getPrinters gets the current list and state of printers by calling // C.doRequest (IPP_OP_CUPS_GET_PRINTERS). // // The caller is responsible to C.ippDelete the returned *C.ipp_t response. func (cc *cupsCore) getPrinters(attributes **C.char, attrSize C.int) (*C.ipp_t, error) { // ippNewRequest() returns ipp_t pointer which does not need explicit free. request := C.ippNewRequest(C.IPP_OP_CUPS_GET_PRINTERS) C.ippAddStrings(request, C.IPP_TAG_OPERATION, C.IPP_TAG_KEYWORD, C.REQUESTED_ATTRIBUTES, attrSize, nil, attributes) response, err := cc.doRequest(request, []C.ipp_status_t{C.IPP_STATUS_OK, C.IPP_STATUS_ERROR_NOT_FOUND}) if err != nil { err = fmt.Errorf("Failed to call cupsDoRequest() [IPP_OP_CUPS_GET_PRINTERS]: %s", err) return nil, err } return response, nil }
// getJobAttributes gets the requested attributes for a job by calling // C.doRequest (IPP_OP_GET_JOB_ATTRIBUTES). // // The caller is responsible to C.ippDelete the returned *C.ipp_t response. func (cc *cupsCore) getJobAttributes(jobID C.int, attributes **C.char) (*C.ipp_t, error) { uri, err := createJobURI(jobID) if err != nil { return nil, err } defer C.free(unsafe.Pointer(uri)) // ippNewRequest() returns ipp_t pointer does not need explicit free. request := C.ippNewRequest(C.IPP_OP_GET_JOB_ATTRIBUTES) C.ippAddString(request, C.IPP_TAG_OPERATION, C.IPP_TAG_URI, C.JOB_URI_ATTRIBUTE, nil, uri) C.ippAddStrings(request, C.IPP_TAG_OPERATION, C.IPP_TAG_KEYWORD, C.REQUESTED_ATTRIBUTES, C.int(0), nil, attributes) response, err := cc.doRequest(request, []C.ipp_status_t{C.IPP_STATUS_OK}) if err != nil { err = fmt.Errorf("Failed to call cupsDoRequest() [IPP_OP_GET_JOB_ATTRIBUTES]: %s", err) return nil, err } return response, nil }