1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Destination localization support for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright 2012-2017 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker *
6*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
7*5e7646d2SAndroid Build Coastguard Worker */
8*5e7646d2SAndroid Build Coastguard Worker
9*5e7646d2SAndroid Build Coastguard Worker /*
10*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
11*5e7646d2SAndroid Build Coastguard Worker */
12*5e7646d2SAndroid Build Coastguard Worker
13*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
14*5e7646d2SAndroid Build Coastguard Worker #include "debug-internal.h"
15*5e7646d2SAndroid Build Coastguard Worker
16*5e7646d2SAndroid Build Coastguard Worker
17*5e7646d2SAndroid Build Coastguard Worker /*
18*5e7646d2SAndroid Build Coastguard Worker * Local functions...
19*5e7646d2SAndroid Build Coastguard Worker */
20*5e7646d2SAndroid Build Coastguard Worker
21*5e7646d2SAndroid Build Coastguard Worker static void cups_create_localizations(http_t *http, cups_dinfo_t *dinfo);
22*5e7646d2SAndroid Build Coastguard Worker
23*5e7646d2SAndroid Build Coastguard Worker
24*5e7646d2SAndroid Build Coastguard Worker /*
25*5e7646d2SAndroid Build Coastguard Worker * 'cupsLocalizeDestMedia()' - Get the localized string for a destination media
26*5e7646d2SAndroid Build Coastguard Worker * size.
27*5e7646d2SAndroid Build Coastguard Worker *
28*5e7646d2SAndroid Build Coastguard Worker * The returned string is stored in the destination information and will become
29*5e7646d2SAndroid Build Coastguard Worker * invalid if the destination information is deleted.
30*5e7646d2SAndroid Build Coastguard Worker *
31*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 2.0/macOS 10.10@
32*5e7646d2SAndroid Build Coastguard Worker */
33*5e7646d2SAndroid Build Coastguard Worker
34*5e7646d2SAndroid Build Coastguard Worker const char * /* O - Localized string */
cupsLocalizeDestMedia(http_t * http,cups_dest_t * dest,cups_dinfo_t * dinfo,unsigned flags,cups_size_t * size)35*5e7646d2SAndroid Build Coastguard Worker cupsLocalizeDestMedia(
36*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - Connection to destination */
37*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dest, /* I - Destination */
38*5e7646d2SAndroid Build Coastguard Worker cups_dinfo_t *dinfo, /* I - Destination information */
39*5e7646d2SAndroid Build Coastguard Worker unsigned flags, /* I - Media flags */
40*5e7646d2SAndroid Build Coastguard Worker cups_size_t *size) /* I - Media size */
41*5e7646d2SAndroid Build Coastguard Worker {
42*5e7646d2SAndroid Build Coastguard Worker cups_lang_t *lang; /* Standard localizations */
43*5e7646d2SAndroid Build Coastguard Worker _cups_message_t key, /* Search key */
44*5e7646d2SAndroid Build Coastguard Worker *match; /* Matching entry */
45*5e7646d2SAndroid Build Coastguard Worker pwg_media_t *pwg; /* PWG media information */
46*5e7646d2SAndroid Build Coastguard Worker cups_array_t *db; /* Media database */
47*5e7646d2SAndroid Build Coastguard Worker _cups_media_db_t *mdb; /* Media database entry */
48*5e7646d2SAndroid Build Coastguard Worker char lstr[1024], /* Localized size name */
49*5e7646d2SAndroid Build Coastguard Worker temp[256]; /* Temporary string */
50*5e7646d2SAndroid Build Coastguard Worker const char *lsize, /* Localized media size */
51*5e7646d2SAndroid Build Coastguard Worker *lsource, /* Localized media source */
52*5e7646d2SAndroid Build Coastguard Worker *ltype; /* Localized media type */
53*5e7646d2SAndroid Build Coastguard Worker
54*5e7646d2SAndroid Build Coastguard Worker
55*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("cupsLocalizeDestMedia(http=%p, dest=%p, dinfo=%p, flags=%x, size=%p(\"%s\"))", (void *)http, (void *)dest, (void *)dinfo, flags, (void *)size, size ? size->media : "(null)"));
56*5e7646d2SAndroid Build Coastguard Worker
57*5e7646d2SAndroid Build Coastguard Worker /*
58*5e7646d2SAndroid Build Coastguard Worker * Range check input...
59*5e7646d2SAndroid Build Coastguard Worker */
60*5e7646d2SAndroid Build Coastguard Worker
61*5e7646d2SAndroid Build Coastguard Worker if (!http || !dest || !dinfo || !size)
62*5e7646d2SAndroid Build Coastguard Worker {
63*5e7646d2SAndroid Build Coastguard Worker DEBUG_puts("1cupsLocalizeDestMedia: Returning NULL.");
64*5e7646d2SAndroid Build Coastguard Worker _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
65*5e7646d2SAndroid Build Coastguard Worker return (NULL);
66*5e7646d2SAndroid Build Coastguard Worker }
67*5e7646d2SAndroid Build Coastguard Worker
68*5e7646d2SAndroid Build Coastguard Worker /*
69*5e7646d2SAndroid Build Coastguard Worker * Find the matching media database entry...
70*5e7646d2SAndroid Build Coastguard Worker */
71*5e7646d2SAndroid Build Coastguard Worker
72*5e7646d2SAndroid Build Coastguard Worker if (flags & CUPS_MEDIA_FLAGS_READY)
73*5e7646d2SAndroid Build Coastguard Worker db = dinfo->ready_db;
74*5e7646d2SAndroid Build Coastguard Worker else
75*5e7646d2SAndroid Build Coastguard Worker db = dinfo->media_db;
76*5e7646d2SAndroid Build Coastguard Worker
77*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsLocalizeDestMedia: size->media=\"%s\"", size->media));
78*5e7646d2SAndroid Build Coastguard Worker
79*5e7646d2SAndroid Build Coastguard Worker for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db))
80*5e7646d2SAndroid Build Coastguard Worker {
81*5e7646d2SAndroid Build Coastguard Worker if (mdb->key && !strcmp(mdb->key, size->media))
82*5e7646d2SAndroid Build Coastguard Worker break;
83*5e7646d2SAndroid Build Coastguard Worker else if (mdb->size_name && !strcmp(mdb->size_name, size->media))
84*5e7646d2SAndroid Build Coastguard Worker break;
85*5e7646d2SAndroid Build Coastguard Worker }
86*5e7646d2SAndroid Build Coastguard Worker
87*5e7646d2SAndroid Build Coastguard Worker if (!mdb)
88*5e7646d2SAndroid Build Coastguard Worker {
89*5e7646d2SAndroid Build Coastguard Worker for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db))
90*5e7646d2SAndroid Build Coastguard Worker {
91*5e7646d2SAndroid Build Coastguard Worker if (mdb->width == size->width && mdb->length == size->length && mdb->bottom == size->bottom && mdb->left == size->left && mdb->right == size->right && mdb->top == size->top)
92*5e7646d2SAndroid Build Coastguard Worker break;
93*5e7646d2SAndroid Build Coastguard Worker }
94*5e7646d2SAndroid Build Coastguard Worker }
95*5e7646d2SAndroid Build Coastguard Worker
96*5e7646d2SAndroid Build Coastguard Worker /*
97*5e7646d2SAndroid Build Coastguard Worker * See if the localization is cached...
98*5e7646d2SAndroid Build Coastguard Worker */
99*5e7646d2SAndroid Build Coastguard Worker
100*5e7646d2SAndroid Build Coastguard Worker lang = cupsLangDefault();
101*5e7646d2SAndroid Build Coastguard Worker
102*5e7646d2SAndroid Build Coastguard Worker if (!dinfo->localizations)
103*5e7646d2SAndroid Build Coastguard Worker cups_create_localizations(http, dinfo);
104*5e7646d2SAndroid Build Coastguard Worker
105*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp), "media.%s", size->media);
106*5e7646d2SAndroid Build Coastguard Worker key.msg = temp;
107*5e7646d2SAndroid Build Coastguard Worker
108*5e7646d2SAndroid Build Coastguard Worker if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL)
109*5e7646d2SAndroid Build Coastguard Worker {
110*5e7646d2SAndroid Build Coastguard Worker lsize = match->str;
111*5e7646d2SAndroid Build Coastguard Worker }
112*5e7646d2SAndroid Build Coastguard Worker else
113*5e7646d2SAndroid Build Coastguard Worker {
114*5e7646d2SAndroid Build Coastguard Worker /*
115*5e7646d2SAndroid Build Coastguard Worker * Not a media name, try a media-key name...
116*5e7646d2SAndroid Build Coastguard Worker */
117*5e7646d2SAndroid Build Coastguard Worker
118*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp), "media-key.%s", size->media);
119*5e7646d2SAndroid Build Coastguard Worker if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL)
120*5e7646d2SAndroid Build Coastguard Worker lsize = match->str;
121*5e7646d2SAndroid Build Coastguard Worker else
122*5e7646d2SAndroid Build Coastguard Worker lsize = NULL;
123*5e7646d2SAndroid Build Coastguard Worker }
124*5e7646d2SAndroid Build Coastguard Worker
125*5e7646d2SAndroid Build Coastguard Worker if (!lsize && (pwg = pwgMediaForSize(size->width, size->length)) != NULL && pwg->ppd)
126*5e7646d2SAndroid Build Coastguard Worker {
127*5e7646d2SAndroid Build Coastguard Worker /*
128*5e7646d2SAndroid Build Coastguard Worker * Get a standard localization...
129*5e7646d2SAndroid Build Coastguard Worker */
130*5e7646d2SAndroid Build Coastguard Worker
131*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp), "media.%s", pwg->pwg);
132*5e7646d2SAndroid Build Coastguard Worker if ((lsize = _cupsLangString(lang, temp)) == temp)
133*5e7646d2SAndroid Build Coastguard Worker lsize = NULL;
134*5e7646d2SAndroid Build Coastguard Worker }
135*5e7646d2SAndroid Build Coastguard Worker
136*5e7646d2SAndroid Build Coastguard Worker if (!lsize)
137*5e7646d2SAndroid Build Coastguard Worker {
138*5e7646d2SAndroid Build Coastguard Worker /*
139*5e7646d2SAndroid Build Coastguard Worker * Make a dimensional localization...
140*5e7646d2SAndroid Build Coastguard Worker */
141*5e7646d2SAndroid Build Coastguard Worker
142*5e7646d2SAndroid Build Coastguard Worker if ((size->width % 635) == 0 && (size->length % 635) == 0)
143*5e7646d2SAndroid Build Coastguard Worker {
144*5e7646d2SAndroid Build Coastguard Worker /*
145*5e7646d2SAndroid Build Coastguard Worker * Use inches since the size is a multiple of 1/4 inch.
146*5e7646d2SAndroid Build Coastguard Worker */
147*5e7646d2SAndroid Build Coastguard Worker
148*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp), _cupsLangString(lang, _("%g x %g \"")), size->width / 2540.0, size->length / 2540.0);
149*5e7646d2SAndroid Build Coastguard Worker }
150*5e7646d2SAndroid Build Coastguard Worker else
151*5e7646d2SAndroid Build Coastguard Worker {
152*5e7646d2SAndroid Build Coastguard Worker /*
153*5e7646d2SAndroid Build Coastguard Worker * Use millimeters since the size is not a multiple of 1/4 inch.
154*5e7646d2SAndroid Build Coastguard Worker */
155*5e7646d2SAndroid Build Coastguard Worker
156*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp), _cupsLangString(lang, _("%d x %d mm")), (size->width + 50) / 100, (size->length + 50) / 100);
157*5e7646d2SAndroid Build Coastguard Worker }
158*5e7646d2SAndroid Build Coastguard Worker
159*5e7646d2SAndroid Build Coastguard Worker lsize = temp;
160*5e7646d2SAndroid Build Coastguard Worker }
161*5e7646d2SAndroid Build Coastguard Worker
162*5e7646d2SAndroid Build Coastguard Worker if (mdb)
163*5e7646d2SAndroid Build Coastguard Worker {
164*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsLocalizeDestMedia: MATCH mdb%p [key=\"%s\" size_name=\"%s\" source=\"%s\" type=\"%s\" width=%d length=%d B%d L%d R%d T%d]", (void *)mdb, mdb->key, mdb->size_name, mdb->source, mdb->type, mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top));
165*5e7646d2SAndroid Build Coastguard Worker
166*5e7646d2SAndroid Build Coastguard Worker if ((lsource = cupsLocalizeDestValue(http, dest, dinfo, "media-source", mdb->source)) == mdb->source && mdb->source)
167*5e7646d2SAndroid Build Coastguard Worker lsource = _cupsLangString(lang, _("Other Tray"));
168*5e7646d2SAndroid Build Coastguard Worker if ((ltype = cupsLocalizeDestValue(http, dest, dinfo, "media-type", mdb->type)) == mdb->type && mdb->type)
169*5e7646d2SAndroid Build Coastguard Worker ltype = _cupsLangString(lang, _("Other Media"));
170*5e7646d2SAndroid Build Coastguard Worker }
171*5e7646d2SAndroid Build Coastguard Worker else
172*5e7646d2SAndroid Build Coastguard Worker {
173*5e7646d2SAndroid Build Coastguard Worker lsource = NULL;
174*5e7646d2SAndroid Build Coastguard Worker ltype = NULL;
175*5e7646d2SAndroid Build Coastguard Worker }
176*5e7646d2SAndroid Build Coastguard Worker
177*5e7646d2SAndroid Build Coastguard Worker if (!lsource && !ltype)
178*5e7646d2SAndroid Build Coastguard Worker {
179*5e7646d2SAndroid Build Coastguard Worker if (!size->bottom && !size->left && !size->right && !size->top)
180*5e7646d2SAndroid Build Coastguard Worker snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (Borderless)")), lsize);
181*5e7646d2SAndroid Build Coastguard Worker else
182*5e7646d2SAndroid Build Coastguard Worker strlcpy(lstr, lsize, sizeof(lstr));
183*5e7646d2SAndroid Build Coastguard Worker }
184*5e7646d2SAndroid Build Coastguard Worker else if (!lsource)
185*5e7646d2SAndroid Build Coastguard Worker {
186*5e7646d2SAndroid Build Coastguard Worker if (!size->bottom && !size->left && !size->right && !size->top)
187*5e7646d2SAndroid Build Coastguard Worker snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (Borderless, %s)")), lsize, ltype);
188*5e7646d2SAndroid Build Coastguard Worker else
189*5e7646d2SAndroid Build Coastguard Worker snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (%s)")), lsize, ltype);
190*5e7646d2SAndroid Build Coastguard Worker }
191*5e7646d2SAndroid Build Coastguard Worker else if (!ltype)
192*5e7646d2SAndroid Build Coastguard Worker {
193*5e7646d2SAndroid Build Coastguard Worker if (!size->bottom && !size->left && !size->right && !size->top)
194*5e7646d2SAndroid Build Coastguard Worker snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (Borderless, %s)")), lsize, lsource);
195*5e7646d2SAndroid Build Coastguard Worker else
196*5e7646d2SAndroid Build Coastguard Worker snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (%s)")), lsize, lsource);
197*5e7646d2SAndroid Build Coastguard Worker }
198*5e7646d2SAndroid Build Coastguard Worker else
199*5e7646d2SAndroid Build Coastguard Worker {
200*5e7646d2SAndroid Build Coastguard Worker if (!size->bottom && !size->left && !size->right && !size->top)
201*5e7646d2SAndroid Build Coastguard Worker snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (Borderless, %s, %s)")), lsize, ltype, lsource);
202*5e7646d2SAndroid Build Coastguard Worker else
203*5e7646d2SAndroid Build Coastguard Worker snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (%s, %s)")), lsize, ltype, lsource);
204*5e7646d2SAndroid Build Coastguard Worker }
205*5e7646d2SAndroid Build Coastguard Worker
206*5e7646d2SAndroid Build Coastguard Worker if ((match = (_cups_message_t *)calloc(1, sizeof(_cups_message_t))) == NULL)
207*5e7646d2SAndroid Build Coastguard Worker return (NULL);
208*5e7646d2SAndroid Build Coastguard Worker
209*5e7646d2SAndroid Build Coastguard Worker match->msg = strdup(size->media);
210*5e7646d2SAndroid Build Coastguard Worker match->str = strdup(lstr);
211*5e7646d2SAndroid Build Coastguard Worker
212*5e7646d2SAndroid Build Coastguard Worker cupsArrayAdd(dinfo->localizations, match);
213*5e7646d2SAndroid Build Coastguard Worker
214*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsLocalizeDestMedia: Returning \"%s\".", match->str));
215*5e7646d2SAndroid Build Coastguard Worker
216*5e7646d2SAndroid Build Coastguard Worker return (match->str);
217*5e7646d2SAndroid Build Coastguard Worker }
218*5e7646d2SAndroid Build Coastguard Worker
219*5e7646d2SAndroid Build Coastguard Worker
220*5e7646d2SAndroid Build Coastguard Worker /*
221*5e7646d2SAndroid Build Coastguard Worker * 'cupsLocalizeDestOption()' - Get the localized string for a destination
222*5e7646d2SAndroid Build Coastguard Worker * option.
223*5e7646d2SAndroid Build Coastguard Worker *
224*5e7646d2SAndroid Build Coastguard Worker * The returned string is stored in the destination information and will become
225*5e7646d2SAndroid Build Coastguard Worker * invalid if the destination information is deleted.
226*5e7646d2SAndroid Build Coastguard Worker *
227*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.6/macOS 10.8@
228*5e7646d2SAndroid Build Coastguard Worker */
229*5e7646d2SAndroid Build Coastguard Worker
230*5e7646d2SAndroid Build Coastguard Worker const char * /* O - Localized string */
cupsLocalizeDestOption(http_t * http,cups_dest_t * dest,cups_dinfo_t * dinfo,const char * option)231*5e7646d2SAndroid Build Coastguard Worker cupsLocalizeDestOption(
232*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - Connection to destination */
233*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dest, /* I - Destination */
234*5e7646d2SAndroid Build Coastguard Worker cups_dinfo_t *dinfo, /* I - Destination information */
235*5e7646d2SAndroid Build Coastguard Worker const char *option) /* I - Option to localize */
236*5e7646d2SAndroid Build Coastguard Worker {
237*5e7646d2SAndroid Build Coastguard Worker _cups_message_t key, /* Search key */
238*5e7646d2SAndroid Build Coastguard Worker *match; /* Matching entry */
239*5e7646d2SAndroid Build Coastguard Worker const char *localized; /* Localized string */
240*5e7646d2SAndroid Build Coastguard Worker
241*5e7646d2SAndroid Build Coastguard Worker
242*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("cupsLocalizeDestOption(http=%p, dest=%p, dinfo=%p, option=\"%s\")", (void *)http, (void *)dest, (void *)dinfo, option));
243*5e7646d2SAndroid Build Coastguard Worker
244*5e7646d2SAndroid Build Coastguard Worker if (!http || !dest || !dinfo)
245*5e7646d2SAndroid Build Coastguard Worker return (option);
246*5e7646d2SAndroid Build Coastguard Worker
247*5e7646d2SAndroid Build Coastguard Worker if (!dinfo->localizations)
248*5e7646d2SAndroid Build Coastguard Worker cups_create_localizations(http, dinfo);
249*5e7646d2SAndroid Build Coastguard Worker
250*5e7646d2SAndroid Build Coastguard Worker key.msg = (char *)option;
251*5e7646d2SAndroid Build Coastguard Worker if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL)
252*5e7646d2SAndroid Build Coastguard Worker return (match->str);
253*5e7646d2SAndroid Build Coastguard Worker else if ((localized = _cupsLangString(cupsLangDefault(), option)) != NULL)
254*5e7646d2SAndroid Build Coastguard Worker return (localized);
255*5e7646d2SAndroid Build Coastguard Worker else
256*5e7646d2SAndroid Build Coastguard Worker return (option);
257*5e7646d2SAndroid Build Coastguard Worker }
258*5e7646d2SAndroid Build Coastguard Worker
259*5e7646d2SAndroid Build Coastguard Worker
260*5e7646d2SAndroid Build Coastguard Worker /*
261*5e7646d2SAndroid Build Coastguard Worker * 'cupsLocalizeDestValue()' - Get the localized string for a destination
262*5e7646d2SAndroid Build Coastguard Worker * option+value pair.
263*5e7646d2SAndroid Build Coastguard Worker *
264*5e7646d2SAndroid Build Coastguard Worker * The returned string is stored in the destination information and will become
265*5e7646d2SAndroid Build Coastguard Worker * invalid if the destination information is deleted.
266*5e7646d2SAndroid Build Coastguard Worker *
267*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.6/macOS 10.8@
268*5e7646d2SAndroid Build Coastguard Worker */
269*5e7646d2SAndroid Build Coastguard Worker
270*5e7646d2SAndroid Build Coastguard Worker const char * /* O - Localized string */
cupsLocalizeDestValue(http_t * http,cups_dest_t * dest,cups_dinfo_t * dinfo,const char * option,const char * value)271*5e7646d2SAndroid Build Coastguard Worker cupsLocalizeDestValue(
272*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - Connection to destination */
273*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dest, /* I - Destination */
274*5e7646d2SAndroid Build Coastguard Worker cups_dinfo_t *dinfo, /* I - Destination information */
275*5e7646d2SAndroid Build Coastguard Worker const char *option, /* I - Option to localize */
276*5e7646d2SAndroid Build Coastguard Worker const char *value) /* I - Value to localize */
277*5e7646d2SAndroid Build Coastguard Worker {
278*5e7646d2SAndroid Build Coastguard Worker _cups_message_t key, /* Search key */
279*5e7646d2SAndroid Build Coastguard Worker *match; /* Matching entry */
280*5e7646d2SAndroid Build Coastguard Worker char pair[256]; /* option.value pair */
281*5e7646d2SAndroid Build Coastguard Worker const char *localized; /* Localized string */
282*5e7646d2SAndroid Build Coastguard Worker
283*5e7646d2SAndroid Build Coastguard Worker
284*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("cupsLocalizeDestValue(http=%p, dest=%p, dinfo=%p, option=\"%s\", value=\"%s\")", (void *)http, (void *)dest, (void *)dinfo, option, value));
285*5e7646d2SAndroid Build Coastguard Worker
286*5e7646d2SAndroid Build Coastguard Worker if (!http || !dest || !dinfo)
287*5e7646d2SAndroid Build Coastguard Worker return (value);
288*5e7646d2SAndroid Build Coastguard Worker
289*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(option, "media"))
290*5e7646d2SAndroid Build Coastguard Worker {
291*5e7646d2SAndroid Build Coastguard Worker pwg_media_t *media = pwgMediaForPWG(value);
292*5e7646d2SAndroid Build Coastguard Worker cups_size_t size;
293*5e7646d2SAndroid Build Coastguard Worker
294*5e7646d2SAndroid Build Coastguard Worker strlcpy(size.media, value, sizeof(size.media));
295*5e7646d2SAndroid Build Coastguard Worker size.width = media ? media->width : 0;
296*5e7646d2SAndroid Build Coastguard Worker size.length = media ? media->length : 0;
297*5e7646d2SAndroid Build Coastguard Worker size.left = 0;
298*5e7646d2SAndroid Build Coastguard Worker size.right = 0;
299*5e7646d2SAndroid Build Coastguard Worker size.bottom = 0;
300*5e7646d2SAndroid Build Coastguard Worker size.top = 0;
301*5e7646d2SAndroid Build Coastguard Worker
302*5e7646d2SAndroid Build Coastguard Worker return (cupsLocalizeDestMedia(http, dest, dinfo, CUPS_MEDIA_FLAGS_DEFAULT, &size));
303*5e7646d2SAndroid Build Coastguard Worker }
304*5e7646d2SAndroid Build Coastguard Worker
305*5e7646d2SAndroid Build Coastguard Worker if (!dinfo->localizations)
306*5e7646d2SAndroid Build Coastguard Worker cups_create_localizations(http, dinfo);
307*5e7646d2SAndroid Build Coastguard Worker
308*5e7646d2SAndroid Build Coastguard Worker snprintf(pair, sizeof(pair), "%s.%s", option, value);
309*5e7646d2SAndroid Build Coastguard Worker key.msg = pair;
310*5e7646d2SAndroid Build Coastguard Worker if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL)
311*5e7646d2SAndroid Build Coastguard Worker return (match->str);
312*5e7646d2SAndroid Build Coastguard Worker else if ((localized = _cupsLangString(cupsLangDefault(), pair)) != NULL && strcmp(localized, pair))
313*5e7646d2SAndroid Build Coastguard Worker return (localized);
314*5e7646d2SAndroid Build Coastguard Worker else
315*5e7646d2SAndroid Build Coastguard Worker return (value);
316*5e7646d2SAndroid Build Coastguard Worker }
317*5e7646d2SAndroid Build Coastguard Worker
318*5e7646d2SAndroid Build Coastguard Worker
319*5e7646d2SAndroid Build Coastguard Worker /*
320*5e7646d2SAndroid Build Coastguard Worker * 'cups_create_localizations()' - Create the localizations array for a
321*5e7646d2SAndroid Build Coastguard Worker * destination.
322*5e7646d2SAndroid Build Coastguard Worker */
323*5e7646d2SAndroid Build Coastguard Worker
324*5e7646d2SAndroid Build Coastguard Worker static void
cups_create_localizations(http_t * http,cups_dinfo_t * dinfo)325*5e7646d2SAndroid Build Coastguard Worker cups_create_localizations(
326*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - Connection to destination */
327*5e7646d2SAndroid Build Coastguard Worker cups_dinfo_t *dinfo) /* I - Destination informations */
328*5e7646d2SAndroid Build Coastguard Worker {
329*5e7646d2SAndroid Build Coastguard Worker http_t *http2; /* Connection for strings file */
330*5e7646d2SAndroid Build Coastguard Worker http_status_t status; /* Request status */
331*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr; /* "printer-strings-uri" attribute */
332*5e7646d2SAndroid Build Coastguard Worker char scheme[32], /* URI scheme */
333*5e7646d2SAndroid Build Coastguard Worker userpass[256], /* Username/password info */
334*5e7646d2SAndroid Build Coastguard Worker hostname[256], /* Hostname */
335*5e7646d2SAndroid Build Coastguard Worker resource[1024], /* Resource */
336*5e7646d2SAndroid Build Coastguard Worker http_hostname[256],
337*5e7646d2SAndroid Build Coastguard Worker /* Hostname of connection */
338*5e7646d2SAndroid Build Coastguard Worker tempfile[1024]; /* Temporary filename */
339*5e7646d2SAndroid Build Coastguard Worker int port; /* Port number */
340*5e7646d2SAndroid Build Coastguard Worker http_encryption_t encryption; /* Encryption to use */
341*5e7646d2SAndroid Build Coastguard Worker cups_file_t *temp; /* Temporary file */
342*5e7646d2SAndroid Build Coastguard Worker
343*5e7646d2SAndroid Build Coastguard Worker
344*5e7646d2SAndroid Build Coastguard Worker /*
345*5e7646d2SAndroid Build Coastguard Worker * See if there are any localizations...
346*5e7646d2SAndroid Build Coastguard Worker */
347*5e7646d2SAndroid Build Coastguard Worker
348*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(dinfo->attrs, "printer-strings-uri",
349*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_URI)) == NULL)
350*5e7646d2SAndroid Build Coastguard Worker {
351*5e7646d2SAndroid Build Coastguard Worker /*
352*5e7646d2SAndroid Build Coastguard Worker * Nope, create an empty message catalog...
353*5e7646d2SAndroid Build Coastguard Worker */
354*5e7646d2SAndroid Build Coastguard Worker
355*5e7646d2SAndroid Build Coastguard Worker dinfo->localizations = _cupsMessageNew(NULL);
356*5e7646d2SAndroid Build Coastguard Worker DEBUG_puts("4cups_create_localizations: No printer-strings-uri (uri) value.");
357*5e7646d2SAndroid Build Coastguard Worker return;
358*5e7646d2SAndroid Build Coastguard Worker }
359*5e7646d2SAndroid Build Coastguard Worker
360*5e7646d2SAndroid Build Coastguard Worker /*
361*5e7646d2SAndroid Build Coastguard Worker * Pull apart the URI and determine whether we need to try a different
362*5e7646d2SAndroid Build Coastguard Worker * server...
363*5e7646d2SAndroid Build Coastguard Worker */
364*5e7646d2SAndroid Build Coastguard Worker
365*5e7646d2SAndroid Build Coastguard Worker if (httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[0].string.text,
366*5e7646d2SAndroid Build Coastguard Worker scheme, sizeof(scheme), userpass, sizeof(userpass),
367*5e7646d2SAndroid Build Coastguard Worker hostname, sizeof(hostname), &port, resource,
368*5e7646d2SAndroid Build Coastguard Worker sizeof(resource)) < HTTP_URI_STATUS_OK)
369*5e7646d2SAndroid Build Coastguard Worker {
370*5e7646d2SAndroid Build Coastguard Worker dinfo->localizations = _cupsMessageNew(NULL);
371*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("4cups_create_localizations: Bad printer-strings-uri value \"%s\".", attr->values[0].string.text));
372*5e7646d2SAndroid Build Coastguard Worker return;
373*5e7646d2SAndroid Build Coastguard Worker }
374*5e7646d2SAndroid Build Coastguard Worker
375*5e7646d2SAndroid Build Coastguard Worker httpGetHostname(http, http_hostname, sizeof(http_hostname));
376*5e7646d2SAndroid Build Coastguard Worker
377*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(http_hostname, hostname) &&
378*5e7646d2SAndroid Build Coastguard Worker port == httpAddrPort(http->hostaddr))
379*5e7646d2SAndroid Build Coastguard Worker {
380*5e7646d2SAndroid Build Coastguard Worker /*
381*5e7646d2SAndroid Build Coastguard Worker * Use the same connection...
382*5e7646d2SAndroid Build Coastguard Worker */
383*5e7646d2SAndroid Build Coastguard Worker
384*5e7646d2SAndroid Build Coastguard Worker http2 = http;
385*5e7646d2SAndroid Build Coastguard Worker }
386*5e7646d2SAndroid Build Coastguard Worker else
387*5e7646d2SAndroid Build Coastguard Worker {
388*5e7646d2SAndroid Build Coastguard Worker /*
389*5e7646d2SAndroid Build Coastguard Worker * Connect to the alternate host...
390*5e7646d2SAndroid Build Coastguard Worker */
391*5e7646d2SAndroid Build Coastguard Worker
392*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(scheme, "https"))
393*5e7646d2SAndroid Build Coastguard Worker encryption = HTTP_ENCRYPTION_ALWAYS;
394*5e7646d2SAndroid Build Coastguard Worker else
395*5e7646d2SAndroid Build Coastguard Worker encryption = HTTP_ENCRYPTION_IF_REQUESTED;
396*5e7646d2SAndroid Build Coastguard Worker
397*5e7646d2SAndroid Build Coastguard Worker if ((http2 = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption, 1,
398*5e7646d2SAndroid Build Coastguard Worker 30000, NULL)) == NULL)
399*5e7646d2SAndroid Build Coastguard Worker {
400*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("4cups_create_localizations: Unable to connect to "
401*5e7646d2SAndroid Build Coastguard Worker "%s:%d: %s", hostname, port, cupsLastErrorString()));
402*5e7646d2SAndroid Build Coastguard Worker return;
403*5e7646d2SAndroid Build Coastguard Worker }
404*5e7646d2SAndroid Build Coastguard Worker }
405*5e7646d2SAndroid Build Coastguard Worker
406*5e7646d2SAndroid Build Coastguard Worker /*
407*5e7646d2SAndroid Build Coastguard Worker * Get a temporary file...
408*5e7646d2SAndroid Build Coastguard Worker */
409*5e7646d2SAndroid Build Coastguard Worker
410*5e7646d2SAndroid Build Coastguard Worker if ((temp = cupsTempFile2(tempfile, sizeof(tempfile))) == NULL)
411*5e7646d2SAndroid Build Coastguard Worker {
412*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("4cups_create_localizations: Unable to create temporary "
413*5e7646d2SAndroid Build Coastguard Worker "file: %s", cupsLastErrorString()));
414*5e7646d2SAndroid Build Coastguard Worker if (http2 != http)
415*5e7646d2SAndroid Build Coastguard Worker httpClose(http2);
416*5e7646d2SAndroid Build Coastguard Worker return;
417*5e7646d2SAndroid Build Coastguard Worker }
418*5e7646d2SAndroid Build Coastguard Worker
419*5e7646d2SAndroid Build Coastguard Worker status = cupsGetFd(http2, resource, cupsFileNumber(temp));
420*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(temp);
421*5e7646d2SAndroid Build Coastguard Worker
422*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("4cups_create_localizations: GET %s = %s", resource, httpStatus(status)));
423*5e7646d2SAndroid Build Coastguard Worker
424*5e7646d2SAndroid Build Coastguard Worker if (status == HTTP_STATUS_OK)
425*5e7646d2SAndroid Build Coastguard Worker {
426*5e7646d2SAndroid Build Coastguard Worker /*
427*5e7646d2SAndroid Build Coastguard Worker * Got the file, read it...
428*5e7646d2SAndroid Build Coastguard Worker */
429*5e7646d2SAndroid Build Coastguard Worker
430*5e7646d2SAndroid Build Coastguard Worker dinfo->localizations = _cupsMessageLoad(tempfile, _CUPS_MESSAGE_STRINGS);
431*5e7646d2SAndroid Build Coastguard Worker }
432*5e7646d2SAndroid Build Coastguard Worker
433*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("4cups_create_localizations: %d messages loaded.",
434*5e7646d2SAndroid Build Coastguard Worker cupsArrayCount(dinfo->localizations)));
435*5e7646d2SAndroid Build Coastguard Worker
436*5e7646d2SAndroid Build Coastguard Worker /*
437*5e7646d2SAndroid Build Coastguard Worker * Cleanup...
438*5e7646d2SAndroid Build Coastguard Worker */
439*5e7646d2SAndroid Build Coastguard Worker
440*5e7646d2SAndroid Build Coastguard Worker unlink(tempfile);
441*5e7646d2SAndroid Build Coastguard Worker
442*5e7646d2SAndroid Build Coastguard Worker if (http2 != http)
443*5e7646d2SAndroid Build Coastguard Worker httpClose(http2);
444*5e7646d2SAndroid Build Coastguard Worker }
445*5e7646d2SAndroid Build Coastguard Worker
446