Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GRIB Driver 4 : * Purpose: GDALDataset driver for GRIB translator for read support 5 : * Author: Bas Retsios, retsios@itc.nl 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2007, ITC 9 : * Copyright (c) 2008-2017, Even Rouault <even dot rouault at spatialys dot com> 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : #include "gdal_frmts.h" 15 : #include "gdalplugindriverproxy.h" 16 : 17 : #include "gribdrivercore.h" 18 : 19 : /************************************************************************/ 20 : /* GRIBDriverIdentify() */ 21 : /************************************************************************/ 22 : 23 62211 : int GRIBDriverIdentify(GDALOpenInfo *poOpenInfo) 24 : 25 : { 26 62211 : if (poOpenInfo->nHeaderBytes < 8) 27 56880 : return FALSE; 28 : 29 5331 : const char *pasHeader = reinterpret_cast<char *>(poOpenInfo->pabyHeader); 30 : // Does a part of what ReadSECT0(), but in a thread-safe way. 31 5173640 : for (int i = 0; i < poOpenInfo->nHeaderBytes - 3; i++) 32 : { 33 5168810 : if (STARTS_WITH_CI(pasHeader + i, "GRIB") 34 : #ifdef ENABLE_TDLP 35 : || STARTS_WITH_CI(pasHeader + i, "TDLP") 36 : #endif 37 : ) 38 500 : return TRUE; 39 : } 40 : 41 4831 : return FALSE; 42 : } 43 : 44 : /************************************************************************/ 45 : /* GRIBDriverSetCommonMetadata() */ 46 : /************************************************************************/ 47 : 48 1755 : void GRIBDriverSetCommonMetadata(GDALDriver *poDriver) 49 : { 50 1755 : poDriver->SetDescription(DRIVER_NAME); 51 1755 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 52 1755 : poDriver->SetMetadataItem(GDAL_DCAP_MULTIDIM_RASTER, "YES"); 53 1755 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, 54 1755 : "GRIdded Binary (.grb, .grb2)"); 55 1755 : poDriver->SetMetadataItem(GDAL_DMD_OPENOPTIONLIST, 56 : "<OpenOptionList>" 57 : " <Option name='USE_IDX' type='boolean' " 58 : "description='Load metadata from " 59 : "wgrib2 index file if available' default='YES'/>" 60 1755 : "</OpenOptionList>"); 61 1755 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/grib.html"); 62 1755 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "grb grb2 grib2"); 63 1755 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 64 1755 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_SUBDATASETS, "YES"); 65 : 66 1755 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, 67 : "Byte UInt16 Int16 UInt32 Int32 Float32 " 68 1755 : "Float64"); 69 : 70 1755 : poDriver->pfnIdentify = GRIBDriverIdentify; 71 1755 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 72 1755 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); 73 1755 : } 74 : 75 : /************************************************************************/ 76 : /* DeclareDeferredGRIBPlugin() */ 77 : /************************************************************************/ 78 : 79 : #ifdef PLUGIN_FILENAME 80 : void DeclareDeferredGRIBPlugin() 81 : { 82 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 83 : { 84 : return; 85 : } 86 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 87 : #ifdef PLUGIN_INSTALLATION_MESSAGE 88 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 89 : PLUGIN_INSTALLATION_MESSAGE); 90 : #endif 91 : GRIBDriverSetCommonMetadata(poDriver); 92 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 93 : } 94 : #endif