wxMaxima
Maxima.h
Go to the documentation of this file.
1 // -*- mode: c++; c-file-style: "linux"; c-basic-offset: 2; indent-tabs-mode: nil -*-
2 //
3 // Copyright (C) 2004-2015 Andrej Vodopivec <andrej.vodopivec@gmail.com>
4 // (C) 2014-2018 Gunter Königsmann <wxMaxima@physikbuch.de>
5 // (C) 2020 Kuba Ober <kuba@bertec.com>
6 //
7 // This program is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation; either version 2 of the License, or
10 // (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 //
22 // SPDX-License-Identifier: GPL-2.0+
23 
24 #ifndef WXMAXIMA_MAXIMA_H
25 #define WXMAXIMA_MAXIMA_H
26 
32 #include <wx/defs.h>
33 #include <wx/buffer.h>
34 #include <wx/event.h>
35 #include <wx/sckstrm.h>
36 #include <wx/txtstrm.h>
37 #include <wx/socket.h>
38 #include <wx/string.h>
39 #include <wx/timer.h>
40 #include <memory>
41 #include <thread>
42 #include <atomic>
43 #include <mutex>
44 #include "Configuration.h"
45 #include "Version.h"
46 
62 class Maxima : public wxEvtHandler
63 {
64 public:
67  explicit Maxima(wxSocketBase *socket, Configuration *config);
68  virtual ~Maxima() override;
69 
70  wxSocketBase *Socket() const { return m_socket.get(); }
71 
73  bool IsConnected() const { return m_socket->IsConnected(); }
74 
76  static void SetPipeToStdErr(bool pipe) { m_pipeToStderr = pipe; }
78  static void GetPipeToStdErr(bool pipe) { m_pipeToStderr = pipe; }
79  static bool GetPipeToStdErr() { return m_pipeToStderr; }
80 
89  bool Write(const void *buffer, std::size_t length);
90 
93  void ReadSocket();
94 
97  void ClearFirstPrompt() { m_firstPrompt = false; }
98 
99  enum EventCause {
104  XML_PROMPT,
105  XML_SUPPRESSOUTPUT,
106  XML_WXXMLSYMBOLS,
107  XML_VARIABLES,
108  XML_WATCH_VARIABLES_ADD,
109  XML_STATUSBAR,
110  XML_HTML_MANUAL_KEYWORDS,
111  XML_MATHS,
112  XML_TOOLONGMATHS,
113  XML_WXXML_KEY,
120  STRING_FOR_XMLINSPECTOR,
121  };
122  void XmlInspectorActive(bool active){m_xmlInspector = active;}
123 private:
125  bool m_xmlInspector = false;
127  Configuration *m_configuration;
129  jthread m_parserTask;
131  void SocketEvent(wxSocketEvent &event);
133  void TimerEvent(wxTimerEvent &event);
134  std::unique_ptr<wxSocketBase> m_socket;
135  std::mutex m_socketInputMutex;
137  wxSocketInputStream m_socketInput;
146  wxTextInputStream m_textInput;
147 
154  wxString m_socketInputData;
155 
157  bool m_firstPrompt = true;
159  static bool m_pipeToStderr;
160 
181  void SendToWxMaxima();
182 
191  wxTimer m_readIdleTimer{this};
193  static std::unordered_map<wxString, EventCause, wxStringHash> m_knownTags;
199  std::atomic_bool m_abortParserThread;
200 };
201 
202 wxDECLARE_EVENT(EVT_MAXIMA, wxThreadEvent);
203 #endif
The configuration storage for the current worksheet.
Definition: Configuration.h:95
Interface to the Maxima process.
Definition: Maxima.h:63
EventCause
Definition: Maxima.h:99
@ WRITE_PENDING
A write to Maxima is still ongoing. We use this event to keep the traffic indicator alive.
Definition: Maxima.h:117
@ READ_PENDING
There's still pending data coming from Maxima. The Data member is empty at the moment.
Definition: Maxima.h:101
@ WRITE_ERROR
The transmission has failed - this is an unrecoverable error, most likely.
Definition: Maxima.h:119
@ DISCONNECTED
Maxima has disconnected (possibly because the process had died).
Definition: Maxima.h:115
@ READ_MISC_TEXT
Maxima has sent non-XML text.
Definition: Maxima.h:103
Maxima(wxSocketBase *socket, Configuration *config)
Construct this object when a connection is received from Maxima. The argument should be socketServer....
Definition: Maxima.cpp:51
void ReadSocket()
Read whatever data is in the socket. This is normally handled by the event handler,...
Definition: Maxima.cpp:160
static void GetPipeToStdErr(bool pipe)
Tells if the user wants all data to maxima to be copied to StdErr.
Definition: Maxima.h:78
static void SetPipeToStdErr(bool pipe)
Tells us if the user wants all data to maxima to be copied to StdErr.
Definition: Maxima.h:76
bool IsConnected() const
Are we connected to Maxima?
Definition: Maxima.h:73
bool Write(const void *buffer, std::size_t length)
Write more data to be sent to maxima.
Definition: Maxima.cpp:118
void ClearFirstPrompt()
Clear the first prompt state, based on what was read from maxima. This is called from prompt recogniz...
Definition: Maxima.h:97