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 */