2003-07-22 20:42:40 +00:00
|
|
|
/**
|
Rename files in src/support, step one.
src/support/package.h src/support/Package.h Package
src/support/package.C.in src/support/Package.C.in Package
src/support/path.h src/support/Path.h Path
src/support/fs_extras.h src/support/fs_extras.h NOCLASSES
src/support/RandomAccessList.h src/support/RandomAccessList.h RandomAccessList
src/support/lyxmanip.h src/support/lyxmanip.h NOCLASSES
src/support/rename.C src/support/rename.cpp NOCLASSES
src/support/abort.C src/support/abort.cpp NOCLASSES
src/support/lyxlib.h src/support/lyxlib.h NOCLASSES
src/support/ExceptionMessage.h src/support/ExceptionMessage.h ExceptionMessage
src/support/copy.C src/support/copy.cpp NOCLASSES
src/support/limited_stack.h src/support/limited_stack.h limited_stack
src/support/filefilterlist.C src/support/FileFilterList.cpp ['FileFilterList', 'Filter']
src/support/cow_ptr.h src/support/cow_ptr.h cow_ptr
src/support/os_unix.C src/support/os_unix.cpp NOCLASSES
src/support/socktools.h src/support/socktools.h NOCLASSES
src/support/forkedcontr.h src/support/ForkedcallsController.h ForkedcallsController
src/support/os.h src/support/os.h NOCLASSES
src/support/FileMonitor.h src/support/FileMonitor.h FileMonitor
src/support/copied_ptr.h src/support/copied_ptr.h copied_ptr
src/support/translator.h src/support/Translator.h Translator
src/support/filetools.C src/support/filetools.cpp NOCLASSES
src/support/unlink.C src/support/unlink.cpp NOCLASSES
src/support/os_win32.C src/support/os_win32.cpp GetFolderPath
src/support/lstrings.C src/support/lstrings.cpp NOCLASSES
src/support/qstring_helpers.C src/support/qstring_helpers.cpp NOCLASSES
src/support/getcwd.C src/support/getcwd.cpp NOCLASSES
src/support/systemcall.C src/support/Systemcall.cpp Systemcall
src/support/lyxalgo.h src/support/lyxalgo.h NOCLASSES
src/support/filefilterlist.h src/support/FileFilterList.h ['FileFilterList', 'Filter']
src/support/unicode.C src/support/unicode.cpp IconvProcessor
src/support/userinfo.C src/support/userinfo.cpp NOCLASSES
src/support/lyxtime.C src/support/lyxtime.cpp NOCLASSES
src/support/kill.C src/support/kill.cpp NOCLASSES
src/support/docstring.C src/support/docstring.cpp to_local8bit_failure
src/support/os_cygwin.C src/support/os_cygwin.cpp NOCLASSES
src/support/lyxsum.C src/support/lyxsum.cpp NOCLASSES
src/support/environment.C src/support/environment.cpp NOCLASSES
src/support/filetools.h src/support/filetools.h NOCLASSES
src/support/textutils.C src/support/textutils.cpp NOCLASSES
src/support/mkdir.C src/support/mkdir.cpp NOCLASSES
src/support/forkedcall.C src/support/Forkedcall.cpp ['ForkedProcess', 'Forkedcall']
src/support/tempname.C src/support/tempname.cpp NOCLASSES
src/support/os_win32.h src/support/os_win32.h GetFolderPath
src/support/types.h src/support/types.h NOCLASSES
src/support/lstrings.h src/support/lstrings.h NOCLASSES
src/support/forkedcallqueue.C src/support/ForkedCallQueue.cpp ForkedCallQueue
src/support/qstring_helpers.h src/support/qstring_helpers.h NOCLASSES
src/support/convert.C src/support/convert.cpp NOCLASSES
src/support/filename.C src/support/FileName.cpp ['FileName', 'DocFileName']
src/support/tests/convert.C src/support/tests/convert.cpp NOCLASSES
src/support/tests/filetools.C src/support/tests/filetools.cpp NOCLASSES
src/support/tests/lstrings.C src/support/tests/lstrings.cpp NOCLASSES
src/support/tests/boost.C src/support/tests/boost.cpp NOCLASSES
src/support/docstream.C src/support/docstream.cpp ['iconv_codecvt_facet_exception', 'idocfstream', 'odocfstream']
src/support/std_istream.h src/support/std_istream.h NOCLASSES
src/support/systemcall.h src/support/Systemcall.h Systemcall
src/support/chdir.C src/support/chdir.cpp NOCLASSES
src/support/std_ostream.h src/support/std_ostream.h NOCLASSES
src/support/unicode.h src/support/unicode.h IconvProcessor
src/support/path.C src/support/Path.cpp Path
src/support/fs_extras.C src/support/fs_extras.cpp NOCLASSES
src/support/userinfo.h src/support/userinfo.h NOCLASSES
src/support/lyxtime.h src/support/lyxtime.h NOCLASSES
src/support/docstring.h src/support/docstring.h to_local8bit_failure
src/support/debugstream.h src/support/debugstream.h basic_debugstream
src/support/environment.h src/support/environment.h NOCLASSES
src/support/textutils.h src/support/textutils.h NOCLASSES
src/support/forkedcall.h src/support/Forkedcall.h ['ForkedProcess', 'Forkedcall']
src/support/socktools.C src/support/socktools.cpp NOCLASSES
src/support/forkedcallqueue.h src/support/ForkedCallQueue.h ForkedCallQueue
src/support/forkedcontr.C src/support/ForkedcallsController.cpp ForkedcallsController
src/support/os.C src/support/os.cpp NOCLASSES
src/support/convert.h src/support/convert.h NOCLASSES
src/support/filename.h src/support/FileName.h ['FileName', 'DocFileName']
src/support/docstream.h src/support/docstream.h ['iconv_codecvt_facet_exception', 'idocfstream', 'odocfstream']
src/support/FileMonitor.C src/support/FileMonitor.cpp FileMonitor
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18024 a592a061-630c-0410-9148-cb99ea01b6c8
2007-04-26 05:12:52 +00:00
|
|
|
* \file FileName.cpp
|
2003-07-22 20:42:40 +00:00
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
*
|
|
|
|
* \author Angus Leeming
|
|
|
|
*
|
2003-09-08 09:51:40 +00:00
|
|
|
* Full author contact details are available in file CREDITS.
|
2003-07-22 20:42:40 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
Rename files in src/support, step one.
src/support/package.h src/support/Package.h Package
src/support/package.C.in src/support/Package.C.in Package
src/support/path.h src/support/Path.h Path
src/support/fs_extras.h src/support/fs_extras.h NOCLASSES
src/support/RandomAccessList.h src/support/RandomAccessList.h RandomAccessList
src/support/lyxmanip.h src/support/lyxmanip.h NOCLASSES
src/support/rename.C src/support/rename.cpp NOCLASSES
src/support/abort.C src/support/abort.cpp NOCLASSES
src/support/lyxlib.h src/support/lyxlib.h NOCLASSES
src/support/ExceptionMessage.h src/support/ExceptionMessage.h ExceptionMessage
src/support/copy.C src/support/copy.cpp NOCLASSES
src/support/limited_stack.h src/support/limited_stack.h limited_stack
src/support/filefilterlist.C src/support/FileFilterList.cpp ['FileFilterList', 'Filter']
src/support/cow_ptr.h src/support/cow_ptr.h cow_ptr
src/support/os_unix.C src/support/os_unix.cpp NOCLASSES
src/support/socktools.h src/support/socktools.h NOCLASSES
src/support/forkedcontr.h src/support/ForkedcallsController.h ForkedcallsController
src/support/os.h src/support/os.h NOCLASSES
src/support/FileMonitor.h src/support/FileMonitor.h FileMonitor
src/support/copied_ptr.h src/support/copied_ptr.h copied_ptr
src/support/translator.h src/support/Translator.h Translator
src/support/filetools.C src/support/filetools.cpp NOCLASSES
src/support/unlink.C src/support/unlink.cpp NOCLASSES
src/support/os_win32.C src/support/os_win32.cpp GetFolderPath
src/support/lstrings.C src/support/lstrings.cpp NOCLASSES
src/support/qstring_helpers.C src/support/qstring_helpers.cpp NOCLASSES
src/support/getcwd.C src/support/getcwd.cpp NOCLASSES
src/support/systemcall.C src/support/Systemcall.cpp Systemcall
src/support/lyxalgo.h src/support/lyxalgo.h NOCLASSES
src/support/filefilterlist.h src/support/FileFilterList.h ['FileFilterList', 'Filter']
src/support/unicode.C src/support/unicode.cpp IconvProcessor
src/support/userinfo.C src/support/userinfo.cpp NOCLASSES
src/support/lyxtime.C src/support/lyxtime.cpp NOCLASSES
src/support/kill.C src/support/kill.cpp NOCLASSES
src/support/docstring.C src/support/docstring.cpp to_local8bit_failure
src/support/os_cygwin.C src/support/os_cygwin.cpp NOCLASSES
src/support/lyxsum.C src/support/lyxsum.cpp NOCLASSES
src/support/environment.C src/support/environment.cpp NOCLASSES
src/support/filetools.h src/support/filetools.h NOCLASSES
src/support/textutils.C src/support/textutils.cpp NOCLASSES
src/support/mkdir.C src/support/mkdir.cpp NOCLASSES
src/support/forkedcall.C src/support/Forkedcall.cpp ['ForkedProcess', 'Forkedcall']
src/support/tempname.C src/support/tempname.cpp NOCLASSES
src/support/os_win32.h src/support/os_win32.h GetFolderPath
src/support/types.h src/support/types.h NOCLASSES
src/support/lstrings.h src/support/lstrings.h NOCLASSES
src/support/forkedcallqueue.C src/support/ForkedCallQueue.cpp ForkedCallQueue
src/support/qstring_helpers.h src/support/qstring_helpers.h NOCLASSES
src/support/convert.C src/support/convert.cpp NOCLASSES
src/support/filename.C src/support/FileName.cpp ['FileName', 'DocFileName']
src/support/tests/convert.C src/support/tests/convert.cpp NOCLASSES
src/support/tests/filetools.C src/support/tests/filetools.cpp NOCLASSES
src/support/tests/lstrings.C src/support/tests/lstrings.cpp NOCLASSES
src/support/tests/boost.C src/support/tests/boost.cpp NOCLASSES
src/support/docstream.C src/support/docstream.cpp ['iconv_codecvt_facet_exception', 'idocfstream', 'odocfstream']
src/support/std_istream.h src/support/std_istream.h NOCLASSES
src/support/systemcall.h src/support/Systemcall.h Systemcall
src/support/chdir.C src/support/chdir.cpp NOCLASSES
src/support/std_ostream.h src/support/std_ostream.h NOCLASSES
src/support/unicode.h src/support/unicode.h IconvProcessor
src/support/path.C src/support/Path.cpp Path
src/support/fs_extras.C src/support/fs_extras.cpp NOCLASSES
src/support/userinfo.h src/support/userinfo.h NOCLASSES
src/support/lyxtime.h src/support/lyxtime.h NOCLASSES
src/support/docstring.h src/support/docstring.h to_local8bit_failure
src/support/debugstream.h src/support/debugstream.h basic_debugstream
src/support/environment.h src/support/environment.h NOCLASSES
src/support/textutils.h src/support/textutils.h NOCLASSES
src/support/forkedcall.h src/support/Forkedcall.h ['ForkedProcess', 'Forkedcall']
src/support/socktools.C src/support/socktools.cpp NOCLASSES
src/support/forkedcallqueue.h src/support/ForkedCallQueue.h ForkedCallQueue
src/support/forkedcontr.C src/support/ForkedcallsController.cpp ForkedcallsController
src/support/os.C src/support/os.cpp NOCLASSES
src/support/convert.h src/support/convert.h NOCLASSES
src/support/filename.h src/support/FileName.h ['FileName', 'DocFileName']
src/support/docstream.h src/support/docstream.h ['iconv_codecvt_facet_exception', 'idocfstream', 'odocfstream']
src/support/FileMonitor.C src/support/FileMonitor.cpp FileMonitor
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18024 a592a061-630c-0410-9148-cb99ea01b6c8
2007-04-26 05:12:52 +00:00
|
|
|
#include "support/FileName.h"
|
2004-11-07 13:22:51 +00:00
|
|
|
#include "support/filetools.h"
|
|
|
|
#include "support/lstrings.h"
|
|
|
|
#include "support/os.h"
|
Make libQtCore a support library like boost and implement encoding conversion
from/to the local 8bit encoding with it.
Only the autotools build system is updated, scons and cmake users need to
add qt4 cpp flags when compiling libsupport, and link libsupport against
libQtCore.
* src/frontends/qt4/qt_helpers.[Ch]
(toqstr, qchar_to_ucs4, ucs4_to_qchar, ucs4_to_qstring,
qstring_to_ucs4, fromqstr): Move these qstring conversion functions
from here ...
* src/support/qstring_helpers.[Ch] ... to these new files
* src/support/docstring.[Ch]
(from_local8bit): new conversion function from local 8bit encoding
to ucs4
(to_local8bit): new conversion function from ucs4 to local 8bit
encoding to ucs4
(to_local8bit_failure): exception that is thrown by to_local8bit if
the argument cannot be converted to the local encoding
* src/support/filename.C
(FileName::toFilesystemEncoding): implement with the help of QFile
* src/support/Makefile.am: Add new files, qt4 cpp flags and link
against libQtCore
* src/client/client.C: Convert commandline input from local encoding
to ucs4. Convert stuff that is sent to to the server to utf8,
because LyX interprets it as utf8 on the other end of the pipe.
* src/lyx_main.C
(LyX::exec): convert commandline input from local encoding to utf8
(LyX::init): ditto
(LyX::easyParse): ditto
* development/scons/scons_manifest.py: Add new files
* config/qt4.m4: Define new variables QT4_CORE_INCLUDES,
QT4_CORE_LDFLAGS and QT4_CORE_LIB
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16257 a592a061-630c-0410-9148-cb99ea01b6c8
2006-12-12 20:19:46 +00:00
|
|
|
#include "support/qstring_helpers.h"
|
|
|
|
|
2007-10-18 23:03:51 +00:00
|
|
|
#include "debug.h"
|
|
|
|
#include "lyxlib.h"
|
|
|
|
|
2006-12-13 16:23:29 +00:00
|
|
|
#include <QFile>
|
2007-10-17 22:21:50 +00:00
|
|
|
#include <QFileInfo>
|
2003-07-22 20:42:40 +00:00
|
|
|
|
2007-10-17 22:21:50 +00:00
|
|
|
#include <boost/filesystem/exception.hpp>
|
|
|
|
#include <boost/filesystem/operations.hpp>
|
2003-09-09 17:25:35 +00:00
|
|
|
|
2004-03-11 11:45:08 +00:00
|
|
|
#include <map>
|
|
|
|
#include <sstream>
|
2007-10-20 17:35:27 +00:00
|
|
|
#include <fstream>
|
2006-04-01 13:04:23 +00:00
|
|
|
#include <algorithm>
|
2003-07-22 20:42:40 +00:00
|
|
|
|
2004-03-11 11:45:08 +00:00
|
|
|
|
|
|
|
using std::map;
|
2003-10-06 15:43:21 +00:00
|
|
|
using std::string;
|
2007-10-20 17:35:27 +00:00
|
|
|
using std::ifstream;
|
|
|
|
using std::ostringstream;
|
|
|
|
using std::endl;
|
|
|
|
|
|
|
|
namespace fs = boost::filesystem;
|
2003-10-06 15:43:21 +00:00
|
|
|
|
2003-07-22 20:42:40 +00:00
|
|
|
namespace lyx {
|
|
|
|
namespace support {
|
|
|
|
|
|
|
|
|
2007-10-17 22:21:50 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// FileName
|
|
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
2006-11-26 21:30:39 +00:00
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
FileName::FileName(string const & abs_filename)
|
|
|
|
: name_(abs_filename)
|
2003-09-03 17:23:38 +00:00
|
|
|
{
|
2006-12-04 13:45:08 +00:00
|
|
|
BOOST_ASSERT(empty() || absolutePath(name_));
|
2007-02-13 17:31:43 +00:00
|
|
|
#if defined(_WIN32)
|
2006-12-03 14:48:00 +00:00
|
|
|
BOOST_ASSERT(!contains(name_, '\\'));
|
2007-02-13 17:31:43 +00:00
|
|
|
#endif
|
2003-09-03 17:23:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-26 21:30:39 +00:00
|
|
|
void FileName::set(string const & name)
|
|
|
|
{
|
|
|
|
name_ = name;
|
|
|
|
BOOST_ASSERT(absolutePath(name_));
|
2007-02-13 17:31:43 +00:00
|
|
|
#if defined(_WIN32)
|
2006-12-03 14:48:00 +00:00
|
|
|
BOOST_ASSERT(!contains(name_, '\\'));
|
2007-02-13 17:31:43 +00:00
|
|
|
#endif
|
2006-11-26 21:30:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FileName::erase()
|
|
|
|
{
|
|
|
|
name_.erase();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-18 23:03:51 +00:00
|
|
|
string FileName::toFilesystemEncoding() const
|
2006-11-26 21:30:39 +00:00
|
|
|
{
|
Make libQtCore a support library like boost and implement encoding conversion
from/to the local 8bit encoding with it.
Only the autotools build system is updated, scons and cmake users need to
add qt4 cpp flags when compiling libsupport, and link libsupport against
libQtCore.
* src/frontends/qt4/qt_helpers.[Ch]
(toqstr, qchar_to_ucs4, ucs4_to_qchar, ucs4_to_qstring,
qstring_to_ucs4, fromqstr): Move these qstring conversion functions
from here ...
* src/support/qstring_helpers.[Ch] ... to these new files
* src/support/docstring.[Ch]
(from_local8bit): new conversion function from local 8bit encoding
to ucs4
(to_local8bit): new conversion function from ucs4 to local 8bit
encoding to ucs4
(to_local8bit_failure): exception that is thrown by to_local8bit if
the argument cannot be converted to the local encoding
* src/support/filename.C
(FileName::toFilesystemEncoding): implement with the help of QFile
* src/support/Makefile.am: Add new files, qt4 cpp flags and link
against libQtCore
* src/client/client.C: Convert commandline input from local encoding
to ucs4. Convert stuff that is sent to to the server to utf8,
because LyX interprets it as utf8 on the other end of the pipe.
* src/lyx_main.C
(LyX::exec): convert commandline input from local encoding to utf8
(LyX::init): ditto
(LyX::easyParse): ditto
* development/scons/scons_manifest.py: Add new files
* config/qt4.m4: Define new variables QT4_CORE_INCLUDES,
QT4_CORE_LDFLAGS and QT4_CORE_LIB
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16257 a592a061-630c-0410-9148-cb99ea01b6c8
2006-12-12 20:19:46 +00:00
|
|
|
QByteArray const encoded = QFile::encodeName(toqstr(name_));
|
|
|
|
return string(encoded.begin(), encoded.end());
|
2006-11-26 21:30:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-18 23:03:51 +00:00
|
|
|
FileName FileName::fromFilesystemEncoding(string const & name)
|
2006-12-21 13:01:47 +00:00
|
|
|
{
|
|
|
|
QByteArray const encoded(name.c_str(), name.length());
|
|
|
|
return FileName(fromqstr(QFile::decodeName(encoded)));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-17 22:21:50 +00:00
|
|
|
bool FileName::exists() const
|
|
|
|
{
|
|
|
|
return QFileInfo(toqstr(name_)).exists();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-18 21:10:35 +00:00
|
|
|
bool FileName::isDirectory() const
|
2007-10-18 19:38:24 +00:00
|
|
|
{
|
|
|
|
return QFileInfo(toqstr(name_)).isDir();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-17 22:21:50 +00:00
|
|
|
bool FileName::isReadOnly() const
|
|
|
|
{
|
|
|
|
QFileInfo const fi(toqstr(name_));
|
|
|
|
return fi.isReadable() && !fi.isWritable();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-18 21:10:35 +00:00
|
|
|
bool FileName::isReadable() const
|
|
|
|
{
|
|
|
|
QFileInfo const fi(toqstr(name_));
|
|
|
|
return fi.isReadable();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-11-03 17:37:37 +00:00
|
|
|
std::string FileName::onlyFileName() const
|
|
|
|
{
|
|
|
|
return support::onlyFilename(absFilename());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::string FileName::onlyPath() const
|
|
|
|
{
|
|
|
|
return support::onlyPath(absFilename());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-18 23:03:51 +00:00
|
|
|
bool FileName::isFileReadable() const
|
|
|
|
{
|
|
|
|
QFileInfo const fi(toqstr(name_));
|
|
|
|
return fi.isFile() && fi.isReadable();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool FileName::isWritable() const
|
|
|
|
{
|
|
|
|
QFileInfo const fi(toqstr(name_));
|
2007-10-19 07:45:46 +00:00
|
|
|
return fi.isWritable();
|
2007-10-18 23:03:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool FileName::isDirWritable() const
|
|
|
|
{
|
|
|
|
LYXERR(Debug::FILES) << "isDirWriteable: " << *this << std::endl;
|
|
|
|
|
|
|
|
FileName const tmpfl(tempName(*this, "lyxwritetest"));
|
|
|
|
|
|
|
|
if (tmpfl.empty())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
unlink(tmpfl);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FileName FileName::tempName(FileName const & dir, std::string const & mask)
|
|
|
|
{
|
|
|
|
return support::tempName(dir, mask);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-17 22:21:50 +00:00
|
|
|
std::time_t FileName::lastModified() const
|
|
|
|
{
|
2007-10-20 17:35:27 +00:00
|
|
|
return fs::last_write_time(toFilesystemEncoding());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool FileName::destroyDirectory() const
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
return fs::remove_all(toFilesystemEncoding()) > 0;
|
|
|
|
} catch (fs::filesystem_error const & fe){
|
|
|
|
lyxerr << "Could not delete " << *this << ". (" << fe.what() << ")"
|
|
|
|
<< std::endl;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool FileName::createDirectory(int permission) const
|
|
|
|
{
|
|
|
|
BOOST_ASSERT(!empty());
|
|
|
|
return mkdir(*this, permission) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-11-03 17:37:37 +00:00
|
|
|
docstring FileName::displayName(int threshold) const
|
|
|
|
{
|
|
|
|
return makeDisplayPath(absFilename(), threshold);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-20 17:35:27 +00:00
|
|
|
string FileName::fileContents() const
|
|
|
|
{
|
|
|
|
if (exists()) {
|
|
|
|
string const encodedname = toFilesystemEncoding();
|
|
|
|
ifstream ifs(encodedname.c_str());
|
|
|
|
ostringstream ofs;
|
|
|
|
if (ifs && ofs) {
|
|
|
|
ofs << ifs.rdbuf();
|
|
|
|
ifs.close();
|
|
|
|
return ofs.str();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
lyxerr << "LyX was not able to read file '" << *this << '\'' << std::endl;
|
|
|
|
return string();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string FileName::guessFormatFromContents() const
|
|
|
|
{
|
|
|
|
// the different filetypes and what they contain in one of the first lines
|
|
|
|
// (dots are any characters). (Herbert 20020131)
|
|
|
|
// AGR Grace...
|
|
|
|
// BMP BM...
|
|
|
|
// EPS %!PS-Adobe-3.0 EPSF...
|
|
|
|
// FIG #FIG...
|
|
|
|
// FITS ...BITPIX...
|
|
|
|
// GIF GIF...
|
|
|
|
// JPG JFIF
|
|
|
|
// PDF %PDF-...
|
|
|
|
// PNG .PNG...
|
|
|
|
// PBM P1... or P4 (B/W)
|
|
|
|
// PGM P2... or P5 (Grayscale)
|
|
|
|
// PPM P3... or P6 (color)
|
|
|
|
// PS %!PS-Adobe-2.0 or 1.0, no "EPSF"!
|
|
|
|
// SGI \001\332... (decimal 474)
|
|
|
|
// TGIF %TGIF...
|
|
|
|
// TIFF II... or MM...
|
|
|
|
// XBM ..._bits[]...
|
|
|
|
// XPM /* XPM */ sometimes missing (f.ex. tgif-export)
|
|
|
|
// ...static char *...
|
|
|
|
// XWD \000\000\000\151 (0x00006900) decimal 105
|
|
|
|
//
|
|
|
|
// GZIP \037\213 http://www.ietf.org/rfc/rfc1952.txt
|
|
|
|
// ZIP PK... http://www.halyava.ru/document/ind_arch.htm
|
|
|
|
// Z \037\235 UNIX compress
|
|
|
|
// paranoia check
|
|
|
|
|
|
|
|
if (empty() || !isReadable())
|
|
|
|
return string();
|
|
|
|
|
|
|
|
ifstream ifs(toFilesystemEncoding().c_str());
|
|
|
|
if (!ifs)
|
|
|
|
// Couldn't open file...
|
|
|
|
return string();
|
|
|
|
|
|
|
|
// gnuzip
|
|
|
|
static string const gzipStamp = "\037\213";
|
|
|
|
|
|
|
|
// PKZIP
|
|
|
|
static string const zipStamp = "PK";
|
|
|
|
|
|
|
|
// compress
|
|
|
|
static string const compressStamp = "\037\235";
|
|
|
|
|
|
|
|
// Maximum strings to read
|
|
|
|
int const max_count = 50;
|
|
|
|
int count = 0;
|
|
|
|
|
|
|
|
string str;
|
|
|
|
string format;
|
|
|
|
bool firstLine = true;
|
|
|
|
while ((count++ < max_count) && format.empty()) {
|
|
|
|
if (ifs.eof()) {
|
|
|
|
LYXERR(Debug::GRAPHICS)
|
|
|
|
<< "filetools(getFormatFromContents)\n"
|
|
|
|
<< "\tFile type not recognised before EOF!"
|
|
|
|
<< endl;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
getline(ifs, str);
|
|
|
|
string const stamp = str.substr(0, 2);
|
|
|
|
if (firstLine && str.size() >= 2) {
|
|
|
|
// at first we check for a zipped file, because this
|
|
|
|
// information is saved in the first bytes of the file!
|
|
|
|
// also some graphic formats which save the information
|
|
|
|
// in the first line, too.
|
|
|
|
if (prefixIs(str, gzipStamp)) {
|
|
|
|
format = "gzip";
|
|
|
|
|
|
|
|
} else if (stamp == zipStamp) {
|
|
|
|
format = "zip";
|
|
|
|
|
|
|
|
} else if (stamp == compressStamp) {
|
|
|
|
format = "compress";
|
|
|
|
|
|
|
|
// the graphics part
|
|
|
|
} else if (stamp == "BM") {
|
|
|
|
format = "bmp";
|
|
|
|
|
|
|
|
} else if (stamp == "\001\332") {
|
|
|
|
format = "sgi";
|
|
|
|
|
|
|
|
// PBM family
|
|
|
|
// Don't need to use str.at(0), str.at(1) because
|
|
|
|
// we already know that str.size() >= 2
|
|
|
|
} else if (str[0] == 'P') {
|
|
|
|
switch (str[1]) {
|
|
|
|
case '1':
|
|
|
|
case '4':
|
|
|
|
format = "pbm";
|
|
|
|
break;
|
|
|
|
case '2':
|
|
|
|
case '5':
|
|
|
|
format = "pgm";
|
|
|
|
break;
|
|
|
|
case '3':
|
|
|
|
case '6':
|
|
|
|
format = "ppm";
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
} else if ((stamp == "II") || (stamp == "MM")) {
|
|
|
|
format = "tiff";
|
|
|
|
|
|
|
|
} else if (prefixIs(str,"%TGIF")) {
|
|
|
|
format = "tgif";
|
|
|
|
|
|
|
|
} else if (prefixIs(str,"#FIG")) {
|
|
|
|
format = "fig";
|
|
|
|
|
|
|
|
} else if (prefixIs(str,"GIF")) {
|
|
|
|
format = "gif";
|
|
|
|
|
|
|
|
} else if (str.size() > 3) {
|
|
|
|
int const c = ((str[0] << 24) & (str[1] << 16) &
|
|
|
|
(str[2] << 8) & str[3]);
|
|
|
|
if (c == 105) {
|
|
|
|
format = "xwd";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
firstLine = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!format.empty())
|
|
|
|
break;
|
|
|
|
else if (contains(str,"EPSF"))
|
|
|
|
// dummy, if we have wrong file description like
|
|
|
|
// %!PS-Adobe-2.0EPSF"
|
|
|
|
format = "eps";
|
|
|
|
|
|
|
|
else if (contains(str, "Grace"))
|
|
|
|
format = "agr";
|
|
|
|
|
|
|
|
else if (contains(str, "JFIF"))
|
|
|
|
format = "jpg";
|
|
|
|
|
|
|
|
else if (contains(str, "%PDF"))
|
|
|
|
format = "pdf";
|
|
|
|
|
|
|
|
else if (contains(str, "PNG"))
|
|
|
|
format = "png";
|
|
|
|
|
|
|
|
else if (contains(str, "%!PS-Adobe")) {
|
|
|
|
// eps or ps
|
|
|
|
ifs >> str;
|
|
|
|
if (contains(str,"EPSF"))
|
|
|
|
format = "eps";
|
|
|
|
else
|
|
|
|
format = "ps";
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (contains(str, "_bits[]"))
|
|
|
|
format = "xbm";
|
|
|
|
|
|
|
|
else if (contains(str, "XPM") || contains(str, "static char *"))
|
|
|
|
format = "xpm";
|
|
|
|
|
|
|
|
else if (contains(str, "BITPIX"))
|
|
|
|
format = "fits";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!format.empty()) {
|
|
|
|
LYXERR(Debug::GRAPHICS)
|
|
|
|
<< "Recognised Fileformat: " << format << endl;
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
LYXERR(Debug::GRAPHICS)
|
|
|
|
<< "filetools(getFormatFromContents)\n"
|
|
|
|
<< "\tCouldn't find a known format!\n";
|
|
|
|
return string();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool FileName::isZippedFile() const
|
|
|
|
{
|
|
|
|
string const type = guessFormatFromContents();
|
|
|
|
return contains("gzip zip compress", type) && !type.empty();
|
2007-10-17 22:21:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
bool operator==(FileName const & lhs, FileName const & rhs)
|
|
|
|
{
|
|
|
|
return lhs.absFilename() == rhs.absFilename();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool operator!=(FileName const & lhs, FileName const & rhs)
|
|
|
|
{
|
|
|
|
return lhs.absFilename() != rhs.absFilename();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-26 21:30:39 +00:00
|
|
|
bool operator<(FileName const & lhs, FileName const & rhs)
|
|
|
|
{
|
|
|
|
return lhs.absFilename() < rhs.absFilename();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool operator>(FileName const & lhs, FileName const & rhs)
|
|
|
|
{
|
|
|
|
return lhs.absFilename() > rhs.absFilename();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::ostream & operator<<(std::ostream & os, FileName const & filename)
|
|
|
|
{
|
|
|
|
return os << filename.absFilename();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-17 22:21:50 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// DocFileName
|
|
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
DocFileName::DocFileName()
|
|
|
|
: save_abs_path_(true)
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
|
DocFileName::DocFileName(string const & abs_filename, bool save_abs)
|
|
|
|
: FileName(abs_filename), save_abs_path_(save_abs), zipped_valid_(false)
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
2006-12-27 10:56:11 +00:00
|
|
|
DocFileName::DocFileName(FileName const & abs_filename, bool save_abs)
|
|
|
|
: FileName(abs_filename), save_abs_path_(save_abs), zipped_valid_(false)
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
void DocFileName::set(string const & name, string const & buffer_path)
|
2003-07-22 20:42:40 +00:00
|
|
|
{
|
2006-04-08 22:31:11 +00:00
|
|
|
save_abs_path_ = absolutePath(name);
|
2006-12-27 10:56:11 +00:00
|
|
|
name_ = save_abs_path_ ? name : makeAbsPath(name, buffer_path).absFilename();
|
2006-07-08 14:16:56 +00:00
|
|
|
zipped_valid_ = false;
|
2003-07-22 20:42:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
void DocFileName::erase()
|
2003-07-22 20:42:40 +00:00
|
|
|
{
|
|
|
|
name_.erase();
|
2006-07-08 14:16:56 +00:00
|
|
|
zipped_valid_ = false;
|
2003-07-22 20:42:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
string const DocFileName::relFilename(string const & path) const
|
2003-07-22 20:42:40 +00:00
|
|
|
{
|
2007-03-27 07:24:16 +00:00
|
|
|
// FIXME UNICODE
|
|
|
|
return to_utf8(makeRelPath(from_utf8(name_), from_utf8(path)));
|
2003-07-22 20:42:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
string const DocFileName::outputFilename(string const & path) const
|
2003-07-22 20:42:40 +00:00
|
|
|
{
|
2007-03-27 07:24:16 +00:00
|
|
|
// FIXME UNICODE
|
|
|
|
return save_abs_path_ ? name_ : to_utf8(makeRelPath(from_utf8(name_), from_utf8(path)));
|
2003-07-22 20:42:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
string const DocFileName::mangledFilename(std::string const & dir) const
|
2003-09-03 17:23:38 +00:00
|
|
|
{
|
2006-11-18 12:49:47 +00:00
|
|
|
// We need to make sure that every DocFileName instance for a given
|
2004-03-11 11:45:08 +00:00
|
|
|
// filename returns the same mangled name.
|
2004-10-05 10:11:42 +00:00
|
|
|
typedef map<string, string> MangledMap;
|
2004-03-11 11:45:08 +00:00
|
|
|
static MangledMap mangledNames;
|
|
|
|
MangledMap::const_iterator const it = mangledNames.find(name_);
|
|
|
|
if (it != mangledNames.end())
|
|
|
|
return (*it).second;
|
|
|
|
|
|
|
|
// Now the real work
|
2004-12-20 16:59:33 +00:00
|
|
|
string mname = os::internal_path(name_);
|
2003-09-03 17:23:38 +00:00
|
|
|
// Remove the extension.
|
2006-04-08 22:31:11 +00:00
|
|
|
mname = changeExtension(name_, string());
|
2007-02-27 19:01:10 +00:00
|
|
|
// The mangled name must be a valid LaTeX name.
|
|
|
|
// The list of characters to keep is probably over-restrictive,
|
|
|
|
// but it is not really a problem.
|
|
|
|
// Apart from non-ASCII characters, at least the following characters
|
|
|
|
// are forbidden: '/', '.', ' ', and ':'.
|
|
|
|
// On windows it is not possible to create files with '<', '>' or '?'
|
|
|
|
// in the name.
|
|
|
|
static string const keep = "abcdefghijklmnopqrstuvwxyz"
|
2007-05-28 22:27:45 +00:00
|
|
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
|
|
"+,-0123456789;=";
|
2007-02-27 19:01:10 +00:00
|
|
|
string::size_type pos = 0;
|
|
|
|
while ((pos = mname.find_first_not_of(keep, pos)) != string::npos)
|
|
|
|
mname[pos++] = '_';
|
2003-09-03 17:23:38 +00:00
|
|
|
// Add the extension back on
|
2006-04-08 22:31:11 +00:00
|
|
|
mname = changeExtension(mname, getExtension(name_));
|
2004-12-17 12:30:48 +00:00
|
|
|
|
2004-03-11 11:45:08 +00:00
|
|
|
// Prepend a counter to the filename. This is necessary to make
|
|
|
|
// the mangled name unique.
|
|
|
|
static int counter = 0;
|
|
|
|
std::ostringstream s;
|
2005-07-14 12:53:12 +00:00
|
|
|
s << counter++ << mname;
|
|
|
|
mname = s.str();
|
|
|
|
|
2006-04-05 23:39:11 +00:00
|
|
|
// MiKTeX's YAP (version 2.4.1803) crashes if the file name
|
2006-04-01 13:04:23 +00:00
|
|
|
// is longer than about 160 characters. MiKTeX's pdflatex
|
|
|
|
// is even pickier. A maximum length of 100 has been proven to work.
|
|
|
|
// If dir.size() > max length, all bets are off for YAP. We truncate
|
|
|
|
// the filename nevertheless, keeping a minimum of 10 chars.
|
|
|
|
|
|
|
|
string::size_type max_length = std::max(100 - ((int)dir.size() + 1), 10);
|
2006-03-15 21:00:15 +00:00
|
|
|
|
|
|
|
// If the mangled file name is too long, hack it to fit.
|
|
|
|
// We know we're guaranteed to have a unique file name because
|
|
|
|
// of the counter.
|
|
|
|
if (mname.size() > max_length) {
|
|
|
|
int const half = (int(max_length) / 2) - 2;
|
|
|
|
if (half > 0) {
|
|
|
|
mname = mname.substr(0, half) + "___" +
|
|
|
|
mname.substr(mname.size() - half);
|
2005-07-14 12:53:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-03-11 11:45:08 +00:00
|
|
|
mangledNames[name_] = mname;
|
|
|
|
return mname;
|
2003-09-03 17:23:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
bool DocFileName::isZipped() const
|
2003-09-03 17:23:38 +00:00
|
|
|
{
|
2006-07-08 14:16:56 +00:00
|
|
|
if (!zipped_valid_) {
|
2007-10-20 17:35:27 +00:00
|
|
|
zipped_ = isZippedFile();
|
2006-07-08 14:16:56 +00:00
|
|
|
zipped_valid_ = true;
|
|
|
|
}
|
|
|
|
return zipped_;
|
2003-09-03 17:23:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
string const DocFileName::unzippedFilename() const
|
2003-09-03 17:23:38 +00:00
|
|
|
{
|
|
|
|
return unzippedFileName(name_);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
bool operator==(DocFileName const & lhs, DocFileName const & rhs)
|
2003-07-22 20:42:40 +00:00
|
|
|
{
|
2007-10-20 17:35:27 +00:00
|
|
|
return lhs.absFilename() == rhs.absFilename()
|
|
|
|
&& lhs.saveAbsPath() == rhs.saveAbsPath();
|
2003-07-22 20:42:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-18 12:49:47 +00:00
|
|
|
bool operator!=(DocFileName const & lhs, DocFileName const & rhs)
|
2003-07-22 20:42:40 +00:00
|
|
|
{
|
|
|
|
return !(lhs == rhs);
|
|
|
|
}
|
|
|
|
|
2003-09-03 17:23:38 +00:00
|
|
|
} // namespace support
|
2003-07-22 20:42:40 +00:00
|
|
|
} // namespace lyx
|