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: 2024-11-21 22:18:42 Functions: 9 9 100.0 %

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

Generated by: LCOV version 1.14