LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/cad - ogrcaddriver.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 27 48 56.2 %
Date: 2024-05-05 22:37:24 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /*******************************************************************************
       2             :  *  Project: OGR CAD Driver
       3             :  *  Purpose: Implements driver based on libopencad
       4             :  *  Author: Alexandr Borzykh, mush3d at gmail.com
       5             :  *  Author: Dmitry Baryshnikov, polimax@mail.ru
       6             :  *  Language: C++
       7             :  *******************************************************************************
       8             :  *  The MIT License (MIT)
       9             :  *
      10             :  *  Copyright (c) 2016 Alexandr Borzykh
      11             :  *  Copyright (c) 2016, NextGIS
      12             :  *
      13             :  *  Permission is hereby granted, free of charge, to any person obtaining a copy
      14             :  *  of this software and associated documentation files (the "Software"), to
      15             :  *deal in the Software without restriction, including without limitation the
      16             :  *rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
      17             :  *sell copies of the Software, and to permit persons to whom the Software is
      18             :  *  furnished to do so, subject to the following conditions:
      19             :  *
      20             :  *  The above copyright notice and this permission notice shall be included in
      21             :  *all copies or substantial portions of the Software.
      22             :  *
      23             :  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      24             :  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      25             :  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      26             :  *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      27             :  *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      28             :  *FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
      29             :  *IN THE SOFTWARE.
      30             :  *******************************************************************************/
      31             : #include "ogr_cad.h"
      32             : #include "vsilfileio.h"
      33             : #include "ogrcaddrivercore.h"
      34             : 
      35             : /************************************************************************/
      36             : /*                           OGRCADDriverOpen()                         */
      37             : /************************************************************************/
      38             : 
      39           9 : static GDALDataset *OGRCADDriverOpen(GDALOpenInfo *poOpenInfo)
      40             : {
      41           9 :     long nSubRasterLayer = -1;
      42           9 :     long nSubRasterFID = -1;
      43             : 
      44             :     CADFileIO *pFileIO;
      45           9 :     if (STARTS_WITH_CI(poOpenInfo->pszFilename, "CAD:"))
      46             :     {
      47             :         char **papszTokens =
      48           0 :             CSLTokenizeString2(poOpenInfo->pszFilename, ":", 0);
      49           0 :         int nTokens = CSLCount(papszTokens);
      50           0 :         if (nTokens < 4)
      51             :         {
      52           0 :             CSLDestroy(papszTokens);
      53           0 :             return nullptr;
      54             :         }
      55             : 
      56           0 :         CPLString osFilename;
      57           0 :         for (int i = 1; i < nTokens - 2; ++i)
      58             :         {
      59           0 :             if (osFilename.empty())
      60           0 :                 osFilename += ":";
      61           0 :             osFilename += papszTokens[i];
      62             :         }
      63             : 
      64           0 :         pFileIO = new VSILFileIO(osFilename);
      65           0 :         nSubRasterLayer = atol(papszTokens[nTokens - 2]);
      66           0 :         nSubRasterFID = atol(papszTokens[nTokens - 1]);
      67             : 
      68           0 :         CSLDestroy(papszTokens);
      69             :     }
      70             :     else
      71             :     {
      72           9 :         pFileIO = new VSILFileIO(poOpenInfo->pszFilename);
      73             :     }
      74             : 
      75           9 :     if (IdentifyCADFile(pFileIO, false) == FALSE)
      76             :     {
      77           0 :         delete pFileIO;
      78           0 :         return nullptr;
      79             :     }
      80             : 
      81             :     /* -------------------------------------------------------------------- */
      82             :     /*      Confirm the requested access is supported.                      */
      83             :     /* -------------------------------------------------------------------- */
      84           9 :     if (poOpenInfo->eAccess == GA_Update)
      85             :     {
      86           0 :         CPLError(CE_Failure, CPLE_NotSupported,
      87             :                  "The CAD driver does not support update access to existing"
      88             :                  " datasets.\n");
      89           0 :         delete pFileIO;
      90           0 :         return nullptr;
      91             :     }
      92             : 
      93           9 :     GDALCADDataset *poDS = new GDALCADDataset();
      94           9 :     if (!poDS->Open(poOpenInfo, pFileIO, nSubRasterLayer, nSubRasterFID))
      95             :     {
      96           1 :         delete poDS;
      97           1 :         return nullptr;
      98             :     }
      99             :     else
     100           8 :         return poDS;
     101             : }
     102             : 
     103             : /************************************************************************/
     104             : /*                           RegisterOGRCAD()                           */
     105             : /************************************************************************/
     106             : 
     107           6 : void RegisterOGRCAD()
     108             : {
     109           6 :     if (GDALGetDriverByName(DRIVER_NAME) == nullptr)
     110             :     {
     111           6 :         auto poDriver = new GDALDriver();
     112           6 :         OGRCADDriverSetCommonMetadata(poDriver);
     113             : 
     114           6 :         poDriver->pfnOpen = OGRCADDriverOpen;
     115             : 
     116           6 :         GetGDALDriverManager()->RegisterDriver(poDriver);
     117             :     }
     118           6 : }
     119             : 
     120          17 : CPLString CADRecode(const CPLString &sString, int CADEncoding)
     121             : {
     122          17 :     const char *const apszSource[] = {/* 0 UNDEFINED */ "",
     123             :                                       /* 1 ASCII */ "US-ASCII",
     124             :                                       /* 2 8859_1 */ "ISO-8859-1",
     125             :                                       /* 3 8859_2 */ "ISO-8859-2",
     126             :                                       /* 4 UNDEFINED */ "",
     127             :                                       /* 5 8859_4 */ "ISO-8859-4",
     128             :                                       /* 6 8859_5 */ "ISO-8859-5",
     129             :                                       /* 7 8859_6 */ "ISO-8859-6",
     130             :                                       /* 8 8859_7 */ "ISO-8859-7",
     131             :                                       /* 9 8859_8 */ "ISO-8859-8",
     132             :                                       /* 10 8859_9 */ "ISO-8859-9",
     133             :                                       /* 11 DOS437 */ "CP437",
     134             :                                       /* 12 DOS850 */ "CP850",
     135             :                                       /* 13 DOS852 */ "CP852",
     136             :                                       /* 14 DOS855 */ "CP855",
     137             :                                       /* 15 DOS857 */ "CP857",
     138             :                                       /* 16 DOS860 */ "CP860",
     139             :                                       /* 17 DOS861 */ "CP861",
     140             :                                       /* 18 DOS863 */ "CP863",
     141             :                                       /* 19 DOS864 */ "CP864",
     142             :                                       /* 20 DOS865 */ "CP865",
     143             :                                       /* 21 DOS869 */ "CP869",
     144             :                                       /* 22 DOS932 */ "CP932",
     145             :                                       /* 23 MACINTOSH */ "MACINTOSH",
     146             :                                       /* 24 BIG5 */ "BIG5",
     147             :                                       /* 25 KSC5601 */ "CP949",
     148             :                                       /* 26 JOHAB */ "JOHAB",
     149             :                                       /* 27 DOS866 */ "CP866",
     150             :                                       /* 28 ANSI_1250 */ "CP1250",
     151             :                                       /* 29 ANSI_1251 */ "CP1251",
     152             :                                       /* 30 ANSI_1252 */ "CP1252",
     153             :                                       /* 31 GB2312 */ "GB2312",
     154             :                                       /* 32 ANSI_1253 */ "CP1253",
     155             :                                       /* 33 ANSI_1254 */ "CP1254",
     156             :                                       /* 34 ANSI_1255 */ "CP1255",
     157             :                                       /* 35 ANSI_1256 */ "CP1256",
     158             :                                       /* 36 ANSI_1257 */ "CP1257",
     159             :                                       /* 37 ANSI_874 */ "CP874",
     160             :                                       /* 38 ANSI_932 */ "CP932",
     161             :                                       /* 39 ANSI_936 */ "CP936",
     162             :                                       /* 40 ANSI_949 */ "CP949",
     163             :                                       /* 41 ANSI_950 */ "CP950",
     164             :                                       /* 42 ANSI_1361 */ "CP1361",
     165             :                                       /* 43 ANSI_1200 */ "UTF-16",
     166             :                                       /* 44 ANSI_1258 */ "CP1258"};
     167             : 
     168          17 :     if (CADEncoding > 0 &&
     169          17 :         CADEncoding < static_cast<int>(CPL_ARRAYSIZE(apszSource)) &&
     170             :         CADEncoding != 4)
     171             :     {
     172             :         char *pszRecoded =
     173          17 :             CPLRecode(sString, apszSource[CADEncoding], CPL_ENC_UTF8);
     174          34 :         CPLString soRecoded(pszRecoded);
     175          17 :         CPLFree(pszRecoded);
     176          17 :         return soRecoded;
     177             :     }
     178           0 :     CPLError(CE_Failure, CPLE_NotSupported,
     179             :              "CADRecode() function does not support provided CADEncoding.");
     180           0 :     return CPLString("");
     181             : }

Generated by: LCOV version 1.14