aboutsummaryrefslogtreecommitdiff
path: root/src/filemanager.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-12-27 12:25:03 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-12-27 12:25:03 +0100
commitf085b39752d00a296c288be42dfc69b39b73823f (patch)
treef988a9d279865b2e17fd52da5162eadb1bb37c09 /src/filemanager.cpp
parentaa8c7826cf17e650ee2c3a2281aca49db37c4e81 (diff)
downloadPROJ-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.cpp18
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