1 // Copyright (c) 1994, 1995 James Clark
2 // See the file COPYING for copying permission.
3 
4 #ifndef ExtendEntityManager_INCLUDED
5 #define ExtendEntityManager_INCLUDED 1
6 
7 #ifdef __GNUG__
8 #pragma interface
9 #endif
10 
11 #include "EntityManager.h"
12 #include "CharsetInfo.h"
13 #include "types.h"
14 #include "Boolean.h"
15 #include "StringC.h"
16 #include "types.h"
17 #include "Vector.h"
18 #include "Location.h"
19 #include "CodingSystemKit.h"
20 
21 #ifdef SP_NAMESPACE
22 namespace SP_NAMESPACE {
23 #endif
24 
25 class StorageManager;
26 class InputCodingSystem;
27 class Messenger;
28 
29 struct SP_API StorageObjectSpec {
30   StorageObjectSpec();
31   StorageManager *storageManager;
32   const char *codingSystemName;
33   const InputCodingSystem *codingSystem;
34   StringC specId;		// specified id
35   StringC baseId;		// id that specified id is relative to
36   enum Records {
37     find,
38     cr,
39     lf,
40     crlf,
41     asis
42     };
43   Records records;
44   PackedBoolean notrack;
45   PackedBoolean zapEof;		// zap a final Ctrl-Z
46   PackedBoolean search;
47   enum {
48     encoding,
49     bctf,
50     special
51   };
52   char codingSystemType;
53 };
54 
55 
56 struct SP_API ParsedSystemId : public Vector<StorageObjectSpec> {
57   ParsedSystemId();
58   void unparse(const CharsetInfo &resultCharset, Boolean isNdata, StringC &result) const;
59   struct SP_API Map {
60     enum Type {
61       catalogDocument,
62       catalogPublic
63     };
64     Type type;
65     StringC publicId;
66   };
67   Vector<Map> maps;
68 };
69 
70 struct SP_API StorageObjectLocation {
71   const StorageObjectSpec *storageObjectSpec;
72   StringC actualStorageId;
73   unsigned long lineNumber;
74   unsigned long columnNumber;
75   unsigned long byteIndex;
76   unsigned long storageObjectOffset;
77 };
78 
79 class SP_API ExtendEntityManager : public EntityManager {
80 public:
81   class SP_API CatalogManager {
82   public:
83     virtual ~CatalogManager();
84     virtual ConstPtr<EntityCatalog>
85       makeCatalog(StringC &systemId,
86 		  const CharsetInfo &docCharset,
87 		  ExtendEntityManager *,
88 		  Messenger &) const = 0;
89     virtual Boolean mapCatalog(ParsedSystemId &systemId,
90 			       ExtendEntityManager *em,
91 			       Messenger &mgr) const = 0;
92   };
93   // Additional flags for open.
94   enum { mayNotExist = 0100, isNdata = 0200 };
95   virtual void registerStorageManager(StorageManager *) = 0;
96   virtual void setCatalogManager(CatalogManager *) = 0;
97   virtual Boolean expandSystemId(const StringC &,
98 				 const Location &,
99 				 Boolean isNdata,
100 				 const CharsetInfo &,
101 				 const StringC *mapCatalogPublic,
102 				 Messenger &,
103 				 StringC &) = 0;
104   virtual Boolean mergeSystemIds(const Vector<StringC> &sysids,
105 				 Boolean mapCatalogDocument,
106 				 const CharsetInfo &,
107 				 Messenger &mgr,
108 				 StringC &) const = 0;
109   virtual Boolean parseSystemId(const StringC &str,
110 				const CharsetInfo &docCharset,
111 				Boolean isNdata,
112 				const StorageObjectLocation *defLoc,
113 				Messenger &mgr,
114 				ParsedSystemId &parsedSysid) const = 0;
115   static const ParsedSystemId *externalInfoParsedSystemId(const ExternalInfo *);
116   static Boolean externalize(const ExternalInfo *,
117 			     Offset,
118 			     StorageObjectLocation &);
119   static ExtendEntityManager *make(StorageManager *,
120 				   const InputCodingSystem *,
121 				   const ConstPtr<InputCodingSystemKit> &,
122 				   Boolean internalCharsetIsDocCharset);
123 };
124 
125 #ifdef SP_NAMESPACE
126 }
127 #endif
128 
129 #endif /* not ExtendEntityManager_INCLUDED */
130