Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: SOSI Translator 4 : * Purpose: Implements OGRSOSIDriver. 5 : * Author: Thomas Hirsch, <thomas.hirsch statkart no> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2010, Thomas Hirsch 9 : * Copyright (c) 2010, Even Rouault <even dot rouault at spatialys.com> 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : // Must be included before FYBA headers that mess with min() / max() 15 : #include <mutex> 16 : 17 : #include "ogr_sosi.h" 18 : #include "ogrsosidrivercore.h" 19 : 20 : static int bFYBAInit = FALSE; 21 : static std::mutex oMutex; 22 : 23 : /************************************************************************/ 24 : /* OGRSOSIInit() */ 25 : /************************************************************************/ 26 : 27 3 : static void OGRSOSIInit() 28 : { 29 6 : std::lock_guard<std::mutex> oLock(oMutex); 30 3 : if (!bFYBAInit) 31 : { 32 1 : LC_Init(); /* Init FYBA */ 33 1 : SOSIInitTypes(); 34 1 : bFYBAInit = TRUE; 35 : } 36 3 : } 37 : 38 : /************************************************************************/ 39 : /* OGRSOSIDriverUnload() */ 40 : /************************************************************************/ 41 : 42 5 : static void OGRSOSIDriverUnload(CPL_UNUSED GDALDriver *poDriver) 43 : { 44 : 45 5 : if (bFYBAInit) 46 : { 47 0 : LC_Close(); /* Close FYBA */ 48 0 : SOSICleanupTypes(); 49 0 : bFYBAInit = FALSE; 50 : } 51 5 : } 52 : 53 : /************************************************************************/ 54 : /* Open() */ 55 : /************************************************************************/ 56 : 57 3 : static GDALDataset *OGRSOSIDriverOpen(GDALOpenInfo *poOpenInfo) 58 : { 59 3 : if (OGRSOSIDriverIdentify(poOpenInfo) == FALSE) 60 0 : return nullptr; 61 : 62 3 : OGRSOSIInit(); 63 : 64 3 : OGRSOSIDataSource *poDS = new OGRSOSIDataSource(); 65 3 : if (!poDS->Open(poOpenInfo->pszFilename, 0)) 66 : { 67 0 : delete poDS; 68 0 : return nullptr; 69 : } 70 : 71 3 : return poDS; 72 : } 73 : 74 : #ifdef WRITE_SUPPORT 75 : /************************************************************************/ 76 : /* Create() */ 77 : /************************************************************************/ 78 : 79 : static GDALDataset * 80 : OGRSOSIDriverCreate(const char *pszName, CPL_UNUSED int nBands, 81 : CPL_UNUSED int nXSize, CPL_UNUSED int nYSize, 82 : CPL_UNUSED GDALDataType eDT, CPL_UNUSED char **papszOptions) 83 : { 84 : OGRSOSIInit(); 85 : OGRSOSIDataSource *poDS = new OGRSOSIDataSource(); 86 : if (!poDS->Create(pszName)) 87 : { 88 : delete poDS; 89 : return NULL; 90 : } 91 : return poDS; 92 : } 93 : #endif 94 : 95 : /************************************************************************/ 96 : /* RegisterOGRSOSI() */ 97 : /************************************************************************/ 98 : 99 9 : void RegisterOGRSOSI() 100 : { 101 9 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 102 0 : return; 103 : 104 9 : GDALDriver *poDriver = new GDALDriver(); 105 9 : OGRSOSIDriverSetCommonMetadata(poDriver); 106 9 : poDriver->pfnOpen = OGRSOSIDriverOpen; 107 : #ifdef WRITE_SUPPORT 108 : poDriver->pfnCreate = OGRSOSIDriverCreate; 109 : #endif 110 9 : poDriver->pfnUnloadDriver = OGRSOSIDriverUnload; 111 : 112 9 : GetGDALDriverManager()->RegisterDriver(poDriver); 113 : }