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-05-04 12:52:34 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             :  * Permission is hereby granted, free of charge, to any person obtaining a
      12             :  * copy of this software and associated documentation files (the "Software"),
      13             :  * to deal in the Software without restriction, including without limitation
      14             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      15             :  * and/or sell copies of the Software, and to permit persons to whom the
      16             :  * Software is furnished to do so, subject to the following conditions:
      17             :  *
      18             :  * The above copyright notice and this permission notice shall be included
      19             :  * in all copies or substantial portions of the Software.
      20             :  *
      21             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
      22             :  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      23             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
      24             :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      25             :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      26             :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      27             :  * DEALINGS IN THE SOFTWARE.
      28             :  ****************************************************************************/
      29             : 
      30             : #ifndef OGR_PLSCENES_H_INCLUDED
      31             : #define OGR_PLSCENES_H_INCLUDED
      32             : 
      33             : #include "gdal_priv.h"
      34             : #include "ogrsf_frmts.h"
      35             : #include "ogr_srs_api.h"
      36             : #include "cpl_http.h"
      37             : #include "ogr_geojson.h"
      38             : #include "ogrgeojsonreader.h"
      39             : #include "ogr_swq.h"
      40             : #include <map>
      41             : #include <set>
      42             : #include <vector>
      43             : 
      44             : class OGRPLScenesDataV1Layer;
      45             : 
      46             : class OGRPLScenesDataV1Dataset final : public GDALDataset
      47             : {
      48             :     bool m_bLayerListInitialized;
      49             :     bool m_bMustCleanPersistent;
      50             :     CPLString m_osBaseURL;
      51             :     CPLString m_osAPIKey;
      52             :     CPLString m_osNextItemTypesPageURL;
      53             :     CPLString m_osFilter;
      54             : 
      55             :     int m_nLayers;
      56             :     OGRPLScenesDataV1Layer **m_papoLayers;
      57             : 
      58             :     bool m_bFollowLinks;
      59             : 
      60             :     char **GetBaseHTTPOptions();
      61             :     OGRLayer *ParseItemType(json_object *poItemType);
      62             :     bool ParseItemTypes(json_object *poObj, CPLString &osNext);
      63             :     void EstablishLayerList();
      64             :     GDALDataset *OpenRasterScene(GDALOpenInfo *poOpenInfo, CPLString osScene,
      65             :                                  char **papszOptions);
      66             :     CPLString InsertAPIKeyInURL(CPLString osURL);
      67             : 
      68             :   public:
      69             :     OGRPLScenesDataV1Dataset();
      70             :     virtual ~OGRPLScenesDataV1Dataset();
      71             : 
      72             :     virtual int GetLayerCount() override;
      73             :     virtual OGRLayer *GetLayer(int idx) override;
      74             :     virtual OGRLayer *GetLayerByName(const char *pszName) override;
      75             : 
      76             :     json_object *RunRequest(const char *pszURL, int bQuiet404Error = FALSE,
      77             :                             const char *pszHTTPVerb = "GET",
      78             :                             bool bExpectJSonReturn = true,
      79             :                             const char *pszPostContent = nullptr);
      80             : 
      81          21 :     bool DoesFollowLinks() const
      82             :     {
      83          21 :         return m_bFollowLinks;
      84             :     }
      85             : 
      86          18 :     const CPLString &GetFilter() const
      87             :     {
      88          18 :         return m_osFilter;
      89             :     }
      90             : 
      91          58 :     const CPLString &GetBaseURL() const
      92             :     {
      93          58 :         return m_osBaseURL;
      94             :     }
      95             : 
      96             :     static GDALDataset *Open(GDALOpenInfo *poOpenInfo);
      97             : };
      98             : 
      99             : class OGRPLScenesDataV1FeatureDefn final : public OGRFeatureDefn
     100             : {
     101             :     OGRPLScenesDataV1Layer *m_poLayer;
     102             : 
     103             :   public:
     104          12 :     OGRPLScenesDataV1FeatureDefn(OGRPLScenesDataV1Layer *poLayer,
     105             :                                  const char *pszName)
     106          12 :         : OGRFeatureDefn(pszName), m_poLayer(poLayer)
     107             :     {
     108          12 :     }
     109             : 
     110          24 :     ~OGRPLScenesDataV1FeatureDefn()
     111          12 :     {
     112          24 :     }
     113             : 
     114             :     virtual int GetFieldCount() const override;
     115             : 
     116          12 :     void DropRefToLayer()
     117             :     {
     118          12 :         m_poLayer = nullptr;
     119          12 :     }
     120             : };
     121             : 
     122             : class OGRPLScenesDataV1Layer final : public OGRLayer
     123             : {
     124             :     friend class OGRPLScenesDataV1Dataset;
     125             :     friend class OGRPLScenesDataV1FeatureDefn;
     126             : 
     127             :     OGRPLScenesDataV1Dataset *m_poDS;
     128             :     bool m_bFeatureDefnEstablished;
     129             :     OGRPLScenesDataV1FeatureDefn *m_poFeatureDefn;
     130             :     OGRSpatialReference *m_poSRS;
     131             :     GIntBig m_nTotalFeatures;
     132             :     std::map<CPLString, int> m_oMapPrefixedJSonFieldNameToFieldIdx;
     133             :     std::map<int, CPLString> m_oMapFieldIdxToQueryableJSonFieldName;
     134             : 
     135             :     GIntBig m_nNextFID;
     136             :     bool m_bEOF;
     137             :     bool m_bStillInFirstPage;
     138             :     CPLString m_osNextURL;
     139             :     CPLString m_osRequestURL;
     140             :     int m_nPageSize;
     141             :     bool m_bInFeatureCountOrGetExtent;
     142             : 
     143             :     json_object *m_poPageObj;
     144             :     json_object *m_poFeatures;
     145             :     int m_nFeatureIdx;
     146             : 
     147             :     json_object *m_poAttributeFilter;
     148             :     bool m_bFilterMustBeClientSideEvaluated;
     149             : 
     150             :     std::set<CPLString> m_oSetAssets;
     151             :     std::set<CPLString> m_oSetUnregisteredAssets;
     152             :     std::set<CPLString> m_oSetUnregisteredFields;
     153             : 
     154             :     OGRFeature *GetNextRawFeature();
     155             :     bool
     156             :     SetFieldFromPrefixedJSonFieldName(OGRFeature *poFeature,
     157             :                                       const CPLString &osPrefixedJSonFieldName,
     158             :                                       json_object *poVal);
     159             :     void EstablishLayerDefn();
     160             :     void RegisterField(OGRFieldDefn *poFieldDefn,
     161             :                        const char *pszQueryableJSonName,
     162             :                        const char *pszPrefixedJSonName);
     163             :     bool GetNextPage();
     164             :     json_object *BuildFilter(swq_expr_node *poNode);
     165             :     bool IsSimpleComparison(const swq_expr_node *poNode);
     166             : 
     167             :   public:
     168             :     OGRPLScenesDataV1Layer(OGRPLScenesDataV1Dataset *poDS, const char *pszName);
     169             :     virtual ~OGRPLScenesDataV1Layer();
     170             : 
     171             :     virtual void ResetReading() override;
     172             :     virtual OGRFeature *GetNextFeature() override;
     173             :     virtual int TestCapability(const char *) override;
     174             :     virtual OGRFeatureDefn *GetLayerDefn() override;
     175             :     virtual GIntBig GetFeatureCount(int bForce = FALSE) override;
     176             : 
     177             :     virtual char **GetMetadata(const char *pszDomain = "") override;
     178             :     virtual const char *GetMetadataItem(const char *pszName,
     179             :                                         const char *pszDomain = "") override;
     180             : 
     181             :     virtual void SetSpatialFilter(OGRGeometry *poGeom) override;
     182             : 
     183           1 :     virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override
     184             :     {
     185           1 :         OGRLayer::SetSpatialFilter(iGeomField, poGeom);
     186           1 :     }
     187             : 
     188             :     virtual OGRErr SetAttributeFilter(const char *) override;
     189             : 
     190             :     virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override;
     191             : 
     192           1 :     virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
     193             :                              int bForce) override
     194             :     {
     195           1 :         return OGRLayer::GetExtent(iGeomField, psExtent, bForce);
     196             :     }
     197             : };
     198             : 
     199             : #endif /* ndef OGR_PLSCENES_H_INCLUDED */

Generated by: LCOV version 1.14