/** * \brief Returns if the filenames of the filesystem are case sensitive. * * This method retrieves to which filesystem belongs the passed filename * and return TRUE if the filenames of that filesystem are case sensitive. * * Currently, this will return FALSE only for Windows real filenames. Other * VSI virtual filesystems are case sensitive. * * This methods avoid ugly #ifndef WIN32 / #endif code, that is wrong when * dealing with virtual filenames. * * @param pszFilename the path of the filesystem object to be tested. UTF-8 encoded. * * @return TRUE if the filenames of the filesystem are case sensitive. * * @since GDAL 1.8.0 */ int VSIIsCaseSensitiveFS( const char * pszFilename ) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszFilename ); return poFSHandler->IsCaseSensitive( pszFilename ); }
GIntBig VSIGetDiskFreeSpace(const char *pszDirname) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszDirname ); return poFSHandler->GetDiskFreeSpace( pszDirname ); }
int VSIRmdir( const char * pszDirname ) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszDirname ); return poFSHandler->Rmdir( pszDirname ); }
int VSIRename( const char * oldpath, const char * newpath ) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( oldpath ); return poFSHandler->Rename( oldpath, newpath ); }
int VSIUnlink( const char * pszFilename ) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszFilename ); return poFSHandler->Unlink( pszFilename ); }
int VSIMkdir( const char *pszPathname, long mode ) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszPathname ); return poFSHandler->Mkdir( pszPathname, mode ); }
FILE *VSIFOpenL( const char * pszFilename, const char * pszAccess ) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszFilename ); return (FILE *) poFSHandler->Open( pszFilename, pszAccess ); }
int VSIStatL( const char * pszFilename, VSIStatBufL *psStatBuf ) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszFilename ); return poFSHandler->Stat( pszFilename, psStatBuf ); }
VSILFILE *VSIFOpenL( const char * pszFilename, const char * pszAccess ) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszFilename ); VSILFILE* fp = (VSILFILE *) poFSHandler->Open( pszFilename, pszAccess ); VSIDebug3( "VSIFOpenL(%s,%s) = %p", pszFilename, pszAccess, fp ); return fp; }
VSILFILE *VSIFOpenExL( const char * pszFilename, const char * pszAccess, int bSetError ) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszFilename ); VSILFILE* fp = reinterpret_cast<VSILFILE *>( poFSHandler->Open( pszFilename, pszAccess, CPL_TO_BOOL(bSetError) ) ); VSIDebug4( "VSIFOpenExL(%s,%s,%d) = %p", pszFilename, pszAccess, bSetError, fp ); return fp; }
int VSIStatL( const char * pszFilename, VSIStatBufL *psStatBuf ) { char szAltPath[4]; /* enable to work on "C:" as if it were "C:\" */ if( strlen(pszFilename) == 2 && pszFilename[1] == ':' ) { szAltPath[0] = pszFilename[0]; szAltPath[1] = pszFilename[1]; szAltPath[2] = '\\'; szAltPath[3] = '\0'; pszFilename = szAltPath; } VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszFilename ); return poFSHandler->Stat( pszFilename, psStatBuf ); }
int VSIStatExL( const char * pszFilename, VSIStatBufL *psStatBuf, int nFlags ) { char szAltPath[4]; /* enable to work on "C:" as if it were "C:\" */ if( strlen(pszFilename) == 2 && pszFilename[1] == ':' ) { szAltPath[0] = pszFilename[0]; szAltPath[1] = pszFilename[1]; szAltPath[2] = '\\'; szAltPath[3] = '\0'; pszFilename = szAltPath; } VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( pszFilename ); if (nFlags == 0) nFlags = VSI_STAT_EXISTS_FLAG | VSI_STAT_NATURE_FLAG | VSI_STAT_SIZE_FLAG; return poFSHandler->Stat( pszFilename, psStatBuf, nFlags ); }
char* VSIArchiveFilesystemHandler::SplitFilename(const char *pszFilename, CPLString &osFileInArchive, int bCheckMainFileExists) { int i = 0; if (strcmp(pszFilename, GetPrefix()) == 0) return NULL; /* Allow natural chaining of VSI drivers without requiring double slash */ CPLString osDoubleVsi(GetPrefix()); osDoubleVsi += "/vsi"; if (strncmp(pszFilename, osDoubleVsi.c_str(), osDoubleVsi.size()) == 0) pszFilename += strlen(GetPrefix()); else pszFilename += strlen(GetPrefix()) + 1; while(pszFilename[i]) { std::vector<CPLString> oExtensions = GetExtensions(); std::vector<CPLString>::const_iterator iter; int nToSkip = 0; for( iter = oExtensions.begin(); iter != oExtensions.end(); ++iter ) { const CPLString& osExtension = *iter; if (EQUALN(pszFilename + i, osExtension.c_str(), strlen(osExtension.c_str()))) { nToSkip = strlen(osExtension.c_str()); break; } } if (nToSkip != 0) { VSIStatBufL statBuf; char* archiveFilename = CPLStrdup(pszFilename); int bArchiveFileExists = FALSE; if (archiveFilename[i + nToSkip] == '/' || archiveFilename[i + nToSkip] == '\\') { archiveFilename[i + nToSkip] = 0; } if (!bCheckMainFileExists) { bArchiveFileExists = TRUE; } else { CPLMutexHolder oHolder( &hMutex ); if (oFileList.find(archiveFilename) != oFileList.end() ) { bArchiveFileExists = TRUE; } } if (!bArchiveFileExists) { VSIFilesystemHandler *poFSHandler = VSIFileManager::GetHandler( archiveFilename ); if (poFSHandler->Stat(archiveFilename, &statBuf, VSI_STAT_EXISTS_FLAG | VSI_STAT_NATURE_FLAG) == 0 && !VSI_ISDIR(statBuf.st_mode)) { bArchiveFileExists = TRUE; } } if (bArchiveFileExists) { if (pszFilename[i + nToSkip] == '/' || pszFilename[i + nToSkip] == '\\') { char* pszArchiveInFileName = CPLStrdup(pszFilename + i + nToSkip + 1); /* Replace a/../b by b and foo/a/../b by foo/b */ while(TRUE) { char* pszPrevDir = strstr(pszArchiveInFileName, "/../"); if (pszPrevDir == NULL || pszPrevDir == pszArchiveInFileName) break; char* pszPrevSlash = pszPrevDir - 1; while(pszPrevSlash != pszArchiveInFileName && *pszPrevSlash != '/') pszPrevSlash --; if (pszPrevSlash == pszArchiveInFileName) memmove(pszArchiveInFileName, pszPrevDir + nToSkip, strlen(pszPrevDir + nToSkip) + 1); else memmove(pszPrevSlash + 1, pszPrevDir + nToSkip, strlen(pszPrevDir + nToSkip) + 1); } osFileInArchive = pszArchiveInFileName; CPLFree(pszArchiveInFileName); } else osFileInArchive = ""; /* Remove trailing slash */ if (osFileInArchive.size()) { char lastC = osFileInArchive[strlen(osFileInArchive) - 1]; if (lastC == '\\' || lastC == '/') osFileInArchive.resize(strlen(osFileInArchive) - 1); } return archiveFilename; } CPLFree(archiveFilename); } i++; } return NULL; }