]> git.lyx.org Git - lyx.git/blobdiff - src/support/FileName.cpp
Fix problem with python and change of PATH
[lyx.git] / src / support / FileName.cpp
index 2d4d8ef0dfe27eee94a6799704847a5035c24273..f0489309d549ae44a61df42c888225eb23eadfe5 100644 (file)
@@ -98,13 +98,7 @@ struct FileName::Private
        ///
        inline void refresh() 
        {
-// There seems to be a bug in Qt >= 4.2.0 and < 4.5.0, that causes problems with
-// QFileInfo::refresh() on *nix. So we recreate the object in that case.
-#if defined(_WIN32) || (QT_VERSION >= 0x040500)
                fi.refresh();
-#else
-               fi = QFileInfo(fi.absoluteFilePath());
-#endif
        }
 
 
@@ -137,7 +131,7 @@ FileName::FileName(string const & abs_filename)
        : d(abs_filename.empty() ? new Private : new Private(abs_filename))
 {
        //LYXERR(Debug::FILES, "FileName(" << abs_filename << ')');
-       LASSERT(empty() || isAbsolute(d->name), /**/);
+       LATTEST(empty() || isAbsolute(d->name));
 }
 
 
@@ -200,7 +194,7 @@ void FileName::set(string const & name)
        d->fi.setFile(toqstr(name));
        d->name = fromqstr(d->fi.absoluteFilePath());
        //LYXERR(Debug::FILES, "FileName::set(" << name << ')');
-       LASSERT(empty() || isAbsolute(d->name), /**/);
+       LATTEST(empty() || isAbsolute(d->name));
 }
 
 
@@ -212,7 +206,7 @@ void FileName::set(FileName const & rhs, string const & suffix)
                d->fi.setFile(QDir(rhs.d->fi.absoluteFilePath()), toqstr(suffix));
        d->name = fromqstr(d->fi.absoluteFilePath());
        //LYXERR(Debug::FILES, "FileName::set(" << d->name << ')');
-       LASSERT(empty() || isAbsolute(d->name), /**/);
+       LATTEST(empty() || isAbsolute(d->name));
 }
 
 
@@ -367,6 +361,19 @@ FileName FileName::onlyPath() const
 }
 
 
+FileName FileName::parentPath() const
+{
+       FileName path;
+       // return empty path for parent of root dir
+       // parent of empty path is empty too
+       if (empty() || d->fi.isRoot())
+               return path;
+       path.d->fi.setFile(d->fi.path());
+       path.d->name = fromqstr(path.d->fi.absoluteFilePath());
+       return path;
+}
+
+
 bool FileName::isReadableFile() const
 {
        return !empty() && d->fi.isFile() && d->fi.isReadable();
@@ -430,7 +437,13 @@ FileNameList FileName::dirList(string const & ext) const
 
 static string createTempFile(QString const & mask)
 {
-       QTemporaryFile qt_tmp(mask);
+       // FIXME: This is not safe. QTemporaryFile creates a file in open(),
+       //        but the file is deleted when qt_tmp goes out of scope.
+       //        Therefore the next call to createTempFile() may create the
+       //        same file again. To make this safe the QTemporaryFile object
+       //        needs to be kept for the whole life time of the temp file name.
+       //        This can be achieved by using the TempFile class.
+       QTemporaryFile qt_tmp(mask + ".XXXXXXXXXXXX");
        if (qt_tmp.open()) {
                string const temp_file = fromqstr(qt_tmp.fileName());
                LYXERR(Debug::FILES, "Temporary file `" << temp_file << "' created.");
@@ -716,7 +729,7 @@ docstring FileName::displayName(int threshold) const
 docstring FileName::fileContents(string const & encoding) const
 {
        if (!isReadableFile()) {
-               LYXERR0("File '" << *this << "' is not redable!");
+               LYXERR0("File '" << *this << "' is not readable!");
                return docstring();
        }
 
@@ -739,7 +752,11 @@ docstring FileName::fileContents(string const & encoding) const
        if (encoding.empty() || encoding == "UTF-8")
                s = QString::fromUtf8(contents.data());
        else if (encoding == "ascii")
+#if (QT_VERSION < 0x050000)
                s = QString::fromAscii(contents.data());
+#else
+               s = QString::fromLatin1(contents.data());
+#endif
        else if (encoding == "local8bit")
                s = QString::fromLocal8Bit(contents.data());
        else if (encoding == "latin1")
@@ -769,185 +786,6 @@ void FileName::changeExtension(string const & extension)
 }
 
 
-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() || !isReadableFile())
-               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";
-
-       // ZIP containers (koffice, openoffice.org etc).
-       static string const nonzipStamp = "\008\0\0\0mimetypeapplication/";
-
-       // 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!");
-                       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 &&
-                                  !contains(str, nonzipStamp)) {
-                               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);
-               return format;
-       }
-
-       LYXERR(Debug::GRAPHICS, "filetools(getFormatFromContents)\n"
-               << "\tCouldn't find a known format!");
-       return string();
-}
-
-
 docstring const FileName::relPath(string const & path) const
 {
        // FIXME UNICODE