diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2019-12-27 12:25:03 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2019-12-27 12:25:03 +0100 |
| commit | f085b39752d00a296c288be42dfc69b39b73823f (patch) | |
| tree | f988a9d279865b2e17fd52da5162eadb1bb37c09 /src/filemanager.cpp | |
| parent | aa8c7826cf17e650ee2c3a2281aca49db37c4e81 (diff) | |
| download | PROJ-f085b39752d00a296c288be42dfc69b39b73823f.tar.gz PROJ-f085b39752d00a296c288be42dfc69b39b73823f.zip | |
Handle context reassignment for Grid/GridSet/File objects
Diffstat (limited to 'src/filemanager.cpp')
| -rw-r--r-- | src/filemanager.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/filemanager.cpp b/src/filemanager.cpp index 551301c6..dabb46e0 100644 --- a/src/filemanager.cpp +++ b/src/filemanager.cpp @@ -94,6 +94,7 @@ class FileStdio : public File { size_t read(void *buffer, size_t sizeBytes) override; bool seek(unsigned long long offset, int whence = SEEK_SET) override; unsigned long long tell() override; + void reassign_context(PJ_CONTEXT *ctx) override { m_ctx = ctx; } static std::unique_ptr<File> open(PJ_CONTEXT *ctx, const char *filename); }; @@ -156,6 +157,7 @@ class FileLegacyAdapter : public File { size_t read(void *buffer, size_t sizeBytes) override; bool seek(unsigned long long offset, int whence = SEEK_SET) override; unsigned long long tell() override; + void reassign_context(PJ_CONTEXT *ctx) override { m_ctx = ctx; } static std::unique_ptr<File> open(PJ_CONTEXT *ctx, const char *filename); }; @@ -286,6 +288,7 @@ class NetworkFile : public File { size_t m_nBlocksToDownload = 1; unsigned long long m_lastDownloadedOffset; unsigned long long m_filesize; + proj_network_close_cbk_type m_closeCbk; NetworkFile(const NetworkFile &) = delete; NetworkFile &operator=(const NetworkFile &) = delete; @@ -296,7 +299,8 @@ class NetworkFile : public File { unsigned long long lastDownloadOffset, unsigned long long filesize) : File(url), m_ctx(ctx), m_url(url), m_handle(handle), - m_lastDownloadedOffset(lastDownloadOffset), m_filesize(filesize) {} + m_lastDownloadedOffset(lastDownloadOffset), m_filesize(filesize), + m_closeCbk(ctx->networking.close) {} public: ~NetworkFile() override; @@ -304,6 +308,7 @@ class NetworkFile : public File { size_t read(void *buffer, size_t sizeBytes) override; bool seek(unsigned long long offset, int whence) override; unsigned long long tell() override; + void reassign_context(PJ_CONTEXT *ctx) override; static std::unique_ptr<File> open(PJ_CONTEXT *ctx, const char *filename); }; @@ -500,6 +505,17 @@ NetworkFile::~NetworkFile() { // --------------------------------------------------------------------------- +void NetworkFile::reassign_context(PJ_CONTEXT *ctx) { + m_ctx = ctx; + if (m_closeCbk != m_ctx->networking.close) { + pj_log(m_ctx, PJ_LOG_ERROR, + "Networking close callback has changed following context " + "reassignment ! This is highly suspicious"); + } +} + +// --------------------------------------------------------------------------- + std::unique_ptr<File> FileManager::open(PJ_CONTEXT *ctx, const char *filename) { #ifndef REMOVE_LEGACY_SUPPORT // If the user has specified a legacy fileapi, use it |
