//
//   Sample/test driver interface program for libppd.
//
//   This program handles listing and installing both static PPD files
//   in CUPS_DATADIR/model and dynamically generated PPD files using
//   the driver helper programs in CUPS_SERVERBIN/driver.
//
//   Copyright 2007-2010 by Apple Inc.
//   Copyright 1997-2006 by Easy Software Products.
//
//   Licensed under Apache License v2.0.  See the file "LICENSE" for more
//   information.
//
// Contents:
//
//   main()      - Enumerate or display PPD files.
//   cat_ppd()   - Display a PPD file.
//   list_ppds() - List PPDs.
//
// Compile with:gcc -o testdriver testdriver.c -I.. -lppd -lcups
//

//
// Include necessary headers...
//

#include <ppd/ppd.h>
#include <ppd/string-private.h>
#include <cups/cups.h>


//
// Local functions...
//

static int	cat_ppd(const char *uri);
static int	list_ppds(const char *name);


//
// Sample data...
//

static const char *models[][2] =
		{
		  { "foojet.ppd", "Foo Printer" },
		  { "barjet.ppd", "Bar Printer" },
		  { "foobar.ppd", "Foo/Bar Multifunction Printer" }
		};


//
// 'main()' - Enumerate or display PPD files.
//

int					// O - Exit status
main(int  argc,				// I - Number of command-line args
     char *argv[])			// I - Command-line arguments
{
  if (argc == 2 && !strcmp(argv[1], "list"))
    return (list_ppds(argv[0]));
  else if (argc == 3 && !strcmp(argv[1], "cat"))
    return (cat_ppd(argv[2]));

  fprintf(stderr, "ERROR: Usage: %s cat URI\n", argv[0]);
  fprintf(stderr, "ERROR: Usage: %s list\n", argv[0]);
  return (1);
}


//
// 'cat_ppd()' - Display a PPD file.
//

static int				// O - Exit status
cat_ppd(const char *uri)		// I - PPD URI
{
  int		i;			// Looping var
  char		scheme[255],		// URI scheme
		userpass[255],		// Username/password (unused)
		hostname[255],		// Hostname (unused)
		resource[1024];		// Resource name
  int		port;			// Port (unused)
  const char	*name;			// Pointer to name in URI


  if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme),
                      userpass, sizeof(userpass), hostname, sizeof(hostname),
		      &port, resource, sizeof(resource)) < HTTP_URI_OK)
  {
    fprintf(stderr, "ERROR: Bad URI \"%s\"!\n", uri);
    return (1);
  }

  name = resource + 1;

  for (i = 0 ; i < (int)(sizeof(models) / sizeof(models[0])); i ++)
    if (!strcmp(name, models[i][0]))
    {
      //
      // Actually display the PPD file...
      //

      puts("*PPD-Adobe: \"4.3\"");

      puts("*LanguageEncoding: ISOLatin1");
      puts("*LanguageVersion: English");
      puts("*Manufacturer: \"Test\"");
      puts("*FileVersion: \"1.0\"");
      puts("*FormatVersion: \"4.3\"");
      puts("*PSVersion: \"(3010) 1\"");
      printf("*PCFileName: \"%s\"\n", models[i][0]);

      printf("*Product: \"(%s)\"\n", models[i][1]);
      printf("*ModelName: \"Test %s\"\n", models[i][1]);
      printf("*NickName: \"Test %s\"\n", models[i][1]);
      printf("*ShortNickName: \"Test %s\"\n", models[i][1]);

      puts("*OpenUI PageSize: PickOne"); 
      puts("*OrderDependency: 10 AnySetup *PageSetup");
      puts("*DefaultPageSize: Letter");
      puts("*PageSize Letter: \"<</PageSize[612 792]>>setpagedevice\"");
      puts("*PageSize A4: \"<</PageSize[585 842]>>setpagedevice\"");
      puts("*CloseUI: *PageSize");

      puts("*OpenUI PageRegion: PickOne"); 
      puts("*OrderDependency: 10 AnySetup *PageRegion");
      puts("*DefaultPageRegion: Letter");
      puts("*PageRegion Letter: \"<</PageRegion[612 792]>>setpagedevice\"");
      puts("*PageRegion A4: \"<</PageRegion[585 842]>>setpagedevice\"");
      puts("*CloseUI: *PageRegion");

      puts("*DefaultImageableArea: Letter");
      puts("*ImageableArea Letter: \"0 0 612 792\"");
      puts("*ImageableArea A4: \"0 0 595 842\"");

      puts("*DefaultPaperDimension: Letter");
      puts("*PaperDimension Letter: \"612 792\"");
      puts("*PaperDimension A4: \"595 842\"");

      return (0);
    }

  fprintf(stderr, "ERROR: Unknown URI \"%s\"!\n", uri);
  return (1);
}


//
// 'list_ppds()' - List PPDs.
//

static int				// O - Exit status
list_ppds(const char *name)		// I - Program name
{
  int		i;			// Looping var
  const char	*base;			// Base name of program


  if ((base = strrchr(name, '/')) != NULL)
    base ++;
  else
    base = name;

  for (i = 0; i < (int)(sizeof(models) / sizeof(models[0])); i ++)
    printf("\"%s:///%s\" en \"Test\" \"Test %s\" \"1284 device id\"\n",
           base, models[i][0], models[i][1]);

  return (0);
}
