forked from ArtifexSoftware/Ghostscript.NET
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGhostscriptLibrary.cs
More file actions
356 lines (272 loc) · 13.6 KB
/
GhostscriptLibrary.cs
File metadata and controls
356 lines (272 loc) · 13.6 KB
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
//
// GhostscriptLibrary.cs
// This file is part of Ghostscript.NET library
//
// Author: Josip Habjan ([email protected], http://www.linkedin.com/in/habjan)
// Copyright (c) 2013-2016 by Josip Habjan. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
using System;
using System.IO;
using Microsoft.WinAny.Interop;
namespace Ghostscript.NET
{
/// <summary>
/// Represents a native Ghostscript library.
/// </summary>
public class GhostscriptLibrary : IDisposable
{
#region Private variables
private bool _disposed = false;
private DynamicNativeLibrary _library;
private GhostscriptVersionInfo _version;
private bool _loadedFromMemory = false;
private int _revision;
#endregion
#region Constructor - buffer
/// <summary>
/// Initializes a new instance of the Ghostscript.NET.GhostscriptLibrary class
/// from the native library represented as the memory buffer.
/// </summary>
/// <param name="library">Memory buffer representing native Ghostscript library.</param>
public GhostscriptLibrary(byte[] library)
{
if (library == null)
{
throw new ArgumentNullException("library");
}
// check if library is compatibile with a running process
if (Environment.Is64BitProcess != NativeLibraryHelper.Is64BitLibrary(library))
{
// throw friendly gsdll incompatibility message
this.ThrowIncompatibileNativeGhostscriptLibraryException();
}
// create DynamicNativeLibrary instance from the memory buffer
_library = new DynamicNativeLibrary(library);
// set the flag that the library is loaded from the memory
_loadedFromMemory = true;
// get and map native library symbols
this.Initialize();
}
#endregion
#region Constructor - version
/// <summary>
/// Initializes a new instance of the Ghostscript.NET.GhostscriptLibrary class
/// from the GhostscriptVersionInfo object.
/// </summary>
/// <param name="version">GhostscriptVersionInfo instance that tells which Ghostscript library to use.</param>
public GhostscriptLibrary(GhostscriptVersionInfo version) : this(version, false)
{ }
#endregion
#region Constructor - version, fromMemory
/// <summary>
/// Initializes a new instance of the Ghostscript.NET.GhostscriptLibrary class
/// from the GhostscriptVersionInfo object.
/// </summary>
/// <param name="version">GhostscriptVersionInfo instance that tells which Ghostscript library to use.</param>
/// <param name="fromMemory">Tells if the Ghostscript should be loaded from the memory or directly from the disk.</param>
public GhostscriptLibrary(GhostscriptVersionInfo version, bool fromMemory)
{
// check if Ghostscript version is specified
if (version == null)
{
throw new ArgumentNullException("version");
}
// check if specified Ghostscript native library exist on the disk
if (!File.Exists(version.DllPath))
{
throw new DllNotFoundException("Ghostscript native library could not be found.");
}
_version = version;
_loadedFromMemory = fromMemory;
// check if library is compatibile with a running process
if (Environment.Is64BitProcess != NativeLibraryHelper.Is64BitLibrary(version.DllPath))
{
// throw friendly gsdll incompatibility message
this.ThrowIncompatibileNativeGhostscriptLibraryException();
}
// check wether we need to load Ghostscript native library from the memory or a disk
if (fromMemory)
{
// load native Ghostscript library into the memory
byte[] buffer = File.ReadAllBytes(version.DllPath);
// create DynamicNativeLibrary instance from the memory buffer
_library = new DynamicNativeLibrary(buffer);
}
else
{
// create DynamicNativeLibrary instance from the local disk file
_library = new DynamicNativeLibrary(version.DllPath);
}
// get and map native library symbols
this.Initialize();
}
#endregion
#region Destructor
~GhostscriptLibrary()
{
Dispose(false);
}
#endregion
#region Dispose
#region Dispose
/// <summary>
/// Releases all resources used by the Ghostscript.NET.GhostscriptLibrary instance.
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
#region Dispose - disposing
/// <summary>
/// Releases all resources used by the Ghostscript.NET.GhostscriptLibrary instance.
/// </summary>
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_library.Dispose();
_library = null;
}
_disposed = true;
}
}
#endregion
#endregion
#region Ghostscript functions
public gsapi_revision @gsapi_revision = null;
public gsapi_new_instance @gsapi_new_instance = null;
public gsapi_delete_instance @gsapi_delete_instance = null;
public gsapi_set_stdio @gsapi_set_stdio = null;
public gsapi_set_poll @gsapi_set_poll = null;
public gsapi_set_display_callback @gsapi_set_display_callback = null;
public gsapi_set_arg_encoding @gsapi_set_arg_encoding = null;
public gsapi_init_with_args @gsapi_init_with_args = null;
public gsapi_run_string_begin @gsapi_run_string_begin = null;
public gsapi_run_string_continue @gsapi_run_string_continue = null;
public gsapi_run_string_end @gsapi_run_string_end = null;
public gsapi_run_string_with_length @gsapi_run_string_with_length = null;
public gsapi_run_string @gsapi_run_string = null;
public gsapi_run_file @gsapi_run_file = null;
public gsapi_exit @gsapi_exit = null;
#endregion
#region Initialize
/// <summary>
/// Get the native library symbols and map them to the appropriate functions/delegates.
/// </summary>
private void Initialize()
{
string symbolMappingError = "Delegate of an exported function couldn't be created for symbol '{0}'";
this.gsapi_revision = _library.GetDelegateForFunction<gsapi_revision>("gsapi_revision");
if (this.gsapi_revision == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_revision"));
gsapi_revision_s rev = new gsapi_revision_s();
if (this.gsapi_revision(ref rev, System.Runtime.InteropServices.Marshal.SizeOf(rev)) == 0)
{
_revision = rev.revision;
}
this.gsapi_new_instance = _library.GetDelegateForFunction<gsapi_new_instance>("gsapi_new_instance");
if (this.gsapi_new_instance == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_new_instance"));
this.gsapi_delete_instance = _library.GetDelegateForFunction<gsapi_delete_instance>("gsapi_delete_instance");
if (this.gsapi_delete_instance == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_delete_instance"));
this.gsapi_set_stdio = _library.GetDelegateForFunction<gsapi_set_stdio>("gsapi_set_stdio");
if (this.gsapi_set_stdio == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_set_stdio"));
this.gsapi_set_poll = _library.GetDelegateForFunction<gsapi_set_poll>("gsapi_set_poll");
if (this.gsapi_set_poll == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_set_poll"));
this.gsapi_set_display_callback = _library.GetDelegateForFunction<gsapi_set_display_callback>("gsapi_set_display_callback");
if (this.gsapi_set_display_callback == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_set_display_callback"));
if (is_gsapi_set_arg_encoding_supported)
{
this.gsapi_set_arg_encoding = _library.GetDelegateForFunction<gsapi_set_arg_encoding>("gsapi_set_arg_encoding");
if (this.gsapi_set_arg_encoding == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_set_arg_encoding"));
}
this.gsapi_init_with_args = _library.GetDelegateForFunction<gsapi_init_with_args>("gsapi_init_with_args");
if (this.gsapi_init_with_args == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_init_with_args"));
this.gsapi_run_string_begin = _library.GetDelegateForFunction<gsapi_run_string_begin>("gsapi_run_string_begin");
if (this.gsapi_run_string_begin == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_run_string_begin"));
this.gsapi_run_string_continue = _library.GetDelegateForFunction<gsapi_run_string_continue>("gsapi_run_string_continue");
if (this.gsapi_run_string_continue == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_run_string_continue"));
this.gsapi_run_string_end = _library.GetDelegateForFunction< gsapi_run_string_end>("gsapi_run_string_end");
if (this.gsapi_run_string_end == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_run_string_end"));
this.gsapi_run_string_with_length = _library.GetDelegateForFunction<gsapi_run_string_with_length>("gsapi_run_string_with_length");
if (this.gsapi_run_string_with_length == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_run_string_with_length"));
this.gsapi_run_string = _library.GetDelegateForFunction<gsapi_run_string>("gsapi_run_string");
if (this.gsapi_run_string == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_run_string"));
this.gsapi_run_file = _library.GetDelegateForFunction<gsapi_run_file>("gsapi_run_file");
if (this.gsapi_run_file == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_run_file"));
this.gsapi_exit = _library.GetDelegateForFunction<gsapi_exit>("gsapi_exit");
if (this.gsapi_exit == null)
throw new GhostscriptException(string.Format(symbolMappingError, "gsapi_exit"));
}
#endregion
#region ThrowIncompatibileNativeGhostscriptLibraryException
/// <summary>
/// Throws friendly gsdll incompatibility message.
/// </summary>
private void ThrowIncompatibileNativeGhostscriptLibraryException()
{
throw new BadImageFormatException((Environment.Is64BitProcess ?
"You are using native Ghostscript library (gsdll32.dll) compiled for 32bit systems in a 64bit process. You need to use gsdll64.dll. " +
"64bit native Ghostscript library can be downloaded from http://www.ghostscript.com/download/gsdnld.html" :
"You are using native Ghostscript library (gsdll64.dll) compiled for 64bit systems in a 32bit process. You need to use gsdll32.dll. " +
"32bit native Ghostscript library can be downloaded from http://www.ghostscript.com/download/gsdnld.html"));
}
#endregion
#region Revision
public int Revision
{
get { return _revision; }
}
#endregion
#region is_gsapi_set_arg_encoding
public bool is_gsapi_set_arg_encoding_supported
{
get
{
if (_revision >= 910)
{
return true;
}
else
{
return false;
}
}
}
#endregion
}
}