#include <config.h>
+#include "support/ConsoleApplication.h"
#include "support/debug.h"
#include "support/FileName.h"
#include "support/FileNameList.h"
#include "support/lstrings.h"
+#include "support/Messages.h"
#include "support/unicode.h"
#include <boost/scoped_ptr.hpp>
#include <cerrno>
#include <cstdio>
#include <cstdlib>
+#include <exception>
#include <string>
#include <vector>
#include <map>
void lyx_exit(int)
{}
+// Dummy language support
+Messages const & getGuiMessages()
+{
+ static Messages lyx_messages;
+
+ return lyx_messages;
+}
+
+
+Messages const & getMessages(string const &)
+{
+ return getGuiMessages();
+}
+
+
namespace support {
string itoa(unsigned int i)
// Returns true if there was a complete line to input
// A line is of the form <key>:<value>
// A line not of this form will not be passed
-// The line read is splitted and stored in 'key' and 'value'
+// The line read is split and stored in 'key' and 'value'
bool LyXDataSocket::readln(string & line)
{
int const charbuf_size = 100;
namespace cmdline {
- docstring mainTmp(from_ascii("/tmp"));
+docstring mainTmp(from_ascii("/tmp"));
+
+
+class StopException : public exception
+{
+public:
+ StopException(int status) : status_(status) {}
+ int status() const { return status_; }
+private:
+ int status_;
+};
void usage()
"lyxclient will connect only to a lyx with the specified pid. Options -c and -g\n"
"cannot be set simultaneoulsly. If no -c or -g options are given, lyxclient\n"
"will read commands from standard input and disconnect when command read is BYE:\n"
- "\n"
- "System directory is: " << to_utf8(cmdline::mainTmp)
+ "\n"
+ "System directory is: " << to_utf8(cmdline::mainTmp)
<< endl;
}
int h(vector<docstring> const &)
{
usage();
- exit(0);
+ throw StopException(EXIT_SUCCESS);
}
int n(vector<docstring> const & arg)
{
- if (arg.size() < 1) {
+ if (arg.empty()) {
cerr << "lyxclient: The option -n requires 1 argument."
<< endl;
return -1;
int c(vector<docstring> const & arg)
{
- if (arg.size() < 1) {
+ if (arg.empty()) {
cerr << "lyxclient: The option -c requires 1 argument."
<< endl;
return -1;
int a(vector<docstring> const & arg)
{
- if (arg.size() < 1) {
+ if (arg.empty()) {
cerr << "lyxclient: The option -a requires 1 argument."
<< endl;
return -1;
int t(vector<docstring> const & arg)
{
- if (arg.size() < 1) {
+ if (arg.empty()) {
cerr << "lyxclient: The option -t requires 1 argument."
<< endl;
return -1;
int p(vector<docstring> const & arg)
{
- if (arg.size() < 1) {
+ if (arg.empty()) {
cerr << "lyxclient: The option -p requires 1 argument."
<< endl;
return -1;
} // namespace cmdline
-} // namespace lyx
-
-int main(int argc, char * argv[])
+/// The main application class
+class LyXClientApp : public ConsoleApplication
{
- using namespace lyx;
- lyxerr.setStream(cerr);
+public:
+ LyXClientApp(int & argc, char * argv[])
+ : ConsoleApplication("client" PROGRAM_SUFFIX, argc, argv),
+ argc_(argc), argv_(argv)
+ {
+ }
+ void doExec()
+ {
+ try {
+ int const exit_status = run();
+ exit(exit_status);
+ }
+ catch (cmdline::StopException & e) {
+ exit(e.status());
+ }
+ }
+private:
+ int run();
+ int & argc_;
+ char ** argv_;
+};
- // Set defaults
+int LyXClientApp::run()
+{
+ // qt changes this, and our numeric conversions require the C locale
+ setlocale(LC_NUMERIC, "C");
+
+ // Set defaults
char const * const lyxsocket = getenv("LYXSOCKET");
if (lyxsocket)
cmdline::serverAddress = from_local8bit(lyxsocket);
- // Default temporary
- cmdline::mainTmp = FileName::tempPath().absoluteFilePath();
+ // Default temporary
+ cmdline::mainTmp = FileName::tempPath().absoluteFilePath();
- // Command line builder
+ // Command line builder
CmdLineParser args;
args.helper["-h"] = cmdline::h;
args.helper["-c"] = cmdline::c;
args.helper["-p"] = cmdline::p;
// Command line failure conditions:
- if ((!args.parse(argc, argv))
+ if ((!args.parse(argc_, argv_))
|| (args.isset["-c"] && args.isset["-g"])
|| (args.isset["-a"] && args.isset["-p"])) {
cmdline::usage();
- return 1;
+ return EXIT_FAILURE;
}
scoped_ptr<LyXDataSocket> server;
return EXIT_SUCCESS;
}
+} // namespace lyx
+
+
+int main(int argc, char * argv[])
+{
+ lyx::lyxerr.setStream(cerr);
+
+ lyx::LyXClientApp app(argc, argv);
+ return app.exec();
+}
+
namespace boost {