LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/plscenes - ogr_plscenes.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 20 20 100.0 %
Date: 2025-01-18 12:42:00 Functions: 9 9 100.0 %

          Line data    Source code
       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             :     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             :                                  char **papszOptions);
      48             :     CPLString InsertAPIKeyInURL(CPLString osURL);
      49             : 
      50             :   public:
      51             :     OGRPLScenesDataV1Dataset();
      52             :     virtual ~OGRPLScenesDataV1Dataset();
      53             : 
      54             :     virtual int GetLayerCount() override;
      55             :     virtual OGRLayer *GetLayer(int idx) override;
      56             :     virtual OGRLayer *GetLayerByName(const char *pszName) override;
      57             : 
      58             :     json_object *RunRequest(const char *pszURL, int bQuiet404Error = FALSE,
      59             :                             const char *pszHTTPVerb = "GET",
      60             :                             bool bExpectJSonReturn = true,
      61             :                             const char *pszPostContent = nullptr);
      62             : 
      63          21 :     bool DoesFollowLinks() const
      64             :     {
      65          21 :         return m_bFollowLinks;
      66             :     }
      67             : 
      68          18 :     const CPLString &GetFilter() const
      69             :     {
      70          18 :         return m_osFilter;
      71             :     }
      72             : 
      73          58 :     const CPLString &GetBaseURL() const
      74             :     {
      75          58 :         return m_osBaseURL;
      76             :     }
      77             : 
      78             :     static GDALDataset *Open(GDALOpenInfo *poOpenInfo);
      79             : };
      80             : 
      81             : class OGRPLScenesDataV1FeatureDefn final : public OGRFeatureDefn
      82             : {
      83             :     OGRPLScenesDataV1Layer *m_poLayer;
      84             : 
      85             :   public:
      86          12 :     OGRPLScenesDataV1FeatureDefn(OGRPLScenesDataV1Layer *poLayer,
      87             :                                  const char *pszName)
      88          12 :         : OGRFeatureDefn(pszName), m_poLayer(poLayer)
      89             :     {
      90          12 :     }
      91             : 
      92          24 :     ~OGRPLScenesDataV1FeatureDefn()
      93          12 :     {
      94          24 :     }
      95             : 
      96             :     virtual int GetFieldCount() const override;
      97             : 
      98          12 :     void DropRefToLayer()
      99             :     {
     100          12 :         m_poLayer = nullptr;
     101          12 :     }
     102             : };
     103             : 
     104             : class OGRPLScenesDataV1Layer final : public OGRLayer
     105             : {
     106             :     friend class OGRPLScenesDataV1Dataset;
     107             :     friend class OGRPLScenesDataV1FeatureDefn;
     108             : 
     109             :     OGRPLScenesDataV1Dataset *m_poDS;
     110             :     bool m_bFeatureDefnEstablished;
     111             :     OGRPLScenesDataV1FeatureDefn *m_poFeatureDefn;
     112             :     OGRSpatialReference *m_poSRS;
     113             :     GIntBig m_nTotalFeatures;
     114             :     std::map<CPLString, int> m_oMapPrefixedJSonFieldNameToFieldIdx;
     115             :     std::map<int, CPLString> m_oMapFieldIdxToQueryableJSonFieldName;
     116             : 
     117             :     GIntBig m_nNextFID;
     118             :     bool m_bEOF;
     119             :     bool m_bStillInFirstPage;
     120             :     CPLString m_osNextURL;
     121             :     CPLString m_osRequestURL;
     122             :     int m_nPageSize;
     123             :     bool m_bInFeatureCountOrGetExtent;
     124             : 
     125             :     json_object *m_poPageObj;
     126             :     json_object *m_poFeatures;
     127             :     int m_nFeatureIdx;
     128             : 
     129             :     json_object *m_poAttributeFilter;
     130             :     bool m_bFilterMustBeClientSideEvaluated;
     131             : 
     132             :     std::set<CPLString> m_oSetAssets;
     133             :     std::set<CPLString> m_oSetUnregisteredAssets;
     134             :     std::set<CPLString> m_oSetUnregisteredFields;
     135             : 
     136             :     OGRFeature *GetNextRawFeature();
     137             :     bool
     138             :     SetFieldFromPrefixedJSonFieldName(OGRFeature *poFeature,
     139             :                                       const CPLString &osPrefixedJSonFieldName,
     140             :                                       json_object *poVal);
     141             :     void EstablishLayerDefn();
     142             :     void RegisterField(OGRFieldDefn *poFieldDefn,
     143             :                        const char *pszQueryableJSonName,
     144             :                        const char *pszPrefixedJSonName);
     145             :     bool GetNextPage();
     146             :     json_object *BuildFilter(swq_expr_node *poNode);
     147             :     bool IsSimpleComparison(const swq_expr_node *poNode);
     148             : 
     149             :   public:
     150             :     OGRPLScenesDataV1Layer(OGRPLScenesDataV1Dataset *poDS, const char *pszName);
     151             :     virtual ~OGRPLScenesDataV1Layer();
     152             : 
     153             :     virtual void ResetReading() override;
     154             :     virtual OGRFeature *GetNextFeature() override;
     155             :     virtual int TestCapability(const char *) override;
     156             :     virtual OGRFeatureDefn *GetLayerDefn() override;
     157             :     virtual GIntBig GetFeatureCount(int bForce = FALSE) override;
     158             : 
     159             :     virtual char **GetMetadata(const char *pszDomain = "") override;
     160             :     virtual const char *GetMetadataItem(const char *pszName,
     161             :                                         const char *pszDomain = "") override;
     162             : 
     163             :     virtual void SetSpatialFilter(OGRGeometry *poGeom) override;
     164             : 
     165           1 :     virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override
     166             :     {
     167           1 :         OGRLayer::SetSpatialFilter(iGeomField, poGeom);
     168           1 :     }
     169             : 
     170             :     virtual OGRErr SetAttributeFilter(const char *) override;
     171             : 
     172             :     virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override;
     173             : 
     174           1 :     virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
     175             :                              int bForce) override
     176             :     {
     177           1 :         return OGRLayer::GetExtent(iGeomField, psExtent, bForce);
     178             :     }
     179             : };
     180             : 
     181             : #endif /* ndef OGR_PLSCENES_H_INCLUDED */

Generated by: LCOV version 1.14