LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/miramon - ogrmiramon.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 5 5 100.0 %
Date: 2025-09-17 18:03:44 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  OpenGIS Simple Features Reference Implementation
       4             :  * Purpose:  C++ classes for the MiraMon driver
       5             :  * Author:   Abel Pau
       6             :  ******************************************************************************
       7             :  * Copyright (c) 2024, Xavier Pons
       8             :  *
       9             :  * SPDX-License-Identifier: MIT
      10             :  ****************************************************************************/
      11             : 
      12             : #ifndef OGRMIRAMON_H_INCLUDED
      13             : #define OGRMIRAMON_H_INCLUDED
      14             : 
      15             : #include "ogrsf_frmts.h"
      16             : #include "ogr_api.h"
      17             : #include "cpl_string.h"
      18             : #include "mm_wrlayr.h"
      19             : 
      20             : /************************************************************************/
      21             : /*                             OGRMiraMonLayer                          */
      22             : /************************************************************************/
      23             : 
      24             : class OGRMiraMonLayer final
      25             :     : public OGRLayer,
      26             :       public OGRGetNextFeatureThroughRaw<OGRMiraMonLayer>
      27             : {
      28             :     OGRMiraMonLayer(const OGRMiraMonLayer &) = delete;
      29             :     OGRMiraMonLayer &operator=(const OGRMiraMonLayer &) = delete;
      30             : 
      31             :     GDALDataset *m_poDS;
      32             :     OGRSpatialReference *m_poSRS;
      33             :     OGRFeatureDefn *m_poFeatureDefn;
      34             : 
      35             :     GUIntBig m_iNextFID;
      36             : 
      37             :     // Pointer to one of three possible MiraMon layers: points,
      38             :     // arcs or polygons. Every time a feature is read this pointer
      39             :     // points to the appropriate layer
      40             :     struct MiraMonVectLayerInfo *phMiraMonLayer;
      41             : 
      42             :     // When writing a layer
      43             :     struct MiraMonVectLayerInfo hMiraMonLayerPNT;  // MiraMon points layer
      44             :     struct MiraMonVectLayerInfo hMiraMonLayerARC;  // MiraMon arcs layer
      45             :     struct MiraMonVectLayerInfo hMiraMonLayerPOL;  // MiraMon polygons layer
      46             : 
      47             :     // When reading a layer or the result of writing is only a DBF
      48             :     struct MiraMonVectLayerInfo hMiraMonLayerReadOrNonGeom;
      49             : 
      50             :     struct MiraMonFeature hMMFeature;  // Feature reading/writing
      51             : 
      52             :     bool m_bUpdate;
      53             : 
      54             :     VSILFILE *m_fp = nullptr;
      55             : 
      56             :     // Array of doubles used in the field features processing
      57             :     double *padfValues = nullptr;
      58             :     GInt64 *pnInt64Values = nullptr;
      59             : 
      60             :     OGRFeature *GetNextRawFeature();
      61             :     OGRFeature *GetFeature(GIntBig nFeatureId) override;
      62             :     void GoToFieldOfMultipleRecord(MM_INTERNAL_FID iFID,
      63             :                                    MM_EXT_DBF_N_RECORDS nIRecord,
      64             :                                    MM_EXT_DBF_N_FIELDS nIField);
      65             : 
      66             :     OGRErr MMDumpVertices(OGRGeometryH hGeom, MM_BOOLEAN bExternalRing,
      67             :                           MM_BOOLEAN bUseVFG);
      68             :     OGRErr MMProcessGeometry(OGRGeometryH poGeom, OGRFeature *poFeature,
      69             :                              MM_BOOLEAN bcalculateRecord);
      70             :     OGRErr MMProcessMultiGeometry(OGRGeometryH hGeom, OGRFeature *poFeature);
      71             :     OGRErr MMLoadGeometry(OGRGeometryH hGeom);
      72             :     OGRErr MMWriteGeometry();
      73             :     GIntBig GetFeatureCount(int bForce) override;
      74             : 
      75             :   public:
      76             :     bool bValidFile;
      77             : 
      78             :     OGRMiraMonLayer(GDALDataset *poDS, const char *pszFilename, VSILFILE *fp,
      79             :                     const OGRSpatialReference *poSRS, int bUpdate,
      80             :                     CSLConstList papszOpenOptions,
      81             :                     struct MiraMonVectMapInfo *MMMap);
      82             :     ~OGRMiraMonLayer() override;
      83             : 
      84             :     void ResetReading() override;
      85        1372 :     DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGRMiraMonLayer)
      86             : 
      87             :     OGRErr TranslateFieldsToMM();
      88             :     OGRErr TranslateFieldsValuesToMM(OGRFeature *poFeature);
      89             :     static int MM_SprintfDoubleSignifFigures(char *szChain, size_t size_szChain,
      90             :                                              int nSignifFigures,
      91             :                                              double dfRealValue);
      92             :     OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent,
      93             :                       bool bForce) override;
      94             : 
      95             :     const OGRFeatureDefn *GetLayerDefn() const override;
      96             : 
      97             :     OGRErr ICreateFeature(OGRFeature *poFeature) override;
      98             : 
      99             :     virtual OGRErr CreateField(const OGRFieldDefn *poField,
     100             :                                int bApproxOK = TRUE) override;
     101             : 
     102             :     int TestCapability(const char *) const override;
     103             :     void AddToFileList(CPLStringList &oFileList);
     104             : 
     105          16 :     GDALDataset *GetDataset() override
     106             :     {
     107          16 :         return m_poDS;
     108             :     }
     109             : };
     110             : 
     111             : /************************************************************************/
     112             : /*                           OGRMiraMonDataSource                       */
     113             : /************************************************************************/
     114             : 
     115             : class OGRMiraMonDataSource final : public GDALDataset
     116             : {
     117             :     std::vector<std::unique_ptr<OGRMiraMonLayer>> m_apoLayers = {};
     118             :     std::string m_osRootName{};
     119             :     bool m_bUpdate = false;
     120             :     struct MiraMonVectMapInfo m_MMMap = {};
     121             : 
     122             :   public:
     123             :     OGRMiraMonDataSource();
     124             :     OGRMiraMonDataSource(const OGRMiraMonDataSource &) = delete;
     125             :     OGRMiraMonDataSource &operator=(const OGRMiraMonDataSource &) = delete;
     126             : 
     127             :     ~OGRMiraMonDataSource() override;
     128             : 
     129             :     bool Open(const char *pszFilename, VSILFILE *fp,
     130             :               const OGRSpatialReference *poSRS, CSLConstList papszOpenOptions);
     131             :     bool Create(const char *pszFilename, CSLConstList papszOptions);
     132             : 
     133         409 :     int GetLayerCount() const override
     134             :     {
     135         409 :         return static_cast<int>(m_apoLayers.size());
     136             :     }
     137             : 
     138             :     const OGRLayer *GetLayer(int) const override;
     139             :     char **GetFileList() override;
     140             : 
     141             :     OGRLayer *ICreateLayer(const char *pszLayerName,
     142             :                            const OGRGeomFieldDefn *poGeomFieldDefn,
     143             :                            CSLConstList papszOptions) override;
     144             : 
     145             :     int TestCapability(const char *) const override;
     146             : };
     147             : 
     148             : #endif /* OGRMIRAMON_H_INCLUDED */

Generated by: LCOV version 1.14