• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

OSGeo / gdal / 15797738239

21 Jun 2025 04:51PM UTC coverage: 71.076% (+0.001%) from 71.075%
15797738239

Pull #12622

github

web-flow
Merge 19559fd15 into 645a00347
Pull Request #12622: VSI Win32: implement OpenDir()

574181 of 807840 relevant lines covered (71.08%)

249831.39 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

66.95
/ogr/ogrsf_frmts/gpsbabel/ogrgpsbabeldriver.cpp
1
/******************************************************************************
2
 *
3
 * Project:  OpenGIS Simple Features Reference Implementation
4
 * Purpose:  Implements OGRGPSbabelDriver class.
5
 * Author:   Even Rouault, <even dot rouault at spatialys.com>
6
 *
7
 ******************************************************************************
8
 * Copyright (c) 2010, Even Rouault <even dot rouault at spatialys.com>
9
 *
10
 * SPDX-License-Identifier: MIT
11
 ****************************************************************************/
12

13
#include "cpl_conv.h"
14
#include "cpl_spawn.h"
15

16
#include "ogr_gpsbabel.h"
17

18
/************************************************************************/
19
/*                         OGRGPSBabelDriverIdentify()                  */
20
/************************************************************************/
21

22
static bool
23
OGRGPSBabelDriverIdentifyInternal(GDALOpenInfo *poOpenInfo,
51,459✔
24
                                  const char **ppszGSPBabelDriverName)
