zjf
2023-03-06 392b76515f40376b6d36f40a114850ef63650384
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
/////////////////////////////////////////////////////////////////////////////// 
// Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). 
// All rights reserved. 
// 
// This software and its documentation and related materials are owned by 
// the Alliance. The software may only be incorporated into application 
// programs owned by members of the Alliance, subject to a signed 
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable  
// trade secrets of the Alliance and its suppliers. The software is also 
// protected by copyright law and international treaty provisions. Application  
// programs incorporating this software must include the following statement 
// with their copyright notices:
//   
//   This application incorporates Teigha(R) software pursuant to a license 
//   agreement with Open Design Alliance.
//   Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. 
//   All rights reserved.
//
// By use of this software, its documentation or related materials, you 
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////
 
 
#ifndef _ODRXSYSTEMSERVICES_INCLUDED_
#define _ODRXSYSTEMSERVICES_INCLUDED_
 
#include <stdarg.h>
 
#include "RxObject.h"
#include "OdStreamBuf.h"
#include "OdCodePage.h"
#if defined(_DEBUG) && defined(_WIN32)
#define STL_USING_VECTOR
#include "OdaSTL.h"
#endif
 
class OdTimeStamp;
class OdRxModule;
class OdRxDictionary;
typedef OdSmartPtr<OdRxDictionary> OdRxDictionaryPtr;
 
#include "TD_PackPush.h"
 
/** \details
 
    <group TD_Namespaces>
*/
namespace Oda
{
  ///////////////// FILE SYSTEM SERVICES //////////////////
 
 
  enum FileAccessMode   // Access
  {
    kFileRead     = (long)
                    0x80000000,   // Read access. Use kFileRead | kFileWrite for read/write access.
    kFileWrite    = 0x40000000,   // Write access. Use kFileRead | kFileWrite for read/write access.
    kFileTmp      = 0x20000000,   // hint to use FILE_ATTRIBUTE_TEMPORARY  for 'FlagsAndAttributes'
    kFileDelete   = 0x10000000    // hint to use FILE_FLAG_DELETE_ON_CLOSE for 'FlagsAndAttributes'
  };
 
  enum FileShareMode
  {
    kShareDenyReadWrite = 0x10, // deny read/write mode
    kShareDenyWrite     = 0x20, // deny write mode
    kShareDenyRead      = 0x30, // deny read mode
    kShareDenyNo        = 0x40  // deny none mode
  };
 
 
  enum FileCreationDisposition
  {
    kCreateNew        = 1,  // Creates a new file; fails if the specified file already exists.
    kCreateAlways     = 2,  // Creates a new file; overwrites any existing file.
    kOpenExisting     = 3,  // Opens the file; fails if the file does not exist.
    kOpenAlways       = 4,  // Opens the file; creates the file if it does not exist.
    kTruncateExisting = 5   // Truncates the file; fails if the file does not exist. The file must be open at least kFileWrite.
  };
}
 
/** \details
    This class implements OdError objects with access to the Result codes and filenames
    of the objects related to the errors.
    
    Library: TD_Root
    <group Error_Classes> 
*/
class FIRSTDLL_EXPORT OdError_FileException : public OdError
{
public:
  /** \param code [in]  Result code.
    \param filename [in]  Filename.
  */
  OdError_FileException(OdResult code, const OdString& filename);
  /** \details
    Returns the filename of this Error object.
  */
  OdString getFileName() const;
};
 
/** \details
    This class implements FileException object with a Result code of eFileNotFound,
    and the filename of the object related to the error.
    
    Library: TD_Root
    <group Error_Classes> 
*/
class FIRSTDLL_EXPORT OdError_FileNotFound : public OdError_FileException
{
public:
  /** \param filename [in]  Filename.
  */
  OdError_FileNotFound(const OdString& filename);
};
 
/** \details
    This class implements FileException object with a Result code of eFileException,
    and the filename of the object related to the error.
    
    Library: TD_Root
    <group Error_Classes> 
*/
class FIRSTDLL_EXPORT OdError_CantOpenFile : public OdError_FileException
{
public:
  /** \param filename [in]  Filename.
  */
  OdError_CantOpenFile(const OdString& filename);
};
 
