xref: /aosp_15_r20/external/libcups/cups/dest-localization.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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