// 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 }
// 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.ippGetStatusCode(response) == C.IPP_STATUS_ERROR_NOT_FOUND { // Normal error when there are no printers. return make([]lib.Printer, 0), nil } printers := c.responseToPrinters(response) for i := range printers { printers[i].GCPVersion = lib.GCPAPIVersion printers[i].ConnectorVersion = lib.ShortName printers[i].SetupURL = lib.ConnectorHomeURL printers[i].SupportURL = lib.ConnectorHomeURL printers[i].UpdateURL = lib.ConnectorHomeURL } printers = c.addDescriptionToPrinters(printers) return printers, nil }
// GetJobState gets the current state of the job indicated by jobID. func (c *CUPS) GetJobState(jobID uint32) (cdd.PrintJobStateDiff, error) { ja := C.newArrayOfStrings(C.int(len(jobAttributes))) defer C.freeStringArrayAndStrings(ja, C.int(len(jobAttributes))) for i, attribute := range jobAttributes { C.setStringArrayValue(ja, C.int(i), C.CString(attribute)) } response, err := c.cc.getJobAttributes(C.int(jobID), ja) if err != nil { return cdd.PrintJobStateDiff{}, err } // cupsDoRequest() returned ipp_t pointer needs explicit free. defer C.ippDelete(response) s := C.ippFindAttribute(response, C.JOB_STATE, C.IPP_TAG_ENUM) state := int32(C.ippGetInteger(s, C.int(0))) p := C.ippFindAttribute(response, C.JOB_MEDIA_SHEETS_COMPLETED, C.IPP_TAG_INTEGER) var pages int32 if p != nil { pages = int32(C.ippGetInteger(p, C.int(0))) } return convertJobState(state, pages), nil }
// GetJobState gets the current state of the job indicated by jobID. func (c *CUPS) GetJobState(_ string, jobID uint32) (*cdd.PrintJobStateDiff, error) { ja := C.newArrayOfStrings(C.int(len(jobAttributes))) defer C.freeStringArrayAndStrings(ja, C.int(len(jobAttributes))) for i, attribute := range jobAttributes { C.setStringArrayValue(ja, C.int(i), C.CString(attribute)) } response, err := c.cc.getJobAttributes(C.int(jobID), ja) if err != nil { return nil, err } // cupsDoRequest() returned ipp_t pointer needs explicit free. defer C.ippDelete(response) s := C.ippFindAttribute(response, C.JOB_STATE, C.IPP_TAG_ENUM) state := int32(C.getAttributeIntegerValue(s, C.int(0))) return convertJobState(state), nil }