25
{
26
    if (STARTS_WITH_CI(poOpenInfo->pszFilename, "GPSBABEL:"))
51,459✔
27
        return true;
19✔
28

29
    const char *pszGPSBabelDriverName = nullptr;
51,440✔
30
    if (poOpenInfo->fpL == nullptr)
51,440✔
31
        return false;
48,554✔
32

33
    if (memcmp(poOpenInfo->pabyHeader, "MsRcd", 5) == 0)
2,886✔
34
        pszGPSBabelDriverName = "mapsource";
×
35
    else if (memcmp(poOpenInfo->pabyHeader, "MsRcf", 5) == 0)
2,886✔
36
        pszGPSBabelDriverName = "gdb";
×
37
    else if (strstr(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
2,886✔
38
                    "<osm") != nullptr)
39
    {
40
        if (GDALGetDriverByName("OSM") != nullptr)
×
41
            return false;
×
42
        pszGPSBabelDriverName = "osm";
×
43
    }
44
    else if (strstr(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
2,886✔
45
                    "<TrainingCenterDatabase") != nullptr)
46
        pszGPSBabelDriverName = "gtrnctr";
×
47
    else if (strstr(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
2,886✔
48
                    "$GPGSA") != nullptr ||
2,886✔
49
             strstr(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
2,886✔
50
                    "$GPGGA") != nullptr)
51
        pszGPSBabelDriverName = "nmea";
2✔
52
    else if (STARTS_WITH_CI(
2,884✔
53
                 reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
54
                 "OziExplorer"))
55
        pszGPSBabelDriverName = "ozi";
×
56
    else if (strstr(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
2,884✔
57
                    "Grid") &&
24✔
58
             strstr(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
24✔
59
                    "Datum") &&
×
60
             strstr(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
×
61
                    "Header"))
62
        pszGPSBabelDriverName = "garmin_txt";
×
63
    else if (poOpenInfo->pabyHeader[0] == 13 &&
2,884✔
64
             poOpenInfo->pabyHeader[10] == 'M' &&
×
65
             poOpenInfo->pabyHeader[11] == 'S' &&
×
66
             (poOpenInfo->pabyHeader[12] >= '0' &&
×
67
              poOpenInfo->pabyHeader[12] <= '9') &&
×
68
             (poOpenInfo->pabyHeader[13] >= '0' &&
×
69
              poOpenInfo->pabyHeader[13] <= '9') &&
×
70
             poOpenInfo->pabyHeader[12] * 10 + poOpenInfo->pabyHeader[13] >=
×
71
                 30 &&
×
72
             (poOpenInfo->pabyHeader[14] == 1 ||
×
73
              poOpenInfo->pabyHeader[14] == 2) &&
×
74
             poOpenInfo->pabyHeader[15] == 0 &&
×
75
             poOpenInfo->pabyHeader[16] == 0 && poOpenInfo->pabyHeader[17] == 0)
×
76
        pszGPSBabelDriverName = "mapsend";
×
77
    else if (strstr(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
2,884✔
78
                    "$PMGNWPL") != nullptr ||
2,884✔
79
             strstr(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
2,884✔
80
                    "$PMGNRTE") != nullptr)
81
        pszGPSBabelDriverName = "magellan";
×
82
    else if (poOpenInfo->pabyHeader[0] == 'A' &&
6,333✔
83
             poOpenInfo->pabyHeader[1] >= 'A' &&
565✔
84
             poOpenInfo->pabyHeader[1] <= 'Z' &&
565✔
85
             poOpenInfo->pabyHeader[2] >= 'A' &&
565✔
86
             poOpenInfo->pabyHeader[2] <= 'Z' &&
565✔
87
             poOpenInfo->pabyHeader[3] >= 'A' &&
565✔
88
             poOpenInfo->pabyHeader[3] <= 'Z' &&
3,984✔
89
             poOpenInfo->IsExtensionEqualToCI("igc"))
535✔
90
        pszGPSBabelDriverName = "igc";
×
91

92
    static int bGPSBabelFound = -1;
93
    if (pszGPSBabelDriverName != nullptr && bGPSBabelFound < 0)
2,886✔
94
    {
95
#ifndef _WIN32
96
        VSIStatBufL sStat;
97
        bGPSBabelFound = VSIStatL("/usr/bin/gpsbabel", &sStat) == 0;
1✔
98
        if (!bGPSBabelFound)
1✔
99
#endif
100
        {
101
            CPLErrorStateBackuper oErrorStateBackuper(CPLQuietErrorHandler);
×
102
            const char *const apszArgs[] = {"gpsbabel", "-V", nullptr};
×
103
            const CPLString osTmpFileName =
104
                VSIMemGenerateHiddenFilename("gpsbabel");
×
105
            VSILFILE *tmpfp = VSIFOpenL(osTmpFileName, "wb");
×
106
            bGPSBabelFound = CPLSpawn(apszArgs, nullptr, tmpfp, FALSE) == 0;
×
107
            VSIFCloseL(tmpfp);
×
108
            VSIUnlink(osTmpFileName);
×
109
        }
110
    }
111

112
    if (bGPSBabelFound)
2,886✔
113
    {
114
        *ppszGSPBabelDriverName = pszGPSBabelDriverName;
2,886✔
115
    }
116
    else if (pszGPSBabelDriverName)
×
117
    {
118
        CPLDebug("GPSBABEL",
×
119
                 "File %s could be recognized by GPSBABEL (sub-driver %s), but "
120
                 "binary 'gpsbabel' is missing in the PATH",
121
                 poOpenInfo->pszFilename, pszGPSBabelDriverName);
122
    }
123
    return *ppszGSPBabelDriverName != nullptr;
2,886✔
124
}
125

126
static int OGRGPSBabelDriverIdentify(GDALOpenInfo *poOpenInfo)
51,449✔
127
{
128
    const char *pszGPSBabelDriverName = nullptr;
51,449✔
129
    return OGRGPSBabelDriverIdentifyInternal(poOpenInfo,
51,449✔
130
                                             &pszGPSBabelDriverName);
51,449✔
131
}
132

133
/************************************************************************/
134
/*                                Open()                                */
135
/************************************************************************/
136

137
static GDALDataset *OGRGPSBabelDriverOpen(GDALOpenInfo *poOpenInfo)
10✔
138

