📄 winapp.cxx
字号:
// Copyright (c) 1997 James Clark// See the file COPYING for copying permission.#include "splib.h"#ifdef SP_WIDE_SYSTEM#include "WinApp.h"#include "CodingSystemKit.h"#include "Ptr.h"#include "ExtendEntityManager.h"#include "SOEntityCatalog.h"#include "SgmlParser.h"#include "PosixStorage.h"#include "LiteralStorage.h"#ifdef SP_WININET#include "WinInetStorage.h"#else#include "URLStorage.h"#endif#define STRICT#include <windows.h>#include "macros.h"#ifndef SP_DEFAULT_ENCODING#define SP_DEFAULT_ENCODING "WINDOWS"#endif#ifndef SP_REGISTRY_KEY#define SP_REGISTRY_KEY "Software\\James Clark\\SP"#endif#ifdef SP_NAMESPACEnamespace SP_NAMESPACE {#endifstaticStringC asStringC(const char *s){ StringC tem; if (s) { while (*s) tem += (unsigned char)*s++; } return tem;}WinApp::WinApp(){ getRegistry("Catalogs", defaultCatalogs_); getRegistry("Directories", defaultDirectories_); getRegistry("Encoding", defaultEncoding_); if (defaultEncoding_.size() == 0 || !getCodingSystem(defaultEncoding_)) { defaultEncoding_ = asStringC(SP_DEFAULT_ENCODING); }}const InputCodingSystem *WinApp::getCodingSystem(const StringC &name){ if (name.size() == 0) return 0; if (codingSystemKit_.isNull()) codingSystemKit_ = CodingSystemKit::make(0); const char *tem; return codingSystemKit_->makeInputCodingSystem(name, codingSystemKit_->systemCharset(), 0, tem);}staticvoid split(const StringC &str, Char sep, Vector<StringC> &result){ Boolean started = 0; for (size_t i = 0; i < str.size(); i++) { if (str[i] == sep) started = 0; else { if (!started) { result.resize(result.size() + 1); started = 1; } result.back() += str[i]; } }}void WinApp::initParser(const StringC &sysid, SgmlParser &parser){ Ptr<EntityManager> em; initParser(sysid, parser, em);}void WinApp::initParser(const StringC &sysid, SgmlParser &parser, Ptr<EntityManager> &em){ const InputCodingSystem *codingSystem = getCodingSystem(encoding_); if (!codingSystem) codingSystem = getCodingSystem(defaultEncoding_); ConstPtr<InputCodingSystemKit> icsk; icsk.swap(codingSystemKit_); const CharsetInfo *systemCharset = &icsk->systemCharset(); PosixStorageManager *sm = new PosixStorageManager("OSFILE", systemCharset, 5); { Vector<StringC> dirs; split(extraDirectories_, ';', dirs); split(defaultDirectories_, ';', dirs); for (size_t i = 0; i < dirs.size(); i++) sm->addSearchDir(dirs[i]); } ExtendEntityManager *xem = ExtendEntityManager::make(sm, codingSystem, icsk, 0); em = xem; xem ->registerStorageManager(new PosixFdStorageManager("OSFD", systemCharset));#ifdef SP_WININET xem->registerStorageManager(new WinInetStorageManager("URL"));#else xem->registerStorageManager(new URLStorageManager("URL"));#endif xem->registerStorageManager(new LiteralStorageManager("LITERAL")); Vector<StringC> catalogSysids; split(extraCatalogs_, ';', catalogSysids); size_t nExtra = catalogSysids.size(); split(defaultCatalogs_, ';', catalogSysids); xem->setCatalogManager(SOCatalogManager::make(catalogSysids, nExtra, systemCharset, systemCharset, 1)); SgmlParser::Params params; params.sysid = sysid; params.entityManager = em.pointer(); params.options = &options; parser.init(params);}void WinApp::setDefaultCatalogs(StringC &tem){ if (tem != defaultCatalogs_) { tem.swap(defaultCatalogs_); setRegistry("Catalogs", defaultCatalogs_); }}void WinApp::setDefaultDirectories(StringC &tem){ if (tem != defaultDirectories_) { tem.swap(defaultDirectories_); setRegistry("Directories", defaultDirectories_); }}Boolean WinApp::setEncoding(StringC &str){ if (!getCodingSystem(str)) return 0; str.swap(encoding_); return 1;}Boolean WinApp::setDefaultEncoding(StringC &str){ if (!getCodingSystem(str)) return 0; str.swap(defaultEncoding_); setRegistry("Encoding", defaultEncoding_); return 1;}void WinApp::setRegistry(const char *name, const StringC &value){ HKEY hk; if (RegCreateKeyA(HKEY_CURRENT_USER, SP_REGISTRY_KEY, &hk) != ERROR_SUCCESS) return; String<char> buf; int len = WideCharToMultiByte(CP_ACP, 0, value.data(), value.size(), 0, 0, 0, 0); buf.resize(len + 1); WideCharToMultiByte(CP_ACP, 0, value.data(), value.size(), buf.begin(), len, 0, 0); buf[len] = '\0'; RegSetValueA(hk, name, REG_SZ, buf.data(), len); RegCloseKey(hk);}Boolean WinApp::getRegistry(const char *name, StringC &value){ HKEY hk; if (RegOpenKeyA(HKEY_CURRENT_USER, SP_REGISTRY_KEY, &hk) != ERROR_SUCCESS) return 0; String<char> buf; long size; Boolean retval = 0; if (RegQueryValueA(hk, name, 0, &size) == ERROR_SUCCESS) { buf.resize(size); if (RegQueryValueA(hk, name, &buf[0], &size) == ERROR_SUCCESS) { int nChars = MultiByteToWideChar(CP_ACP, 0, buf.data(), size - 1, 0, 0); if (nChars || GetLastError() == ERROR_SUCCESS) { value.resize(nChars); if (MultiByteToWideChar(CP_ACP, 0, buf.data(), size - 1, &value[0], nChars) == nChars) retval = 1; else value.resize(0); } } } RegCloseKey(hk); return retval;}#ifdef SP_NAMESPACE}#endif#endif /* SP_WIDE_SYSTEM */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -