Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: SDTS Translator 4 : * Purpose: Implementation of SDTSAttrReader class. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 1999, Frank Warmerdam 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "sdts_al.h" 14 : 15 : /************************************************************************/ 16 : /* ==================================================================== */ 17 : /* SDTSAttrRecord */ 18 : /* ==================================================================== */ 19 : /************************************************************************/ 20 : 21 : /************************************************************************/ 22 : /* SDTSAttrRecord() */ 23 : /************************************************************************/ 24 : 25 353 : SDTSAttrRecord::SDTSAttrRecord() : poWholeRecord(nullptr), poATTR(nullptr) 26 : { 27 353 : } 28 : 29 : /************************************************************************/ 30 : /* ~SDTSAttrRecord() */ 31 : /************************************************************************/ 32 : 33 706 : SDTSAttrRecord::~SDTSAttrRecord() 34 : 35 : { 36 353 : if (poWholeRecord != nullptr) 37 353 : delete poWholeRecord; 38 706 : } 39 : 40 : /************************************************************************/ 41 : /* Dump() */ 42 : /************************************************************************/ 43 : 44 0 : void SDTSAttrRecord::Dump(FILE *fp) 45 : 46 : { 47 0 : if (poATTR != nullptr) 48 0 : poATTR->Dump(fp); 49 0 : } 50 : 51 : /************************************************************************/ 52 : /* ==================================================================== */ 53 : /* SDTSAttrReader */ 54 : /* */ 55 : /* This is the class used to read a primary attribute module. */ 56 : /* ==================================================================== */ 57 : /************************************************************************/ 58 : 59 : /************************************************************************/ 60 : /* SDTSAttrReader() */ 61 : /************************************************************************/ 62 : 63 3 : SDTSAttrReader::SDTSAttrReader() : bIsSecondary(FALSE) 64 : { 65 3 : } 66 : 67 : /************************************************************************/ 68 : /* ~SDTSAttrReader() */ 69 : /************************************************************************/ 70 : 71 6 : SDTSAttrReader::~SDTSAttrReader() 72 : { 73 3 : Close(); 74 6 : } 75 : 76 : /************************************************************************/ 77 : /* Close() */ 78 : /************************************************************************/ 79 : 80 3 : void SDTSAttrReader::Close() 81 : 82 : { 83 3 : ClearIndex(); 84 3 : oDDFModule.Close(); 85 3 : } 86 : 87 : /************************************************************************/ 88 : /* Open() */ 89 : /* */ 90 : /* Open the requested attr file, and prepare to start reading */ 91 : /* data records. */ 92 : /************************************************************************/ 93 : 94 3 : int SDTSAttrReader::Open(const char *pszFilename) 95 : 96 : { 97 3 : bool bSuccess = CPL_TO_BOOL(oDDFModule.Open(pszFilename)); 98 : 99 3 : if (bSuccess) 100 3 : bIsSecondary = (oDDFModule.FindFieldDefn("ATTS") != nullptr); 101 : 102 3 : return bSuccess; 103 : } 104 : 105 : /************************************************************************/ 106 : /* GetNextRecord() */ 107 : /************************************************************************/ 108 : 109 357 : DDFField *SDTSAttrReader::GetNextRecord(SDTSModId *poModId, 110 : DDFRecord **ppoRecord, int bDuplicate) 111 : 112 : { 113 : /* -------------------------------------------------------------------- */ 114 : /* Fetch a record. */ 115 : /* -------------------------------------------------------------------- */ 116 357 : if (ppoRecord != nullptr) 117 357 : *ppoRecord = nullptr; 118 : 119 357 : if (oDDFModule.GetFP() == nullptr) 120 0 : return nullptr; 121 : 122 357 : DDFRecord *poRecord = oDDFModule.ReadRecord(); 123 : 124 357 : if (poRecord == nullptr) 125 4 : return nullptr; 126 : 127 : /* -------------------------------------------------------------------- */ 128 : /* Make a copy of the record for persistent use if requested by */ 129 : /* the caller. */ 130 : /* -------------------------------------------------------------------- */ 131 353 : if (bDuplicate) 132 353 : poRecord = poRecord->Clone(); 133 : 134 : /* -------------------------------------------------------------------- */ 135 : /* Find the ATTP field. */ 136 : /* -------------------------------------------------------------------- */ 137 353 : DDFField *poATTP = poRecord->FindField("ATTP", 0); 138 353 : if (poATTP == nullptr) 139 : { 140 0 : poATTP = poRecord->FindField("ATTS", 0); 141 : } 142 : 143 353 : if (poATTP == nullptr) 144 0 : return nullptr; 145 : 146 : /* -------------------------------------------------------------------- */ 147 : /* Update the module ID if required. */ 148 : /* -------------------------------------------------------------------- */ 149 353 : if (poModId != nullptr) 150 : { 151 353 : DDFField *poATPR = poRecord->FindField("ATPR"); 152 : 153 353 : if (poATPR == nullptr) 154 0 : poATPR = poRecord->FindField("ATSC"); 155 : 156 353 : if (poATPR != nullptr) 157 353 : poModId->Set(poATPR); 158 : } 159 : 160 : /* -------------------------------------------------------------------- */ 161 : /* return proper answer. */ 162 : /* -------------------------------------------------------------------- */ 163 353 : if (ppoRecord != nullptr) 164 353 : *ppoRecord = poRecord; 165 : 166 353 : return poATTP; 167 : } 168 : 169 : /************************************************************************/ 170 : /* GetNextAttrRecord() */ 171 : /************************************************************************/ 172 : 173 357 : SDTSAttrRecord *SDTSAttrReader::GetNextAttrRecord() 174 : 175 : { 176 357 : SDTSModId oModId; 177 357 : DDFRecord *poRawRecord = nullptr; 178 : 179 357 : DDFField *poATTRField = GetNextRecord(&oModId, &poRawRecord, TRUE); 180 : 181 357 : if (poATTRField == nullptr) 182 4 : return nullptr; 183 : 184 353 : SDTSAttrRecord *poAttrRecord = new SDTSAttrRecord(); 185 : 186 353 : poAttrRecord->poWholeRecord = poRawRecord; 187 353 : poAttrRecord->poATTR = poATTRField; 188 353 : memcpy(&(poAttrRecord->oModId), &oModId, sizeof(SDTSModId)); 189 : 190 353 : return poAttrRecord; 191 : }