MiKTeX 23.10-next
A scalable TeX distribution
Loading...
Searching...
No Matches
WebApp.h
Go to the documentation of this file.
1
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 miktexopentfmfile(FileType& f, const char* fileName)
61{
62 return OpenTFMFile(&f, MiKTeX::Util::PathName(fileName));
63}
64
65template<class FileType> inline bool miktexopenvffile(FileType& f, const char* fileName)
66{
67 return OpenVFFile(&f, MiKTeX::Util::PathName(fileName));
68}
69
70template<class FileType> inline int miktexopenxfmfile(FileType& f, const char* fileName)
71{
72 return OpenXFMFile(&f, MiKTeX::Util::PathName(fileName));
73}
74
75template<class FileType> inline bool miktexopenxvffile(FileType& f, const char* fileName)
76{
77 return OpenXVFFile(&f, MiKTeX::Util::PathName(fileName));
78}
79
80template<class FileType> inline void miktexprintmiktexbanner(FileType& f)
81{
82 fprintf(f, " (%s)", MiKTeX::Core::Utils::GetMiKTeXBannerString().c_str());
83}
84
85class MIKTEXMFTYPEAPI(WebApp) :
87{
88
89public:
90
91 MIKTEXMFEXPORT MIKTEXTHISCALL WebApp();
92 WebApp(const WebApp & other) = delete;
93 WebApp& operator=(const WebApp & other) = delete;
94 WebApp(WebApp && other) = delete;
95 WebApp& operator=(WebApp && other) = delete;
96 virtual MIKTEXMFEXPORT MIKTEXTHISCALL ~WebApp() noexcept;
97
98 MIKTEXMFTHISAPI(C4P::ProgramBase*) GetProgram() const;
99 MIKTEXMFTHISAPI(IInitFinalize*) GetInitFinalize() const;
100 MIKTEXMFTHISAPI(bool) AmI(const std::string& name) const;
101 MIKTEXMFTHISAPI(bool) GetVerboseFlag() const;
102 MIKTEXMFTHISAPI(void) IAm(const std::string& name);
103 MIKTEXMFTHISAPI(std::string) GetProgramName() const;
104 MIKTEXMFTHISAPI(void) Finalize() override;
105 MIKTEXMFTHISAPI(void) Init(std::vector<char*>&args) override;
106 MIKTEXMFTHISAPI(void) SetInitFinalize(IInitFinalize* initFinalize);
107 MIKTEXMFTHISAPI(void) SetProgram(C4P::ProgramBase* program, const std::string& programName, const std::string& version, const std::string& copyright, const std::string& trademarks);
108 virtual MIKTEXMFTHISAPI(std::string) TheNameOfTheGame() const;
109 virtual MIKTEXMFTHISAPI(void) ProcessCommandLineOptions();
110
111 virtual unsigned long GetHelpId() const
112 {
113 return 0;
114 }
115
116 virtual MiKTeX::Core::FileType GetInputFileType() const
117 {
118 // must be implemented in sub-classes
119 MIKTEX_UNEXPECTED();
120 }
121
122 static WebApp* GetWebApp()
123 {
124 MIKTEX_ASSERT(dynamic_cast<WebApp*>(Application::GetApplication()) != nullptr);
125 return reinterpret_cast<WebApp*>(Application::GetApplication());
126 }
127
128protected:
129
130 enum
131 {
132 OPT_UNSUPPORTED = INT_MAX - 100,
133 OPT_NOOP,
134 };
135
136 MIKTEXMFTHISAPI(std::string) Translate(const char* msgId);
137 MIKTEXMFTHISAPI(std::vector<poptOption>) GetOptions() const;
138 MIKTEXMFTHISAPI(void) AddOption(const std::string& aliasName, const std::string& name);
139 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);
140 MIKTEXMFTHISAPI(void) AddOptionShortcut(const std::string& longName, const std::vector<std::string>& args);
141 MIKTEXMFTHISAPI(void) BadUsage();
142 MIKTEXMFTHISAPI(void) ShowHelp(bool usageOnly = false) const;
143 MIKTEXMFTHISAPI(void) ShowProgramVersion() const;
144 virtual MIKTEXMFTHISAPI(bool) ProcessOption(int opt, const std::string& optArg);
145 virtual MIKTEXMFTHISAPI(void) AddOptions();
146
147 void AddOption(const std::string& name, int opt, int argInfo = POPT_ARG_NONE, const std::string& argDescription = "", void* arg = nullptr, char shortName = 0)
148 {
149 AddOption(name, "", opt, argInfo, argDescription, arg, shortName);
150 }
151
152 virtual std::string GetUsage() const
153 {
154 // must be implemented in sub-classes
155 MIKTEX_UNEXPECTED();
156 }
157
158private:
159
160 class impl;
161 std::unique_ptr<impl> pimpl;
162};
163
164inline bool miktexgetverboseflag()
165{
166 return WebApp::GetWebApp()->GetVerboseFlag();
167}
168
169inline bool miktexgetquietflag()
170{
171 return WebApp::GetWebApp()->GetQuietFlag();
172}
173
174inline void miktexprocesscommandlineoptions()
175{
176 WebApp::GetWebApp()->ProcessCommandLineOptions();
177}
178
179template<class PROGRAM_CLASS, class WEBAPP_CLASS> class ProgramRunner
180{
181
182public:
183
184 int Run(PROGRAM_CLASS& prog, WEBAPP_CLASS& app, const std::string& progName, int argc, char* argv[])
185 {
186 std::string componentVersion;
187#if defined(MIKTEX_COMPONENT_VERSION_STR)
188 componentVersion = MIKTEX_COMPONENT_VERSION_STR;
189#endif
190 std::string componentCopyright;
191#if defined(MIKTEX_COMP_COPYRIGHT_STR)
192 componentCopyright = MIKTEX_COMP_COPYRIGHT_STR;
193#endif
194 std::string componentTrademark;
195#if defined(MIKTEX_COMP_TM_STR)
196 componentTrademark = MIKTEX_COMP_TM_STR;
197#endif
198 app.SetProgram(&prog, progName, componentVersion, componentCopyright, componentTrademark);
199 prog.SetParent(&app);
200 try
201 {
202 MIKTEX_ASSERT(argv != nullptr && argv[argc] == nullptr);
203 std::vector<char*> newargv(argv, argv + argc + 1);
204 app.Init(newargv);
205 MIKTEX_ASSERT(!newargv.empty() && newargv.back() == nullptr);
206 int exitCode = prog.Run(newargv.size() - 1, &newargv[0]);
207 app.Finalize2(exitCode);
208 return exitCode;
209 }
210 catch (const MiKTeX::Core::MiKTeXException& ex)
211 {
212 app.Sorry(argv[0], ex);
213 app.Finalize2(1);
214 ex.Save();
215 return EXIT_FAILURE;
216 }
217 catch (const std::exception& ex)
218 {
219 app.Sorry(argv[0], ex);
220 app.Finalize2(1);
221 return EXIT_FAILURE;
222 }
223 catch (int exitCode)
224 {
225 app.Finalize2(exitCode);
226 return exitCode;
227 }
228 }
229};
230
231// TODO: MIKTEX_DEFINE_WEBAPP(programname, functionname, webappclass, webappinstance, programclass, programinstance)
232#define MIKTEX_DEFINE_WEBAPP(functionname, webappclass, webappinstance, programclass, programinstance) \
233programclass programinstance; \
234webappclass webappinstance; \
235extern "C" int MIKTEXCEECALL functionname(int argc, char* argv[]) \
236{ \
237 MiKTeX::TeXAndFriends::ProgramRunner<programclass, webappclass> p; \
238 std::string programName = #webappclass; \
239 return p.Run(programinstance, webappinstance, programName, argc, argv); \
240}
241
242MIKTEX_TEXMF_END_NAMESPACE;
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()
Definition: WebApp.h:180
Definition: WebApp.h:87
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:73
The "C/C++ for Pascal" namespace.
FileType
File type enum class.
Definition: FileType.h:33