Coverage Report

Created: 2026-08-14 09:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/ogr/ogrsf_frmts/plscenes/ogr_plscenes.h
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  PlanetLabs scene driver
4
 * Purpose:  PLScenes driver interface
5
 * Author:   Even Rouault, even dot rouault at spatialys.com
6
 *
7
 ******************************************************************************
8
 * Copyright (c) 2015, Planet Labs
9
 *
10
 * SPDX-License-Identifier: MIT
11
 ****************************************************************************/
12
13
#ifndef OGR_PLSCENES_H_INCLUDED
14
#define OGR_PLSCENES_H_INCLUDED
15
16
#include "gdal_priv.h"
17
#include "ogrsf_frmts.h"
18
#include "ogr_srs_api.h"
19
#include "cpl_http.h"
20
#include "ogrlibjsonutils.h"
21
#include "ogr_swq.h"
22
#include <map>
23
#include <set>
24
#include <vector>
25
26
class OGRPLScenesDataV1Layer;
27
28
class OGRPLScenesDataV1Dataset final : public GDALDataset
29
{
30
    mutable bool m_bLayerListInitialized;
31
    bool m_bMustCleanPersistent;
32
    CPLString m_osBaseURL;
33
    CPLString m_osAPIKey;
34
    CPLString m_osNextItemTypesPageURL;
35
    CPLString m_osFilter;
36
37
    int m_nLayers;
38
    OGRPLScenesDataV1Layer **m_papoLayers;
39
40
    bool m_bFollowLinks;
41
42
    char **GetBaseHTTPOptions();
43
    OGRLayer *ParseItemType(json_object *poItemType);
44
    bool ParseItemTypes(json_object *poObj, CPLString &osNext);
45
    void EstablishLayerList();
46
    GDALDataset *OpenRasterScene(GDALOpenInfo *poOpenInfo, CPLString osScene,
47
                                 CSLConstList papszOptions);
48
    CPLString InsertAPIKeyInURL(CPLString osURL);
49
50
  public:
51
    OGRPLScenesDataV1Dataset();
52
    ~OGRPLScenesDataV1Dataset() override;
53
54
    int GetLayerCount() const override;
55
56
    using GDALDataset::GetLayer;
57
    const OGRLayer *GetLayer(int idx) const override;
58
    OGRLayer *GetLayerByName(const char *pszName) override;
59
60
    json_object *RunRequest(const char *pszURL, int bQuiet404Error = FALSE,
61
                            const char *pszHTTPVerb = "GET",
62
                            bool bExpectJSonReturn = true,
63
                            const char *pszPostContent = nullptr);
64
65
    bool DoesFollowLinks() const
66
0
    {
67
0
        return m_bFollowLinks;
68
0
    }
69
70
    const CPLString &GetFilter() const
71
0
    {
72
0
        return m_osFilter;
73
0
    }
74
75
    const CPLString &GetBaseURL() const
76
0
    {
77
0
        return m_osBaseURL;
78
0
    }
79
80
    static GDALDataset *Open(GDALOpenInfo *poOpenInfo);
81
};
82
83
class OGRPLScenesDataV1FeatureDefn final : public OGRFeatureDefn
84
{
85
    OGRPLScenesDataV1Layer *m_poLayer;
86
87
  public:
88
    OGRPLScenesDataV1FeatureDefn(OGRPLScenesDataV1Layer *poLayer,
89
                                 const char *pszName)
90
0
        : OGRFeatureDefn(pszName), m_poLayer(poLayer)
91
0
    {
92
0
    }
93
94
    int GetFieldCount() const override;
95
96
    void DropRefToLayer()
97
0
    {
98
0
        m_poLayer = nullptr;
99
0
    }
100
};
101
102
class OGRPLScenesDataV1Layer final : public OGRLayer
103
{
104
    friend class OGRPLScenesDataV1Dataset;
105
    friend class OGRPLScenesDataV1FeatureDefn;
106
107
    OGRPLScenesDataV1Dataset *m_poDS;
108
    bool m_bFeatureDefnEstablished;
109
    OGRPLScenesDataV1FeatureDefn *m_poFeatureDefn;
110
    OGRSpatialReference *m_poSRS;
111
    GIntBig m_nTotalFeatures;
112
    std::map<CPLString, int> m_oMapPrefixedJSonFieldNameToFieldIdx;
113
    std::map<int, CPLString> m_oMapFieldIdxToQueryableJSonFieldName;
114
115
    GIntBig m_nNextFID;
116
    bool m_bEOF;
117
    bool m_bStillInFirstPage;
118
    CPLString m_osNextURL;
119
    CPLString m_osRequestURL;
120
    int m_nPageSize;
121
    bool m_bInFeatureCountOrGetExtent;
122
123
    json_object *m_poPageObj;
124
    json_object *m_poFeatures;
125
    int m_nFeatureIdx;
126
127
    json_object *m_poAttributeFilter;
128
    bool m_bFilterMustBeClientSideEvaluated;
129
130
    std::set<CPLString> m_oSetAssets;
131
    std::set<CPLString> m_oSetUnregisteredAssets;
132
    std::set<CPLString> m_oSetUnregisteredFields;
133
134
    OGRFeature *GetNextRawFeature();
135
    bool
136
    SetFieldFromPrefixedJSonFieldName(OGRFeature *poFeature,
137
                                      const CPLString &osPrefixedJSonFieldName,
138
                                      json_object *poVal);
139
    void EstablishLayerDefn();
140
    void RegisterField(OGRFieldDefn *poFieldDefn,
141
                       const char *pszQueryableJSonName,
142
                       const char *pszPrefixedJSonName);
143
    bool GetNextPage();
144
    json_object *BuildFilter(swq_expr_node *poNode);
145
    bool IsSimpleComparison(const swq_expr_node *poNode);
146
147
  public:
148
    OGRPLScenesDataV1Layer(OGRPLScenesDataV1Dataset *poDS, const char *pszName);
149
    ~OGRPLScenesDataV1Layer() override;
150
151
    void ResetReading() override;
152
    OGRFeature *GetNextFeature() override;
153
    int TestCapability(const char *) const override;
154
    const OGRFeatureDefn *GetLayerDefn() const override;
155
    GIntBig GetFeatureCount(int bForce = FALSE) override;
156
157
    CSLConstList GetMetadata(const char *pszDomain = "") override;
158
    virtual const char *GetMetadataItem(const char *pszName,
159
                                        const char *pszDomain = "") override;
160
161
    OGRErr ISetSpatialFilter(int iGeomField,
162
                             const OGRGeometry *poGeom) override;
163
164
    OGRErr SetAttributeFilter(const char *) override;
165
166
    OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent,
167
                      bool bForce) override;
168
};
169
170
#endif /* ndef OGR_PLSCENES_H_INCLUDED */