MiKTeX 23.10-next
A scalable TeX distribution
Loading...
Searching...
No Matches
WebAppInputLine.h
Go to the documentation of this file.
1
14#pragma once
15
16#include <miktex/TeXAndFriends/config.h>
17
18#include <memory>
19#include <string>
20#include <iostream>
21
22#include <miktex/Core/BufferSizes>
23#include <miktex/Core/File>
24#include <miktex/Core/FileType>
25#include <miktex/Util/PathName>
26
27#include <miktex/Util/StringUtil>
28
29#include "WebApp.h"
30
31#define MIKTEX_TEXMF_BEGIN_NAMESPACE \
32namespace MiKTeX { \
33 namespace TeXAndFriends {
34
35#define MIKTEX_TEXMF_END_NAMESPACE \
36 } \
37}
38
39MIKTEX_TEXMF_BEGIN_NAMESPACE;
40
42{
43public:
44 virtual char* xchr() = 0;
45 virtual char16_t* xchr16() = 0;
46 virtual char* xord() = 0;
47 virtual char* xprn() = 0;
48};
49
51{
52public:
53 virtual C4P::C4P_signed32& loc() = 0;
54 virtual C4P::C4P_signed32& limit() = 0;
55 virtual C4P::C4P_signed32 first() = 0;
56 virtual C4P::C4P_signed32& last() = 0;
57 virtual C4P::C4P_signed32 bufsize() = 0;
58 virtual char*& nameoffile() = 0;
59 virtual C4P::C4P_signed32& namelength() = 0;
60 virtual char* buffer() = 0;
61 virtual char* buffer2() = 0;
62 virtual char32_t* buffer32() = 0;
63 virtual C4P::C4P_signed32& maxbufstack() = 0;
64 virtual void overflow(C4P::C4P_signed32 s, C4P::C4P_integer n) = 0;
65};
66
67class MIKTEXMFTYPEAPI(WebAppInputLine) :
68 public WebApp
69{
70
71public:
72
73 MIKTEXMFEXPORT MIKTEXTHISCALL WebAppInputLine();
74 WebAppInputLine(const WebAppInputLine& other) = delete;
75 WebAppInputLine& operator=(const WebAppInputLine& other) = delete;
76 WebAppInputLine(WebAppInputLine&& other) = delete;
77 WebAppInputLine& operator=(WebAppInputLine&& other) = delete;
78 virtual MIKTEXMFEXPORT MIKTEXTHISCALL ~WebAppInputLine() noexcept;
79
80 MIKTEXMFTHISAPI(ICharacterConverter*) GetCharacterConverter() const;
81 MIKTEXMFTHISAPI(IInputOutput*) GetInputOutput() const;
82 MIKTEXMFTHISAPI(MiKTeX::Util::PathName) GetAuxDirectory() const;
83 MIKTEXMFTHISAPI(MiKTeX::Util::PathName) GetFoundFile() const;
84 MIKTEXMFTHISAPI(MiKTeX::Util::PathName) GetFoundFileFq() const;
85 MIKTEXMFTHISAPI(MiKTeX::Util::PathName) GetOutputDirectory() const;
86 MIKTEXMFTHISAPI(bool) AllowFileName(const MiKTeX::Util::PathName & fileName, bool forInput);
87 MIKTEXMFTHISAPI(bool) InputLine(C4P::C4P_text & f, C4P::C4P_boolean bypassEndOfLine) const;
88 MIKTEXMFTHISAPI(bool) OpenInputFile(C4P::FileRoot & f, const MiKTeX::Util::PathName & fileNameInternalEncoding);
89 MIKTEXMFTHISAPI(bool) OpenInputFile(FILE * *ppFile, const MiKTeX::Util::PathName & fileNameInternalEncoding);
90 MIKTEXMFTHISAPI(bool) OpenOutputFile(C4P::FileRoot & f, const MiKTeX::Util::PathName & fileNameInternalEncoding, bool isTextFile_deprecated, MiKTeX::Util::PathName & outPath);
91 MIKTEXMFTHISAPI(void) CloseFile(C4P::FileRoot & f);
92 MIKTEXMFTHISAPI(void) Finalize() override;
93 MIKTEXMFTHISAPI(void) Init(std::vector<char*>&args) override;
94 MIKTEXMFTHISAPI(void) SetAuxDirectory(const MiKTeX::Util::PathName & path);
95 MIKTEXMFTHISAPI(void) SetCharacterConverter(ICharacterConverter* characterConverter);
96 MIKTEXMFTHISAPI(void) SetInputOutput(IInputOutput * inputOutput);
97 MIKTEXMFTHISAPI(void) SetOutputDirectory(const MiKTeX::Util::PathName & path);
98 virtual MIKTEXMFTHISAPI(FILE*) OpenFileInternal(const MiKTeX::Util::PathName & path, MiKTeX::Core::FileMode mode, MiKTeX::Core::FileAccess access);
99 virtual MIKTEXMFTHISAPI(FILE*) TryOpenFileInternal(const MiKTeX::Util::PathName & path, MiKTeX::Core::FileMode mode, MiKTeX::Core::FileAccess access);
100 virtual MIKTEXMFTHISAPI(MiKTeX::Util::PathName) DecodeFileName(const MiKTeX::Util::PathName & fileNameInternalEncoding);
101 virtual MIKTEXMFTHISAPI(size_t) InputLineInternal(FILE * f, char* buffer, char* buffer2, size_t bufferSize, size_t bufferPosition, int& lastChar) const;
102 virtual MIKTEXMFTHISAPI(void) CloseFileInternal(FILE * f);
103
104 virtual int GetFormatIdent() const
105 {
106 MIKTEX_UNEXPECTED();
107 }
108
109 MiKTeX::Util::PathName GetNameOfFile() const
110 {
111 IInputOutput* inputOutput = GetInputOutput();
112 return MiKTeX::Util::PathName(inputOutput->nameoffile());
113 }
114
115 virtual void SetNameOfFile(const MiKTeX::Util::PathName & fileName)
116 {
117 IInputOutput* inputOutput = GetInputOutput();
118 MiKTeX::Util::StringUtil::CopyString(inputOutput->nameoffile(), MiKTeX::Core::BufferSizes::MaxPath + 1, fileName.GetData());
119 inputOutput->namelength() = static_cast<C4P::C4P_signed16>(fileName.GetLength());
120 }
121
122 static WebAppInputLine* GetWebAppInputLine()
123 {
124 return dynamic_cast<WebAppInputLine*>(Application::GetApplication());
125 }
126
127protected:
128
129 MIKTEXMFTHISAPI(MiKTeX::Core::ShellCommandMode) GetShellCommandMode() const;
130 MIKTEXMFTHISAPI(MiKTeX::Util::PathName) GetLastInputFileName() const;
131 MIKTEXMFTHISAPI(bool) ProcessOption(int opt, const std::string& optArg) override;
132 MIKTEXMFTHISAPI(void) AddOptions() override;
133 MIKTEXMFTHISAPI(void) EnableShellCommands(MiKTeX::Core::ShellCommandMode mode);
134 virtual MIKTEXMFTHISAPI(void) TouchJobOutputFile(FILE*) const;
135
136private:
137
138 virtual MIKTEXMFTHISAPI(void) BufferSizeExceeded() const;
139
140 class impl;
141 std::unique_ptr<impl> pimpl;
142};
143
144template<class FileType> inline bool inputln(FileType& f, C4P::C4P_boolean bypassEndOfLine = true)
145{
146 return WebAppInputLine::GetWebAppInputLine()->InputLine(f, bypassEndOfLine);
147}
148
149template<class FileType> inline void miktexclosefile(FileType& f)
150{
151 WebAppInputLine::GetWebAppInputLine()->CloseFile(f);
152}
153
154template<class FileType> inline bool miktexopeninputfile(FileType& f)
155{
156 bool done = WebAppInputLine::GetWebAppInputLine()->OpenInputFile(*static_cast<C4P::FileRoot*>(&f), WebAppInputLine::GetWebAppInputLine()->GetNameOfFile());
157 if (done)
158 {
159 WebAppInputLine::GetWebAppInputLine()->SetNameOfFile(WebAppInputLine::GetWebAppInputLine()->GetFoundFileFq());
160 }
161 return done;
162}
163
164inline bool miktexallownameoffile(C4P::C4P_boolean forInput)
165{
166 return WebAppInputLine::GetWebAppInputLine()->AllowFileName(WebAppInputLine::GetWebAppInputLine()->GetNameOfFile(), forInput);
167}
168
169template<class FileType> inline bool miktexopenoutputfile(FileType& f, C4P::C4P_boolean isTextFile_deprecated)
170{
171 // must open with read/write sharing flags
172 // cf. bug 2006511
174 bool done = WebAppInputLine::GetWebAppInputLine()->OpenOutputFile(*static_cast<C4P::FileRoot*>(&f), WebAppInputLine::GetWebAppInputLine()->GetNameOfFile(), isTextFile_deprecated, outPath);
175 if (done)
176 {
177 WebAppInputLine::GetWebAppInputLine()->SetNameOfFile(outPath);
178 }
179 return done;
180}
181
182MIKTEX_TEXMF_END_NAMESPACE;
MiKTeX WebApp base implementation.
Definition: WebAppInputLine.h:42
Definition: WebAppInputLine.h:51
Definition: WebApp.h:87
Definition: WebAppInputLine.h:69
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
FileAccess
File access options.
Definition: File.h:72
ShellCommandMode
Shell command mode.
Definition: Session.h:357
FileMode
How to open a file.
Definition: File.h:54
Definition: C4P.h:327
Definition: C4P.h:73
static const std::size_t MaxPath
Initial capacity of a path name (including the terminating null-byte).
Definition: BufferSizes.h:38