office-gobmx/external/boost/boost.file_iterator.sharing_win.patch

159 lines
4.4 KiB
Diff
Raw Normal View History

--- foo/misc/boost/boost/spirit/home/classic/iterator/impl/file_iterator.ipp.orig
+++ foo/misc/boost/boost/spirit/home/classic/iterator/impl/file_iterator.ipp
@@ -181,67 +181,28 @@ public:
{}
explicit mmap_file_iterator(std::string const& fileName)
- : m_filesize(0), m_curChar(0)
- {
- HANDLE hFile = ::CreateFileA(
+ : mmap_file_iterator(::CreateFileA(
fileName.c_str(),
GENERIC_READ,
- FILE_SHARE_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL
- );
-
- if (hFile == INVALID_HANDLE_VALUE)
- return;
-
- // Store the size of the file, it's used to construct
- // the end iterator
- m_filesize = ::GetFileSize(hFile, NULL);
+ ))
+ {}
- HANDLE hMap = ::CreateFileMapping(
- hFile,
+ explicit mmap_file_iterator(std::wstring const& fileName)
+ : mmap_file_iterator(::CreateFileW(
+ fileName.c_str(),
+ GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
- PAGE_READONLY,
- 0, 0,
+ OPEN_EXISTING,
+ FILE_FLAG_SEQUENTIAL_SCAN,
NULL
- );
-
- if (hMap == NULL)
- {
- ::CloseHandle(hFile);
- return;
- }
-
- LPVOID pMem = ::MapViewOfFile(
- hMap,
- FILE_MAP_READ,
- 0, 0, 0
- );
-
- if (pMem == NULL)
- {
- ::CloseHandle(hMap);
- ::CloseHandle(hFile);
- return;
- }
-
- // We hold both the file handle and the memory pointer.
- // We can close the hMap handle now because Windows holds internally
- // a reference to it since there is a view mapped.
- ::CloseHandle(hMap);
-
- // It seems like we can close the file handle as well (because
- // a reference is hold by the filemap object).
- ::CloseHandle(hFile);
-
- // Store the handles inside the shared_ptr (with the custom destructors)
- m_mem.reset(static_cast<CharT*>(pMem), ::UnmapViewOfFile);
-
- // Start of the file
- m_curChar = m_mem.get();
- }
+ ))
+ {}
mmap_file_iterator(const mmap_file_iterator& iter)
{ *this = iter; }
@@ -290,6 +251,59 @@ private:
boost::shared_ptr<CharT> m_mem;
std::size_t m_filesize;
CharT* m_curChar;
+
+ explicit mmap_file_iterator(HANDLE hFile)
+ : m_filesize(0), m_curChar(0)
+ {
+ if (hFile == INVALID_HANDLE_VALUE)
+ return;
+
+ // Store the size of the file, it's used to construct
+ // the end iterator
+ m_filesize = ::GetFileSize(hFile, NULL);
+
+ HANDLE hMap = ::CreateFileMapping(
+ hFile,
+ NULL,
+ PAGE_READONLY,
+ 0, 0,
+ NULL
+ );
+
+ if (hMap == NULL)
+ {
+ ::CloseHandle(hFile);
+ return;
+ }
+
+ LPVOID pMem = ::MapViewOfFile(
+ hMap,
+ FILE_MAP_READ,
+ 0, 0, 0
+ );
+
+ if (pMem == NULL)
+ {
+ ::CloseHandle(hMap);
+ ::CloseHandle(hFile);
+ return;
+ }
+
+ // We hold both the file handle and the memory pointer.
+ // We can close the hMap handle now because Windows holds internally
+ // a reference to it since there is a view mapped.
+ ::CloseHandle(hMap);
+
+ // It seems like we can close the file handle as well (because
+ // a reference is hold by the filemap object).
+ ::CloseHandle(hFile);
+
+ // Store the handles inside the shared_ptr (with the custom destructors)
+ m_mem.reset(static_cast<CharT*>(pMem), ::UnmapViewOfFile);
+
+ // Start of the file
+ m_curChar = m_mem.get();
+ }
};
#endif // BOOST_SPIRIT_FILEITERATOR_WINDOWS
--- foo/misc/boost/boost/spirit/home/classic/iterator/file_iterator.hpp.orig
+++ foo/misc/boost/boost/spirit/home/classic/iterator/file_iterator.hpp
@@ -170,6 +170,12 @@ public:
: base_t(adapted_t(fileName))
{}
+#ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS
+ file_iterator(std::wstring const& fileName)
+ : base_t(adapted_t(fileName))
+ {}
+#endif
+
file_iterator(const base_t& iter)
: base_t(iter)
{}