@@ -141,6 +141,20 @@ static const char *SENTINEL2GetOption(GDALOpenInfo *poOpenInfo,
141
141
static bool SENTINEL2GetTileInfo (const char *pszFilename, int *pnWidth,
142
142
int *pnHeight, int *pnBits);
143
143
144
+ /* ***********************************************************************/
145
+ /* IsS2Prefixed() */
146
+ /* ***********************************************************************/
147
+
148
+ // IsS2Prefixed(pszStr, "foo") checks that pszStr starts with
149
+ // "S2x_foo" where x=A/B/C/D
150
+ static bool IsS2Prefixed (const char *pszStr, const char *pszPrefixAfterS2X)
151
+ {
152
+ return pszStr[0 ] == ' S' && pszStr[1 ] == ' 2' && pszStr[2 ] >= ' A' &&
153
+ pszStr[2 ] <= ' Z' &&
154
+ (*pszPrefixAfterS2X == 0 ||
155
+ STARTS_WITH_CI (pszStr + 3 , pszPrefixAfterS2X));
156
+ }
157
+
144
158
/* ***********************************************************************/
145
159
/* SENTINEL2GranuleInfo */
146
160
/* ***********************************************************************/
@@ -389,14 +403,10 @@ int SENTINEL2Dataset::Identify(GDALOpenInfo *poOpenInfo)
389
403
/* Accept directly .zip as provided by https://scihub.esa.int/
390
404
* First we check just by file name as it is faster than looking
391
405
* inside to detect content. */
392
- if ((STARTS_WITH_CI (pszJustFilename, " S2A_MSIL1C_" ) ||
393
- STARTS_WITH_CI (pszJustFilename, " S2B_MSIL1C_" ) ||
394
- STARTS_WITH_CI (pszJustFilename, " S2A_MSIL2A_" ) ||
395
- STARTS_WITH_CI (pszJustFilename, " S2B_MSIL2A_" ) ||
396
- STARTS_WITH_CI (pszJustFilename, " S2A_OPER_PRD_MSI" ) ||
397
- STARTS_WITH_CI (pszJustFilename, " S2B_OPER_PRD_MSI" ) ||
398
- STARTS_WITH_CI (pszJustFilename, " S2A_USER_PRD_MSI" ) ||
399
- STARTS_WITH_CI (pszJustFilename, " S2B_USER_PRD_MSI" )) &&
406
+ if ((IsS2Prefixed (pszJustFilename, " _MSIL1C_" ) ||
407
+ IsS2Prefixed (pszJustFilename, " _MSIL2A_" ) ||
408
+ IsS2Prefixed (pszJustFilename, " _OPER_PRD_MSI" ) ||
409
+ IsS2Prefixed (pszJustFilename, " _USER_PRD_MSI" )) &&
400
410
EQUAL (CPLGetExtensionSafe (pszJustFilename).c_str (), " zip" ))
401
411
{
402
412
return TRUE ;
@@ -497,10 +507,8 @@ GDALDataset *SENTINEL2Dataset::Open(GDALOpenInfo *poOpenInfo)
497
507
}
498
508
499
509
const char *pszJustFilename = CPLGetFilename (poOpenInfo->pszFilename );
500
- if ((STARTS_WITH_CI (pszJustFilename, " S2A_OPER_PRD_MSI" ) ||
501
- STARTS_WITH_CI (pszJustFilename, " S2B_OPER_PRD_MSI" ) ||
502
- STARTS_WITH_CI (pszJustFilename, " S2A_USER_PRD_MSI" ) ||
503
- STARTS_WITH_CI (pszJustFilename, " S2B_USER_PRD_MSI" )) &&
510
+ if ((IsS2Prefixed (pszJustFilename, " _OPER_PRD_MSI" ) ||
511
+ IsS2Prefixed (pszJustFilename, " _USER_PRD_MSI" )) &&
504
512
EQUAL (CPLGetExtensionSafe (pszJustFilename).c_str (), " zip" ))
505
513
{
506
514
const CPLString osBasename (CPLGetBasenameSafe (pszJustFilename));
@@ -525,8 +533,7 @@ GDALDataset *SENTINEL2Dataset::Open(GDALOpenInfo *poOpenInfo)
525
533
GDALOpenInfo oOpenInfo (osFilename, GA_ReadOnly);
526
534
return Open (&oOpenInfo);
527
535
}
528
- else if ((STARTS_WITH_CI (pszJustFilename, " S2A_MSIL1C_" ) ||
529
- STARTS_WITH_CI (pszJustFilename, " S2B_MSIL1C_" )) &&
536
+ else if (IsS2Prefixed (pszJustFilename, " _MSIL1C_" ) &&
530
537
EQUAL (CPLGetExtensionSafe (pszJustFilename).c_str (), " zip" ))
531
538
{
532
539
const CPLString osBasename (CPLGetBasenameSafe (pszJustFilename));
@@ -544,8 +551,7 @@ GDALDataset *SENTINEL2Dataset::Open(GDALOpenInfo *poOpenInfo)
544
551
GDALOpenInfo oOpenInfo (osFilename, GA_ReadOnly);
545
552
return Open (&oOpenInfo);
546
553
}
547
- else if ((STARTS_WITH_CI (pszJustFilename, " S2A_MSIL2A_" ) ||
548
- STARTS_WITH_CI (pszJustFilename, " S2B_MSIL2A_" )) &&
554
+ else if (IsS2Prefixed (pszJustFilename, " _MSIL2A_" ) &&
549
555
EQUAL (CPLGetExtensionSafe (pszJustFilename).c_str (), " zip" ))
550
556
{
551
557
const CPLString osBasename (CPLGetBasenameSafe (pszJustFilename));
@@ -621,12 +627,10 @@ GDALDataset *SENTINEL2Dataset::Open(GDALOpenInfo *poOpenInfo)
621
627
if (VSI_ISREG (psEntry->nMode ) &&
622
628
(STARTS_WITH_CI (pszInsideFilename, " MTD_MSIL2A" ) ||
623
629
STARTS_WITH_CI (pszInsideFilename, " MTD_MSIL1C" ) ||
624
- STARTS_WITH_CI (pszInsideFilename, " S2A_OPER_MTD_SAFL1B" ) ||
625
- STARTS_WITH_CI (pszInsideFilename, " S2B_OPER_MTD_SAFL1B" ) ||
626
- STARTS_WITH_CI (pszInsideFilename, " S2A_OPER_MTD_SAFL1C" ) ||
627
- STARTS_WITH_CI (pszInsideFilename, " S2B_OPER_MTD_SAFL1C" ) ||
628
- STARTS_WITH_CI (pszInsideFilename, " S2A_USER_MTD_SAFL2A" ) ||
629
- STARTS_WITH_CI (pszInsideFilename, " S2B_USER_MTD_SAFL2A" )))
630
+ IsS2Prefixed (pszInsideFilename, " _OPER_MTD_SAFL1B" ) ||
631
+ IsS2Prefixed (pszInsideFilename, " _OPER_MTD_SAFL1C" ) ||
632
+ IsS2Prefixed (pszInsideFilename, " _USER_MTD_SAFL2A" ) ||
633
+ IsS2Prefixed (pszInsideFilename, " _USER_MTD_SAFL2A" )))
630
634
{
631
635
osFilename = osFilename + " /" + psEntry->pszName ;
632
636
CPLDebug (" SENTINEL2" , " Trying %s" , osFilename.c_str ());
@@ -1751,8 +1755,7 @@ SENTINEL2GetMainMTDFilenameFromGranuleMTD(const char *pszFilename)
1751
1755
for (char **papszIter = papszContents; papszIter && *papszIter; ++papszIter)
1752
1756
{
1753
1757
if (strlen (*papszIter) >= strlen (" S2A_XXXX_MTD" ) &&
1754
- (STARTS_WITH_CI (*papszIter, " S2A_" ) ||
1755
- STARTS_WITH_CI (*papszIter, " S2B_" )) &&
1758
+ IsS2Prefixed (*papszIter, " " ) &&
1756
1759
EQUALN (*papszIter + strlen (" S2A_XXXX" ), " _MTD" , 4 ))
1757
1760
{
1758
1761
osMainMTD = CPLFormFilenameSafe (osTopDir, *papszIter, nullptr );
0 commit comments