1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
// -*- C++ -*-
//=============================================================================
/**
* @file Codeset_Registry.h
*
* $Id$
*
* ACE wrapper around access functions for the OSF's DCE codeset registry
* access functions
*
* For environments that intrinsicly support the DCE defined access functions,
* the methods in this class are simply wrappers. On other platforms, emulation
* is provided. The motivation for this class is to support interoperability
* via translators and the CDR streams, primarily in TAO, but this capability
* is not restricted to CORBA.
*
* The emulated functionalty supports Open Group RFC #40, currently RFC 40.2,
* www.opengroup.org/tech/rfc/rfc40.2.html
*
* @author Phil Mesnier <mesnier_p@ociweb.com>
*/
//=============================================================================
#ifndef ACE_CODESET_REGISTRY_H
#define ACE_CODESET_REGISTRY_H
#include /**/ "ace/pre.h"
#include "ace/SString.h"
#include "ace/CDR_Base.h"
#include "ace/Codeset_Symbols.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#if defined (ACE_HAS_DCE_CODESET_REGISTRY)
#include /**/ <dce/rpc.h>
#endif /* ACE_HAS_DCE_CODESET_REGISTRY */
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
class ACE_Export ACE_Codeset_Registry
{
public:
/// Based on a locale string, find the registry value and optional codeset
/// collection. This wraps the dce_cs_loc_to_rgy function, or emulates it.
static int locale_to_registry (const ACE_CString &locale,
ACE_CDR::ULong &codeset_id,
ACE_CDR::UShort * = 0,
ACE_CDR::UShort ** = 0);
/// Based on a registry value, find the locale string and optional codeset
/// collection. This wraps the dce_cs_rgy_to_loc function, or emulates it.
static int registry_to_locale (ACE_CDR::ULong codeset_id,
ACE_CString &locale,
ACE_CDR::UShort * = 0,
ACE_CDR::UShort ** = 0);
/// Tell if two codesets are compatible. This wraps the
/// rpc_cs_char_set_compat_check function.
static int is_compatible (ACE_CDR::ULong codeset_id,
ACE_CDR::ULong other);
/// Return the max number of bytes required to represent a single character.
/// This wraps the rpc_rgy_get_max_bytes function.
static ACE_CDR::Short get_max_bytes (ACE_CDR::ULong codeset_id);
enum {max_charsets_ = 5};
protected:
typedef struct {
const char * desc_;
const char * loc_name_;
ACE_CDR::ULong codeset_id_;
ACE_CDR::UShort num_sets_;
ACE_CDR::UShort char_sets_[max_charsets_];
ACE_CDR::UShort max_bytes_;
} registry_entry;
private:
static size_t const num_registry_entries_;
static registry_entry const registry_db_[];
static int locale_to_registry_i (const ACE_CString &locale,
ACE_CDR::ULong &codeset_id,
ACE_CDR::UShort * = 0,
ACE_CDR::UShort ** = 0);
static int registry_to_locale_i (ACE_CDR::ULong codeset_id,
ACE_CString &locale,
ACE_CDR::UShort * = 0,
ACE_CDR::UShort ** = 0);
static int is_compatible_i (ACE_CDR::ULong codeset_id,
ACE_CDR::ULong other);
static ACE_CDR::Short get_max_bytes_i (ACE_CDR::ULong codeset_id);
};
ACE_END_VERSIONED_NAMESPACE_DECL
#if defined (__ACE_INLINE__)
#include "ace/Codeset_Registry.inl"
#endif /* __ACE_INLINE__ */
#include /**/ "ace/post.h"
#endif /* ACE_CODESET_REGISTRY_H */
|