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 | |
| parent | aa8c7826cf17e650ee2c3a2281aca49db37c4e81 (diff) | |
| download | PROJ-f085b39752d00a296c288be42dfc69b39b73823f.tar.gz PROJ-f085b39752d00a296c288be42dfc69b39b73823f.zip | |
Handle context reassignment for Grid/GridSet/File objects
Diffstat (limited to 'src')
| -rw-r--r-- | src/ctx.cpp | 4 | ||||
| -rw-r--r-- | src/filemanager.cpp | 18 | ||||
| -rw-r--r-- | src/filemanager.hpp | 1 | ||||
| -rw-r--r-- | src/grids.cpp | 88 | ||||
| -rw-r--r-- | src/grids.hpp | 12 | ||||
| -rw-r--r-- | src/pipeline.cpp | 4 | ||||
| -rw-r--r-- | src/proj_internal.h | 4 | ||||
| -rw-r--r-- | src/transformations/hgridshift.cpp | 9 | ||||
| -rw-r--r-- | src/transformations/vgridshift.cpp | 10 | ||||
| -rw-r--r-- | src/transformations/xyzgridshift.cpp | 10 |
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; |
