diff --git a/src/common/rclconfig.cpp b/src/common/rclconfig.cpp index 62a66cb6..9fa0824b 100644 --- a/src/common/rclconfig.cpp +++ b/src/common/rclconfig.cpp @@ -1212,7 +1212,7 @@ void RclConfig::urlrewrite(const string& dbdir, string& url) const // This call always succeeds because the key comes from getNames() if (m_ptrans->get(*it, npath, dbdir)) { path = path.replace(0, it->size(), npath); - url = "file://" + path; + url = path_pathtofileurl(path); } break; } diff --git a/src/index/fsindexer.cpp b/src/index/fsindexer.cpp index a7ea822a..f7de8120 100644 --- a/src/index/fsindexer.cpp +++ b/src/index/fsindexer.cpp @@ -769,7 +769,7 @@ FsIndexer::processonefile(RclConfig *config, if (doc.fmtime.empty()) doc.fmtime = ascdate; if (doc.url.empty()) - doc.url = cstr_fileu + fn; + doc.url = path_pathtofileurl(fn); const string *fnp = 0; if (doc.ipath.empty()) { if (!doc.peekmeta(Rcl::Doc::keyfn, &fnp) || fnp->empty()) @@ -865,7 +865,7 @@ FsIndexer::processonefile(RclConfig *config, fileDoc.meta[Rcl::Doc::keytcfn] = utf8fn; fileDoc.haschildren = true; fileDoc.mimetype = mimetype; - fileDoc.url = cstr_fileu + fn; + fileDoc.url = path_pathtofileurl(fn); if (m_havelocalfields) setlocalfields(localfields, fileDoc); char cbuf[100]; diff --git a/src/index/recollindex.cpp b/src/index/recollindex.cpp index 7471979a..083741d8 100644 --- a/src/index/recollindex.cpp +++ b/src/index/recollindex.cpp @@ -22,6 +22,8 @@ #ifndef _WIN32 #include #include +#else +#include #endif #include "safefcntl.h" #include "safeunistd.h" diff --git a/src/utils/debuglog.cpp b/src/utils/debuglog.cpp index f9ac92b5..b1c5083d 100644 --- a/src/utils/debuglog.cpp +++ b/src/utils/debuglog.cpp @@ -74,7 +74,7 @@ class DLFWImpl { fp = fopen(filename, (truncate) ? "w" : "a"); if (fp) { setvbuf(fp, 0, _IOLBF, BUFSIZ); -#ifdef O_APPEND +#if defined(O_APPEND) && !defined(_WIN32) { int flgs = 0; fcntl(fileno(fp), F_GETFL, &flgs); diff --git a/src/utils/pathut.cpp b/src/utils/pathut.cpp index c506360f..2a749138 100644 --- a/src/utils/pathut.cpp +++ b/src/utils/pathut.cpp @@ -22,6 +22,7 @@ #include "safefcntl.h" #include "safeunistd.h" #include "dirent.h" +#include "cstr.h" #ifdef _WIN32 #include "safewindows.h" #else @@ -818,6 +819,17 @@ string fileurltolocalpath(string url) return url; } +string path_pathtofileurl(const string& path) +{ + // We're supposed to receive a canonic absolute path, but on windows we + // may need to add a '/' in front of the drive spec + string url(cstr_fileu); + if (path.empty() || path[0] != '/') + url.push_back('/'); + url += path; + return url; +} + bool urlisfileurl(const string& url) { return url.find("file://") == 0; diff --git a/src/utils/pathut.h b/src/utils/pathut.h index bf7a6c1f..70b25264 100644 --- a/src/utils/pathut.h +++ b/src/utils/pathut.h @@ -109,6 +109,9 @@ extern bool path_isabsolute(const std::string& s); /// Test if path is root (x:/). root is defined by root/.. == root extern bool path_isroot(const std::string& p); +/// Turn absolute path into file:// url +extern std::string path_pathtofileurl(const std::string& path); + /// Temporary file class class TempFileInternal { public: diff --git a/src/windows/Win32ProjectRecoll.vcxproj b/src/windows/Win32ProjectRecoll.vcxproj index c7d65847..d390a329 100644 --- a/src/windows/Win32ProjectRecoll.vcxproj +++ b/src/windows/Win32ProjectRecoll.vcxproj @@ -145,6 +145,7 @@ + @@ -212,6 +213,7 @@ + diff --git a/src/windows/Win32ProjectRecoll.vcxproj.filters b/src/windows/Win32ProjectRecoll.vcxproj.filters index 8c233892..cfafda99 100644 --- a/src/windows/Win32ProjectRecoll.vcxproj.filters +++ b/src/windows/Win32ProjectRecoll.vcxproj.filters @@ -90,6 +90,9 @@ Header Files + + Header Files + @@ -287,6 +290,9 @@ Source Files + + Source Files +