X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fclient%2Fclient.cpp;h=023e73e96b44e45facfb9af06232bd0164a0287b;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=9b494c1eb201bd1e9ce63df1ea9eb763e71e765b;hpb=4d541f843011033980c7ee9a02e029c7dbacb484;p=lyx.git diff --git a/src/client/client.cpp b/src/client/client.cpp index 9b494c1eb2..023e73e96b 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -12,13 +12,14 @@ #include +#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 +#include "support/unique_ptr.h" // getpid(), getppid() #ifdef HAVE_SYS_TYPES_H @@ -53,18 +54,21 @@ #include #include #include +#include #include #include #include #include + using namespace std; using namespace lyx::support; -using ::boost::scoped_ptr; - namespace lyx { +// Dummy verbose support +bool verbose = false; + // Dummy LyXRC support struct LyXRC { string icon_set; @@ -74,6 +78,21 @@ struct LyXRC { 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) @@ -293,7 +312,7 @@ bool LyXDataSocket::connected() const // Returns true if there was a complete line to input // A line is of the form : // 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; @@ -408,7 +427,17 @@ bool CmdLineParser::parse(int argc, char * argv[]) 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() @@ -428,8 +457,8 @@ 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; } @@ -437,7 +466,7 @@ void usage() int h(vector const &) { usage(); - exit(0); + throw StopException(EXIT_SUCCESS); } @@ -446,7 +475,7 @@ docstring clientName = int n(vector const & arg) { - if (arg.size() < 1) { + if (arg.empty()) { cerr << "lyxclient: The option -n requires 1 argument." << endl; return -1; @@ -461,7 +490,7 @@ docstring singleCommand; int c(vector const & arg) { - if (arg.size() < 1) { + if (arg.empty()) { cerr << "lyxclient: The option -c requires 1 argument." << endl; return -1; @@ -478,9 +507,11 @@ int g(vector const & arg) << endl; return -1; } - singleCommand = "LYXCMD:server-goto-file-row " - + arg[0] + ' ' - + arg[1]; + singleCommand = "LYXCMD:command-sequence " + "server-goto-file-row " + + arg[0] + ' ' + + arg[1] + "; " + + "lyx-activate"; return 2; } @@ -491,7 +522,7 @@ docstring serverAddress; int a(vector const & arg) { - if (arg.size() < 1) { + if (arg.empty()) { cerr << "lyxclient: The option -a requires 1 argument." << endl; return -1; @@ -506,7 +537,7 @@ int a(vector const & arg) int t(vector const & arg) { - if (arg.size() < 1) { + if (arg.empty()) { cerr << "lyxclient: The option -t requires 1 argument." << endl; return -1; @@ -521,7 +552,7 @@ string serverPid; // Init to empty string int p(vector const & arg) { - if (arg.size() < 1) { + if (arg.empty()) { cerr << "lyxclient: The option -p requires 1 argument." << endl; return -1; @@ -532,24 +563,47 @@ int p(vector const & arg) } // 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_; +}; + +int LyXClientApp::run() +{ + // qt changes this, and our numeric conversions require the C locale + setlocale(LC_NUMERIC, "C"); - // Set defaults + // 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; @@ -560,14 +614,14 @@ int main(int argc, char * argv[]) 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 server; + unique_ptr server; if (!cmdline::serverAddress.empty()) { server.reset(new LyXDataSocket(FileName(to_utf8(cmdline::serverAddress)))); @@ -661,6 +715,17 @@ int main(int argc, char * argv[]) 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 {