bool TextClass::read(std::string const & str, ReadType rt) { Lexer lexrc(textClassTags); istringstream is(str); lexrc.setStream(is); ReturnValues retval = read(lexrc, rt); if (retval != FORMAT_MISMATCH) return retval == OK; // write the layout string to a temporary file FileName const tempfile = FileName::tempName("TextClass_read"); ofstream os(tempfile.toFilesystemEncoding().c_str()); if (!os) { LYXERR0("Unable to create temporary file"); return false; } os << str; os.close(); // now try to convert it bool const worx = convertLayoutFormat(tempfile, rt); if (!worx) { LYXERR0("Unable to convert internal layout information to format " << LAYOUT_FORMAT); } tempfile.removeFile(); return worx; }
bool SpecialisedMover::do_rename(FileName const & from, FileName const & to, string const & latex) const { if (command_.empty()) return Mover::do_rename(from, to, latex); if (!do_copy(from, to, latex)) return false; return from.removeFile(); }
bool TextClass::convertLayoutFormat(support::FileName const & filename, ReadType rt) { LYXERR(Debug::TCLASS, "Converting layout file to " << LAYOUT_FORMAT); FileName const tempfile = FileName::tempName("convert_layout"); bool success = layout2layout(filename, tempfile); if (success) success = readWithoutConv(tempfile, rt) == OK; tempfile.removeFile(); return success; }
// Returns a local socket already in the "listen" state (or -1 in case // of error). The first argument is the socket address, the second // is the length of the queue for connections. If successful, a socket // special file 'name' will be created in the filesystem. int listen(FileName const & name, int queue) { int fd; // File descriptor for the socket sockaddr_un addr; // Structure that hold the socket address // We use 'localname' to fill 'addr' string const localname = name.toFilesystemEncoding(); string::size_type len = localname.size(); // the field sun_path in sockaddr_un is a char[108] if (len > 107) { LYXERR0("lyx: Socket address '" << name.absFileName() << "' too long."); return -1; } // Synonims for AF_UNIX are AF_LOCAL and AF_FILE addr.sun_family = AF_UNIX; localname.copy(addr.sun_path, 107); addr.sun_path[len] = '\0'; // This creates a file descriptor for the socket // Synonims for PF_UNIX are PF_LOCAL and PF_FILE // For local sockets, the protocol is always 0 // socket() returns -1 in case of error if ((fd = ::socket(PF_UNIX, SOCK_STREAM, 0))== -1) { LYXERR0("lyx: Could not create socket descriptor: " << strerror(errno)); return -1; } // Set NONBLOCK mode for the file descriptor if (::fcntl(fd, F_SETFL, O_NONBLOCK) == -1) { LYXERR0("lyx: Could not set NONBLOCK mode for socket descriptor: " << strerror(errno)); ::close(fd); return -1; } // bind() gives the local address 'name' for 'fd', also creating // the socket special file in the filesystem. bind() returns -1 // in case of error if ((::bind (fd, reinterpret_cast<sockaddr *>(&addr), SUN_LEN(&addr))) == -1) { LYXERR0("lyx: Could not bind address '" << name.absFileName() << "' to socket descriptor: " << strerror(errno)); ::close(fd); name.removeFile(); return -1; } // Puts the socket in listen state, that is, ready to accept // connections. The second parameter of listen() defines the // maximum length the queue of pending connections may grow to. // It is not a restriction on the number of connections the socket // can accept. Returns -1 in case of error if (::listen (fd, queue) == -1) { LYXERR0("lyx: Could not put socket in 'listen' state: " << strerror(errno)); ::close(fd); name.removeFile(); return -1; } return fd; }