MiKTeX 26.5-next
A scalable TeX distribution
Loading...
Searching...
No Matches
WebApp.h
Go to the documentation of this file.
1
13
14#pragma once
15
16#include <miktex/TeXAndFriends/config.h>
17
18#include "Prototypes.h"
19
20#include <exception>
21#include <memory>
22#include <string>
23#include <vector>
24
25#include <miktex/C4P/C4P>
26
27#include <miktex/Core/Exceptions>
28#include <miktex/Core/FileType>
29#include <miktex/Util/OptionSet>
30#include <miktex/Util/PathName>
31#include <miktex/Core/Utils>
32
33#include <miktex/Util/StringUtil>
34
35#include <miktex/Wrappers/PoptWrapper>
36
38namespace C4P
39{
40 class Exception31 {}; // aux_done
41 class Exception32 {}; // bst_done
42 class Exception9932 {}; // no_bst_file
43 class Exception9998 {}; // end_of_TEX
44 class Exception9999 {}; // final_end
45}
47
48MIKTEX_TEXMF_BEGIN_NAMESPACE;
49
50constexpr const char* TeXEngine = "TeXEngine";
51constexpr const char* METAFONTEngine = "METAFONTEngine";
52constexpr const char* TeXjpEngine = "TeXjpEngine";
53
55{
56public:
57 virtual C4P::C4P_signed8& history() = 0;
58};
59
60template<class FileType> inline bool miktexopenofmfile(FileType& f, const char* fileName)
61{
62 return OpenOFMFile(&f, MiKTeX::Util::PathName(fileName));
63}
64
65template<class FileType> inline bool miktexopentfmfile(FileType& f, const char* fileName)
66{
67 return OpenTFMFile(&f, MiKTeX::Util::PathName(fileName));
68}
69
70template<class FileType> inline bool miktexopenvffile(FileType& f, const char* fileName)
71{
72 return OpenVFFile(&f, MiKTeX::Util::PathName(fileName));
73}
74
75template<class FileType> inline int miktexopenxfmfile(FileType& f, const char* fileName)
76{
77 return OpenXFMFile(&f, MiKTeX::Util::PathName(fileName));
78}
79
80template<class FileType> inline bool miktexopenxvffile(FileType& f, const char* fileName)
81{
82 return OpenXVFFile(&f, MiKTeX::Util::PathName(fileName));
83}
84
85template<class FileType> inline void miktexprintmiktexbanner(FileType& f)
86{
87 fprintf(f, " (%s)", MiKTeX::Core::Utils::GetMiKTeXBannerString().c_str());
88}
89
90class MIKTEXMFTYPEAPI(WebApp) :
92{
93
94public:
95
96 MIKTEXMFEXPORT MIKTEXTHISCALL WebApp();
97 WebApp(const WebApp & other) = delete;
98 WebApp& operator=(const WebApp & other) = delete;
99 WebApp(WebApp && other) = delete;
100 WebApp& operator=(WebApp && other) = delete;
101 virtual MIKTEXMFEXPORT MIKTEXTHISCALL ~WebApp() noexcept;
102
103 MIKTEXMFTHISAPI(C4P::ProgramBase*) GetProgram() const;
104 MIKTEXMFTHISAPI(IInitFinalize*) GetInitFinalize() const;
105 MIKTEXMFTHISAPI(bool) AmI(const std::string& name) const;
106 MIKTEXMFTHISAPI(bool) GetVerboseFlag() const;
107 MIKTEXMFTHISAPI(void) IAm(const std::string& name);
108 MIKTEXMFTHISAPI(std::string) GetProgramName() const;
109 MIKTEXMFTHISAPI(void) Finalize() override;
110 MIKTEXMFTHISAPI(void) Init(std::vector<char*>&args) override;
111 MIKTEXMFTHISAPI(void) SetInitFinalize(IInitFinalize* initFinalize);
112 MIKTEXMFTHISAPI(void) SetProgram(C4P::ProgramBase* program, const std::string& programName, const std::string& version, const std::string& copyright, const std::string& trademarks);
113 virtual MIKTEXMFTHISAPI(std::string) TheNameOfTheGame() const;
114 virtual MIKTEXMFTHISAPI(void) ProcessCommandLineOptions();
115
116 virtual unsigned long GetHelpId() const
117 {
118 return 0;
119 }
120
121 virtual MiKTeX::Core::FileType GetInputFileType() const
122 {
123 // must be implemented in sub-classes
124 MIKTEX_UNEXPECTED();
125 }
126
127 static WebApp* GetWebApp()
128 {
129 MIKTEX_ASSERT(dynamic_cast<WebApp*>(Application::GetApplication()) != nullptr);
130 return reinterpret_cast<WebApp*>(Application::GetApplication());
131 }
132
133protected:
134
135 enum
136 {
137 OPT_UNSUPPORTED = INT_MAX - 100,
138 OPT_NOOP,
139 };
140
141 MIKTEXMFTHISAPI(std::string) Translate(const char* msgId);
142 MIKTEXMFTHISAPI(std::vector<poptOption>) GetOptions() const;
143 MIKTEXMFTHISAPI(void) AddOption(const std::string& aliasName, const std::string& name);
144 MIKTEXMFTHISAPI(void) AddOption(const std::string& name, const std::string& help, int opt, int argInfo = POPT_ARG_NONE, const std::string& argDescription = "", void* arg = nullptr, char shortName = 0);
145 MIKTEXMFTHISAPI(void) AddOptionShortcut(const std::string& longName, const std::vector<std::string>& args);
146 MIKTEXMFTHISAPI(void) BadUsage();
147 MIKTEXMFTHISAPI(void) ShowHelp(bool usageOnly = false) const;
148 MIKTEXMFTHISAPI(void) ShowProgramVersion() const;
149 virtual MIKTEXMFTHISAPI(bool) ProcessOption(int opt, const std::string& optArg);
150 virtual MIKTEXMFTHISAPI(void) AddOptions();
151
152 void AddOption(const std::string& name, int opt, int argInfo = POPT_ARG_NONE, const std::string& argDescription = "", void* arg = nullptr, char shortName = 0)
153 {
154 AddOption(name, "", opt, argInfo, argDescription, arg, shortName);
155 }
156
157 virtual std::string GetUsage() const
158 {
159 // must be implemented in sub-classes
160 MIKTEX_UNEXPECTED();
161 }
162
163private:
164
165 class impl;
166 std::unique_ptr<impl> pimpl;
167};
168
169inline bool miktexgetverboseflag()
170{
171 return WebApp::GetWebApp()->GetVerboseFlag();
172}
173
174inline bool miktexgetquietflag()
175{
176 return WebApp::GetWebApp()->GetQuietFlag();
177}
178
179inline void miktexprocesscommandlineoptions()
180{
181 WebApp::GetWebApp()->ProcessCommandLineOptions();
182}
183
184template<class PROGRAM_CLASS, class WEBAPP_CLASS> class ProgramRunner
185{
186
187public:
188
189 int Run(PROGRAM_CLASS& prog, WEBAPP_CLASS& app, const std::string& progName, int argc, char* argv[])
190 {
191 std::string componentVersion;
192#if defined(MIKTEX_COMPONENT_VERSION_STR)
193 componentVersion = MIKTEX_COMPONENT_VERSION_STR;
194#endif
195 std::string componentCopyright;
196#if defined(MIKTEX_COMP_COPYRIGHT_STR)
197 componentCopyright = MIKTEX_COMP_COPYRIGHT_STR;
198#endif
199 std::string componentTrademark;
200#if defined(MIKTEX_COMP_TM_STR)
201 componentTrademark = MIKTEX_COMP_TM_STR;
202#endif
203 app.SetProgram(&prog, progName, componentVersion, componentCopyright, componentTrademark);
204 prog.SetParent(&app);
205 try
206 {
207 MIKTEX_ASSERT(argv != nullptr && argv[argc] == nullptr);
208 std::vector<char*> newargv(argv, argv + argc + 1);
209 app.Init(newargv);
210 MIKTEX_ASSERT(!newargv.empty() && newargv.back() == nullptr);
211 int exitCode = prog.Run(newargv.size() - 1, &newargv[0]);
212 app.Finalize2(exitCode);
213 return exitCode;
214 }
215 catch (const MiKTeX::Core::MiKTeXException& ex)
216 {
217 app.Sorry(argv[0], ex);
218 app.Finalize2(1);
219 ex.Save();
220 return EXIT_FAILURE;
221 }
222 catch (const std::exception& ex)
223 {
224 app.Sorry(argv[0], ex);
225 app.Finalize2(1);
226 return EXIT_FAILURE;
227 }
228 catch (int exitCode)
229 {
230 app.Finalize2(exitCode);
231 return exitCode;
232 }
233 }
234};
235
236// TODO: MIKTEX_DEFINE_WEBAPP(programname, functionname, webappclass, webappinstance, programclass, programinstance)
237#define MIKTEX_DEFINE_WEBAPP(functionname, webappclass, webappinstance, programclass, programinstance) \
238programclass programinstance; \
239webappclass webappinstance; \
240extern "C" int MIKTEXCEECALL functionname(int argc, char* argv[]) \
241{ \
242 MiKTeX::TeXAndFriends::ProgramRunner<programclass, webappclass> p; \
243 std::string programName = #webappclass; \
244 return p.Run(programinstance, webappinstance, programName, argc, argv); \
245}
246
247MIKTEX_TEXMF_END_NAMESPACE;
Prototypes.
An instance of this class controls the run-time behaviour of a MiKTeX application.
Definition Application.h:37
static Application * GetApplication()
static std::string GetMiKTeXBannerString()
void Init(std::vector< char * > &args) override
void Finalize() override
Frees application resources.
Instances of this class can be used to store path names.
Definition PathName.h:64
The "C/C++ for Pascal" namespace.
FileType
File type enum class.
Definition FileType.h:33