/** \details
    This class implements FileException object with a Result code of eFileWriteError,
    and the filename of the object related to the error.
    
    Library: TD_Root
    <group Error_Classes> 
*/
class FIRSTDLL_EXPORT OdError_FileWriteError : public OdError_FileException
{
public:
  /** \param filename [in]  Filename.
  */
  OdError_FileWriteError(const OdString& filename);
};
 
/** \details
    This class implements OdError objects with Result codes of eInvalidIndex.
    
    Library: TD_Root
    <group Error_Classes> 
*/
class FIRSTDLL_EXPORT OdError_InvalidIndex : public OdError
{
public:
  OdError_InvalidIndex();
};
 
/** \details
    This class implements OdError objects with Result codes of eInvalidKey.
    
    Library: TD_Root
    <group Error_Classes> 
*/
class FIRSTDLL_EXPORT OdError_InvalidKey: public OdError
{
public:
  OdError_InvalidKey();
};
 
 
/** \details
    This class is the base class for classes that provide platform-dependent file operations for
    Teigha.
    
    Library: TD_Root
    
    <group OdRx_Classes>
*/
class FIRSTDLL_EXPORT OdRxSystemServices : public OdRxObject
{
public:
 
  OdRxSystemServices()
  {
#if defined _WIN32_WCE
    srand(GetTickCount());
#else
    Od_srand((unsigned int) time(0));
#endif
  }
  ///////////////// FILE SYSTEM SERVICES //////////////////
 
  /** \details
    Creates and/or opens the specified file.
    \param filename [in]  Filename.
    \param accessMode [in]  Access mode.
    \param shareMode [in]  Share mode.
    \param creationDisposition [in]  Creation disposition.
    
    \remarks
    Returns a SmartPointer to an OdStreamBuf object for the file. 
    
    accessMode must be a combination of one or more of the following:
    
    <table>
    Name                Value          Description
    Oda::kFileRead      0x80000000     Read access.
    Oda::kFileWrite     0x40000000     Write access.
    </table>
    
    shareMode must be one of the following:
    
    <table>
    Name                         Value       Description
    Oda::kShareDenyReadWrite     0x10        deny read/write mode
    Oda::kShareDenyWrite         0x20        deny write mode
    Oda::kShareDenyRead          0x30        deny read mode
    Oda::kShareDenyNo            0x40        deny none mode
    </table>
 
    Creation disposition must be one of the following:
    
    <table>
    Name                         Value     Description
    Oda::kCreateNew              1         Creates a new file; fails if the specified file already exists.
    Oda::kCreateAlways           2         Creates a new file; overwrites any existing file.
    Oda::kOpenExisting           3         Opens the file; fails if the file does not exist.
    Oda::kOpenAlways             4         Opens the file; creates the file if it does not exist.
    Oda::kTruncateExisting       5         Truncates the file; fails if the file does not exist. The file must be open at least Oda::kFileWrite.
    </table>
  */
  virtual OdStreamBufPtr createFile(
    const OdString& filename,                    
    Oda::FileAccessMode accessMode = Oda::kFileRead,
    Oda::FileShareMode  shareMode = Oda::kShareDenyNo,                          
    Oda::FileCreationDisposition creationDisposition = Oda::kOpenExisting) = 0;
 
  /** \details
    Returns true if and only if the specified file can be accessed in the specified mode.
 
    \param filename [in]  Filename.
    \param accessMode [in]  Access mode.
    
    \remarks
    accessMode must be a combination of one or more of the following:
    
    <table>
    Name                Value          Description
    ..                  0              File exists.
    Oda::kFileRead      0x80000000     Read access.
    Oda::kFileWrite     0x40000000     Write access.
    </table>
 
  */
  virtual bool accessFile(const OdString& filename, int accessMode) = 0;
 
  /** \details
    Returns the creation time of the specified file.
    \param filename [in]  Filename.
    
    \remarks
    On most platforms, this function will be implemented with the stat function (stat::st_ctime).
  */
  virtual OdInt64 getFileCTime(const OdString& filename) = 0;
 
