aboutsummaryrefslogtreecommitdiff
path: root/src
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
parentaa8c7826cf17e650ee2c3a2281aca49db37c4e81 (diff)
downloadPROJ-f085b39752d00a296c288be42dfc69b39b73823f.tar.gz
PROJ-f085b39752d00a296c288be42dfc69b39b73823f.zip
Handle context reassignment for Grid/GridSet/File objects
Diffstat (limited to 'src')
-rw-r--r--src/ctx.cpp4
-rw-r--r--src/filemanager.cpp18
-rw-r--r--src/filemanager.hpp1
-rw-r--r--src/grids.cpp88
-rw-r--r--src/grids.hpp12
-rw-r--r--src/pipeline.cpp4
-rw-r--r--src/proj_internal.h4
-rw-r--r--src/transformations/hgridshift.cpp9
-rw-r--r--src/transformations/vgridshift.cpp10
-rw-r--r--src/transformations/xyzgridshift.cpp10
10 files changed, 152 insertions, 8 deletions
diff --git a/src/ctx.cpp b/src/ctx.cpp
index a7cf8cb3..6172b3c8 100644
--- a/src/ctx.cpp
+++ b/src/ctx.cpp
@@ -61,9 +61,9 @@ void pj_set_ctx( projPJ pj, projCtx ctx )
if (pj==nullptr)
return;
pj->ctx = ctx;
- if( pj->is_pipeline )
+ if( pj->reassign_context )
{
- pj_pipeline_assign_context_to_steps(pj, ctx);
+ pj->reassign_context(pj, ctx);
}
for( const auto &alt: pj->alternativeCoordinateOperations )
{
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
diff --git a/src/filemanager.hpp b/src/filemanager.hpp
index 46391597..972634c2 100644
--- a/src/filemanager.hpp
+++ b/src/filemanager.hpp
@@ -68,6 +68,7 @@ class File {
virtual size_t read(void *buffer, size_t sizeBytes) = 0;
virtual bool seek(unsigned long long offset, int whence = SEEK_SET) = 0;
virtual unsigned long long tell() = 0;
+ virtual void reassign_context(PJ_CONTEXT *ctx) = 0;
const std::string &name() const { return name_; }
};
diff --git a/src/grids.cpp b/src/grids.cpp
index 45e7e8b0..a3d984de 100644
--- a/src/grids.cpp
+++ b/src/grids.cpp
@@ -139,6 +139,7 @@ class NullVerticalShiftGrid : public VerticalShiftGrid {
bool isNullGrid() const override { return true; }
bool valueAt(int, int, float &out) const override;
bool isNodata(float, double) const override { return false; }
+ void reassign_context(PJ_CONTEXT *) override {}
};
// ---------------------------------------------------------------------------
@@ -171,6 +172,11 @@ class GTXVerticalShiftGrid : public VerticalShiftGrid {
static GTXVerticalShiftGrid *open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp,
const std::string &name);
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ m_ctx = ctx;
+ m_fp->reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -412,6 +418,8 @@ class GTiffGrid : public Grid {
std::string metadataItem(const std::string &key, int sample = -1) const;
uint32 subfileType() const { return m_subfileType; }
+
+ void reassign_context(PJ_CONTEXT *ctx) { m_ctx = ctx; }
};
// ---------------------------------------------------------------------------
@@ -738,6 +746,11 @@ class GTiffDataset {
bool openTIFF(const std::string &filename);
std::unique_ptr<GTiffGrid> nextGrid();
+
+ void reassign_context(PJ_CONTEXT *ctx) {
+ m_ctx = ctx;
+ m_fp->reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -1056,6 +1069,11 @@ class GTiffVGridShiftSet : public VerticalShiftGridSet, public GTiffDataset {
static std::unique_ptr<GTiffVGridShiftSet>
open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp,
const std::string &filename);
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ VerticalShiftGridSet::reassign_context(ctx);
+ GTiffDataset::reassign_context(ctx);
+ }
};
#endif // TIFF_ENABLED
@@ -1150,6 +1168,10 @@ class GTiffVGrid : public VerticalShiftGrid {
}
void insertGrid(PJ_CONTEXT *ctx, std::unique_ptr<GTiffVGrid> &&subgrid);
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ m_grid->reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -1374,6 +1396,14 @@ const VerticalShiftGrid *VerticalShiftGridSet::gridAt(double lon,
// ---------------------------------------------------------------------------
+void VerticalShiftGridSet::reassign_context(PJ_CONTEXT *ctx) {
+ for (const auto &grid : m_grids) {
+ grid->reassign_context(ctx);
+ }
+}
+
+// ---------------------------------------------------------------------------
+
HorizontalShiftGrid::HorizontalShiftGrid(const std::string &nameIn, int widthIn,
int heightIn,
const ExtentAndRes &extentIn)
@@ -1402,6 +1432,8 @@ class NullHorizontalShiftGrid : public HorizontalShiftGrid {
bool isNullGrid() const override { return true; }
bool valueAt(int, int, float &lonShift, float &latShift) const override;
+
+ void reassign_context(PJ_CONTEXT *) override {}
};
// ---------------------------------------------------------------------------
@@ -1443,6 +1475,11 @@ class NTv1Grid : public HorizontalShiftGrid {
static NTv1Grid *open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp,
const std::string &filename);
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ m_ctx = ctx;
+ m_fp->reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -1556,6 +1593,11 @@ class CTable2Grid : public HorizontalShiftGrid {
static CTable2Grid *open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp,
const std::string &filename);
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ m_ctx = ctx;
+ m_fp->reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -1654,6 +1696,11 @@ class NTv2GridSet : public HorizontalShiftGridSet {
static std::unique_ptr<NTv2GridSet> open(PJ_CONTEXT *ctx,
std::unique_ptr<File> fp,
const std::string &filename);
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ HorizontalShiftGridSet::reassign_context(ctx);
+ m_fp->reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -1679,6 +1726,11 @@ class NTv2Grid : public HorizontalShiftGrid {
m_mustSwap(mustSwapIn) {}
bool valueAt(int, int, float &lonShift, float &latShift) const override;
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ m_ctx = ctx;
+ m_fp->reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -1857,6 +1909,11 @@ class GTiffHGridShiftSet : public HorizontalShiftGridSet, public GTiffDataset {
static std::unique_ptr<GTiffHGridShiftSet>
open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp,
const std::string &filename);
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ HorizontalShiftGridSet::reassign_context(ctx);
+ GTiffDataset::reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -1884,6 +1941,10 @@ class GTiffHGrid : public HorizontalShiftGrid {
bool valueAt(int x, int y, float &lonShift, float &latShift) const override;
void insertGrid(PJ_CONTEXT *ctx, std::unique_ptr<GTiffHGrid> &&subgrid);
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ m_grid->reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -2235,6 +2296,14 @@ const HorizontalShiftGrid *HorizontalShiftGridSet::gridAt(double lon,
return nullptr;
}
+// ---------------------------------------------------------------------------
+
+void HorizontalShiftGridSet::reassign_context(PJ_CONTEXT *ctx) {
+ for (const auto &grid : m_grids) {
+ grid->reassign_context(ctx);
+ }
+}
+
#ifdef TIFF_ENABLED
// ---------------------------------------------------------------------------
@@ -2250,6 +2319,11 @@ class GTiffGenericGridShiftSet : public GenericShiftGridSet,
static std::unique_ptr<GTiffGenericGridShiftSet>
open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp,
const std::string &filename);
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ GenericShiftGridSet::reassign_context(ctx);
+ GTiffDataset::reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -2287,6 +2361,10 @@ class GTiffGenericGrid : public GenericShiftGrid {
void insertGrid(PJ_CONTEXT *ctx,
std::unique_ptr<GTiffGenericGrid> &&subgrid);
+
+ void reassign_context(PJ_CONTEXT *ctx) override {
+ m_grid->reassign_context(ctx);
+ }
};
// ---------------------------------------------------------------------------
@@ -2356,6 +2434,8 @@ class NullGenericShiftGrid : public GenericShiftGrid {
std::string metadataItem(const std::string &, int) const override {
return std::string();
}
+
+ void reassign_context(PJ_CONTEXT *) override {}
};
// ---------------------------------------------------------------------------
@@ -2516,6 +2596,14 @@ const GenericShiftGrid *GenericShiftGridSet::gridAt(double lon,
// ---------------------------------------------------------------------------
+void GenericShiftGridSet::reassign_context(PJ_CONTEXT *ctx) {
+ for (const auto &grid : m_grids) {
+ grid->reassign_context(ctx);
+ }
+}
+
+// ---------------------------------------------------------------------------
+
ListOfGenericGrids proj_generic_grid_init(PJ *P, const char *gridkey) {
std::string key("s");
key += gridkey;
diff --git a/src/grids.hpp b/src/grids.hpp
index 0f595754..fde3eb3e 100644
--- a/src/grids.hpp
+++ b/src/grids.hpp
@@ -88,6 +88,8 @@ class VerticalShiftGrid : public Grid {
// x = 0 is western-most column, y = 0 is southern-most line
virtual bool valueAt(int x, int y, float &out) const = 0;
+
+ virtual void reassign_context(PJ_CONTEXT *ctx) = 0;
};
// ---------------------------------------------------------------------------
@@ -112,6 +114,8 @@ class VerticalShiftGridSet {
return m_grids;
}
const VerticalShiftGrid *gridAt(double lon, double lat) const;
+
+ virtual void reassign_context(PJ_CONTEXT *ctx);
};
// ---------------------------------------------------------------------------
@@ -130,6 +134,8 @@ class HorizontalShiftGrid : public Grid {
// x = 0 is western-most column, y = 0 is southern-most line
virtual bool valueAt(int x, int y, float &lonShift,
float &latShift) const = 0;
+
+ virtual void reassign_context(PJ_CONTEXT *ctx) = 0;
};
// ---------------------------------------------------------------------------
@@ -154,6 +160,8 @@ class HorizontalShiftGridSet {
return m_grids;
}
const HorizontalShiftGrid *gridAt(double lon, double lat) const;
+
+ virtual void reassign_context(PJ_CONTEXT *ctx);
};
// ---------------------------------------------------------------------------
@@ -181,6 +189,8 @@ class GenericShiftGrid : public Grid {
// x = 0 is western-most column, y = 0 is southern-most line
virtual bool valueAt(int x, int y, int sample, float &out) const = 0;
+
+ virtual void reassign_context(PJ_CONTEXT *ctx) = 0;
};
// ---------------------------------------------------------------------------
@@ -205,6 +215,8 @@ class GenericShiftGridSet {
return m_grids;
}
const GenericShiftGrid *gridAt(double lon, double lat) const;
+
+ virtual void reassign_context(PJ_CONTEXT *ctx);
};
// ---------------------------------------------------------------------------
diff --git a/src/pipeline.cpp b/src/pipeline.cpp
index 96767143..f65dbfa0 100644
--- a/src/pipeline.cpp
+++ b/src/pipeline.cpp
@@ -155,7 +155,7 @@ static PJ_LPZ pipeline_reverse_3d (PJ_XYZ xyz, PJ *P);
static PJ_XY pipeline_forward (PJ_LP lp, PJ *P);
static PJ_LP pipeline_reverse (PJ_XY xy, PJ *P);
-void pj_pipeline_assign_context_to_steps( PJ* P, PJ_CONTEXT* ctx )
+static void pipeline_reassign_context( PJ* P, PJ_CONTEXT* ctx )
{
auto pipeline = static_cast<struct Pipeline*>(P->opaque);
for( auto& step: pipeline->steps )
@@ -413,7 +413,7 @@ PJ *OPERATION(pipeline,0) {
P->fwd = pipeline_forward;
P->inv = pipeline_reverse;
P->destructor = destructor;
- P->is_pipeline = 1;
+ P->reassign_context = pipeline_reassign_context;
/* Currently, the pipeline driver is a raw bit mover, enabling other operations */
/* to collaborate efficiently. All prep/fin stuff is done at the step levels. */
diff --git a/src/proj_internal.h b/src/proj_internal.h
index 27b30954..12ada034 100644
--- a/src/proj_internal.h
+++ b/src/proj_internal.h
@@ -343,6 +343,7 @@ struct PJconsts {
PJ_OPERATOR inv4d = nullptr;
PJ_DESTRUCTOR destructor = nullptr;
+ void (*reassign_context)(PJ*, projCtx_t *) = nullptr;
/*************************************************************************************
@@ -410,7 +411,6 @@ struct PJconsts {
int geoc = 0; /* Geocentric latitude flag */
int is_latlong = 0; /* proj=latlong ... not really a projection at all */
int is_geocent = 0; /* proj=geocent ... not really a projection at all */
- int is_pipeline = 0; /* 1 if PJ represents a pipeline */
int need_ellps = 0; /* 0 for operations that are purely cartesian */
int skip_fwd_prepare = 0;
int skip_fwd_finalize = 0;
@@ -827,8 +827,6 @@ std::string pj_double_quote_string_param_if_needed(const std::string& str);
PJ *pj_create_internal (PJ_CONTEXT *ctx, const char *definition);
PJ *pj_create_argv_internal (PJ_CONTEXT *ctx, int argc, char **argv);
-void pj_pipeline_assign_context_to_steps( PJ* P, PJ_CONTEXT* ctx );
-
// For use by projinfo
bool PROJ_DLL pj_context_is_network_enabled(PJ_CONTEXT* ctx);
diff --git a/src/transformations/hgridshift.cpp b/src/transformations/hgridshift.cpp
index 3b6e366f..24da4dde 100644
--- a/src/transformations/hgridshift.cpp
+++ b/src/transformations/hgridshift.cpp
@@ -111,10 +111,19 @@ static PJ *destructor (PJ *P, int errlev) {
return pj_default_destructor(P, errlev);
}
+static void reassign_context( PJ* P, PJ_CONTEXT* ctx )
+{
+ auto Q = (struct hgridshiftData *) P->opaque;
+ for( auto& grid: Q->grids ) {
+ grid->reassign_context(ctx);
+ }
+}
+
PJ *TRANSFORMATION(hgridshift,0) {
auto Q = new hgridshiftData;
P->opaque = (void *) Q;
P->destructor = destructor;
+ P->reassign_context = reassign_context;
P->fwd4d = forward_4d;
P->inv4d = reverse_4d;
diff --git a/src/transformations/vgridshift.cpp b/src/transformations/vgridshift.cpp
index f35832e1..3e7a015e 100644
--- a/src/transformations/vgridshift.cpp
+++ b/src/transformations/vgridshift.cpp
@@ -142,10 +142,20 @@ static PJ *destructor (PJ *P, int errlev) {
return pj_default_destructor(P, errlev);
}
+static void reassign_context( PJ* P, PJ_CONTEXT* ctx )
+{
+ auto Q = (struct vgridshiftData *) P->opaque;
+ for( auto& grid: Q->grids ) {
+ grid->reassign_context(ctx);
+ }
+}
+
+
PJ *TRANSFORMATION(vgridshift,0) {
auto Q = new vgridshiftData;
P->opaque = (void *) Q;
P->destructor = destructor;
+ P->reassign_context = reassign_context;
if (!pj_param(P->ctx, P->params, "tgrids").i) {
proj_log_error(P, "vgridshift: +grids parameter missing.");
diff --git a/src/transformations/xyzgridshift.cpp b/src/transformations/xyzgridshift.cpp
index f23c2588..734ffc5d 100644
--- a/src/transformations/xyzgridshift.cpp
+++ b/src/transformations/xyzgridshift.cpp
@@ -270,10 +270,20 @@ static PJ *destructor (PJ *P, int errlev) {
return pj_default_destructor(P, errlev);
}
+static void reassign_context( PJ* P, PJ_CONTEXT* ctx )
+{
+ auto Q = (struct xyzgridshiftData *) P->opaque;
+ for( auto& grid: Q->grids ) {
+ grid->reassign_context(ctx);
+ }
+}
+
+
PJ *TRANSFORMATION(xyzgridshift,0) {
auto Q = new xyzgridshiftData;
P->opaque = (void *) Q;
P->destructor = destructor;
+ P->reassign_context = reassign_context;
P->fwd4d = nullptr;
P->inv4d = nullptr;