~ubuntu-branches/ubuntu/trusty/openjade1.3/trusty

« back to all changes in this revision

Viewing changes to lib/MessageTable.cxx

  • Committer: Bazaar Package Importer
  • Author(s): Yann Dirson
  • Date: 2002-04-09 00:01:50 UTC
  • Revision ID: james.westby@ubuntu.com-20020409000150-r9rkyalxlhvf9ba3
Tags: upstream-1.3.1
ImportĀ upstreamĀ versionĀ 1.3.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright (c) 1996 James Clark
 
2
// See the file COPYING for copying permission.
 
3
 
 
4
#ifdef __GNUG__
 
5
#pragma implementation
 
6
#endif
 
7
 
 
8
#include "splib.h"
 
9
#include "MessageTable.h"
 
10
 
 
11
#ifdef SP_NO_MESSAGE_TEXT
 
12
 
 
13
// Windows only
 
14
 
 
15
#define WIN32_LEAN_AND_MEAN
 
16
#define STRICT
 
17
#include "windows.h"
 
18
static HINSTANCE dllInstanceHandle = NULL;
 
19
 
 
20
#ifdef SP_NAMESPACE
 
21
namespace SP_NAMESPACE {
 
22
#endif
 
23
 
 
24
class WinMessageTable : public MessageTable {
 
25
public:
 
26
  Boolean getText(const MessageFragment &,
 
27
                  String<SP_TCHAR> &) const;
 
28
  
 
29
};
 
30
 
 
31
Boolean WinMessageTable::getText(const MessageFragment &frag,
 
32
                                 String<SP_TCHAR> &str) const
 
33
{
 
34
  static const int bufSize = 4096;
 
35
  SP_TCHAR buf[bufSize];
 
36
#ifdef SP_WIDE_SYSTEM
 
37
  int len = LoadStringW(frag.module() == MessageFragment::libModule
 
38
                       ? dllInstanceHandle
 
39
                       : 0,
 
40
                       frag.number(),
 
41
                       buf,
 
42
                       bufSize);
 
43
  if (len == 0 && GetLastError() != 0) {
 
44
    char bufmb[bufSize*2];
 
45
    len = LoadStringA(frag.module() == MessageFragment::libModule
 
46
                      ? dllInstanceHandle
 
47
                      : 0,
 
48
                      frag.number(),
 
49
                      bufmb,
 
50
                      bufSize*2);
 
51
    if (len != 0) {
 
52
      len = MultiByteToWideChar(CP_ACP, 0, bufmb, len, buf, bufSize);
 
53
      if (len == 0 && GetLastError() != 0)
 
54
        return 0;
 
55
    }
 
56
    else if (GetLastError() != 0)
 
57
      return 0;
 
58
  }
 
59
#else /* not SP_WIDE_SYSTEM */
 
60
  int len = LoadStringA(frag.module() == MessageFragment::libModule
 
61
                        ? dllInstanceHandle
 
62
                        : 0,
 
63
                        frag.number(),
 
64
                        buf,
 
65
                        bufSize);
 
66
  if (len == 0 && GetLastError() != 0)
 
67
    return 0;
 
68
#endif /* not SP_WIDE_SYSTEM */
 
69
  if (len == 0) {
 
70
    str.resize(0);
 
71
    return 1;
 
72
  }
 
73
  str.assign(buf, len);
 
74
  return 1;
 
75
}
 
76
 
 
77
static WinMessageTable theMessageTable;
 
78
 
 
79
#ifdef SP_NAMESPACE
 
80
}
 
81
#endif
 
82
 
 
83
#ifdef SP_USE_DLL
 
84
extern "C"
 
85
BOOL WINAPI DllMain(HINSTANCE inst, ULONG reason, LPVOID)
 
86
{
 
87
  if (reason == DLL_PROCESS_ATTACH)
 
88
    dllInstanceHandle = inst;
 
89
  return TRUE;
 
90
}
 
91
#endif
 
92
 
 
93
#else /* not SP_NO_MESSAGE_TEXT */
 
94
 
 
95
#ifdef SP_HAVE_GETTEXT
 
96
extern "C" {
 
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 *);
 
101
}
 
102
 
 
103
#include <stdlib.h>
 
104
 
 
105
#ifndef MESSAGE_DOMAIN
 
106
#define MESSAGE_DOMAIN "sp"
 
107
#endif
 
108
 
 
109
#ifdef SP_NAMESPACE
 
110
namespace SP_NAMESPACE {
 
111
#endif
 
112
 
 
113
class GettextMessageTable : public MessageTable {
 
114
public:
 
115
  GettextMessageTable();
 
116
  Boolean getText(const MessageFragment &, String<SP_TCHAR> &) const;
 
117
  
 
118
};
 
119
 
 
120
GettextMessageTable::GettextMessageTable()
 
121
{
 
122
  const char *dir = getenv("TEXTDOMAINDIR");
 
123
  if (dir)
 
124
    bindtextdomain(MESSAGE_DOMAIN, dir);
 
125
}
 
126
 
 
127
Boolean GettextMessageTable::getText(const MessageFragment &frag,
 
128
                                     String<SP_TCHAR> &str) const
 
129
{
 
130
  const char *s = frag.text();
 
131
  if (!s)
 
132
    return 0;
 
133
  s = dgettext(MESSAGE_DOMAIN, s);
 
134
  if (!s)
 
135
    return 0;
 
136
  str.assign(s, strlen(s));
 
137
  return 1;
 
138
}
 
139
 
 
140
static GettextMessageTable theMessageTable;
 
141
 
 
142
#ifdef SP_NAMESPACE
 
143
}
 
144
#endif
 
145
 
 
146
#else /* not SP_HAVE_GETTEXT */
 
147
 
 
148
#ifdef SP_NAMESPACE
 
149
namespace SP_NAMESPACE {
 
150
#endif
 
151
 
 
152
class DefaultMessageTable : public MessageTable {
 
153
public:
 
154
  Boolean getText(const MessageFragment &, String<SP_TCHAR> &) const;
 
155
};
 
156
 
 
157
Boolean DefaultMessageTable::getText(const MessageFragment &frag,
 
158
                                     String<SP_TCHAR> &str) const
 
159
{
 
160
  if (!frag.text())
 
161
    return 0;
 
162
  str.resize(0);
 
163
  for (const char *s = frag.text(); *s; s++)
 
164
    str += SP_TCHAR((unsigned char)*s);
 
165
  return 1;
 
166
}
 
167
 
 
168
static DefaultMessageTable theMessageTable;
 
169
 
 
170
#ifdef SP_NAMESPACE
 
171
}
 
172
#endif
 
173
 
 
174
#endif /* not SP_HAVE_GETTEXT */
 
175
 
 
176
#endif /* not SP_NO_MESSAGE_TEXT */
 
177
 
 
178
#ifdef SP_NAMESPACE
 
179
namespace SP_NAMESPACE {
 
180
#endif
 
181
 
 
182
const MessageTable *MessageTable::instance()
 
183
{
 
184
  return &theMessageTable;
 
185
}
 
186
 
 
187
#ifdef SP_NAMESPACE
 
188
}
 
189
#endif