/// Returns the absolute pathnames of all lyx local sockets in /// file system encoding. /// Parts stolen from lyx::support::DirList(). FileNameList lyxSockets(string const & dir, string const & pid) { FileNameList dirlist; FileName dirpath(dir + "/"); if (!dirpath.exists() || !dirpath.isDirectory()) { lyxerr << dir << " does not exist or is not a directory." << endl; return dirlist; } FileNameList dirs = dirpath.dirList(""); FileNameList::const_iterator it = dirs.begin(); FileNameList::const_iterator end = dirs.end(); for (; it != end; ++it) { if (!it->isDirectory()) continue; string const tmpdir = it->absFileName(); if (!contains(tmpdir, "lyx_tmpdir" + pid)) continue; FileName lyxsocket(tmpdir + "/lyxsocket"); if (lyxsocket.exists()) dirlist.push_back(lyxsocket); } return dirlist; }
void GuiRef::updateContents() { int orig_type = typeCO->currentIndex(); referenceED->setText(toqstr(params_["reference"])); nameED->setText(toqstr(params_["name"])); nameED->setHidden(!nameAllowed() && !isBufferReadonly()); nameL->setHidden(!nameAllowed() && !isBufferReadonly()); // restore type settings for new insets if (params_["reference"].empty()) typeCO->setCurrentIndex(orig_type); else typeCO->setCurrentIndex(InsetRef::getType(params_.getCmdName())); typeCO->setEnabled(typeAllowed() && !isBufferReadonly()); if (!typeAllowed()) typeCO->setCurrentIndex(0); // insert buffer list bufferCO->clear(); FileNameList const & buffers = theBufferList().fileNames(); for (FileNameList::const_iterator it = buffers.begin(); it != buffers.end(); ++it) { bufferCO->addItem(toqstr(makeDisplayPath(it->absFileName()))); } int const thebuffer = theBufferList().bufferNum(buffer().fileName()); // restore the buffer combo setting for new insets if (params_["reference"].empty() && restored_buffer_ != -1 && restored_buffer_ < bufferCO->count() && thebuffer == active_buffer_) bufferCO->setCurrentIndex(restored_buffer_); else { int const num = theBufferList().bufferNum(buffer().fileName()); bufferCO->setCurrentIndex(num); if (thebuffer != active_buffer_) restored_buffer_ = num; } active_buffer_ = thebuffer; updateRefs(); bc().setValid(false); }
int main(int argc, char * argv[]) { using namespace lyx; lyxerr.setStream(cerr); char const * const lyxsocket = getenv("LYXSOCKET"); if (lyxsocket) cmdline::serverAddress = from_local8bit(lyxsocket); CmdLineParser args; args.helper["-h"] = cmdline::h; args.helper["-c"] = cmdline::c; args.helper["-g"] = cmdline::g; args.helper["-n"] = cmdline::n; args.helper["-a"] = cmdline::a; args.helper["-t"] = cmdline::t; args.helper["-p"] = cmdline::p; // Command line failure conditions: if ((!args.parse(argc, argv)) || (args.isset["-c"] && args.isset["-g"]) || (args.isset["-a"] && args.isset["-p"])) { cmdline::usage(); return 1; } scoped_ptr<LyXDataSocket> server; if (!cmdline::serverAddress.empty()) { server.reset(new LyXDataSocket(FileName(to_utf8(cmdline::serverAddress)))); if (!server->connected()) { cerr << "lyxclient: " << "Could not connect to " << to_utf8(cmdline::serverAddress) << endl; return EXIT_FAILURE; } } else { // We have to look for an address. // serverPid can be empty. FileNameList addrs = lyxSockets(to_filesystem8bit(cmdline::mainTmp), cmdline::serverPid); FileNameList::const_iterator addr = addrs.begin(); FileNameList::const_iterator end = addrs.end(); for (; addr != end; ++addr) { // Caution: addr->string() is in filesystem encoding server.reset(new LyXDataSocket(*addr)); if (server->connected()) break; lyxerr << "lyxclient: " << "Could not connect to " << addr->absFileName() << endl; } if (addr == end) { lyxerr << "lyxclient: No suitable server found." << endl; return EXIT_FAILURE; } cerr << "lyxclient: " << "Connected to " << addr->absFileName() << endl; } int const serverfd = server->fd(); IOWatch iowatch; iowatch.addfd(serverfd); // Used to read from server string answer; // Send greeting server->writeln("HELLO:" + to_utf8(cmdline::clientName)); // wait at most 2 seconds until server responds iowatch.wait(2.0); if (iowatch.isset(serverfd) && server->readln(answer)) { if (prefixIs(answer, "BYE:")) { cerr << "lyxclient: Server disconnected." << endl; cout << answer << endl; return EXIT_FAILURE; } } else { cerr << "lyxclient: No answer from server." << endl; return EXIT_FAILURE; } if (args.isset["-g"] || args.isset["-c"]) { server->writeln(to_utf8(cmdline::singleCommand)); iowatch.wait(2.0); if (iowatch.isset(serverfd) && server->readln(answer)) { cout << answer; if (prefixIs(answer, "ERROR:")) return EXIT_FAILURE; return EXIT_SUCCESS; } else { cerr << "lyxclient: No answer from server." << endl; return EXIT_FAILURE; } } // Take commands from stdin iowatch.addfd(0); // stdin bool saidbye = false; while ((!saidbye) && server->connected()) { iowatch.wait(); if (iowatch.isset(0)) { string command; getline(cin, command); if (command.empty()) continue; if (command == "BYE:") { server->writeln("BYE:"); saidbye = true; } else { server->writeln("LYXCMD:" + command); } } if (iowatch.isset(serverfd)) { while(server->readln(answer)) cout << answer << endl; } } return EXIT_SUCCESS; }