139
{
140
    const char *pszGPSBabelDriverName = nullptr;
10✔
141
    if (poOpenInfo->eAccess == GA_Update ||
20✔
142
        !OGRGPSBabelDriverIdentifyInternal(poOpenInfo, &pszGPSBabelDriverName))
10✔
143
        return nullptr;
×
144

145
    OGRGPSBabelDataSource *poDS = new OGRGPSBabelDataSource();
10✔
146

147
    if (!poDS->Open(poOpenInfo->pszFilename, pszGPSBabelDriverName,
10✔
148
                    poOpenInfo->papszOpenOptions))
149
    {
150
        delete poDS;
5✔
151
        poDS = nullptr;
5✔
152
    }
153

154
    return poDS;
10✔
155
}
156

157
/************************************************************************/
158
/*                               Create()                               */
159
/************************************************************************/
160

161
static GDALDataset *OGRGPSBabelDriverCreate(const char *pszName,
1✔
162
                                            int /* nBands */, int /* nXSize */,
163
                                            int /* nYSize */,
164
                                            GDALDataType /* eDT */,
165
                                            char **papszOptions)
166
{
167
    OGRGPSBabelWriteDataSource *poDS = new OGRGPSBabelWriteDataSource();
1✔
168

169
    if (!poDS->Create(pszName, papszOptions))
1✔
170
    {
171
        delete poDS;
×
172
        poDS = nullptr;
×
173
    }
174

175
    return poDS;
1✔
176
}
177

178
/************************************************************************/
179
/*                               Delete()                               */
180
/************************************************************************/
181

182
static CPLErr OGRGPSBabelDriverDelete(const char *pszFilename)
1✔
183

184
{
185
    if (VSIUnlink(pszFilename) == 0)
1✔
186
        return CE_None;
×
187

188
    return CE_Failure;
1✔
189
}
190

191
/************************************************************************/
192
/*                        RegisterOGRGPSBabel()                         */
193
/************************************************************************/
194

195
void RegisterOGRGPSBabel()
1,911✔
196
{
197
    if (!GDAL_CHECK_VERSION("OGR/GPSBabel driver"))
1,911✔
198
        return;
×
199

200
    if (GDALGetDriverByName("GPSBabel") != nullptr)
1,911✔
201
        return;
282✔
202

203
    GDALDriver *poDriver = new GDALDriver();
1,629✔
204

205
    poDriver->SetDescription("GPSBabel");
1,629✔
206
    poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES");
1,629✔
207
    poDriver->SetMetadataItem(GDAL_DCAP_CREATE_LAYER, "YES");
1,629✔
208
    poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "GPSBabel");
1,629✔
209
    poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC,
1,629✔
210
                              "drivers/vector/gpsbabel.html");
1,629✔
211
    poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "mps gdb osm tcx igc");
1,629✔
212
    poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE");
1,629✔
213

214
    poDriver->SetMetadataItem(GDAL_DMD_CONNECTION_PREFIX, "GPSBABEL:");
1,629✔
215

216
    poDriver->SetMetadataItem(GDAL_DMD_OPENOPTIONLIST,
1,629✔
217
                              "<OpenOptionList>"
218
                              "  <Option name='FILENAME' type='string' "
219
                              "description='Filename to open'/>"
220
                              "  <Option name='GPSBABEL_DRIVER' type='string' "
221
                              "description='Name of the GPSBabel to use'/>"
222
                              "</OpenOptionList>");
1,629✔
223

224
    poDriver->SetMetadataItem(GDAL_DMD_CREATIONOPTIONLIST,
1,629✔
225
                              "<CreationOptionList>"
226
                              "  <Option name='GPSBABEL_DRIVER' type='string' "
227
                              "description='Name of the GPSBabel to use'/>"
228
                              "</CreationOptionList>");
1,629✔
229

230
    poDriver->pfnOpen = OGRGPSBabelDriverOpen;
1,629✔
231
    poDriver->pfnIdentify = OGRGPSBabelDriverIdentify;
1,629✔
232
    poDriver->pfnCreate = OGRGPSBabelDriverCreate;
1,629✔
233
    poDriver->pfnDelete = OGRGPSBabelDriverDelete;
1,629✔
234

235
    GetGDALDriverManager()->RegisterDriver(poDriver);
1,629✔
236
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc