/branches/sp-build/lib/EntityApp.cxx

# · C++ · 197 lines · 178 code · 16 blank · 3 comment · 31 complexity · 9a3580e196366611bf003e00ae8dc9e6 MD5 · raw file

  1. // Copyright (c) 1996 James Clark
  2. // See the file COPYING for copying permission.
  3. #ifdef __GNUG__
  4. #pragma implementation
  5. #endif
  6. #include "splib.h"
  7. #include "EntityApp.h"
  8. #include "sptchar.h"
  9. #include <stdlib.h>
  10. #include "PosixStorage.h"
  11. #ifdef SP_WININET
  12. #include "WinInetStorage.h"
  13. #else
  14. #include "URLStorage.h"
  15. #endif
  16. #include "LiteralStorage.h"
  17. #include "NotationStorage.h"
  18. #include "ExtendEntityManager.h"
  19. #include "SOEntityCatalog.h"
  20. #include "CodingSystem.h"
  21. #include "macros.h"
  22. #include "EntityAppMessages.h"
  23. #ifndef SGML_SEARCH_PATH_DEFAULT
  24. #define SGML_SEARCH_PATH_DEFAULT SP_T("")
  25. #endif
  26. #ifndef SGML_CATALOG_FILES_DEFAULT
  27. #define SGML_CATALOG_FILES_DEFAULT SP_T("")
  28. #endif /* not SGML_CATALOG_FILES_DEFAULT */
  29. #ifdef SP_NAMESPACE
  30. namespace SP_NAMESPACE {
  31. #endif
  32. const Char FILE_SEP = PATH_SEPARATOR;
  33. EntityApp::EntityApp(const char *requiredInternalCode)
  34. : CmdLineApp(requiredInternalCode),
  35. mapCatalogDocument_(0),
  36. restrictFileReading_(0)
  37. {
  38. registerOption('c', SP_T("catalog"),
  39. EntityAppMessages::sysid, EntityAppMessages::cHelp);
  40. registerOption('C', SP_T("catalogs"), EntityAppMessages::CHelp);
  41. registerOption('D', SP_T("directory"),
  42. EntityAppMessages::directory, EntityAppMessages::DHelp);
  43. registerOption('R', SP_T("restricted"),
  44. EntityAppMessages::RHelp);
  45. }
  46. void EntityApp::processOption(AppChar opt, const AppChar *arg)
  47. {
  48. switch (opt) {
  49. case 'c':
  50. catalogSysids_.push_back(arg);
  51. break;
  52. case 'C':
  53. mapCatalogDocument_ = 1;
  54. break;
  55. case 'D':
  56. searchDirs_.push_back(arg);
  57. break;
  58. case 'R':
  59. restrictFileReading_ = 1;
  60. break;
  61. default:
  62. CmdLineApp::processOption(opt, arg);
  63. break;
  64. }
  65. }
  66. int EntityApp::processArguments(int argc, AppChar **argv)
  67. {
  68. StringC sysid;
  69. if (!makeSystemId(argc, argv, sysid))
  70. return 1;
  71. return processSysid(sysid);
  72. }
  73. Boolean EntityApp::makeSystemId(int nFiles, AppChar *const *files,
  74. StringC &result)
  75. {
  76. std::vector<StringC> filenames(nFiles == 0 ? 1 : nFiles);
  77. int i;
  78. for (i = 0; i < nFiles; i++)
  79. filenames[i] = convertInput(tcscmp(files[i], SP_T("-")) == 0
  80. ? SP_T("<OSFD>0")
  81. : files[i]);
  82. if (nFiles == 0)
  83. filenames[0] = convertInput(SP_T("<OSFD>0"));
  84. return entityManager()->mergeSystemIds(filenames,
  85. mapCatalogDocument_,
  86. systemCharset(),
  87. *this,
  88. result);
  89. }
  90. Ptr<ExtendEntityManager> &EntityApp::entityManager()
  91. {
  92. if (!entityManager_.isNull())
  93. return entityManager_;
  94. PosixStorageManager *sm
  95. = new PosixStorageManager("OSFILE",
  96. &systemCharset(),
  97. #ifndef SP_WIDE_SYSTEM
  98. codingSystem(),
  99. #endif
  100. 5,
  101. restrictFileReading_);
  102. size_t i;
  103. for (i = 0; i < searchDirs_.size(); i++)
  104. sm->addSearchDir(convertInput(searchDirs_[i]));
  105. {
  106. const AppChar *e = tgetenv(SP_T("SGML_SEARCH_PATH"));
  107. if (!e)
  108. e = SGML_SEARCH_PATH_DEFAULT;
  109. if (*e) {
  110. StringC str(convertInput(e));
  111. size_t i = 0;
  112. size_t start = 0;
  113. for (;;) {
  114. if (i == str.size() || str[i] == FILE_SEP) {
  115. sm->addSearchDir(StringC(str.data() + start,
  116. i - start));
  117. if (i == str.size())
  118. break;
  119. start = ++i;
  120. }
  121. else
  122. i++;
  123. }
  124. }
  125. }
  126. entityManager_ = ExtendEntityManager::make(sm,
  127. codingSystem(),
  128. inputCodingSystemKit(),
  129. internalCharsetIsDocCharset_);
  130. entityManager_
  131. ->registerStorageManager(new PosixFdStorageManager("OSFD",
  132. &systemCharset()));
  133. #ifdef SP_WININET
  134. entityManager_->registerStorageManager(new WinInetStorageManager("URL"));
  135. #else
  136. entityManager_->registerStorageManager(new URLStorageManager("URL"));
  137. #endif
  138. entityManager_->registerStorageManager(new LiteralStorageManager("LITERAL"));
  139. entityManager_->registerStorageManager(new NotationStorageManager("CLSID"));
  140. entityManager_->registerStorageManager(new NotationStorageManager("MIMETYPE"));
  141. std::vector<StringC> v;
  142. for (i = 0; i < catalogSysids_.size(); i++)
  143. // filenames specified on command-line must exist
  144. v.push_back(convertInput(catalogSysids_[i]));
  145. {
  146. const AppChar *e = tgetenv(SP_T("SGML_CATALOG_FILES"));
  147. if (!e)
  148. e = SGML_CATALOG_FILES_DEFAULT;
  149. if (*e) {
  150. StringC str(convertInput(e));
  151. size_t i = 0;
  152. size_t start = 0;
  153. for (;;) {
  154. if (i == str.size() || str[i] == FILE_SEP) {
  155. v.push_back(StringC(str.data() + start,
  156. i - start));
  157. if (i == str.size())
  158. break;
  159. start = ++i;
  160. }
  161. else
  162. i++;
  163. }
  164. }
  165. }
  166. const SP_TCHAR *useDocCatalogStr = tgetenv(SP_T("SP_USE_DOCUMENT_CATALOG"));
  167. Boolean useDocCatalog = true;
  168. if (useDocCatalogStr
  169. && (stringMatches(useDocCatalogStr, "NO")
  170. || stringMatches(useDocCatalogStr, "0")))
  171. useDocCatalog = false;
  172. entityManager_->setCatalogManager(SOCatalogManager::make(v,
  173. catalogSysids_.size(),
  174. &systemCharset(),
  175. &systemCharset(),
  176. useDocCatalog));
  177. return entityManager_;
  178. }
  179. #ifdef SP_NAMESPACE
  180. }
  181. #endif