X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsession.C;h=fd2f26a7fc2a8044c49e28374b09a16ed1a6a3a3;hb=b9aa557b359463dfb0a2132b665570c8d1e5d605;hp=4372d610e89401a6ca975bfd045235df8442e222;hpb=eaa33dca6def75e9bf48582073c75b256821fd25;p=lyx.git diff --git a/src/session.C b/src/session.C index 4372d610e8..fd2f26a7fc 100644 --- a/src/session.C +++ b/src/session.C @@ -23,7 +23,9 @@ #include #include +using lyx::support::absolutePath; using lyx::support::addName; +using lyx::support::FileName; using lyx::support::package; namespace fs = boost::filesystem; @@ -71,10 +73,17 @@ void LastFilesSection::read(istream & is) if (c == '[') break; getline(is, tmp); - // read lastfiles - if (!fs::exists(tmp) || lastfiles.size() >= num_lastfiles) + if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ' || !absolutePath(tmp)) continue; - lastfiles.push_back(tmp); + + // read lastfiles + FileName const file(tmp); + if (fs::exists(file.toFilesystemEncoding()) && + !fs::is_directory(file.toFilesystemEncoding()) && + lastfiles.size() < num_lastfiles) + lastfiles.push_back(file); + else + lyxerr[Debug::INIT] << "LyX: Warning: Ignore last file: " << tmp << endl; } while (is.good()); } @@ -83,11 +92,11 @@ void LastFilesSection::write(ostream & os) const { os << '\n' << sec_lastfiles << '\n'; copy(lastfiles.begin(), lastfiles.end(), - ostream_iterator(os, "\n")); + ostream_iterator(os, "\n")); } -void LastFilesSection::add(string const & file) +void LastFilesSection::add(FileName const & file) { // If file already exist, delete it and reinsert at front. LastFiles::iterator it = find(lastfiles.begin(), lastfiles.end(), file); @@ -104,7 +113,7 @@ void LastFilesSection::setNumberOfLastFiles(unsigned int no) if (0 < no && no <= absolute_max_last_files) num_lastfiles = no; else { - lyxerr << "LyX: session: too many last files\n" + lyxerr[Debug::INIT] << "LyX: session: too many last files\n" << "\tdefault (=" << default_num_last_files << ") used." << endl; num_lastfiles = default_num_last_files; @@ -120,9 +129,15 @@ void LastOpenedSection::read(istream & is) if (c == '[') break; getline(is, tmp); - if (!fs::exists(tmp)) + if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ' || !absolutePath(tmp)) continue; - lastopened.push_back(tmp); + + FileName const file(tmp); + if (fs::exists(file.toFilesystemEncoding()) && + !fs::is_directory(file.toFilesystemEncoding())) + lastopened.push_back(file); + else + lyxerr[Debug::INIT] << "LyX: Warning: Ignore last opened file: " << tmp << endl; } while (is.good()); } @@ -131,11 +146,11 @@ void LastOpenedSection::write(ostream & os) const { os << '\n' << sec_lastopened << '\n'; copy(lastopened.begin(), lastopened.end(), - ostream_iterator(os, "\n")); + ostream_iterator(os, "\n")); } -void LastOpenedSection::add(string const & file) +void LastOpenedSection::add(FileName const & file) { lastopened.push_back(file); } @@ -155,20 +170,33 @@ void LastFilePosSection::read(istream & is) if (c == '[') break; getline(is, tmp); - // read lastfilepos - // pos, file\n - pit_type pit; - pos_type pos; - string fname; - istringstream itmp(tmp); - itmp >> pit; - itmp.ignore(2); // ignore ", " - itmp >> pos; - itmp.ignore(2); // ignore ", " - itmp >> fname; - if (!fs::exists(fname) || lastfilepos.size() >= num_lastfilepos) + if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ') continue; - lastfilepos[fname] = boost::tie(pit, pos); + + try { + // read lastfilepos + // pos, file\n + pit_type pit; + pos_type pos; + string fname; + istringstream itmp(tmp); + itmp >> pit; + itmp.ignore(2); // ignore ", " + itmp >> pos; + itmp.ignore(2); // ignore ", " + getline(itmp, fname); + if (!absolutePath(fname)) + continue; + FileName const file(fname); + if (fs::exists(file.toFilesystemEncoding()) && + !fs::is_directory(file.toFilesystemEncoding()) && + lastfilepos.size() < num_lastfilepos) + lastfilepos[file] = boost::tie(pit, pos); + else + lyxerr[Debug::INIT] << "LyX: Warning: Ignore pos of last file: " << fname << endl; + } catch (...) { + lyxerr[Debug::INIT] << "LyX: Warning: unknown pos of last file: " << tmp << endl; + } } while (is.good()); } @@ -185,13 +213,13 @@ void LastFilePosSection::write(ostream & os) const } -void LastFilePosSection::save(string const & fname, FilePos pos) +void LastFilePosSection::save(FileName const & fname, FilePos pos) { lastfilepos[fname] = pos; } -LastFilePosSection::FilePos LastFilePosSection::load(string const & fname) const +LastFilePosSection::FilePos LastFilePosSection::load(FileName const & fname) const { FilePosMap::const_iterator entry = lastfilepos.find(fname); // Has position information, return it. @@ -211,20 +239,34 @@ void BookmarksSection::read(istream & is) if (c == '[') break; getline(is, tmp); - // read bookmarks - // id, pos, file\n - unsigned int id; - pos_type pos; - string fname; - istringstream itmp(tmp); - itmp >> id; - itmp.ignore(2); // ignore ", " - itmp >> pos; - itmp.ignore(2); // ignore ", " - itmp >> fname; - // only load valid bookmarks - if (bookmarks.size() < max_bookmarks && fs::exists(fname)) - bookmarks.push_back(Bookmark(fname, id, pos)); + if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ') + continue; + + try { + // read bookmarks + // pit, pos, file\n + pit_type pit; + pos_type pos; + string fname; + istringstream itmp(tmp); + itmp >> pit; + itmp.ignore(2); // ignore ", " + itmp >> pos; + itmp.ignore(2); // ignore ", " + getline(itmp, fname); + if (!absolutePath(fname)) + continue; + FileName const file(fname); + // only load valid bookmarks + if (fs::exists(file.toFilesystemEncoding()) && + !fs::is_directory(file.toFilesystemEncoding()) && + bookmarks.size() < max_bookmarks) + bookmarks.push_back(Bookmark(file, pit, 0, pos)); + else + lyxerr[Debug::INIT] << "LyX: Warning: Ignore bookmark of file: " << fname << endl; + } catch (...) { + lyxerr[Debug::INIT] << "LyX: Warning: unknown Bookmark info: " << tmp << endl; + } } while (is.good()); } @@ -233,29 +275,31 @@ void BookmarksSection::write(ostream & os) const { os << '\n' << sec_bookmarks << '\n'; for (size_t i = 0; i < bookmarks.size(); ++i) { - os << bookmarks[i].par_id << ", " + os << bookmarks[i].par_pit << ", " << bookmarks[i].par_pos << ", " << bookmarks[i].filename << '\n'; } } -void BookmarksSection::save(std::string const & fname, int par_id, pos_type par_pos, bool persistent) +void BookmarksSection::save(FileName const & fname, pit_type par_pit, int par_id, pos_type par_pos, bool persistent) { if (persistent) { - bookmarks.push_front(Bookmark(fname, par_id, par_pos)); + bookmarks.push_back(Bookmark(fname, par_pit, par_id, par_pos)); if (bookmarks.size() > max_bookmarks) bookmarks.pop_back(); } else - temp_bookmark = Bookmark(fname, par_id, par_pos); + temp_bookmark = Bookmark(fname, par_pit, par_id, par_pos); } bool BookmarksSection::isValid(unsigned int i) const { - // i == 0, or in the queue - return i <= bookmarks.size(); + if (i == 0) + return !temp_bookmark.filename.empty(); + else + return i <= bookmarks.size() && !bookmarks[i-1].filename.empty(); } @@ -276,20 +320,27 @@ void ToolbarSection::read(istream & is) if (c == '[') break; getline(is, tmp); + if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ') + continue; - // Read session info, saved as key/value pairs - // would better yell if pos returns npos - string::size_type pos = tmp.find_first_of(" = "); - // silently ignore lines without " = " - if (pos != string::npos) { - string key = tmp.substr(0, pos); - int state; - int location; - istringstream value(tmp.substr(pos + 3)); - value >> state; - value.ignore(1); // ignore " " - value >> location; - toolbars[key] = ToolbarInfo(state, location); + try { + // Read session info, saved as key/value pairs + // would better yell if pos returns npos + string::size_type pos = tmp.find_first_of(" = "); + // silently ignore lines without " = " + if (pos != string::npos) { + string key = tmp.substr(0, pos); + int state; + int location; + istringstream value(tmp.substr(pos + 3)); + value >> state; + value.ignore(1); // ignore " " + value >> location; + toolbars[key] = ToolbarInfo(state, location); + } else + lyxerr[Debug::INIT] << "LyX: Warning: Ignore toolbar info: " << tmp << endl; + } catch (...) { + lyxerr[Debug::INIT] << "LyX: Warning: unknown Toolbar info: " << tmp << endl; } } while (is.good()); } @@ -321,15 +372,22 @@ void SessionInfoSection::read(istream & is) if (c == '[') break; getline(is, tmp); + if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ') + continue; - // Read session info, saved as key/value pairs - // would better yell if pos returns npos - string::size_type pos = tmp.find_first_of(" = "); - // silently ignore lines without " = " - if (pos != string::npos) { - string key = tmp.substr(0, pos); - string value = tmp.substr(pos + 3); - sessioninfo[key] = value; + try { + // Read session info, saved as key/value pairs + // would better yell if pos returns npos + string::size_type pos = tmp.find_first_of(" = "); + // silently ignore lines without " = " + if (pos != string::npos) { + string key = tmp.substr(0, pos); + string value = tmp.substr(pos + 3); + sessioninfo[key] = value; + } else + lyxerr[Debug::INIT] << "LyX: Warning: Ignore session info: " << tmp << endl; + } catch (...) { + lyxerr[Debug::INIT] << "LyX: Warning: unknown Session info: " << tmp << endl; } } while (is.good()); } @@ -368,7 +426,7 @@ Session::Session(unsigned int num) : { // locate the session file // note that the session file name 'session' is hard-coded - session_file = addName(package().user_support(), "session"); + session_file = FileName(addName(package().user_support(), "session")); // readFile(); } @@ -378,7 +436,7 @@ void Session::readFile() { // we will not complain if we can't find session_file nor will // we issue a warning. (Lgb) - ifstream is(session_file.c_str()); + ifstream is(session_file.toFilesystemEncoding().c_str()); string tmp; while (getline(is, tmp)) { @@ -400,14 +458,14 @@ void Session::readFile() else if (tmp == sec_session) sessionInfo().read(is); else - lyxerr << "LyX: Warning: unknown Session section: " << tmp << endl; + lyxerr[Debug::INIT] << "LyX: Warning: unknown Session section: " << tmp << endl; } } void Session::writeFile() const { - ofstream os(session_file.c_str()); + ofstream os(session_file.toFilesystemEncoding().c_str()); if (os) { os << "## Automatically generated lyx session file \n" << "## Editing this file manually may cause lyx to crash.\n"; @@ -419,7 +477,7 @@ void Session::writeFile() const toolbars().write(os); sessionInfo().write(os); } else - lyxerr << "LyX: Warning: unable to save Session: " + lyxerr[Debug::INIT] << "LyX: Warning: unable to save Session: " << session_file << endl; }