mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 21:21:32 +00:00
* support/FileName:
- simplify copyTo(), the second argument was never used. - move string manipulations to FileName::Private - replace platform specific code with Qt equivalent. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21793 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
09ff5016cd
commit
c42ec8cf50
@ -853,7 +853,7 @@ bool Buffer::save() const
|
|||||||
backupName = FileName(addName(lyxrc.backupdir_path,
|
backupName = FileName(addName(lyxrc.backupdir_path,
|
||||||
mangledName));
|
mangledName));
|
||||||
}
|
}
|
||||||
if (fileName().copyTo(backupName, false)) {
|
if (fileName().copyTo(backupName)) {
|
||||||
madeBackup = true;
|
madeBackup = true;
|
||||||
} else {
|
} else {
|
||||||
Alert::error(_("Backup failure"),
|
Alert::error(_("Backup failure"),
|
||||||
|
@ -156,7 +156,7 @@ bool EmbeddedFile::extract(Buffer const * buf) const
|
|||||||
FileName path = ext.onlyPath();
|
FileName path = ext.onlyPath();
|
||||||
if (!path.isDirectory())
|
if (!path.isDirectory())
|
||||||
makedir(const_cast<char*>(path.absFilename().c_str()), 0755);
|
makedir(const_cast<char*>(path.absFilename().c_str()), 0755);
|
||||||
if (emb.copyTo(ext, false))
|
if (emb.copyTo(ext))
|
||||||
return true;
|
return true;
|
||||||
Alert::error(_("Copy file failure"),
|
Alert::error(_("Copy file failure"),
|
||||||
bformat(_("Cannot copy file %1$s to %2$s.\n"
|
bformat(_("Cannot copy file %1$s to %2$s.\n"
|
||||||
@ -198,7 +198,7 @@ bool EmbeddedFile::updateFromExternalFile(Buffer const * buf) const
|
|||||||
FileName path = emb.onlyPath();
|
FileName path = emb.onlyPath();
|
||||||
if (!path.isDirectory())
|
if (!path.isDirectory())
|
||||||
makedir(const_cast<char*>(path.absFilename().c_str()), 0755);
|
makedir(const_cast<char*>(path.absFilename().c_str()), 0755);
|
||||||
if (ext.copyTo(emb, false))
|
if (ext.copyTo(emb))
|
||||||
return true;
|
return true;
|
||||||
Alert::error(_("Copy file failure"),
|
Alert::error(_("Copy file failure"),
|
||||||
bformat(_("Cannot copy file %1$s to %2$s.\n"
|
bformat(_("Cannot copy file %1$s to %2$s.\n"
|
||||||
@ -301,7 +301,7 @@ bool EmbeddedFiles::writeFile(DocFileName const & filename)
|
|||||||
|
|
||||||
::zipFiles(zipfile.toFilesystemEncoding(), filenames);
|
::zipFiles(zipfile.toFilesystemEncoding(), filenames);
|
||||||
// copy file back
|
// copy file back
|
||||||
if (!zipfile.copyTo(filename, false)) {
|
if (!zipfile.copyTo(filename)) {
|
||||||
Alert::error(_("Save failure"),
|
Alert::error(_("Save failure"),
|
||||||
bformat(_("Cannot create file %1$s.\n"
|
bformat(_("Cannot create file %1$s.\n"
|
||||||
"Please check whether the directory exists and is writeable."),
|
"Please check whether the directory exists and is writeable."),
|
||||||
|
@ -26,9 +26,6 @@
|
|||||||
#include <QList>
|
#include <QList>
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/filesystem/config.hpp>
|
|
||||||
#include <boost/detail/workaround.hpp>
|
|
||||||
#include <boost/throw_exception.hpp>
|
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@ -51,93 +48,26 @@ using std::ifstream;
|
|||||||
using std::ostringstream;
|
using std::ostringstream;
|
||||||
using std::endl;
|
using std::endl;
|
||||||
|
|
||||||
|
|
||||||
// FIXME: merge this
|
|
||||||
//
|
|
||||||
// BOOST_POSIX or BOOST_WINDOWS specify which API to use.
|
|
||||||
# if !defined( BOOST_WINDOWS ) && !defined( BOOST_POSIX )
|
|
||||||
# if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)
|
|
||||||
# define BOOST_WINDOWS
|
|
||||||
# else
|
|
||||||
# define BOOST_POSIX
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#if defined (BOOST_WINDOWS)
|
|
||||||
# define WIN32_LEAN_AND_MEAN
|
|
||||||
# include <windows.h>
|
|
||||||
# undef min
|
|
||||||
# undef max
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static bool copy_file(std::string const & source, std::string const & target, bool noclobber)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef BOOST_POSIX
|
|
||||||
int const infile = ::open(source.c_str(), O_RDONLY);
|
|
||||||
if (infile == -1)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
struct stat source_stat;
|
|
||||||
int const ret = ::fstat(infile, &source_stat);
|
|
||||||
if (ret == -1) {
|
|
||||||
//int err = errno;
|
|
||||||
::close(infile);
|
|
||||||
}
|
|
||||||
|
|
||||||
int const flags = O_WRONLY | O_CREAT | (noclobber ? O_EXCL : O_TRUNC);
|
|
||||||
|
|
||||||
int const outfile = ::open(target.c_str(), flags, source_stat.st_mode);
|
|
||||||
if (outfile == -1) {
|
|
||||||
//int err = errno;
|
|
||||||
::close(infile);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t const buf_sz = 32768;
|
|
||||||
char buf[buf_sz];
|
|
||||||
ssize_t in = -1;
|
|
||||||
ssize_t out = -1;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
in = ::read(infile, buf, buf_sz);
|
|
||||||
if (in == -1) {
|
|
||||||
break;
|
|
||||||
} else if (in == 0) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
out = ::write(outfile, buf, in);
|
|
||||||
if (out == -1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//int err = errno;
|
|
||||||
|
|
||||||
::close(infile);
|
|
||||||
::close(outfile);
|
|
||||||
|
|
||||||
if (in == -1 || out == -1)
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BOOST_WINDOWS
|
|
||||||
if (::CopyFile(source.c_str(), target.c_str(), noclobber) == 0) {
|
|
||||||
// CopyFile is probably not setting errno so this is most
|
|
||||||
// likely wrong.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
namespace lyx {
|
namespace lyx {
|
||||||
namespace support {
|
namespace support {
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// FileName::Private
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
struct FileName::Private
|
||||||
|
{
|
||||||
|
Private() {}
|
||||||
|
|
||||||
|
Private(string const & abs_filename) : fi(toqstr(abs_filename))
|
||||||
|
{}
|
||||||
|
///
|
||||||
|
QFileInfo fi;
|
||||||
|
};
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// FileName
|
// FileName
|
||||||
@ -145,47 +75,70 @@ namespace support {
|
|||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
FileName::FileName() : d(new Private)
|
||||||
|
{}
|
||||||
|
|
||||||
FileName::FileName(string const & abs_filename)
|
FileName::FileName(string const & abs_filename)
|
||||||
: name_(abs_filename)
|
: d(abs_filename.empty() ? new Private : new Private(abs_filename))
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(empty() || absolutePath(name_));
|
BOOST_ASSERT(empty() || d->fi.isAbsolute());
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
BOOST_ASSERT(!contains(name_, '\\'));
|
BOOST_ASSERT(!contains(abs_filename, '\\'));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FileName::FileName(FileName const & rhs) : d(new Private)
|
||||||
|
{
|
||||||
|
d->fi = rhs.d->fi;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FileName & FileName::operator=(FileName const & rhs)
|
||||||
|
{
|
||||||
|
d->fi = rhs.d->fi;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool FileName::empty() const
|
||||||
|
{
|
||||||
|
lyxerr << "FileName::empty() '" << absFilename() << "'" << endl;
|
||||||
|
return d->fi.absoluteFilePath().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string FileName::absFilename() const
|
||||||
|
{
|
||||||
|
return fromqstr(d->fi.absoluteFilePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void FileName::set(string const & name)
|
void FileName::set(string const & name)
|
||||||
{
|
{
|
||||||
name_ = name;
|
d->fi.setFile(toqstr(name));
|
||||||
BOOST_ASSERT(absolutePath(name_));
|
BOOST_ASSERT(d->fi.isAbsolute());
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
BOOST_ASSERT(!contains(name_, '\\'));
|
BOOST_ASSERT(!contains(name, '\\'));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void FileName::erase()
|
void FileName::erase()
|
||||||
{
|
{
|
||||||
name_.erase();
|
d->fi = QFileInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FileName::copyTo(FileName const & name, bool noclobber) const
|
bool FileName::copyTo(FileName const & name) const
|
||||||
{
|
{
|
||||||
try {
|
return QFile::copy(d->fi.absoluteFilePath(), name.d->fi.absoluteFilePath());
|
||||||
copy_file(toFilesystemEncoding(), name.toFilesystemEncoding(), noclobber);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
string FileName::toFilesystemEncoding() const
|
string FileName::toFilesystemEncoding() const
|
||||||
{
|
{
|
||||||
QByteArray const encoded = QFile::encodeName(toqstr(name_));
|
QByteArray const encoded = QFile::encodeName(d->fi.absoluteFilePath());
|
||||||
return string(encoded.begin(), encoded.end());
|
return string(encoded.begin(), encoded.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,39 +152,37 @@ FileName FileName::fromFilesystemEncoding(string const & name)
|
|||||||
|
|
||||||
bool FileName::exists() const
|
bool FileName::exists() const
|
||||||
{
|
{
|
||||||
return QFileInfo(toqstr(name_)).exists();
|
return d->fi.exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FileName::isSymLink() const
|
bool FileName::isSymLink() const
|
||||||
{
|
{
|
||||||
return QFileInfo(toqstr(name_)).isSymLink();
|
return d->fi.isSymLink();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FileName::isFileEmpty() const
|
bool FileName::isFileEmpty() const
|
||||||
{
|
{
|
||||||
return QFileInfo(toqstr(name_)).size() == 0;
|
return d->fi.size() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FileName::isDirectory() const
|
bool FileName::isDirectory() const
|
||||||
{
|
{
|
||||||
return QFileInfo(toqstr(name_)).isDir();
|
return d->fi.isDir();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FileName::isReadOnly() const
|
bool FileName::isReadOnly() const
|
||||||
{
|
{
|
||||||
QFileInfo const fi(toqstr(name_));
|
return d->fi.isReadable() && !d->fi.isWritable();
|
||||||
return fi.isReadable() && !fi.isWritable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FileName::isReadableDirectory() const
|
bool FileName::isReadableDirectory() const
|
||||||
{
|
{
|
||||||
QFileInfo const fi(toqstr(name_));
|
return d->fi.isDir() && d->fi.isReadable();
|
||||||
return fi.isDir() && fi.isReadable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -249,15 +200,13 @@ FileName FileName::onlyPath() const
|
|||||||
|
|
||||||
bool FileName::isReadableFile() const
|
bool FileName::isReadableFile() const
|
||||||
{
|
{
|
||||||
QFileInfo const fi(toqstr(name_));
|
return d->fi.isFile() && d->fi.isReadable();
|
||||||
return fi.isFile() && fi.isReadable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FileName::isWritable() const
|
bool FileName::isWritable() const
|
||||||
{
|
{
|
||||||
QFileInfo const fi(toqstr(name_));
|
return d->fi.isWritable();
|
||||||
return fi.isWritable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -283,7 +232,7 @@ FileName FileName::tempName(FileName const & dir, std::string const & mask)
|
|||||||
|
|
||||||
std::time_t FileName::lastModified() const
|
std::time_t FileName::lastModified() const
|
||||||
{
|
{
|
||||||
return QFileInfo(toqstr(name_)).lastModified().toTime_t();
|
return d->fi.lastModified().toTime_t();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -315,7 +264,7 @@ static bool rmdir(QFileInfo const & fi)
|
|||||||
|
|
||||||
bool FileName::destroyDirectory() const
|
bool FileName::destroyDirectory() const
|
||||||
{
|
{
|
||||||
bool const success = rmdir(QFileInfo(toqstr(name_)));
|
bool const success = rmdir(d->fi);
|
||||||
if (!success)
|
if (!success)
|
||||||
lyxerr << "Could not delete " << *this << "." << endl;
|
lyxerr << "Could not delete " << *this << "." << endl;
|
||||||
|
|
||||||
@ -590,14 +539,14 @@ DocFileName::DocFileName(FileName const & abs_filename, bool save_abs)
|
|||||||
void DocFileName::set(string const & name, string const & buffer_path)
|
void DocFileName::set(string const & name, string const & buffer_path)
|
||||||
{
|
{
|
||||||
save_abs_path_ = absolutePath(name);
|
save_abs_path_ = absolutePath(name);
|
||||||
name_ = save_abs_path_ ? name : makeAbsPath(name, buffer_path).absFilename();
|
FileName::set(save_abs_path_ ? name : makeAbsPath(name, buffer_path).absFilename());
|
||||||
zipped_valid_ = false;
|
zipped_valid_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DocFileName::erase()
|
void DocFileName::erase()
|
||||||
{
|
{
|
||||||
name_.erase();
|
FileName::erase();
|
||||||
zipped_valid_ = false;
|
zipped_valid_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -605,14 +554,13 @@ void DocFileName::erase()
|
|||||||
string const DocFileName::relFilename(string const & path) const
|
string const DocFileName::relFilename(string const & path) const
|
||||||
{
|
{
|
||||||
// FIXME UNICODE
|
// FIXME UNICODE
|
||||||
return to_utf8(makeRelPath(from_utf8(name_), from_utf8(path)));
|
return to_utf8(makeRelPath(qstring_to_ucs4(d->fi.absoluteFilePath()), from_utf8(path)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
string const DocFileName::outputFilename(string const & path) const
|
string const DocFileName::outputFilename(string const & path) const
|
||||||
{
|
{
|
||||||
// FIXME UNICODE
|
return save_abs_path_ ? absFilename() : relFilename(path);
|
||||||
return save_abs_path_ ? name_ : to_utf8(makeRelPath(from_utf8(name_), from_utf8(path)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -622,14 +570,15 @@ string const DocFileName::mangledFilename(std::string const & dir) const
|
|||||||
// filename returns the same mangled name.
|
// filename returns the same mangled name.
|
||||||
typedef map<string, string> MangledMap;
|
typedef map<string, string> MangledMap;
|
||||||
static MangledMap mangledNames;
|
static MangledMap mangledNames;
|
||||||
MangledMap::const_iterator const it = mangledNames.find(name_);
|
MangledMap::const_iterator const it = mangledNames.find(absFilename());
|
||||||
if (it != mangledNames.end())
|
if (it != mangledNames.end())
|
||||||
return (*it).second;
|
return (*it).second;
|
||||||
|
|
||||||
|
string const name = absFilename();
|
||||||
// Now the real work
|
// Now the real work
|
||||||
string mname = os::internal_path(name_);
|
string mname = os::internal_path(name);
|
||||||
// Remove the extension.
|
// Remove the extension.
|
||||||
mname = changeExtension(name_, string());
|
mname = changeExtension(name, string());
|
||||||
// The mangled name must be a valid LaTeX name.
|
// The mangled name must be a valid LaTeX name.
|
||||||
// The list of characters to keep is probably over-restrictive,
|
// The list of characters to keep is probably over-restrictive,
|
||||||
// but it is not really a problem.
|
// but it is not really a problem.
|
||||||
@ -644,7 +593,7 @@ string const DocFileName::mangledFilename(std::string const & dir) const
|
|||||||
while ((pos = mname.find_first_not_of(keep, pos)) != string::npos)
|
while ((pos = mname.find_first_not_of(keep, pos)) != string::npos)
|
||||||
mname[pos++] = '_';
|
mname[pos++] = '_';
|
||||||
// Add the extension back on
|
// Add the extension back on
|
||||||
mname = changeExtension(mname, getExtension(name_));
|
mname = changeExtension(mname, getExtension(name));
|
||||||
|
|
||||||
// Prepend a counter to the filename. This is necessary to make
|
// Prepend a counter to the filename. This is necessary to make
|
||||||
// the mangled name unique.
|
// the mangled name unique.
|
||||||
@ -672,7 +621,7 @@ string const DocFileName::mangledFilename(std::string const & dir) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mangledNames[name_] = mname;
|
mangledNames[absFilename()] = mname;
|
||||||
return mname;
|
return mname;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -689,7 +638,7 @@ bool DocFileName::isZipped() const
|
|||||||
|
|
||||||
string const DocFileName::unzippedFilename() const
|
string const DocFileName::unzippedFilename() const
|
||||||
{
|
{
|
||||||
return unzippedFileName(name_);
|
return unzippedFileName(absFilename());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -707,6 +656,3 @@ bool operator!=(DocFileName const & lhs, DocFileName const & rhs)
|
|||||||
|
|
||||||
} // namespace support
|
} // namespace support
|
||||||
} // namespace lyx
|
} // namespace lyx
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ namespace support {
|
|||||||
class FileName {
|
class FileName {
|
||||||
public:
|
public:
|
||||||
/// Constructor for empty filenames
|
/// Constructor for empty filenames
|
||||||
FileName() {}
|
FileName();
|
||||||
/** Constructor for nonempty filenames.
|
/** Constructor for nonempty filenames.
|
||||||
* explicit because we don't want implicit conversion of relative
|
* explicit because we don't want implicit conversion of relative
|
||||||
* paths in function arguments (e.g. of unlink).
|
* paths in function arguments (e.g. of unlink).
|
||||||
@ -38,6 +38,13 @@ public:
|
|||||||
* Encoding is always UTF-8.
|
* Encoding is always UTF-8.
|
||||||
*/
|
*/
|
||||||
explicit FileName(std::string const & abs_filename);
|
explicit FileName(std::string const & abs_filename);
|
||||||
|
|
||||||
|
/// copy constructor.
|
||||||
|
FileName(FileName const &);
|
||||||
|
|
||||||
|
///
|
||||||
|
FileName & operator=(FileName const &);
|
||||||
|
|
||||||
virtual ~FileName() {}
|
virtual ~FileName() {}
|
||||||
/** Set a new filename.
|
/** Set a new filename.
|
||||||
* \param filename the file in question. Must have an absolute path.
|
* \param filename the file in question. Must have an absolute path.
|
||||||
@ -46,9 +53,9 @@ public:
|
|||||||
virtual void set(std::string const & filename);
|
virtual void set(std::string const & filename);
|
||||||
virtual void erase();
|
virtual void erase();
|
||||||
/// Is this filename empty?
|
/// Is this filename empty?
|
||||||
bool empty() const { return name_.empty(); }
|
bool empty() const;
|
||||||
/// get the absolute file name in UTF-8 encoding
|
/// get the absolute file name in UTF-8 encoding
|
||||||
std::string const absFilename() const { return name_; }
|
std::string absFilename() const;
|
||||||
/**
|
/**
|
||||||
* Get the file name in the encoding used by the file system.
|
* Get the file name in the encoding used by the file system.
|
||||||
* Only use this for accessing the file, e.g. with an fstream.
|
* Only use this for accessing the file, e.g. with an fstream.
|
||||||
@ -77,7 +84,7 @@ public:
|
|||||||
bool isDirWritable() const;
|
bool isDirWritable() const;
|
||||||
|
|
||||||
/// return true when file/directory is writable (write test file)
|
/// return true when file/directory is writable (write test file)
|
||||||
bool copyTo(FileName const & target, bool noclobber) const;
|
bool copyTo(FileName const & target) const;
|
||||||
|
|
||||||
/// remove directory and all contents, returns true on success
|
/// remove directory and all contents, returns true on success
|
||||||
bool destroyDirectory() const;
|
bool destroyDirectory() const;
|
||||||
@ -115,10 +122,11 @@ public:
|
|||||||
/// used for display in the Gui
|
/// used for display in the Gui
|
||||||
docstring displayName(int threshold = 1000) const;
|
docstring displayName(int threshold = 1000) const;
|
||||||
|
|
||||||
|
private:
|
||||||
protected:
|
friend class DocFileName;
|
||||||
/// The absolute file name in UTF-8 encoding.
|
///
|
||||||
std::string name_;
|
struct Private;
|
||||||
|
Private * const d;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user