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 : }
|