  /** \details
    Returns the modification time of the specified file.
    \param filename [in]  Filename.
    
    \remarks
    On most platforms, this function will be implemented with the stat function (stat::st_mtime).
  */
  virtual OdInt64 getFileMTime(const OdString& filename) = 0;
 
  /** \details
    Returns the size of the specified file.
    \param filename [in]  Filename.
    
    \remarks
    On most platforms, this function will be implemented with the stat function (stat::st_size).
  */
  virtual OdInt64 getFileSize(const OdString& filename) = 0;
 
 
  /** \details
    Returns a message string formatted using a vsprintf-style format string and argument list.
    \param formatID [in]  String resource identifier containing the format string. 
    \param argList [in]  Argument list.   
  */
  virtual OdString formatMessage(unsigned int formatId, va_list* argList= 0) = 0;
 
  /** \details
    Assigns a value to this String object using a printf-style format string and arguments.
    \param formatID [in]  String resource identifier containing the format string. 
    \remarks
    Returns a reference to this String Object.
  */
  virtual OdString formatMsg(unsigned int formatId, ...);
 
  /** \details
    Returns the system code page.
  */
  virtual OdCodePageId systemCodePage() const = 0;
  
  /** \details
    Returns a newly generated Globally Unique IDentifier (GUID) for this SystemServices object.
  */
  virtual OdString createGuid();
 
  /** \details
    Loads the specified physical (platform-dependent) module.
    
    \remarks
    Appends the appropriate version suffix onto the supplied module name.
    Returns the abstract (platform independent) module object,    
    which represents module functionality in Teigha.
 
    \param moduleFileName [in]  Module filename to load.
    \param silent [in]  If true, no load status message will be printed.
  */
  virtual OdRxModule* loadModule(const OdString& moduleFileName, bool silent);
 
  /** \details
    Unloads the specified physical (platform-dependent) module.
 
    \param pModuleObj [in]  Pointer to the module object to be unloaded.
  */
  virtual void unloadModule(OdRxModule* pModuleObj);
 
  /** \details
    Returns the filename associated with the specified application name.
 
    \param applicationName [in]  TX application name.
  */
  virtual OdString findModule(const OdString& applicationName);
 
  /** \details
    Displays in some manner the specified warning message.
    
    \param warnVisGroup [in]  Group of warning message visibility (always visible if it is an empty)
    \param message [in]  Warning message.
  */
  virtual void warning(const OdString& message);
  virtual void warning(const char* warnVisGroup, const OdString& message);
 
  /** \details
    Loads the specified physical (platform-dependent) module.
 
    \remarks
    Returns the abstract (platform independent) module object,    
    which represents module functionality in Teigha.
 
    \param moduleFileName [in]  Module filename to load.
    \param silent [in]  If true, no load status message will be printed.
  */
  static OdRxModule* loadModuleLib(const OdString& moduleFileName, bool silent);
 
  /** \details
  Inits/Uninits the modeler library (platform-dependent) module.
 
  \remarks
  Should return eOk, if (un)initialization is implemented inside (un)initModelerLibrary.
  Or eNotImplemented if default module (un)initialization required.
 
  \note
   Used for custom initialization/uninitialization of Spatial ACIS library.
  */
  virtual OdResult initModelerLibrary(OdRxDictionary *pDict);
  virtual OdResult uninitModelerLibrary(OdRxDictionary *pDict);
 
#if defined(_DEBUG) && defined(_WIN32)
  static void dontFreeLibrary(std::vector<HMODULE>* notFreedDlls) { s_notFreedDlls = notFreedDlls; }
private:
  FIRSTDLL_EXPORT_STATIC static std::vector<HMODULE>* s_notFreedDlls;
#endif
};
/** \details
  This template class is a specialization of the OdSmartPtr class for OdRxSystemServices object pointers.
*/
typedef OdSmartPtr<OdRxSystemServices> OdRxSystemServicesPtr;
 
FIRSTDLL_EXPORT OdRxSystemServices* odrxSystemServices();
 
#include "TD_PackPop.h"
 
#endif // #ifndef _ODRXSYSTEMSERVICES_INCLUDED_