1 // Copyright (c) 1996 James Clark
2 // See the file COPYING for copying permission.
3 #pragma ident "%Z%%M% %I% %E% SMI"
10 #include "MessageTable.h"
12 #ifdef SP_NO_MESSAGE_TEXT
18 static HINSTANCE dllInstanceHandle
= NULL
;
21 namespace SP_NAMESPACE
{
24 class WinMessageTable
: public MessageTable
{
26 Boolean
getText(const MessageFragment
&,
27 String
<SP_TCHAR
> &) const;
31 Boolean
WinMessageTable::getText(const MessageFragment
&frag
,
32 String
<SP_TCHAR
> &str
) const
34 static const int bufSize
= 4096;
35 SP_TCHAR buf
[bufSize
];
37 int len
= LoadStringW(frag
.module() == MessageFragment::libModule
43 if (len
== 0 && GetLastError() != 0) {
44 char bufmb
[bufSize
*2];
45 len
= LoadStringA(frag
.module() == MessageFragment::libModule
52 len
= MultiByteToWideChar(CP_ACP
, 0, bufmb
, len
, buf
, bufSize
);
53 if (len
== 0 && GetLastError() != 0)
56 else if (GetLastError() != 0)
59 #else /* not SP_WIDE_SYSTEM */
60 int len
= LoadStringA(frag
.module() == MessageFragment::libModule
66 if (len
== 0 && GetLastError() != 0)
68 #endif /* not SP_WIDE_SYSTEM */
77 const MessageTable
*MessageTable::instance()
80 instance_
= new WinMessageTable
;
90 BOOL WINAPI
DllMain(HINSTANCE inst
, ULONG reason
, LPVOID
)
92 if (reason
== DLL_PROCESS_ATTACH
)
93 dllInstanceHandle
= inst
;
98 #else /* not SP_NO_MESSAGE_TEXT */
100 #ifdef SP_HAVE_GETTEXT
102 extern char *dgettext(const char *, const char *);
103 extern char *gettext(const char *);
104 extern char *textdomain(const char *);
105 extern char *bindtextdomain(const char *, const char *);
110 #ifndef MESSAGE_DOMAIN
111 #define MESSAGE_DOMAIN "sp"
115 namespace SP_NAMESPACE
{
118 class GettextMessageTable
: public MessageTable
{
120 GettextMessageTable();
121 Boolean
getText(const MessageFragment
&, String
<SP_TCHAR
> &) const;
125 GettextMessageTable::GettextMessageTable()
127 const char *dir
= getenv("TEXTDOMAINDIR");
129 bindtextdomain(MESSAGE_DOMAIN
, dir
);
132 Boolean
GettextMessageTable::getText(const MessageFragment
&frag
,
133 String
<SP_TCHAR
> &str
) const
135 const char *s
= frag
.text();
138 s
= dgettext(MESSAGE_DOMAIN
, s
);
141 str
.assign(s
, strlen(s
));
145 const MessageTable
*MessageTable::instance()
148 instance_
= new GettextMessageTable
;
156 #else /* not SP_HAVE_GETTEXT */
159 namespace SP_NAMESPACE
{
162 class DefaultMessageTable
: public MessageTable
{
164 Boolean
getText(const MessageFragment
&, String
<SP_TCHAR
> &) const;
167 Boolean
DefaultMessageTable::getText(const MessageFragment
&frag
,
168 String
<SP_TCHAR
> &str
) const
173 for (const char *s
= frag
.text(); *s
; s
++)
174 str
+= SP_TCHAR((unsigned char)*s
);
178 const MessageTable
*MessageTable::instance()
181 instance_
= new DefaultMessageTable
;
189 #endif /* not SP_HAVE_GETTEXT */
191 #endif /* not SP_NO_MESSAGE_TEXT */
194 namespace SP_NAMESPACE
{
197 MessageTable
*MessageTable::instance_
= 0;