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 : 32 : #include "ogrsf_frmts.h" 33 : 34 : #include "ogrcaddrivercore.h" 35 : 36 : /************************************************************************/ 37 : /* OGRCADDriverIdentify() */ 38 : /************************************************************************/ 39 : 40 49402 : static int OGRCADDriverIdentify(GDALOpenInfo *poOpenInfo) 41 : 42 : { 43 : #if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) 44 49402 : if (!EQUAL(CPLGetExtension(poOpenInfo->pszFilename), "DWG")) 45 49391 : return FALSE; 46 : #endif 47 20 : return poOpenInfo->nHeaderBytes >= 6 && poOpenInfo->pabyHeader[0] == 'A' && 48 20 : poOpenInfo->pabyHeader[1] == 'C'; 49 : } 50 : 51 : /************************************************************************/ 52 : /* OGRCADDriverSetCommonMetadata() */ 53 : /************************************************************************/ 54 : 55 1225 : void OGRCADDriverSetCommonMetadata(GDALDriver *poDriver) 56 : { 57 1225 : poDriver->SetDescription(DRIVER_NAME); 58 1225 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 59 1225 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); 60 1225 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_LAYER, "YES"); 61 1225 : poDriver->SetMetadataItem(GDAL_DCAP_DELETE_LAYER, "YES"); 62 1225 : poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES"); 63 1225 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "AutoCAD Driver"); 64 1225 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "dwg"); 65 1225 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/cad.html"); 66 1225 : poDriver->SetMetadataItem(GDAL_DCAP_MULTIPLE_VECTOR_LAYERS, "YES"); 67 1225 : poDriver->SetMetadataItem(GDAL_DCAP_CURVE_GEOMETRIES, "YES"); 68 1225 : poDriver->SetMetadataItem(GDAL_DCAP_MEASURED_GEOMETRIES, "YES"); 69 1225 : poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); 70 1225 : poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); 71 : 72 1225 : poDriver->SetMetadataItem( 73 : GDAL_DMD_OPENOPTIONLIST, 74 : "<OpenOptionList>" 75 : " <Option name='MODE' type='string' description='Open mode. " 76 : "READ_ALL - read all data (slow), READ_FAST - read main data " 77 : "(fast), READ_FASTEST - read less data' default='READ_FAST'/>" 78 : " <Option name='ADD_UNSUPPORTED_GEOMETRIES_DATA' type='string' " 79 : "description='Add unsupported geometries data (color, attributes) " 80 : "to the layer (YES/NO). They will have no geometrical " 81 : "representation.' default='NO'/>" 82 1225 : "</OpenOptionList>"); 83 : 84 1225 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 85 1225 : poDriver->SetMetadataItem(GDAL_DCAP_FEATURE_STYLES, "YES"); 86 1225 : poDriver->SetMetadataItem(GDAL_DCAP_FEATURE_STYLES_READ, "YES"); 87 : 88 1225 : poDriver->pfnIdentify = OGRCADDriverIdentify; 89 1225 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 90 1225 : } 91 : 92 : /************************************************************************/ 93 : /* DeclareDeferredOGRCADPlugin() */ 94 : /************************************************************************/ 95 : 96 : #ifdef PLUGIN_FILENAME 97 1520 : void DeclareDeferredOGRCADPlugin() 98 : { 99 1520 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 100 : { 101 301 : return; 102 : } 103 1219 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 104 : #ifdef PLUGIN_INSTALLATION_MESSAGE 105 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 106 : PLUGIN_INSTALLATION_MESSAGE); 107 : #endif 108 1219 : OGRCADDriverSetCommonMetadata(poDriver); 109 1219 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 110 : } 111 : #endif