1*86b64dcbSAndroid Build Coastguard Worker /*
2*86b64dcbSAndroid Build Coastguard Worker * libusb strerror code
3*86b64dcbSAndroid Build Coastguard Worker * Copyright © 2013 Hans de Goede <[email protected]>
4*86b64dcbSAndroid Build Coastguard Worker *
5*86b64dcbSAndroid Build Coastguard Worker * This library is free software; you can redistribute it and/or
6*86b64dcbSAndroid Build Coastguard Worker * modify it under the terms of the GNU Lesser General Public
7*86b64dcbSAndroid Build Coastguard Worker * License as published by the Free Software Foundation; either
8*86b64dcbSAndroid Build Coastguard Worker * version 2.1 of the License, or (at your option) any later version.
9*86b64dcbSAndroid Build Coastguard Worker *
10*86b64dcbSAndroid Build Coastguard Worker * This library is distributed in the hope that it will be useful,
11*86b64dcbSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*86b64dcbSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13*86b64dcbSAndroid Build Coastguard Worker * Lesser General Public License for more details.
14*86b64dcbSAndroid Build Coastguard Worker *
15*86b64dcbSAndroid Build Coastguard Worker * You should have received a copy of the GNU Lesser General Public
16*86b64dcbSAndroid Build Coastguard Worker * License along with this library; if not, write to the Free Software
17*86b64dcbSAndroid Build Coastguard Worker * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18*86b64dcbSAndroid Build Coastguard Worker */
19*86b64dcbSAndroid Build Coastguard Worker
20*86b64dcbSAndroid Build Coastguard Worker #include "libusbi.h"
21*86b64dcbSAndroid Build Coastguard Worker
22*86b64dcbSAndroid Build Coastguard Worker #include <ctype.h>
23*86b64dcbSAndroid Build Coastguard Worker #include <string.h>
24*86b64dcbSAndroid Build Coastguard Worker
25*86b64dcbSAndroid Build Coastguard Worker /** \ingroup libusb_misc
26*86b64dcbSAndroid Build Coastguard Worker * How to add a new \ref libusb_strerror() translation:
27*86b64dcbSAndroid Build Coastguard Worker * <ol>
28*86b64dcbSAndroid Build Coastguard Worker * <li> Download the latest \c strerror.c from:<br>
29*86b64dcbSAndroid Build Coastguard Worker * https://raw.github.com/libusb/libusb/master/libusb/strerror.c </li>
30*86b64dcbSAndroid Build Coastguard Worker * <li> Open the file in an UTF-8 capable editor </li>
31*86b64dcbSAndroid Build Coastguard Worker * <li> Add the 2 letter <a href="https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO 639-1</a>
32*86b64dcbSAndroid Build Coastguard Worker * code for your locale at the end of \c usbi_locale_supported[]<br>
33*86b64dcbSAndroid Build Coastguard Worker * Eg. for Chinese, you would add "zh" so that:
34*86b64dcbSAndroid Build Coastguard Worker * \code... usbi_locale_supported[] = { "en", "nl", "fr" };\endcode
35*86b64dcbSAndroid Build Coastguard Worker * becomes:
36*86b64dcbSAndroid Build Coastguard Worker * \code... usbi_locale_supported[] = { "en", "nl", "fr", "zh" };\endcode </li>
37*86b64dcbSAndroid Build Coastguard Worker * <li> Copy the <tt>{ / * English (en) * / ... }</tt> section and add it at the end of \c usbi_localized_errors<br>
38*86b64dcbSAndroid Build Coastguard Worker * Eg. for Chinese, the last section of \c usbi_localized_errors could look like:
39*86b64dcbSAndroid Build Coastguard Worker * \code
40*86b64dcbSAndroid Build Coastguard Worker * }, { / * Chinese (zh) * /
41*86b64dcbSAndroid Build Coastguard Worker * "Success",
42*86b64dcbSAndroid Build Coastguard Worker * ...
43*86b64dcbSAndroid Build Coastguard Worker * "Other error",
44*86b64dcbSAndroid Build Coastguard Worker * },
45*86b64dcbSAndroid Build Coastguard Worker * };\endcode </li>
46*86b64dcbSAndroid Build Coastguard Worker * <li> Translate each of the English messages from the section you copied into your language </li>
47*86b64dcbSAndroid Build Coastguard Worker * <li> Save the file (in UTF-8 format) and send it to \c libusb-devel\@lists.sourceforge.net </li>
48*86b64dcbSAndroid Build Coastguard Worker * </ol>
49*86b64dcbSAndroid Build Coastguard Worker */
50*86b64dcbSAndroid Build Coastguard Worker
51*86b64dcbSAndroid Build Coastguard Worker static const char * const usbi_locale_supported[] = { "en", "nl", "fr", "ru", "de", "hu" };
52*86b64dcbSAndroid Build Coastguard Worker static const char * const usbi_localized_errors[ARRAYSIZE(usbi_locale_supported)][LIBUSB_ERROR_COUNT] = {
53*86b64dcbSAndroid Build Coastguard Worker { /* English (en) */
54*86b64dcbSAndroid Build Coastguard Worker "Success",
55*86b64dcbSAndroid Build Coastguard Worker "Input/Output Error",
56*86b64dcbSAndroid Build Coastguard Worker "Invalid parameter",
57*86b64dcbSAndroid Build Coastguard Worker "Access denied (insufficient permissions)",
58*86b64dcbSAndroid Build Coastguard Worker "No such device (it may have been disconnected)",
59*86b64dcbSAndroid Build Coastguard Worker "Entity not found",
60*86b64dcbSAndroid Build Coastguard Worker "Resource busy",
61*86b64dcbSAndroid Build Coastguard Worker "Operation timed out",
62*86b64dcbSAndroid Build Coastguard Worker "Overflow",
63*86b64dcbSAndroid Build Coastguard Worker "Pipe error",
64*86b64dcbSAndroid Build Coastguard Worker "System call interrupted (perhaps due to signal)",
65*86b64dcbSAndroid Build Coastguard Worker "Insufficient memory",
66*86b64dcbSAndroid Build Coastguard Worker "Operation not supported or unimplemented on this platform",
67*86b64dcbSAndroid Build Coastguard Worker "Other error",
68*86b64dcbSAndroid Build Coastguard Worker }, { /* Dutch (nl) */
69*86b64dcbSAndroid Build Coastguard Worker "Gelukt",
70*86b64dcbSAndroid Build Coastguard Worker "Invoer-/uitvoerfout",
71*86b64dcbSAndroid Build Coastguard Worker "Ongeldig argument",
72*86b64dcbSAndroid Build Coastguard Worker "Toegang geweigerd (onvoldoende toegangsrechten)",
73*86b64dcbSAndroid Build Coastguard Worker "Apparaat bestaat niet (verbinding met apparaat verbroken?)",
74*86b64dcbSAndroid Build Coastguard Worker "Niet gevonden",
75*86b64dcbSAndroid Build Coastguard Worker "Apparaat of hulpbron is bezig",
76*86b64dcbSAndroid Build Coastguard Worker "Bewerking verlopen",
77*86b64dcbSAndroid Build Coastguard Worker "Waarde is te groot",
78*86b64dcbSAndroid Build Coastguard Worker "Gebroken pijp",
79*86b64dcbSAndroid Build Coastguard Worker "Onderbroken systeemaanroep",
80*86b64dcbSAndroid Build Coastguard Worker "Onvoldoende geheugen beschikbaar",
81*86b64dcbSAndroid Build Coastguard Worker "Bewerking wordt niet ondersteund",
82*86b64dcbSAndroid Build Coastguard Worker "Andere fout",
83*86b64dcbSAndroid Build Coastguard Worker }, { /* French (fr) */
84*86b64dcbSAndroid Build Coastguard Worker "Succès",
85*86b64dcbSAndroid Build Coastguard Worker "Erreur d'entrée/sortie",
86*86b64dcbSAndroid Build Coastguard Worker "Paramètre invalide",
87*86b64dcbSAndroid Build Coastguard Worker "Accès refusé (permissions insuffisantes)",
88*86b64dcbSAndroid Build Coastguard Worker "Périphérique introuvable (peut-être déconnecté)",
89*86b64dcbSAndroid Build Coastguard Worker "Elément introuvable",
90*86b64dcbSAndroid Build Coastguard Worker "Resource déjà occupée",
91*86b64dcbSAndroid Build Coastguard Worker "Operation expirée",
92*86b64dcbSAndroid Build Coastguard Worker "Débordement",
93*86b64dcbSAndroid Build Coastguard Worker "Erreur de pipe",
94*86b64dcbSAndroid Build Coastguard Worker "Appel système abandonné (peut-être à cause d’un signal)",
95*86b64dcbSAndroid Build Coastguard Worker "Mémoire insuffisante",
96*86b64dcbSAndroid Build Coastguard Worker "Opération non supportée or non implémentée sur cette plateforme",
97*86b64dcbSAndroid Build Coastguard Worker "Autre erreur",
98*86b64dcbSAndroid Build Coastguard Worker }, { /* Russian (ru) */
99*86b64dcbSAndroid Build Coastguard Worker "Успех",
100*86b64dcbSAndroid Build Coastguard Worker "Ошибка ввода/вывода",
101*86b64dcbSAndroid Build Coastguard Worker "Неверный параметр",
102*86b64dcbSAndroid Build Coastguard Worker "Доступ запрещён (не хватает прав)",
103*86b64dcbSAndroid Build Coastguard Worker "Устройство отсутствует (возможно, оно было отсоединено)",
104*86b64dcbSAndroid Build Coastguard Worker "Элемент не найден",
105*86b64dcbSAndroid Build Coastguard Worker "Ресурс занят",
106*86b64dcbSAndroid Build Coastguard Worker "Истекло время ожидания операции",
107*86b64dcbSAndroid Build Coastguard Worker "Переполнение",
108*86b64dcbSAndroid Build Coastguard Worker "Ошибка канала",
109*86b64dcbSAndroid Build Coastguard Worker "Системный вызов прерван (возможно, сигналом)",
110*86b64dcbSAndroid Build Coastguard Worker "Память исчерпана",
111*86b64dcbSAndroid Build Coastguard Worker "Операция не поддерживается данной платформой",
112*86b64dcbSAndroid Build Coastguard Worker "Неизвестная ошибка"
113*86b64dcbSAndroid Build Coastguard Worker }, { /* German (de) */
114*86b64dcbSAndroid Build Coastguard Worker "Erfolgreich",
115*86b64dcbSAndroid Build Coastguard Worker "Eingabe-/Ausgabefehler",
116*86b64dcbSAndroid Build Coastguard Worker "Ungültiger Parameter",
117*86b64dcbSAndroid Build Coastguard Worker "Keine Berechtigung (Zugriffsrechte fehlen)",
118*86b64dcbSAndroid Build Coastguard Worker "Kein passendes Gerät gefunden (es könnte entfernt worden sein)",
119*86b64dcbSAndroid Build Coastguard Worker "Entität nicht gefunden",
120*86b64dcbSAndroid Build Coastguard Worker "Die Ressource ist belegt",
121*86b64dcbSAndroid Build Coastguard Worker "Die Wartezeit für die Operation ist abgelaufen",
122*86b64dcbSAndroid Build Coastguard Worker "Mehr Daten empfangen als erwartet",
123*86b64dcbSAndroid Build Coastguard Worker "Datenübergabe unterbrochen (broken pipe)",
124*86b64dcbSAndroid Build Coastguard Worker "Unterbrechung während des Betriebssystemaufrufs",
125*86b64dcbSAndroid Build Coastguard Worker "Nicht genügend Hauptspeicher verfügbar",
126*86b64dcbSAndroid Build Coastguard Worker "Die Operation wird nicht unterstützt oder ist auf dieser Platform nicht implementiert",
127*86b64dcbSAndroid Build Coastguard Worker "Allgemeiner Fehler",
128*86b64dcbSAndroid Build Coastguard Worker }, { /* Hungarian (hu) */
129*86b64dcbSAndroid Build Coastguard Worker "Sikeres",
130*86b64dcbSAndroid Build Coastguard Worker "Be-/kimeneti hiba",
131*86b64dcbSAndroid Build Coastguard Worker "Érvénytelen paraméter",
132*86b64dcbSAndroid Build Coastguard Worker "Hozzáférés megtagadva",
133*86b64dcbSAndroid Build Coastguard Worker "Az eszköz nem található (eltávolították?)",
134*86b64dcbSAndroid Build Coastguard Worker "Nem található",
135*86b64dcbSAndroid Build Coastguard Worker "Az erőforrás foglalt",
136*86b64dcbSAndroid Build Coastguard Worker "Időtúllépés",
137*86b64dcbSAndroid Build Coastguard Worker "Túlcsordulás",
138*86b64dcbSAndroid Build Coastguard Worker "Törött adatcsatorna",
139*86b64dcbSAndroid Build Coastguard Worker "Rendszerhívás megszakítva",
140*86b64dcbSAndroid Build Coastguard Worker "Nincs elég memória",
141*86b64dcbSAndroid Build Coastguard Worker "A művelet nem támogatott ezen a rendszeren",
142*86b64dcbSAndroid Build Coastguard Worker "Általános hiba",
143*86b64dcbSAndroid Build Coastguard Worker },
144*86b64dcbSAndroid Build Coastguard Worker };
145*86b64dcbSAndroid Build Coastguard Worker
146*86b64dcbSAndroid Build Coastguard Worker static const char * const (*usbi_error_strings)[LIBUSB_ERROR_COUNT] = &usbi_localized_errors[0];
147*86b64dcbSAndroid Build Coastguard Worker
148*86b64dcbSAndroid Build Coastguard Worker /** \ingroup libusb_misc
149*86b64dcbSAndroid Build Coastguard Worker * Set the language, and only the language, not the encoding! used for
150*86b64dcbSAndroid Build Coastguard Worker * translatable libusb messages.
151*86b64dcbSAndroid Build Coastguard Worker *
152*86b64dcbSAndroid Build Coastguard Worker * This takes a locale string in the default setlocale format: lang[-region]
153*86b64dcbSAndroid Build Coastguard Worker * or lang[_country_region][.codeset]. Only the lang part of the string is
154*86b64dcbSAndroid Build Coastguard Worker * used, and only 2 letter ISO 639-1 codes are accepted for it, such as "de".
155*86b64dcbSAndroid Build Coastguard Worker * The optional region, country_region or codeset parts are ignored. This
156*86b64dcbSAndroid Build Coastguard Worker * means that functions which return translatable strings will NOT honor the
157*86b64dcbSAndroid Build Coastguard Worker * specified encoding.
158*86b64dcbSAndroid Build Coastguard Worker * All strings returned are encoded as UTF-8 strings.
159*86b64dcbSAndroid Build Coastguard Worker *
160*86b64dcbSAndroid Build Coastguard Worker * If libusb_setlocale() is not called, all messages will be in English.
161*86b64dcbSAndroid Build Coastguard Worker *
162*86b64dcbSAndroid Build Coastguard Worker * The following functions return translatable strings: libusb_strerror().
163*86b64dcbSAndroid Build Coastguard Worker * Note that the libusb log messages controlled through LIBUSB_OPTION_LOG_LEVEL
164*86b64dcbSAndroid Build Coastguard Worker * are not translated, they are always in English.
165*86b64dcbSAndroid Build Coastguard Worker *
166*86b64dcbSAndroid Build Coastguard Worker * For POSIX UTF-8 environments if you want libusb to follow the standard
167*86b64dcbSAndroid Build Coastguard Worker * locale settings, call libusb_setlocale(setlocale(LC_MESSAGES, NULL)),
168*86b64dcbSAndroid Build Coastguard Worker * after your app has done its locale setup.
169*86b64dcbSAndroid Build Coastguard Worker *
170*86b64dcbSAndroid Build Coastguard Worker * \param locale locale-string in the form of lang[_country_region][.codeset]
171*86b64dcbSAndroid Build Coastguard Worker * or lang[-region], where lang is a 2 letter ISO 639-1 code
172*86b64dcbSAndroid Build Coastguard Worker * \returns \ref LIBUSB_SUCCESS on success
173*86b64dcbSAndroid Build Coastguard Worker * \returns \ref LIBUSB_ERROR_INVALID_PARAM if the locale doesn't meet the requirements
174*86b64dcbSAndroid Build Coastguard Worker * \returns \ref LIBUSB_ERROR_NOT_FOUND if the requested language is not supported
175*86b64dcbSAndroid Build Coastguard Worker * \returns a LIBUSB_ERROR code on other errors
176*86b64dcbSAndroid Build Coastguard Worker */
177*86b64dcbSAndroid Build Coastguard Worker
libusb_setlocale(const char * locale)178*86b64dcbSAndroid Build Coastguard Worker int API_EXPORTED libusb_setlocale(const char *locale)
179*86b64dcbSAndroid Build Coastguard Worker {
180*86b64dcbSAndroid Build Coastguard Worker size_t i;
181*86b64dcbSAndroid Build Coastguard Worker
182*86b64dcbSAndroid Build Coastguard Worker if (!locale || strlen(locale) < 2
183*86b64dcbSAndroid Build Coastguard Worker || (locale[2] != '\0' && locale[2] != '-' && locale[2] != '_' && locale[2] != '.'))
184*86b64dcbSAndroid Build Coastguard Worker return LIBUSB_ERROR_INVALID_PARAM;
185*86b64dcbSAndroid Build Coastguard Worker
186*86b64dcbSAndroid Build Coastguard Worker for (i = 0; i < ARRAYSIZE(usbi_locale_supported); i++) {
187*86b64dcbSAndroid Build Coastguard Worker if (usbi_locale_supported[i][0] == tolower((unsigned char)locale[0])
188*86b64dcbSAndroid Build Coastguard Worker && usbi_locale_supported[i][1] == tolower((unsigned char)locale[1]))
189*86b64dcbSAndroid Build Coastguard Worker break;
190*86b64dcbSAndroid Build Coastguard Worker }
191*86b64dcbSAndroid Build Coastguard Worker
192*86b64dcbSAndroid Build Coastguard Worker if (i == ARRAYSIZE(usbi_locale_supported))
193*86b64dcbSAndroid Build Coastguard Worker return LIBUSB_ERROR_NOT_FOUND;
194*86b64dcbSAndroid Build Coastguard Worker
195*86b64dcbSAndroid Build Coastguard Worker usbi_error_strings = &usbi_localized_errors[i];
196*86b64dcbSAndroid Build Coastguard Worker
197*86b64dcbSAndroid Build Coastguard Worker return LIBUSB_SUCCESS;
198*86b64dcbSAndroid Build Coastguard Worker }
199*86b64dcbSAndroid Build Coastguard Worker
200*86b64dcbSAndroid Build Coastguard Worker /** \ingroup libusb_misc
201*86b64dcbSAndroid Build Coastguard Worker * Returns a constant string with a short description of the given error code,
202*86b64dcbSAndroid Build Coastguard Worker * this description is intended for displaying to the end user and will be in
203*86b64dcbSAndroid Build Coastguard Worker * the language set by libusb_setlocale().
204*86b64dcbSAndroid Build Coastguard Worker *
205*86b64dcbSAndroid Build Coastguard Worker * The returned string is encoded in UTF-8.
206*86b64dcbSAndroid Build Coastguard Worker *
207*86b64dcbSAndroid Build Coastguard Worker * The messages always start with a capital letter and end without any dot.
208*86b64dcbSAndroid Build Coastguard Worker * The caller must not free() the returned string.
209*86b64dcbSAndroid Build Coastguard Worker *
210*86b64dcbSAndroid Build Coastguard Worker * \param errcode the error code whose description is desired
211*86b64dcbSAndroid Build Coastguard Worker * \returns a short description of the error code in UTF-8 encoding
212*86b64dcbSAndroid Build Coastguard Worker */
libusb_strerror(int errcode)213*86b64dcbSAndroid Build Coastguard Worker DEFAULT_VISIBILITY const char * LIBUSB_CALL libusb_strerror(int errcode)
214*86b64dcbSAndroid Build Coastguard Worker {
215*86b64dcbSAndroid Build Coastguard Worker int errcode_index = -errcode;
216*86b64dcbSAndroid Build Coastguard Worker
217*86b64dcbSAndroid Build Coastguard Worker if (errcode_index < 0 || errcode_index >= LIBUSB_ERROR_COUNT) {
218*86b64dcbSAndroid Build Coastguard Worker /* "Other Error", which should always be our last message, is returned */
219*86b64dcbSAndroid Build Coastguard Worker errcode_index = LIBUSB_ERROR_COUNT - 1;
220*86b64dcbSAndroid Build Coastguard Worker }
221*86b64dcbSAndroid Build Coastguard Worker
222*86b64dcbSAndroid Build Coastguard Worker return (*usbi_error_strings)[errcode_index];
223*86b64dcbSAndroid Build Coastguard Worker }
224