diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-25 20:55:24 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-25 20:55:24 +0000 |
commit | c3183f2e21fafb813ba8a902ed4079d3f2441b21 (patch) | |
tree | 27f6d68bf508f743b36751c0dcea0d1b2c30735c /app/xplsprinters/xplsprinters.c | |
parent | cf87db164aa2401ec33a041d3969d6ccb1ef49d9 (diff) |
Importing from X.Org 7.2RC2
Diffstat (limited to 'app/xplsprinters/xplsprinters.c')
-rw-r--r-- | app/xplsprinters/xplsprinters.c | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/app/xplsprinters/xplsprinters.c b/app/xplsprinters/xplsprinters.c new file mode 100644 index 000000000..5b63fa8b5 --- /dev/null +++ b/app/xplsprinters/xplsprinters.c @@ -0,0 +1,333 @@ +/* + * $Xorg: xlsprinters.c,v 1.1 2002/02/09 22:54:18 gisburn Exp $ + * + * xlsprinters - print information about Xprint printers and their attributes + * + * +Copyright 2002-2004 Roland Mainz <roland.mainz@nrubsig.org> + +All Rights Reserved. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + * + * Author: Roland Mainz <roland.mainz@nrubsig.org> + */ + +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/XprintUtil/xprintutil.h> + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +/* Turn a NULL pointer string into an empty string */ +#define NULLSTR(x) (((x)!=NULL)?(x):("")) + +#define BOOL2STR(x) ((x)?("true"):("false")) + +static const char *ProgramName; + +static +void usage(void) +{ + fprintf (stderr, "usage: %s [options]\n", ProgramName); + fprintf (stderr, "-printer printername\tprinter to use\n"); + fprintf (stderr, "-l\tlist detailed printer info\n"); + fprintf (stderr, "-dump\tdump all available printer attrbutes\n"); + fprintf (stderr, "\n"); + exit(EXIT_FAILURE); +} + +static +void dumpAttributes( Display *pdpy, XPContext pcontext ) +{ + char *s; + printf("--> Job\n%s\n", s=XpuGetJobAttributes(pdpy, pcontext)); XFree(s); + printf("--> Doc\n%s\n", s=XpuGetDocAttributes(pdpy, pcontext)); XFree(s); + printf("--> Page\n%s\n", s=XpuGetPageAttributes(pdpy, pcontext)); XFree(s); + printf("--> Printer\n%s\n", s=XpuGetPrinterAttributes(pdpy, pcontext)); XFree(s); + printf("--> Server\n%s\n", s=XpuGetServerAttributes(pdpy, pcontext)); XFree(s); + printf("image resolution %d\n", (int)XpGetImageResolution(pdpy, pcontext)); +} + +static +void print_medium_sizes( Display *pdpy, XPContext pcontext ) +{ + XpuMediumSourceSizeList list; + int list_count; + char *value; + int i; + + value = XpGetOneAttribute(pdpy, pcontext, XPDocAttr, "default-medium"); + if( value ) + { + printf("\tdefault-medium=%s\n", NULLSTR(value)); + XFree(value); + } + value = XpGetOneAttribute(pdpy, pcontext, XPDocAttr, "default-input-tray"); + if( value ) + { + printf("\tdefault-input-tray=%s\n", NULLSTR(value)); + XFree(value); + } + + list = XpuGetMediumSourceSizeList(pdpy, pcontext, &list_count); + if( !list ) + { + fprintf(stderr, "XpuGetMediumSourceSizeList returned NULL\n"); + return; + } + + for( i = 0 ; i < list_count ; i++ ) + { + XpuMediumSourceSizeRec *curr = &list[i]; + if( curr->tray_name ) + { + printf("\tmedium-source-sizes-supported=%s/%s %s %g %g %g %g\n", + curr->tray_name, curr->medium_name, BOOL2STR(curr->mbool), + curr->ma1, curr->ma2, curr->ma3, curr->ma4); + } + else + { + printf("\tmedium-source-sizes-supported=%s %s %g %g %g %g\n", + curr->medium_name, BOOL2STR(curr->mbool), + curr->ma1, curr->ma2, curr->ma3, curr->ma4); + } + } + + XpuFreeMediumSourceSizeList(list); +} + + +static +void print_resolutions( Display *pdpy, XPContext pcontext ) +{ + XpuResolutionList list; + int list_count; + int i; + char *defresname; /* name of default resolution */ + + list = XpuGetResolutionList(pdpy, pcontext, &list_count); + if( !list ) + { + fprintf(stderr, "XpuGetResolutionList returned NULL\n"); + return; + } + + defresname = XpGetOneAttribute(pdpy, pcontext, XPDocAttr, "default-printer-resolution"); + if( defresname ) + { + XpuResolutionRec *res = XpuFindResolutionByName(list, list_count, defresname); + if( res ) + { + printf("\tdefault-printer-resolution=%s (%ldx%ld)\n", res->name, res->x_dpi, res->y_dpi); + } + else + { + fprintf(stderr, "XpuFindResolutionByName() returned no match for default resolution '%s'\n", + defresname); + } + XFree(defresname); + } + + for( i = 0 ; i < list_count ; i++ ) + { + XpuResolutionRec *curr = &list[i]; + printf("\tresolution=%s (%ldx%ld)\n", curr->name, curr->x_dpi, curr->y_dpi); + } + + XpuFreeResolutionList(list); +} + +static +void print_orientations( Display *pdpy, XPContext pcontext ) +{ + char *default_orientation; + XpuOrientationList list; + int list_count; + int i; + + default_orientation = XpGetOneAttribute(pdpy, pcontext, XPDocAttr, "content-orientation"); + if( default_orientation ) + { + printf("\tdefault_orientation=%s\n", default_orientation); + XFree(default_orientation); + } + + list = XpuGetOrientationList(pdpy, pcontext, &list_count); + if( !list || list_count == 0 ) + { + fprintf(stderr, "XpuGetOrientationList returned NULL\n"); + return; + } + + for( i = 0 ; i < list_count ; i++ ) + { + XpuOrientationRec *curr = &list[i]; + printf("\torientation=%s\n", curr->orientation); + } + + XpuFreeOrientationList(list); +} + +static +void print_plexes( Display *pdpy, XPContext pcontext ) +{ + char *default_plex; + XpuPlexList list; + int list_count; + int i; + + default_plex = XpGetOneAttribute(pdpy, pcontext, XPDocAttr, "plex"); + if( default_plex ) + { + printf("\tdefault_plex=%s\n", default_plex); + XFree(default_plex); + } + + list = XpuGetPlexList(pdpy, pcontext, &list_count); + if( !list || list_count == 0 ) + { + fprintf(stderr, "XpGetOneAttribute returned NULL\n"); + return; + } + + for( i = 0 ; i < list_count ; i++ ) + { + XpuPlexRec *curr = &list[i]; + printf("\tplex=%s\n", curr->plex); + } + + XpuFreePlexList(list); +} + +static +void print_detailed_printer_info(XPPrinterRec *xp_rec, int detailLevel) +{ + Display *pdpy; /* X connection */ + XPContext pcontext; /* Xprint context */ + + if( detailLevel < 2 ) + return; + + if( XpuGetPrinter(xp_rec->name, &pdpy, &pcontext) != 1 ) + { + fprintf(stderr, "Cannot open printer '%s'\n", xp_rec->name); + return; + } + + printf("printer: %s\n", xp_rec->name); + printf("\tdescription=%s\n", NULLSTR(xp_rec->desc)); + printf("\tmodel-identifier=%s\n", NULLSTR(XpGetOneAttribute(pdpy, pcontext, XPPrinterAttr, "xp-model-identifier"))); + + print_medium_sizes(pdpy, pcontext); + print_resolutions(pdpy, pcontext); + print_orientations(pdpy, pcontext); + print_plexes(pdpy, pcontext); + + if (detailLevel > 100) + dumpAttributes(pdpy, pcontext); + + XpuClosePrinterDisplay(pdpy, pcontext); +} + +static +void print_printer_info(XPPrinterRec *xp_rec, int detailLevel) +{ + printf("printer: %s\n", xp_rec->name); + + if( detailLevel < 1 ) + return; + + printf("\tdescription=%s\n", NULLSTR(xp_rec->desc)); +} + +int main (int argc, char *argv[]) +{ + char *printername = NULL; /* printer to query */ + int details = 0; + Bool use_threadsafe_api = False; /* Use threadsafe API (for debugging) */ + int i; /* temp variable: iterator */ + XPPrinterList plist; /* list of printers */ + int plist_count; /* number of entries in |plist|-array */ + + + ProgramName = argv[0]; + + for( i = 1 ; i < argc ; i++ ) + { + char *arg = argv[i]; + int len = strlen(arg); + + if( !strncmp("-printer", arg, len) ) + { + if (++i >= argc) + usage (); + printername = argv[i]; + } + else if( !strncmp("-d", arg, len) ) + { + details = 1; + } + else if( !strncmp("-l", arg, len) ) + { + details = 2; + } + else if( !strncmp("-dump", arg, len) ) + { + details = 255; + } + else if( !strncmp("-debug_use_threadsafe_api", arg, len) ) + { + use_threadsafe_api = True; + } + else + { + usage(); + } + } + + if( use_threadsafe_api ) + { + if( !XInitThreads() ) + { + fprintf(stderr, "%s: XInitThreads() failure.\n", ProgramName); + exit(EXIT_FAILURE); + } + } + + plist = XpuGetPrinterList(printername, &plist_count); + + if (!plist) { + fprintf(stderr, "%s: no printers found for printer spec \"%s\".\n", + ProgramName, NULLSTR(printername)); + exit(EXIT_FAILURE); + } + + for (i = 0; i < plist_count; i++) + { + if( details < 2) + print_printer_info(&plist[i], details); + else + print_detailed_printer_info(&plist[i], details); + } + + XpuFreePrinterList(plist); + + return(EXIT_SUCCESS); +} + + |