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
|
/*************************************************************************
** MiKTeXCom.cpp **
** **
** This file is part of dvisvgm -- a fast DVI to SVG converter **
** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> **
** **
** This program is free software; you can redistribute it and/or **
** modify it under the terms of the GNU General Public License as **
** published by the Free Software Foundation; either version 3 of **
** the License, or (at your option) any later version. **
** **
** This program is distributed in the hope that it will be useful, but **
** WITHOUT ANY WARRANTY; without even the implied warranty of **
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the **
** GNU General Public License for more details. **
** **
** You should have received a copy of the GNU General Public License **
** along with this program; if not, see <http://www.gnu.org/licenses/>. **
*************************************************************************/
#include <comdef.h>
#include <string>
#include "MessageException.hpp"
#include "MiKTeXCom.hpp"
using namespace std;
/** Constructs a COM object representing a MiKTeX session. */
MiKTeXCom::MiKTeXCom () : _session() {
if (FAILED(CoInitialize(nullptr)))
throw MessageException("COM library could not be initialized\n");
// try to initialize the MiKTeX session object
#ifdef _MSC_VER
HRESULT hres = _session.CreateInstance(L"MiKTeX.Session");
#elif defined(_WIN64)
HRESULT hres = CoCreateInstance(CLSID_MiKTeXSession2_9, 0, CLSCTX_LOCAL_SERVER, IID_ISession2, (void**)&_session);
#else
HRESULT hres = CoCreateInstance(CLSID_MiKTeXSession2_9, 0, CLSCTX_INPROC_SERVER, IID_ISession2, (void**)&_session);
#endif
if (FAILED(hres)) {
CoUninitialize();
throw MessageException("MiKTeX session could not be initialized");
}
}
MiKTeXCom::~MiKTeXCom () {
if (_session) {
#ifdef _MSC_VER
_session.Release();
#else
_session->Release();
#endif
_session = nullptr; // prevent automatic call of Release() after CoUninitialize()
}
CoUninitialize();
}
/** Returns the MiKTeX version number. */
string MiKTeXCom::getVersion () {
#ifdef _MSC_VER
MiKTeXSetupInfo info = _session->GetMiKTeXSetupInfo();
#else
MiKTeXSetupInfo info;
_session->GetMiKTeXSetupInfo(&info);
#endif
return to_string(info.series/100)+"."+ to_string(info.series%100);
}
/** Returns the path of the directory where the MiKTeX binaries are located. */
string MiKTeXCom::getBinDir () {
#ifdef _MSC_VER
MiKTeXSetupInfo info = _session->GetMiKTeXSetupInfo();
#else
MiKTeXSetupInfo info;
_session->GetMiKTeXSetupInfo(&info);
#endif
_bstr_t bindir = info.binDirectory;
return string(bindir);
}
/** Try to lookup a given file in the MiKTeX directory tree.
* @param[in] fname name of file to lookup
* @return path of the file or 0 if it can't be found */
const char* MiKTeXCom::findFile (const char *fname) {
try {
_bstr_t path;
static string ret;
#ifdef _MSC_VER
bool found = (_session->FindFile(fname, path.GetAddress()) == VARIANT_TRUE);
#else
VARIANT_BOOL found_var;
_session->FindFile(_bstr_t(fname), path.GetAddress(), &found_var);
bool found = (found_var == VARIANT_TRUE);
#endif
if (found) {
ret = _bstr_t(path);
return ret.c_str();
}
return nullptr;
}
catch (_com_error &e) {
throw MessageException(static_cast<const char*>(e.Description()));
}
}
|