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 : * SPDX-License-Identifier: MIT
14 : *******************************************************************************/
15 : #include "ogr_cad.h"
16 : #include "vsilfileio.h"
17 : #include "ogrcaddrivercore.h"
18 :
19 : /************************************************************************/
20 : /* OGRCADDriverOpen() */
21 : /************************************************************************/
22 :
23 9 : static GDALDataset *OGRCADDriverOpen(GDALOpenInfo *poOpenInfo)
24 : {
25 9 : long nSubRasterLayer = -1;
26 9 : long nSubRasterFID = -1;
27 :
28 : CADFileIO *pFileIO;
29 9 : if (STARTS_WITH_CI(poOpenInfo->pszFilename, "CAD:"))
30 : {
31 : char **papszTokens =
32 0 : CSLTokenizeString2(poOpenInfo->pszFilename, ":", 0);
33 0 : int nTokens = CSLCount(papszTokens);
34 0 : if (nTokens < 4)
35 : {
36 0 : CSLDestroy(papszTokens);
37 0 : return nullptr;
38 : }
39 :
40 0 : CPLString osFilename;
41 0 : for (int i = 1; i < nTokens - 2; ++i)
42 : {
43 0 : if (osFilename.empty())
44 0 : osFilename += ":";
45 0 : osFilename += papszTokens[i];
46 : }
47 :
48 0 : pFileIO = new VSILFileIO(osFilename);
49 0 : nSubRasterLayer = atol(papszTokens[nTokens - 2]);
50 0 : nSubRasterFID = atol(papszTokens[nTokens - 1]);
51 :
52 0 : CSLDestroy(papszTokens);
53 : }
54 : else
55 : {
56 9 : pFileIO = new VSILFileIO(poOpenInfo->pszFilename);
57 : }
58 :
59 9 : if (IdentifyCADFile(pFileIO, false) == FALSE)
60 : {
61 0 : delete pFileIO;
62 0 : return nullptr;
63 : }
64 :
65 : /* -------------------------------------------------------------------- */
66 : /* Confirm the requested access is supported. */
67 : /* -------------------------------------------------------------------- */
68 9 : if (poOpenInfo->eAccess == GA_Update)
69 : {
70 0 : GDALDataset::ReportUpdateNotSupportedByDriver("CAD");
71 0 : delete pFileIO;
72 0 : return nullptr;
73 : }
74 :
75 9 : GDALCADDataset *poDS = new GDALCADDataset();
76 9 : if (!poDS->Open(poOpenInfo, pFileIO, nSubRasterLayer, nSubRasterFID))
77 : {
78 1 : delete poDS;
79 1 : return nullptr;
80 : }
81 : else
82 8 : return poDS;
83 : }
84 :
85 : /************************************************************************/
86 : /* RegisterOGRCAD() */
87 : /************************************************************************/
88 :
89 8 : void RegisterOGRCAD()
90 : {
91 8 : if (GDALGetDriverByName(DRIVER_NAME) == nullptr)
92 : {
93 8 : auto poDriver = new GDALDriver();
94 8 : OGRCADDriverSetCommonMetadata(poDriver);
95 :
96 8 : poDriver->pfnOpen = OGRCADDriverOpen;
97 :
98 8 : GetGDALDriverManager()->RegisterDriver(poDriver);
99 : }
100 8 : }
101 :
102 17 : CPLString CADRecode(const CPLString &sString, int CADEncoding)
103 : {
104 17 : const char *const apszSource[] = {/* 0 UNDEFINED */ "",
105 : /* 1 ASCII */ "US-ASCII",
106 : /* 2 8859_1 */ "ISO-8859-1",
107 : /* 3 8859_2 */ "ISO-8859-2",
108 : /* 4 UNDEFINED */ "",
109 : /* 5 8859_4 */ "ISO-8859-4",
110 : /* 6 8859_5 */ "ISO-8859-5",
111 : /* 7 8859_6 */ "ISO-8859-6",
112 : /* 8 8859_7 */ "ISO-8859-7",
113 : /* 9 8859_8 */ "ISO-8859-8",
114 : /* 10 8859_9 */ "ISO-8859-9",
115 : /* 11 DOS437 */ "CP437",
116 : /* 12 DOS850 */ "CP850",
117 : /* 13 DOS852 */ "CP852",
118 : /* 14 DOS855 */ "CP855",
119 : /* 15 DOS857 */ "CP857",
120 : /* 16 DOS860 */ "CP860",
121 : /* 17 DOS861 */ "CP861",
122 : /* 18 DOS863 */ "CP863",
123 : /* 19 DOS864 */ "CP864",
124 : /* 20 DOS865 */ "CP865",
125 : /* 21 DOS869 */ "CP869",
126 : /* 22 DOS932 */ "CP932",
127 : /* 23 MACINTOSH */ "MACINTOSH",
128 : /* 24 BIG5 */ "BIG5",
129 : /* 25 KSC5601 */ "CP949",
130 : /* 26 JOHAB */ "JOHAB",
131 : /* 27 DOS866 */ "CP866",
132 : /* 28 ANSI_1250 */ "CP1250",
133 : /* 29 ANSI_1251 */ "CP1251",
134 : /* 30 ANSI_1252 */ "CP1252",
135 : /* 31 GB2312 */ "GB2312",
136 : /* 32 ANSI_1253 */ "CP1253",
137 : /* 33 ANSI_1254 */ "CP1254",
138 : /* 34 ANSI_1255 */ "CP1255",
139 : /* 35 ANSI_1256 */ "CP1256",
140 : /* 36 ANSI_1257 */ "CP1257",
141 : /* 37 ANSI_874 */ "CP874",
142 : /* 38 ANSI_932 */ "CP932",
143 : /* 39 ANSI_936 */ "CP936",
144 : /* 40 ANSI_949 */ "CP949",
145 : /* 41 ANSI_950 */ "CP950",
146 : /* 42 ANSI_1361 */ "CP1361",
147 : /* 43 ANSI_1200 */ "UTF-16",
148 : /* 44 ANSI_1258 */ "CP1258"};
149 :
150 17 : if (CADEncoding > 0 &&
151 17 : CADEncoding < static_cast<int>(CPL_ARRAYSIZE(apszSource)) &&
152 : CADEncoding != 4)
153 : {
154 : char *pszRecoded =
155 17 : CPLRecode(sString, apszSource[CADEncoding], CPL_ENC_UTF8);
156 34 : CPLString soRecoded(pszRecoded);
157 17 : CPLFree(pszRecoded);
158 17 : return soRecoded;
159 : }
160 0 : CPLError(CE_Failure, CPLE_NotSupported,
161 : "CADRecode() function does not support provided CADEncoding.");
162 0 : return CPLString("");
163 : }
|