1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Copyright (C) 1998-2004, International Business Machines
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*  ucnvdisp.c:
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*  Implements APIs for the ICU's codeset conversion library display names.
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History:
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Date        Name        Description
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   04/04/99    helena      Fixed internal header inclusion.
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   05/09/00    helena      Added implementation to handle fallback mappings.
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   06/20/2000  helena      OS/400 port changes; mostly typecast.
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   09/08/2004  grhoten     split from ucnv.c
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_CONVERSION
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ures.h"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv.h"
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cstring.h"
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ustr_imp.h"
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ucnv_imp.h"
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "putilimp.h"
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruucnv_getDisplayName(const UConverter *cnv,
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    const char *displayLocale,
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    UChar *displayName, int32_t displayNameCapacity,
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    UErrorCode *pErrorCode) {
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UResourceBundle *rb;
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *name;
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t length;
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode localStatus = U_ZERO_ERROR;
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* check arguments */
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(cnv==NULL || displayNameCapacity<0 || (displayNameCapacity>0 && displayName==NULL)) {
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* open the resource bundle and get the display name string */
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    rb=ures_open(NULL, displayLocale, pErrorCode);
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(*pErrorCode)) {
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* use the internal name as the key */
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    name=ures_getStringByKey(rb, cnv->sharedData->staticData->name, &length, &localStatus);
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ures_close(rb);
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(localStatus)) {
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* copy the string */
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (*pErrorCode == U_ZERO_ERROR) {
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            *pErrorCode = localStatus;
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        u_memcpy(displayName, name, uprv_min(length, displayNameCapacity)*U_SIZEOF_UCHAR);
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* convert the internal name into a Unicode string */
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        length=(int32_t)uprv_strlen(cnv->sharedData->staticData->name);
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        u_charsToUChars(cnv->sharedData->staticData->name, displayName, uprv_min(length, displayNameCapacity));
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return u_terminateUChars(displayName, displayNameCapacity, length, pErrorCode);
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Hey, Emacs, please set the following:
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Local Variables:
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * indent-tabs-mode: nil
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * End:
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
87