1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26/*LINTLIBRARY*/
27
28#include <stdio.h>
29#include <string.h>
30#include <stdlib.h>
31
32#include <papi_impl.h>
33
34
35papi_status_t
36papiAttributeListAddLPString(papi_attribute_t ***list, int flags, char *name,
37		char *value)
38{
39	papi_status_t result = PAPI_BAD_ARGUMENT;
40
41	if ((list != NULL) && (name != NULL) && (value != NULL) &&
42	    (value[0] != '\0'))
43		result = papiAttributeListAddString(list, flags, name, value);
44	return (result);
45}
46
47papi_status_t
48papiAttributeListAddLPStrings(papi_attribute_t ***list, int flags, char *name,
49				char **values)
50{
51	papi_status_t result = PAPI_OK;
52	int i, flgs = flags;
53
54	if ((list == NULL) || (name == NULL) || (values == NULL))
55		result = PAPI_BAD_ARGUMENT;
56
57	for (i = 0; ((result == PAPI_OK) && (values[i] != NULL));
58		i++, flgs = PAPI_ATTR_APPEND)
59		result = papiAttributeListAddString(list, flgs, name,
60							values[i]);
61
62	return (result);
63}
64
65void
66papiAttributeListGetLPString(papi_attribute_t **attributes, char *key,
67				char **string)
68{
69	char *value = NULL;
70
71	papiAttributeListGetString(attributes, NULL, key,  &value);
72	if (value != NULL) {
73		if (*string != NULL)
74			free(*string);
75		*string = strdup(value);
76	}
77}
78
79void
80papiAttributeListGetLPStrings(papi_attribute_t **attributes, char *key,
81				char ***strings)
82{
83	papi_status_t status;
84	char **values = NULL;
85	char *value = NULL;
86	void *iter = NULL;
87
88	for (status = papiAttributeListGetString(attributes, &iter,
89				key, &value);
90	    status == PAPI_OK;
91	    status = papiAttributeListGetString(attributes, &iter,
92				NULL, &value))
93		addlist(&values, value);
94
95	if (values != NULL) {
96		if (*strings != NULL)
97			freelist(*strings);
98		*strings = values;
99	}
100}
101
102char *
103printer_name_from_uri_id(char *uri, int32_t id)
104{
105	REQUEST *request = NULL;
106	char *result = "";
107
108	if (uri != NULL) {
109		if ((result = strrchr(uri, '/')) != NULL) {
110			result += 1;
111		} else
112			result = (char *)uri;
113
114		if ((strcmp(result, "jobs") == 0) ||
115		    (strcmp(result, "any") == 0) ||
116		    (strcmp(result, "all") == 0))
117			result = "";
118	}
119
120	if ((result[0] == '\0') && (id != -1)) {
121		char path[32];
122
123		snprintf(path, sizeof (path), "%d-0", id);
124		if ((request = getrequest(path)) != NULL)
125			result = request->destination;
126	}
127
128	result = strdup(result);
129
130	if (request != NULL)
131		freerequest(request);
132
133	return (result);
134}
135
136/*
137 * LP content type <-> MIME type conversion table. (order dependent)
138 */
139static struct {
140	char *mime_type;
141	char *lp_type;
142} type_map[] = {
143	{ "text/plain", "simple" },
144	{ "application/octet-stream", "raw" },
145	{ "application/octet-stream", "any" },
146	{ "application/postscript", "postscript" },
147	{ "application/postscript", "ps" },
148	{ "application/x-cif", "cif" },
149	{ "application/x-dvi", "dvi" },
150	{ "application/x-plot", "plot" },
151	{ "application/x-ditroff", "troff" },
152	{ "application/x-troff", "otroff" },
153	{ "application/x-pr", "pr" },
154	{ "application/x-fortran", "fortran" },
155	{ "application/x-raster", "raster" },
156	{ NULL, NULL}
157};
158
159char *
160mime_type_to_lp_type(char *mime_type)
161{
162	int i;
163
164	if (mime_type == NULL)
165		return ("simple");
166
167	for (i = 0; type_map[i].mime_type != NULL; i++)
168		if (strcasecmp(type_map[i].mime_type, mime_type) == 0)
169			return (type_map[i].lp_type);
170
171	return (mime_type);
172}
173
174char *
175lp_type_to_mime_type(char *lp_type)
176{
177	int i;
178
179	if (lp_type == NULL)
180		return ("text/plain");
181
182	for (i = 0; type_map[i].lp_type != NULL; i++)
183		if (strcasecmp(type_map[i].lp_type, lp_type) == 0)
184			return (type_map[i].mime_type);
185
186	return (lp_type);
187}
188