1
// Copyright (c) 1996 James Clark
2
// See the file COPYING for copying permission.
9
#include "MessageTable.h"
11
#ifdef SP_NO_MESSAGE_TEXT
15
#define WIN32_LEAN_AND_MEAN
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
static WinMessageTable theMessageTable;
85
BOOL WINAPI DllMain(HINSTANCE inst, ULONG reason, LPVOID)
87
if (reason == DLL_PROCESS_ATTACH)
88
dllInstanceHandle = inst;
93
#else /* not SP_NO_MESSAGE_TEXT */
95
#ifdef SP_HAVE_GETTEXT
97
extern char *dgettext(const char *, const char *);
98
extern char *gettext(const char *);
99
extern char *textdomain(const char *);
100
extern char *bindtextdomain(const char *, const char *);
105
#ifndef MESSAGE_DOMAIN
106
#define MESSAGE_DOMAIN "sp"
110
namespace SP_NAMESPACE {
113
class GettextMessageTable : public MessageTable {
115
GettextMessageTable();
116
Boolean getText(const MessageFragment &, String<SP_TCHAR> &) const;
120
GettextMessageTable::GettextMessageTable()
122
const char *dir = getenv("TEXTDOMAINDIR");
124
bindtextdomain(MESSAGE_DOMAIN, dir);
127
Boolean GettextMessageTable::getText(const MessageFragment &frag,
128
String<SP_TCHAR> &str) const
130
const char *s = frag.text();
133
s = dgettext(MESSAGE_DOMAIN, s);
136
str.assign(s, strlen(s));
140
static GettextMessageTable theMessageTable;
146
#else /* not SP_HAVE_GETTEXT */
149
namespace SP_NAMESPACE {
152
class DefaultMessageTable : public MessageTable {
154
Boolean getText(const MessageFragment &, String<SP_TCHAR> &) const;
157
Boolean DefaultMessageTable::getText(const MessageFragment &frag,
158
String<SP_TCHAR> &str) const
163
for (const char *s = frag.text(); *s; s++)
164
str += SP_TCHAR((unsigned char)*s);
168
static DefaultMessageTable theMessageTable;
174
#endif /* not SP_HAVE_GETTEXT */
176
#endif /* not SP_NO_MESSAGE_TEXT */
179
namespace SP_NAMESPACE {
182
const MessageTable *MessageTable::instance()
184
return &theMessageTable;