3065 some functions in the tcp module can be static
[unleashed.git] / usr / src / cmd / man / src / util / nsgmls.src / lib / WinApp.cxx
blob2524b7cf4ec9b193256a75bdc4bcf2cb0959d310
1 // Copyright (c) 1997 James Clark
2 // See the file COPYING for copying permission.
3 #pragma ident "%Z%%M% %I% %E% SMI"
5 #include "splib.h"
7 #ifdef SP_WIDE_SYSTEM
9 #include "WinApp.h"
10 #include "CodingSystemKit.h"
11 #include "Ptr.h"
12 #include "ExtendEntityManager.h"
13 #include "SOEntityCatalog.h"
14 #include "SgmlParser.h"
15 #include "PosixStorage.h"
16 #include "LiteralStorage.h"
17 #ifdef SP_WININET
18 #include "WinInetStorage.h"
19 #else
20 #include "URLStorage.h"
21 #endif
22 #define STRICT
23 #include <windows.h>
24 #include "macros.h"
26 #ifndef SP_DEFAULT_ENCODING
27 #define SP_DEFAULT_ENCODING "WINDOWS"
28 #endif
30 #ifndef SP_REGISTRY_KEY
31 #define SP_REGISTRY_KEY "Software\\James Clark\\SP"
32 #endif
34 #ifdef SP_NAMESPACE
35 namespace SP_NAMESPACE {
36 #endif
38 static
39 StringC asStringC(const char *s)
41 StringC tem;
42 if (s) {
43 while (*s)
44 tem += (unsigned char)*s++;
46 return tem;
49 WinApp::WinApp()
51 getRegistry("Catalogs", defaultCatalogs_);
52 getRegistry("Directories", defaultDirectories_);
53 getRegistry("Encoding", defaultEncoding_);
54 if (defaultEncoding_.size() == 0 || !getCodingSystem(defaultEncoding_)) {
55 defaultEncoding_ = asStringC(SP_DEFAULT_ENCODING);
59 const InputCodingSystem *
60 WinApp::getCodingSystem(const StringC &name)
62 if (name.size() == 0)
63 return 0;
64 if (codingSystemKit_.isNull())
65 codingSystemKit_ = CodingSystemKit::make(0);
66 const char *tem;
67 return codingSystemKit_->makeInputCodingSystem(name,
68 codingSystemKit_->systemCharset(),
70 tem);
73 static
74 void split(const StringC &str, Char sep, Vector<StringC> &result)
76 Boolean started = 0;
77 for (size_t i = 0; i < str.size(); i++) {
78 if (str[i] == sep)
79 started = 0;
80 else {
81 if (!started) {
82 result.resize(result.size() + 1);
83 started = 1;
85 result.back() += str[i];
90 void WinApp::initParser(const StringC &sysid, SgmlParser &parser)
92 Ptr<EntityManager> em;
93 initParser(sysid, parser, em);
96 void WinApp::initParser(const StringC &sysid, SgmlParser &parser,
97 Ptr<EntityManager> &em)
99 const InputCodingSystem *codingSystem = getCodingSystem(encoding_);
100 if (!codingSystem)
101 codingSystem = getCodingSystem(defaultEncoding_);
102 ConstPtr<InputCodingSystemKit> icsk;
103 icsk.swap(codingSystemKit_);
104 const CharsetInfo *systemCharset = &icsk->systemCharset();
106 PosixStorageManager *sm
107 = new PosixStorageManager("OSFILE",
108 systemCharset,
111 Vector<StringC> dirs;
112 split(extraDirectories_, ';', dirs);
113 split(defaultDirectories_, ';', dirs);
114 for (size_t i = 0; i < dirs.size(); i++)
115 sm->addSearchDir(dirs[i]);
117 ExtendEntityManager *xem
118 = ExtendEntityManager::make(sm,
119 codingSystem,
120 icsk,
122 em = xem;
124 ->registerStorageManager(new PosixFdStorageManager("OSFD",
125 systemCharset));
126 #ifdef SP_WININET
127 xem->registerStorageManager(new WinInetStorageManager("URL"));
128 #else
129 xem->registerStorageManager(new URLStorageManager("URL"));
130 #endif
131 xem->registerStorageManager(new LiteralStorageManager("LITERAL"));
132 Vector<StringC> catalogSysids;
133 split(extraCatalogs_, ';', catalogSysids);
134 size_t nExtra = catalogSysids.size();
135 split(defaultCatalogs_, ';', catalogSysids);
136 xem->setCatalogManager(SOCatalogManager::make(catalogSysids,
137 nExtra,
138 systemCharset,
139 systemCharset,
140 1));
141 SgmlParser::Params params;
142 params.sysid = sysid;
143 params.entityManager = em.pointer();
144 params.options = &options;
145 parser.init(params);
148 void WinApp::setDefaultCatalogs(StringC &tem)
150 if (tem != defaultCatalogs_) {
151 tem.swap(defaultCatalogs_);
152 setRegistry("Catalogs", defaultCatalogs_);
156 void WinApp::setDefaultDirectories(StringC &tem)
158 if (tem != defaultDirectories_) {
159 tem.swap(defaultDirectories_);
160 setRegistry("Directories", defaultDirectories_);
164 Boolean WinApp::setEncoding(StringC &str)
166 if (!getCodingSystem(str))
167 return 0;
168 str.swap(encoding_);
169 return 1;
172 Boolean WinApp::setDefaultEncoding(StringC &str)
174 if (!getCodingSystem(str))
175 return 0;
176 str.swap(defaultEncoding_);
177 setRegistry("Encoding", defaultEncoding_);
178 return 1;
181 void WinApp::setRegistry(const char *name, const StringC &value)
183 HKEY hk;
184 if (RegCreateKeyA(HKEY_CURRENT_USER, SP_REGISTRY_KEY, &hk) != ERROR_SUCCESS)
185 return;
186 String<char> buf;
187 int len = WideCharToMultiByte(CP_ACP, 0, value.data(), value.size(), 0, 0, 0, 0);
188 buf.resize(len + 1);
189 WideCharToMultiByte(CP_ACP, 0, value.data(), value.size(), buf.begin(), len, 0, 0);
190 buf[len] = '\0';
191 RegSetValue(hk, name, REG_SZ, buf.data(), len);
192 RegCloseKey(hk);
195 Boolean WinApp::getRegistry(const char *name, StringC &value)
197 HKEY hk;
198 if (RegOpenKeyA(HKEY_CURRENT_USER, SP_REGISTRY_KEY, &hk) != ERROR_SUCCESS)
199 return 0;
200 String<char> buf;
201 long size;
202 Boolean retval = 0;
203 if (RegQueryValueA(hk, name, 0, &size) == ERROR_SUCCESS) {
204 buf.resize(size);
205 if (RegQueryValueA(hk, name, &buf[0], &size) == ERROR_SUCCESS) {
206 int nChars = MultiByteToWideChar(CP_ACP, 0, buf.data(), size - 1, 0, 0);
207 if (nChars || GetLastError() == ERROR_SUCCESS) {
208 value.resize(nChars);
209 if (MultiByteToWideChar(CP_ACP, 0, buf.data(), size - 1, &value[0], nChars) == nChars)
210 retval = 1;
211 else
212 value.resize(0);
216 RegCloseKey(hk);
217 return retval;
220 #ifdef SP_NAMESPACE
222 #endif
224 #endif /* SP_WIDE_SYSTEM */