1 // Copyright (c) 1997 James Clark
2 // See the file COPYING for copying permission.
3 #pragma ident "%Z%%M% %I% %E% SMI"
10 #include "CodingSystemKit.h"
12 #include "ExtendEntityManager.h"
13 #include "SOEntityCatalog.h"
14 #include "SgmlParser.h"
15 #include "PosixStorage.h"
16 #include "LiteralStorage.h"
18 #include "WinInetStorage.h"
20 #include "URLStorage.h"
26 #ifndef SP_DEFAULT_ENCODING
27 #define SP_DEFAULT_ENCODING "WINDOWS"
30 #ifndef SP_REGISTRY_KEY
31 #define SP_REGISTRY_KEY "Software\\James Clark\\SP"
35 namespace SP_NAMESPACE
{
39 StringC
asStringC(const char *s
)
44 tem
+= (unsigned char)*s
++;
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
)
64 if (codingSystemKit_
.isNull())
65 codingSystemKit_
= CodingSystemKit::make(0);
67 return codingSystemKit_
->makeInputCodingSystem(name
,
68 codingSystemKit_
->systemCharset(),
74 void split(const StringC
&str
, Char sep
, Vector
<StringC
> &result
)
77 for (size_t i
= 0; i
< str
.size(); i
++) {
82 result
.resize(result
.size() + 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_
);
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",
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
,
124 ->registerStorageManager(new PosixFdStorageManager("OSFD",
127 xem
->registerStorageManager(new WinInetStorageManager("URL"));
129 xem
->registerStorageManager(new URLStorageManager("URL"));
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
,
141 SgmlParser::Params params
;
142 params
.sysid
= sysid
;
143 params
.entityManager
= em
.pointer();
144 params
.options
= &options
;
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
))
172 Boolean
WinApp::setDefaultEncoding(StringC
&str
)
174 if (!getCodingSystem(str
))
176 str
.swap(defaultEncoding_
);
177 setRegistry("Encoding", defaultEncoding_
);
181 void WinApp::setRegistry(const char *name
, const StringC
&value
)
184 if (RegCreateKeyA(HKEY_CURRENT_USER
, SP_REGISTRY_KEY
, &hk
) != ERROR_SUCCESS
)
187 int len
= WideCharToMultiByte(CP_ACP
, 0, value
.data(), value
.size(), 0, 0, 0, 0);
189 WideCharToMultiByte(CP_ACP
, 0, value
.data(), value
.size(), buf
.begin(), len
, 0, 0);
191 RegSetValue(hk
, name
, REG_SZ
, buf
.data(), len
);
195 Boolean
WinApp::getRegistry(const char *name
, StringC
&value
)
198 if (RegOpenKeyA(HKEY_CURRENT_USER
, SP_REGISTRY_KEY
, &hk
) != ERROR_SUCCESS
)
203 if (RegQueryValueA(hk
, name
, 0, &size
) == ERROR_SUCCESS
) {
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
)
224 #endif /* SP_WIDE_SYSTEM */